123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- using System.Drawing;
- using FastReport.Utils;
- using FastReport.Forms;
- namespace FastReport.Design
- {
- internal class ObjectsToolbar : ToolStrip, IDesignerPlugin
- {
- #region Fields
- private Size buttonSize;
- private Report currentReport;
- private PageBase currentPage;
- private ObjectInfo nowInserting;
- public ToolStripButton btnSelect;
- private Dictionary<Type, List<ToolStripItem>> cachedButtons = new Dictionary<Type, List<ToolStripItem>>();
- #endregion
- #region Properties
- internal Designer Designer { get; }
- /// <inheritdoc/>
- public string PluginName => Name;
- #endregion
- #region Private Methods
- private void DoCreateButtons(ObjectInfo rootItem, bool forceCreate)
- {
- var pageType = rootItem.Object;
- if (!forceCreate && cachedButtons.ContainsKey(pageType))
- {
- GetCachedButtons(pageType);
- }
- else
- {
- DoCreateButtons(rootItem);
- CacheButtons(pageType);
- }
- }
- private void DoCreateButtons(ObjectInfo rootItem)
- {
- foreach (ObjectInfo item in rootItem.Items)
- {
- if (item.Items.Count == 0)
- {
- // it's an object
- ToolStripButton button = new ToolStripButton();
- button.AutoSize = false;
- button.Size = buttonSize;
- button.Image = this.GetImage(item.ImageIndex);
- button.ToolTipText = Res.TryGet(item.Text);
- button.Tag = item;
- button.Click += button_Click;
- Items.Add(button);
- }
- else
- {
- // it's a category
- ToolStripDropDownButton button = new ToolStripDropDownButton();
- button.Image = this.GetImage(item.ImageIndex);
- button.ToolTipText = Res.TryGet(item.Text);
- button.Tag = item;
- button.ShowDropDownArrow = false;
- button.AutoSize = false;
- button.Size = buttonSize;
- DoCreateMenus(item, button.DropDownItems);
- Items.Add(button);
- }
- }
- SortButtons(Items);
- }
- private void DoCreateMenus(ObjectInfo rootItem, ToolStripItemCollection items)
- {
- foreach (ObjectInfo item in rootItem.Items)
- {
- ToolStripMenuItem menuItem = new ToolStripMenuItem();
- menuItem.Image = this.GetImage(item.ImageIndex);
- menuItem.Text = Res.TryGet(item.Text);
- menuItem.Tag = item;
- menuItem.Font = DrawUtils.DefaultFont;
- items.Add(menuItem);
- if (item.Items.Count != 0)
- {
- // it's a category
- DoCreateMenus(item, menuItem.DropDownItems);
- }
- else
- {
- menuItem.Click += button_Click;
- }
- }
- SortButtons(items);
- }
- private void CreateSelectBtn()
- {
- btnSelect = new ToolStripButton();
- btnSelect.AutoSize = false;
- btnSelect.Size = buttonSize;
- btnSelect.Image = this.GetImage(100);
- btnSelect.ToolTipText = Res.Get("Designer,Toolbar,Objects,Select");
- btnSelect.Click += btnSelect_Click;
- Items.Add(btnSelect);
- }
- private void SortButtons(ToolStripItemCollection root)
- {
- List<ToolStripItem> tempItems = new List<ToolStripItem>();
- List<ToolStripItem> lastItems = new List<ToolStripItem>();
- 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 ToolStripItem).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 CacheButtons(Type pageType)
- {
- var dictEntry = new List<ToolStripItem>();
- foreach (ToolStripItem item in Items)
- {
- if (item != btnSelect)
- dictEntry.Add(item);
- }
- cachedButtons[pageType] = dictEntry;
- }
- private void GetCachedButtons(Type pageType)
- {
- var dictEntry = cachedButtons[pageType];
- foreach (var item in dictEntry)
- {
- Items.Add(item);
- }
- }
- 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.RemoveAt(i);
- }
- }
- if (forceCreate)
- CreateSelectBtn();
- // create object buttons
- ObjectInfo pageItem = RegisteredObjects.FindObject(currentPage);
- if (pageItem != null)
- {
- DoCreateButtons(pageItem, forceCreate);
- }
- }
- private void button_Click(object sender, EventArgs e)
- {
- Designer.FormatPainter = false;
- if (!Designer.cmdInsert.Enabled)
- return;
- ResetButtons();
- if (sender is ToolStripButton btn)
- btn.Checked = true;
- nowInserting = (sender as ToolStripItem).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 (ToolStripItem item in Items)
- {
- if (item is ToolStripButton btn)
- btn.Checked = false;
- }
- }
- #endregion
- #region Public Methods
- public void ClickSelectButton(bool ignoreMultiInsert)
- {
- DoClickSelectButton(ignoreMultiInsert);
- }
- #endregion
- #region IDesignerPlugin
- /// <inheritdoc/>
- public void SaveState()
- {
- }
- /// <inheritdoc/>
- public void RestoreState()
- {
- }
- /// <inheritdoc/>
- public void SelectionChanged()
- {
- CreateButtons();
- }
- /// <inheritdoc/>
- public void UpdateContent()
- {
- CreateButtons();
- }
- /// <inheritdoc/>
- public void Lock()
- {
- }
- /// <inheritdoc/>
- public void Unlock()
- {
- UpdateContent();
- }
- /// <inheritdoc/>
- public void Localize()
- {
- MyRes res = new MyRes("Designer,Toolbar,Objects");
- Text = res.Get("");
- btnSelect.ToolTipText = res.Get("Select");
- }
- /// <inheritdoc/>
- public DesignerOptionsPage GetOptionsPage()
- {
- return null;
- }
- /// <inheritdoc/>
- public void UpdateUIStyle()
- {
- Renderer = UIStyleUtils.GetToolStripRenderer(Designer.UIStyle);
- }
- /// <inheritdoc/>
- public void UpdateDpiDependencies()
- {
- Font = this.LogicalToDevice(DrawUtils.DefaultFont);
- Width = Designer.LogicalToDevice(30);
- CreateButtons(true);
- }
- #endregion
- public ObjectsToolbar(Designer designer) : base()
- {
- Designer = designer;
- Name = "ObjectsToolbar";
- Dock = DockStyle.Left;
- GripStyle = ToolStripGripStyle.Hidden;
- AutoSize = false;
-
- // WPF specific: button size with the default dpi setting.
- // On a multi-monitor system buttons will scale automatically
- buttonSize = this.LogicalToDevice(new Size(23, 23));
-
- if (Config.IsRunningOnMono)
- Padding = new Padding(1, 0, 0, 0);
- #if (WPF || AVALONIA)
- BorderThickness = new Padding(0, 0, 1, 0);
- #endif
- Parent = Designer;
- UpdateDpiDependencies();
- Localize();
- }
- }
- }
|