Browse Source

Worked on SD2-1234 - added support for view contents that are not editing a file (e.g. project options).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2365 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
467dcdd3a4
  1. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 58
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs
  3. 2
      src/AddIns/DisplayBindings/WorkflowDesigner/Project/Src/Services/WorkflowSideTabService.cs
  4. 2
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms.TextEditor/SQLTextEditorControl.cs
  5. 2
      src/AddIns/Misc/SubversionAddIn/Project/Src/SvnClient.cs
  6. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  7. 7
      src/Main/Base/Project/Src/Commands/AutostartCommands.cs
  8. 2
      src/Main/Base/Project/Src/Commands/EditCommands.cs
  9. 30
      src/Main/Base/Project/Src/Commands/FileCommands.cs
  10. 2
      src/Main/Base/Project/Src/Commands/FileMenuCommands.cs
  11. 14
      src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs
  12. 4
      src/Main/Base/Project/Src/Commands/HelpCommands.cs
  13. 4
      src/Main/Base/Project/Src/Commands/ToolsCommands.cs
  14. 20
      src/Main/Base/Project/Src/Gui/AbstractViewContent.cs
  15. 16
      src/Main/Base/Project/Src/Gui/AbstractViewContentWithoutFile.cs
  16. 6
      src/Main/Base/Project/Src/Gui/ContentInterfaces/ICustomizedCommands.cs
  17. 2
      src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs
  18. 2
      src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs
  19. 2
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/EditTemplateDialog.cs
  20. 4
      src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs
  21. 2
      src/Main/Base/Project/Src/Gui/Dialogs/TabbedOptions.cs
  22. 2
      src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptions.cs
  23. 2
      src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs
  24. 7
      src/Main/Base/Project/Src/Gui/IViewContent.cs
  25. 17
      src/Main/Base/Project/Src/Gui/IWorkbench.cs
  26. 4
      src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs
  27. 13
      src/Main/Base/Project/Src/Gui/IWorkbenchWindow.cs
  28. 2
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs
  29. 164
      src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs
  30. 13
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs
  31. 38
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs
  32. 92
      src/Main/Base/Project/Src/Gui/Workbench/SingleInstanceHelper.cs
  33. 11
      src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
  34. 12
      src/Main/Base/Project/Src/Services/File/FileService.cs
  35. 4
      src/Main/Base/Project/Src/Services/File/OpenedFile.cs
  36. 2
      src/Main/Base/Project/Src/Services/File/RecentOpen.cs
  37. 6
      src/Main/Base/Project/Src/Services/HelpProvider.cs
  38. 2
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs
  39. 2
      src/Main/Base/Project/Src/TextEditor/Commands/FormatCommands.cs
  40. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AttributesDataProvider.cs
  41. 4
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
  42. 2
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs
  43. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs
  44. 11
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExpressionContext.cs
  45. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/SystemTypes.cs
  46. 2
      src/Main/StartUp/Project/SharpDevelopMain.cs
  47. 22
      src/Tools/Tools.build

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -43,10 +43,10 @@ namespace CSharpBinding @@ -43,10 +43,10 @@ namespace CSharpBinding
context = ExpressionContext.Default;
break;
case "using":
context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.IDisposable", 0), false);
context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.SystemTypes.IDisposable, false);
break;
case "catch":
context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.Exception", 0), false);
context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.SystemTypes.Exception, false);
break;
case "foreach":
case "typeof":

58
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs

@ -96,13 +96,6 @@ namespace ICSharpCode.FormsDesigner @@ -96,13 +96,6 @@ namespace ICSharpCode.FormsDesigner
this.textAreaControlProvider = viewContent as ITextEditorControlProvider;
}
/*public override void SwitchedTo()
{
if (IsFormsDesignerVisible) {
AddSideBars();
}
}*/
void LoadDesigner()
{
LoggingService.Info("Form Designer: BEGIN INITIALIZE");
@ -307,35 +300,27 @@ namespace ICSharpCode.FormsDesigner @@ -307,35 +300,27 @@ namespace ICSharpCode.FormsDesigner
return generator.GetCompatibleMethods(edesc);
}
#warning Code temporarily disabled after IViewContent changes
/*public override void Selected()
/*
protected override void OnViewActivated(EventArgs e)
{
PropertyPad.PropertyValueChanged += PropertyValueChanged;
Reload();
LoggingService.Info("Designer.OnViewActived 1");
base.OnViewActivated(e); // calls Load() if required
LoggingService.Info("Designer.OnViewActived 2");
IsFormsDesignerVisible = true;
AddSideBars();
PropertyPad.PropertyValueChanged += PropertyValueChanged;
SetActiveSideTab();
UpdatePropertyPad();
}*/
public override void Dispose()
{
disposing = true;
base.Dispose();
}
protected override void LoadFromPrimary()
{
Reload();
LoggingService.Info("Designer.OnViewActived 3");
}
*/
protected override void SaveToPrimary()
/*
protected override void OnViewDeactivated(EventArgs e)
{
MergeFormChanges();
}
LoggingService.Info("Designer.OnViewDeactivated");
/*public override void Deselecting()
{
// can happen if form designer is disposed and then deselected
if (!IsFormsDesignerVisible)
return;
@ -360,7 +345,24 @@ namespace ICSharpCode.FormsDesigner @@ -360,7 +345,24 @@ namespace ICSharpCode.FormsDesigner
}
UnloadDesigner();
LoggingService.Info("Unloading form designer finished");
}*/
}
*/
public override void Dispose()
{
disposing = true;
base.Dispose();
}
protected override void LoadFromPrimary()
{
Reload();
}
protected override void SaveToPrimary()
{
MergeFormChanges();
}
void SelectionChangedHandler(object sender, EventArgs args)
{

2
src/AddIns/DisplayBindings/WorkflowDesigner/Project/Src/Services/WorkflowSideTabService.cs

@ -113,7 +113,7 @@ namespace WorkflowDesigner @@ -113,7 +113,7 @@ namespace WorkflowDesigner
}
// Attach the handlers.
viewContent.ViewActivated += ViewContentActivatedEventHandler;
viewContent.SwitchedTo += ViewContentActivatedEventHandler;
viewContent.Disposed += ViewContentDisposedEventHandler;
ViewCount++;

2
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms.TextEditor/SQLTextEditorControl.cs

