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();
}
}
}