using FastReport.Controls;
using FastReport.Utils;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace FastReport.Design.ToolWindows
{
///
/// Represents the "Messages" window.
///
///
/// To get this window, use the following code:
///
/// Designer designer;
/// MessagesWindow window = designer.Plugins.FindType("MessagesWindow") as MessagesWindow;
///
///
public class MessagesWindow : ToolWindowBase
{
private List errors;
private List warnings;
private ToolbarBase toolbar;
private ToolbarButton btnErrors;
private ToolbarButton btnWarnings;
private ToolbarButton btnValidate;
private ToolbarButton btnClose;
private StyledListView list;
private void ShowMessageItems(List items, bool isError)
{
for (int i = 0; i < items.Count && i < 100; i++)
{
var messageItem = items[i];
if (string.IsNullOrEmpty(messageItem.ObjName))
{
// script error with line/column info
ListViewItem item = new ListViewItem();
item.Text = " " + messageItem.Message;
item.ImageIndex = 80;
ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem();
if (messageItem.Line != -1)
subItem.Text = messageItem.Line.ToString();
subItem.Tag = messageItem.Line;
item.SubItems.Add(subItem);
subItem = new ListViewItem.ListViewSubItem();
if (messageItem.Column != -1)
subItem.Text = messageItem.Column.ToString();
subItem.Tag = messageItem.Column;
item.SubItems.Add(subItem);
list.Items.Add(item);
}
else
{
// other message with object name info
ListViewItem item = new ListViewItem();
item.ImageIndex = isError ? 80 : 211;
item.Text = " " + messageItem.Message;
item.Tag = messageItem.ObjName;
list.Items.Add(item);
}
}
}
private void UpdateListView()
{
list.Items.Clear();
if (btnErrors.Checked)
ShowMessageItems(errors, true);
if (btnWarnings.Checked)
ShowMessageItems(warnings, false);
UpdateButtonsText();
}
private void UpdateButtonsText()
{
MyRes res = new MyRes("Designer,ToolWindow,Messages");
btnErrors.Text = String.Format(res.Get("Errors"), errors.Count > 99 ? "99+" : errors.Count.ToString());
btnWarnings.Text = String.Format(res.Get("Warnings"), warnings.Count > 99 ? "99+" : warnings.Count.ToString());
}
private void btnValidate_Click(object sender, EventArgs e)
{
if (Designer.cmdReportValidation.Enabled)
Designer.cmdReportValidation.Invoke(this, new EventArgs());
}
private void btnWarnings_Click(object sender, EventArgs e)
{
UpdateListView();
}
private void btnErrors_Click(object sender, EventArgs e)
{
UpdateListView();
}
private void btnClose_Click(object sender, EventArgs e)
{
#if !MONO
Close();
#else
Designer.MessageWindowEnabled = false;
#endif
}
private void list_DoubleClick(object sender, EventArgs e)
{
ListViewItem item = list.SelectedItems[0];
if (item.SubItems.Count > 1)
{
Designer.ActiveReportTab.SwitchToCode();
Designer.ActiveReport.CodeHelper.Locate((int)item.SubItems[1].Tag, (int)item.SubItems[2].Tag);
}
else
{
Base obj = Designer.ActiveReport.FindObject((string)item.Tag);
if (obj != null)
{
Designer.ActiveReportTab.ActivePage = obj.Page;
Designer.SelectedObjects.Clear();
Designer.SelectedObjects.Add(obj);
Designer.SelectionChanged(null);
}
}
}
///
/// Clears the message list.
///
public void ClearMessages()
{
errors.Clear();
warnings.Clear();
UpdateListView();
}
///
/// Adds a new message.
///
/// The message text.
/// The name of object related to a message.
/// Determines whether the message is an error or a warning.
public void AddMessage(string description, string objName, bool isError = true)
{
var messageItem = new MessageItem() { Message = description, ObjName = objName };
if (isError)
errors.Add(messageItem);
else
warnings.Add(messageItem);
}
///
/// Adds a new script-related message.
///
/// The message text.
/// The line of the script.
/// The column of the script.
public void AddMessage(string description, int line, int column)
{
var messageItem = new MessageItem() { Message = description, Line = line, Column = column };
errors.Add(messageItem);
}
public new void Show()
{
UpdateListView();
#if MONO
Designer.MessageWindowEnabled = true;
#else
base.Show();
#endif
}
///
public override void UpdateUIStyle()
{
base.UpdateUIStyle();
toolbar.UpdateUIStyle();
list.SetStyle(Designer.UIStyle);
}
///
public override void UpdateDpiDependencies()
{
base.UpdateDpiDependencies();
Image = Designer.GetImage(70);
list.SmallImageList = Designer.GetImages();
toolbar.Font = Designer.LogicalToDevice(DrawUtils.DefaultFont);
toolbar.Height = Designer.LogicalToDevice(26);
toolbar.UpdateDpiDependencies();
}
///
public override void Localize()
{
MyRes res = new MyRes("Designer,ToolWindow,Messages");
Text = res.Get("");
UpdateButtonsText();
btnValidate.Text = res.Get("Refresh");
btnClose.Text = res.Get("Close");
list.Columns.Clear();
list.Columns.Add(res.Get("Description"));
list.Columns.Add(res.Get("Line"));
list.Columns.Add(res.Get("Column"));
list.Columns[0].Width = (600);
}
///
/// Initializes a new instance of the class with default settings.
///
/// The report designer.
public MessagesWindow(Designer designer) : base(designer)
{
Name = "MessagesWindow";
errors = new List();
warnings = new List();
toolbar = new ToolbarBase(designer);
toolbar.Dock = DockStyle.Top;
toolbar.Fixed = true;
#if (WPF || AVALONIA)
toolbar.BorderThickness = new Padding(0);
#endif
btnErrors = AddButton(80, true, btnErrors_Click);
btnErrors.CheckOnClick = true;
btnErrors.Checked = true;
btnWarnings = AddButton(211, true, btnWarnings_Click);
btnWarnings.BeginGroup = true;
btnWarnings.CheckOnClick = true;
btnWarnings.Checked = true;
btnValidate = AddButton(232, true, btnValidate_Click);
btnValidate.BeginGroup = true;
btnClose = AddButton(212, true, btnClose_Click);
toolbar.AddItems(btnErrors, btnWarnings, btnValidate, btnClose);
list = new StyledListView();
list.Dock = DockStyle.Fill;
list.BorderStyle = BorderStyle.None;
list.FullRowSelect = true;
list.View = View.Details;
list.HideSelection = false;
list.DoubleClick += list_DoubleClick;
Controls.AddRange(new Control[] { list, toolbar });
Localize();
UpdateDpiDependencies();
}
private class MessageItem
{
public string Message { get; set; }
public string ObjName { get; set; }
public int Line { get; set; }
public int Column { get; set; }
}
}
}