using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using CategoryTheory;
using DiagramUI.Labels;
using Diagram.UI.Factory;
using Diagram.UI.Interfaces.Labels;
using Diagram.UI.Interfaces;
using DiagramUI.Interfaces;
namespace DiagramUI.Factory
{
/// <summary>
/// Default Factory
/// </summary>
public class DefaultFactory : EmptyUIFactory
{
#region Fields
private string ext;
/// <summary>
/// Buttons of default objects
/// </summary>
public static readonly ButtonWrapper[] DefaultObjectButtons =
new ButtonWrapper[]
{
new ButtonWrapper(typeof(DiagramUI.MultiLibraryObject),
"", "Multi library", ResourceImage.MultiInterface, null, true, false)
};
#endregion
#region Ctor
/// <summary>
/// Constructor
/// </summary>
/// <param name="ext">Extention</param>
public DefaultFactory(string ext)
{
this.ext = ext;
}
#endregion
#region Overriden Members
/// <summary>
/// Creates object from button
/// </summary>
/// <param name="button">The button</param>
/// <returns>The object</returns>
public override ICategoryObject CreateObject(IPaletteButton button)
{
if (button.ReflectionType.Equals(typeof(LibraryObjectWrapper)))
{
return LibraryObjectWrapper.Create(button.Kind);
}
if (button.ReflectionType.Equals(typeof(ObjectContainer)))
{
return load(button.Kind);
}
return null;
}
/// <summary>
/// Creates object label
/// </summary>
/// <param name="button">Corresponding button</param>
/// <returns>The object label</returns>
public override IObjectLabelUI CreateObjectLabel(IPaletteButton button)
{
Type t = button.ReflectionType;
if (t.Equals(typeof(IObjectContainer)))
{
return new ContainerObjectLabel(button);
}
return null;
}
#endregion
#region Members
ICategoryObject load(string str)
{
Stream stream = null;
bool cont = true;
string fn = ResourceService.Resources.CurrentDirectory + "Containers" + Path.DirectorySeparatorChar + str;
if (File.Exists(fn))
{
stream = File.OpenRead(fn);
int n = fn.LastIndexOf('.');
if (fn.Substring(n + 1).ToLower().Equals(ext))
{
cont = false;
}
}
/* else
{
string ext = null;
byte[] buffer = data.GetData(str, ref ext);
ext = ext.Trim();
if (!ext.ToLower().Equals("cont"))
{
cont = false;
}
stream = new MemoryStream(buffer);
}*/
if (cont)
{
return loadContainer(stream) as ICategoryObject;
}
return loadMultilibrary(stream);
}
IObjectContainer loadContainer(Stream stream)
{
BinaryFormatter binary = new BinaryFormatter();
IObjectContainer ob = binary.Deserialize(stream) as IObjectContainer;
stream.Close();
return ob;
}
MultiLibraryObject loadMultilibrary(Stream stream)
{
BinaryFormatter binary = new BinaryFormatter();
SerializationBinder[] binders = null;
PureDesktopPeer d = new PureDesktopPeer();
d.Load(stream, binders, true);
stream.Close();
IObjectLabel l = d.Objects[0] as IObjectLabel;
ICategoryObject ob = l.Object;
return ob as MultiLibraryObject;
}
#endregion
}
}