using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using FastReport.Utils;
using FastReport.Forms;
#if !MONO
using FastReport.DevComponents.DotNetBar;
#endif
namespace FastReport.Design
{
#if !MONO
#if !DEBUG
[DesignTimeVisible(false)]
#endif
internal class ObjectsToolbar : Bar, IDesignerPlugin
#else
internal class ObjectsToolbar : ToolStrip, IDesignerPlugin
#endif
{
#region Fields
private Designer designer;
private Report currentReport;
private PageBase currentPage;
private ObjectInfo nowInserting;
#if !MONO
public ButtonItem btnSelect;
#else
public ToolStripButton btnSelect;
#endif
#endregion
#region Properties
internal Designer Designer
{
get { return designer; }
}
///
public string PluginName
{
get { return Name; }
}
#endregion
#region Private Methods
#if !MONO
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;
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());
}
#else
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 = new Size(22, 23);
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 = new Size(22, 23);
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.Image = this.GetImage(100);
btnSelect.AutoSize = false;
btnSelect.Size = new Size(22, 23);
btnSelect.ToolTipText = Res.Get("Designer,Toolbar,Objects,Select");
btnSelect.Click += btnSelect_Click;
Items.Add(btnSelect);
}
private void SortButtons(ToolStripItemCollection 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 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());
}
#endif
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();
#if !MONO
Items.RemoveAt(i);
#endif
}
}
#if !MONO
if (forceCreate)
CreateSelectBtn();
if (currentPage == null)
{
RecalcLayout();
return;
}
// create object buttons
ObjectInfo pageItem = RegisteredObjects.FindObject(currentPage);
if (pageItem != null)
{
DoCreateButtons(pageItem, Items);
}
RecalcLayout();
#else
if (forceCreate)
CreateSelectBtn();
// create object buttons
ObjectInfo pageItem = new ObjectInfo();
ObjectInfo info = RegisteredObjects.FindObject(currentPage);
bool contain = true;
if (info != null)
{
foreach(ObjectInfo item in info.Items)
{
contain = true;
if (pageItem.Items.Count != 0)
{
foreach (ObjectInfo obj_item in pageItem.Items)
{
if (item.Text == obj_item.Text)
{
contain = false;
break;
}
}
}
if (contain)
{
pageItem.Items.Add(item);
}
}
DoCreateButtons(pageItem);
}
#endif
}
private void button_Click(object sender, EventArgs e)
{
Designer.FormatPainter = false;
if (!Designer.cmdInsert.Enabled)
return;
ResetButtons();
#if !MONO
if (sender is ButtonItem && (sender as ButtonItem).IsOnBar)
(sender as ButtonItem).Checked = true;
nowInserting = (sender as ButtonItem).Tag as ObjectInfo;
#else
if (sender is ToolStripButton)
(sender as ToolStripButton).Checked = true;
nowInserting = (sender as ToolStripItem).Tag as ObjectInfo;
#endif
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()
{
#if !MONO
foreach (BaseItem item in Items)
{
if (item is ButtonItem)
(item as ButtonItem).Checked = false;
}
#else
foreach (ToolStripItem item in Items)
{
if (item is ToolStripButton)
(item as ToolStripButton).Checked = false;
}
#endif
}
#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("");
#if !MONO
btnSelect.Tooltip = res.Get("Select");
#else
btnSelect.ToolTipText = res.Get("Select");
#endif
}
///
public DesignerOptionsPage GetOptionsPage()
{
return null;
}
///
public void UpdateUIStyle()
{
#if MONO
Renderer = UIStyleUtils.GetToolStripRenderer(Designer.UIStyle);
#endif
}
///
public new void UpdateDpiDependencies()
{
SuspendLayout();
Font = this.LogicalToDevice(DrawUtils.DefaultFont);
#if !MONO
base.UpdateDpiDependencies();
#endif
CreateButtons(true);
ResumeLayout();
}
#endregion
public ObjectsToolbar(Designer designer)
: base()
{
this.designer = designer;
Name = "ObjectsToolbar";
Dock = DockStyle.Left;
#if !MONO
DockOrientation = eOrientation.Vertical;
RoundCorners = false;
#else
GripStyle = ToolStripGripStyle.Hidden;
AutoSize = false;
Width = 26;
if (Config.IsRunningOnMono)
Padding = new Padding(1, 0, 0, 0);
#endif
#if !MONO
Parent = Designer.DotNetBarManager.ToolbarLeftDockSite;
#else
Parent = Designer;
#endif
UpdateDpiDependencies();
Localize();
}
}
}