#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.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OSGeo.MapGuide.MaestroAPI.Services;
using Aga.Controls.Tree;
using OSGeo.MapGuide.ObjectModels.Common;
using System.IO;
namespace Maestro.Editors.Common
{
///
/// A dialog to browse and select unmanaged resources
///
public partial class UnmanagedFileBrowser : Form
{
abstract class ModelBase
{
public ModelBase(T item) { this.Tag = item; }
public T Tag { get; private set; }
}
class FolderModel : ModelBase
{
public FolderModel(UnmanagedDataListUnmanagedDataFolder folder)
: base(folder)
{
this.Name = folder.FolderName;
this.HasChildren = (folder.NumberOfFolders > 0);
}
public string Name { get; private set; }
public bool HasChildren { get; private set; }
public Image Icon { get { return Properties.Resources.folder_horizontal; } }
}
class FolderTreeModel : ITreeModel
{
private IResourceService _resSvc;
public FolderTreeModel(IResourceService resSvc)
{
_resSvc = resSvc;
}
public System.Collections.IEnumerable GetChildren(TreePath treePath)
{
if (treePath.IsEmpty())
{
var list = _resSvc.EnumerateUnmanagedData(null, null, false, OSGeo.MapGuide.MaestroAPI.UnmanagedDataTypes.Folders);
foreach (var item in list.Items)
{
if (typeof(UnmanagedDataListUnmanagedDataFolder).IsAssignableFrom(item.GetType()))
{
var folder = (UnmanagedDataListUnmanagedDataFolder)item;
yield return new FolderModel(folder);
}
}
}
else
{
var mdl = treePath.LastNode as FolderModel;
if (mdl != null)
{
var folder = mdl.Tag;
if (folder.NumberOfFolders > 0)
{
var list = _resSvc.EnumerateUnmanagedData(folder.UnmanagedDataId, null, false, OSGeo.MapGuide.MaestroAPI.UnmanagedDataTypes.Folders);
foreach (var item in list.Items)
{
if (typeof(UnmanagedDataListUnmanagedDataFolder).IsAssignableFrom(item.GetType()))
{
var fl = (UnmanagedDataListUnmanagedDataFolder)item;
yield return new FolderModel(fl);
}
}
}
}
}
}
public bool IsLeaf(TreePath treePath)
{
var mdl = treePath.LastNode as FolderModel;
if (mdl != null)
return mdl.Tag.NumberOfFolders == 0;
else
return true;
}
public event EventHandler NodesChanged;
public event EventHandler NodesInserted;
public event EventHandler NodesRemoved;
public event EventHandler StructureChanged;
}
private bool _selectFoldersOnly;
///
/// Gets or sets a value indicating whether [select folders only].
///
/// true if [select folders only]; otherwise, false.
public bool SelectFoldersOnly
{
get { return _selectFoldersOnly; }
set
{
_selectFoldersOnly = value;
splitContainer1.Panel2Collapsed = value;
}
}
///
/// Gets or sets whether multiple selections are allowed
///
public bool AllowMultipleSelection
{
get { return lstResources.MultiSelect; }
set
{
if (value && this.SelectFoldersOnly)
throw new InvalidOperationException(Properties.Resources.UnmanagedBrowserMultiSelectionNotAllowed);
lstResources.MultiSelect = value;
}
}
private UnmanagedFileBrowser()
{
InitializeComponent();
_fileExtensions = new List();
}
private IResourceService _resSvc;
///
/// Initializes a new instance of the class.
///
/// The res SVC.
public UnmanagedFileBrowser(IResourceService resSvc)
: this()
{
_resSvc = resSvc;
trvFolders.Model = new FolderTreeModel(_resSvc);
}
private List _fileExtensions;
///
/// Gets or sets the file extensions to filter the files by. If empty, no filtering
/// will be done
///
public string[] Extensions
{
get { return _fileExtensions.ToArray(); }
set
{
_fileExtensions.Clear();
for (int i = 0; i < value.Length; i++)
{
_fileExtensions.Add(value[i].ToLower());
}
}
}
///
/// Gets the selected item.
///
/// The selected item.
public string SelectedItem
{
get
{
return SelectedItems[0];
}
}
///
/// Gets the selected items
///
public string[] SelectedItems
{
get
{
List items = new List();
string[] tokens = txtItem.Text.Split('\t');
foreach (var path in tokens)
{
var leftpart = path.Substring(0, path.IndexOf("]"));
var rightpart = path.Substring(path.IndexOf("]") + 1);
items.Add("%MG_DATA_PATH_ALIAS" + leftpart + "]%" + rightpart);
}
return items.ToArray();
}
}
private void trvFolders_SelectionChanged(object sender, EventArgs e)
{
if (trvFolders.SelectedNode != null)
{
var mdl = trvFolders.SelectedNode.Tag as FolderModel;
if (mdl != null)
{
if (this.SelectFoldersOnly)
{
txtItem.Text = mdl.Tag.UnmanagedDataId;
return;
}
else
{
//TODO: file filter
var list = _resSvc.EnumerateUnmanagedData(mdl.Tag.UnmanagedDataId, null, false, OSGeo.MapGuide.MaestroAPI.UnmanagedDataTypes.Files);
PopulateFileList(list);
}
}
}
}
private void PopulateFileList(UnmanagedDataList list)
{
lstResources.Items.Clear();
foreach (var item in list.Items)
{
var f = item as UnmanagedDataListUnmanagedDataFile;
if (f != null)
{
var ext = Path.GetExtension(f.FileName);
if (string.IsNullOrEmpty(ext))
continue;
if (_fileExtensions.Count > 0 && !_fileExtensions.Contains(ext.ToLower().Substring(1)))
continue;
if (typeof(UnmanagedDataListUnmanagedDataFile).IsAssignableFrom(item.GetType()))
{
var file = (UnmanagedDataListUnmanagedDataFile)item;
var li = new ListViewItem();
li.Name = file.UnmanagedDataId;
li.Text = file.FileName;
li.ImageIndex = GetImageIndex(li.Text);
lstResources.Items.Add(li);
}
}
}
}
private int GetImageIndex(string fileName)
{
string ext = fileName.Substring(fileName.LastIndexOf(".") + 1);
switch (ext.ToUpper())
{
case "EXE":
return IDX_FILE_EXE;
case "DOC":
case "DOCX":
return IDX_FILE_DOC;
case "MDB":
case "ACCDB":
return IDX_FILE_MDB;
case "XLS":
case "XLSX":
return IDX_FILE_XLS;
case "CSV":
return IDX_FILE_CSV;
case "MOV":
case "MPG":
case "AVI":
case "MP4":
case "WMV":
case "ASF":
case "FLV":
return IDX_FILE_MOVIE;
case "HTM":
case "HTML":
return IDX_FILE_HTML;
case "PNG":
case "JPG":
case "GIF":
case "ICO":
case "BMP":
case "TGA":
return IDX_FILE_IMAGE;
case "PDF":
return IDX_FILE_PDF;
case "PHP":
return IDX_FILE_PHP;
case "PPT":
case "PPTX":
return IDX_FILE_PPT;
case "TXT":
return IDX_FILE_TXT;
case "ZIP":
case "RAR":
case "ACE":
case "7Z":
case "GZ":
case "TAR":
case "BZ2":
return IDX_FILE_ARCHIVE;
case "XML":
return IDX_FILE_XML;
default:
return IDX_FILE_UNKNOWN;
}
}
const int IDX_FILE_UNKNOWN = 0;
const int IDX_FILE_EXE = 1;
const int IDX_FILE_DOC = 2;
const int IDX_FILE_MDB = 3;
const int IDX_FILE_XLS = 4;
const int IDX_FILE_CSV = 5;
const int IDX_FILE_MOVIE = 6;
const int IDX_FILE_HTML = 7;
const int IDX_FILE_IMAGE = 8;
const int IDX_FILE_PDF = 9;
const int IDX_FILE_PHP = 10;
const int IDX_FILE_PPT = 11;
const int IDX_FILE_TXT = 12;
const int IDX_FILE_ARCHIVE = 13;
const int IDX_FILE_XML = 14;
private void lstResources_SelectedIndexChanged(object sender, EventArgs e)
{
if (lstResources.SelectedItems.Count == 1)
{
txtItem.Text = lstResources.SelectedItems[0].Name;
}
else
{
List names = new List();
foreach (ListViewItem item in lstResources.SelectedItems)
{
names.Add(item.Name);
}
txtItem.Text = string.Join("\t", names.ToArray());
}
}
private void txtFile_TextChanged(object sender, EventArgs e)
{
btnOK.Enabled = !string.IsNullOrEmpty(txtItem.Text);
}
private void btnOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
}
}