public static ExcelBindingDefinitionNamedRange CreateInstance(ExcelTemplateDefinitionPart templateDefinition, ExcelNamedRangeDefinition definition, IBindingDefinition nestedBindingDefinition)
 {
     try
     {
         string             trimmedName           = definition.Name.Trim();
         IBindingDefinition nameBindingDefinition = null;
         string             rootName = null;
         int pos = trimmedName.IndexOf('{');
         if (pos != -1)
         {
             rootName = trimmedName.Remove(pos);
             string expression = trimmedName.Substring(pos);
             BindingDefinitionDescription bindingDefinitionDescription = BindingDefinitionDescription.CreateBindingDescription(templateDefinition.Parent, expression, expression);
             if (bindingDefinitionDescription != null && !string.IsNullOrEmpty(bindingDefinitionDescription.BindingExpression))
             {
                 if (bindingDefinitionDescription.BindingExpression.Contains(ALL_POS_KEYWORD) || bindingDefinitionDescription.BindingExpression.Contains(POS_KEYWORD))
                 {
                     throw new ArgumentException($"Cannot mixte the keywords '{POS_KEYWORD}' and '{ALL_POS_KEYWORD}' with binding dataAccessor");
                 }
                 nameBindingDefinition = BindingDefinitionFactory.CreateInstances(templateDefinition.Parent as ExcelTemplateDefinition, bindingDefinitionDescription);
             }
         }
         return(new ExcelBindingDefinitionNamedRange(definition, rootName, nestedBindingDefinition, nameBindingDefinition));
     }
     catch (Exception ex)
     {
         string message = $"Cannot create create the named caller binding dataAccessor '{definition.Name}'. {ex.Message}";
         throw new EtkException(message);
     }
 }
Ejemplo n.º 2
0
        internal ExcelTemplateDefinition GetTemplateDefinitionFromLink(ExcelTemplateDefinitionPart parent, TemplateLink templateLink)
        {
            try
            {
                string[] tos = templateLink.To.Split('.');
                ExcelInterop.Worksheet sheetContainer = null;
                string templateName;
                if (tos.Count() == 1)
                {
                    sheetContainer = parent.DefinitionCells.Worksheet;
                    templateName   = tos[0].EmptyIfNull().Trim();
                }
                else
                {
                    string worksheetContainerName = tos[0].EmptyIfNull().Trim();
                    templateName = tos[1].EmptyIfNull().Trim();

                    ExcelInterop.Worksheet parentWorkSheet = parent.DefinitionCells.Worksheet;
                    ExcelInterop.Workbook  workbook        = parentWorkSheet.Parent as ExcelInterop.Workbook;
                    if (workbook == null)
                    {
                        throw new EtkException("Cannot retrieve the workbook that owned the template destination sheet");
                    }

                    List <ExcelInterop.Worksheet> sheets = new List <ExcelInterop.Worksheet>(workbook.Worksheets.Cast <ExcelInterop.Worksheet>());
                    sheetContainer = sheets.FirstOrDefault(s => !string.IsNullOrEmpty(s.Name) && s.Name.Equals(worksheetContainerName));
                    if (sheetContainer == null)
                    {
                        throw new EtkException($"Cannot find the sheet '{worksheetContainerName}' in the current workbook", false);
                    }

                    ExcelApplication.ReleaseComObject(workbook);
                    workbook = null;
                }

                string templateDescriptionKey = $"{sheetContainer.Name}-{templateName}";
                ExcelTemplateDefinition templateDefinition = bindingTemplateManager.GetTemplateDefinition(templateDescriptionKey) as ExcelTemplateDefinition;
                if (templateDefinition == null)
                {
                    ExcelInterop.Range range = sheetContainer.Cells.Find(string.Format(TEMPLATE_START_FORMAT, templateName), Type.Missing, ExcelInterop.XlFindLookIn.xlValues, ExcelInterop.XlLookAt.xlPart, ExcelInterop.XlSearchOrder.xlByRows, ExcelInterop.XlSearchDirection.xlNext, false);
                    if (range == null)
                    {
                        throw new EtkException($"Cannot find the template '{templateName.EmptyIfNull()}' in sheet '{sheetContainer.Name.EmptyIfNull()}'");
                    }
                    templateDefinition = ExcelTemplateDefinitionFactory.CreateInstance(templateName, range);
                    bindingTemplateManager.RegisterTemplateDefinition(templateDefinition);

                    range = null;
                }

                ExcelApplication.ReleaseComObject(sheetContainer);
                sheetContainer = null;
                return(templateDefinition);
            }
            catch (Exception ex)
            {
                string message = $"Cannot create the template dataAccessor. {ex.Message}";
                throw new EtkException(message, false);
            }
        }
Ejemplo n.º 3
0
 public static ExcelPartRenderer CreateInstance(ExcelRenderer parent, ExcelTemplateDefinitionPart part, IBindingContextPart bindingContextPart, ExcelInterop.Range firstOutputCell, bool useDecorator)
 {
     if (part.Parent.Orientation == Orientation.Vertical)
     {
         return(new ExcelPartVerticalRenderer(parent, part, bindingContextPart, firstOutputCell, useDecorator));
     }
     return(new ExcelPartHorozontalRenderer(parent, part, bindingContextPart, firstOutputCell, useDecorator));
 }
