#region Disclaimer / License // Copyright (C) 2006, Kenneth Skovhede // http://www.hexad.dk, opensource@hexad.dk // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // #endregion using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace OSGeo.MapGuide.Maestro { /// /// Summary description for FormMain. /// public class FormMain : System.Windows.Forms.Form { private OSGeo.MapGuide.MaestroAPI.ServerConnectionI m_connection; private Hashtable m_userControls = new Hashtable(); private System.Windows.Forms.Panel panLeftTree; private System.Windows.Forms.Panel panInnerRight; private System.Windows.Forms.Panel panOuter; private System.Windows.Forms.Splitter splitter1; public System.Windows.Forms.TabControl tabItems; private System.Windows.Forms.ContextMenu NewResourceMenu; private System.Windows.Forms.ContextMenu TreeContextMenu; private System.Windows.Forms.MenuItem PropertiesMenu; private System.Windows.Forms.MenuItem SaveXmlAsMenu; private System.Windows.Forms.ImageList toolbarImages; private System.ComponentModel.IContainer components; private System.Windows.Forms.TreeView ResourceTree; private System.Windows.Forms.ToolBar ResourceTreeToolbar; private System.Windows.Forms.ToolBarButton ResourceTreeCopy; private System.Windows.Forms.ToolBarButton ResourceTreeCut; private System.Windows.Forms.ToolBarButton ResourceTreePaste; private System.Windows.Forms.ToolBarButton toolBarButton1; private System.Windows.Forms.ImageList toolbarImagesSmall; private System.Windows.Forms.ToolBarButton toolBarButton2; private System.Windows.Forms.ToolBar toolBar2; private System.Windows.Forms.ToolBarButton SaveResourceButton; private System.Windows.Forms.ToolBarButton SaveResourceAsButton; private System.Windows.Forms.ToolBarButton EditAsXmlButton; private System.Windows.Forms.ToolBarButton toolBarButton4; private System.Windows.Forms.ToolBarButton AddResourceButton; private System.Windows.Forms.ToolBarButton DeleteResourceButton; private System.Windows.Forms.ToolBarButton ResourceTreeRefreshButton; private Hashtable m_templateMenuIndex = null; private TreeNode m_clipboardBuffer = null; private System.Windows.Forms.ToolBarButton AddFolderButton; private System.Windows.Forms.ToolBarButton toolBarButton3; private System.Windows.Forms.ToolBarButton ClosePageButton; private bool m_clipboardCut = false; private SortedList m_Folders = null; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem7; private System.Windows.Forms.MenuItem EditAsXmlMenu; private System.Windows.Forms.MenuItem LoadFromXmlMenu; private System.Windows.Forms.MenuItem CutMenu; private System.Windows.Forms.MenuItem CopyMenu; private System.Windows.Forms.MenuItem PasteMenu; private System.Windows.Forms.Timer KeepAliveTimer; private SortedList m_Documents = null; private System.Windows.Forms.ToolBarButton PreviewButton; private System.Windows.Forms.MainMenu MainMenu; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.MenuItem menuItem3; private System.Windows.Forms.MenuItem menuItem11; private System.Windows.Forms.MenuItem menuItem17; private System.Windows.Forms.MenuItem menuItem20; private System.Windows.Forms.MenuItem menuItem22; private System.Windows.Forms.MenuItem MainMenuNew; private System.Windows.Forms.MenuItem MainMenuOpen; private System.Windows.Forms.MenuItem MainMenuClose; private System.Windows.Forms.MenuItem MainMenuSave; private System.Windows.Forms.MenuItem MainMenuSaveAs; private System.Windows.Forms.MenuItem MainMenuSaveAll; private System.Windows.Forms.MenuItem MainMenuSaveAsXml; private System.Windows.Forms.MenuItem MainMenuLoadFromXml; private System.Windows.Forms.MenuItem MainMenuChangeServer; private System.Windows.Forms.MenuItem MainMenuExit; private System.Windows.Forms.MenuItem MainMenuCopy; private System.Windows.Forms.MenuItem MainMenuPaste; private System.Windows.Forms.MenuItem MainMenuAbout; private System.Windows.Forms.MenuItem MainMenuEditAsXml; private System.Windows.Forms.MenuItem MainMenuEdit; private System.Windows.Forms.MenuItem MainMenuCut; private System.Windows.Forms.MenuItem menuItem4; private System.Windows.Forms.MenuItem DeleteMenu; private System.Windows.Forms.MenuItem NewMenu; private ResourceEditorMap m_editors; private System.Windows.Forms.MenuItem OpenSiteAdmin; private Globalizator.Globalizator m_globalizor = null; private string m_lastSelectedNode = null; public FormMain() { // // Required for Windows Form Designer support // InitializeComponent(); //Re-assign to fix mono bug with button sizes ImageList tmp = ResourceTreeToolbar.ImageList; ResourceTreeToolbar.ImageList = null; ResourceTreeToolbar.ImageList = tmp; m_globalizor = new Globalizator.Globalizator(this); } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(FormMain)); this.ResourceTree = new System.Windows.Forms.TreeView(); this.TreeContextMenu = new System.Windows.Forms.ContextMenu(); this.PropertiesMenu = new System.Windows.Forms.MenuItem(); this.menuItem7 = new System.Windows.Forms.MenuItem(); this.EditAsXmlMenu = new System.Windows.Forms.MenuItem(); this.LoadFromXmlMenu = new System.Windows.Forms.MenuItem(); this.SaveXmlAsMenu = new System.Windows.Forms.MenuItem(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.CutMenu = new System.Windows.Forms.MenuItem(); this.CopyMenu = new System.Windows.Forms.MenuItem(); this.PasteMenu = new System.Windows.Forms.MenuItem(); this.menuItem4 = new System.Windows.Forms.MenuItem(); this.DeleteMenu = new System.Windows.Forms.MenuItem(); this.NewMenu = new System.Windows.Forms.MenuItem(); this.panLeftTree = new System.Windows.Forms.Panel(); this.ResourceTreeToolbar = new System.Windows.Forms.ToolBar(); this.AddResourceButton = new System.Windows.Forms.ToolBarButton(); this.AddFolderButton = new System.Windows.Forms.ToolBarButton(); this.DeleteResourceButton = new System.Windows.Forms.ToolBarButton(); this.toolBarButton2 = new System.Windows.Forms.ToolBarButton(); this.ResourceTreeCopy = new System.Windows.Forms.ToolBarButton(); this.ResourceTreeCut = new System.Windows.Forms.ToolBarButton(); this.ResourceTreePaste = new System.Windows.Forms.ToolBarButton(); this.toolBarButton1 = new System.Windows.Forms.ToolBarButton(); this.ResourceTreeRefreshButton = new System.Windows.Forms.ToolBarButton(); this.toolbarImages = new System.Windows.Forms.ImageList(this.components); this.panInnerRight = new System.Windows.Forms.Panel(); this.toolBar2 = new System.Windows.Forms.ToolBar(); this.SaveResourceButton = new System.Windows.Forms.ToolBarButton(); this.SaveResourceAsButton = new System.Windows.Forms.ToolBarButton(); this.toolBarButton4 = new System.Windows.Forms.ToolBarButton(); this.PreviewButton = new System.Windows.Forms.ToolBarButton(); this.EditAsXmlButton = new System.Windows.Forms.ToolBarButton(); this.toolBarButton3 = new System.Windows.Forms.ToolBarButton(); this.ClosePageButton = new System.Windows.Forms.ToolBarButton(); this.tabItems = new System.Windows.Forms.TabControl(); this.panOuter = new System.Windows.Forms.Panel(); this.splitter1 = new System.Windows.Forms.Splitter(); this.NewResourceMenu = new System.Windows.Forms.ContextMenu(); this.toolbarImagesSmall = new System.Windows.Forms.ImageList(this.components); this.KeepAliveTimer = new System.Windows.Forms.Timer(this.components); this.MainMenu = new System.Windows.Forms.MainMenu(); this.menuItem2 = new System.Windows.Forms.MenuItem(); this.MainMenuNew = new System.Windows.Forms.MenuItem(); this.MainMenuOpen = new System.Windows.Forms.MenuItem(); this.MainMenuClose = new System.Windows.Forms.MenuItem(); this.menuItem17 = new System.Windows.Forms.MenuItem(); this.MainMenuSave = new System.Windows.Forms.MenuItem(); this.MainMenuSaveAs = new System.Windows.Forms.MenuItem(); this.MainMenuSaveAll = new System.Windows.Forms.MenuItem(); this.menuItem11 = new System.Windows.Forms.MenuItem(); this.MainMenuEditAsXml = new System.Windows.Forms.MenuItem(); this.MainMenuSaveAsXml = new System.Windows.Forms.MenuItem(); this.MainMenuLoadFromXml = new System.Windows.Forms.MenuItem(); this.menuItem20 = new System.Windows.Forms.MenuItem(); this.MainMenuChangeServer = new System.Windows.Forms.MenuItem(); this.OpenSiteAdmin = new System.Windows.Forms.MenuItem(); this.menuItem22 = new System.Windows.Forms.MenuItem(); this.MainMenuExit = new System.Windows.Forms.MenuItem(); this.MainMenuEdit = new System.Windows.Forms.MenuItem(); this.MainMenuCut = new System.Windows.Forms.MenuItem(); this.MainMenuCopy = new System.Windows.Forms.MenuItem(); this.MainMenuPaste = new System.Windows.Forms.MenuItem(); this.menuItem3 = new System.Windows.Forms.MenuItem(); this.MainMenuAbout = new System.Windows.Forms.MenuItem(); this.panLeftTree.SuspendLayout(); this.panInnerRight.SuspendLayout(); this.panOuter.SuspendLayout(); this.SuspendLayout(); // // ResourceTree // this.ResourceTree.AllowDrop = true; this.ResourceTree.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.ResourceTree.ContextMenu = this.TreeContextMenu; this.ResourceTree.ImageIndex = -1; this.ResourceTree.LabelEdit = true; this.ResourceTree.Location = new System.Drawing.Point(8, 48); this.ResourceTree.Name = "ResourceTree"; this.ResourceTree.SelectedImageIndex = -1; this.ResourceTree.Size = new System.Drawing.Size(288, 396); this.ResourceTree.TabIndex = 0; this.ResourceTree.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ResourceTree_MouseDown); this.ResourceTree.DragOver += new System.Windows.Forms.DragEventHandler(this.ResourceTree_DragOver); this.ResourceTree.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ResourceTree_KeyUp); this.ResourceTree.DoubleClick += new System.EventHandler(this.ResourceTree_DoubleClick); this.ResourceTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.ResourceTree_AfterSelect); this.ResourceTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.ResourceTree_AfterLabelEdit); this.ResourceTree.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.ResourceTree_ItemDrag); this.ResourceTree.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.ResourceTree_BeforeLabelEdit); this.ResourceTree.DragDrop += new System.Windows.Forms.DragEventHandler(this.ResourceTree_DragDrop); // // TreeContextMenu // this.TreeContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.PropertiesMenu, this.menuItem7, this.EditAsXmlMenu, this.LoadFromXmlMenu, this.SaveXmlAsMenu, this.menuItem1, this.CutMenu, this.CopyMenu, this.PasteMenu, this.menuItem4, this.DeleteMenu, this.NewMenu}); this.TreeContextMenu.Popup += new System.EventHandler(this.TreeContextMenu_Popup); // // PropertiesMenu // this.PropertiesMenu.Index = 0; this.PropertiesMenu.Text = "Properties"; // // menuItem7 // this.menuItem7.Index = 1; this.menuItem7.Text = "-"; // // EditAsXmlMenu // this.EditAsXmlMenu.Index = 2; this.EditAsXmlMenu.Text = "Edit as xml"; this.EditAsXmlMenu.Click += new System.EventHandler(this.EditAsXmlMenu_Click); // // LoadFromXmlMenu // this.LoadFromXmlMenu.Index = 3; this.LoadFromXmlMenu.Text = "Load from Xml..."; this.LoadFromXmlMenu.Click += new System.EventHandler(this.LoadFromXmlMenu_Click); // // SaveXmlAsMenu // this.SaveXmlAsMenu.Index = 4; this.SaveXmlAsMenu.Text = "Save Xml As..."; this.SaveXmlAsMenu.Click += new System.EventHandler(this.SaveXmlAsMenu_Click); // // menuItem1 // this.menuItem1.Index = 5; this.menuItem1.Text = "-"; // // CutMenu // this.CutMenu.Index = 6; this.CutMenu.Shortcut = System.Windows.Forms.Shortcut.CtrlX; this.CutMenu.Text = "Cut"; this.CutMenu.Click += new System.EventHandler(this.CutMenu_Click); // // CopyMenu // this.CopyMenu.Index = 7; this.CopyMenu.Shortcut = System.Windows.Forms.Shortcut.CtrlC; this.CopyMenu.Text = "Copy"; this.CopyMenu.Click += new System.EventHandler(this.CopyMenu_Click); // // PasteMenu // this.PasteMenu.Index = 8; this.PasteMenu.Shortcut = System.Windows.Forms.Shortcut.CtrlV; this.PasteMenu.Text = "Paste"; this.PasteMenu.Click += new System.EventHandler(this.PasteMenu_Click); // // menuItem4 // this.menuItem4.Index = 9; this.menuItem4.Text = "-"; // // DeleteMenu // this.DeleteMenu.Index = 10; this.DeleteMenu.Text = "Delete"; this.DeleteMenu.Click += new System.EventHandler(this.DeleteMenu_Click); // // NewMenu // this.NewMenu.Index = 11; this.NewMenu.Text = "New"; // // panLeftTree // this.panLeftTree.Controls.Add(this.ResourceTreeToolbar); this.panLeftTree.Controls.Add(this.ResourceTree); this.panLeftTree.Dock = System.Windows.Forms.DockStyle.Left; this.panLeftTree.Location = new System.Drawing.Point(0, 0); this.panLeftTree.Name = "panLeftTree"; this.panLeftTree.Size = new System.Drawing.Size(296, 454); this.panLeftTree.TabIndex = 2; // // ResourceTreeToolbar // this.ResourceTreeToolbar.Appearance = System.Windows.Forms.ToolBarAppearance.Flat; this.ResourceTreeToolbar.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] { this.AddResourceButton, this.AddFolderButton, this.DeleteResourceButton, this.toolBarButton2, this.ResourceTreeCopy, this.ResourceTreeCut, this.ResourceTreePaste, this.toolBarButton1, this.ResourceTreeRefreshButton}); this.ResourceTreeToolbar.DropDownArrows = true; this.ResourceTreeToolbar.ImageList = this.toolbarImages; this.ResourceTreeToolbar.Location = new System.Drawing.Point(0, 0); this.ResourceTreeToolbar.Name = "ResourceTreeToolbar"; this.ResourceTreeToolbar.ShowToolTips = true; this.ResourceTreeToolbar.Size = new System.Drawing.Size(296, 44); this.ResourceTreeToolbar.TabIndex = 1; this.ResourceTreeToolbar.TextAlign = System.Windows.Forms.ToolBarTextAlign.Right; this.ResourceTreeToolbar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.ResourceTreeToolbar_ButtonClick); // // AddResourceButton // this.AddResourceButton.ImageIndex = 4; this.AddResourceButton.ToolTipText = "Creates a new resource"; // // AddFolderButton // this.AddFolderButton.ImageIndex = 10; this.AddFolderButton.ToolTipText = "Creates a new folder"; // // DeleteResourceButton // this.DeleteResourceButton.Enabled = false; this.DeleteResourceButton.ImageIndex = 5; this.DeleteResourceButton.ToolTipText = "Deletes the selected resource or folder"; // // toolBarButton2 // this.toolBarButton2.Style = System.Windows.Forms.ToolBarButtonStyle.Separator; // // ResourceTreeCopy // this.ResourceTreeCopy.Enabled = false; this.ResourceTreeCopy.ImageIndex = 0; this.ResourceTreeCopy.ToolTipText = "Copies the current resource or folder to the clipboard"; // // ResourceTreeCut // this.ResourceTreeCut.Enabled = false; this.ResourceTreeCut.ImageIndex = 1; this.ResourceTreeCut.ToolTipText = "Cuts the current resource or folder to the clipboard"; // // ResourceTreePaste // this.ResourceTreePaste.Enabled = false; this.ResourceTreePaste.ImageIndex = 2; this.ResourceTreePaste.ToolTipText = "Pastes the current content of the clipboard"; // // toolBarButton1 // this.toolBarButton1.Style = System.Windows.Forms.ToolBarButtonStyle.Separator; // // ResourceTreeRefreshButton // this.ResourceTreeRefreshButton.ImageIndex = 3; this.ResourceTreeRefreshButton.ToolTipText = "Refreshes the tree to match the current server state"; // // toolbarImages // this.toolbarImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; this.toolbarImages.ImageSize = new System.Drawing.Size(32, 32); this.toolbarImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("toolbarImages.ImageStream"))); this.toolbarImages.TransparentColor = System.Drawing.Color.Transparent; // // panInnerRight // this.panInnerRight.Controls.Add(this.toolBar2); this.panInnerRight.Controls.Add(this.tabItems); this.panInnerRight.Dock = System.Windows.Forms.DockStyle.Fill; this.panInnerRight.Location = new System.Drawing.Point(304, 0); this.panInnerRight.Name = "panInnerRight"; this.panInnerRight.Size = new System.Drawing.Size(400, 454); this.panInnerRight.TabIndex = 3; // // toolBar2 // this.toolBar2.Appearance = System.Windows.Forms.ToolBarAppearance.Flat; this.toolBar2.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] { this.SaveResourceButton, this.SaveResourceAsButton, this.toolBarButton4, this.PreviewButton, this.EditAsXmlButton, this.toolBarButton3, this.ClosePageButton}); this.toolBar2.DropDownArrows = true; this.toolBar2.ImageList = this.toolbarImages; this.toolBar2.Location = new System.Drawing.Point(0, 0); this.toolBar2.Name = "toolBar2"; this.toolBar2.ShowToolTips = true; this.toolBar2.Size = new System.Drawing.Size(400, 44); this.toolBar2.TabIndex = 2; this.toolBar2.TextAlign = System.Windows.Forms.ToolBarTextAlign.Right; this.toolBar2.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar2_ButtonClick); // // SaveResourceButton // this.SaveResourceButton.ImageIndex = 6; this.SaveResourceButton.ToolTipText = "Saves the current resource"; // // SaveResourceAsButton // this.SaveResourceAsButton.ImageIndex = 7; this.SaveResourceAsButton.ToolTipText = "Saves the current resource under a different name"; // // toolBarButton4 // this.toolBarButton4.Style = System.Windows.Forms.ToolBarButtonStyle.Separator; // // PreviewButton // this.PreviewButton.ImageIndex = 12; this.PreviewButton.ToolTipText = "Preview the item"; // // EditAsXmlButton // this.EditAsXmlButton.ImageIndex = 8; this.EditAsXmlButton.ToolTipText = "Edits the current resource in an xml editor"; // // toolBarButton3 // this.toolBarButton3.Style = System.Windows.Forms.ToolBarButtonStyle.Separator; // // ClosePageButton // this.ClosePageButton.ImageIndex = 11; this.ClosePageButton.ToolTipText = "Close the current page"; // // tabItems // this.tabItems.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tabItems.ItemSize = new System.Drawing.Size(0, 18); this.tabItems.Location = new System.Drawing.Point(0, 48); this.tabItems.Name = "tabItems"; this.tabItems.SelectedIndex = 0; this.tabItems.Size = new System.Drawing.Size(392, 396); this.tabItems.TabIndex = 1; // // panOuter // this.panOuter.Controls.Add(this.panInnerRight); this.panOuter.Controls.Add(this.splitter1); this.panOuter.Controls.Add(this.panLeftTree); this.panOuter.Dock = System.Windows.Forms.DockStyle.Fill; this.panOuter.Location = new System.Drawing.Point(0, 0); this.panOuter.Name = "panOuter"; this.panOuter.Size = new System.Drawing.Size(704, 454); this.panOuter.TabIndex = 5; // // splitter1 // this.splitter1.Location = new System.Drawing.Point(296, 0); this.splitter1.Name = "splitter1"; this.splitter1.Size = new System.Drawing.Size(8, 454); this.splitter1.TabIndex = 3; this.splitter1.TabStop = false; // // toolbarImagesSmall // this.toolbarImagesSmall.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; this.toolbarImagesSmall.ImageSize = new System.Drawing.Size(16, 16); this.toolbarImagesSmall.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("toolbarImagesSmall.ImageStream"))); this.toolbarImagesSmall.TransparentColor = System.Drawing.Color.Transparent; // // KeepAliveTimer // this.KeepAliveTimer.Interval = 300000; this.KeepAliveTimer.Tick += new System.EventHandler(this.KeepAliveTimer_Tick); // // MainMenu // this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem2, this.MainMenuEdit, this.menuItem3}); // // menuItem2 // this.menuItem2.Index = 0; this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.MainMenuNew, this.MainMenuOpen, this.MainMenuClose, this.menuItem17, this.MainMenuSave, this.MainMenuSaveAs, this.MainMenuSaveAll, this.menuItem11, this.MainMenuEditAsXml, this.MainMenuSaveAsXml, this.MainMenuLoadFromXml, this.menuItem20, this.MainMenuChangeServer, this.OpenSiteAdmin, this.menuItem22, this.MainMenuExit}); this.menuItem2.Text = "File"; // // MainMenuNew // this.MainMenuNew.Index = 0; this.MainMenuNew.Shortcut = System.Windows.Forms.Shortcut.CtrlN; this.MainMenuNew.Text = "New"; this.MainMenuNew.Click += new System.EventHandler(this.MainMenuNew_Click); // // MainMenuOpen // this.MainMenuOpen.Index = 1; this.MainMenuOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO; this.MainMenuOpen.Text = "Open"; this.MainMenuOpen.Click += new System.EventHandler(this.MainMenuOpen_Click); // // MainMenuClose // this.MainMenuClose.Index = 2; this.MainMenuClose.Shortcut = System.Windows.Forms.Shortcut.CtrlF4; this.MainMenuClose.Text = "Close"; this.MainMenuClose.Click += new System.EventHandler(this.MainMenuClose_Click); // // menuItem17 // this.menuItem17.Index = 3; this.menuItem17.Text = "-"; // // MainMenuSave // this.MainMenuSave.Index = 4; this.MainMenuSave.Shortcut = System.Windows.Forms.Shortcut.CtrlS; this.MainMenuSave.Text = "Save"; this.MainMenuSave.Click += new System.EventHandler(this.MainMenuSave_Click); // // MainMenuSaveAs // this.MainMenuSaveAs.Index = 5; this.MainMenuSaveAs.Text = "Save as..."; this.MainMenuSaveAs.Click += new System.EventHandler(this.MainMenuSaveAs_Click); // // MainMenuSaveAll // this.MainMenuSaveAll.Index = 6; this.MainMenuSaveAll.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftS; this.MainMenuSaveAll.Text = "Save all"; this.MainMenuSaveAll.Click += new System.EventHandler(this.MainMenuSaveAll_Click); // // menuItem11 // this.menuItem11.Index = 7; this.menuItem11.Text = "-"; // // MainMenuEditAsXml // this.MainMenuEditAsXml.Index = 8; this.MainMenuEditAsXml.Text = "Edit as Xml"; this.MainMenuEditAsXml.Click += new System.EventHandler(this.MainMenuEditAsXml_Click); // // MainMenuSaveAsXml // this.MainMenuSaveAsXml.Index = 9; this.MainMenuSaveAsXml.Text = "Save as Xml..."; this.MainMenuSaveAsXml.Click += new System.EventHandler(this.MainMenuSaveAsXml_Click); // // MainMenuLoadFromXml // this.MainMenuLoadFromXml.Index = 10; this.MainMenuLoadFromXml.Text = "Load from Xml..."; this.MainMenuLoadFromXml.Click += new System.EventHandler(this.MainMenuLoadFromXml_Click); // // menuItem20 // this.menuItem20.Index = 11; this.menuItem20.Text = "-"; // // MainMenuChangeServer // this.MainMenuChangeServer.Index = 12; this.MainMenuChangeServer.Text = "Change server..."; this.MainMenuChangeServer.Click += new System.EventHandler(this.MainMenuChangeServer_Click); // // OpenSiteAdmin // this.OpenSiteAdmin.Index = 13; this.OpenSiteAdmin.Text = "Open Site Administrator..."; this.OpenSiteAdmin.Click += new System.EventHandler(this.OpenSiteAdmin_Click); // // menuItem22 // this.menuItem22.Index = 14; this.menuItem22.Text = "-"; // // MainMenuExit // this.MainMenuExit.Index = 15; this.MainMenuExit.Text = "Exit"; this.MainMenuExit.Click += new System.EventHandler(this.MainMenuExit_Click); // // MainMenuEdit // this.MainMenuEdit.Index = 1; this.MainMenuEdit.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.MainMenuCut, this.MainMenuCopy, this.MainMenuPaste}); this.MainMenuEdit.Text = "Edit"; // // MainMenuCut // this.MainMenuCut.Index = 0; this.MainMenuCut.Text = "Cut"; this.MainMenuCut.Click += new System.EventHandler(this.MainMenuCut_Click); // // MainMenuCopy // this.MainMenuCopy.Index = 1; this.MainMenuCopy.Text = "Copy"; this.MainMenuCopy.Click += new System.EventHandler(this.MainMenuCopy_Click); // // MainMenuPaste // this.MainMenuPaste.Index = 2; this.MainMenuPaste.Text = "Paste"; this.MainMenuPaste.Click += new System.EventHandler(this.MainMenuPaste_Click); // // menuItem3 // this.menuItem3.Index = 2; this.menuItem3.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.MainMenuAbout}); this.menuItem3.Text = "Help"; // // MainMenuAbout // this.MainMenuAbout.Index = 0; this.MainMenuAbout.Text = "About..."; this.MainMenuAbout.Click += new System.EventHandler(this.MainMenuAbout_Click); // // FormMain // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(704, 454); this.Controls.Add(this.panOuter); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Menu = this.MainMenu; this.Name = "FormMain"; this.Text = "MapGuide Maestro"; this.Closing += new System.ComponentModel.CancelEventHandler(this.FormMain_Closing); this.Load += new System.EventHandler(this.FormMain_Load); this.panLeftTree.ResumeLayout(false); this.panInnerRight.ResumeLayout(false); this.panOuter.ResumeLayout(false); this.ResumeLayout(false); } #endregion private void FormMain_Load(object sender, System.EventArgs e) { this.Show(); FormLogin frm = new FormLogin(); frm.UseAutoConnect = true; if (frm.ShowDialog(this) == DialogResult.OK) m_connection = frm.Connection; else { Application.Exit(); return; } KeepAliveTimer.Enabled = true; string editorMap = System.IO.Path.Combine(Application.StartupPath, "EditorMap.xml"); if (!System.IO.File.Exists(editorMap)) { MessageBox.Show(string.Format(m_globalizor.Translate("The editor setup file could not be located.\nIt should be placed in: {0}"), editorMap), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); return; } try { m_editors = new ResourceEditorMap(System.IO.Path.Combine(Application.StartupPath, "EditorMap.xml")); } catch(Exception ex) { MessageBox.Show(string.Format(m_globalizor.Translate("Failed to load editor setup: {0}") , ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); return; } this.ResourceTree.ImageList = m_editors.SmallImageList; this.tabItems.ImageList = m_editors.SmallImageList; string templatepath = System.IO.Path.Combine(Application.StartupPath, "Templates"); m_templateMenuIndex = new Hashtable(); NewResourceMenu.MenuItems.Clear(); WallpaperChanger.ExtendedMenuItem folderMenu = new WallpaperChanger.ExtendedMenuItem(m_globalizor.Translate("Folder") , new System.EventHandler(NewFolderMenuItem_Click)); folderMenu.Image = m_editors.SmallImageList.Images[m_editors.FolderIcon]; WallpaperChanger.ExtendedMenuItem folderMenu2 = new WallpaperChanger.ExtendedMenuItem(m_globalizor.Translate("Folder") , new System.EventHandler(NewFolderMenuItem_Click)); folderMenu2.Image = m_editors.SmallImageList.Images[m_editors.FolderIcon]; NewResourceMenu.MenuItems.Add(folderMenu); NewResourceMenu.MenuItems.Add(new MenuItem("-")); MainMenuNew.MenuItems.Clear(); MainMenuNew.MenuItems.Add(folderMenu2); MainMenuNew.MenuItems.Add(new MenuItem("-")); NewMenu.MenuItems.Clear(); if (System.IO.Directory.Exists(templatepath)) { foreach(string file in System.IO.Directory.GetFiles(templatepath)) { WallpaperChanger.ExtendedMenuItem menu = new WallpaperChanger.ExtendedMenuItem(System.IO.Path.GetFileNameWithoutExtension(file), new System.EventHandler(NewResourceMenu_Clicked)); menu.Image = m_editors.SmallImageList.Images[m_editors.GetImageIndexFromResourceID(file)]; m_templateMenuIndex.Add(menu, file); NewResourceMenu.MenuItems.Add(menu); menu = new WallpaperChanger.ExtendedMenuItem(System.IO.Path.GetFileNameWithoutExtension(file), new System.EventHandler(NewResourceMenu_Clicked)); menu.Image = m_editors.SmallImageList.Images[m_editors.GetImageIndexFromResourceID(file)]; m_templateMenuIndex.Add(menu, file); MainMenuNew.MenuItems.Add(menu); menu = new WallpaperChanger.ExtendedMenuItem(System.IO.Path.GetFileNameWithoutExtension(file), new System.EventHandler(NewResourceMenu_Clicked)); menu.Image = m_editors.SmallImageList.Images[m_editors.GetImageIndexFromResourceID(file)]; m_templateMenuIndex.Add(menu, file); NewMenu.MenuItems.Add(menu); } } this.Refresh(); RebuildDocumentTree(); } private TreeNodeCollection FindParent(string resourceID) { string [] parts = m_editors.SplitResourceID(resourceID); TreeNodeCollection current = ResourceTree.Nodes[0].Nodes; for(int i = 0; i < parts.Length - 1; i++) { bool found = false; foreach(TreeNode n in current) if (n.Text == parts[i]) { current = n.Nodes; found = true; break; } if (!found) throw new Exception(string.Format(m_globalizor.Translate("Failed to find node with name {0}, while looking for: {1}"), parts[i], resourceID)); } return current; } private TreeNode FindItem(string resourceID) { TreeNodeCollection parent = FindParent(resourceID); string[] parts = m_editors.SplitResourceID(resourceID); foreach(TreeNode n in parent) if (n.Text == parts[parts.Length-1]) return n; throw new Exception(string.Format(m_globalizor.Translate("Item not found: {0}"), resourceID)); } public string SelectedPath { get { string path = "Library://"; if (ResourceTree.SelectedNode != null) path += ResourceTree.SelectedNode.FullPath; return path; } } private void FindOpenNodes(TreeNodeCollection nodes, ArrayList opennodes) { foreach(TreeNode n in nodes) if (n.IsExpanded) { opennodes.Add(n.FullPath); FindOpenNodes(n.Nodes, opennodes); } } public void RebuildDocumentTree() { using(new WaitCursor(this)) { TreeNode parentnode = ResourceTree.SelectedNode; string parentnodepath = null; string actualnodepath = null; int parentnodeindex = -1; if (parentnode != null) parentnodeindex = parentnode.Index; if (parentnode != null && parentnode.Parent != null) parentnodepath = parentnode.Parent.FullPath; if (ResourceTree.SelectedNode != null) actualnodepath = ResourceTree.SelectedNode.FullPath; ArrayList opennodes = new ArrayList(); FindOpenNodes(ResourceTree.Nodes, opennodes); OSGeo.MapGuide.MaestroAPI.ResourceList lst = m_connection.GetRepositoryResources(); ResourceTree.Nodes.Clear(); TreeNode rootnode = new TreeNode(m_connection.DisplayName, m_editors.ServerIcon, m_editors.ServerIcon); ResourceTree.Nodes.Add(rootnode); m_Folders = new SortedList(); m_Documents = new SortedList(); //Sort items foreach(object o in lst.Items) if (o.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) m_Folders.Add(((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)o).ResourceId, o); else if (o.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument document = (OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)o; m_Documents.Add((m_editors.GetImageIndexFromResourceID(document.ResourceId)).ToString() + "-" + document.ResourceId, document); } //Build tree with folders first, so all placeholders are ready foreach(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder folder in m_Folders.Values) { //Skip the root folder if (folder.ResourceId == "Library://") continue; TreeNode n = new TreeNode(); n.Text = m_editors.GetResourceNameFromResourceID(folder.ResourceId); n.Tag = folder; n.ImageIndex = n.SelectedImageIndex = m_editors.FolderIcon; FindParent(folder.ResourceId).Add(n); } //Pouplate with documents foreach(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument document in m_Documents.Values) { TreeNode n = new TreeNode(); n.Text = m_editors.GetResourceNameFromResourceID(document.ResourceId); n.Tag = document; n.ImageIndex = n.SelectedImageIndex = m_editors.GetImageIndexFromResourceID(document.ResourceId); FindParent(document.ResourceId).Add(n); } rootnode.Expand(); //TODO: Remove any open resources that do not exist anymore foreach(string s in opennodes) { TreeNode n = TreeViewUtil.FindItemExact(ResourceTree, s); if (n != null) n.Expand(); } if (actualnodepath != null) { TreeNode n = TreeViewUtil.FindItemExact(ResourceTree, actualnodepath); if (n != null) { ResourceTree.SelectedNode = n; } else { if (parentnodepath == null && ResourceTree.Nodes.Count > 0) ResourceTree.SelectedNode = ResourceTree.Nodes[Math.Min(ResourceTree.Nodes.Count - 1, parentnodeindex)]; else { n = TreeViewUtil.FindItemExact(ResourceTree, parentnodepath); if (n != null) if (n.Nodes.Count > 0) ResourceTree.SelectedNode = n.Nodes[Math.Min(n.Nodes.Count - 1, parentnodeindex)]; else ResourceTree.SelectedNode = n; } } } } } public OSGeo.MapGuide.MaestroAPI.ServerConnectionI CurrentConnection { get { return m_connection; } } public void CreateResource(object item, string itemType) { string resourceID = "Library://" + Guid.NewGuid().ToString() + "." + itemType; System.Type ClassDef = m_editors.GetResourceEditorTypeFromResourceType(itemType); if (ClassDef != null) try { EditorInterface edi = AddEditTab(ClassDef, resourceID, false); if (item != null) ((ResourceEditor)edi.Page.Controls[0]).Resource = item; tabItems.SelectedTab = edi.Page; edi.HasChanged(); } catch(Exception ex) { //TODO: Handle cancel a little more gracefully MessageBox.Show(this, string.Format(m_globalizor.Translate("Unable to create the resource {0}\nError message: {1}"), resourceID, ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } else MessageBox.Show(this, string.Format(m_globalizor.Translate("Unable to determine the resource type for: {0}"), resourceID), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } public void OpenResource(string resourceID) { OpenResource(resourceID, null); } public void OpenResource(string resourceID, System.Type type) { if (!m_userControls.ContainsKey(resourceID)) { System.Type ClassDef = type; if (ClassDef == null) ClassDef = m_editors.GetResourceEditorTypeFromResourceID(resourceID); if (ClassDef == null) ClassDef = typeof(ResourceEditors.XmlEditorControl); if (ClassDef != null) try { AddEditTab(ClassDef, resourceID, true); } catch (System.Reflection.TargetInvocationException tex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("Unable to open the resource {0}\nError message: {1}"), resourceID, tex.InnerException.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("Unable to open the resource {0}\nError message: {1}"), resourceID, ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } else MessageBox.Show(this, string.Format(m_globalizor.Translate("Unable to determine the resource type for: {0}"), resourceID), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } if (m_userControls.ContainsKey(resourceID)) tabItems.SelectedTab = ((EditorInterface)m_userControls[resourceID]).Page; } private void ResourceTree_DoubleClick(object sender, System.EventArgs e) { using (new WaitCursor(this)) { if (ResourceTree.SelectedNode != null && ResourceTree.SelectedNode.Tag != null) if (ResourceTree.SelectedNode.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument document = (OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)ResourceTree.SelectedNode.Tag; OpenResource(document.ResourceId); } } } private EditorInterface AddEditTab(System.Type controlType, string resourceID, bool existing) { TabPage tp; if (existing) tp = new TabPage(m_editors.GetResourceNameFromResourceID(resourceID)); else tp = new TabPage(m_globalizor.Translate("New resource")); tp.ImageIndex = m_editors.GetImageIndexFromResourceID(resourceID); EditorInterface edi = new EditorInterface(this, tp, resourceID, existing); object[] args = null; if (!existing) args = new object[] {edi}; else args = new object[] {edi, resourceID}; UserControl uc = (UserControl)Activator.CreateInstance(controlType, args ); tp.Controls.Add(uc); uc.Top = 16; uc.Left = 16; uc.Width = tp.Width - 32; uc.Height = tp.Height - 32; uc.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right; m_userControls.Add(edi.ResourceID, edi); tabItems.TabPages.Add(tp); return edi; } private void TreeContextMenu_Popup(object sender, System.EventArgs e) { if (ResourceTree.SelectedNode == null || ResourceTree.SelectedNode.Tag == null) { foreach(MenuItem m in TreeContextMenu.MenuItems) m.Enabled = false; } else { foreach(MenuItem m in TreeContextMenu.MenuItems) m.Enabled = true; } //TODO: Implement the properties dialog PropertiesMenu.Enabled = false; PasteMenu.Enabled = (ResourceTree.SelectedNode != null && m_clipboardBuffer != null); NewMenu.Enabled = true; } private void SaveXmlAsMenu_Click(object sender, System.EventArgs e) { try { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = m_globalizor.Translate("Xml Files (*.xml)") + "|*.xml|" + m_globalizor.Translate("All files (*.*)") + "|*.*"; dlg.OverwritePrompt = true; dlg.Title = m_globalizor.Translate("Choose filename to save to"); if (dlg.ShowDialog() == DialogResult.OK) { OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument document = (OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)ResourceTree.SelectedNode.Tag; byte[] data = m_connection.GetResourceXmlData(document.ResourceId); using(System.IO.FileStream fs = System.IO.File.Open(dlg.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) fs.Write(data, 0, data.Length); } } catch (Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("Failed to save resource data: {0}"), ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void NewFolderMenuItem_Click(object sender, System.EventArgs e) { } private void NewResourceMenu_Clicked(object sender, System.EventArgs e) { string filename = (string)m_templateMenuIndex[sender]; if (filename == null) return; object o = null; try { using(System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)) o = m_connection.DeserializeObject(m_editors.GetResourceInstanceTypeFromResourceID(filename), fs); } catch(Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("Failed to load template: {0}"), ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (o != null) CreateResource(o, m_editors.GetResourceTypeNameFromResourceID(filename)); } private void ResourceTree_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e) { ResourceTree.DoDragDrop(e.Item, DragDropEffects.All); } private void DeleteResource() { if (ResourceTree.SelectedNode == null || ResourceTree.SelectedNode.Tag == null) return; object item = ResourceTree.SelectedNode.Tag; if (item.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { //We do not enumerate here, because it is SLOW if (ResourceTree.SelectedNode.Nodes.Count == 0 && MessageBox.Show(this, m_globalizor.Translate("Delete the selected folder?"), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes) return; else if (MessageBox.Show(this, m_globalizor.Translate("If you delete the folder, any resource that references an item in the selected folder will become unusable.\n\nDelete folder and all contents?"), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3) != DialogResult.Yes) return; try { m_connection.DeleteFolder(((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)item).ResourceId); } catch(Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("An error occured while deleting the folder: {0}"), ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } RebuildDocumentTree(); } else if (item.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { //We do not enumerate here, because it is SLOW if (MessageBox.Show(this, m_globalizor.Translate("If you delete the resource, any resource that reference the resource will become unusable.\n\nDelete the resource?"), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3) != DialogResult.Yes) return; try { m_connection.DeleteResource(((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)item).ResourceId); } catch(Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("An error occured while deleting the resource: {0}"), ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } RebuildDocumentTree(); } } private void AddFolder() { string start; if (ResourceTree.SelectedNode == null) return; else if (ResourceTree.SelectedNode.Tag == null) start = "Library://"; else if (ResourceTree.SelectedNode.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) start = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)ResourceTree.SelectedNode.Tag).ResourceId; else if (ResourceTree.SelectedNode.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { start = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)ResourceTree.SelectedNode.Tag).ResourceId; start = start.Substring(0, start.LastIndexOf("/") + 1); } else return; string foldername = GetNewFolderName(start); m_connection.CreateFolder(foldername); string targetpath = ResourceTree.SelectedNode.FullPath + ResourceTree.PathSeparator + m_globalizor.Translate("New folder"); RebuildDocumentTree(); TreeNode n = TreeViewUtil.FindItemExact(ResourceTree, targetpath); if (n != null) { ResourceTree.SelectedNode = n; n.BeginEdit(); } } private void ClipboardCopy() { if (ResourceTree.SelectedNode == null || ResourceTree.SelectedNode.Tag == null) return; m_clipboardBuffer = ResourceTree.SelectedNode; m_clipboardCut = false; ResourceTreePaste.Enabled = true; } private void ClipboardCut() { if (ResourceTree.SelectedNode == null || ResourceTree.SelectedNode.Tag == null) return; m_clipboardBuffer = ResourceTree.SelectedNode; m_clipboardCut = true; ResourceTreePaste.Enabled = true; } private void ClipboardPaste() { if (MoveOrCopyResource(m_clipboardBuffer, ResourceTree.SelectedNode, m_clipboardCut, true) && m_clipboardCut) { ResourceTreePaste.Enabled = false; m_clipboardBuffer = null; m_clipboardCut = false; } } private void ResourceTreeToolbar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e) { if (e.Button == DeleteResourceButton) DeleteResource(); else if (e.Button == AddResourceButton) NewResourceMenu.Show(ResourceTreeToolbar, new Point(e.Button.Rectangle.Left, e.Button.Rectangle.Bottom)); else if (e.Button == AddFolderButton) AddFolder(); else if (e.Button == ResourceTreeCopy) ClipboardCopy(); else if (e.Button == ResourceTreeCut) ClipboardCut(); else if (e.Button == ResourceTreePaste) ClipboardPaste(); else if (e.Button == ResourceTreeRefreshButton) { RebuildDocumentTree(); //TODO: Remove any open resources that do not exist any more } } private bool MoveOrCopyResource(TreeNode source, TreeNode target, bool move, bool refreshTree) { using (new WaitCursor(this)) { if (source == null || source.Tag == null) return false; if (target == null) return false; string targetpath; if (target.Tag == null) targetpath = "Library://"; else if (target.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { targetpath = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)target.Tag).ResourceId; } else if (target.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { targetpath = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)target.Tag).ResourceId; targetpath = targetpath.Substring(0, targetpath.LastIndexOf("/") + 1); } else return false; string sourcepath; if (source.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { sourcepath = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)source.Tag).ResourceId; targetpath = targetpath + sourcepath.Substring(sourcepath.Substring(0, sourcepath.Length - 1).LastIndexOf("/") + 1); } else if (source.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { sourcepath = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)source.Tag).ResourceId; targetpath = targetpath + sourcepath.Substring(sourcepath.LastIndexOf("/") + 1); } else return false; return MoveOrCopyResource(sourcepath, targetpath, move, refreshTree); } } private bool MoveOrCopyResource(string sourcepath, string targetpath, bool move, bool refreshTree) { using (new WaitCursor(this)) { bool sourceisFolder = sourcepath.EndsWith("/"); if (sourcepath == targetpath) if (move) { MessageBox.Show(this, m_globalizor.Translate("Cannot move a resource onto itself."), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } else targetpath = GetUniqueResourceName(sourcepath); if (m_connection.ResourceExists(targetpath) && MessageBox.Show(this, sourceisFolder ? m_globalizor.Translate("There already exists a folder at the destination.\nDo you want to overwrite?") : m_globalizor.Translate("There already exists a resource at the destination.\nDo you want to overwrite?"), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3) != DialogResult.Yes) return false; LengthyOperation lwdlg = new LengthyOperation(); if (sourceisFolder && move) lwdlg.InitializeDialog(m_connection, sourcepath, targetpath, LengthyOperation.OperationType.MoveFolder); else if (sourceisFolder) lwdlg.InitializeDialog(m_connection, sourcepath, targetpath, LengthyOperation.OperationType.CopyFolder); else if (move) lwdlg.InitializeDialog(m_connection, sourcepath, targetpath, LengthyOperation.OperationType.MoveResource); else { m_connection.CopyResource(sourcepath, targetpath, true); if (refreshTree) RebuildDocumentTree(); return true; } bool rs = lwdlg.ShowDialog(this) == DialogResult.OK; //TODO: Close/update any open resource editors, if the resource was affected if (refreshTree) RebuildDocumentTree(); return rs; } } private string GetNewFolderName(string path) { OSGeo.MapGuide.MaestroAPI.ResourceList lst = m_connection.GetRepositoryResources(path, 1); Hashtable res = new Hashtable(); foreach(object o in lst.Items) if (o.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { string foldername = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)o).ResourceId; foldername = foldername.Substring(foldername.Substring(0, foldername.Length - 1).LastIndexOf("/") + 1); res.Add(foldername, null); } string name = m_globalizor.Translate("New folder") + "/"; int i = 1; while (res.ContainsKey(name) && i < 100) name = string.Format(m_globalizor.Translate("New folder {0}"), i) + "/"; if (i >= 100) throw new Exception(m_globalizor.Translate("Internal error, more than 100 new folders is usually an indication of an error")); return path + name; } private string GetUniqueResourceName(string resource) { string folderpath = resource.Substring(0, resource.Substring(0, resource.Length - 1).LastIndexOf("/") + 1); OSGeo.MapGuide.MaestroAPI.ResourceList lst = m_connection.GetRepositoryResources(folderpath, 1); Hashtable res = new Hashtable(); foreach(object o in lst.Items) if (o.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) res.Add(((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)o).ResourceId, null); else if (o.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) res.Add(((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)o).ResourceId, null); if (res.ContainsKey(resource)) { string resourcename = resource.Substring(folderpath.Length); resource = folderpath + string.Format(m_globalizor.Translate("Copy of {0}"), resourcename); int i = 1; while (res.ContainsKey(resource) && i < 100) resource = folderpath + string.Format(m_globalizor.Translate("Copy {0} of {1}"), (i++), resourcename); if (i == 100) throw new Exception(m_globalizor.Translate("Internal error, more than 100 copies is usually an indication of an error")); } return resource; } private void SaveResource() { if (tabItems.SelectedTab == null || tabItems.SelectedTab.Controls.Count != 1) return; foreach(EditorInterface edi in m_userControls.Values) if (edi.Page == tabItems.SelectedTab) { edi.Save(); return; } } private void SaveResourceAs() { if (tabItems.SelectedTab == null || tabItems.SelectedTab.Controls.Count != 1) return; foreach(EditorInterface edi in m_userControls.Values) if (edi.Page == tabItems.SelectedTab) { edi.SaveAs(); return; } } private void EditAsXml() { if (tabItems.SelectedTab == null || tabItems.SelectedTab.Controls.Count != 1) return; foreach(EditorInterface edi in m_userControls.Values) if (edi.Page == tabItems.SelectedTab) { object resource = ((ResourceEditor)edi.Page.Controls[0]).Resource; XmlEditor dlg = new XmlEditor(resource, this.CurrentConnection); if (dlg.ShowDialog() == DialogResult.OK) { object o = dlg.SerializedObject; System.Reflection.PropertyInfo pi = o.GetType().GetProperty("ResourceId"); if (pi != null) pi.SetValue(o, pi.GetValue(resource, null), null); pi = o.GetType().GetProperty("CurrentConnection"); if (pi != null) pi.SetValue(o, pi.GetValue(resource, null), null); ((ResourceEditor)edi.Page.Controls[0]).Resource = dlg.SerializedObject; edi.HasChanged(); } } } private void ClosePage() { if (tabItems.SelectedTab == null || tabItems.SelectedTab.Controls.Count != 1) return; foreach(EditorInterface edi in m_userControls.Values) if (edi.Page == tabItems.SelectedTab) { edi.Close(true); break; } } private void OpenPreview() { foreach(EditorInterface edi in m_userControls.Values) if (edi.Page == tabItems.SelectedTab) { ((ResourceEditor)edi.Page.Controls[0]).Preview(); break; } } private void toolBar2_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e) { if (e.Button == SaveResourceButton) SaveResource(); else if (e.Button == SaveResourceAsButton) SaveResourceAs(); else if (e.Button == EditAsXmlButton) EditAsXml(); else if (e.Button == ClosePageButton) ClosePage(); else if (e.Button == PreviewButton) OpenPreview(); } private void ResourceTree_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) { bool itemSelected = ResourceTree.SelectedNode != null && ResourceTree.SelectedNode.Tag != null; DeleteResourceButton.Enabled = ResourceTreeCopy.Enabled = ResourceTreeCut.Enabled = itemSelected; ResourceTreePaste.Enabled = m_clipboardBuffer != null && ResourceTree.SelectedNode != null; if (ResourceTree.SelectedNode != null && ResourceTree.SelectedNode.Tag != null) { object item = ResourceTree.SelectedNode.Tag; if (item.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { m_lastSelectedNode = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)item).ResourceId; } else if (item.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { m_lastSelectedNode = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)item).ResourceId; } } } private void ResourceTree_DragOver(object sender, System.Windows.Forms.DragEventArgs e) { TreeNode x = e.Data.GetData(typeof(TreeNode)) as TreeNode; if (x == null || x.Tag == null) { e.Effect = DragDropEffects.None; return; } TreeNode n = ResourceTree.GetNodeAt(ResourceTree.PointToClient(new Point(e.X, e.Y))); if (n == null) e.Effect = DragDropEffects.None; else if (n.Tag == null || n.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { //Hmm 8 means CTRL, where is the constant? if ((e.KeyState & 8) != 0) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.Move; } else e.Effect = DragDropEffects.None; } private void ResourceTree_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { TreeNode x = e.Data.GetData(typeof(TreeNode)) as TreeNode; if (x == null || x.Tag == null) return; TreeNode n = ResourceTree.GetNodeAt(ResourceTree.PointToClient(new Point(e.X, e.Y))); if (n == null) return; else if (n.Tag == null || n.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) { //Hmm 8 means CTRL, where is the constant? if ((e.KeyState & 8) != 0) MoveOrCopyResource(x, n, false, true); else MoveOrCopyResource(x, n, true, true); } else return; } private void ResourceTree_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { if (!ResourceTree.Focused) return; if (e.KeyCode == Keys.Enter) { ResourceTree_DoubleClick(sender, e); e.Handled = true; } else if (e.KeyCode == Keys.Delete) { ResourceTreeToolbar_ButtonClick(null, new ToolBarButtonClickEventArgs(DeleteResourceButton)); e.Handled = true; } else if ((e.KeyCode == Keys.R && e.Control) || e.KeyCode == Keys.F5) { ResourceTreeToolbar_ButtonClick(null, new ToolBarButtonClickEventArgs(ResourceTreeRefreshButton)); e.Handled = true; } else if ((e.KeyCode == Keys.F2)) { if (ResourceTree.SelectedNode != null && ResourceTree.SelectedNode.Tag != null) ResourceTree.SelectedNode.BeginEdit(); e.Handled = true; } } private void ResourceTree_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e) { if (e.Label == null) return; //Something goes wrong if the dialog is shown from within the eventhandler //This annoying workaround prevents the rename crash, but has an annoying delay m_lastLabelEdit = e; System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(MoveOrCopyThread)); t.IsBackground = true; t.Start(); } private System.Windows.Forms.NodeLabelEditEventArgs m_lastLabelEdit; //private delegate bool MoveOrCopyResourceDelegate(string sourcepath, string targetpath, bool move, bool refresh); private void MoveOrCopyThread() { if (this.InvokeRequired) { this.Invoke(new System.Threading.ThreadStart(MoveOrCopyThread)); return; } System.Windows.Forms.NodeLabelEditEventArgs e = m_lastLabelEdit; m_lastLabelEdit = null; if (e == null || e.Label == null) return; string sourcepath; if (e.Node.Tag == null) return; else if (e.Node.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) sourcepath = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)e.Node.Tag).ResourceId; else if (e.Node.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)) sourcepath = ((OSGeo.MapGuide.MaestroAPI.ResourceListResourceFolder)e.Node.Tag).ResourceId; else return; string targetpath = sourcepath.Substring(0, sourcepath.Substring(0, sourcepath.Length - 1).LastIndexOf("/") + 1); if (sourcepath.EndsWith("/")) targetpath += e.Label + "/"; else targetpath += e.Label + sourcepath.Substring(sourcepath.LastIndexOf(".")); if (sourcepath == targetpath) return; if (m_connection.ResourceExists(targetpath)) { MessageBox.Show(this, m_globalizor.Translate("Another resource with that name already exists."), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); e.CancelEdit = true; return; } if (MoveOrCopyResource(sourcepath, targetpath, true, false)) e.Node.Text = e.Label; RebuildDocumentTree(); //this.Invoke(new MoveOrCopyResourceDelegate(MoveOrCopyResource), new object[] {}); } private void ResourceTree_BeforeLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e) { if (e.Node == null || e.Node.Tag == null) e.CancelEdit = true; } private void FormMain_Closing(object sender, System.ComponentModel.CancelEventArgs e) { foreach(EditorInterface edi in m_userControls.Values) if (edi.Page.Text.EndsWith(" *")) { switch(MessageBox.Show(this, m_globalizor.Translate("One or more resources has unsaved changes.\nClosing this application will loose the changes.\nDo you want to save the resources before closing?"), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) { case DialogResult.Yes: { ArrayList tosave = new ArrayList(); foreach(EditorInterface edi2 in m_userControls.Values) if (edi2.Page.Text.EndsWith(" *")) tosave.Add(edi2); foreach(EditorInterface edi2 in tosave) if (!edi2.Save()) { e.Cancel = true; return; } } break; case DialogResult.Cancel: e.Cancel = true; return; } break; } } private void CutMenu_Click(object sender, System.EventArgs e) { ResourceTreeToolbar_ButtonClick(null, new ToolBarButtonClickEventArgs(ResourceTreeCut)); } private void CopyMenu_Click(object sender, System.EventArgs e) { ResourceTreeToolbar_ButtonClick(null, new ToolBarButtonClickEventArgs(ResourceTreeCopy)); } private void PasteMenu_Click(object sender, System.EventArgs e) { ResourceTreeToolbar_ButtonClick(null, new ToolBarButtonClickEventArgs(ResourceTreePaste)); } private void EditAsXmlMenu_Click(object sender, System.EventArgs e) { using(new WaitCursor(this)) { try { if (ResourceTree.SelectedNode != null && ResourceTree.SelectedNode.Tag != null) if (ResourceTree.SelectedNode.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument document = (OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)ResourceTree.SelectedNode.Tag; if (m_userControls.ContainsKey(document.ResourceId)) { EditorInterface edi = (EditorInterface)m_userControls[document.ResourceId]; if (!edi.Close(true)) return; } OpenResource(document.ResourceId, typeof(OSGeo.MapGuide.Maestro.ResourceEditors.XmlEditorControl)); } } catch (Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("An error occured while opening the xml editor: {0}"), ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void LoadFromXmlMenu_Click(object sender, System.EventArgs e) { using(new WaitCursor(this)) { try { OpenFileDialog dlg = new OpenFileDialog(); dlg.CheckFileExists = true; dlg.CheckPathExists = true; dlg.DereferenceLinks = true; dlg.Filter = m_globalizor.Translate("Xml files (*.xml)") + "|*.xml|" + m_globalizor.Translate("All files (*.*)") + "|*.*"; dlg.Multiselect = false; dlg.ShowReadOnly = false; dlg.ValidateNames = true; if (dlg.ShowDialog() != DialogResult.OK) return; if (ResourceTree.SelectedNode != null && ResourceTree.SelectedNode.Tag != null) if (ResourceTree.SelectedNode.Tag.GetType() == typeof(OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)) { OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument document = (OSGeo.MapGuide.MaestroAPI.ResourceListResourceDocument)ResourceTree.SelectedNode.Tag; if (m_userControls.ContainsKey(document.ResourceId)) { EditorInterface edi = (EditorInterface)m_userControls[document.ResourceId]; if (!edi.Close(true)) return; } object item = null; using(System.IO.FileStream fs = System.IO.File.Open(dlg.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)) item = m_connection.DeserializeObject(m_editors.GetResourceInstanceTypeFromResourceID(document.ResourceId), fs); EditorInterface edir = new EditorInterface(this, new TabPage(m_editors.GetResourceNameFromResourceID(document.ResourceId)), document.ResourceId, true); OSGeo.MapGuide.Maestro.ResourceEditors.XmlEditorControl c = new OSGeo.MapGuide.Maestro.ResourceEditors.XmlEditorControl(edir); c.Resource = item; c.ResourceId = document.ResourceId; edir.Page.Controls.Add(c); c.Dock = DockStyle.Fill; tabItems.TabPages.Add(edir.Page); tabItems.SelectedTab = edir.Page; edir.HasChanged(); m_userControls.Add(document.ResourceId, edir); } } catch (Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("An error occured while opening the xml editor: {0}"), ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void KeepAliveTimer_Tick(object sender, System.EventArgs e) { try { m_connection.GetProviderCapabilities("OSGeo.SDF"); } catch { } } private void MainMenuOpen_Click(object sender, System.EventArgs e) { try { BrowseResource dlg = new BrowseResource(m_connection, this, this.ResourceEditorMap.SmallImageList, true, null); if (dlg.ShowDialog(this) == DialogResult.OK) this.OpenResource(dlg.SelectedResource); } catch(Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("Failed to open selected resource: {0}"), ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void MainMenuNew_Click(object sender, System.EventArgs e) { } private void MainMenuClose_Click(object sender, System.EventArgs e) { ClosePage(); } private void MainMenuSave_Click(object sender, System.EventArgs e) { SaveResource(); } private void MainMenuSaveAs_Click(object sender, System.EventArgs e) { SaveResourceAs(); } private void MainMenuSaveAll_Click(object sender, System.EventArgs e) { SaveAllResources(); } private void SaveAllResources() { try { foreach(OSGeo.MapGuide.Maestro.EditorInterface edi in this.OpenResourceEditors.Values) if (edi.Page.Text.EndsWith(" *")) edi.Save(); } catch(Exception ex) { MessageBox.Show(this, string.Format(m_globalizor.Translate("Failed to save resources: {0}"), ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void MainMenuSaveAsXml_Click(object sender, System.EventArgs e) { SaveXmlAsMenu_Click(sender, e); } private void MainMenuLoadFromXml_Click(object sender, System.EventArgs e) { LoadFromXmlMenu_Click(sender, e); } private void MainMenuExit_Click(object sender, System.EventArgs e) { this.Close(); } private void MainMenuChangeServer_Click(object sender, System.EventArgs e) { FormLogin lg = new FormLogin(); if (lg.ShowDialog(this) == DialogResult.OK) { System.ComponentModel.CancelEventArgs cea = new CancelEventArgs(false); cea.Cancel = false; FormMain_Closing(this, cea); if (!cea.Cancel) { foreach(OSGeo.MapGuide.Maestro.EditorInterface edi in this.OpenResourceEditors.Values) edi.Close(false); ResourceTree.Nodes.Clear(); m_connection = lg.Connection; m_Folders = m_Documents = null; RebuildDocumentTree(); } } } private void MainMenuEditAsXml_Click(object sender, System.EventArgs e) { EditAsXml(); } private void MainMenuCut_Click(object sender, System.EventArgs e) { ClipboardCut(); } private void MainMenuCopy_Click(object sender, System.EventArgs e) { ClipboardCopy(); } private void MainMenuPaste_Click(object sender, System.EventArgs e) { ClipboardPaste(); } private void MainMenuAbout_Click(object sender, System.EventArgs e) { FormAbout dlg = new FormAbout(); dlg.ShowDialog(this); } private void DeleteMenu_Click(object sender, System.EventArgs e) { DeleteResource(); } private void ResourceTree_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Right) ResourceTree.SelectedNode = ResourceTree.GetNodeAt(e.X, e.Y); } private void OpenSiteAdmin_Click(object sender, System.EventArgs e) { try { string url = ((OSGeo.MapGuide.MaestroAPI.HttpServerConnection)m_connection).BaseURL + "mapadmin/login.php"; if (!url.StartsWith("http://") && !url.StartsWith("https://")) throw new Exception ("Malformed URL"); try { System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = url; process.StartInfo.UseShellExecute = true; process.Start(); } catch { //The straightforward method gives an error: "The requested lookup key was not found in any active activation context" System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = "rundll32.exe"; process.StartInfo.Arguments = "url.dll,FileProtocolHandler " + url; process.StartInfo.UseShellExecute = true; process.Start(); } } catch (Exception ex) { MessageBox.Show(this, String.Format(m_globalizor.Translate("Failed to launch browser: {0}"), ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } //TODO: Is sucks having two places where we keep track of the pages /// /// Gets the list of open resouces /// public Hashtable OpenResourceEditors { get { return m_userControls; } } public SortedList ResourceFolders { get { return m_Folders; } } public SortedList ResourceDocuments { get { return m_Documents; } } public ResourceEditorMap ResourceEditorMap { get { return m_editors; } } public string LastSelectedNode { get { return m_lastSelectedNode; } } } }