#region Disclaimer / License
// Copyright (C) 2010, Jackie Ng
// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie@gmail.com
//
// 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.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using OSGeo.MapGuide.MaestroAPI.Services;
using OSGeo.MapGuide.ObjectModels.Common;
using System.IO;
using Maestro.Shared.UI;
using OSGeo.MapGuide.MaestroAPI.Exceptions;
using OSGeo.MapGuide.MaestroAPI.Resource;
using OSGeo.MapGuide.MaestroAPI;
namespace Maestro.Editors.Common
{
///
/// A control that manages attached resource data for a resource
///
public partial class ResourceDataCtrl : UserControl
{
///
/// Initializes a new instance of the class.
///
public ResourceDataCtrl()
{
InitializeComponent();
this.MarkEnabled = false;
}
///
/// Occurs when [data list changed].
///
public event EventHandler DataListChanged;
private void EvaluateCommands()
{
var items = this.SelectedItems;
btnAdd.Enabled = (_edSvc != null);
btnDelete.Enabled = (_edSvc != null && items.Length > 0);
btnDownload.Enabled = (_edSvc != null && items.Length == 1);
btnMark.Enabled = (items.Length == 1);
}
private IEditorService _edSvc;
private BindingList _data;
private ResourceDataListResourceData SelectedItem
{
get
{
if (lstDataFiles.SelectedItems.Count == 1)
{
return lstDataFiles.SelectedItems[0].Tag as ResourceDataListResourceData;
}
return null;
}
}
private ResourceDataListResourceData[] SelectedItems
{
get
{
var items = new List();
foreach(ListViewItem selItem in lstDataFiles.SelectedItems)
{
items.Add(selItem.Tag as ResourceDataListResourceData);
}
return items.ToArray();
}
}
///
/// Raises the event.
///
/// An that contains the event data.
protected override void OnLoad(EventArgs e)
{
EvaluateCommands();
}
private string _resourceID;
///
/// Inits the specified service.
///
/// The service.
public void Init(IEditorService service)
{
_edSvc = service;
_resourceID = service.EditedResourceID;
LoadResourceData();
EvaluateCommands();
}
///
/// Gets or sets a value indicating whether [mark enabled].
///
/// true if [mark enabled]; otherwise, false.
public bool MarkEnabled
{
get { return btnMark.Visible; }
set { btnMark.Visible = value; }
}
///
/// Gets or sets the marked file.
///
/// The marked file.
public string MarkedFile
{
get
{
foreach (ListViewItem item in lstDataFiles.Items)
{
if (item.Font.Bold)
return (item.Tag as ResourceDataListResourceData).Name;
}
return string.Empty;
}
set
{
MarkResourceDataAsSelected(value);
}
}
private void LoadResourceData()
{
var list = _edSvc.ResourceService.EnumerateResourceData(_edSvc.EditedResourceID);
_data = list.ResourceData;
BindResourceList();
}
///
/// A event handler for uploaded resources
///
///
///
public delegate void ResourceUploadEventHandler(string dataName, string origPath);
///
/// Raised when a data file has been uploaded as resource data
///
public event ResourceUploadEventHandler ResourceDataUploaded;
private void btnAdd_Click(object sender, EventArgs e)
{
using (var open = DialogFactory.OpenFile())
{
open.Multiselect = true;
if (open.ShowDialog() == DialogResult.OK)
{
using (new WaitCursor(this))
{
try
{
foreach (var fileName in open.FileNames)
{
UploadFile(fileName);
var handler = this.ResourceDataUploaded;
if (handler != null)
handler(Path.GetFileName(fileName), fileName);
}
}
catch (Exception ex)
{
MessageBox.Show(NestedExceptionMessageProcessor.GetFullMessage(ex), Properties.Resources.TitleError, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
///
/// Uploads the file.
///
/// Name of the file.
public void UploadFile(string fileName)
{
using (var fs = new FileStream(fileName, FileMode.Open))
{
//_edSvc.AddResourceData(Path.GetFileName(open.FileName), ResourceDataType.File, fs);
IResource res = _edSvc.GetEditedResource();
res.SetResourceData(Path.GetFileName(fileName), ResourceDataType.File, fs);
LoadResourceData();
OnDataListChanged();
}
}
private void OnDataListChanged()
{
var handler = this.DataListChanged;
if (handler != null)
handler(this, EventArgs.Empty);
}
private void btnDelete_Click(object sender, EventArgs e)
{
var items = this.SelectedItems;
if (items.Length > 0)
{
if (MessageBox.Show(Properties.Resources.ConfirmDeleteResourceData, Properties.Resources.Confirm, MessageBoxButtons.YesNo) == DialogResult.No)
return;
try
{
using (new WaitCursor(this))
{
foreach (var item in items)
{
//_edSvc.RemoveResourceData(item.Name);
IResource res = _edSvc.GetEditedResource();
res.DeleteResourceData(item.Name);
_data.Remove(item);
}
BindResourceList();
OnDataListChanged();
}
}
catch (Exception ex)
{
MessageBox.Show(NestedExceptionMessageProcessor.GetFullMessage(ex), Properties.Resources.TitleError, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private Font _defaultFont;
private void btnDownload_Click(object sender, EventArgs e)
{
var item = this.SelectedItem;
if (item != null)
{
using (var save = DialogFactory.SaveFile())
{
save.FileName = item.Name;
if (save.ShowDialog() == DialogResult.OK)
{
try
{
using (new WaitCursor(this))
{
//var stream = _edSvc.GetResourceData(item.Name);
IResource res = _edSvc.GetEditedResource();
var stream = res.GetResourceData(item.Name);
using (var fs = File.OpenWrite(save.FileName))
{
Utility.CopyStream(stream, fs);
}
}
MessageBox.Show(string.Format(Properties.Resources.FileDownloaded, save.FileName));
}
catch (Exception ex)
{
MessageBox.Show(NestedExceptionMessageProcessor.GetFullMessage(ex), Properties.Resources.TitleError, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
private void btnMark_Click(object sender, EventArgs e)
{
if (lstDataFiles.SelectedItems.Count == 1)
{
MarkResourceDataAsSelected(lstDataFiles.SelectedItems[0].Name);
}
}
private void MarkResourceDataAsSelected(string name)
{
ListViewItem item = null;
//Find matching item
foreach (ListViewItem it in lstDataFiles.Items)
{
if (it.Name == name)
{
item = it;
break;
}
}
if (item != null)
{
//Restore original font
foreach (ListViewItem it in lstDataFiles.Items)
{
it.Font = new Font(_defaultFont, _defaultFont.Style);
}
//Bold the selected item
var f = item.Font;
item.Font = new Font(f, f.Style | FontStyle.Bold);
OnResourceDataMarked(item.Name);
}
}
private void BindResourceList()
{
lstDataFiles.Items.Clear();
foreach (var f in _data)
{
var item = new ListViewItem();
item.Tag = f;
item.Text = f.Name;
item.Name = f.Name;
item.ToolTipText = f.Name;
if (_defaultFont == null)
_defaultFont = item.Font;
lstDataFiles.Items.Add(item);
}
}
///
/// Determines whether the specified name contains file.
///
/// The name.
///
/// true if the specified name contains file; otherwise, false.
///
public bool ContainsFile(string name)
{
return lstDataFiles.Items.ContainsKey(name);
}
private void lstDataFiles_SelectedIndexChanged(object sender, EventArgs e)
{
EvaluateCommands();
}
///
/// Occurs when [resource data marked].
///
public event ResourceDataSelectionEventHandler ResourceDataMarked;
private void OnResourceDataMarked(string name)
{
var handler = this.ResourceDataMarked;
if (handler != null)
handler(this, name);
}
private void lstDataFiles_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
Array a = e.Data.GetData(DataFormats.FileDrop) as Array;
if (a != null && a.Length > 0)
{
e.Effect = DragDropEffects.Copy;
}
else
e.Effect = DragDropEffects.None;
}
else
e.Effect = DragDropEffects.None;
}
private void lstDataFiles_DragDrop(object sender, DragEventArgs e)
{
Array a = e.Data.GetData(DataFormats.FileDrop) as Array;
bool refresh = false;
if (a != null && a.Length > 0)
{
for (int i = 0; i < a.Length; i++)
{
string file = a.GetValue(i).ToString();
try
{
using (var fs = new FileStream(file, FileMode.Open))
{
IResource res = _edSvc.GetEditedResource();
res.SetResourceData(Path.GetFileName(file), ResourceDataType.File, fs);
refresh = true;
}
}
catch { }
}
}
if (refresh)
{
LoadResourceData();
OnDataListChanged();
}
}
}
///
///
///
public delegate void ResourceDataSelectionEventHandler(object sender, string dataName);
}