// // // // // $Revision$ // using System; using System.Drawing; using System.Collections; using System.Collections.Generic; using System.Windows.Forms; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop.Project.Dialogs { /// /// Description of ProjectOptionsControl. /// public class ProjectOptionsView : AbstractViewContent { List descriptors = new List(); TabControl tabControl = new TabControl(); IProject project; public IProject Project { get { return project; } } public override string TitleName { get { return project.Name; } } public override string FileName { get { return project.FileName; } set { // possible when project is renamed by the user, project.FileName will be changed by the // renaming code OnTitleNameChanged(EventArgs.Empty); } } public override Control Control { get { return tabControl; } } public ProjectOptionsView(AddInTreeNode node, IProject project) { this.project = project; // tabControl.Alignment = TabAlignment.Left; tabControl.HandleCreated += TabControlHandleCreated; AddOptionPanels(node.BuildChildItems(this)); } void TabControlHandleCreated(object sender, EventArgs e) { // I didn't check if this is visual styles related, but // docking the controls into the tab pages only works correctly // AFTER the tab control has been shown. (.NET 2.0 beta 2) // therefore call it after the current winforms event has been processed using BeginInvoke. tabControl.HandleCreated -= TabControlHandleCreated; tabControl.BeginInvoke(new MethodInvoker(DockControlsInPages)); } void DockControlsInPages() { foreach (TabPage page in tabControl.TabPages) { foreach (Control ctl in page.Controls) { ctl.Dock = DockStyle.Fill; } } } void AddOptionPanels(ArrayList dialogPanelDescriptors) { Properties newProperties = new Properties(); newProperties.Set("Project", project); foreach (IDialogPanelDescriptor descriptor in dialogPanelDescriptors) { descriptors.Add(descriptor); if (descriptor != null && descriptor.DialogPanel != null && descriptor.DialogPanel.Control != null) { // may be null, if it is only a "path" descriptor.DialogPanel.CustomizationObject = newProperties; descriptor.DialogPanel.ReceiveDialogMessage(DialogMessage.Activated); ICanBeDirty dirtyable = descriptor.DialogPanel as ICanBeDirty; if (dirtyable != null) { dirtyable.DirtyChanged += PanelDirtyChanged; } TabPage page = new TabPage(descriptor.Label); page.UseVisualStyleBackColor = true; page.Controls.Add(descriptor.DialogPanel.Control); tabControl.TabPages.Add(page); } if (descriptor.ChildDialogPanelDescriptors != null) { AddOptionPanels(descriptor.ChildDialogPanelDescriptors); } } // re-evaluate dirty because option pages can be dirty when they are newly loaded PanelDirtyChanged(null, null); } void PanelDirtyChanged(object sender, EventArgs e) { bool dirty = false; foreach (IDialogPanelDescriptor descriptor in descriptors) { if (descriptor != null) { // may be null, if it is only a "path" ICanBeDirty dirtyable = descriptor.DialogPanel as ICanBeDirty; if (dirtyable != null) { dirty |= dirtyable.IsDirty; } } } this.IsDirty = dirty; } public override void Load(string fileName) { // TODO: reload project file } public override void Save(string fileName) { foreach (IDialogPanelDescriptor pane in descriptors) { ICanBeDirty dirtyable = pane.DialogPanel as ICanBeDirty; if (dirtyable != null) { if (!dirtyable.IsDirty) continue; // skip unchanged panels } pane.DialogPanel.ReceiveDialogMessage(DialogMessage.OK); } project.Save(); } } }