protected virtual ColumnElement CreateColumnElement(ColumnElement element, ElaboratedTableVarColumn elaboratedColumn, Schema.TableVarColumn column, string titleSeed, string pageType, bool isReadOnly)
        {
            PrepareElement(element, column.MetaData, null, titleSeed, pageType, isReadOnly);

            if
            (
                (((Schema.ScalarType)column.DataType).NativeType == DAE.Runtime.Data.NativeAccessors.AsString.NativeType) &&
                (elaboratedColumn.ElaboratedReference == null) &&
                !element.Properties.Contains("NilIfBlank") &&
                (element.ElementType != "Choice")                            // TODO: Control types: need a better mechanism for determining whether or not a particular property applies to a particular control type...
            )
            {
                element.Properties.AddOrUpdate("NilIfBlank", "False");
            }

            element.Title = DerivationUtility.GetTag(column.MetaData, "Caption", pageType, DerivationUtility.GetTag(column.MetaData, "Title", pageType, Schema.Object.Unqualify(column.Name)));
            string width = DerivationUtility.GetTag(column.MetaData, "Width", pageType, String.Empty);

            if (width != String.Empty)
            {
                element.Properties.AddOrUpdate("Width", width);
            }
            element.Properties.AddOrUpdate("Source", element.Source);
            element.Properties.AddOrUpdate("ColumnName", element.ColumnName);
            if (column.ReadOnly || isReadOnly || Convert.ToBoolean(DerivationUtility.GetTag(column.MetaData, "ReadOnly", pageType, "False")))
            {
                element.Properties.AddOrUpdate("ReadOnly", "True");
            }

            return(element);
        }
        protected virtual Element BuildColumnElement(ElaboratedTableVarColumn column, string pageType, string titleSeed, bool readOnly)
        {
            ColumnElement columnElement = new ColumnElement(String.Format("{0}Column{1}", _derivationInfo.MainSourceName, column.ElaboratedName));

            columnElement.ElementType = DerivationUtility.GetTag(column.Column.MetaData, "ElementType", pageType, GetDefaultElementType(column.Column.DataType, pageType));
            columnElement.Source      = _derivationInfo.MainSourceName;
            columnElement.ColumnName  = Schema.Object.Qualify(column.Column.Name, column.ElaboratedTableVar.ElaboratedName);
            CreateColumnElement(columnElement, column, column.Column, titleSeed, pageType, readOnly);
            AddElement(columnElement, column.GroupName, titleSeed, pageType, readOnly);
            return(columnElement);
        }
        protected override Element BuildColumnElement(ElaboratedTableVarColumn column, string pageType, string titleSeed, bool readOnly)
        {
            GridColumnElement gridColumnElement = new GridColumnElement(String.Format("{0}GridColumn{1}", _derivationInfo.MainSourceName, column.ElaboratedName));

            if (column.ElaboratedReference == null)
            {
                gridColumnElement.ColumnName = column.ElaboratedName;
            }
            else
            {
                gridColumnElement.ColumnName = Schema.Object.Qualify(column.Column.Name, column.ElaboratedTableVar.ElaboratedName);
            }
            gridColumnElement.ElementType = DerivationUtility.GetTag(column.Column.MetaData, "Grid.ElementType", pageType, GetDefaultElementType(column.Column.DataType, pageType));
            CreateGridColumnElement(gridColumnElement, column.Column, titleSeed, pageType, false);
            AddElement(gridColumnElement, column.GroupName, titleSeed, pageType, false);
            return(gridColumnElement);
        }
 protected override void BuildQuickLookup
 (
     ElaboratedTableVarColumn column,
     ElaboratedReference reference,
     string[] columnNames,
     string[] lookupColumnNames,
     string[] masterKeyNames,
     string[] detailKeyNames,
     string pageType,
     string titleSeed,
     bool readOnly
 )
 {
     if (reference.IsEmbedded)
     {
         string lookupGroupName = _derivationInfo.ElaboratedExpression.Groups.ResolveGroupName(String.Format("{0}{1}", reference.ElaboratedName, "Group"));
         EnsureGroups(lookupGroupName, titleSeed, pageType, readOnly);
     }
     BuildColumnElement(column, pageType, titleSeed, readOnly);
 }
        protected virtual void BuildColumn(ElaboratedTableVarColumn column)
        {
            string titleSeed = column.GetTitleSeed();
            string pageType  = _derivationInfo.PageType;

            if ((column.ElaboratedTableVar.ElaboratedReference != null) && (column.ElaboratedTableVar.ElaboratedReference.ReferenceType == ReferenceType.Lookup))
            {
                pageType = DerivationUtility.Preview;
            }

            if
            (
                !DerivationUtility.IsReadOnlyPageType(pageType) &&
                (column.ElaboratedReference != null) &&
                (column.ElaboratedReference.ReferenceType == ReferenceType.Lookup) &&
                (
                    (column.ElaboratedReference.SourceElaboratedTableVar.ElaboratedReference == null) ||
                    (column.ElaboratedReference.SourceElaboratedTableVar.ElaboratedReference.ReferenceType == ReferenceType.Extension)
                )
            )
            {
                int           visibleCount  = 0;
                List <string> masterColumns = new List <string>();
                List <string> columns       = new List <string>();
                foreach (ElaboratedTableVarColumn referenceColumn in column.ElaboratedReference.Columns)
                {
                    if (referenceColumn.IsMaster)
                    {
                        masterColumns.Add(referenceColumn.Column.Name);
                    }
                    else
                    {
                        columns.Add(referenceColumn.Column.Name);
                    }

                    if (referenceColumn.Visible)
                    {
                        visibleCount++;
                    }
                }

                string[] columnNames       = new string[columns.Count];
                string[] lookupColumnNames = new string[columns.Count];
                string[] masterKeyNames    = new string[masterColumns.Count];
                string[] detailKeyNames    = new string[masterColumns.Count];

                int columnIndex       = 0;
                int masterColumnIndex = 0;
                for (int index = 0; index < column.ElaboratedReference.Reference.SourceKey.Columns.Count; index++)
                {
                    if (columns.Contains(column.ElaboratedReference.Reference.SourceKey.Columns[index].Name))
                    {
                        columnNames[columnIndex]       = Schema.Object.Qualify(column.ElaboratedReference.Reference.SourceKey.Columns[index].Name, column.ElaboratedTableVar.ElaboratedName);
                        lookupColumnNames[columnIndex] = Schema.Object.Qualify(column.ElaboratedReference.Reference.TargetKey.Columns[index].Name, DerivationUtility.MainElaboratedTableName);
                        columnIndex++;
                    }
                    else
                    {
                        masterKeyNames[masterColumnIndex] = Schema.Object.Qualify(column.ElaboratedReference.Reference.SourceKey.Columns[index].Name, column.ElaboratedTableVar.ElaboratedName);
                        detailKeyNames[masterColumnIndex] = Schema.Object.Qualify(column.ElaboratedReference.Reference.TargetKey.Columns[index].Name, DerivationUtility.MainElaboratedTableName);
                        masterColumnIndex++;
                    }
                }

                bool useFullLookup = (visibleCount != 1) || Convert.ToBoolean(DerivationUtility.GetTag(column.ElaboratedReference.Reference.MetaData, "UseFullLookup", _derivationInfo.PageType, column.ElaboratedReference.ReferenceType.ToString(), "False"));

                if (useFullLookup)
                {
                    BuildFullLookup(column.ElaboratedReference, columnNames, lookupColumnNames, masterKeyNames, detailKeyNames, pageType, titleSeed, column.ReadOnly);
                    if (column.Visible)
                    {
                        BuildColumnElement(column, pageType, titleSeed, column.ReadOnly);
                    }
                }
                else
                if (column.Visible)
                {
                    BuildQuickLookup(column, column.ElaboratedReference, columnNames, lookupColumnNames, masterKeyNames, detailKeyNames, pageType, titleSeed, column.ReadOnly);
                }
            }
            else
            {
                if (column.Visible)
                {
                    BuildColumnElement(column, pageType, titleSeed, column.ReadOnly);
                }
            }
        }
        protected virtual void BuildQuickLookup
        (
            ElaboratedTableVarColumn column,
            ElaboratedReference reference,
            string[] columnNames,
            string[] lookupColumnNames,
            string[] masterKeyNames,
            string[] detailKeyNames,
            string pageType,
            string titleSeed,
            bool readOnly
        )
        {
            // Prepare the quick lookup group
            if (reference.IsEmbedded)
            {
                string lookupGroupName = _derivationInfo.ElaboratedExpression.Groups.ResolveGroupName(String.Format("{0}{1}", reference.ElaboratedName, "Group"));
                EnsureGroups(lookupGroupName, titleSeed, pageType, readOnly);
                GroupElement groupElement = _rootElement.FindElement(lookupGroupName) as GroupElement;

                MetaData groupMetaData = DerivationUtility.ExtractTags(reference.Reference.MetaData, groupElement.ElementType, pageType, reference.ReferenceType.ToString());
                PrepareElement(groupElement, groupMetaData, reference.Reference.MetaData, titleSeed, pageType, reference.ReferenceType.ToString(), readOnly);
            }
            LookupColumnElement lookupGroup = new LookupColumnElement(String.Format("{0}Column{1}_Lookup", _derivationInfo.MainSourceName, column.ElaboratedName));

            lookupGroup.ElementType = DerivationUtility.GetTag(reference.Reference.MetaData, "ElementType", pageType, reference.ReferenceType.ToString(), "QuickLookup");
            DerivationUtility.ExtractProperties(reference.Reference.MetaData, lookupGroup.ElementType, pageType, lookupGroup.Properties);
            lookupGroup.Properties.SafeAdd(new Tag("Source", _derivationInfo.MainSourceName));
            lookupGroup.Source = lookupGroup.Properties.GetTag("Source").Value;
            lookupGroup.Properties.SafeAdd(new Tag("ColumnName", Schema.Object.Qualify(column.Column.Name, column.ElaboratedTableVar.ElaboratedName)));
            lookupGroup.ColumnName = lookupGroup.Properties.GetTag("ColumnName").Value;
            lookupGroup.Properties.SafeAdd(new Tag("LookupColumnName", Schema.Object.Qualify(reference.Reference.TargetKey.Columns[reference.Reference.SourceKey.Columns.IndexOf(column.Column.Name)].Name, DerivationUtility.MainElaboratedTableName)));
            lookupGroup.LookupColumnName = lookupGroup.Properties.GetTag("LookupColumnName").Value;
            lookupGroup.Properties.SafeAdd(new Tag("Document", GetLookupDocument(reference, masterKeyNames, detailKeyNames)));
            lookupGroup.LookupDocument = lookupGroup.Properties.GetTag("Document").Value;
            if (masterKeyNames.Length > 0)
            {
                lookupGroup.Properties.SafeAdd(new Tag("MasterKeyNames", StringArrayToNames(masterKeyNames)));
                lookupGroup.MasterKeyNames = lookupGroup.Properties.GetTag("MasterKeyNames").Value;
                lookupGroup.Properties.SafeAdd(new Tag("DetailKeyNames", StringArrayToNames(detailKeyNames)));
                lookupGroup.DetailKeyNames = lookupGroup.Properties.GetTag("DetailKeyNames").Value;
            }

            if (column.ReadOnly || readOnly || Convert.ToBoolean(DerivationUtility.GetTag(column.Column.MetaData, "ReadOnly", pageType, "False")))
            {
                lookupGroup.Properties.AddOrUpdate("ReadOnly", "True");
            }

            MetaData metaData = DerivationUtility.ExtractTags(reference.Reference.MetaData, lookupGroup.ElementType, pageType, reference.ReferenceType.ToString());

            PrepareElement(lookupGroup, metaData, reference.Reference.MetaData, titleSeed, pageType, reference.ReferenceType.ToString(), readOnly);

            if (!Boolean.Parse(DerivationUtility.GetTag(metaData, "Visible", pageType, "True")))
            {
                lookupGroup.Properties.AddOrUpdate("Visible", "False");
            }

            AddElement(lookupGroup, column.GroupName, titleSeed, pageType, readOnly);

            // Build the element
            column.GroupName = lookupGroup.Name;
            Element controlElement = BuildColumnElement(column, pageType, titleSeed, readOnly);

            if (!controlElement.Properties.Contains("TitleAlignment"))
            {
                switch (controlElement.ElementType)
                {
                case "TextBox":
                case "DateTimeBox":
                case "NumericTextBox": controlElement.Properties.Add(new Tag("TitleAlignment", "None")); break;
                }
            }

            // Use the column's title for the group (only in the case of a quick lookup)
            lookupGroup.Title = controlElement.Title;

            // If the control has a flow break specified, push it onto the lookup group (only in the case of a quick lookup)
            if (controlElement.FlowBreak)
            {
                lookupGroup.FlowBreak = true;
            }
        }