/// <summary> /// Opens a new designer for the specified file, or returns an existing /// editor for this file. /// </summary> /// <param name="file"></param> /// <returns></returns> public IDesigner OpenDesigner(File file) { // Search through our existing designers to see if there's // already a designer open for this file. foreach (IDesigner d in this.m_Designers) { if (d.File.FileInfo.FullName == file.FileInfo.FullName) { if (this.DesignerRefocused != null) { this.DesignerRefocused(this, new DesignerEventArgs(d)); } return(d); } } // Ensure that FileInfo property is valid (if it is not, then we // are dealing with a non-file). if (file.FileInfo == null) { return(null); } // Detect the type of designer to create by the file's extension. Type t = Central.Platform.GetDesignerTypeImplementing(Associations.GetDesignerType(file.FileInfo.Extension.Substring(1))); if (t == null) { Central.Platform.UI.ShowMessage("There is no designer associated with this file type.", "No Designer", MessageBoxButtons.OK); return(null); } // Invoke the constructor. IDesigner ds = t.GetConstructor(new Type[] { typeof(File) }).Invoke(new object[] { file as object }) as IDesigner; ds.Closed += (sender, e) => { if (this.DesignerClosed != null) { this.DesignerClosed(this, new DesignerEventArgs(ds)); } this.m_Designers.Remove(ds); }; ds.Opened += (sender, e) => { if (this.DesignerOpened != null) { this.DesignerOpened(this, new DesignerEventArgs(ds)); } }; this.m_Designers.Add(ds); if (this.DesignerCreated != null) { this.DesignerCreated(this, new DesignerEventArgs(ds)); } return(ds); }