@ -61,7 +61,7 @@ namespace SharpDbTools.Forms.TextEditor @@ -61,7 +61,7 @@ namespace SharpDbTools.Forms.TextEditor
if (next == '.') {
ICompletionDataProvider completionDataProvider = new TestCodeCompletionProvider(); // TODO: create a simple provider that just returns a couple of strings
codeCompletionWindow =
CodeCompletionWindow.ShowCompletionWindow((Form)WorkbenchSingleton.Workbench,
CodeCompletionWindow.ShowCompletionWindow(WorkbenchSingleton.MainForm,
this, this.FileName, completionDataProvider, next);
if (codeCompletionWindow != null) {
codeCompletionWindow.Closed += new EventHandler(CloseCodeCompletionWindow);

2
src/AddIns/Misc/SubversionAddIn/Project/Src/SvnClient.cs

@ -190,7 +190,7 @@ namespace ICSharpCode.Svn @@ -190,7 +190,7 @@ namespace ICSharpCode.Svn
thread.Name = "SvnOperation";
thread.IsBackground = true;
inOperationForm = new InOperationDialog(operationName, thread);
inOperationForm.Owner = (Form)WorkbenchSingleton.Workbench;
inOperationForm.Owner = WorkbenchSingleton.MainForm;
inOperationForm.Show();
thread.Start();
}

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -65,6 +65,7 @@ @@ -65,6 +65,7 @@
<Compile Include="Src\Gui\Dialogs\SolutionConfiguration\AddNewConfigurationDialog.Designer.cs">
<DependentUpon>AddNewConfigurationDialog.cs</DependentUpon>
</Compile>
<Compile Include="Src\Gui\Workbench\SingleInstanceHelper.cs" />
<Compile Include="Src\Internal\ExternalTool\ExternalTool.cs" />
<Compile Include="Src\Internal\Templates\CodeTemplate.cs" />
<Compile Include="Src\Internal\Templates\Project\ProjectTemplate.cs" />

7
src/Main/Base/Project/Src/Commands/AutostartCommands.cs

@ -77,8 +77,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -77,8 +77,7 @@ namespace ICSharpCode.SharpDevelop.Commands
public void Run(IList<string> fileList)
{
Form f = (Form)WorkbenchSingleton.Workbench;
f.Show();
//WorkbenchSingleton.MainForm.Show();
bool didLoadCombineOrFile = false;
@ -110,13 +109,13 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -110,13 +109,13 @@ namespace ICSharpCode.SharpDevelop.Commands
}
}
f.Focus(); // windows.forms focus workaround
//WorkbenchSingleton.MainForm.Focus(); // windows.forms focus workaround
ParserService.StartParserThread();
// finally run the workbench window ...
Application.AddMessageFilter(new FormKeyHandler());
Application.Run(f);
Application.Run(WorkbenchSingleton.MainForm);
// save the workbench memento in the ide properties
try {

2
src/Main/Base/Project/Src/Commands/EditCommands.cs

@ -214,7 +214,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -214,7 +214,7 @@ namespace ICSharpCode.SharpDevelop.Commands
public override void Run()
{
using (WordCountDialog wcd = new WordCountDialog()) {
wcd.Owner = (Form)WorkbenchSingleton.Workbench;
wcd.Owner = WorkbenchSingleton.MainForm;
wcd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
}
}

30
src/Main/Base/Project/Src/Commands/FileCommands.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -34,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Commands
}
}
using (NewFileDialog nfd = new NewFileDialog(null)) {
nfd.Owner = (Form)WorkbenchSingleton.Workbench;
nfd.Owner = WorkbenchSingleton.MainForm;
nfd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
}
}
@ -54,8 +54,17 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -54,8 +54,17 @@ namespace ICSharpCode.SharpDevelop.Commands
{
public override void Run()
{
IViewContent content = WorkbenchSingleton.Workbench.ActiveViewContent;
Save(WorkbenchSingleton.Workbench.ActiveViewContent);
}
internal static void Save(IViewContent content)
{
if (content != null) {
if (content is ICustomizedCommands) {
if (((ICustomizedCommands)content).SaveCommand()) {
return;
}
}
if (content.IsViewOnly) {
return;
}
@ -111,14 +120,18 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -111,14 +120,18 @@ namespace ICSharpCode.SharpDevelop.Commands
{
public override void Run()
{
// save the primary file only
IViewContent content = WorkbenchSingleton.Workbench.ActiveViewContent;
Save(WorkbenchSingleton.Workbench.ActiveViewContent);
}
internal static void Save(IViewContent content)
{
if (content != null && !content.IsViewOnly) {
if (content is ICustomizedCommands) {
if (((ICustomizedCommands)content).SaveAsCommand()) {
return;
}
}
// save the primary file only
if (content.PrimaryFile != null) {
Save(content.PrimaryFile);
}
@ -160,6 +173,11 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -160,6 +173,11 @@ namespace ICSharpCode.SharpDevelop.Commands
{
public static void SaveAll()
{
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) {
if (content is ICustomizedCommands && content.IsDirty) {
((ICustomizedCommands)content).SaveCommand();
}
}
foreach (OpenedFile file in FileService.OpenedFiles) {
if (file.IsDirty) {
SaveFile.Save(file);
@ -220,7 +238,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -220,7 +238,7 @@ namespace ICSharpCode.SharpDevelop.Commands
{
public override void Run()
{
((Form)WorkbenchSingleton.Workbench).Close();
WorkbenchSingleton.MainForm.Close();
}
}
@ -259,7 +277,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -259,7 +277,7 @@ namespace ICSharpCode.SharpDevelop.Commands
using (PrintDocument pdoc = printable.PrintDocument) {
if (pdoc != null) {
PrintPreviewDialog ppd = new PrintPreviewDialog();
ppd.Owner = (Form)WorkbenchSingleton.Workbench;
ppd.Owner = WorkbenchSingleton.MainForm;
ppd.TopMost = true;
ppd.Document = pdoc;
ppd.Show();

2
src/Main/Base/Project/Src/Commands/FileMenuCommands.cs

@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
using (NewProjectDialog npdlg = new NewProjectDialog(true)) {
npdlg.Owner = (Form)WorkbenchSingleton.Workbench;
npdlg.Owner = WorkbenchSingleton.MainForm;
npdlg.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
}
}

14
src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs

@ -46,12 +46,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip @@ -46,12 +46,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip
{
IWorkbenchWindow window = Owner as IWorkbenchWindow;
if (window != null) {
if (window.ActiveViewContent.IsViewOnly) {
return;
}
foreach (OpenedFile file in window.ActiveViewContent.Files) {
SaveFile.Save(file);
}
SaveFile.Save(window.ActiveViewContent);
}
}
}
@ -63,12 +58,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip @@ -63,12 +58,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip
IWorkbenchWindow window = Owner as IWorkbenchWindow;
if (window != null) {
if (window.ActiveViewContent.IsViewOnly) {
return;
}
foreach (OpenedFile file in window.ActiveViewContent.Files) {
SaveFileAs.Save(file);
}
SaveFileAs.Save(window.ActiveViewContent);
}
}
}

4
src/Main/Base/Project/Src/Commands/HelpCommands.cs

@ -63,8 +63,8 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -63,8 +63,8 @@ namespace ICSharpCode.SharpDevelop.Commands
public override void Run()
{
using (CommonAboutDialog ad = new CommonAboutDialog()) {
ad.Owner = (Form)WorkbenchSingleton.Workbench;
ad.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
ad.Owner = WorkbenchSingleton.MainForm;
ad.ShowDialog(WorkbenchSingleton.MainForm);
}
}
}

4
src/Main/Base/Project/Src/Commands/ToolsCommands.cs

@ -32,8 +32,8 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -32,8 +32,8 @@ namespace ICSharpCode.SharpDevelop.Commands
AddInTree.GetTreeNode("/SharpDevelop/Dialogs/OptionsDialog"))) {
optionsDialog.FormBorderStyle = FormBorderStyle.FixedDialog;
optionsDialog.Owner = (Form)WorkbenchSingleton.Workbench;
optionsDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
optionsDialog.Owner = WorkbenchSingleton.MainForm;
optionsDialog.ShowDialog(WorkbenchSingleton.MainForm);
}
}
}

20
src/Main/Base/Project/Src/Gui/AbstractViewContent.cs

@ -34,18 +34,26 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -34,18 +34,26 @@ namespace ICSharpCode.SharpDevelop.Gui
this.Files.Add(file);
}
public event EventHandler ViewActivated;
public event EventHandler SwitchedTo;
protected virtual void OnViewActivated(EventArgs e)
/// <summary>
/// Is called when the window is switched to.
/// -> Inside the tab (on SelectedIndexChanged of the tab control)
/// -> Inside the workbench (focus change in the docking library).
///
/// You <b>must</b> call base.OnViewActivated if you override this method, otherwise the <see cref="SwitchedTo"/>
/// event will not fire and <see cref="OpenedFile"/> will not work correctly.
/// </summary>
protected virtual void OnSwitchedTo(EventArgs e)
{
if (ViewActivated != null) {
ViewActivated(this, e);
if (SwitchedTo != null) {
SwitchedTo(this, e);
}
}
public void SwitchedTo()
void IViewContent.OnSwitchedTo()
{
OnViewActivated(EventArgs.Empty);
OnSwitchedTo(EventArgs.Empty);
}
public abstract Control Control {

16
src/Main/Base/Project/Src/Gui/AbstractViewContentWithoutFile.cs

@ -12,14 +12,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -12,14 +12,14 @@ namespace ICSharpCode.SharpDevelop.Gui
/// <summary>
/// Base class for view contents that are not based on a file.
/// </summary>
public abstract class AbstractViewContentWithoutFile : AbstractViewContent
public abstract class AbstractViewContentWithoutFile : AbstractViewContent, ICustomizedCommands
{
public override bool IsViewOnly {
get { return false; }
}
[Obsolete("AbstractViewContentWithoutFile.PrimaryFile is always null")]
public override OpenedFile PrimaryFile { get { return null; } }
public sealed override OpenedFile PrimaryFile { get { return null; } }
[Obsolete("This method is not supported on an AbstractViewContentWithoutFile")]
public sealed override void Load(OpenedFile file, System.IO.Stream stream)
@ -42,5 +42,17 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -42,5 +42,17 @@ namespace ICSharpCode.SharpDevelop.Gui
/// Save the view content.
/// </summary>
public abstract void Save();
bool ICustomizedCommands.SaveCommand()
{
Save();
return true;
}
bool ICustomizedCommands.SaveAsCommand()
{
Save();
return true;
}
}
}

6
src/Main/Base/Project/Src/Gui/ContentInterfaces/ICustomizedCommands.cs

@ -10,9 +10,15 @@ using System; @@ -10,9 +10,15 @@ using System;
namespace ICSharpCode.SharpDevelop.Gui
{
/// <summary>
/// Allows a IViewContent to handle the save command on its own instead of using OpenedFile.
/// </summary>
public interface ICustomizedCommands
{
/// <summary>
/// Returns true, if the save command is handled, false otherwise
/// </summary>
bool SaveCommand();
/// <summary>
/// Returns true, if the save as command is handled, false otherwise
/// </summary>

2
src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs

@ -606,7 +606,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -606,7 +606,7 @@ namespace ICSharpCode.SharpDevelop.Gui
tooltip.SetToolTip(ControlDictionary["largeIconsRadioButton"], StringParser.Parse("${res:Global.LargeIconToolTip}"));
tooltip.SetToolTip(ControlDictionary["smallIconsRadioButton"], StringParser.Parse("${res:Global.SmallIconToolTip}"));
tooltip.Active = true;
Owner = (Form)WorkbenchSingleton.Workbench;
Owner = WorkbenchSingleton.MainForm;
StartPosition = FormStartPosition.CenterParent;
Icon = null;

2
src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs

@ -398,7 +398,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs @@ -398,7 +398,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs
tooltip.SetToolTip(ControlDictionary["largeIconsRadioButton"], StringParser.Parse("${res:Global.LargeIconToolTip}"));
tooltip.SetToolTip(ControlDictionary["smallIconsRadioButton"], StringParser.Parse("${res:Global.SmallIconToolTip}"));
tooltip.Active = true;
Owner = (Form)WorkbenchSingleton.Workbench;
Owner = WorkbenchSingleton.MainForm;
StartPosition = FormStartPosition.CenterParent;
Icon = null;

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/EditTemplateDialog.cs

@ -45,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -45,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Gui
ControlDictionary["okButton"].Click += new EventHandler(AcceptEvent);
Owner = (Form)WorkbenchSingleton.Workbench;
Owner = WorkbenchSingleton.MainForm;
Icon = null;
}
}

4
src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs

@ -39,14 +39,12 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs @@ -39,14 +39,12 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs
public ProjectOptionsView(AddInTreeNode node, IProject project)
{
this.project = project;
this.TitleName = project.Name;
// tabControl.Alignment = TabAlignment.Left;
tabControl.HandleCreated += TabControlHandleCreated;
AddOptionPanels(node.BuildChildItems<IDialogPanelDescriptor>(this));
this.AutomaticallyRegisterViewOnFiles = false;
this.Files.Add(FileService.AttachToOpenedFile(project.FileName, this));
}
void TabControlHandleCreated(object sender, EventArgs e)

2
src/Main/Base/Project/Src/Gui/Dialogs/TabbedOptions.cs

@ -64,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -64,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Gui
this.Text = dialogName;
ControlDictionary["okButton"].Click += new EventHandler(AcceptEvent);
Icon = null;
Owner = (Form)WorkbenchSingleton.Workbench;
Owner = WorkbenchSingleton.MainForm;
AddOptionPanels(node.BuildChildItems<IDialogPanelDescriptor>(this));
}

2
src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptions.cs

@ -225,7 +225,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -225,7 +225,7 @@ namespace ICSharpCode.SharpDevelop.Gui
protected void InitializeComponent()
{
Owner = (Form)WorkbenchSingleton.Workbench;
Owner = WorkbenchSingleton.MainForm;
SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.TreeViewOptionsDialog.xfrm"));

2
src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs

@ -231,7 +231,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -231,7 +231,7 @@ namespace ICSharpCode.SharpDevelop.Gui
((ListView)ControlDictionary["resultListView"]).ColumnClick += new ColumnClickEventHandler(SortEvt);
Icon = IconService.GetIcon("Icons.16x16.FindIcon");
Owner = (Form)WorkbenchSingleton.Workbench;
Owner = WorkbenchSingleton.MainForm;
((ComboBox)ControlDictionary["locationComboBox"]).Items.Add(StringParser.Parse("${res:Global.Location.currentfile}"));
((ComboBox)ControlDictionary["locationComboBox"]).Items.Add(StringParser.Parse("${res:Global.Location.allopenfiles}"));

7
src/Main/Base/Project/Src/Gui/IViewContent.cs

@ -65,11 +65,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -65,11 +65,14 @@ namespace ICSharpCode.SharpDevelop.Gui
}
/// <summary>
/// Used internally.
/// Is called when the window is switched to.
/// -> Inside the tab (on SelectedIndexChanged of the tab control)
/// -> Inside the workbench (focus change in the docking library).
/// </summary>
void SwitchedTo();
void OnSwitchedTo();
event EventHandler SwitchedTo;
/// <summary>
/// Reinitializes the content. (Re-initializes all add-in tree stuff)
@ -131,8 +134,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -131,8 +134,6 @@ namespace ICSharpCode.SharpDevelop.Gui
/// </summary>
INavigationPoint BuildNavPoint();
event EventHandler ViewActivated;
bool IsDisposed { get; }
event EventHandler Disposed;

17
src/Main/Base/Project/Src/Gui/IWorkbench.cs

@ -52,6 +52,12 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -52,6 +52,12 @@ namespace ICSharpCode.SharpDevelop.Gui
get;
}
/// <summary>
/// Is called, when the workbench window which the user has into
/// the foreground (e.g. editable) changed to a new one.
/// </summary>
event EventHandler ActiveWorkbenchWindowChanged;
/// <summary>
/// The active view content inside the active workbench window.
/// </summary>
@ -59,6 +65,11 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -59,6 +65,11 @@ namespace ICSharpCode.SharpDevelop.Gui
get;
}
/// <summary>
/// Is called, when the active view content has changed.
/// </summary>
event EventHandler ActiveViewContentChanged;
/// <summary>
/// The active content. This can be either a IViewContent or a IPadContent, depending on
/// where the focus currently is.
@ -130,11 +141,5 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -130,11 +141,5 @@ namespace ICSharpCode.SharpDevelop.Gui
/// Is called, when a workbench view was closed
/// </summary>
event ViewContentEventHandler ViewClosed;
/// <summary>
/// Is called, when the workbench window which the user has into
/// the foreground (e.g. editable) changed to a new one.
/// </summary>
event EventHandler ActiveWorkbenchWindowChanged;
}
}

