From 49b9f18bb16d37104bb44563d4a416ede0105da0 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 26 Nov 2005 21:54:09 +0000 Subject: [PATCH] Check dependencies when enabling/disabling AddIns. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@807 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../BitmapResources-data/Icons.16x16.OK.png | Bin 0 -> 958 bytes .../image/BitmapResources/BitmapResources.res | 1 + .../Project/Boo.Interpreter.addin | 9 +- .../Project/InteractiveInterpreterControl.boo | 6 +- .../Project/InterpreterWrapper.boo | 5 +- .../Boo/BooBinding/Project/BooBinding.addin | 4 +- .../ILAsmBinding/Project/ILAsmBinding.addin | 4 +- .../VBNetBinding/Project/VBNetBinding.addin | 2 +- .../Project/Configuration/AssemblyInfo.cs | 1 - .../AddInManager/Project/Src/AddInControl.cs | 20 +- .../Misc/AddInManager/Project/Src/Commands.cs | 12 +- .../AddInManager/Project/Src/ManagerForm.cs | 254 ++++++++++++++++-- .../Misc/AddinScout/Project/AddInScout.addin | 7 +- .../Project/FiletypeRegisterer.addin | 9 +- .../Project/HighlightingEditor.addin | 9 +- .../Misc/HtmlHelp2/Project/HtmlHelp2.addin | 3 +- .../Misc/MbUnitPad/Project/MbUnitPad.addin | 2 +- .../Misc/RegExpTk/Project/RegExpTk.addin | 6 +- .../Misc/StartPage/Project/StartPage.addin | 2 +- .../Project/Src/Gui/FormLocationHelper.cs | 12 +- .../Core/Project/Src/AddInTree/AddIn/AddIn.cs | 10 +- .../Src/AddInTree/AddIn/AddInReference.cs | 33 ++- .../Project/Src/AddInTree/AddInManager.cs | 12 +- .../Resources/BitmapResources.resources | Bin 534374 -> 534844 bytes 24 files changed, 336 insertions(+), 87 deletions(-) create mode 100644 data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OK.png diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OK.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OK.png new file mode 100644 index 0000000000000000000000000000000000000000..4d06e30f2d01cb9a6da8bf909ca2375447c01ed5 GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJdx@v7EBjS$DNzl>3$}T8fkK=G z9+AZi3~~oSnDKCC2uK}Ex}&cn1H;CC?mvmF3=GT+0X`wF3=It>B_#~!fbyeYGz3Om z2%PbAEeCp_ZTV;>SpPKLeSII&t;ucLK6T+DLA|U literal 0 HcmV?d00001 diff --git a/data/resources/image/BitmapResources/BitmapResources.res b/data/resources/image/BitmapResources/BitmapResources.res index e41345fe57..080bc68d8e 100644 --- a/data/resources/image/BitmapResources/BitmapResources.res +++ b/data/resources/image/BitmapResources/BitmapResources.res @@ -56,6 +56,7 @@ Icons.16x16.ClosedResourceFolder = ProjectBrowserIcons\Property Icons.16x16.ArrowLeftRight = BitmapResources-data\Icons.16x16.ArrowLeftRight.png Icons.16x16.ArrowDown = BitmapResources-data\Icons.16x16.ArrowDown.png Icons.16x16.ArrowUp = BitmapResources-data\Icons.16x16.ArrowUp.png +Icons.16x16.OK = BitmapResources-data\Icons.16x16.OK.png Icons.16x16.Debug.Start = DebuggerIcons\Icons.16x16.Debug.Start.png Icons.16x16.Debug.StartWithoutDebugging = DebuggerIcons\Icons.16x16.Debug.StartWithoutDebugging.png diff --git a/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.Interpreter.addin b/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.Interpreter.addin index 9aace14733..6215b9a41d 100644 --- a/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.Interpreter.addin +++ b/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.Interpreter.addin @@ -1,9 +1,12 @@ - + description = "Interactive interpreter for boo"> + + + + diff --git a/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InteractiveInterpreterControl.boo b/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InteractiveInterpreterControl.boo index 4196576841..40042d973f 100644 --- a/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InteractiveInterpreterControl.boo +++ b/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InteractiveInterpreterControl.boo @@ -121,7 +121,7 @@ class InteractiveInterpreterControl(TextEditorControl): private def SingleLineInputState(): code = ConsumeCurrentLine() - if code[-1:] in ":", "\\": + if code[-1:] in (":", "\\"): _state = InputState.Block _block.GetStringBuilder().Length = 0 _block.WriteLine(code) @@ -218,7 +218,7 @@ class InteractiveInterpreterControl(TextEditorControl): CtrlSpaceComplete() return true - if key in Keys.Home, Keys.Shift|Keys.Home, Keys.Control|Keys.Home: + if key in (Keys.Home, Keys.Shift|Keys.Home, Keys.Control|Keys.Home): MoveCaretToOffset(GetLastLineSegment().Offset + 4) return true @@ -226,7 +226,7 @@ class InteractiveInterpreterControl(TextEditorControl): ClearLine() return true - if key in Keys.Back, Keys.Left: + if key in (Keys.Back, Keys.Left): if self.CaretColumn < 5: return true else: diff --git a/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterWrapper.boo b/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterWrapper.boo index 72d55b13fa..d9550ca13d 100644 --- a/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterWrapper.boo +++ b/src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterWrapper.boo @@ -17,11 +17,14 @@ class InterpreterWrapper: _interpreter = Boo.Lang.Interpreter.InteractiveInterpreter( RememberLastValue: true, Print: self.OnPrintLine) - _interpreter.SetValue("cls", { Cleared() }) + _interpreter.SetValue("cls", RaiseClear) event LinePrinted as callable(string) event Cleared as MethodInvoker + private def RaiseClear(): + Cleared() + private def OnPrintLine(text as string): LinePrinted(text) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin index cd7fb1d54d..f1fbb649e6 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin @@ -1,8 +1,8 @@ - + description = "Backing binding for Boo"> diff --git a/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.addin b/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.addin index b5d65ad8ba..dd57bc6392 100644 --- a/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.addin +++ b/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.addin @@ -1,8 +1,8 @@ - + description = "Backing binding for IL Assembler"> diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.addin b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.addin index 851261b4ad..36b92c5159 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.addin +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.addin @@ -2,7 +2,7 @@ author = "Mike Krueger, Markus Palme" copyright = "GPL" url = "http://www.icsharpcode.net" - description = "SharpDevelop VB.NET language binding"> + description = "Backing binding for VB.NET"> diff --git a/src/AddIns/Misc/AddInManager/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/AddInManager/Project/Configuration/AssemblyInfo.cs index 233d442aae..8bc8c6c94b 100644 --- a/src/AddIns/Misc/AddInManager/Project/Configuration/AssemblyInfo.cs +++ b/src/AddIns/Misc/AddInManager/Project/Configuration/AssemblyInfo.cs @@ -31,4 +31,3 @@ using System.Runtime.CompilerServices; // numbers with the '*' character (the default): [assembly: AssemblyVersion("2.0.0.1")] - diff --git a/src/AddIns/Misc/AddInManager/Project/Src/AddInControl.cs b/src/AddIns/Misc/AddInManager/Project/Src/AddInControl.cs index a4f7bd3f1c..99701f7fef 100644 --- a/src/AddIns/Misc/AddInManager/Project/Src/AddInControl.cs +++ b/src/AddIns/Misc/AddInManager/Project/Src/AddInControl.cs @@ -1,9 +1,9 @@ -/* - * Created by SharpDevelop. - * User: Daniel Grunwald - * Date: 26.11.2005 - * Time: 15:54 - */ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// using System; using System.ComponentModel; @@ -14,9 +14,6 @@ using ICSharpCode.Core; namespace ICSharpCode.AddInManager { - /// - /// Description of AddInControl. - /// public class AddInControl : Control { AddIn addIn; @@ -34,6 +31,7 @@ namespace ICSharpCode.AddInManager this.Size = new Size(100, 40); this.SetStyle(ControlStyles.Selectable, true); this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); } @@ -65,8 +63,8 @@ namespace ICSharpCode.AddInManager bounds.Offset(1, 1); bounds.Inflate(-2, -2); Brush gradient = new LinearGradientBrush(bounds, - selected ? SystemColors.ControlLight : SystemColors.ControlLightLight, - selected ? SystemColors.Highlight : SystemColors.ControlDark, + selected ? SystemColors.Control : SystemColors.ControlLightLight, + selected ? SystemColors.Highlight : SystemColors.ControlDark, LinearGradientMode.ForwardDiagonal); GraphicsPath path = new GraphicsPath(); diff --git a/src/AddIns/Misc/AddInManager/Project/Src/Commands.cs b/src/AddIns/Misc/AddInManager/Project/Src/Commands.cs index 3df4433038..f77e8f9986 100644 --- a/src/AddIns/Misc/AddInManager/Project/Src/Commands.cs +++ b/src/AddIns/Misc/AddInManager/Project/Src/Commands.cs @@ -1,9 +1,9 @@ -/* - * Created by SharpDevelop. - * User: Daniel Grunwald - * Date: 26.11.2005 - * Time: 14:53 - */ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// using System; using ICSharpCode.Core; diff --git a/src/AddIns/Misc/AddInManager/Project/Src/ManagerForm.cs b/src/AddIns/Misc/AddInManager/Project/Src/ManagerForm.cs index 0387e41d50..d297f1ecc7 100644 --- a/src/AddIns/Misc/AddInManager/Project/Src/ManagerForm.cs +++ b/src/AddIns/Misc/AddInManager/Project/Src/ManagerForm.cs @@ -1,9 +1,9 @@ -/* - * Created by SharpDevelop. - * User: Daniel Grunwald - * Date: 26.11.2005 - * Time: 14:53 - */ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// using System; using System.Collections.Generic; @@ -47,7 +47,11 @@ namespace ICSharpCode.AddInManager int index = 0; AddInControl ctl; - foreach (AddIn addIn in AddInTree.AddIns) { + List addInList = new List(AddInTree.AddIns); + addInList.Sort(delegate(AddIn a, AddIn b) { + return a.Name.CompareTo(b.Name); + }); + foreach (AddIn addIn in addInList) { string identity = addIn.Manifest.PrimaryIdentity; if (identity == null || identity == "SharpDevelop") // || identity == "ICSharpCode.AddInManager" continue; @@ -61,7 +65,40 @@ namespace ICSharpCode.AddInManager while (stack.Count > 0) { splitContainer.Panel1.Controls.Add(stack.Pop()); } + ShowPreinstalledAddInsCheckBoxCheckedChanged(null, null); splitContainer.Panel2Collapsed = true; + splitContainer.Panel1.Paint += delegate(object sender, PaintEventArgs e) { + if (visibleAddInCount == 0) { + Rectangle rect = splitContainer.Panel1.ClientRectangle; + rect.Offset(16, 16); + rect.Inflate(-32, -32); + e.Graphics.DrawString("You don't have any AddIns installed.\n" + + "Download an AddIn from the Internet, then click 'Install AddIn' and " + + "choose the downloaded file to install it.", + Font, SystemBrushes.ControlText, rect); + } + }; + } + + int visibleAddInCount = 0; + + void ShowPreinstalledAddInsCheckBoxCheckedChanged(object sender, EventArgs e) + { + visibleAddInCount = 0; + foreach (AddInControl ctl in splitContainer.Panel1.Controls) { + if (showPreinstalledAddInsCheckBox.Checked) { + ctl.Visible = true; + } else { + if (ctl.Selected) + ctl.Selected = false; + if (ctl == oldFocus) + oldFocus = null; + ctl.Visible = !FileUtility.IsBaseDirectory(FileUtility.ApplicationRootPath, ctl.AddIn.FileName); + } + if (ctl.Visible) + visibleAddInCount += 1; + } + UpdateActionBox(); } void OnControlClick(object sender, EventArgs e) @@ -83,6 +120,7 @@ namespace ICSharpCode.AddInManager if ((ModifierKeys & Keys.Shift) == Keys.Shift && sender != oldFocus) { bool sel = false; foreach (AddInControl ctl in splitContainer.Panel1.Controls) { + if (!ctl.Visible) continue; if (ctl == sender || ctl == oldFocus) { sel = !sel; ctl.Selected = true; @@ -128,23 +166,34 @@ namespace ICSharpCode.AddInManager bool allEnabled = true; bool allDisabled = true; + bool allUninstallable = true; foreach (AddIn addIn in selected) { allEnabled &= addIn.Action == AddInAction.Enable; allDisabled &= addIn.Action == AddInAction.Disable; + if (allUninstallable) { + if (FileUtility.IsBaseDirectory(FileUtility.ApplicationRootPath, addIn.FileName)) { + allUninstallable = false; + } + } } if (allEnabled) { selectedAction = AddInAction.Disable; actionGroupBox.Text = runActionButton.Text = "Disable"; actionDescription.Text = "Disables the selected AddIns."; - ShowDependencies(selected, false); - uninstallButton.Enabled = runActionButton.Enabled = !dependencyTable.Visible; + runActionButton.Enabled = ShowDependencies(selected, false); + if (dependencyTable.Visible) { + actionDescription.Text += "\nThese AddIns are used by:"; + } + uninstallButton.Enabled = allUninstallable && runActionButton.Enabled; } else if (allDisabled) { selectedAction = AddInAction.Enable; actionGroupBox.Text = runActionButton.Text = "Enable"; actionDescription.Text = "Enables the selected AddIns."; - ShowDependencies(selected, true); - runActionButton.Enabled = !dependencyTable.Visible; - uninstallButton.Enabled = true; + runActionButton.Enabled = ShowDependencies(selected, true); + if (dependencyTable.Visible) { + actionDescription.Text += "\nRequired dependencies:"; + } + uninstallButton.Enabled = allUninstallable; } else { actionGroupBox.Text = ""; actionDescription.Text = "AddIns with multiple states are selected"; @@ -155,9 +204,106 @@ namespace ICSharpCode.AddInManager ignoreFocusChange = false; } - void ShowDependencies(List addIns, bool enable) + bool ShowDependencies(List addIns, bool enable) { + List dependencies = new List(); // only used with enable=true + List> dependenciesToSel = new List>(); + Dictionary addInDict = new Dictionary(); + Dictionary modifiedAddIns = new Dictionary(); + + // add available addins + foreach (AddIn addIn in AddInTree.AddIns) { + if (addIn.Action != AddInAction.Enable && addIn.Action != AddInAction.Install) + continue; + if (addIns.Contains(addIn)) + continue; + foreach (KeyValuePair pair in addIn.Manifest.Identities) { + addInDict[pair.Key] = pair.Value; + } + } + + // create list of modified addin names + foreach (AddIn addIn in addIns) { + foreach (KeyValuePair pair in addIn.Manifest.Identities) { + modifiedAddIns[pair.Key] = pair.Value; + } + } + + // add new addins + if (enable) { + foreach (AddIn addIn in addIns) { + foreach (KeyValuePair pair in addIn.Manifest.Identities) { + addInDict[pair.Key] = pair.Value; + } + foreach (AddInReference dep in addIn.Manifest.Dependencies) { + if (!dependencies.Contains(dep)) + dependencies.Add(dep); + } + } + } + + // add dependencies to the to-be-changed addins + foreach (AddIn addIn in AddInTree.AddIns) { + if (addIn.Action != AddInAction.Enable && addIn.Action != AddInAction.Install) + continue; + if (addIns.Contains(addIn)) + continue; + foreach (AddInReference dep in addIn.Manifest.Dependencies) { + if (modifiedAddIns.ContainsKey(dep.Name)) { + dependenciesToSel.Add(new KeyValuePair(addIn, dep)); + } + } + } + foreach (Control ctl in dependencyTable.Controls) { + ctl.Dispose(); + } + dependencyTable.Controls.Clear(); + bool allDepenciesOK = true; + if (dependencies.Count > 0 || dependenciesToSel.Count > 0) { + dependencyTable.RowCount = dependencies.Count + dependenciesToSel.Count; + while (dependencyTable.RowStyles.Count < dependencyTable.RowCount) { + dependencyTable.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + } + int rowIndex = 0; + foreach (AddInReference dep in dependencies) { + if (!AddDependencyRow(addInDict, dep, rowIndex++, null)) + allDepenciesOK = false; + } + foreach (KeyValuePair pair in dependenciesToSel) { + if (!AddDependencyRow(addInDict, pair.Value, rowIndex++, pair.Key.Name)) + allDepenciesOK = false; + } + dependencyTable.Visible = true; + } + return allDepenciesOK; + } + + bool AddDependencyRow(Dictionary addInDict, AddInReference dep, int rowIndex, string requiredByName) + { + string text = requiredByName ?? GetDisplayName(dep.Name); + Version versionFound; + Label label = new Label(); + label.AutoSize = true; + label.Text = text; + PictureBox box = new PictureBox(); + box.BorderStyle = BorderStyle.None; + box.Size = new Size(16, 16); + bool isOK = dep.Check(addInDict, out versionFound); + box.SizeMode = PictureBoxSizeMode.CenterImage; + box.Image = isOK ? ResourceService.GetBitmap("Icons.16x16.OK") : ResourceService.GetBitmap("Icons.16x16.DeleteIcon"); + dependencyTable.Controls.Add(label, 1, rowIndex); + dependencyTable.Controls.Add(box, 0, rowIndex); + return isOK; + } + + string GetDisplayName(string identity) + { + foreach (AddIn addIn in AddInTree.AddIns) { + if (addIn.Manifest.Identities.ContainsKey(identity)) + return addIn.Name; + } + return identity; } void CloseButtonClick(object sender, EventArgs e) @@ -178,6 +324,20 @@ namespace ICSharpCode.AddInManager UpdateActionBox(); } + void InstallButtonClick(object sender, EventArgs e) + { + using (OpenFileDialog dlg = new OpenFileDialog()) { + dlg.Filter = "SharpDevelop AddIns|*.addin;*.sdaddin|All files|*.*"; + dlg.Multiselect = true; + if (dlg.ShowDialog() == DialogResult.OK) { + MessageService.ShowMessage("Not implemented."); + //foreach (string file in dlg.FileNames) { + // + //} + } + } + } + protected override void OnClosed(EventArgs e) { base.OnClosed(e); @@ -196,11 +356,14 @@ namespace ICSharpCode.AddInManager this.bottomPanel = new System.Windows.Forms.Panel(); this.installButton = new System.Windows.Forms.Button(); this.closeButton = new System.Windows.Forms.Button(); + this.showPreinstalledAddInsCheckBox = new System.Windows.Forms.CheckBox(); this.splitContainer = new System.Windows.Forms.SplitContainer(); this.actionGroupBox = new System.Windows.Forms.GroupBox(); this.actionFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); this.actionDescription = new System.Windows.Forms.Label(); this.dependencyTable = new System.Windows.Forms.TableLayoutPanel(); + this.dummyLabel1 = new System.Windows.Forms.Label(); + this.dummyLabel2 = new System.Windows.Forms.Label(); this.runActionButton = new System.Windows.Forms.Button(); this.uninstallButton = new System.Windows.Forms.Button(); this.bottomPanel.SuspendLayout(); @@ -208,6 +371,7 @@ namespace ICSharpCode.AddInManager this.splitContainer.SuspendLayout(); this.actionGroupBox.SuspendLayout(); this.actionFlowLayoutPanel.SuspendLayout(); + this.dependencyTable.SuspendLayout(); this.SuspendLayout(); // // topPanel @@ -217,11 +381,13 @@ namespace ICSharpCode.AddInManager this.topPanel.Name = "topPanel"; this.topPanel.Size = new System.Drawing.Size(460, 33); this.topPanel.TabIndex = 0; + this.topPanel.Visible = false; // // bottomPanel // this.bottomPanel.Controls.Add(this.installButton); this.bottomPanel.Controls.Add(this.closeButton); + this.bottomPanel.Controls.Add(this.showPreinstalledAddInsCheckBox); this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom; this.bottomPanel.Location = new System.Drawing.Point(0, 355); this.bottomPanel.Name = "bottomPanel"; @@ -234,10 +400,11 @@ namespace ICSharpCode.AddInManager this.installButton.Location = new System.Drawing.Point(274, 6); this.installButton.Name = "installButton"; this.installButton.Size = new System.Drawing.Size(93, 23); - this.installButton.TabIndex = 0; + this.installButton.TabIndex = 1; this.installButton.Text = "Install AddIn"; this.installButton.UseCompatibleTextRendering = true; this.installButton.UseVisualStyleBackColor = true; + this.installButton.Click += new System.EventHandler(this.InstallButtonClick); // // closeButton // @@ -245,12 +412,23 @@ namespace ICSharpCode.AddInManager this.closeButton.Location = new System.Drawing.Point(373, 6); this.closeButton.Name = "closeButton"; this.closeButton.Size = new System.Drawing.Size(75, 23); - this.closeButton.TabIndex = 1; + this.closeButton.TabIndex = 2; this.closeButton.Text = "Close"; this.closeButton.UseCompatibleTextRendering = true; this.closeButton.UseVisualStyleBackColor = true; this.closeButton.Click += new System.EventHandler(this.CloseButtonClick); // + // showPreinstalledAddInsCheckBox + // + this.showPreinstalledAddInsCheckBox.Location = new System.Drawing.Point(3, 6); + this.showPreinstalledAddInsCheckBox.Name = "showPreinstalledAddInsCheckBox"; + this.showPreinstalledAddInsCheckBox.Size = new System.Drawing.Size(169, 24); + this.showPreinstalledAddInsCheckBox.TabIndex = 0; + this.showPreinstalledAddInsCheckBox.Text = "Show preinstalled AddIns"; + this.showPreinstalledAddInsCheckBox.UseCompatibleTextRendering = true; + this.showPreinstalledAddInsCheckBox.UseVisualStyleBackColor = true; + this.showPreinstalledAddInsCheckBox.CheckedChanged += new System.EventHandler(this.ShowPreinstalledAddInsCheckBoxCheckedChanged); + // // splitContainer // this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; @@ -269,7 +447,7 @@ namespace ICSharpCode.AddInManager this.splitContainer.Panel2.Controls.Add(this.actionGroupBox); this.splitContainer.Panel2MinSize = 100; this.splitContainer.Size = new System.Drawing.Size(460, 322); - this.splitContainer.SplitterDistance = 310; + this.splitContainer.SplitterDistance = 248; this.splitContainer.TabIndex = 1; // // actionGroupBox @@ -278,7 +456,7 @@ namespace ICSharpCode.AddInManager this.actionGroupBox.Dock = System.Windows.Forms.DockStyle.Fill; this.actionGroupBox.Location = new System.Drawing.Point(0, 0); this.actionGroupBox.Name = "actionGroupBox"; - this.actionGroupBox.Size = new System.Drawing.Size(146, 322); + this.actionGroupBox.Size = new System.Drawing.Size(208, 322); this.actionGroupBox.TabIndex = 0; this.actionGroupBox.TabStop = false; this.actionGroupBox.Text = "actionGroupBox"; @@ -295,7 +473,7 @@ namespace ICSharpCode.AddInManager this.actionFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; this.actionFlowLayoutPanel.Location = new System.Drawing.Point(3, 17); this.actionFlowLayoutPanel.Name = "actionFlowLayoutPanel"; - this.actionFlowLayoutPanel.Size = new System.Drawing.Size(140, 302); + this.actionFlowLayoutPanel.Size = new System.Drawing.Size(202, 302); this.actionFlowLayoutPanel.TabIndex = 0; this.actionFlowLayoutPanel.WrapContents = false; // @@ -311,21 +489,44 @@ namespace ICSharpCode.AddInManager // // dependencyTable // + this.dependencyTable.AutoSize = true; this.dependencyTable.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.dependencyTable.ColumnCount = 2; - this.dependencyTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.dependencyTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.dependencyTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.dependencyTable.Controls.Add(this.dummyLabel1, 1, 0); + this.dependencyTable.Controls.Add(this.dummyLabel2, 1, 1); this.dependencyTable.Location = new System.Drawing.Point(3, 21); this.dependencyTable.Name = "dependencyTable"; this.dependencyTable.RowCount = 2; - this.dependencyTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.dependencyTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.dependencyTable.Size = new System.Drawing.Size(106, 100); + this.dependencyTable.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.dependencyTable.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.dependencyTable.Size = new System.Drawing.Size(55, 36); this.dependencyTable.TabIndex = 1; // + // dummyLabel1 + // + this.dummyLabel1.AutoSize = true; + this.dummyLabel1.Location = new System.Drawing.Point(23, 0); + this.dummyLabel1.Name = "dummyLabel1"; + this.dummyLabel1.Size = new System.Drawing.Size(29, 18); + this.dummyLabel1.TabIndex = 0; + this.dummyLabel1.Text = "dep1"; + this.dummyLabel1.UseCompatibleTextRendering = true; + // + // dummyLabel2 + // + this.dummyLabel2.AutoSize = true; + this.dummyLabel2.Location = new System.Drawing.Point(23, 18); + this.dummyLabel2.Name = "dummyLabel2"; + this.dummyLabel2.Size = new System.Drawing.Size(29, 18); + this.dummyLabel2.TabIndex = 1; + this.dummyLabel2.Text = "dep2"; + this.dummyLabel2.UseCompatibleTextRendering = true; + // // runActionButton // - this.runActionButton.Location = new System.Drawing.Point(3, 127); + this.runActionButton.Location = new System.Drawing.Point(3, 63); this.runActionButton.Name = "runActionButton"; this.runActionButton.Size = new System.Drawing.Size(91, 23); this.runActionButton.TabIndex = 2; @@ -336,7 +537,7 @@ namespace ICSharpCode.AddInManager // // uninstallButton // - this.uninstallButton.Location = new System.Drawing.Point(3, 156); + this.uninstallButton.Location = new System.Drawing.Point(3, 92); this.uninstallButton.Name = "uninstallButton"; this.uninstallButton.Size = new System.Drawing.Size(91, 23); this.uninstallButton.TabIndex = 3; @@ -362,8 +563,13 @@ namespace ICSharpCode.AddInManager this.actionGroupBox.ResumeLayout(false); this.actionFlowLayoutPanel.ResumeLayout(false); this.actionFlowLayoutPanel.PerformLayout(); + this.dependencyTable.ResumeLayout(false); + this.dependencyTable.PerformLayout(); this.ResumeLayout(false); } + private System.Windows.Forms.Label dummyLabel2; + private System.Windows.Forms.Label dummyLabel1; + private System.Windows.Forms.CheckBox showPreinstalledAddInsCheckBox; private System.Windows.Forms.Button installButton; private System.Windows.Forms.Button uninstallButton; private System.Windows.Forms.Button runActionButton; diff --git a/src/AddIns/Misc/AddinScout/Project/AddInScout.addin b/src/AddIns/Misc/AddinScout/Project/AddInScout.addin index 100349d58a..7fe51b6e5b 100644 --- a/src/AddIns/Misc/AddinScout/Project/AddInScout.addin +++ b/src/AddIns/Misc/AddinScout/Project/AddInScout.addin @@ -2,8 +2,11 @@ author = "Satguru P Srivastava" copyright = "GPL" url = "http://home.mchsi.com/~ssatguru" - description = "Display AddIn Information" - version = "0.1.0"> + description = "Display AddIn Information"> + + + + diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin index 62fa7ce273..0de8e79e81 100644 --- a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin @@ -1,9 +1,12 @@ - + description = "Registers files in the Windows Explorer for #Develop"> + + + + diff --git a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin index c8a52cea05..2e600f3072 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin +++ b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin @@ -1,9 +1,12 @@ - + description = "Editor for syntax highlighting styles for the text editor"> + + + + diff --git a/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.addin b/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.addin index 406ae9af06..d53628b5c3 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.addin +++ b/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.addin @@ -2,8 +2,7 @@ author = "Mathias Simmack" copyright = "Copyright (c) 2005" url = "unknown" - description = "integrates Microsoft's Help 2.0 Environment" - version = "2.0.0.3"> + description = "integrates Microsoft's Help 2.0 Environment"> diff --git a/src/AddIns/Misc/MbUnitPad/Project/MbUnitPad.addin b/src/AddIns/Misc/MbUnitPad/Project/MbUnitPad.addin index e47a69bc1a..c20f99ce04 100644 --- a/src/AddIns/Misc/MbUnitPad/Project/MbUnitPad.addin +++ b/src/AddIns/Misc/MbUnitPad/Project/MbUnitPad.addin @@ -2,7 +2,7 @@ author = "Daniel Grunwald" copyright = "GNU General Public License" url = "http://www.icsharpcode.net" - description = "Integrated MbUnit test runner for #Develop"> + description = "Runs MbUnit and NUnit tests inside #Develop"> diff --git a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin index f2d6049026..e9282174bb 100644 --- a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin +++ b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin @@ -1,10 +1,14 @@ - + + + + diff --git a/src/AddIns/Misc/StartPage/Project/StartPage.addin b/src/AddIns/Misc/StartPage/Project/StartPage.addin index 3733822128..08035b5368 100644 --- a/src/AddIns/Misc/StartPage/Project/StartPage.addin +++ b/src/AddIns/Misc/StartPage/Project/StartPage.addin @@ -1,4 +1,4 @@ - +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// using System; using System.Drawing; diff --git a/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs b/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs index 4eb140984d..e6f7abf3f7 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs @@ -12,10 +12,7 @@ using System.Xml; namespace ICSharpCode.Core { - /// - /// Description of AddIn. - /// - public class AddIn + public sealed class AddIn { Properties properties = new Properties(); List runtimes = new List(); @@ -44,6 +41,11 @@ namespace ICSharpCode.Core return null; } + public override string ToString() + { + return "[AddIn: " + Name + "]"; + } + /// /// Action to execute when the application is restarted. /// diff --git a/src/Main/Core/Project/Src/AddInTree/AddIn/AddInReference.cs b/src/Main/Core/Project/Src/AddInTree/AddIn/AddInReference.cs index e26650f063..965763e39c 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddIn/AddInReference.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddIn/AddInReference.cs @@ -15,7 +15,7 @@ namespace ICSharpCode.Core /// /// Represents a versioned reference to an AddIn. Used by . /// - public class AddInReference + public class AddInReference : ICloneable { string name; Version minimumVersion; @@ -37,6 +37,11 @@ namespace ICSharpCode.Core get { return name; } + set { + if (value == null) throw new ArgumentNullException("name"); + if (value.Length == 0) throw new ArgumentException("name cannot be an empty string", "name"); + name = value; + } } /// Returns true when the reference is valid. @@ -117,14 +122,24 @@ namespace ICSharpCode.Core public AddInReference(string name, Version minimumVersion, Version maximumVersion) { - if (name == null) throw new ArgumentNullException("name"); - if (name.Length == 0) throw new ArgumentException("name cannot be an empty string", "name"); + this.Name = name; if (minimumVersion == null) throw new ArgumentNullException("minimumVersion"); if (maximumVersion == null) throw new ArgumentNullException("maximumVersion"); this.minimumVersion = minimumVersion; this.maximumVersion = maximumVersion; - this.name = name; + } + + public override bool Equals(object obj) + { + if (!(obj is AddInReference)) return false; + AddInReference b = (AddInReference)obj; + return name == b.name && minimumVersion == b.minimumVersion && maximumVersion == b.maximumVersion; + } + + public override int GetHashCode() + { + return name.GetHashCode() ^ minimumVersion.GetHashCode() ^ maximumVersion.GetHashCode(); } public override string ToString() @@ -145,5 +160,15 @@ namespace ICSharpCode.Core } } } + + public AddInReference Clone() + { + return new AddInReference(name, minimumVersion, maximumVersion); + } + + object ICloneable.Clone() + { + return Clone(); + } } } diff --git a/src/Main/Core/Project/Src/AddInTree/AddInManager.cs b/src/Main/Core/Project/Src/AddInTree/AddInManager.cs index 9d1952efe5..ef2329ed01 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddInManager.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddInManager.cs @@ -1,9 +1,9 @@ -/* - * Created by SharpDevelop. - * User: Daniel Grunwald - * Date: 26.11.2005 - * Time: 18:27 - */ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// using System; using System.Collections.Generic; diff --git a/src/Main/StartUp/Project/Resources/BitmapResources.resources b/src/Main/StartUp/Project/Resources/BitmapResources.resources index d9a210046946ab31e8a70ac7e8f8f268168c21ab..511748f7cf38009c3a438ba1ca1ef5b09eb347ee 100644 GIT binary patch delta 4355 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 sI9KhZ{d(flFKt@d+OoX0#RW_Bw6