File md10-to-20080904.diff of Package monodevelop
Index: src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/DeployFileListWidget.cs
===================================================================
--- src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/DeployFileListWidget.cs (revision 97933)
+++ src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/DeployFileListWidget.cs (revision 112335)
@@ -103,10 +103,10 @@
return "";
}
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
context.Dispose ();
- base.Dispose ();
+ base.OnDestroyed ();
}
void OnToggled (object sender, Gtk.ToggledArgs args)
Index: src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/DeployDirectoryInfoEditor.cs
===================================================================
--- src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/DeployDirectoryInfoEditor.cs (revision 97933)
+++ src/addins/Deployment/MonoDevelop.Deployment/MonoDevelop.Deployment.Gui/DeployDirectoryInfoEditor.cs (revision 112335)
@@ -53,11 +53,6 @@
}
}
- public override void Dispose ()
- {
- base.Dispose ();
- }
-
public object Value {
get {
if (combo.Active != -1)
Index: src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/TextEditor.cs
===================================================================
--- src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/TextEditor.cs (revision 97933)
+++ src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/TextEditor.cs (revision 112335)
@@ -105,9 +105,14 @@
}
}
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
- base.Dispose ();
+ base.OnDestroyed ();
+ ((IDisposable)this).Dispose ();
+ }
+
+ void IDisposable.Dispose ()
+ {
if (!disposed && initialText != entry.Text) {
TextChanged (null, null);
}
Index: src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/EnumerationEditorCell.cs
===================================================================
--- src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/EnumerationEditorCell.cs (revision 97933)
+++ src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/EnumerationEditorCell.cs (revision 112335)
@@ -112,11 +112,19 @@
combo.AppendText (str);
}
}
+
+ protected override void OnDestroyed ()
+ {
+ base.OnDestroyed ();
+ ((IDisposable)this).Dispose ();
+ }
- public override void Dispose ()
+ void IDisposable.Dispose ()
{
- tips.Destroy ();
- base.Dispose ();
+ if (tips != null) {
+ tips.Destroy ();
+ tips = null;
+ }
}
public object Value {
Index: src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/FlagsEditorCell.cs
===================================================================
--- src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/FlagsEditorCell.cs (revision 97933)
+++ src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.PropertyGrid.Editors/FlagsEditorCell.cs (revision 112335)
@@ -128,12 +128,20 @@
}
}
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
- tips.Destroy ();
- base.Dispose ();
+ base.OnDestroyed ();
+ ((IDisposable)this).Dispose ();
}
+ void IDisposable.Dispose ()
+ {
+ if (tips != null) {
+ tips.Destroy ();
+ tips = null;
+ }
+ }
+
public object Value {
get {
return Enum.ToObject (propType, UIntValue);
Index: src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore/WidgetFileDescriptionTemplate.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore/WidgetFileDescriptionTemplate.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore/WidgetFileDescriptionTemplate.cs (revision 112335)
@@ -76,7 +76,7 @@
return GtkCoreService.SupportsGtkDesigner (project);
}
- public override void AddToProject (Project project, string language, string directory, string name)
+ public override bool AddToProject (Project project, string language, string directory, string name)
{
GtkDesignInfo info = GtkCoreService.GetGtkInfo (project);
if (info == null)
@@ -112,7 +112,7 @@
if (!w.IsWindow)
info.AddExportedWidget (fullName);
- return;
+ return true;
}
widgetElem = steticTemplate ["action-group"];
@@ -125,7 +125,7 @@
gproject.SteticProject.AddNewActionGroup (doc.DocumentElement);
gproject.Save (false);
- return;
+ return true;
}
throw new InvalidOperationException ("<widget> or <action-group> element not found in widget template.");
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupDesigner.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupDesigner.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupDesigner.cs (revision 112335)
@@ -178,6 +178,7 @@
System.Runtime.Remoting.RemotingServices.Disconnect (frontend);
if (editSession != null)
editSession.Dispose ();
+ editSession = null;
base.Dispose ();
}
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/LibraryCache.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/LibraryCache.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/LibraryCache.cs (revision 112335)
@@ -1,138 +1,270 @@
+// LibraryCache.cs : Assembly file caching class
+//
+// Author: Mike Kestner <mkestner@novell.com>
+//
+// Copyright (c) 2008 Novell, Inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
using System;
using System.Collections;
+using System.Collections.Generic;
+using System.Collections.Specialized;
using System.IO;
using System.Xml;
+using System.Xml.Serialization;
+using ENV = System.Environment;
+using Mono.Cecil;
-namespace Stetic
-{
- static class LibraryCache
- {
- static string cachePath;
- static XmlDocument indexDoc;
-
- static LibraryCache ()
+namespace Stetic {
+
+ public class LibraryCache {
+
+ public class LibraryInfo {
+
+ public LibraryInfo () {}
+
+ string file;
+ Guid guid;
+ bool has_widgets;
+ DateTime timestamp;
+
+ string CacheDirectory {
+ get {
+ string path = Path.Combine (dir, Guid.ToString ());
+ if (!Directory.Exists (path))
+ Directory.CreateDirectory (path);
+ return path;
+ }
+ }
+
+ [XmlAttribute]
+ public string File {
+ get { return file; }
+ set { file = value; }
+ }
+
+ [XmlAttribute]
+ public Guid Guid {
+ get { return guid; }
+ set {
+ string path = Path.Combine (dir, guid.ToString ());
+ if (Directory.Exists (path))
+ Directory.Delete (path, true);
+ guid = value;
+ }
+ }
+
+ public string GuiPath {
+ get { return Path.Combine (CacheDirectory, "steticGui"); }
+ }
+
+ [XmlAttribute]
+ public bool HasWidgets {
+ get { return has_widgets; }
+ set { has_widgets = value; }
+ }
+
+ public string ObjectsPath {
+ get { return Path.Combine (CacheDirectory, "objects"); }
+ }
+
+ [XmlAttribute]
+ public DateTime Timestamp {
+ get { return timestamp; }
+ set { timestamp = value; }
+ }
+ }
+
+ static string dir = Path.Combine (Path.Combine (ENV.GetFolderPath (ENV.SpecialFolder.ApplicationData), "stetic"), "library-cache");
+
+ public class LibraryInfoCollection : IEnumerable {
+
+ Dictionary<string, LibraryInfo> libs = new Dictionary<string, LibraryInfo> ();
+
+ public LibraryInfo this [string path] {
+ get {
+ path = Path.GetFullPath (path);
+ if (libs.ContainsKey (path))
+ return libs [path];
+ return null;
+ }
+ }
+
+ public void Add (object obj)
+ {
+ Add (obj as LibraryInfo);
+ }
+
+ public void Add (LibraryInfo info)
+ {
+ libs [info.File] = info;
+ }
+
+ public IEnumerator GetEnumerator ()
+ {
+ return libs.Values.GetEnumerator ();
+ }
+
+ public void Remove (string file)
+ {
+ file = Path.GetFullPath (file);
+ libs.Remove (file);
+ }
+ }
+
+ [XmlArray]
+ [XmlArrayItem (ElementName="LibraryInfo", Type=typeof(LibraryInfo))]
+ public LibraryInfoCollection Members = new LibraryInfoCollection ();
+
+ public LibraryCache () {}
+
+ public LibraryInfo this [string file] {
+ get {
+ file = Path.GetFullPath (file);
+ if (IsCurrent (file))
+ return Members [file];
+
+ RefreshFile (file);
+ return Members [file];
+ }
+ }
+
+ public bool IsCurrent (string file)
{
- cachePath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), ".config");
- cachePath = Path.Combine (cachePath, "stetic");
- cachePath = Path.Combine (cachePath, "desc-cache");
+ file = Path.GetFullPath (file);
+ LibraryInfo info = Members [file];
+ return info != null && info.Timestamp == File.GetLastWriteTime (file).ToUniversalTime ();
}
-
- static XmlDocument GetIndex ()
+
+ AssemblyResolver resolver = new AssemblyResolver ();
+
+ EmbeddedResource GetResource (AssemblyDefinition asm, string name)
{
- if (indexDoc != null)
- return indexDoc;
-
- string index = Path.Combine (cachePath, "index.xml");
- if (!File.Exists (index))
- return null;
-
- try {
- XmlDocument doc = new XmlDocument ();
- doc.Load (index);
- return doc;
- } catch {
- return null;
+ foreach (Resource res in asm.MainModule.Resources) {
+ EmbeddedResource eres = res as EmbeddedResource;
+ if (eres != null && eres.Name == name)
+ return eres;
}
+ return null;
}
-
- static void SaveIndex (XmlDocument doc)
+
+ bool HasGtkReference (AssemblyDefinition assm, StringCollection visited)
{
- if (!Directory.Exists (cachePath))
- Directory.CreateDirectory (cachePath);
-
- // Purge the file list
-
- ArrayList todel = new ArrayList ();
- foreach (XmlElement elem in doc.DocumentElement.SelectNodes ("lib")) {
- string file = elem.GetAttribute ("file");
- if (!File.Exists (file)) {
- todel.Add (elem);
- string path = elem.GetAttribute ("cached");
- foreach (string cf in Directory.GetFiles (cachePath, path + "*")) {
- try {
- File.Delete (cf);
- } catch (Exception ex) {
- // Ignore exception
- Console.WriteLine (ex);
+ visited.Add (assm.Name.Name);
+
+ foreach (AssemblyNameReference nameRef in assm.MainModule.AssemblyReferences) {
+ if (visited.Contains (nameRef.Name))
+ continue;
+ else if (nameRef.Name == "gtk-sharp" || HasGtkReference (resolver.Resolve (nameRef), visited))
+ return true;
+ }
+
+ return false;
+ }
+
+ bool CheckForWidgets (string path)
+ {
+ try {
+ AssemblyDefinition adef = AssemblyFactory.GetAssembly (path);
+ if (GetResource (adef, "objects.xml") != null)
+ return true;
+
+ if (adef.Name.Name == "gtk-sharp")
+ return false; // Gtk is special-cased, so ignore it.
+
+ if (!HasGtkReference (adef, new StringCollection ()))
+ return false;
+
+ foreach (TypeDefinition type in adef.MainModule.Types) {
+ TypeReference tref = type.BaseType;
+ while (tref != null) {
+ if (tref.FullName == "Gtk.Window") {
+ break;
+ } else if (tref.FullName == "Gtk.Widget") {
+ return true;
}
+ tref = resolver.Resolve (tref).BaseType;
}
}
+ } catch {
}
-
- foreach (XmlElement elem in todel)
- doc.DocumentElement.RemoveChild (elem);
-
- string index = Path.Combine (cachePath, "index.xml");
- doc.Save (index);
- indexDoc = doc;
+ return false;
}
- public static string GetCachedFilePath (string assemblyPath)
+ void RefreshFile (string assembly)
{
- assemblyPath = Path.GetFullPath (assemblyPath);
-
- XmlDocument doc = GetIndex ();
- if (doc == null)
- return null;
-
- try {
- XmlElement elem = (XmlElement) doc.SelectSingleNode ("index/lib[@file='" + assemblyPath + "']");
- if (elem == null)
- return null;
-
- DateTime ts = XmlConvert.ToDateTime (elem.GetAttribute ("timestamp"), XmlDateTimeSerializationMode.Local);
- DateTime lastWrite = File.GetLastWriteTime (assemblyPath);
- if (ts != lastWrite)
- return null;
-
- return Path.Combine (cachePath, elem.GetAttribute ("cached"));
+ assembly = Path.GetFullPath (assembly);
+ LibraryInfo info = Members [assembly];
+ if (info == null) {
+ info = new LibraryInfo ();
+ info.File = assembly;
+ Members.Add (info);
}
- catch (Exception ex) {
- Console.WriteLine (ex);
- return null;
+ info.Timestamp = File.GetLastWriteTime (assembly).ToUniversalTime ();
+ info.Guid = Guid.NewGuid ();
+ info.HasWidgets = CheckForWidgets (assembly);
+ Save ();
+ }
+
+ void Save ()
+ {
+ if (!Directory.Exists (dir))
+ Directory.CreateDirectory (dir);
+
+ // remove any dead assemblies from the cache
+ StringCollection zombies = new StringCollection ();
+ foreach (LibraryInfo info in Members) {
+ if (File.Exists (info.File))
+ continue;
+ zombies.Add (info.File);
+ string zombie_dir = Path.Combine (dir, info.Guid.ToString ());
+ if (Directory.Exists (zombie_dir))
+ Directory.Delete (Path.Combine (dir, info.Guid.ToString ()), true);
}
+
+ foreach (string file in zombies)
+ Members.Remove (file);
+
+ XmlSerializer serializer = new XmlSerializer (typeof (LibraryCache));
+ using (FileStream fs = File.Create (Path.Combine (dir, "index.xml")))
+ serializer.Serialize (fs, this);
}
- public static string UpdateCachedFile (string assemblyPath)
+ public static LibraryCache Load ()
{
- assemblyPath = Path.GetFullPath (assemblyPath);
-
- XmlDocument doc = GetIndex ();
- if (doc == null) {
- doc = new XmlDocument ();
- doc.AppendChild (doc.CreateElement ("index"));
- }
-
- try {
- XmlElement elem = (XmlElement) doc.DocumentElement.SelectSingleNode ("lib[@file='" + assemblyPath + "']");
- if (elem == null) {
- elem = doc.CreateElement ("lib");
- elem.SetAttribute ("file", assemblyPath);
- doc.DocumentElement.AppendChild (elem);
+ string index_path = Path.Combine (dir, "index.xml");
+ if (File.Exists (index_path)) {
+ try {
+ LibraryCache result;
+ XmlSerializer serializer = new XmlSerializer (typeof (LibraryCache));
+ using (XmlTextReader rdr = new XmlTextReader (index_path))
+ result = (LibraryCache) serializer.Deserialize (rdr);
+ return result;
+ } catch (Exception e) {
+ Console.WriteLine ("Cache index serialization failed " + e);
}
-
- DateTime lastWrite = File.GetLastWriteTime (assemblyPath);
- elem.SetAttribute ("timestamp", XmlConvert.ToString (lastWrite, XmlDateTimeSerializationMode.Local));
-
- string s = doc.DocumentElement.GetAttribute ("cindex");
- if (s.Length == 0) s = "0";
- else s = (int.Parse (s) + 1).ToString ();
- doc.DocumentElement.SetAttribute ("cindex", s);
-
- string cached = elem.GetAttribute ("cached");
- if (cached.Length == 0) {
- cached = Path.GetFileNameWithoutExtension (assemblyPath) + "_" + s;
- elem.SetAttribute ("cached", cached);
- }
-
- SaveIndex (doc);
- return Path.Combine (cachePath, cached);
}
- catch (Exception ex) {
- Console.WriteLine (ex);
- return null;
- }
+
+ return new LibraryCache ();
}
}
}
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/AssemblyResolver.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/AssemblyResolver.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/AssemblyResolver.cs (revision 112335)
@@ -4,7 +4,7 @@
// Author:
// Jb Evain (jbevain@gmail.com)
//
-// (C) 2005 Jb Evain
+// (C) 2007 Novell, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -30,31 +30,162 @@
// Keep in synch as much as possible.
using System;
+using System.Collections;
using System.Collections.Specialized;
using System.IO;
-using SR = System.Reflection;
using System.Text;
using Mono.Cecil;
-namespace Stetic
-{
- internal class AssemblyResolver
- {
- public virtual string Resolve (string fullName)
+namespace Stetic {
+
+ internal class AssemblyResolver : BaseAssemblyResolver {
+
+ Hashtable _assemblies;
+
+ public IDictionary AssemblyCache {
+ get { return _assemblies; }
+ }
+
+ public AssemblyResolver ()
{
- return Resolve (fullName, null);
+ _assemblies = new Hashtable ();
}
-
- public virtual string Resolve (AssemblyNameReference name)
+
+ public override AssemblyDefinition Resolve (AssemblyNameReference name)
{
- return Resolve (name, null);
+ AssemblyDefinition asm = (AssemblyDefinition) _assemblies [name.Name];
+ if (asm == null) {
+ asm = base.Resolve (name);
+ asm.Resolver = this;
+ _assemblies [name.Name] = asm;
+ }
+
+ return asm;
}
-
- public string Resolve (string fullName, StringCollection basePaths)
+
+ public TypeDefinition Resolve (TypeReference type)
{
- return Resolve (AssemblyNameReference.Parse (fullName), basePaths);
+ if (type is TypeDefinition)
+ return (TypeDefinition) type;
+
+ AssemblyNameReference reference = type.Scope as AssemblyNameReference;
+ if (reference != null) {
+ AssemblyDefinition assembly = Resolve (reference);
+ return assembly.MainModule.Types [type.FullName];
+ }
+
+ ModuleDefinition module = type.Scope as ModuleDefinition;
+ if (module != null)
+ return module.Types [type.FullName];
+
+ throw new NotImplementedException ();
}
+ public FieldDefinition Resolve (FieldReference field)
+ {
+ TypeDefinition type = Resolve (field.DeclaringType);
+ return GetField (type.Fields, field);
+ }
+
+ static FieldDefinition GetField (ICollection collection, FieldReference reference)
+ {
+ foreach (FieldDefinition field in collection) {
+ if (field.Name != reference.Name)
+ continue;
+
+ if (!AreSame (field.FieldType, reference.FieldType))
+ continue;
+
+ return field;
+ }
+
+ return null;
+ }
+
+ public MethodDefinition Resolve (MethodReference method)
+ {
+ TypeDefinition type = Resolve (method.DeclaringType);
+ if (method.Name == MethodDefinition.Cctor || method.Name == MethodDefinition.Ctor)
+ return GetMethod (type.Constructors, method);
+ else
+ return GetMethod (type, method);
+ }
+
+ MethodDefinition GetMethod (TypeDefinition type, MethodReference reference)
+ {
+ while (type != null) {
+ MethodDefinition method = GetMethod (type.Methods, reference);
+ if (method == null)
+ type = Resolve (type.BaseType);
+ else
+ return method;
+ }
+
+ return null;
+ }
+
+ static MethodDefinition GetMethod (ICollection collection, MethodReference reference)
+ {
+ foreach (MethodDefinition meth in collection) {
+ if (meth.Name != reference.Name)
+ continue;
+
+ if (!AreSame (meth.ReturnType.ReturnType, reference.ReturnType.ReturnType))
+ continue;
+
+ if (!AreSame (meth.Parameters, reference.Parameters))
+ continue;
+
+ return meth;
+ }
+
+ return null;
+ }
+
+ static bool AreSame (ParameterDefinitionCollection a, ParameterDefinitionCollection b)
+ {
+ if (a.Count != b.Count)
+ return false;
+
+ if (a.Count == 0)
+ return true;
+
+ for (int i = 0; i < a.Count; i++)
+ if (!AreSame (a [i].ParameterType, b [i].ParameterType))
+ return false;
+
+ return true;
+ }
+
+ static bool AreSame (TypeReference a, TypeReference b)
+ {
+ while (a is TypeSpecification || b is TypeSpecification) {
+ if (a.GetType () != b.GetType ())
+ return false;
+
+ a = ((TypeSpecification) a).ElementType;
+ b = ((TypeSpecification) b).ElementType;
+ }
+
+ if (a is GenericParameter || b is GenericParameter) {
+ if (a.GetType() != b.GetType())
+ return false;
+
+ GenericParameter pa = (GenericParameter) a;
+ GenericParameter pb = (GenericParameter) b;
+
+ return pa.Position == pb.Position;
+ }
+
+ return a.FullName == b.FullName;
+ }
+
+ public void CacheAssembly (AssemblyDefinition assembly)
+ {
+ _assemblies [assembly.Name.FullName] = assembly;
+ assembly.Resolver = this;
+ }
+
public string Resolve (AssemblyNameReference name, StringCollection basePaths)
{
string [] exts = new string [] { ".dll", ".exe" };
@@ -81,8 +212,7 @@
string GetCorlib (AssemblyNameReference reference)
{
- SR.AssemblyName corlib = typeof (object).Assembly.GetName ();
- if (corlib.Version == reference.Version)
+ if (typeof (object).Assembly.GetName ().Version == reference.Version)
return typeof (object).Assembly.Location;
string path = Directory.GetParent (
@@ -111,11 +241,6 @@
return Path.Combine (path, "mscorlib.dll");
}
- public static bool OnMono ()
- {
- return typeof (object).Assembly.GetType ("System.MonoType", false) != null;
- }
-
static string GetAssemblyInGac (AssemblyNameReference reference)
{
if (reference.PublicKeyToken == null || reference.PublicKeyToken.Length == 0)
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/SignalsEditor.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/SignalsEditor.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/SignalsEditor.cs (revision 112335)
@@ -40,9 +40,16 @@
return session.Editor;
}
+ bool disposed = false;
+
public override void Dispose ()
{
- session.Dispose ();
+ if (disposed)
+ return;
+ disposed = true;
+
+ if (session != null)
+ session.Dispose ();
frontend.disposed = true;
System.Runtime.Remoting.RemotingServices.Disconnect (frontend);
base.Dispose ();
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupToolbar.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupToolbar.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupToolbar.cs (revision 112335)
@@ -89,7 +89,11 @@
public override void Dispose ()
{
+ if (combo == null)
+ return;
+
combo.Changed -= OnActiveChanged;
+ combo = null;
if (addButton != null) {
addButton.Clicked -= OnAddGroup;
removeButton.Clicked -= OnRemoveGroup;
@@ -159,7 +163,7 @@
void Refresh ()
{
- if (singleGroupMode)
+ if (singleGroupMode || combo == null)
return;
while (combo.Model.IterNChildren () > 0)
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupEditSession.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupEditSession.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ActionGroupEditSession.cs (revision 112335)
@@ -60,6 +60,7 @@
designer = UserInterface.CreateActionGroupDesigner (project, groupToolbar);
designer.Editor.GroupModified += OnModified;
designer.Toolbar.AllowActionBinding = allowActionBinding;
+ designer.Destroyed += delegate { designer = null; Dispose (); };
}
public Wrapper.ActionGroup EditedActionGroup {
@@ -276,10 +277,10 @@
public void Dispose ()
{
- if (designer != null)
+ if (designer != null) {
designer.Editor.GroupModified -= OnModified;
- if (!designerRequested) {
- designer.Destroy ();
+ if (!designerRequested)
+ designer.Destroy ();
}
project.ProjectReloaded -= OnProjectReloaded;
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/WidgetActionBar.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/WidgetActionBar.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/WidgetActionBar.cs (revision 112335)
@@ -19,6 +19,7 @@
Hashtable sensitives, invisibles;
ArrayList toggles;
Gtk.Tooltips tips = new Gtk.Tooltips ();
+ bool disposed;
bool updating;
bool allowBinding;
WidgetDesignerFrontend frontend;
@@ -48,6 +49,11 @@
public override void Dispose ()
{
+ if (disposed)
+ return;
+ disposed = true;
+ combo.Destroy ();
+ combo = null;
RootWidget = null;
Clear ();
base.Dispose ();
@@ -67,7 +73,8 @@
}
rootWidget = value;
- combo.RootWidget = rootWidget;
+ if (combo != null)
+ combo.RootWidget = rootWidget;
if (rootWidget != null) {
project = (Stetic.ProjectBackend) rootWidget.Project;
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/CecilWidgetLibrary.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/CecilWidgetLibrary.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/CecilWidgetLibrary.cs (revision 112335)
@@ -11,6 +11,8 @@
{
internal class CecilWidgetLibrary: WidgetLibrary
{
+ static LibraryCache cache = LibraryCache.Load ();
+
AssemblyDefinition assembly;
DateTime timestamp;
string name;
@@ -48,16 +50,16 @@
void ReadCachedDescription (string assemblyPath)
{
- string path = LibraryCache.GetCachedFilePath (assemblyPath);
- if (path == null)
+ if (!cache.IsCurrent (assemblyPath))
return;
-
- if (!File.Exists (path + ".objects"))
+
+ LibraryCache.LibraryInfo info = cache [assemblyPath];
+ if (!File.Exists (info.ObjectsPath))
return;
try {
objects = new XmlDocument ();
- objects.Load (path + ".objects");
+ objects.Load (info.ObjectsPath);
}
catch (Exception ex) {
Console.WriteLine (ex);
@@ -65,10 +67,10 @@
return;
}
- if (File.Exists (path + ".steticGui")) {
+ if (File.Exists (info.GuiPath)) {
try {
steticGui = new XmlDocument ();
- steticGui.Load (path + ".steticGui");
+ steticGui.Load (info.GuiPath);
}
catch (Exception ex) {
Console.WriteLine (ex);
@@ -80,19 +82,14 @@
void StoreCachedDescription ()
{
- string path = LibraryCache.UpdateCachedFile (fileName);
- if (path == null)
- return;
+ LibraryCache.LibraryInfo info = cache [fileName];
try {
- string objfile = path + ".objects";
- string guifile = path + ".steticGui";
-
- objects.Save (objfile);
+ objects.Save (info.ObjectsPath);
if (steticGui != null)
- steticGui.Save (guifile);
- else if (File.Exists (guifile))
- File.Delete (guifile);
+ steticGui.Save (info.GuiPath);
+ else if (File.Exists (info.GuiPath))
+ File.Delete (info.GuiPath);
}
catch (Exception ex) {
Console.WriteLine (ex);
@@ -362,18 +359,7 @@
public static bool IsWidgetLibrary (string path)
{
- try {
- AssemblyDefinition adef = AssemblyFactory.GetAssembly (path);
-
- foreach (Resource res in adef.MainModule.Resources) {
- EmbeddedResource eres = res as EmbeddedResource;
- if (eres == null) continue;
- if (eres.Name == "objects.xml")
- return true;
- }
- } catch {
- }
- return false;
+ return cache [path].HasWidgets;
}
public static string FindAssembly (ImportContext importContext, string assemblyName, string basePath)
@@ -393,7 +379,7 @@
AssemblyResolver res = new AssemblyResolver ();
try {
- return res.Resolve (assemblyName, col);
+ return res.Resolve (AssemblyNameReference.Parse (assemblyName), col);
} catch {
}
return null;
@@ -426,7 +412,14 @@
EmbeddedResource res = GetResource (asm, "objects.xml");
if (res == null)
return list;
+ else
+ return GetComponentsFromResource (app, asm, res, fileName);
+ }
+
+ static List<ComponentType> GetComponentsFromResource (Application app, AssemblyDefinition asm, EmbeddedResource res, string fileName)
+ {
+ List<ComponentType> list = new List<ComponentType> ();
MemoryStream ms = new MemoryStream (res.Data);
XmlDocument objects = new XmlDocument ();
objects.Load (ms);
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/Application.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/Application.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/Application.cs (revision 112335)
@@ -25,16 +25,172 @@
public delegate string AssemblyResolverCallback (string assemblyName);
- public class Application: MarshalByRefObject, IDisposable
- {
- ApplicationBackend backend;
- bool externalBackend;
+ public static class ApplicationFactory {
+
+ public static Application CreateApplication (IsolationMode mode)
+ {
+ switch (mode) {
+ case IsolationMode.None:
+ return new LocalApplication ();
+ case IsolationMode.ProcessTcp:
+ case IsolationMode.ProcessUnix:
+ return new IsolatedApplication (mode);
+ default:
+ throw new ArgumentException ("mode");
+ }
+ }
+ }
+
+ internal class IsolatedApplication : Application {
+
string channelId;
ApplicationBackendController backendController;
+
+ string RegisterRemotingChannel (IsolationMode mode)
+ {
+ string remotingChannel;
+ if (mode == IsolationMode.ProcessTcp) {
+ remotingChannel = "tcp";
+ IChannel ch = ChannelServices.GetChannel ("tcp");
+ if (ch == null) {
+ ChannelServices.RegisterChannel (new TcpChannel (0));
+ }
+ } else {
+ remotingChannel = "unix";
+ IChannel ch = ChannelServices.GetChannel ("unix");
+ if (ch == null) {
+ string unixRemotingFile = Path.GetTempFileName ();
+ ChannelServices.RegisterChannel (new UnixChannel (unixRemotingFile));
+ }
+ }
+ return remotingChannel;
+ }
+
+ public IsolatedApplication (IsolationMode mode)
+ {
+ if (mode == IsolationMode.None)
+ throw new ArgumentException ("mode");
+ channelId = RegisterRemotingChannel (mode);
+ backendController = new ApplicationBackendController (this, channelId);
+ backendController.StartBackend ();
+ OnBackendChanged (false);
+ }
+
+ public override void Dispose ()
+ {
+ base.Dispose ();
+ backendController.StopBackend (true);
+ }
+
+ public event BackendChangingHandler BackendChanging;
+ public event BackendChangedHandler BackendChanged;
+ void OnNewBackendStarted (object ob, EventArgs args)
+ {
+ OnBackendChanging ();
+ ApplicationBackendController oldBackend = backendController;
+ backendController = (ApplicationBackendController) ob;
+ OnBackendChanged (true);
+ oldBackend.StopBackend (false);
+ }
+
+ void OnBackendStopped (object ob, EventArgs args)
+ {
+ // The backend process crashed, try to restart it
+ Backend = null;
+ backendController = new ApplicationBackendController (this, channelId);
+ backendController.StartBackend ();
+ OnBackendChanged (true);
+ }
+
+ void OnBackendChanged (bool notify)
+ {
+ ApplicationBackend oldBackend = Backend;
+
+ Backend = backendController.Backend;
+ backendController.Stopped += OnBackendStopped;
+ UpdateWidgetLibraries (false, false);
+ ClearCollections ();
+ if (notify && BackendChanged != null)
+ BackendChanged (oldBackend);
+
+ Backend.ActiveProject = ActiveProject != null ? ActiveProject.ProjectBackend : null;
+ }
+
+ void OnBackendChanging ()
+ {
+ Backend.GlobalWidgetLibraries = widgetLibraries;
+ if (BackendChanging != null)
+ BackendChanging ();
+ }
+
+ internal override void RestartBackend ()
+ {
+ // The backend process needs to be restarted.
+ // This is done in background.
+
+ ThreadPool.QueueUserWorkItem (delegate {
+ try {
+ // Start the new backend
+ ApplicationBackendController newController = new ApplicationBackendController (this, channelId);
+ newController.StartBackend ();
+ Gtk.Application.Invoke (newController, EventArgs.Empty, OnNewBackendStarted);
+ } catch {
+ // FIXME: show an error message
+ }
+ });
+ }
+
+ internal override ComponentType CreateComponentType (string typeName)
+ {
+ string desc = null, className = null, category = null, targetGtkVersion = null, library = null;
+ Gdk.Pixbuf px = null;
+
+ byte[] icon;
+
+ if (Backend.GetClassDescriptorInfo (typeName, out desc, out className, out category, out targetGtkVersion, out library, out icon) && icon != null)
+ px = new Gdk.Pixbuf (icon);
+
+ if (px == null)
+ px = ComponentType.Unknown.Icon;
+
+ if (desc == null)
+ desc = typeName;
+
+ return new ComponentType (this, typeName, desc, className, category, targetGtkVersion, library, px);
+ }
+ }
+
+ internal class LocalApplication : Application {
+
+ public LocalApplication ()
+ {
+ Backend = new ApplicationBackend (this);
+ }
+
+ public override void Dispose ()
+ {
+ base.Dispose ();
+ Backend.Dispose ();
+ }
+
+ internal override ComponentType CreateComponentType (string typeName)
+ {
+ ClassDescriptor cls = Registry.LookupClassByName (typeName);
+ if (cls == null)
+ return null;
+
+ return new ComponentType (this, typeName, cls.Label, cls.WrappedTypeName, cls.Category, cls.TargetGtkVersion, cls.Library.Name, cls.Icon);
+ }
+ }
+
+ public abstract class Application : MarshalByRefObject, IDisposable {
+
+ ApplicationBackend backend;
+
Hashtable components = new Hashtable ();
Hashtable types = new Hashtable ();
- ArrayList widgetLibraries = new ArrayList ();
+ internal ArrayList widgetLibraries = new ArrayList ();
ArrayList projects = new ArrayList ();
Project activeProject;
Designer activeDesigner;
@@ -46,34 +202,14 @@
bool allowInProcLibraries = true;
bool disposed;
- static Hashtable libraryCheckCache;
-
- internal event BackendChangingHandler BackendChanging;
- internal event BackendChangedHandler BackendChanged;
- internal event EventHandler Disposing;
-
- public Application (IsolationMode mode)
- {
- if (mode == IsolationMode.None) {
- backend = new ApplicationBackend (this);
- externalBackend = false;
- } else {
- externalBackend = true;
- channelId = RegisterRemotingChannel (mode);
- backendController = new ApplicationBackendController (this, channelId);
- backendController.StartBackend ();
- OnBackendChanged (false);
- }
- }
-
public AssemblyResolverCallback WidgetLibraryResolver {
get { return Backend.WidgetLibraryResolver; }
set { Backend.WidgetLibraryResolver = value; }
}
public bool ShowNonContainerWarning {
- get { return backend.ShowNonContainerWarning; }
- set { backend.ShowNonContainerWarning = value; }
+ get { return Backend.ShowNonContainerWarning; }
+ set { Backend.ShowNonContainerWarning = value; }
}
// Loads the libraries registered in the projects or in the application.
@@ -84,67 +220,12 @@
UpdateWidgetLibraries (true, forceUnload);
}
- internal void UpdateWidgetLibraries (bool allowBackendRestart, bool forceUnload)
+ internal virtual void RestartBackend ()
{
- // Collect libraries from the project and from the application
-
- ArrayList assemblies = new ArrayList ();
- assemblies.AddRange (widgetLibraries);
-
- ArrayList projectBackends = new ArrayList ();
- foreach (Project p in projects)
- if (p.IsBackendLoaded)
- projectBackends.Add (p.ProjectBackend);
-
- if (!Backend.UpdateLibraries (assemblies, projectBackends, allowBackendRestart, forceUnload))
- {
- // The backend process needs to be restarted.
- // This is done in background.
-
- ThreadPool.QueueUserWorkItem (delegate {
- try {
- // Start the new backend
- ApplicationBackendController newController = new ApplicationBackendController (this, channelId);
- newController.StartBackend ();
- Gtk.Application.Invoke (newController, EventArgs.Empty, OnNewBackendStarted);
- } catch {
- // FIXME: show an error message
- }
- });
- }
}
-
- void OnNewBackendStarted (object ob, EventArgs args)
- {
- // The new backend is running, just do the switch
-
- OnBackendChanging ();
-
- ApplicationBackendController oldBackend = backendController;
- backendController = (ApplicationBackendController) ob;
-
- OnBackendChanged (true);
- // The old backend can now be safely stopped
- oldBackend.StopBackend (false);
- }
-
- void OnBackendStopped (object ob, EventArgs args)
+ protected void ClearCollections ()
{
- // The backend process crashed, try to restart it
- backend = null;
- backendController = new ApplicationBackendController (this, channelId);
- backendController.StartBackend ();
- OnBackendChanged (true);
- }
-
- void OnBackendChanged (bool notify)
- {
- ApplicationBackend oldBackend = backend;
-
- backend = backendController.Backend;
- backendController.Stopped += OnBackendStopped;
- UpdateWidgetLibraries (false, false);
lock (types) {
types.Clear ();
}
@@ -161,79 +242,70 @@
foreach (Component c in comps) {
c.Dispose ();
}
-
- if (notify && BackendChanged != null)
- BackendChanged (oldBackend);
-
- backend.ActiveProject = activeProject != null ? activeProject.ProjectBackend : null;
}
-
- void OnBackendChanging ()
+
+ internal void UpdateWidgetLibraries (bool allowBackendRestart, bool forceUnload)
{
- backend.GlobalWidgetLibraries = widgetLibraries;
- if (BackendChanging != null)
- BackendChanging ();
+ // Collect libraries from the project and from the application
+
+ ArrayList assemblies = new ArrayList ();
+ assemblies.AddRange (widgetLibraries);
+
+ ArrayList projectBackends = new ArrayList ();
+ foreach (Project p in projects)
+ if (p.IsBackendLoaded)
+ projectBackends.Add (p.ProjectBackend);
+
+ if (!Backend.UpdateLibraries (assemblies, projectBackends, allowBackendRestart, forceUnload))
+ RestartBackend ();
}
- internal string RegisterRemotingChannel (IsolationMode mode)
- {
- string remotingChannel;
- if (mode == IsolationMode.ProcessTcp) {
- remotingChannel = "tcp";
- IChannel ch = ChannelServices.GetChannel ("tcp");
- if (ch == null) {
- ChannelServices.RegisterChannel (new TcpChannel (0));
- }
- } else {
- remotingChannel = "unix";
- IChannel ch = ChannelServices.GetChannel ("unix");
- if (ch == null) {
- string unixRemotingFile = Path.GetTempFileName ();
- ChannelServices.RegisterChannel (new UnixChannel (unixRemotingFile));
- }
- }
- return remotingChannel;
- }
-
public virtual void Dispose ()
{
if (disposed)
return;
disposed = true;
- if (Disposing != null)
- Disposing (this, EventArgs.Empty);
- if (externalBackend) {
- backendController.StopBackend (true);
- } else {
- backend.Dispose ();
- }
+ ClearCollections ();
+ ArrayList copy = (ArrayList) projects.Clone ();
+ foreach (Project p in copy)
+ p.Dispose ();
+ if (propertiesWidget != null)
+ propertiesWidget.Destroy ();
+ if (paletteWidget != null)
+ paletteWidget.Destroy ();
+ if (projectWidget != null)
+ projectWidget.Destroy ();
+ if (signalsWidget != null)
+ signalsWidget.Destroy ();
+ widgetLibraries.Clear ();
System.Runtime.Remoting.RemotingServices.Disconnect (this);
}
- internal bool Disposed {
- get { return disposed; }
- }
-
public override object InitializeLifetimeService ()
{
// Will be disconnected when calling Dispose
return null;
}
- internal ApplicationBackend Backend {
- get {
- if (disposed)
- throw new InvalidOperationException ("Application has been disposed");
- return backend;
- }
+ internal ApplicationBackend Backend {
+ get { return backend; }
+ set { backend = value; }
}
+ void ProjectDisposed (object sender, EventArgs args)
+ {
+ projects.Remove (sender as Project);
+ if (!disposed)
+ UpdateWidgetLibraries (false, false);
+ }
+
public Project LoadProject (string path)
{
Project p = new Project (this);
p.Load (path);
projects.Add (p);
+ p.Disposed += ProjectDisposed;
return p;
}
@@ -241,6 +313,7 @@
{
Project p = new Project (this);
projects.Add (p);
+ p.Disposed += ProjectDisposed;
return p;
}
@@ -256,7 +329,7 @@
{
if (!widgetLibraries.Contains (assemblyPath)) {
widgetLibraries.Add (assemblyPath);
- Backend.GlobalWidgetLibraries = widgetLibraries;
+ Backend.GlobalWidgetLibraries = widgetLibraries;
UpdateWidgetLibraries (false, false);
}
}
@@ -264,7 +337,7 @@
public void RemoveWidgetLibrary (string assemblyPath)
{
widgetLibraries.Remove (assemblyPath);
- Backend.GlobalWidgetLibraries = widgetLibraries;
+ Backend.GlobalWidgetLibraries = widgetLibraries;
UpdateWidgetLibraries (false, false);
}
@@ -277,7 +350,7 @@
{
ImportContext ic = new ImportContext ();
ic.App = this.Backend;
- return Application.InternalIsWidgetLibrary (ic, assemblyRef);
+ return InternalIsWidgetLibrary (ic, assemblyRef);
}
internal static bool InternalIsWidgetLibrary (ImportContext ic, string assemblyRef)
@@ -294,22 +367,10 @@
if (path == null)
return false;
}
-
- LibraryData data = GetLibraryCacheData (path);
- if (data == null) {
- // There is no info about this library, it has to be checked
- bool isLib = CecilWidgetLibrary.IsWidgetLibrary (path);
- SetLibraryCacheData (path, isLib);
- return isLib;
- } else
- return data.IsLibrary;
+
+ return CecilWidgetLibrary.IsWidgetLibrary (path);
}
- internal void DisposeProject (Project p)
- {
- projects.Remove (p);
- }
-
public CodeGenerationResult GenerateProjectCode (string file, string namespaceName, CodeDomProvider provider, GenerationOptions options, params Project[] projects)
{
ArrayList files = new ArrayList ();
@@ -361,10 +422,6 @@
}
}
- internal bool UseExternalBackend {
- get { return externalBackend; }
- }
-
internal Project ActiveProject {
get { return activeProject; }
set {
@@ -383,32 +440,40 @@
public WidgetPropertyTree PropertiesWidget {
get {
- if (propertiesWidget == null)
+ if (propertiesWidget == null) {
propertiesWidget = new WidgetPropertyTree (this);
+ propertiesWidget.Destroyed += delegate { propertiesWidget = null; };
+ }
return propertiesWidget;
}
}
public Palette PaletteWidget {
get {
- if (paletteWidget == null)
+ if (paletteWidget == null) {
paletteWidget = new Palette (this);
+ paletteWidget.Destroyed += delegate { paletteWidget = null; };
+ }
return paletteWidget;
}
}
public WidgetTree WidgetTreeWidget {
get {
- if (projectWidget == null)
+ if (projectWidget == null) {
projectWidget = new WidgetTree (this);
+ projectWidget.Destroyed += delegate { projectWidget = null; };
+ }
return projectWidget;
}
}
public SignalsEditor SignalsWidget {
get {
- if (signalsWidget == null)
+ if (signalsWidget == null) {
signalsWidget = new SignalsEditor (this);
+ signalsWidget.Destroyed += delegate { signalsWidget = null; };
+ }
return signalsWidget;
}
}
@@ -436,6 +501,8 @@
}
}
+ internal abstract ComponentType CreateComponentType (string typeName);
+
internal ComponentType GetComponentType (string typeName)
{
lock (types) {
@@ -448,36 +515,7 @@
return t;
}
- string desc = null, className = null, category = null, targetGtkVersion = null, library = null;
- Gdk.Pixbuf px = null;
-
- if (externalBackend) {
- byte[] icon;
-
- if (Backend.GetClassDescriptorInfo (typeName, out desc, out className, out category, out targetGtkVersion, out library, out icon)) {
- if (icon != null)
- px = new Gdk.Pixbuf (icon);
- }
-
- if (px == null) {
- px = ComponentType.Unknown.Icon;
- }
-
- if (desc == null)
- desc = typeName;
- } else {
- ClassDescriptor cls = Registry.LookupClassByName (typeName);
- if (cls != null) {
- desc = cls.Label;
- className = cls.WrappedTypeName;
- category = cls.Category;
- targetGtkVersion = cls.TargetGtkVersion;
- px = cls.Icon;
- library = cls.Library.Name;
- }
- }
-
- t = new ComponentType (this, typeName, desc, className, category, targetGtkVersion, library, px);
+ t = CreateComponentType (typeName);
types [typeName] = t;
return t;
}
@@ -531,97 +569,6 @@
}
}
- static LibraryData GetLibraryCacheData (string path)
- {
- if (libraryCheckCache == null)
- LoadLibraryCheckCache ();
- LibraryData data = (LibraryData) libraryCheckCache [path];
- if (data == null)
- return null;
-
- DateTime lastWrite = File.GetLastWriteTime (path);
- if (data.LastCheck == lastWrite)
- return data;
- else
- // Data not valid anymore
- return null;
- }
-
- static void SetLibraryCacheData (string path, bool isLibrary)
- {
- if (libraryCheckCache == null)
- LoadLibraryCheckCache ();
-
- LibraryData data = (LibraryData) libraryCheckCache [path];
- if (data == null) {
- data = new LibraryData ();
- libraryCheckCache [path] = data;
- }
- data.IsLibrary = isLibrary;
- data.LastCheck = File.GetLastWriteTime (path);
- SaveLibraryCheckCache ();
- }
-
- static void LoadLibraryCheckCache ()
- {
- bool needsSave = false;;
- libraryCheckCache = new Hashtable ();
- string cacheFile = Path.Combine (ConfigDir, "assembly-check-cache");
- if (!File.Exists (cacheFile))
- return;
-
- try {
- XmlDocument doc = new XmlDocument ();
- doc.Load (cacheFile);
- foreach (XmlElement elem in doc.SelectNodes ("assembly-check-cache/assembly")) {
- string file = elem.GetAttribute ("path");
- if (File.Exists (file)) {
- LibraryData data = new LibraryData ();
- if (elem.GetAttribute ("isLibrary") == "yes")
- data.IsLibrary = true;
- data.LastCheck = XmlConvert.ToDateTime (elem.GetAttribute ("timestamp"), XmlDateTimeSerializationMode.Local);
- } else
- needsSave = true;
- }
- } catch {
- // If there is an error, just ignore the cached data
- needsSave = true;
- }
-
- if (needsSave)
- SaveLibraryCheckCache ();
- }
-
- static void SaveLibraryCheckCache ()
- {
- if (libraryCheckCache == null)
- return;
-
- try {
- if (!Directory.Exists (ConfigDir))
- Directory.CreateDirectory (ConfigDir);
-
- XmlDocument doc = new XmlDocument ();
- XmlElement delem = doc.CreateElement ("assembly-check-cache");
- doc.AppendChild (delem);
-
- foreach (DictionaryEntry e in libraryCheckCache) {
- LibraryData data = (LibraryData) e.Value;
- XmlElement elem = doc.CreateElement ("assembly");
- elem.SetAttribute ("path", (string) e.Key);
- if (data.IsLibrary)
- elem.SetAttribute ("isLibrary", "yes");
- elem.SetAttribute ("timestamp", XmlConvert.ToString (data.LastCheck, XmlDateTimeSerializationMode.Local));
- delem.AppendChild (elem);
- }
-
- doc.Save (Path.Combine (ConfigDir, "assembly-check-cache"));
- }
- catch {
- // If something goes wrong, just ignore the cached info
- }
- }
-
static string ConfigDir {
get {
string file = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), ".config");
@@ -632,10 +579,4 @@
internal delegate void BackendChangingHandler ();
internal delegate void BackendChangedHandler (ApplicationBackend oldBackend);
-
- class LibraryData
- {
- public DateTime LastCheck;
- public bool IsLibrary;
- }
}
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ApplicationBackendController.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ApplicationBackendController.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/ApplicationBackendController.cs (revision 112335)
@@ -15,13 +15,13 @@
bool stopping;
ApplicationBackend backend;
string channelId;
- Application app;
+ IsolatedApplication app;
ManualResetEvent runningEvent = new ManualResetEvent (false);
public event EventHandler Stopped;
- public ApplicationBackendController (Application app, string channelId)
+ public ApplicationBackendController (IsolatedApplication app, string channelId)
{
this.app = app;
this.channelId = channelId;
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/Project.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/Project.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/Project.cs (revision 112335)
@@ -54,8 +54,11 @@
backend.SetFrontend (this);
}
- app.BackendChanging += OnBackendChanging;
- app.BackendChanged += OnBackendChanged;
+ if (app is IsolatedApplication) {
+ IsolatedApplication iapp = app as IsolatedApplication;
+ iapp.BackendChanging += OnBackendChanging;
+ iapp.BackendChanged += OnBackendChanged;
+ }
}
internal ProjectBackend ProjectBackend {
@@ -80,10 +83,15 @@
get { return app; }
}
+ internal event EventHandler Disposed;
+
public void Dispose ()
{
- app.BackendChanging -= OnBackendChanging;
- app.BackendChanged -= OnBackendChanged;
+ if (app is IsolatedApplication) {
+ IsolatedApplication iapp = app as IsolatedApplication;
+ iapp.BackendChanging -= OnBackendChanging;
+ iapp.BackendChanged -= OnBackendChanged;
+ }
if (tmpProjectFile != null && File.Exists (tmpProjectFile)) {
File.Delete (tmpProjectFile);
@@ -91,9 +99,9 @@
}
if (backend != null)
backend.Dispose ();
- app.DisposeProject (this);
+ if (Disposed != null)
+ Disposed (this, EventArgs.Empty);
System.Runtime.Remoting.RemotingServices.Disconnect (this);
- app.UpdateWidgetLibraries (false, false);
}
public override object InitializeLifetimeService ()
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/PluggableWidget.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/PluggableWidget.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libsteticui/PluggableWidget.cs (revision 112335)
@@ -20,9 +20,9 @@
Add (book);
this.app = app;
- if (app.UseExternalBackend) {
- app.BackendChanged += OnBackendChanged;
- app.BackendChanging += OnBackendChanging;
+ if (app is IsolatedApplication) {
+ (app as IsolatedApplication).BackendChanged += OnBackendChanged;
+ (app as IsolatedApplication).BackendChanging += OnBackendChanging;
}
}
@@ -50,9 +50,9 @@
protected override void OnRealized ()
{
base.OnRealized ();
- if (!initialized && !app.Disposed) {
+ if (!initialized) {
initialized = true;
- if (app.UseExternalBackend)
+ if (app is IsolatedApplication)
ConnectPlug ();
else {
Gtk.Widget w = OnCreateWidget ();
@@ -64,7 +64,7 @@
protected override void OnUnrealized ()
{
- if (!app.Disposed && app.UseExternalBackend && initialized) {
+ if (app is IsolatedApplication && initialized) {
OnDestroyPlug (socket.Id);
initialized = false;
}
@@ -93,10 +93,10 @@
protected void UpdateWidget ()
{
- if (!initialized || app.Disposed)
+ if (!initialized)
return;
- if (!app.UseExternalBackend) {
+ if (app is LocalApplication) {
Gtk.Widget w = OnCreateWidget ();
if (w.Parent != book) {
book.AppendPage (w, null);
@@ -119,25 +119,24 @@
public override void Dispose ()
{
- if (app.UseExternalBackend) {
- app.BackendChanged -= OnBackendChanged;
- app.BackendChanging -= OnBackendChanging;
+ if (app is IsolatedApplication) {
+ IsolatedApplication iapp = app as IsolatedApplication;
+ iapp.BackendChanged -= OnBackendChanged;
+ iapp.BackendChanging -= OnBackendChanging;
}
base.Dispose ();
}
internal virtual void OnBackendChanged (ApplicationBackend oldBackend)
{
- if (!initialized || app.Disposed)
+ if (!initialized)
return;
- if (app.UseExternalBackend) {
- Gtk.Widget w = book.GetNthPage (0);
- book.RemovePage (0);
- w.Destroy ();
- socket.Dispose ();
- ConnectPlug ();
- }
+ Gtk.Widget w = book.GetNthPage (0);
+ book.RemovePage (0);
+ w.Destroy ();
+ socket.Dispose ();
+ ConnectPlug ();
}
internal virtual void OnBackendChanging ()
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/Widget.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/Widget.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/Widget.cs (revision 112335)
@@ -98,6 +98,9 @@
public override void Dispose ()
{
+ if (Wrapped == null)
+ return;
+
if (Project != null && Project.Selection == Wrapped)
Project.Selection = null;
@@ -109,6 +112,7 @@
if (actionGroups != null) {
foreach (ActionGroup ag in actionGroups)
ag.Dispose ();
+ actionGroups = null;
}
base.Dispose ();
}
@@ -213,7 +217,7 @@
public new Gtk.Widget Wrapped {
get {
- return (Gtk.Widget)base.Wrapped;
+ return base.Wrapped as Gtk.Widget;
}
}
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/Object.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/Object.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/Object.cs (revision 112335)
@@ -6,6 +6,8 @@
public override void Dispose ()
{
+ if (Wrapped == null)
+ return;
((GLib.Object)Wrapped).RemoveNotification (NotifyHandler);
base.Dispose ();
}
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/objects.xml
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/objects.xml (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/objects.xml (revision 112335)
@@ -215,8 +215,8 @@
<itemgroup label="Miscellaneous Alignment Properties">
<property name="Xpad" />
<property name="Ypad" />
- <property name="Xalign" />
- <property name="Yalign" />
+ <property name="Xalign" min="0.0" max="1.0" />
+ <property name="Yalign" min="0.0" max="1.0" />
<command name="AlignLeft" label="Align Left" icon="gtk-justify-left" />
<command name="AlignCenter" label="Align Center" icon="gtk-justify-center" />
<command name="AlignRight" label="Align Right" icon="gtk-justify-right" />
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/ActionToolbarWrapper.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/ActionToolbarWrapper.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/wrapper/ActionToolbarWrapper.cs (revision 112335)
@@ -52,6 +52,7 @@
{
base.Wrap (obj, initialized);
CreateTree ();
+ toolbar.FillMenu (actionTree);
}
public override bool HExpandable {
@@ -270,7 +271,7 @@
{
actionTree = new ActionTree ();
actionTree.Name = Wrapped.Name;
- actionTree.Type = Gtk.UIManagerItemType.Menubar;
+ actionTree.Type = Gtk.UIManagerItemType.Toolbar;
actionTree.Changed += OnTreeChanged;
}
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/editor/ActionMenuItem.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/editor/ActionMenuItem.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/editor/ActionMenuItem.cs (revision 112335)
@@ -42,8 +42,13 @@
CreateControls ();
}
+ bool disposed;
+
public override void Dispose ()
{
+ if (disposed)
+ return;
+ disposed = true;
if (menuBarItem != null) {
menuBarItem.ButtonPressEvent -= OnMenuItemPress;
menuBarItem.ButtonReleaseEvent -= OnMemuItemRelease;
@@ -289,6 +294,9 @@
public void Detach ()
{
+ if (disposed)
+ return;
+
Gtk.Table table = (Gtk.Table)Parent;
if (table == null)
return;
Index: src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/editor/ActionGroupEditor.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/editor/ActionGroupEditor.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/lib/stetic/libstetic/editor/ActionGroupEditor.cs (revision 112335)
@@ -16,6 +16,7 @@
EditableLabel headerLabel;
uint columns = 2;
bool modified;
+ bool disposed;
ObjectWrapperEventHandler changedEvent;
IDesignArea darea;
@@ -58,6 +59,9 @@
public override void Dispose ()
{
+ if (disposed)
+ return;
+ disposed = true;
headerLabel.Changed -= OnGroupNameChanged;
if (emptyLabel != null)
emptyLabel.ButtonPressEvent -= OnAddClicked;
@@ -100,7 +104,8 @@
foreach (Wrapper.Action a in actionGroup.Actions)
a.ObjectChanged += changedEvent;
}
- Fill ();
+ if (!disposed)
+ Fill ();
}
}
Index: src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs
===================================================================
--- src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs (revision 97933)
+++ src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs (revision 112335)
@@ -96,7 +96,7 @@
public static Stetic.Application SteticApp {
get {
if (steticApp == null) {
- steticApp = new Stetic.Application (IsolationMode);
+ steticApp = Stetic.ApplicationFactory.CreateApplication (Stetic.IsolationMode.None);
steticApp.AllowInProcLibraries = false;
steticApp.ShowNonContainerWarning = PropertyService.Get ("MonoDevelop.GtkCore.ShowNonContainerWarning", true);
steticApp.WidgetLibraryResolver = OnAssemblyResolve;
@@ -520,7 +520,7 @@
{
Gtk.Application.Init ();
- Stetic.Application app = new Stetic.Application (Stetic.IsolationMode.None);
+ Stetic.Application app = Stetic.ApplicationFactory.CreateApplication (Stetic.IsolationMode.None);
Stetic.Project[] projects = new Stetic.Project [projectFiles.Count];
for (int n=0; n < projectFiles.Count; n++) {
Index: src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs
===================================================================
--- src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs (revision 97933)
+++ src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Dialogs/CommitDialog.cs (revision 112335)
@@ -160,11 +160,5 @@
else
selected.Remove (vinfo.LocalPath);
}
-
- public override void Dispose ()
- {
- base.Dispose ();
- Destroy ();
- }
}
}
Index: src/addins/MonoDevelop.SourceEditor/MonoDevelop.SourceEditor.Gui/SourceEditorWidget.cs
===================================================================
--- src/addins/MonoDevelop.SourceEditor/MonoDevelop.SourceEditor.Gui/SourceEditorWidget.cs (revision 97933)
+++ src/addins/MonoDevelop.SourceEditor/MonoDevelop.SourceEditor.Gui/SourceEditorWidget.cs (revision 112335)
@@ -59,10 +59,10 @@
Add (View);
}
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
Buffer.Dispose ();
- base.Dispose ();
+ base.OnDestroyed ();
}
public void ExecutingAt (int linenumber)
Index: src/addins/MonoDevelop.SourceEditor/MonoDevelop.SourceEditor.Gui/SourceEditorView.cs
===================================================================
--- src/addins/MonoDevelop.SourceEditor/MonoDevelop.SourceEditor.Gui/SourceEditorView.cs (revision 97933)
+++ src/addins/MonoDevelop.SourceEditor/MonoDevelop.SourceEditor.Gui/SourceEditorView.cs (revision 112335)
@@ -262,7 +262,7 @@
InitAutoCorrectionValues();
}
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
if (showTipScheduled)
GLib.Source.Remove (tipTimeoutId);
@@ -272,7 +272,7 @@
buf.Changed -= new EventHandler (BufferChanged);
CleanAutoCorrectionValues();
- base.Dispose ();
+ base.OnDestroyed ();
}
public ITextEditorExtension AttachExtension (ITextEditorExtension extension)
Index: src/addins/NUnit/Services/NUnitService.cs
===================================================================
--- src/addins/NUnit/Services/NUnitService.cs (revision 97933)
+++ src/addins/NUnit/Services/NUnitService.cs (revision 112335)
@@ -107,7 +107,29 @@
return session;
}
+ public UnitTest SearchTest (string fullName)
+ {
+ return SearchTest (rootTest, fullName);
+ }
+ UnitTest SearchTest (UnitTest test, string fullName)
+ {
+ if (test == null)
+ return null;
+ if (test.FullName == fullName)
+ return test;
+
+ UnitTestGroup group = test as UnitTestGroup;
+ if (group != null) {
+ foreach (UnitTest t in group.Tests) {
+ UnitTest result = SearchTest (t, fullName);
+ if (result != null)
+ return result;
+ }
+ }
+ return null;
+ }
+
protected virtual void OnOpenCombine (object sender, CombineEventArgs e)
{
rootTest = BuildTest (e.Combine);
Index: src/addins/NUnit/Gui/TestResultsPad.cs
===================================================================
--- src/addins/NUnit/Gui/TestResultsPad.cs (revision 97933)
+++ src/addins/NUnit/Gui/TestResultsPad.cs (revision 112335)
@@ -143,6 +143,7 @@
buttonRun = new ToolButton (new Gtk.Image (Gtk.Stock.Execute, IconSize.Menu), GettextCatalog.GetString ("Run Test"));
buttonRun.IsImportant = true;
+ buttonRun.Sensitive = false;
toolbar.Insert (buttonRun, -1);
buttonStop = new ToolButton (Gtk.Stock.Stop);
@@ -242,6 +243,11 @@
testsFailed = 0;
testsIgnored = 0;
UpdateCounters ();
+ if (rootTest != null) {
+ rootTest = testService.SearchTest (rootTest.FullName);
+ if (rootTest == null)
+ buttonRun.Sensitive = false;
+ }
}
bool Running {
@@ -362,6 +368,8 @@
void OnRunClicked (object sender, EventArgs args)
{
+ if (rootTest == null)
+ return;
NUnitService testService = (NUnitService) ServiceManager.GetService (typeof(NUnitService));
testService.RunTest (rootTest);
}
Index: src/addins/MonoDevelop.RegexToolkit/MonoDevelop.RegexToolkit/RegexLibraryWindow.cs
===================================================================
--- src/addins/MonoDevelop.RegexToolkit/MonoDevelop.RegexToolkit/RegexLibraryWindow.cs (revision 97933)
+++ src/addins/MonoDevelop.RegexToolkit/MonoDevelop.RegexToolkit/RegexLibraryWindow.cs (revision 112335)
@@ -74,11 +74,6 @@
UpdateExpressions ();
}
- public override void Dispose ()
- {
- base.Dispose ();
- }
-
void ShowSelectedEntry ()
{
TreeIter iter;
Index: src/addins/MonoDevelop.RegexToolkit/MonoDevelop.RegexToolkit/RegexToolkitWindow.cs
===================================================================
--- src/addins/MonoDevelop.RegexToolkit/MonoDevelop.RegexToolkit/RegexToolkitWindow.cs (revision 97933)
+++ src/addins/MonoDevelop.RegexToolkit/MonoDevelop.RegexToolkit/RegexToolkitWindow.cs (revision 112335)
@@ -195,15 +195,10 @@
}
}
-
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
- base.Dispose ();
+ base.OnDestroyed ();
HideTooltipWindow ();
- if (regexLib != null) {
- regexLib.Destroy ();
- regexLib = null;
- }
}
Index: src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.Editor/POEditorWidget.cs
===================================================================
--- src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.Editor/POEditorWidget.cs (revision 97933)
+++ src/addins/MonoDevelop.Gettext/MonoDevelop.Gettext.Editor/POEditorWidget.cs (revision 112335)
@@ -507,13 +507,10 @@
}
#endregion
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
widgets.Remove (this);
- this.headersEditor.Destroy ();
- this.headersEditor = null;
-
- base.Dispose ();
+ base.OnDestroyed ();
}
}
}
Index: src/addins/CSharpBinding/Parser/CodeGenerator.cs
===================================================================
--- src/addins/CSharpBinding/Parser/CodeGenerator.cs (revision 97933)
+++ src/addins/CSharpBinding/Parser/CodeGenerator.cs (revision 112335)
@@ -33,6 +33,7 @@
using System.Drawing;
using System.CodeDom;
using System.Collections;
+using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.Text.RegularExpressions;
using Microsoft.CSharp;
@@ -485,13 +486,23 @@
bool IsExpectedClass (IClass type)
{
+ return IsExpectedClass (type, new Dictionary<string,string> ());
+ }
+
+ bool IsExpectedClass (IClass type, Dictionary<string,string> checkedTypes)
+ {
+ if (checkedTypes.ContainsKey (type.FullyQualifiedName))
+ return false;
+
if (type.FullyQualifiedName == declaringType.FullyQualifiedName)
return true;
+ checkedTypes [type.FullyQualifiedName] = type.FullyQualifiedName;
+
if (type.BaseTypes != null) {
foreach (IReturnType bc in type.BaseTypes) {
IClass bcls = ctx.ParserContext.GetClass (bc.FullyQualifiedName, bc.GenericArguments, true, true);
- if (bcls != null && IsExpectedClass (bcls))
+ if (bcls != null && IsExpectedClass (bcls, checkedTypes))
return true;
}
}
Index: src/core/MonoDevelop.Projects/MonoDevelop.Projects/BuildTool.cs
===================================================================
--- src/core/MonoDevelop.Projects/MonoDevelop.Projects/BuildTool.cs (revision 97933)
+++ src/core/MonoDevelop.Projects/MonoDevelop.Projects/BuildTool.cs (revision 112335)
@@ -50,10 +50,14 @@
ReadArgument (s);
if (help) {
- Console.WriteLine ("build [options] [project-file]");
- Console.WriteLine ("--f --buildfile:FILE Project or solution file to build.");
- Console.WriteLine ("--p --project:PROJECT Name of the project to build.");
+ Console.WriteLine ("build [options] [target]");
+ Console.WriteLine ("-f --buildfile:FILE Project or solution file to build.");
+ Console.WriteLine ("-p --project:PROJECT Name of the project to build.");
Console.WriteLine ();
+ Console.WriteLine ("Supported targets:");
+ Console.WriteLine (" build: build the project (the default target).");
+ Console.WriteLine (" clean: clean the project.");
+ Console.WriteLine ();
return 0;
}
Index: src/core/MonoDevelop.Core.Gui/MonoDevelop.Core.Gui.ProgressMonitoring/BaseProgressMonitor.cs
===================================================================
--- src/core/MonoDevelop.Core.Gui/MonoDevelop.Core.Gui.ProgressMonitoring/BaseProgressMonitor.cs (revision 97933)
+++ src/core/MonoDevelop.Core.Gui/MonoDevelop.Core.Gui.ProgressMonitoring/BaseProgressMonitor.cs (revision 112335)
@@ -151,6 +151,9 @@
[AsyncDispatch]
public virtual void Dispose()
{
+ // Make sure we are done with all pending calls
+ DispatchService.RunPendingEvents ();
+
lock (progressTracker) {
progressTracker.Done ();
if (c.waitEvent != null)
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateGroup.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateGroup.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateGroup.cs (revision 112335)
@@ -95,6 +95,8 @@
break;
}
}
+ else
+ break;
}
return result;
}
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs (revision 112335)
@@ -304,7 +304,8 @@
return false;
} else {
foreach (FileDescriptionTemplate newfile in Files)
- CreateFile (newfile, project, directory, language, name);
+ if (!CreateFile (newfile, project, directory, language, name))
+ return false;
return true;
}
}
@@ -322,11 +323,13 @@
return valid;
}
- protected virtual void CreateFile (FileDescriptionTemplate newfile, Project project, string directory, string language, string name)
+ protected virtual bool CreateFile (FileDescriptionTemplate newfile, Project project, string directory, string language, string name)
{
if (project != null) {
- newfile.AddToProject (project, language, directory, name);
- newfile.Show ();
+ if (newfile.AddToProject (project, language, directory, name)) {
+ newfile.Show ();
+ return true;
+ }
} else {
SingleFileDescriptionTemplate singleFile = newfile as SingleFileDescriptionTemplate;
if (singleFile == null)
@@ -334,7 +337,10 @@
if (directory != null) {
string fileName = singleFile.SaveFile (project, language, directory, name);
- IdeApp.Workbench.OpenDocument (fileName);
+ if (fileName != null) {
+ IdeApp.Workbench.OpenDocument (fileName);
+ return true;
+ }
} else {
string fileName = singleFile.GetFileName (project, language, directory, name);
Stream stream = singleFile.CreateFile (project, language, fileName);
@@ -352,8 +358,10 @@
mimeType = "text";
IdeApp.Workbench.NewDocument (fileName, mimeType, stream);
+ return true;
}
}
+ return false;
}
protected virtual bool IsValidForProject (Project project, string projectPath)
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs (revision 112335)
@@ -76,12 +76,24 @@
public abstract string Name { get; }
public abstract void Load (XmlElement filenode);
- public abstract void AddToProject (Project project, string language, string directory, string name);
+ public abstract bool AddToProject (Project project, string language, string directory, string name);
public abstract void Show ();
public virtual bool IsValidName (string name, string language)
{
- return (name.Length > 0);
+ if (name.Length > 0) {
+ if (language != null && language.Length > 0) {
+ IDotNetLanguageBinding binding = MonoDevelop.Projects.Services.Languages.GetBindingPerLanguageName (language) as IDotNetLanguageBinding;
+ if (binding != null) {
+ System.CodeDom.Compiler.CodeDomProvider provider = binding.GetCodeDomProvider ();
+ if (provider != null)
+ return provider.IsValidIdentifier (provider.CreateEscapedIdentifier (name));
+ }
+ }
+ return name.IndexOfAny (Path.GetInvalidFileNameChars ()) == -1;
+ }
+ else
+ return false;
}
public virtual bool SupportsProject (Project project, string projectPath)
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs (revision 112335)
@@ -87,9 +87,9 @@
set { addStandardHeader = value; }
}
- public sealed override void AddToProject (Project project, string language, string directory, string name)
+ public sealed override bool AddToProject (Project project, string language, string directory, string name)
{
- AddFileToProject (project, language, directory, name);
+ return AddFileToProject (project, language, directory, name) != null;
}
public ProjectFile AddFileToProject (Project project, string language, string directory, string name)
@@ -303,22 +303,5 @@
return tagsArr;
}
-
- public override bool IsValidName (string name, string language)
- {
- if (name.Length > 0) {
- if (language != null && language.Length > 0) {
- IDotNetLanguageBinding binding = GetLanguageBinding (language) as IDotNetLanguageBinding;
- if (binding != null) {
- System.CodeDom.Compiler.CodeDomProvider provider = binding.GetCodeDomProvider ();
- if (provider != null)
- return provider.IsValidIdentifier (provider.CreateEscapedIdentifier (name));
- }
- }
- return name.IndexOfAny (Path.GetInvalidFileNameChars ()) == -1;
- }
- else
- return false;
- }
}
}
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs (revision 112335)
@@ -52,10 +52,15 @@
}
}
- public override void AddToProject (Project project, string language, string directory, string name)
+ public override bool AddToProject (Project project, string language, string directory, string name)
{
ProjectFile file = template.AddFileToProject (project, language, directory, name);
- file.BuildAction = BuildAction.EmbedAsResource;
+ if (file != null) {
+ file.BuildAction = BuildAction.EmbedAsResource;
+ return true;
+ }
+ else
+ return false;
}
public override void Show ()
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs (revision 112335)
@@ -58,10 +58,13 @@
get { return name;}
}
- public override void AddToProject (Project project, string language, string directory, string nameNotUsed)
+ public override bool AddToProject (Project project, string language, string directory, string nameNotUsed)
{
- foreach (FileDescriptionTemplate fdt in innerTemplate.Files)
- fdt.AddToProject (project, language, directory, this.name);
+ foreach (FileDescriptionTemplate fdt in innerTemplate.Files) {
+ if (!fdt.AddToProject (project, language, directory, this.name))
+ return false;
+ }
+ return true;
}
public override void Show ()
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/SplashScreen.cs (revision 112335)
@@ -9,7 +9,7 @@
namespace MonoDevelop.Ide.Gui.Dialogs {
- public class SplashScreenForm : Gtk.Window, IProgressMonitor
+ public class SplashScreenForm : Gtk.Window, IProgressMonitor, IDisposable
{
static SplashScreenForm splashScreen;
static ProgressBar progress;
@@ -135,10 +135,9 @@
get { return this; }
}
- public override void Dispose ()
+ void IDisposable.Dispose ()
{
Destroy ();
- base.Dispose ();
}
}
}
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/FileSelectorDialog.cs (revision 112335)
@@ -301,14 +301,14 @@
FillViewers ();
}
- public override void Dispose ()
+ protected override void OnDestroyed ()
{
// Save active filter
string pattern = filterPairs[this.Filter.Name] as string;
if (pattern != null)
PropertyService.Set ("Monodevelop.FileSelector.LastPattern", pattern);
- base.Dispose ();
+ base.OnDestroyed ();
}
}
}
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/NewFileDialog.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/NewFileDialog.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/NewFileDialog.cs (revision 112335)
@@ -96,12 +96,6 @@
}
}
- public override void Dispose ()
- {
- Destroy ();
- base.Dispose ();
- }
-
void InitializeView()
{
PixbufList smalllist = new PixbufList();
Index: src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Gui.Dialogs.NewFileDialog.cs
===================================================================
--- src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Gui.Dialogs.NewFileDialog.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Gui.Dialogs.NewFileDialog.cs (revision 112335)
@@ -252,7 +252,7 @@
this.okButton.UseStock = true;
this.okButton.UseUnderline = true;
this.okButton.Label = "gtk-new";
- this.AddActionWidget(this.okButton, 0);
+ w21.Add(this.okButton);
Gtk.ButtonBox.ButtonBoxChild w23 = ((Gtk.ButtonBox.ButtonBoxChild)(w21[this.okButton]));
w23.Position = 1;
w23.Expand = false;
Index: src/core/MonoDevelop.Ide/gtk-gui/gui.stetic
===================================================================
--- src/core/MonoDevelop.Ide/gtk-gui/gui.stetic (revision 97933)
+++ src/core/MonoDevelop.Ide/gtk-gui/gui.stetic (revision 112335)
@@ -5991,7 +5991,7 @@
<property name="UseStock">True</property>
<property name="Type">StockItem</property>
<property name="StockId">gtk-new</property>
- <property name="ResponseId">0</property>
+ <property name="ResponseId">-1</property>
<property name="label">gtk-new</property>
</widget>
<packing>
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ProjectOperations.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ProjectOperations.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ProjectOperations.cs (revision 112335)
@@ -763,11 +763,14 @@
public void CreateProjectFile (Project parentProject, string basePath, string selectedTemplateId)
{
- using (NewFileDialog nfd = new NewFileDialog (parentProject, basePath)) {
+ NewFileDialog nfd = null;
+ try {
+ nfd = new NewFileDialog (parentProject, basePath);
if (selectedTemplateId != null)
nfd.SelectTemplate (selectedTemplateId);
nfd.Run ();
- nfd.Dispose ();
+ } finally {
+ if (nfd != null) nfd.Destroy ();
}
}
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs (revision 112335)
@@ -696,6 +696,17 @@
return pad;
return null;
}
+
+ internal void ReorderDocuments (int oldPlacement, int newPlacement)
+ {
+ IViewContent content = workbench.ViewContentCollection[oldPlacement];
+ workbench.InternalViewContentCollection.RemoveAt (oldPlacement);
+ workbench.InternalViewContentCollection.Insert (newPlacement, content);
+
+ Document doc = documents [oldPlacement];
+ documents.RemoveAt (oldPlacement);
+ documents.Insert (newPlacement, doc);
+ }
}
class FileInformation
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceLayout.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceLayout.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceLayout.cs (revision 112335)
@@ -251,12 +251,7 @@
void OnTabsReordered (Widget widget, int oldPlacement, int newPlacement)
{
- lock (workbench.ViewContentCollection) {
- IViewContent content = workbench.ViewContentCollection[oldPlacement];
- workbench.InternalViewContentCollection.RemoveAt (oldPlacement);
- workbench.InternalViewContentCollection.Insert (newPlacement, content);
-
- }
+ IdeApp.Workbench.ReorderDocuments (oldPlacement, newPlacement);
}
void OnContextChanged (object o, EventArgs e)
Index: src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs
===================================================================
--- src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs (revision 97933)
+++ src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs (revision 112335)
@@ -203,7 +203,7 @@
{
for (int i = 0; i < tasks.Count; ++i) {
Task curTask = tasks[i];
- if (Path.GetFullPath (curTask.FileName) == Path.GetFullPath (e.OldName)) {
+ if (!string.IsNullOrEmpty (curTask.FileName) && Path.GetFullPath (curTask.FileName) == Path.GetFullPath (e.OldName)) {
Remove (curTask);
curTask.FileName = Path.GetFullPath (e.NewName);
Add (curTask);
Index: src/core/MonoDevelop.Components/MonoDevelop.Components/FileSelector.cs
===================================================================
--- src/core/MonoDevelop.Components/MonoDevelop.Components/FileSelector.cs (revision 97933)
+++ src/core/MonoDevelop.Components/MonoDevelop.Components/FileSelector.cs (revision 112335)
@@ -97,12 +97,6 @@
{
PropertyService.Set (LastPathProperty, this.CurrentFolder);
}
-
- public override void Dispose ()
- {
- base.Dispose ();
- Destroy ();
- }
}
}
Index: src/core/MonoDevelop.Components/MonoDevelop.Components/FileEntry.cs
===================================================================
--- src/core/MonoDevelop.Components/MonoDevelop.Components/FileEntry.cs (revision 97933)
+++ src/core/MonoDevelop.Components/MonoDevelop.Components/FileEntry.cs (revision 112335)
@@ -51,11 +51,11 @@
int response = fd.Run ();
if (response == (int) ResponseType.Ok) {
- fd.Hide ();
+ fd.Destroy ();
return fd.Filename;
}
- fd.Hide ();
+ fd.Destroy ();
return null;
}
Index: src/core/MonoDevelop.Components/MonoDevelop.Components.Commands/CommandManager.cs
===================================================================
--- src/core/MonoDevelop.Components/MonoDevelop.Components.Commands/CommandManager.cs (revision 97933)
+++ src/core/MonoDevelop.Components/MonoDevelop.Components.Commands/CommandManager.cs (revision 112335)
@@ -390,11 +390,6 @@
public void ShowContextMenu (Gtk.Menu menu)
{
menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime);
- menu.Hidden += delegate {
- // Needed to make sure the menu entries are destroyed and
- // can't handle accelerators
- menu.Destroy ();
- };
}
public void ShowContextMenu (Gtk.Menu menu, object initialCommandTarget)
Index: src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ProcessWrapper.cs
===================================================================
--- src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ProcessWrapper.cs (revision 97933)
+++ src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ProcessWrapper.cs (revision 112335)
@@ -50,11 +50,12 @@
private void CaptureOutput ()
{
try {
- string s;
+ char[] buffer = new char [1000];
if (OutputStreamChanged != null) {
- while ((s = StandardOutput.ReadLine()) != null) {
+ int nr;
+ while ((nr = StandardOutput.Read (buffer, 0, buffer.Length)) > 0) {
if (OutputStreamChanged != null)
- OutputStreamChanged (this, s);
+ OutputStreamChanged (this, new string (buffer, 0, nr));
}
}
} finally {
@@ -65,11 +66,12 @@
private void CaptureError ()
{
try {
- string s;
+ char[] buffer = new char [1000];
if (ErrorStreamChanged != null) {
- while ((s = StandardError.ReadLine()) != null) {
+ int nr;
+ while ((nr = StandardError.Read (buffer, 0, buffer.Length)) > 0) {
if (ErrorStreamChanged != null)
- ErrorStreamChanged (this, s);
+ ErrorStreamChanged (this, new string (buffer, 0, nr));
}
}
} finally {
Index: src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ProcessService.cs
===================================================================
--- src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ProcessService.cs (revision 97933)
+++ src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ProcessService.cs (revision 112335)
@@ -357,7 +357,7 @@
public void WriteOut (object sender, string s)
{
- writer.WriteLine (s);
+ writer.Write (s);
}
public static ProcessEventHandler GetWriteHandler (TextWriter tw)