4
src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs

@ -88,9 +88,5 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -88,9 +88,5 @@ namespace ICSharpCode.SharpDevelop.Gui
/// the foreground (e.g. editable) changed to a new one.
/// </summary>
event EventHandler ActiveWorkbenchWindowChanged;
// only needed in the workspace window when the 'secondary view content' changed
// it is somewhat like 'active workbench window changed'
void OnActiveWorkbenchWindowChanged(EventArgs e);
}
}

13
src/Main/Base/Project/Src/Gui/IWorkbenchWindow.cs

@ -38,6 +38,11 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -38,6 +38,11 @@ namespace ICSharpCode.SharpDevelop.Gui
set;
}
/// <summary>
/// Is raised when the ActiveViewContent property has changed.
/// </summary>
event EventHandler ActiveViewContentChanged;
/// <summary>
/// Gets the list of view contents displayed in this window
/// </summary>
@ -66,9 +71,15 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -66,9 +71,15 @@ namespace ICSharpCode.SharpDevelop.Gui
void RedrawContent();
/// <summary>
/// Only for internal use.
/// Used internally:
/// This method is called by the workbench to notify the window that is was selected.
/// </summary>
void OnWindowSelected(EventArgs e);
/// <summary>
/// Used internally:
/// This method is called by the workbench to notify the window that is was deselected.
/// </summary>
void OnWindowDeselected(EventArgs e);
/// <summary>

