// EMERGENT GAME TECHNOLOGIES PROPRIETARY INFORMATION // // This software is supplied under the terms of a license agreement or // nondisclosure agreement with Emergent Game Technologies and may not // be copied or disclosed except in accordance with the terms of that // agreement. // // Copyright (c) 1996-2007 Emergent Game Technologies. // All Rights Reserved. // // Emergent Game Technologies, Chapel Hill, North Carolina 27517 // http://www.emergent.net using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; using Emergent.Gamebryo.SceneDesigner.Framework; using Emergent.Gamebryo.SceneDesigner.PluginAPI; using PluginAPI = Emergent.Gamebryo.SceneDesigner.PluginAPI; using Emergent.Gamebryo.SceneDesigner.PluginAPI.StandardServices; namespace Emergent.Gamebryo.SceneDesigner.StdPluginsCs.Panels { /// /// Summary description for MessagesPanel. /// [DockPosition(Position=DefaultDock.DockBottom)] public class MessagesPanel : System.Windows.Forms.Form, ICommandPanel { #region Private Data private IMessageService m_messageService; private IUICommandService m_commandService; private ListViewItem.ListViewSubItem m_lastItem; #endregion private System.Windows.Forms.ListView m_lvMessages; private System.Windows.Forms.ColumnHeader messageHeader; private System.Windows.Forms.ComboBox m_cbChannel; private System.Windows.Forms.Button m_btnClearChannel; private System.Windows.Forms.Button m_btnClearAll; private System.Windows.Forms.ToolTip m_toolTip; private System.Windows.Forms.ColumnHeader msgTime; private System.Windows.Forms.ColumnHeader detailsHeader; private System.Windows.Forms.Label m_lblDummy; private System.ComponentModel.IContainer components; public MessagesPanel( IUICommandService commandService, IMessageService messageService) { // // Required for Windows Form Designer support // //Debugger.Break(); InitializeComponent(); m_messageService = messageService; m_commandService = commandService; InitChannelCombo(); m_commandService.BindCommands(this); } private void InitChannelCombo() { string[] channelNames = Enum.GetNames(typeof(MessageChannelType)); foreach(string name in channelNames) { m_cbChannel.Items.Add(name); } } // private IMessageService MessageService // { // get // { // return // m_messageService.GetService(typeof(IMessageService)) // as IMessageService; // } // } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(MessagesPanel)); this.m_btnClearChannel = new System.Windows.Forms.Button(); this.m_lvMessages = new System.Windows.Forms.ListView(); this.msgTime = new System.Windows.Forms.ColumnHeader(); this.messageHeader = new System.Windows.Forms.ColumnHeader(); this.detailsHeader = new System.Windows.Forms.ColumnHeader(); this.m_cbChannel = new System.Windows.Forms.ComboBox(); this.m_btnClearAll = new System.Windows.Forms.Button(); this.m_toolTip = new System.Windows.Forms.ToolTip(this.components); this.m_lblDummy = new System.Windows.Forms.Label(); this.SuspendLayout(); // // m_btnClearChannel // this.m_btnClearChannel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.m_btnClearChannel.FlatStyle = System.Windows.Forms.FlatStyle.System; this.m_btnClearChannel.Location = new System.Drawing.Point(8, 456); this.m_btnClearChannel.Name = "m_btnClearChannel"; this.m_btnClearChannel.Size = new System.Drawing.Size(88, 23); this.m_btnClearChannel.TabIndex = 2; this.m_btnClearChannel.Text = "Clear Channel"; this.m_btnClearChannel.Click += new System.EventHandler(this.m_btnClearChannel_Click); // // m_lvMessages // this.m_lvMessages.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.m_lvMessages.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.msgTime, this.messageHeader, this.detailsHeader}); this.m_lvMessages.FullRowSelect = true; this.m_lvMessages.GridLines = true; this.m_lvMessages.Location = new System.Drawing.Point(8, 32); this.m_lvMessages.Name = "m_lvMessages"; this.m_lvMessages.Size = new System.Drawing.Size(664, 416); this.m_lvMessages.TabIndex = 1; this.m_lvMessages.View = System.Windows.Forms.View.Details; this.m_lvMessages.DoubleClick += new System.EventHandler(this.m_lvMessages_DoubleClick); this.m_lvMessages.MouseMove += new System.Windows.Forms.MouseEventHandler(this.m_lvMessages_MouseMove); // // msgTime // this.msgTime.Text = "Time"; this.msgTime.Width = 91; // // messageHeader // this.messageHeader.Text = "Message"; this.messageHeader.Width = 267; // // detailsHeader // this.detailsHeader.Text = "Details"; this.detailsHeader.Width = 255; // // m_cbChannel // this.m_cbChannel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.m_cbChannel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.m_cbChannel.Location = new System.Drawing.Point(8, 8); this.m_cbChannel.Name = "m_cbChannel"; this.m_cbChannel.Size = new System.Drawing.Size(664, 21); this.m_cbChannel.TabIndex = 0; this.m_cbChannel.SelectedIndexChanged += new System.EventHandler(this.m_cbChannel_SelectedIndexChanged); // // m_btnClearAll // this.m_btnClearAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.m_btnClearAll.FlatStyle = System.Windows.Forms.FlatStyle.System; this.m_btnClearAll.ForeColor = System.Drawing.SystemColors.ControlText; this.m_btnClearAll.Location = new System.Drawing.Point(608, 456); this.m_btnClearAll.Name = "m_btnClearAll"; this.m_btnClearAll.Size = new System.Drawing.Size(64, 23); this.m_btnClearAll.TabIndex = 3; this.m_btnClearAll.Text = "Clear All"; this.m_btnClearAll.Click += new System.EventHandler(this.m_btnClearAll_Click); // // m_lblDummy // this.m_lblDummy.BackColor = System.Drawing.SystemColors.Control; this.m_lblDummy.Location = new System.Drawing.Point(168, 104); this.m_lblDummy.Name = "m_lblDummy"; this.m_lblDummy.Size = new System.Drawing.Size(8, 8); this.m_lblDummy.TabIndex = 4; // // MessagesPanel // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.AutoScroll = true; this.ClientSize = new System.Drawing.Size(680, 486); this.Controls.Add(this.m_btnClearAll); this.Controls.Add(this.m_cbChannel); this.Controls.Add(this.m_btnClearChannel); this.Controls.Add(this.m_lvMessages); this.Controls.Add(this.m_lblDummy); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "MessagesPanel"; this.Text = "Messages"; this.Load += new System.EventHandler(this.MessagesPanel_Load); this.ResumeLayout(false); } #endregion public void RegisterEventHandlers() { m_messageService.MessageAdded += new MessageAddedHandler(MessageAdded); m_messageService.AllMessagesCleared += new AllMessagesClearedHandler(AllMessagesCleared); m_messageService.ChannelMessagesCleared += new ChannelMessagesClearedHandler(ChannelMessagesCleared); } private void ChannelMessagesCleared(MessageChannelType eChannel) { RefreshList(); } private void AllMessagesCleared() { RefreshList(); } private void MessageAdded(MessageChannelType eChannel, int iIndex) { try { if (eChannel == GetChannel()) { string channelName = m_messageService.GetChannelName(eChannel); PluginAPI.Message message = m_messageService.GetMessage(eChannel, iIndex); AddItem(iIndex, channelName, message); } if (eChannel == MessageChannelType.Errors || eChannel == MessageChannelType.Conflicts) { if (!this.Visible && this.Created) { ServiceProvider sp = ServiceProvider.Instance; ICommandPanelService panelService = sp.GetService(typeof(ICommandPanelService)) as ICommandPanelService; panelService.ShowPanel(this.Text, true); } if (m_cbChannel.SelectedIndex != (int)eChannel) { m_cbChannel.SelectedIndex = (int) eChannel; } } } catch (InvalidOperationException) { } } private void AddItem(int iIndex, string channelName, PluginAPI.Message message) { ListViewItem item = m_lvMessages.Items.Add(message.m_strTime); item.Tag = message; //Add to channel item.SubItems.Add(message.m_strText); item.SubItems.Add(message.m_strDetails); item.UseItemStyleForSubItems = true; item.ForeColor = GetChannelTextColor(GetChannel()); } private Color GetChannelTextColor(MessageChannelType channelType) { switch (channelType) { case MessageChannelType.Errors: return Color.Red; case MessageChannelType.Conflicts: return Color.Fuchsia; default: return SystemColors.ControlText; } } private void MessagesPanel_Load(object sender, System.EventArgs e) { m_cbChannel.SelectedIndex = (int) MessageChannelType.Errors; } private void RefreshList() { m_lvMessages.Items.Clear(); MessageChannelType channel = GetChannel(); if (channel == (MessageChannelType) (-1)) return; string channelName = m_messageService.GetChannelName(channel); PluginAPI.Message[] messages = m_messageService.GetMessages( channel); int size = messages.Length; for ( int i = 0; i < size; i++) { AddItem(i, channelName, messages[i]); } } private MessageChannelType GetChannel() { int selectedIndex = m_cbChannel.SelectedIndex; //Note jwolfe 3/9/06 //this assert should never fail, but I've added it //to verify that bug# 3674(filed as a one time bug) is //not being reproduced. //Debug.Assert(selectedIndex >= 0, "Invalid channel selected"); if (selectedIndex >= 0) { string text = m_cbChannel.SelectedText; text = m_cbChannel.Items[m_cbChannel.SelectedIndex].ToString(); //if the implementation of MMessageManager changes, //"this may break. return (MessageChannelType) Enum.Parse( typeof(MessageChannelType), text); } else { return (MessageChannelType) (-1); } } private void m_btnClearChannel_Click(object sender, System.EventArgs e) { string message = "Are you sure you would like to " + "clear all messages for this channel?"; if (MessageBox.Show(message, "Clear Channel?", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes) { m_messageService.ClearMessages(GetChannel()); } } private void m_btnClearAll_Click(object sender, System.EventArgs e) { string message = "Are you sure you would like to clear all messages?"; if (MessageBox.Show(message, "Clear All?", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes) { m_messageService.ClearAllMessages(); } } private void m_cbChannel_SelectedIndexChanged(object sender, System.EventArgs e) { RefreshList(); } private void m_lvMessages_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { ListViewItem.ListViewSubItem subItem = GetListViewSubItemAt(m_lvMessages, e.X, e.Y); if (subItem != m_lastItem) { m_lastItem = subItem; if (subItem != null) { m_toolTip.SetToolTip(m_lvMessages, subItem.Text); } else { m_toolTip.SetToolTip(m_lvMessages, ""); } } } private void m_lvMessages_DoubleClick(object sender, System.EventArgs e) { ListView.SelectedListViewItemCollection items = m_lvMessages.SelectedItems; if (items != null && items.Count > 0) { ListViewItem item = items[0]; PluginAPI.Message message = item.Tag as PluginAPI.Message; if (message != null) { string popupText = message.m_strText + Environment.NewLine + "---------------------------------------------" + Environment.NewLine + "Details:" + Environment.NewLine + message.m_strDetails; MessageBox.Show(popupText, "Message Details", MessageBoxButtons.OK); } } } private static ListViewItem.ListViewSubItem GetListViewSubItemAt( ListView listView, int x, int y) { ListViewItem item = listView.GetItemAt(x, y); if (item != null) { int xMin = 0; int xMax = 0; for (int i = 0; i < item.SubItems.Count; i++) { xMin = xMax; xMax = xMax + listView.Columns[i].Width; if (x <= xMax && x >= xMin) { return item.SubItems[i]; } } } return null; } } }