diff --git a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.addin b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.addin index 3f2597112e..9c846862ac 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.addin +++ b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.addin @@ -32,6 +32,21 @@ tooltip = "${res:ICSharpCode.CodeCoverage.ToggleCodeCoverage}" type = "CheckBox" class = "ICSharpCode.CodeCoverage.ToggleCodeCoverageCommand"/> + + + + + diff --git a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj index 05a0257d58..2137ab03c8 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj +++ b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj @@ -80,6 +80,9 @@ Configuration\GlobalAssemblyInfo.cs + + + diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageControl.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageControl.cs index cd3218d683..bff6102d0e 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageControl.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageControl.cs @@ -6,6 +6,8 @@ // using ICSharpCode.Core; +using ICSharpCode.TextEditor; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using System; using System.Collections.Generic; using System.Windows.Forms; @@ -16,69 +18,21 @@ namespace ICSharpCode.CodeCoverage { CodeCoverageTreeView treeView; ListView listView; - SplitContainer splitContainer; + SplitContainer verticalSplitContainer; + SplitContainer horizontalSplitContainer; + TextEditorControl textEditorControl; ColumnHeader visitCountColumnHeader; ColumnHeader startLineColumnHeader; ColumnHeader endLineColumnHeader; ColumnHeader startColumnColumnHeader; ColumnHeader endColumnColumnHeader; ToolStrip toolStrip; + bool showSourceCodePanel; + bool showVisitCountPanel = true; public CodeCoverageControl() { - // TreeView - treeView = new CodeCoverageTreeView(); - treeView.Dock = DockStyle.Fill; - treeView.ImageList = CodeCoverageImageList.ImageList; - treeView.AfterSelect += CodeCoverageTreeViewAfterSelect; - - // ListView - listView = new ListView(); - listView.View = View.Details; - listView.Dock = DockStyle.Fill; - listView.FullRowSelect = true; - listView.HideSelection = false; - listView.ItemActivate += ListViewItemActivate; - - visitCountColumnHeader = new ColumnHeader(); - visitCountColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.VisitCount}"); - visitCountColumnHeader.Width = 80; - - startLineColumnHeader = new ColumnHeader(); - startLineColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.Line}"); - startLineColumnHeader.Width = 80; - - startColumnColumnHeader = new ColumnHeader(); - startColumnColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.Column}"); - startColumnColumnHeader.Width = 80; - - endLineColumnHeader = new ColumnHeader(); - endLineColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.EndLine}"); - endLineColumnHeader.Width = 80; - - endColumnColumnHeader = new ColumnHeader(); - endColumnColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.EndColumn}"); - endColumnColumnHeader.Width = 80; - - listView.Columns.AddRange(new ColumnHeader[] {visitCountColumnHeader, - startLineColumnHeader, - startColumnColumnHeader, - endLineColumnHeader, - endColumnColumnHeader}); - - // SplitContainer. - splitContainer = new SplitContainer(); - splitContainer.SplitterWidth = 2; - splitContainer.Dock = DockStyle.Fill; - splitContainer.Panel1.Controls.Add(treeView); - splitContainer.Panel2.Controls.Add(listView); - - Controls.Add(splitContainer); - - // Toolstrip - toolStrip = ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/CodeCoveragePad/Toolbar"); - toolStrip.GripStyle = ToolStripGripStyle.Hidden; - Controls.Add(toolStrip); + UpdateDisplay(); } public void UpdateToolbar() @@ -95,12 +49,164 @@ namespace ICSharpCode.CodeCoverage public void Clear() { treeView.Clear(); - listView.Items.Clear(); + if (listView != null) { + listView.Items.Clear(); + } + if (textEditorControl != null) { + textEditorControl.FileName = null; + textEditorControl.Text = String.Empty; + } + } + + public bool ShowSourceCodePanel { + get { + return showSourceCodePanel; + } + set { + if (showSourceCodePanel != value) { + showSourceCodePanel = value; + OnShowSourceCodePanelChanged(); + UpdateDisplay(); + DisplaySelectedItem(treeView.SelectedNode as CodeCoverageTreeNode); + } + } + } + + public bool ShowVisitCountPanel { + get { + return showVisitCountPanel; + } + set { + if (showVisitCountPanel != value) { + showVisitCountPanel = value; + OnShowVisitCountPanelChanged(); + UpdateDisplay(); + DisplaySelectedItem(treeView.SelectedNode as CodeCoverageTreeNode); + } + } + } + + /// + /// Adds or removes the visit count list view or the source code + /// panel. + /// + void UpdateDisplay() + { + CreateTreeView(); + + if (showVisitCountPanel) { + CreateListView(); + } else { + DisposeListView(); + } + + if (showSourceCodePanel) { + CreateTextEditor(); + } else { + DisposeTextEditor(); + } + + if (showVisitCountPanel || showSourceCodePanel) { + CreateVerticalSplitContainer(); + } else { + DisposeVerticalSplitContainer(); + } + + if (showSourceCodePanel && showVisitCountPanel) { + CreateHorizontalSplitContainer(); + } else { + DisposeHorizontalSplitContainer(); + } + + // Add tree view. + if (showVisitCountPanel || showSourceCodePanel) { + if (Controls.Contains(treeView)) { + Controls.Remove(treeView); + } + if (!verticalSplitContainer.Panel1.Controls.Contains(treeView)) { + verticalSplitContainer.Panel1.Controls.Add(treeView); + } + } else { + if (!Controls.Contains(treeView)) { + Controls.Add(treeView); + } + } + + // Add list view. + if (showVisitCountPanel) { + if (showSourceCodePanel) { + if (verticalSplitContainer.Panel2.Controls.Contains(listView)) { + verticalSplitContainer.Panel2.Controls.Remove(listView); + } + if (!horizontalSplitContainer.Panel1.Controls.Contains(listView)) { + horizontalSplitContainer.Panel1.Controls.Add(listView); + } + } else { + if (!verticalSplitContainer.Panel2.Controls.Contains(listView)) { + verticalSplitContainer.Panel2.Controls.Add(listView); + } + } + } + + // Add text editor + if (showSourceCodePanel) { + if (showVisitCountPanel) { + if (verticalSplitContainer.Panel2.Controls.Contains(textEditorControl)) { + verticalSplitContainer.Panel2.Controls.Remove(textEditorControl); + } + if (!horizontalSplitContainer.Panel2.Controls.Contains(textEditorControl)) { + horizontalSplitContainer.Panel2.Controls.Add(textEditorControl); + } + } else { + if (!verticalSplitContainer.Panel2.Controls.Contains(textEditorControl)) { + verticalSplitContainer.Panel2.Controls.Add(textEditorControl); + } + } + } + + // Add vertical split container. + if (showVisitCountPanel || showSourceCodePanel) { + if (!Controls.Contains(verticalSplitContainer)) { + Controls.Add(verticalSplitContainer); + } + } + + // Add horizontal split container. + if (showVisitCountPanel && showSourceCodePanel) { + if (!verticalSplitContainer.Panel2.Controls.Contains(horizontalSplitContainer)) { + verticalSplitContainer.Panel2.Controls.Add(horizontalSplitContainer); + } + } + + // Add toolstrip - need to re-add it last otherwise the + // other controls will be displayed underneath it. + if (toolStrip == null) { + toolStrip = ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/CodeCoveragePad/Toolbar"); + toolStrip.GripStyle = ToolStripGripStyle.Hidden; + } + if (Controls.Contains(toolStrip)) { + Controls.Remove(toolStrip); + } + Controls.Add(toolStrip); } void CodeCoverageTreeViewAfterSelect(object sender, TreeViewEventArgs e) { - UpdateListView((CodeCoverageTreeNode)e.Node); + DisplaySelectedItem((CodeCoverageTreeNode)e.Node); + } + + void DisplaySelectedItem(CodeCoverageTreeNode node) + { + if (node == null) { + return; + } + + if (listView != null) { + UpdateListView(node); + } + if (textEditorControl != null) { + UpdateTextEditor(node); + } } void UpdateListView(CodeCoverageTreeNode node) @@ -118,6 +224,24 @@ namespace ICSharpCode.CodeCoverage } } + void UpdateTextEditor(CodeCoverageTreeNode node) + { + CodeCoverageClassTreeNode classNode = node as CodeCoverageClassTreeNode; + CodeCoverageMethodTreeNode methodNode = node as CodeCoverageMethodTreeNode; + if (classNode != null && classNode.Nodes.Count > 0) { + methodNode = (CodeCoverageMethodTreeNode)classNode.Nodes[0]; + } + + if (methodNode != null && methodNode.Method.SequencePoints.Count > 0) { + CodeCoverageSequencePoint sequencePoint = methodNode.Method.SequencePoints[0]; + if (classNode == null) { + OpenFile(sequencePoint.Document, sequencePoint.Line - 1, sequencePoint.Column - 1); + } else { + OpenFile(sequencePoint.Document, 1, 1); + } + } + } + void AddClass(CodeCoverageClassTreeNode node) { foreach (CodeCoverageMethodTreeNode method in node.Nodes) { @@ -153,5 +277,239 @@ namespace ICSharpCode.CodeCoverage } } } + + void OpenFile(string fileName, int line, int column) + { + if (fileName != textEditorControl.FileName) { + textEditorControl.LoadFile(fileName, true, true); + } + textEditorControl.ActiveTextAreaControl.ScrollTo(int.MaxValue); + textEditorControl.ActiveTextAreaControl.Caret.Line = line - 1; + textEditorControl.ActiveTextAreaControl.ScrollToCaret(); + CodeCoverageService.ShowCodeCoverage(textEditorControl, fileName); + } + + void CreateTreeView() + { + if (treeView != null) { + return; + } + + treeView = new CodeCoverageTreeView(); + treeView.Dock = DockStyle.Fill; + treeView.ImageList = CodeCoverageImageList.ImageList; + treeView.AfterSelect += CodeCoverageTreeViewAfterSelect; + + if (CodeCoverageService.Results != null) { + AddModules(CodeCoverageService.Results.Modules); + } + } + + void DisposeTreeView() + { + if (treeView == null) { + return; + } + + treeView.AfterSelect -= CodeCoverageTreeViewAfterSelect; + if (Controls.Contains(treeView)) { + Controls.Remove(treeView); + } + if (verticalSplitContainer != null && verticalSplitContainer.Panel1.Controls.Contains(treeView)) { + verticalSplitContainer.Panel1.Controls.Remove(treeView); + } + treeView.Dispose(); + treeView = null; + } + + void CreateListView() + { + if (listView != null) { + return; + } + + listView = new ListView(); + listView.View = View.Details; + listView.Dock = DockStyle.Fill; + listView.FullRowSelect = true; + listView.HideSelection = false; + listView.ItemActivate += ListViewItemActivate; + + visitCountColumnHeader = new ColumnHeader(); + visitCountColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.VisitCount}"); + visitCountColumnHeader.Width = 80; + + startLineColumnHeader = new ColumnHeader(); + startLineColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.Line}"); + startLineColumnHeader.Width = 80; + + startColumnColumnHeader = new ColumnHeader(); + startColumnColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.Column}"); + startColumnColumnHeader.Width = 80; + + endLineColumnHeader = new ColumnHeader(); + endLineColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.EndLine}"); + endLineColumnHeader.Width = 80; + + endColumnColumnHeader = new ColumnHeader(); + endColumnColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.EndColumn}"); + endColumnColumnHeader.Width = 80; + + listView.Columns.AddRange(new ColumnHeader[] {visitCountColumnHeader, + startLineColumnHeader, + startColumnColumnHeader, + endLineColumnHeader, + endColumnColumnHeader}); + } + + void DisposeListView() + { + if (listView == null) { + return; + } + + if (verticalSplitContainer.Panel2.Controls.Contains(listView)) { + verticalSplitContainer.Panel2.Controls.Remove(listView); + } + + if (horizontalSplitContainer != null && horizontalSplitContainer.Panel1.Controls.Contains(listView)) { + horizontalSplitContainer.Panel1.Controls.Remove(listView); + } + + listView.ItemActivate -= ListViewItemActivate; + listView.Dispose(); + listView = null; + } + + void CreateVerticalSplitContainer() + { + if (verticalSplitContainer != null) { + return; + } + + verticalSplitContainer = new SplitContainer(); + verticalSplitContainer.SplitterWidth = 2; + verticalSplitContainer.Dock = DockStyle.Fill; + } + + void DisposeVerticalSplitContainer() + { + if (verticalSplitContainer == null) { + return; + } + + if (horizontalSplitContainer != null && verticalSplitContainer.Panel2.Controls.Contains(horizontalSplitContainer)) { + verticalSplitContainer.Panel2.Controls.Remove(horizontalSplitContainer); + } + + if (listView != null && verticalSplitContainer.Panel2.Controls.Contains(listView)) { + verticalSplitContainer.Panel2.Controls.Remove(listView); + } + + if (treeView != null && verticalSplitContainer.Panel1.Controls.Contains(treeView)) { + verticalSplitContainer.Panel1.Controls.Remove(treeView); + } + + verticalSplitContainer.Dispose(); + verticalSplitContainer = null; + } + + void CreateHorizontalSplitContainer() + { + if (horizontalSplitContainer != null) { + return; + } + + horizontalSplitContainer = new SplitContainer(); + horizontalSplitContainer.SplitterWidth = 2; + horizontalSplitContainer.Orientation = Orientation.Horizontal; + horizontalSplitContainer.Dock = DockStyle.Fill; + } + + void DisposeHorizontalSplitContainer() + { + if (horizontalSplitContainer == null) { + return; + } + + if (listView != null && horizontalSplitContainer.Panel1.Controls.Contains(listView)) { + horizontalSplitContainer.Panel1.Controls.Remove(listView); + } + + if (textEditorControl != null && horizontalSplitContainer.Panel2.Controls.Contains(textEditorControl)) { + horizontalSplitContainer.Panel2.Controls.Remove(textEditorControl); + } + + if (verticalSplitContainer != null && verticalSplitContainer.Panel2.Controls.Contains(horizontalSplitContainer)) { + verticalSplitContainer.Panel2.Controls.Remove(horizontalSplitContainer); + } + + horizontalSplitContainer.Dispose(); + horizontalSplitContainer = null; + } + + void CreateTextEditor() + { + if (textEditorControl != null) { + return; + } + + textEditorControl = new TextEditorControl(); + textEditorControl.Dock = DockStyle.Fill; + textEditorControl.Document.ReadOnly = true; + textEditorControl.TextEditorProperties = new SharpDevelopTextEditorProperties(); + textEditorControl.ActiveTextAreaControl.TextArea.DoubleClick += TextEditorControlDoubleClick; + } + + void DisposeTextEditor() + { + if (textEditorControl == null) { + return; + } + + if (verticalSplitContainer.Panel2.Controls.Contains(textEditorControl)) { + verticalSplitContainer.Panel2.Controls.Remove(textEditorControl); + } + + if (horizontalSplitContainer != null && horizontalSplitContainer.Panel2.Controls.Contains(textEditorControl)) { + horizontalSplitContainer.Panel2.Controls.Remove(textEditorControl); + } + + textEditorControl.ActiveTextAreaControl.TextArea.DoubleClick -= TextEditorControlDoubleClick; + textEditorControl.Dispose(); + textEditorControl = null; + } + + void TextEditorControlDoubleClick(object sender, EventArgs e) + { + string fileName = textEditorControl.FileName; + if (fileName != null) { + Caret caret = textEditorControl.ActiveTextAreaControl.Caret; + FileService.JumpToFilePosition(fileName, caret.Line, caret.Column); + } + } + + /// + /// If the treeview is to be moved to a different parent then + /// it needs to be recreated otherwise the OnBeforeExpand method + /// is never called. + /// + void OnShowVisitCountPanelChanged() + { + if ((showVisitCountPanel && !showSourceCodePanel) || + (!showVisitCountPanel && !showSourceCodePanel)) { + // Tree view will be moved to a different parent. + DisposeTreeView(); + } + } + + void OnShowSourceCodePanelChanged() + { + if ((showSourceCodePanel && !showVisitCountPanel) || + (!showSourceCodePanel && !showVisitCountPanel)) { + // Tree view will be moved to a different parent. + DisposeTreeView(); + } + } } } diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageOptions.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageOptions.cs index 256812c817..84f12ec5b7 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageOptions.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageOptions.cs @@ -22,6 +22,8 @@ namespace ICSharpCode.CodeCoverage public static readonly string NotVisitedForeColorProperty = "NotVisitedForeColor"; public static readonly string NCoverFileNameProperty = "NCoverFileName"; public static readonly string CodeCoverageHighlightedProperty = "CodeCoverageHighlighted"; + public static readonly string ShowSourceCodePanelProperty = "ShowSourceCodePanel"; + public static readonly string ShowVisitCountPanelProperty = "ShowVisitCountPanel"; #endregion static Properties properties; @@ -60,6 +62,30 @@ namespace ICSharpCode.CodeCoverage Properties.Set(CodeCoverageHighlightedProperty, value); } } + + /// + /// Shows/hides the source code panel in the code coverage pad. + /// + public static bool ShowSourceCodePanel { + get { + return Properties.Get(ShowSourceCodePanelProperty, false); + } + set { + Properties.Set(ShowSourceCodePanelProperty, value); + } + } + + /// + /// Shows/hides the visit count panel in the code coverage pad. + /// + public static bool ShowVisitCountPanel { + get { + return Properties.Get(ShowVisitCountPanelProperty, true); + } + set { + Properties.Set(ShowVisitCountPanelProperty, value); + } + } /// /// Gets the colour that will be used when highlighting visited code. diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoveragePad.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoveragePad.cs index 81390de988..334d0b651e 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoveragePad.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoveragePad.cs @@ -7,6 +7,7 @@ using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.TextEditor; using System; using System.Collections.Generic; using System.Windows.Forms; @@ -24,13 +25,13 @@ namespace ICSharpCode.CodeCoverage instance = this; codeCoverageControl = new CodeCoverageControl(); - if (CodeCoverageService.Results != null) { - codeCoverageControl.AddModules(CodeCoverageService.Results.Modules); - } codeCoverageControl.UpdateToolbar(); ProjectService.SolutionClosed += SolutionClosed; ProjectService.SolutionLoaded += SolutionLoaded; + + ShowSourceCodePanel = CodeCoverageOptions.ShowSourceCodePanel; + ShowVisitCountPanel = CodeCoverageOptions.ShowVisitCountPanel; } public static CodeCoveragePad Instance { @@ -76,6 +77,24 @@ namespace ICSharpCode.CodeCoverage codeCoverageControl.Clear(); } + public bool ShowSourceCodePanel { + get { + return codeCoverageControl.ShowSourceCodePanel; + } + set { + codeCoverageControl.ShowSourceCodePanel = value; + } + } + + public bool ShowVisitCountPanel { + get { + return codeCoverageControl.ShowVisitCountPanel; + } + set { + codeCoverageControl.ShowVisitCountPanel = value; + } + } + void SolutionLoaded(object sender, EventArgs e) { codeCoverageControl.UpdateToolbar(); @@ -83,6 +102,7 @@ namespace ICSharpCode.CodeCoverage void SolutionClosed(object sender, EventArgs e) { + ClearCodeCoverageResults(); codeCoverageControl.UpdateToolbar(); } } diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageService.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageService.cs index 2808e7e261..81f0eaa3ac 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageService.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/CodeCoverageService.cs @@ -9,6 +9,7 @@ using ICSharpCode.Core; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextEditor; using System; using System.Collections.Generic; @@ -103,6 +104,15 @@ namespace ICSharpCode.CodeCoverage } } + public static void ShowCodeCoverage(TextEditorControl textEditor, string fileName) + { + List sequencePoints = results.GetSequencePoints(fileName); + if (sequencePoints.Count > 0) { + codeCoverageHighlighter.AddMarkers(textEditor.Document.MarkerStrategy, sequencePoints); + textEditor.Refresh(); + } + } + static void ShowCodeCoverage() { // Highlight any open files. @@ -131,13 +141,9 @@ namespace ICSharpCode.CodeCoverage static void ShowCodeCoverage(IViewContent view) { - TextEditorDisplayBindingWrapper textEditor = view as TextEditorDisplayBindingWrapper; - if (textEditor != null && view.FileName != null) { - List sequencePoints = results.GetSequencePoints(view.FileName); - if (sequencePoints.Count > 0) { - codeCoverageHighlighter.AddMarkers(textEditor.textAreaControl.Document.MarkerStrategy, sequencePoints); - textEditor.textAreaControl.Refresh(); - } + TextEditorDisplayBindingWrapper displayBindingWrapper = view as TextEditorDisplayBindingWrapper; + if (displayBindingWrapper != null && displayBindingWrapper.TextEditorControl != null && view.FileName != null) { + ShowCodeCoverage(displayBindingWrapper.TextEditorControl, view.FileName); } } diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs new file mode 100644 index 0000000000..afdbaefd26 --- /dev/null +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs @@ -0,0 +1,41 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; +using System; +using System.Windows.Forms; + +namespace ICSharpCode.CodeCoverage +{ + public class ShowDisplayOptionsDropDown : AbstractMenuCommand + { + ToolBarDropDownButton dropDownButton; + + public override void Run() + { + } + + protected override void OnOwnerChanged(EventArgs e) + { + base.OnOwnerChanged(e); + dropDownButton = (ToolBarDropDownButton)Owner; + GenerateDropDownItems(); + } + + void GenerateDropDownItems() + { + ToolStripItem[] items = (ToolStripItem[])(AddInTree.GetTreeNode("/SharpDevelop/Pads/CodeCoveragePad/Toolbar/CodeCoveragePadDisplayOptions").BuildChildItems(this)).ToArray(typeof(ToolStripItem)); + foreach (ToolStripItem item in items) { + if (item is IStatusUpdate) { + ((IStatusUpdate)item).UpdateStatus(); + } + } + dropDownButton.DropDownItems.AddRange(items); + } + } +} diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/ShowSourceCodeCommand.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowSourceCodeCommand.cs new file mode 100644 index 0000000000..7999f83953 --- /dev/null +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowSourceCodeCommand.cs @@ -0,0 +1,29 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; +using System; + +namespace ICSharpCode.CodeCoverage +{ + public class ShowSourceCodeCommand : AbstractCheckableMenuCommand + { + public override bool IsChecked { + get { + return CodeCoverageOptions.ShowSourceCodePanel; + } + set { + CodeCoverageOptions.ShowSourceCodePanel = value; + CodeCoveragePad pad = CodeCoveragePad.Instance; + if (pad != null) { + pad.ShowSourceCodePanel = value; + } + } + } + } +} diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/ShowVisitCountCommand.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowVisitCountCommand.cs new file mode 100644 index 0000000000..d9ea8f5166 --- /dev/null +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowVisitCountCommand.cs @@ -0,0 +1,29 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; +using System; + +namespace ICSharpCode.CodeCoverage +{ + public class ShowVisitCountCommand : AbstractCheckableMenuCommand + { + public override bool IsChecked { + get { + return CodeCoverageOptions.ShowVisitCountPanel; + } + set { + CodeCoverageOptions.ShowVisitCountPanel = value; + CodeCoveragePad pad = CodeCoveragePad.Instance; + if (pad != null) { + pad.ShowVisitCountPanel = value; + } + } + } + } +}