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); } }
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); } }
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)); }
/// <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); }
//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; }
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) { }