using System; using System.Collections.Generic; using System.Windows.Forms; using System.Drawing; using FastReport.Utils; using FastReport.Forms; using FastReport.DevComponents.DotNetBar; namespace FastReport.Design { internal class ObjectsToolbar : Bar, IDesignerPlugin { #region Fields private Designer designer; private Report currentReport; private PageBase currentPage; private ObjectInfo nowInserting; public ButtonItem btnSelect; #endregion #region Properties internal Designer Designer { get { return designer; } } /// public string PluginName { get { return Name; } } #endregion #region Private Methods private void DoCreateButtons(ObjectInfo rootItem, SubItemsCollection items) { foreach (ObjectInfo item in rootItem.Items) { if (!item.Enabled) continue; ButtonItem button = new ButtonItem(); button.Image = Designer.GetImage(item.ImageIndex); int buttonSize = Designer.LogicalToDevice(25); string text = Res.TryGet(item.Text); if (items == Items) { button.Tooltip = text; button.FixedSize = new Size(buttonSize, buttonSize); } else { button.Text = text; button.ButtonStyle = eButtonStyle.ImageAndText; } if (item.Items.Count > 0) { // it's a category DoCreateButtons(item, button.SubItems); button.PopupSide = ePopupSide.Right; if (items == Items) { button.AutoExpandOnClick = true; button.FixedSize = new Size(buttonSize, Designer.LogicalToDevice(32)); } button.Tag = item; } else { button.Tag = item; button.Click += button_Click; } items.Add(button); } SortButtons(items); } private void CreateSelectBtn() { btnSelect = new ButtonItem(); btnSelect.Image = Designer.GetImage(100); btnSelect.Click += btnSelect_Click; btnSelect.FixedSize = Designer.LogicalToDevice(new Size(25, 25)); btnSelect.Tooltip = Res.Get("Designer,Toolbar,Objects,Select"); Items.Add(btnSelect); } private void SortButtons(SubItemsCollection root) { List tempItems = new List(); List lastItems = new List(); tempItems.Add(root[0]); for (int i = 1; i < root.Count; i++) { for (int j = 1; j < root.Count; j++) { ObjectInfo objInfo = (root[j] as ButtonItem).Tag as ObjectInfo; if (objInfo != null) { if (objInfo.ButtonIndex == i) { tempItems.Add(root[j]); } if (objInfo.ButtonIndex < 0 || objInfo.ButtonIndex >= root.Count) { lastItems.Add(root[j]); } } } } root.Clear(); root.AddRange(tempItems.ToArray()); root.AddRange(lastItems.ToArray()); } private void CreateButtons(bool forceCreate = false) { if (!forceCreate && Designer.ActiveReport != null && Designer.ActiveReport == currentReport && Designer.ActiveReportTab.ActivePage == currentPage) return; currentReport = Designer.ActiveReport; if (Designer.ActiveReportTab != null) currentPage = Designer.ActiveReportTab.ActivePage; else currentPage = null; // delete all buttons except btnSelect int i = 0; while (i < Items.Count) { if (!forceCreate && Items[i] == btnSelect) i++; else { Items[i].Dispose(); Items.RemoveAt(i); } } if (forceCreate) CreateSelectBtn(); if (currentPage == null) { RecalcLayout(); return; } // create object buttons ObjectInfo pageItem = RegisteredObjects.FindObject(currentPage); if (pageItem != null) { DoCreateButtons(pageItem, Items); } RecalcLayout(); } private void button_Click(object sender, EventArgs e) { Designer.FormatPainter = false; if (!Designer.cmdInsert.Enabled) return; ResetButtons(); if (sender is ButtonItem && (sender as ButtonItem).IsOnBar) (sender as ButtonItem).Checked = true; nowInserting = (sender as ButtonItem).Tag as ObjectInfo; Designer.InsertObject(nowInserting, InsertFrom.NewObject); } private void btnSelect_Click(object sender, EventArgs e) { Designer.FormatPainter = false; if (Designer.ActiveReportTab == null) return; DoClickSelectButton(true); } private void DoClickSelectButton(bool ignoreMultiInsert) { if (!btnSelect.Checked) { if (nowInserting != null && nowInserting.MultiInsert && !ignoreMultiInsert) { Designer.InsertObject(nowInserting, InsertFrom.NewObject); } else { ResetButtons(); btnSelect.Checked = true; Designer.CancelPaste(); } } } private void ResetButtons() { foreach (BaseItem item in Items) { if (item is ButtonItem) (item as ButtonItem).Checked = false; } } #endregion #region Public Methods public void ClickSelectButton(bool ignoreMultiInsert) { DoClickSelectButton(ignoreMultiInsert); } #endregion #region IDesignerPlugin /// public void SaveState() { } /// public void RestoreState() { } /// public void SelectionChanged() { CreateButtons(); } /// public void UpdateContent() { CreateButtons(); } /// public void Lock() { } /// public void Unlock() { UpdateContent(); } /// public void Localize() { MyRes res = new MyRes("Designer,Toolbar,Objects"); Text = res.Get(""); btnSelect.Tooltip = res.Get("Select"); } /// public DesignerOptionsPage GetOptionsPage() { return null; } /// public void UpdateUIStyle() { } /// public new void UpdateDpiDependencies() { SuspendLayout(); Font = this.LogicalToDevice(DrawUtils.DefaultFont); base.UpdateDpiDependencies(); Width = Designer.LogicalToDevice(29); CreateButtons(true); ResumeLayout(); } #endregion public ObjectsToolbar(Designer designer) : base() { this.designer = designer; Name = "ObjectsToolbar"; Dock = DockStyle.Left; DockOrientation = eOrientation.Vertical; RoundCorners = false; Parent = Designer.DotNetBarManager.ToolbarLeftDockSite; UpdateDpiDependencies(); Localize(); } } }