editor-legacy/Libraries/UniversalEditor.UserInterface/Controls/UniversalEditorFileBrowserControl.cs
2021-05-07 22:05:11 -04:00

200 lines
6.3 KiB
C#

//
// UniversalEditorFileBrowserControl.cs
//
// Author:
// Mike Becker <alcexhim@gmail.com>
//
// Copyright (c) 2019 Mike Becker
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using MBS.Framework.UserInterface;
using MBS.Framework.UserInterface.Layouts;
using MBS.Framework.UserInterface.Controls.FileBrowser;
using MBS.Framework.UserInterface.Controls;
using System.Collections.Generic;
using MBS.Framework.UserInterface.Dialogs;
using System.Text;
namespace UniversalEditor.UserInterface.Controls
{
public class UniversalEditorFileBrowserControl : Container
{
private FileBrowserControl _Browser = null;
private Container _Table = null;
private GenericBrowserButton<ObjectModel, ObjectModelReference> cboObjectModel = null;
private GenericBrowserButton<DataFormat, DataFormatReference> cboDataFormat = null;
public FileBrowserMode Mode { get { return _Browser.Mode; } set { _Browser.Mode = value; } }
public ObjectModel ObjectModel { get; set; } = null;
public DataFormat DataFormat { get; set; } = null;
public System.Collections.ObjectModel.ReadOnlyCollection<string> SelectedFileNames { get { return _Browser.SelectedFileNames; } }
public UniversalEditorFileBrowserControl ()
{
this.Layout = new BoxLayout (Orientation.Vertical);
_Browser = new FileBrowserControl ();
_Browser.ItemActivated += _Browser_ItemActivated;
this.Controls.Add (_Browser, new BoxLayout.Constraints (true, true));
cboObjectModel = new GenericBrowserButton<ObjectModel, ObjectModelReference> ();
cboObjectModel.SelectedObject = ObjectModel;
cboObjectModel.SelectionChanged += cboObjectModel_SelectionChanged;
cboObjectModel.Label = "Object _model: ";
ObjectModelReference[] omrs = new ObjectModelReference[0];
if (Mode == FileBrowserMode.Save)
{
// show all dataformats for the current object model
if (DataFormat == null)
{
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels();
}
else
{
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(DataFormat.MakeReference());
}
}
else if (Mode == FileBrowserMode.Open)
{
/*
if (Accessor != null)
{
// show all dataformats for the current accessor
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(Accessor);
}
else*/
{
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels();
}
}
foreach (ObjectModelReference omr in omrs)
{
cboObjectModel.AvailableObjects.Add(omr);
}
cboDataFormat = new GenericBrowserButton<DataFormat, DataFormatReference> ();
cboDataFormat.SelectionChanged += cboDataFormat_SelectionChanged;
cboDataFormat.Label = "Data _format: ";
DataFormatReference[] dfrs = new DataFormatReference[0];
if (Mode == FileBrowserMode.Save)
{
// show all dataformats for the current object model
Association[] assocs = Association.FromCriteria(new AssociationCriteria() { ObjectModel = ObjectModel.MakeReference() });
List<DataFormatReference> dfrlist = new List<DataFormatReference>();
foreach (Association assoc in assocs)
{
foreach (DataFormatReference dfr in assoc.DataFormats)
{
dfrlist.Add(dfr);
}
}
dfrs = dfrlist.ToArray();
}
else if (Mode == FileBrowserMode.Open)
{
if (false) // (Accessor != null)
{
/*
// TODO: This desperately needs to be fixed; GetAvailableDataFormats should take
// an accessor, not a file name, as parameter to be cross-accessor compatible!!!
// so... have we fixed this now?
if (mvarAccessor is FileAccessor)
{
*/
// show all dataformats for the current accessor
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(/*Accessor*/);
/*
}
else
{
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats();
}
*/
}
else if (ObjectModel != null)
{
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(ObjectModel.MakeReference());
}
else
{
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats();
}
}
foreach (DataFormatReference dfr in dfrs)
{
cboDataFormat.AvailableObjects.Add(dfr);
}
_Table = new Container ();
_Table.Layout = new BoxLayout (Orientation.Horizontal);
_Table.Controls.Add (cboObjectModel, new BoxLayout.Constraints (true, true));
_Table.Controls.Add (cboDataFormat, new BoxLayout.Constraints (true, true));
this.Controls.Add (_Table, new BoxLayout.Constraints (false, false));
}
void cboDataFormat_SelectionChanged(object sender, EventArgs e)
{
_Browser.FileNameFilters.Clear();
Association[] assocs = Association.FromCriteria(new AssociationCriteria { ObjectModel = cboObjectModel.SelectedObject.MakeReference(), DataFormat = cboDataFormat.SelectedObject.MakeReference() });
for (int i = 0; i < assocs.Length; i++)
{
for (int j = 0; j < assocs[i].Filters.Count; j++)
{
FileDialogFileNameFilter filter = new FileDialogFileNameFilter();
filter.Title = assocs[i].Filters[j].Title;
StringBuilder sb = new StringBuilder();
for (int k = 0; k < assocs[i].Filters[j].FileNameFilters.Count; k++)
{
sb.Append(assocs[i].Filters[j].FileNameFilters[k]);
if (k < assocs[i].Filters[j].FileNameFilters.Count - 1)
sb.Append('|');
}
filter.Filter = sb.ToString();
_Browser.FileNameFilters.Add(filter);
}
}
}
void cboObjectModel_SelectionChanged(object sender, EventArgs e)
{
cboDataFormat.OpenDropDown();
}
public event EventHandler ItemActivated;
protected virtual void OnItemActivated (EventArgs e)
{
ItemActivated?.Invoke (this, e);
}
void _Browser_ItemActivated (object sender, EventArgs e)
{
OnItemActivated (e);
}
}
}