#region Disclaimer / License // Copyright (C) 2009, 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.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; using System.Collections.Specialized; using System.Collections.Generic; using OSGeo.MapGuide.MaestroAPI; namespace OSGeo.MapGuide.Maestro.ResourceEditors { /// /// Summary description for ResourceDataEditor. /// public class ResourceDataEditor : System.Windows.Forms.UserControl { public event EventHandler ResourceDataChanged; private System.Windows.Forms.ImageList toolbarImages; private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ListView ResourceDataFiles; private System.Windows.Forms.ColumnHeader columnHeader2; private System.Windows.Forms.ContextMenu contextMenu; private System.Windows.Forms.MenuItem ChangeResourceTypeMenu; private System.ComponentModel.IContainer components; private bool m_resourceExists; private ToolStrip ResourceDataFilesToolbar; private ToolStripButton AddFileButton; private ToolStripButton DeleteFileButton; private ToolStripButton DownloadFileButton; private ToolStripSeparator toolStripSeparator1; private ToolStripButton ToggleDocumentsButton; private MenuItem EditResourceXmlMenu; private bool m_useTempResource = true; /// /// Gets or sets a value that determines if the resource data editor /// should use a temporary resource for updating files. /// Usually used when the user may cancel the edit. /// [Category("Behavior"), DefaultValue(true)] public bool UseTemporaryResource { get { return m_useTempResource; } set { if (m_tempresourceid != null) throw new Exception(Strings.ResourceDataEditor.UnableToChangeEditModeError); m_useTempResource = value; } } public ResourceDataEditor(EditorInterface editor, string resourceid) : this() { m_editor = editor; m_resourceid = resourceid; m_tempresourceid = null; this.Enabled = true; } public ResourceDataEditor() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); foreach(string s in Enum.GetNames(typeof(OSGeo.MapGuide.MaestroAPI.ResourceDataType))) ChangeResourceTypeMenu.MenuItems.Add(s, new EventHandler(ChangeType_Clicked)); this.Enabled = false; } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Component 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.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourceDataEditor)); this.toolbarImages = new System.Windows.Forms.ImageList(this.components); this.ResourceDataFiles = new System.Windows.Forms.ListView(); this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); this.contextMenu = new System.Windows.Forms.ContextMenu(); this.ChangeResourceTypeMenu = new System.Windows.Forms.MenuItem(); this.EditResourceXmlMenu = new System.Windows.Forms.MenuItem(); this.ResourceDataFilesToolbar = new System.Windows.Forms.ToolStrip(); this.AddFileButton = new System.Windows.Forms.ToolStripButton(); this.DeleteFileButton = new System.Windows.Forms.ToolStripButton(); this.DownloadFileButton = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.ToggleDocumentsButton = new System.Windows.Forms.ToolStripButton(); this.ResourceDataFilesToolbar.SuspendLayout(); this.SuspendLayout(); // // toolbarImages // this.toolbarImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("toolbarImages.ImageStream"))); this.toolbarImages.TransparentColor = System.Drawing.Color.Transparent; this.toolbarImages.Images.SetKeyName(0, ""); this.toolbarImages.Images.SetKeyName(1, ""); this.toolbarImages.Images.SetKeyName(2, ""); this.toolbarImages.Images.SetKeyName(3, ""); // // ResourceDataFiles // this.ResourceDataFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2}); this.ResourceDataFiles.ContextMenu = this.contextMenu; resources.ApplyResources(this.ResourceDataFiles, "ResourceDataFiles"); this.ResourceDataFiles.Name = "ResourceDataFiles"; this.ResourceDataFiles.UseCompatibleStateImageBehavior = false; this.ResourceDataFiles.View = System.Windows.Forms.View.Details; this.ResourceDataFiles.SelectedIndexChanged += new System.EventHandler(this.ResourceDataFiles_SelectedIndexChanged); this.ResourceDataFiles.SizeChanged += new System.EventHandler(this.ResourceDataFiles_SizeChanged); // // columnHeader1 // resources.ApplyResources(this.columnHeader1, "columnHeader1"); // // columnHeader2 // resources.ApplyResources(this.columnHeader2, "columnHeader2"); // // contextMenu // this.contextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.ChangeResourceTypeMenu, this.EditResourceXmlMenu}); this.contextMenu.Popup += new System.EventHandler(this.contextMenu_Popup); // // ChangeResourceTypeMenu // this.ChangeResourceTypeMenu.Index = 0; resources.ApplyResources(this.ChangeResourceTypeMenu, "ChangeResourceTypeMenu"); // // EditResourceXmlMenu // this.EditResourceXmlMenu.Index = 1; resources.ApplyResources(this.EditResourceXmlMenu, "EditResourceXmlMenu"); this.EditResourceXmlMenu.Click += new System.EventHandler(this.EditResourceXmlMenu_Click); // // ResourceDataFilesToolbar // this.ResourceDataFilesToolbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.ResourceDataFilesToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.AddFileButton, this.DeleteFileButton, this.DownloadFileButton, this.toolStripSeparator1, this.ToggleDocumentsButton}); resources.ApplyResources(this.ResourceDataFilesToolbar, "ResourceDataFilesToolbar"); this.ResourceDataFilesToolbar.Name = "ResourceDataFilesToolbar"; this.ResourceDataFilesToolbar.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; // // AddFileButton // resources.ApplyResources(this.AddFileButton, "AddFileButton"); this.AddFileButton.Name = "AddFileButton"; this.AddFileButton.Click += new System.EventHandler(this.AddFileButton_Click); // // DeleteFileButton // resources.ApplyResources(this.DeleteFileButton, "DeleteFileButton"); this.DeleteFileButton.Name = "DeleteFileButton"; this.DeleteFileButton.Click += new System.EventHandler(this.DeleteFileButton_Click); // // DownloadFileButton // resources.ApplyResources(this.DownloadFileButton, "DownloadFileButton"); this.DownloadFileButton.Name = "DownloadFileButton"; this.DownloadFileButton.Click += new System.EventHandler(this.DownloadFileButton_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // ToggleDocumentsButton // resources.ApplyResources(this.ToggleDocumentsButton, "ToggleDocumentsButton"); this.ToggleDocumentsButton.Name = "ToggleDocumentsButton"; this.ToggleDocumentsButton.Click += new System.EventHandler(this.ToggleDocumentsButton_Click); // // ResourceDataEditor // this.Controls.Add(this.ResourceDataFiles); this.Controls.Add(this.ResourceDataFilesToolbar); this.Name = "ResourceDataEditor"; resources.ApplyResources(this, "$this"); this.Load += new System.EventHandler(this.ResourceDataEditor_Load); this.ResourceDataFilesToolbar.ResumeLayout(false); this.ResourceDataFilesToolbar.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private OSGeo.MapGuide.MaestroAPI.ResourceDataList m_resourceFiles; private string m_resourceid; private string m_tempresourceid; private EditorInterface m_editor; private void ResourceDataFiles_SelectedIndexChanged(object sender, System.EventArgs e) { DeleteFileButton.Enabled = DownloadFileButton.Enabled = (ResourceDataFiles.SelectedItems.Count > 0); } private void RefreshFileList() { if (m_resourceExists) { if (m_tempresourceid != null) m_resourceFiles = m_editor.CurrentConnection.EnumerateResourceData(m_tempresourceid); else if (m_resourceid != null) m_resourceFiles = m_editor.CurrentConnection.EnumerateResourceData(m_resourceid); } } private void UpdateDisplay() { try { ResourceDataFiles.BeginUpdate(); ResourceDataFiles.Items.Clear(); if (m_resourceExists && m_resourceid != null) { if (m_resourceFiles == null) RefreshFileList(); if (ResourceDataFiles.SmallImageList == null) ResourceDataFiles.SmallImageList = ShellIcons.ImageList; foreach(OSGeo.MapGuide.MaestroAPI.ResourceDataListResourceData d in m_resourceFiles.ResourceData) { if (d.Type == OSGeo.MapGuide.MaestroAPI.ResourceDataType.File || ToggleDocumentsButton.Checked) { ListViewItem lvi = new ListViewItem(new string[] {d.Name, d.Type.ToString()}, ShellIcons.GetShellIcon(d.Name)); if (d.Type != OSGeo.MapGuide.MaestroAPI.ResourceDataType.File) lvi.Font = new Font(ResourceDataFiles.Font, FontStyle.Italic); lvi.Tag = d; ResourceDataFiles.Items.Add(lvi); } } } } finally { ResourceDataFiles.EndUpdate(); } this.Enabled = m_resourceExists; } public static bool AddFilesToResource(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, NameValueCollection filetypes) { return AddFilesToResource(owner, connection, resourceId, null, filetypes); } public static bool AddFilesToReource(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId) { return AddFilesToResource(owner, connection, resourceId, null, null); } public static bool AddFilesToResource(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, OSGeo.MapGuide.MaestroAPI.ResourceDataList rld) { return AddFilesToResource(owner, connection, resourceId, rld, null); } public static bool AddFilesToResource(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, OSGeo.MapGuide.MaestroAPI.ResourceDataList rld, NameValueCollection filetypes) { bool res = false; OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = Strings.ResourceDataEditor.UploadFilesDialogTitle; dlg.Multiselect = true; if (filetypes != null) { string ft = ""; foreach(string s in filetypes.Keys) ft += (ft.Length == 0 ? "" : "|") + filetypes[s] + "|*" + s; dlg.Filter = ft; } if (dlg.ShowDialog(owner) == DialogResult.OK) { //Find files with same name, but other extensions List basenames = new List(); List extraFiles = new List(); foreach (string s in dlg.FileNames) { string basename = System.IO.Path.GetFileNameWithoutExtension(s); bool caseSensitiveFS = System.Environment.OSVersion.Platform == PlatformID.MacOSX || System.Environment.OSVersion.Platform == PlatformID.Unix; if (!caseSensitiveFS) basename = basename.ToLower(); //Do not add duplicates if (basenames.Contains(basename)) continue; basenames.Add(basename); foreach (string s1 in System.IO.Directory.GetFiles(System.IO.Path.GetDirectoryName(s), basename + ".*")) if (s1 != s && (string.Compare(System.IO.Path.GetFileNameWithoutExtension(s1), basename, !caseSensitiveFS) == 0)) extraFiles.Add(s1); } if (extraFiles.Count > 0) { switch(MessageBox.Show(owner, String.Format(Strings.ResourceDataEditor.IncludeSimilarFilesConfirmation, extraFiles.Count), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) { case DialogResult.Cancel: return false; case DialogResult.No: extraFiles.Clear(); break; } } if (rld == null) rld = connection.EnumerateResourceData(resourceId); List actualFiles = new List(); actualFiles.AddRange(dlg.FileNames); actualFiles.AddRange(extraFiles); WaitForOperation wdlg = new WaitForOperation(); wdlg.CancelAbortsThread = false; Form ownerForm = owner == null ? null : owner.TopLevelControl as Form; try { res = (bool)wdlg.RunOperationAsync(ownerForm, new WaitForOperation.DoBackgroundWork(Background_Upload), actualFiles, rld, owner, connection, resourceId); } catch (CancelException) { return true; } } return res; } private static object Background_Upload(BackgroundWorker worker, DoWorkEventArgs args, params object[] target) { bool res = false; List actualFiles = (List)target[0]; MaestroAPI.ResourceDataList rld = (MaestroAPI.ResourceDataList)target[1]; Control owner = (Control)target[2]; MaestroAPI.HttpServerConnection connection = (MaestroAPI.HttpServerConnection)target[3]; string resourceId = (string)target[4]; if (owner != null && owner.InvokeRequired) owner = null; int i = 0; foreach (string s in actualFiles) { bool retry = true; while (retry) { try { string filename = System.IO.Path.GetFileName(s); worker.ReportProgress((int)((i / (double)actualFiles.Count) * 100), filename); if (worker.CancellationPending) { args.Cancel = true; return res; } bool removeFirst = false; retry = false; bool upload = true; foreach (OSGeo.MapGuide.MaestroAPI.ResourceDataListResourceData rd in rld.ResourceData) if (rd.Name == filename) { removeFirst = true; switch (MessageBox.Show(owner, string.Format(Strings.ResourceDataEditor.OverwriteResourceFileConfirmation, filename), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) { case DialogResult.No: upload = false; break; case DialogResult.Cancel: return res; } break; } if (!upload) continue; res = true; if (worker.CancellationPending) { args.Cancel = true; return res; } if (removeFirst) connection.DeleteResourceData(resourceId, filename); using (System.IO.FileStream fs = System.IO.File.Open(s, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)) connection.SetResourceData(resourceId, filename, OSGeo.MapGuide.MaestroAPI.ResourceDataType.File, fs); } catch (Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); if (worker.CancellationPending) { args.Cancel = true; return res; } switch (MessageBox.Show(owner, string.Format(Strings.ResourceDataEditor.UploadFailedQuestion, s, msg), Application.ProductName, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error)) { case DialogResult.Abort: return res; case DialogResult.Retry: retry = true; continue; } } } i++; worker.ReportProgress((int)((i / (double)actualFiles.Count) * 100)); } return res; } public static bool DeleteFilesFromResource(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, ListView lv) { if (lv.SelectedItems.Count == 0) return false; string[] items = new string[lv.SelectedItems.Count]; for(int i = 0; i < lv.SelectedItems.Count; i++) items[i] = lv.SelectedItems[i].Text; return DeleteFilesFromResource(owner, connection, resourceId, items); } public static bool DeleteFilesFromResource(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, string[] resourcenames) { bool res = false; if (MessageBox.Show(owner, Strings.ResourceDataEditor.DeleteFileConfirmation, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) { foreach(string resourcename in resourcenames) { bool retry = true; while(retry) try { retry = false; res = true; connection.DeleteResourceData(resourceId, resourcename); } catch (Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); switch (MessageBox.Show(owner, string.Format(Strings.ResourceDataEditor.DeleteFailedQuestion, resourcename, msg), Application.ProductName, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error)) { case DialogResult.Abort: return res; case DialogResult.Retry: retry = true; continue; } } } } return res; } public static bool DownloadResourceFiles(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, ListView lv) { if (lv.SelectedItems.Count == 0) return false; string[] items = new string[lv.SelectedItems.Count]; for(int i = 0; i < lv.SelectedItems.Count; i++) items[i] = lv.SelectedItems[i].Text; return DownloadResourceFiles(owner, connection, resourceId, items); } public static bool DownloadResourceFiles(Control owner, OSGeo.MapGuide.MaestroAPI.ServerConnectionI connection, string resourceId, string[] items) { bool res = false; if (items == null || items.Length == 0) return res; else if (items.Length == 1) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Title = Strings.ResourceDataEditor.DownloadFileDialogTitle; dlg.ValidateNames = true; dlg.OverwritePrompt = true; dlg.AddExtension = true; dlg.CheckPathExists = true; dlg.CreatePrompt = false; dlg.DefaultExt = System.IO.Path.GetExtension(items[0]); dlg.DereferenceLinks = true; dlg.FileName = items[0]; dlg.Filter = Strings.Common.AllFiles + "|*.*"; if (dlg.ShowDialog(owner) == DialogResult.OK) { bool retry = true; while(retry) try { retry = false; res = true; using(System.IO.MemoryStream ms = connection.GetResourceData(resourceId, items[0])) using(System.IO.FileStream fs = new System.IO.FileStream(dlg.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) ms.WriteTo(fs); } catch(Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); switch (MessageBox.Show(owner, string.Format(Strings.ResourceDataEditor.DownloadFailedQuestion, items[0], msg), Application.ProductName, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error)) { case DialogResult.Abort: return res; case DialogResult.Retry: retry = true; continue; } } } } else { FolderBrowserDialog dlg = new FolderBrowserDialog(); dlg.Description = Strings.ResourceDataEditor.DownloadFilesDialogTitle; dlg.ShowNewFolderButton = true; if (dlg.ShowDialog(owner) == DialogResult.OK) { foreach(string item in items) { bool retry = true; while(retry) try { retry = false; bool download = true; string targetpath = System.IO.Path.Combine(dlg.SelectedPath, item); if (System.IO.File.Exists(targetpath)) switch(MessageBox.Show(owner, string.Format(Strings.ResourceDataEditor.OverwriteLocalFileConfirmation, item), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) { case DialogResult.No: download = false; break; case DialogResult.Cancel: return res; } if (!download) continue; res = true; using(System.IO.MemoryStream ms = connection.GetResourceData(resourceId, item)) using(System.IO.FileStream fs = new System.IO.FileStream(targetpath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) ms.WriteTo(fs); } catch(Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); switch (MessageBox.Show(owner, string.Format(Strings.ResourceDataEditor.DownloadFailedQuestion, item, msg), Application.ProductName, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error)) { case DialogResult.Abort: return res; case DialogResult.Retry: retry = true; continue; } } } } } return res; } private void ResourceDataFiles_SizeChanged(object sender, System.EventArgs e) { ResourceDataFiles.Columns[0].Width = Math.Max(60, ResourceDataFiles.Width - ResourceDataFiles.Columns[1].Width - 20); } private void ChangeType_Clicked(object sender, System.EventArgs e) { MenuItem menu = sender as MenuItem; if (menu == null) return; if (ResourceDataFiles.SelectedItems.Count == 0) return; if (!EnsureTempResource()) return; OSGeo.MapGuide.MaestroAPI.ResourceDataType targetType = (OSGeo.MapGuide.MaestroAPI.ResourceDataType)Enum.Parse(typeof(OSGeo.MapGuide.MaestroAPI.ResourceDataType), menu.Text); foreach(ListViewItem i in ResourceDataFiles.SelectedItems) { bool retry = true; while(retry) try { retry = false; using (System.IO.Stream s = m_editor.CurrentConnection.GetResourceData(m_tempresourceid, i.Text)) { m_editor.CurrentConnection.DeleteResourceData(m_tempresourceid, i.Text); if (ResourceDataChanged != null) ResourceDataChanged(this, null); try { m_editor.CurrentConnection.SetResourceData(m_tempresourceid, i.Text, targetType, s); } catch { try { //Attempt to recover the file s.Position = 0; m_editor.CurrentConnection.SetResourceData(m_tempresourceid, i.Text, ((MaestroAPI.ResourceDataListResourceData)i.Tag).Type, s); } catch { } throw; } } } catch(Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); m_editor.SetLastException(ex); switch (MessageBox.Show(this, string.Format(Strings.ResourceDataEditor.DownloadFailedQuestion, i.Text, msg), Application.ProductName, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error)) { case DialogResult.Abort: RefreshFileList(); UpdateDisplay(); return; case DialogResult.Retry: retry = true; continue; } } } RefreshFileList(); UpdateDisplay(); } private void ResourceDataEditor_Load(object sender, System.EventArgs e) { UpdateDisplay(); } private void contextMenu_Popup(object sender, System.EventArgs e) { } public bool ResourceExists { get { return m_resourceExists; } set { m_resourceExists = value; this.Enabled = value; UpdateDisplay(); } } public string ResourceID { get { return m_resourceid; } set { //It's faster if we don't clean up, and just let the session expire /*if (m_tempresourceid != null) { try { m_editor.CurrentConnection.DeleteResource(m_tempresourceid); } catch { } }*/ m_resourceid = value; m_tempresourceid = null; RefreshFileList(); UpdateDisplay(); } } public void SaveChanges() { if (m_tempresourceid != null && m_resourceid != null && m_tempresourceid != m_resourceid) { m_editor.CurrentConnection.MoveResource(m_tempresourceid, m_resourceid, true); m_tempresourceid = null; } } public OSGeo.MapGuide.MaestroAPI.ServerConnectionI Connection { get { return m_editor.CurrentConnection; } } public EditorInterface Editor { get { return m_editor; } set { m_editor = value; } } private void AddFileButton_Click(object sender, EventArgs e) { if (!EnsureTempResource()) return; if (AddFilesToResource(this, m_editor.CurrentConnection, m_tempresourceid, m_resourceFiles)) { if (ResourceDataChanged != null) ResourceDataChanged(this, null); RefreshFileList(); UpdateDisplay(); } } private bool EnsureTempResource() { try { if (this.UseTemporaryResource) { if (m_tempresourceid == null) { string tmp = "Session:" + m_editor.CurrentConnection.SessionID + "//" + Guid.NewGuid().ToString() + "." + new MaestroAPI.ResourceIdentifier(m_resourceid).Extension; m_editor.CurrentConnection.CopyResource(m_resourceid, tmp, true); m_tempresourceid = tmp; } } else m_tempresourceid = m_resourceid; } catch (Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); m_editor.SetLastException(ex); MessageBox.Show(this, string.Format(Strings.ResourceDataEditor.FailedToCreateCopyError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } return true; } private void DeleteFileButton_Click(object sender, EventArgs e) { if (!EnsureTempResource()) return; if (DeleteFilesFromResource(this, m_editor.CurrentConnection, m_tempresourceid, ResourceDataFiles)) { if (ResourceDataChanged != null) ResourceDataChanged(this, null); RefreshFileList(); UpdateDisplay(); } } private void DownloadFileButton_Click(object sender, EventArgs e) { if (!EnsureTempResource()) return; if (DownloadResourceFiles(this, m_editor.CurrentConnection, m_tempresourceid, ResourceDataFiles)) { RefreshFileList(); UpdateDisplay(); } } private void ToggleDocumentsButton_Click(object sender, EventArgs e) { ToggleDocumentsButton.Checked = !ToggleDocumentsButton.Checked; UpdateDisplay(); } private void EditResourceXmlMenu_Click(object sender, EventArgs e) { try { if (ResourceDataFiles.SelectedItems.Count != 1) return; if (!EnsureTempResource()) return; XmlEditor dlg; using (System.IO.StreamReader sr = new System.IO.StreamReader(m_editor.CurrentConnection.GetResourceData(m_tempresourceid, ResourceDataFiles.SelectedItems[0].Text), System.Text.Encoding.UTF8, true)) dlg = new XmlEditor(sr.ReadToEnd(), m_editor.CurrentConnection); if (dlg.ShowDialog(this) == DialogResult.OK) { using (System.IO.MemoryStream ms = new System.IO.MemoryStream(new System.Text.UTF8Encoding(false).GetBytes(dlg.EditorText))) m_editor.CurrentConnection.SetResourceData(m_tempresourceid, ResourceDataFiles.SelectedItems[0].Text, ((MaestroAPI.ResourceDataListResourceData)(ResourceDataFiles.SelectedItems[0].Tag)).Type, ms); if (ResourceDataChanged != null) ResourceDataChanged(this, null); } } catch (Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); m_editor.SetLastException(ex); MessageBox.Show(this, string.Format(Strings.ResourceDataEditor.UpdateXmlDataError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }