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