Ejemplo n.º 4
0
        /// <summary>
        /// Manage the views contextual menus (those that are defined in the templates)
        /// </summary>
        private IEnumerable <IContextualMenu> ManageViewsContextualMenu(ExcelInterop.Worksheet sheet, ExcelInterop.Range range)
        {
            List <IContextualMenu> menus = new List <IContextualMenu>();

            if (sheet != null && range != null)
            {
                ExcelInterop.Range targetRange = range.Cells[1, 1];

                lock (syncRoot)
                {
                    List <ExcelTemplateView> views;
                    if (viewsBySheet.TryGetValue(sheet, out views))
                    {
                        if (views != null)
                        {
                            foreach (ExcelTemplateView view in views.Where(v => v.IsRendered).Select(v => v))
                            {
                                ExcelInterop.Range intersect = ExcelApplication.Application.Intersect(view.RenderedRange, targetRange);
                                if (intersect != null)
                                {
                                    IBindingContextItem currentContextItem = view.GetConcernedContextItem(targetRange);
                                    if (currentContextItem != null)
                                    {
                                        // User contextual menu
                                        IBindingContextElement catchingContextElement = currentContextItem.ParentElement;
                                        do
                                        {
                                            ExcelTemplateDefinitionPart currentTemplateDefinition = catchingContextElement.ParentPart.TemplateDefinitionPart as ExcelTemplateDefinitionPart;
                                            if ((currentTemplateDefinition.Parent as ExcelTemplateDefinition).ContextualMenu != null)
                                            {
                                                ContextualMenu contextualMenu = (currentTemplateDefinition.Parent as ExcelTemplateDefinition).ContextualMenu as ContextualMenu;
                                                contextualMenu.SetAction(targetRange, catchingContextElement, currentContextItem.ParentElement);
                                                menus.Insert(0, contextualMenu);
                                            }
                                            catchingContextElement = catchingContextElement.ParentPart.ParentContext == null ? null : catchingContextElement.ParentPart.ParentContext.Parent;
                                        }while (catchingContextElement != null);

                                        // Etk sort, search and filter
                                        IContextualMenu searchSortAndFilterMenu = sortSearchAndFilterMenuManager.GetMenus(view, targetRange, currentContextItem);
                                        if (searchSortAndFilterMenu != null)
                                        {
                                            menus.Insert(0, searchSortAndFilterMenu);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //ExcelApplication.ReleaseComObject(targetRange);
                targetRange = null;
            }
            return(menus);
        }
Ejemplo n.º 5
0
        //public bool isExpander = false;
        #endregion

        #region .ctors and factories
        protected ExcelPartRenderer(ExcelRenderer parent, ExcelTemplateDefinitionPart part, IBindingContextPart bindingContextPart, ExcelInterop.Range firstOutputCell, bool useDecorator)
        {
            Parent = parent;
            partToRenderDefinition  = part;
            this.bindingContextPart = bindingContextPart;
            this.useDecorator       = useDecorator;

            currentRenderingFrom = partToRenderDefinition.DefinitionFirstCell;
            firstRangeTo         = firstOutputCell;
            elementFirstRangeTo  = firstOutputCell;
            currentRenderingTo   = firstOutputCell;

            Height = Width = 0;
        }
Ejemplo n.º 6
0
        internal bool OnSelectionChange(ExcelInterop.Range target)
        {
            try
            {
                CurrentSelectedCell = null;
                if (UseHighlightSelection)
                {
                    UnhighlightSelection();
                }

                if (IsRendered)
                {
                    ExcelInterop.Range intersect = ETKExcel.ExcelApplication.Application.Intersect(RenderedRange, target);
                    if (intersect != null)
                    {
                        CurrentSelectedCell = target.Cells[1, 1];

                        IBindingContextItem currentContextItem = GetConcernedContextItem(target);
                        if (currentContextItem?.BindingDefinition != null)
                        {
                            // If the binding excelBindingDefinition contains a selection callback: invoke it !
                            if (currentContextItem.BindingDefinition.OnSelection != null)
                            {
                                ((ExcelTemplateManager)ETKExcel.TemplateManager).CallbacksManager.Invoke(currentContextItem.BindingDefinition.OnSelection,
                                                                                                         target, currentContextItem.ParentElement, currentContextItem);
                            }
                            else
                            {
                                // Ask the containing template (and its owner and the owner of its owner etc.... => bubble up the event)) if they contain a selection callback
                                // Invoke the first found
                                IBindingContextElement catchingContextElement = currentContextItem.ParentElement;
                                bool isResolved = false;
                                do
                                {
                                    ExcelTemplateDefinitionPart currentTemplateDefinition = catchingContextElement.ParentPart.TemplateDefinitionPart as ExcelTemplateDefinitionPart;
                                    if (currentTemplateDefinition.PartType == TemplateDefinitionPartType.Body)
                                    {
                                        EventCallback callback = (currentTemplateDefinition.Parent as ExcelTemplateDefinition).SelectionChanged;
                                        if (callback != null)
                                        {
                                            ((ExcelTemplateManager)ETKExcel.TemplateManager).CallbacksManager.Invoke(callback, target, catchingContextElement, currentContextItem);
                                            isResolved = true;
                                        }
                                    }
                                    if (!isResolved)
                                    {
                                        catchingContextElement = catchingContextElement.ParentPart.ParentContext?.Parent;
                                    }
                                }while (!isResolved && catchingContextElement != null);
                            }
                        }
                        intersect = null;
                        if (UseHighlightSelection)
                        {
                            HighlightSelection(target);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = $"Sheet '{target.Worksheet.Name}', Template '{TemplateDefinition.Name}' 'OnSelectionChange' failed: '{ex.Message}'";
                log.LogException(LogType.Error, ex, message);
            }
            return(CurrentSelectedCell != null);
        }
 public ExcelPartHorozontalRenderer(ExcelRenderer parent, ExcelTemplateDefinitionPart part, IBindingContextPart bindingContextPart, ExcelInterop.Range firstOutputCell, bool useDecorator)
     : base(parent, part, bindingContextPart, firstOutputCell, useDecorator)
 {
 }