2
src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs

@ -18,7 +18,7 @@ using System.Windows.Forms; @@ -18,7 +18,7 @@ using System.Windows.Forms;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop
namespace ICSharpCode.SharpDevelop.Gui
{
public enum TaskViewCols : int {
Icon = 0,

164
src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -24,7 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui
/// <summary>
/// This is the Workspace with a multiple document interface.
/// </summary>
public class DefaultWorkbench : Form, IWorkbench
sealed class DefaultWorkbench : Form, IWorkbench
{
readonly static string mainMenuPath = "/SharpDevelop/Workbench/MainMenu";
readonly static string viewContentPath = "/SharpDevelop/Workbench/Pads";
@ -99,6 +99,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -99,6 +99,7 @@ namespace ICSharpCode.SharpDevelop.Gui
value.Attach(this);
layout = value;
layout.ActiveWorkbenchWindowChanged += OnActiveWindowChanged;
OnActiveWindowChanged(null, null);
}
}
@ -129,30 +130,77 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -129,30 +130,77 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
void OnActiveWindowChanged(object sender, EventArgs e)
{
if (closeAll) return;
if (layout == null) {
this.ActiveWorkbenchWindow = null;
} else {
this.ActiveWorkbenchWindow = layout.ActiveWorkbenchwindow;
}
}
IWorkbenchWindow activeWorkbenchWindow;
public IWorkbenchWindow ActiveWorkbenchWindow {
get {
#if DEBUG
WorkbenchSingleton.AssertMainThread();
#endif
if (layout == null) {
return null;
WorkbenchSingleton.DebugAssertMainThread();
return activeWorkbenchWindow;
}
private set {
if (activeWorkbenchWindow != value) {
if (activeWorkbenchWindow != null) {
activeWorkbenchWindow.ActiveViewContentChanged -= OnWorkbenchActiveViewContentChanged;
}
activeWorkbenchWindow = value;
if (activeWorkbenchWindow != null) {
activeWorkbenchWindow.ActiveViewContentChanged += OnWorkbenchActiveViewContentChanged;
}
OnWorkbenchActiveViewContentChanged(null, null);
if (ActiveWorkbenchWindowChanged != null) {
ActiveWorkbenchWindowChanged(this, EventArgs.Empty);
}
}
return layout.ActiveWorkbenchwindow;
}
}
void OnWorkbenchActiveViewContentChanged(object sender, EventArgs e)
{
// update ActiveViewContent
IWorkbenchWindow window = this.ActiveWorkbenchWindow;
if (window != null)
this.ActiveViewContent = window.ActiveViewContent;
else
this.ActiveViewContent = null;
}
public event EventHandler ActiveWorkbenchWindowChanged;
IViewContent activeViewContent;
/// <summary>
/// The active view content inside the active workbench window.
/// </summary>
public IViewContent ActiveViewContent {
get{
IWorkbenchWindow window = this.ActiveWorkbenchWindow;
if (window != null)
return window.ActiveViewContent;
else
return null;
get {
WorkbenchSingleton.DebugAssertMainThread();
return activeViewContent;
}
private set {
if (activeViewContent != value) {
activeViewContent = value;
if (ActiveViewContentChanged != null) {
ActiveViewContentChanged(this, EventArgs.Empty);
}
}
}
}
/// <summary>
/// Is called, when the active view content has changed.
/// </summary>
public event EventHandler ActiveViewContentChanged;
public object ActiveContent {
get {
@ -173,7 +221,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -173,7 +221,6 @@ namespace ICSharpCode.SharpDevelop.Gui
AllowDrop = true;
}
#region Single instance code
protected override void WndProc(ref Message m)
{
if (!SingleInstanceHelper.PreFilterMessage(ref m)) {
@ -181,80 +228,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -181,80 +228,6 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
public static class SingleInstanceHelper
{
const int WM_USER = 0x400;
const int CUSTOM_MESSAGE = WM_USER + 2;
const int RESULT_FILES_HANDLED = 2;
const int RESULT_PROJECT_IS_OPEN = 3;
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SetForegroundWindow(IntPtr hWnd);
public static bool OpenFilesInPreviousInstance(string[] fileList)
{
LoggingService.Info("Trying to pass arguments to previous instance...");
int currentProcessId = Process.GetCurrentProcess().Id;
string currentFile = Assembly.GetEntryAssembly().Location;
int number = new Random().Next();
string fileName = Path.Combine(Path.GetTempPath(), "sd" + number + ".tmp");
try {
File.WriteAllLines(fileName, fileList);
List<IntPtr> alternatives = new List<IntPtr>();
foreach (Process p in Process.GetProcessesByName("SharpDevelop")) {
if (p.Id == currentProcessId) continue;
if (FileUtility.IsEqualFileName(currentFile, p.MainModule.FileName)) {
IntPtr hWnd = p.MainWindowHandle;
if (hWnd != IntPtr.Zero) {
long result = SendMessage(hWnd, CUSTOM_MESSAGE, new IntPtr(number), IntPtr.Zero).ToInt64();
if (result == RESULT_FILES_HANDLED) {
return true;
} else if (result == RESULT_PROJECT_IS_OPEN) {
alternatives.Add(hWnd);
}
}
}
}
foreach (IntPtr hWnd in alternatives) {
if (SendMessage(hWnd, CUSTOM_MESSAGE, new IntPtr(number), new IntPtr(1)).ToInt64()== RESULT_FILES_HANDLED) {
return true;
}
}
return false;
} finally {
File.Delete(fileName);
}
}
internal static bool PreFilterMessage(ref Message m)
{
if (m.Msg != CUSTOM_MESSAGE)
return false;
long fileNumber = m.WParam.ToInt64();
long openEvenIfProjectIsOpened = m.LParam.ToInt64();
LoggingService.Info("Receiving custom message...");
if (openEvenIfProjectIsOpened == 0 && ProjectService.OpenSolution != null) {
m.Result = new IntPtr(RESULT_PROJECT_IS_OPEN);
} else {
m.Result = new IntPtr(RESULT_FILES_HANDLED);
try {
WorkbenchSingleton.SafeThreadAsyncCall(delegate { SetForegroundWindow(WorkbenchSingleton.MainForm.Handle) ; });
foreach (string file in File.ReadAllLines(Path.Combine(Path.GetTempPath(), "sd" + fileNumber + ".tmp"))) {
WorkbenchSingleton.SafeThreadAsyncCall(delegate(string openFileName) { FileService.OpenFile(openFileName); }, file);
}
} catch (Exception ex) {
LoggingService.Warn(ex);
}
}
return true;
}
}
#endregion
System.Windows.Forms.Timer toolbarUpdateTimer;
public void InitializeWorkspace()
@ -321,7 +294,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -321,7 +294,7 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
public virtual void ShowView(IViewContent content)
public void ShowView(IViewContent content)
{
System.Diagnostics.Debug.Assert(layout != null);
viewContentCollection.Add(content);
@ -341,7 +314,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -341,7 +314,7 @@ namespace ICSharpCode.SharpDevelop.Gui
OnViewOpened(new ViewContentEventArgs(content));
}
public virtual void ShowPad(PadDescriptor content)
public void ShowPad(PadDescriptor content)
{
PadContentCollection.Add(content);
@ -560,12 +533,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -560,12 +533,6 @@ namespace ICSharpCode.SharpDevelop.Gui
StatusBarService.SetMessage("${res:MainWindow.StatusBar.ReadyMessage}");
}
void OnActiveWindowChanged(object sender, EventArgs e)
{
if (!closeAll && ActiveWorkbenchWindowChanged != null) {
ActiveWorkbenchWindowChanged(this, e);
}
}
// public ToolStripManager ToolStripManager = new ToolStripManager();
public MenuStrip TopMenu = null;
public ToolStrip[] ToolBars = null;
@ -675,14 +642,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -675,14 +642,14 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
protected virtual void OnViewOpened(ViewContentEventArgs e)
void OnViewOpened(ViewContentEventArgs e)
{
if (ViewOpened != null) {
ViewOpened(this, e);
}
}
protected virtual void OnViewClosed(ViewContentEventArgs e)
void OnViewClosed(ViewContentEventArgs e)
{
if (ViewClosed != null) {
ViewClosed(this, e);
@ -691,7 +658,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -691,7 +658,6 @@ namespace ICSharpCode.SharpDevelop.Gui
public event ViewContentEventHandler ViewOpened;
public event ViewContentEventHandler ViewClosed;
public event EventHandler ActiveWorkbenchWindowChanged;
protected override void OnActivated(EventArgs e)
{

13
src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs

@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Gui
/// <summary>
/// This is the a Workspace with a single document interface.
/// </summary>
public class SdiWorkbenchLayout : IWorkbenchLayout
internal sealed class SdiWorkbenchLayout : IWorkbenchLayout
{
DefaultWorkbench wbForm;
@ -604,7 +604,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -604,7 +604,8 @@ namespace ICSharpCode.SharpDevelop.Gui
}
IWorkbenchWindow oldSelectedWindow = null;
public virtual void OnActiveWorkbenchWindowChanged(EventArgs e)
internal void OnActiveWorkbenchWindowChanged(EventArgs e)
{
IWorkbenchWindow newWindow = this.ActiveWorkbenchwindow;
if (newWindow == null || newWindow.ActiveViewContent != null) {
@ -618,13 +619,13 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -618,13 +619,13 @@ namespace ICSharpCode.SharpDevelop.Gui
} else {
//LoggingService.Debug("ignore window change to disposed window");
}
if (oldSelectedWindow != null) {
if (oldSelectedWindow != null && oldSelectedWindow.ActiveViewContent != null) {
oldSelectedWindow.OnWindowDeselected(EventArgs.Empty);
}
oldSelectedWindow = newWindow;
if (oldSelectedWindow != null && oldSelectedWindow.ActiveViewContent != null && oldSelectedWindow.ActiveViewContent.Control != null) {
oldSelectedWindow.OnWindowSelected(EventArgs.Empty);
oldSelectedWindow.ActiveViewContent.SwitchedTo();
if (newWindow != null && newWindow.ActiveViewContent != null) {
newWindow.ActiveViewContent.OnSwitchedTo();
newWindow.OnWindowSelected(EventArgs.Empty);
}
}

38
src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs

@ -18,7 +18,7 @@ using WeifenLuo.WinFormsUI; @@ -18,7 +18,7 @@ using WeifenLuo.WinFormsUI;
namespace ICSharpCode.SharpDevelop.Gui
{
public class SdiWorkspaceWindow : DockContent, IWorkbenchWindow, IOwnerState
internal sealed class SdiWorkspaceWindow : DockContent, IWorkbenchWindow, IOwnerState
{
readonly static string contextMenuPath = "/SharpDevelop/Workbench/OpenFileTab/ContextMenu";
@ -82,6 +82,20 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -82,6 +82,20 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
public event EventHandler ActiveViewContentChanged;
IViewContent oldActiveViewContent;
void UpdateActiveViewContent()
{
UpdateTitle();
IViewContent newActiveViewContent = this.ActiveViewContent;
if (oldActiveViewContent != newActiveViewContent && ActiveViewContentChanged != null) {
ActiveViewContentChanged(this, EventArgs.Empty);
}
oldActiveViewContent = newActiveViewContent;
}
sealed class ViewContentCollection : Collection<IViewContent>
{
readonly SdiWorkspaceWindow window;
@ -99,6 +113,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -99,6 +113,7 @@ namespace ICSharpCode.SharpDevelop.Gui
base.ClearItems();
window.ClearContent();
window.UpdateActiveViewContent();
}
protected override void InsertItem(int index, IViewContent item)
@ -131,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -131,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.Gui
window.viewTabControl.TabPages.Insert(index, newPage);
}
}
window.UpdateTitle();
window.UpdateActiveViewContent();
}
protected override void RemoveItem(int index)
@ -148,7 +163,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -148,7 +163,7 @@ namespace ICSharpCode.SharpDevelop.Gui
} else {
window.viewTabControl.TabPages.RemoveAt(index);
}
window.UpdateTitle();
window.UpdateActiveViewContent();
}
protected override void SetItem(int index, IViewContent item)
@ -169,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -169,7 +184,7 @@ namespace ICSharpCode.SharpDevelop.Gui
page.Controls.Add(item.Control);
page.Text = StringParser.Parse(item.TabPageText);
}
window.UpdateTitle();
window.UpdateActiveViewContent();
}
}
@ -230,7 +245,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -230,7 +245,8 @@ namespace ICSharpCode.SharpDevelop.Gui
this.Controls.Add(viewTabControl);
viewTabControl.SelectedIndexChanged += delegate {
this.ActiveViewContent.SwitchedTo();
this.ActiveViewContent.OnSwitchedTo();
UpdateActiveViewContent();
};
}
}
@ -341,7 +357,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -341,7 +357,7 @@ namespace ICSharpCode.SharpDevelop.Gui
return true;
}
public virtual void RedrawContent()
public void RedrawContent()
{
RefreshTabPageTexts();
}
@ -356,12 +372,11 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -356,12 +372,11 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
protected virtual void OnTitleChanged(EventArgs e)
void OnTitleChanged(EventArgs e)
{
if (TitleChanged != null) {
TitleChanged(this, e);
}
WorkbenchSingleton.Workbench.WorkbenchLayout.OnActiveWorkbenchWindowChanged(EventArgs.Empty);
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
@ -369,7 +384,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -369,7 +384,7 @@ namespace ICSharpCode.SharpDevelop.Gui
e.Cancel = !CloseWindow(false);
}
protected virtual void OnCloseEvent(EventArgs e)
void OnCloseEvent(EventArgs e)
{
OnWindowDeselected(e);
if (CloseEvent != null) {
@ -377,13 +392,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -377,13 +392,14 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
public virtual void OnWindowSelected(EventArgs e)
public void OnWindowSelected(EventArgs e)
{
if (WindowSelected != null) {
WindowSelected(this, e);
}
}
public virtual void OnWindowDeselected(EventArgs e)
public void OnWindowDeselected(EventArgs e)
{
if (WindowDeselected != null) {
WindowDeselected(this, e);

92
src/Main/Base/Project/Src/Gui/Workbench/SingleInstanceHelper.cs

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui
{
public static class SingleInstanceHelper
{
const int WM_USER = 0x400;
const int CUSTOM_MESSAGE = WM_USER + 2;
const int RESULT_FILES_HANDLED = 2;
const int RESULT_PROJECT_IS_OPEN = 3;
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SetForegroundWindow(IntPtr hWnd);
public static bool OpenFilesInPreviousInstance(string[] fileList)
{
LoggingService.Debug("Trying to pass arguments to previous instance...");
int currentProcessId = Process.GetCurrentProcess().Id;
string currentFile = Assembly.GetEntryAssembly().Location;
int number = new Random().Next();
string fileName = Path.Combine(Path.GetTempPath(), "sd" + number + ".tmp");
try {
File.WriteAllLines(fileName, fileList);
List<IntPtr> alternatives = new List<IntPtr>();
foreach (Process p in Process.GetProcessesByName("SharpDevelop")) {
if (p.Id == currentProcessId) continue;
if (FileUtility.IsEqualFileName(currentFile, p.MainModule.FileName)) {
IntPtr hWnd = p.MainWindowHandle;
if (hWnd != IntPtr.Zero) {
long result = SendMessage(hWnd, CUSTOM_MESSAGE, new IntPtr(number), IntPtr.Zero).ToInt64();
if (result == RESULT_FILES_HANDLED) {
return true;
} else if (result == RESULT_PROJECT_IS_OPEN) {
alternatives.Add(hWnd);
}
}
}
}
foreach (IntPtr hWnd in alternatives) {
if (SendMessage(hWnd, CUSTOM_MESSAGE, new IntPtr(number), new IntPtr(1)).ToInt64() == RESULT_FILES_HANDLED) {
return true;
}
}
return false;
} finally {
File.Delete(fileName);
}
}
internal static bool PreFilterMessage(ref Message m)
{
if (m.Msg != CUSTOM_MESSAGE)
return false;
long fileNumber = m.WParam.ToInt64();
long openEvenIfProjectIsOpened = m.LParam.ToInt64();
LoggingService.Debug("Receiving custom message...");
if (openEvenIfProjectIsOpened == 0 && ProjectService.OpenSolution != null) {
m.Result = new IntPtr(RESULT_PROJECT_IS_OPEN);
} else {
m.Result = new IntPtr(RESULT_FILES_HANDLED);
try {
WorkbenchSingleton.SafeThreadAsyncCall(delegate { SetForegroundWindow(WorkbenchSingleton.MainForm.Handle) ; });
foreach (string file in File.ReadAllLines(Path.Combine(Path.GetTempPath(), "sd" + fileNumber + ".tmp"))) {
WorkbenchSingleton.SafeThreadAsyncCall(delegate(string openFileName) { FileService.OpenFile(openFileName); }, file);
}
} catch (Exception ex) {
LoggingService.Warn(ex);
}
}
return true;
}
}
}

11
src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.Diagnostics;
using System.Windows.Forms;
using ICSharpCode.Core;
@ -130,6 +131,16 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -130,6 +131,16 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
/// <summary>
/// Throws an exception if the current thread is not the main thread.
/// For performance reasons, the thread check is only done in debug builds.
/// </summary>
[Conditional("DEBUG")]
internal static void DebugAssertMainThread()
{
AssertMainThread();
}
/// <summary>
/// Throws an exception if the current thread is not the main thread.
/// </summary>

12
src/Main/Base/Project/Src/Services/File/FileService.cs

@ -45,6 +45,7 @@ namespace ICSharpCode.SharpDevelop @@ -45,6 +45,7 @@ namespace ICSharpCode.SharpDevelop
PropertyService.Set("RecentOpen", recentOpen.ToProperties());
}
ProjectService.SolutionLoaded -= ProjectServiceSolutionLoaded;
ParserService.LoadSolutionProjectsThreadEnded -= ParserServiceLoadSolutionProjectsThreadEnded;
serviceInitialized = false;
}
@ -52,6 +53,7 @@ namespace ICSharpCode.SharpDevelop @@ -52,6 +53,7 @@ namespace ICSharpCode.SharpDevelop
{
if (!serviceInitialized) {
ProjectService.SolutionLoaded += ProjectServiceSolutionLoaded;
ParserService.LoadSolutionProjectsThreadEnded += ParserServiceLoadSolutionProjectsThreadEnded;
serviceInitialized = true;
}
}
@ -182,6 +184,16 @@ namespace ICSharpCode.SharpDevelop @@ -182,6 +184,16 @@ namespace ICSharpCode.SharpDevelop
}
}
static void ParserServiceLoadSolutionProjectsThreadEnded(object sender, EventArgs e)
{
WorkbenchSingleton.SafeThreadAsyncCall(
delegate {
foreach (IViewContent content in Linq.ToArray(WorkbenchSingleton.Workbench.ViewContentCollection)) {
DisplayBindingService.AttachSubWindows(content, true);
}
});
}
public static bool IsOpen(string fileName)
{
return GetOpenFile(fileName) != null;

4
src/Main/Base/Project/Src/Services/File/OpenedFile.cs

@ -191,7 +191,7 @@ namespace ICSharpCode.SharpDevelop @@ -191,7 +191,7 @@ namespace ICSharpCode.SharpDevelop
registeredViews.Add(view);
view.ViewActivated += SwitchedToView;
view.SwitchedTo += SwitchedToView;
#if DEBUG
view.Disposed += ViewDisposed;
#endif
@ -203,7 +203,7 @@ namespace ICSharpCode.SharpDevelop @@ -203,7 +203,7 @@ namespace ICSharpCode.SharpDevelop
throw new ArgumentNullException("view");
Debug.Assert(registeredViews.Contains(view));
view.ViewActivated -= SwitchedToView;
view.SwitchedTo -= SwitchedToView;
#if DEBUG
view.Disposed -= ViewDisposed;
#endif

2
src/Main/Base/Project/Src/Services/File/RecentOpen.cs

@ -18,7 +18,7 @@ namespace ICSharpCode.SharpDevelop @@ -18,7 +18,7 @@ namespace ICSharpCode.SharpDevelop
/// it checks, if the files exists at every creation, and if not it doesn't list them in the
/// recent files, and they'll not be saved during the next option save.
/// </summary>
public class RecentOpen
public sealed class RecentOpen
{
/// <summary>
/// This variable is the maximal length of lastfile/lastopen entries

6
src/Main/Base/Project/Src/Services/HelpProvider.cs

@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
// </file>
using System;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
@ -14,9 +14,9 @@ namespace ICSharpCode.SharpDevelop @@ -14,9 +14,9 @@ namespace ICSharpCode.SharpDevelop
{
public class HelpProvider
{
public static ArrayList GetProviders()
public static List<HelpProvider> GetProviders()
{
return AddInTree.BuildItems("/SharpDevelop/Services/HelpProvider", null, false);
return AddInTree.BuildItems<HelpProvider>("/SharpDevelop/Services/HelpProvider", null, false);
}
public static void ShowHelp(IClass c)

2
src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Project; @@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop
{
public class ParseProjectContent : DefaultProjectContent
public sealed class ParseProjectContent : DefaultProjectContent
{
internal static ParseProjectContent CreateUninitalized(IProject project)
{

2
src/Main/Base/Project/Src/TextEditor/Commands/FormatCommands.cs

@ -232,7 +232,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -232,7 +232,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
}
using (SortOptionsDialog sortOptionsDialog = new SortOptionsDialog()) {
sortOptionsDialog.Owner = (Form)WorkbenchSingleton.Workbench;
sortOptionsDialog.Owner = WorkbenchSingleton.MainForm;
if (sortOptionsDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
TextArea textarea = ((ITextEditorControlProvider)viewContent).TextEditorControl.ActiveTextAreaControl.TextArea;
textarea.BeginUpdate();

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AttributesDataProvider.cs

@ -18,7 +18,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -18,7 +18,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
public class AttributesDataProvider : CtrlSpaceCompletionDataProvider
{
public AttributesDataProvider(IProjectContent pc)
: this(ExpressionContext.TypeDerivingFrom(pc.GetClass("System.Attribute", 0), true))
: this(ExpressionContext.TypeDerivingFrom(pc.SystemTypes.Attribute, true))
{
}

4
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

@ -316,7 +316,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -316,7 +316,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
public void ShowInsightWindow(IInsightDataProvider insightDataProvider)
{
if (insightWindow == null || insightWindow.IsDisposed) {
insightWindow = new InsightWindow(((Form)WorkbenchSingleton.Workbench), this);
insightWindow = new InsightWindow(WorkbenchSingleton.MainForm, this);
insightWindow.Closed += new EventHandler(CloseInsightWindow);
}
insightWindow.AddInsightDataProvider(insightDataProvider, this.FileName);
@ -331,7 +331,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -331,7 +331,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
public void ShowCompletionWindow(ICompletionDataProvider completionDataProvider, char ch)
{
codeCompletionWindow = CodeCompletionWindow.ShowCompletionWindow((Form)WorkbenchSingleton.Workbench, this, this.FileName, completionDataProvider, ch);
codeCompletionWindow = CodeCompletionWindow.ShowCompletionWindow(WorkbenchSingleton.MainForm, this, this.FileName, completionDataProvider, ch);
if (codeCompletionWindow != null) {
codeCompletionWindow.Closed += new EventHandler(CloseCodeCompletionWindow);
}

2
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs

@ -362,7 +362,7 @@ namespace SearchAndReplace @@ -362,7 +362,7 @@ namespace SearchAndReplace
static void ShowNotFoundMessage(IProgressMonitor monitor)
{
if (monitor != null) monitor.ShowingDialog = true;
MessageBox.Show((Form)WorkbenchSingleton.Workbench,
MessageBox.Show(WorkbenchSingleton.MainForm,
ResourceService.GetString("Dialog.NewProject.SearchReplace.SearchStringNotFound"),
ResourceService.GetString("Dialog.NewProject.SearchReplace.SearchStringNotFound.Title"),
MessageBoxButtons.OK,

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

@ -76,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -76,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
IReturnType t = finder.SearchType(nonGenericClassName, typeParameterCount);
IClass c = (t != null) ? t.GetUnderlyingClass() : null;
if (c != null) {
ExpressionContext context = ExpressionContext.TypeDerivingFrom(c, true);
ExpressionContext context = ExpressionContext.TypeDerivingFrom(t, true);
if (context.ShowEntry(c)) {
if (genericPart != null) {
DefaultClass genericClass = new DefaultClass(c.CompilationUnit, c.ClassType, c.Modifiers, c.Region, c.DeclaringType);
@ -94,7 +94,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -94,7 +94,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
} else {
UnGet();
if (ReadIdentifier(GetNextNonWhiteSpace()) == "throw") {
return ExpressionContext.TypeDerivingFrom(HostCallback.GetCurrentProjectContent().GetClass("System.Exception", 0), true);
return ExpressionContext.TypeDerivingFrom(HostCallback.GetCurrentProjectContent().SystemTypes.Exception, true);
}
}
return ExpressionContext.ObjectCreation;

11
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExpressionContext.cs

@ -93,16 +93,16 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -93,16 +93,16 @@ namespace ICSharpCode.SharpDevelop.Dom
/// object creation.</remarks>
public static ExpressionContext GetAttribute(IProjectContent projectContent)
{
return new TypeExpressionContext(projectContent.GetClass("System.Attribute", 0), false, true);
return new TypeExpressionContext(projectContent.SystemTypes.Attribute, false, true);
}
/// <summary>Context expects a type name which has special base type</summary>
/// <param name="baseClass">The class the expression must derive from.</param>
/// <param name="isObjectCreation">Specifies whether classes must be constructable.</param>
/// <example>catch(*expr* ...), using(*expr* ...), throw new ***</example>
public static ExpressionContext TypeDerivingFrom(IClass baseClass, bool isObjectCreation)
public static ExpressionContext TypeDerivingFrom(IReturnType baseType, bool isObjectCreation)
{
return new TypeExpressionContext(baseClass, isObjectCreation, false);
return new TypeExpressionContext(baseType, isObjectCreation, false);
}
/// <summary>Context expects an interface</summary>
@ -163,9 +163,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -163,9 +163,10 @@ namespace ICSharpCode.SharpDevelop.Dom
IClass baseClass;
bool isObjectCreation;
public TypeExpressionContext(IClass baseClass, bool isObjectCreation, bool readOnly)
public TypeExpressionContext(IReturnType baseType, bool isObjectCreation, bool readOnly)
{
this.baseClass = baseClass;
if (baseType != null)
baseClass = baseType.GetUnderlyingClass();
this.isObjectCreation = isObjectCreation;
this.readOnly = readOnly;
}

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/SystemTypes.cs

@ -26,8 +26,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -26,8 +26,10 @@ namespace ICSharpCode.SharpDevelop.Dom
public readonly IReturnType Attribute;
public readonly IReturnType Type;
public readonly IReturnType Exception;
public readonly IReturnType AsyncCallback;
public readonly IReturnType IAsyncResult;
public readonly IReturnType IDisposable;
IProjectContent pc;
@ -47,8 +49,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -47,8 +49,10 @@ namespace ICSharpCode.SharpDevelop.Dom
Attribute = CreateFromName("System.Attribute");
Type = CreateFromName("System.Type");
Exception = CreateFromName("System.Exception");
AsyncCallback = CreateFromName("System.AsyncCallback");
IAsyncResult = CreateFromName("System.IAsyncResult");
IAsyncResult = CreateFromName("System.IDisposable");
}
IReturnType CreateFromName(string name)

2
src/Main/StartUp/Project/SharpDevelopMain.cs

@ -155,7 +155,7 @@ namespace ICSharpCode.SharpDevelop @@ -155,7 +155,7 @@ namespace ICSharpCode.SharpDevelop
return false;
}
}
return DefaultWorkbench.SingleInstanceHelper.OpenFilesInPreviousInstance(fileList);
return SingleInstanceHelper.OpenFilesInPreviousInstance(fileList);
} catch (Exception ex) {
LoggingService.Error(ex);
return false;

22
src/Tools/Tools.build

@ -13,17 +13,17 @@ @@ -13,17 +13,17 @@
</ItemGroup>
<Target Name="Build">
<Copy SourceFiles="@(NDocFiles)" DestinationFolder="..\..\bin\Tools\NDoc"/>
<Copy SourceFiles="@(WixFiles)" DestinationFolder="..\..\bin\Tools\Wix"/>
<Copy SourceFiles="@(WixDocFiles)" DestinationFolder="..\..\bin\Tools\Wix\doc"/>
<Copy SourceFiles="@(WixBitmapFiles)" DestinationFolder="..\..\bin\Tools\Wix\Bitmaps"/>
<Copy SourceFiles="@(WixIncFiles)" DestinationFolder="..\..\bin\Tools\Wix\inc"/>
<Copy SourceFiles="@(WixLibFiles)" DestinationFolder="..\..\bin\Tools\Wix\lib"/>
<Copy SourceFiles="@(NUnitFiles)" DestinationFolder="..\..\bin\Tools\NUnit"/>
<Copy SourceFiles="@(NUnitFiles)" DestinationFolder="..\..\bin\Tools\NUnit\Net-1.1"/>
<Copy SourceFiles="@(NUnitConfigFileNetv11)" DestinationFiles="@(NUnitConfigFileNetv11->'..\..\bin\Tools\NUnit\Net-1.1\nunit-console.exe.config')"/>
<Copy SourceFiles="@(NUnitConfigFile)" DestinationFolder="..\..\bin\Tools\NUnit"/>
<Copy SourceFiles="@(ToolFiles)" DestinationFolder="..\..\bin\Tools"/>
<Copy SourceFiles="@(NDocFiles)" DestinationFolder="..\..\bin\Tools\NDoc" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(WixFiles)" DestinationFolder="..\..\bin\Tools\Wix" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(WixDocFiles)" DestinationFolder="..\..\bin\Tools\Wix\doc" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(WixBitmapFiles)" DestinationFolder="..\..\bin\Tools\Wix\Bitmaps" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(WixIncFiles)" DestinationFolder="..\..\bin\Tools\Wix\inc" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(WixLibFiles)" DestinationFolder="..\..\bin\Tools\Wix\lib" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(NUnitFiles)" DestinationFolder="..\..\bin\Tools\NUnit" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(NUnitFiles)" DestinationFolder="..\..\bin\Tools\NUnit\Net-1.1" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(NUnitConfigFileNetv11)" DestinationFiles="@(NUnitConfigFileNetv11->'..\..\bin\Tools\NUnit\Net-1.1\nunit-console.exe.config')" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(NUnitConfigFile)" DestinationFolder="..\..\bin\Tools\NUnit" SkipUnchangedFiles="true"/>
<Copy SourceFiles="@(ToolFiles)" DestinationFolder="..\..\bin\Tools" SkipUnchangedFiles="true"/>
<!--
<MSBuild Projects="@(ToolProject)" Targets="Build">

Loading…
Cancel
Save