// EMERGENT GAME TECHNOLOGIES PROPRIETARY INFORMATION
//
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Emergent Game Technologies and may not
// be copied or disclosed except in accordance with the terms of that
// agreement.
//
// Copyright (c) 1996-2007 Emergent Game Technologies.
// All Rights Reserved.
//
// Emergent Game Technologies, Chapel Hill, North Carolina 27517
// http://www.emergent.net
using System;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Windows.Forms;
using System.Xml;
using Emergent.Gamebryo.SceneDesigner.Framework;
using Emergent.Gamebryo.SceneDesigner.PluginAPI;
using Emergent.Gamebryo.SceneDesigner.PluginAPI.StandardServices;
using Message = Emergent.Gamebryo.SceneDesigner.PluginAPI.Message;
namespace Emergent.Gamebryo.SceneDesigner.StdPluginsCs.UIBinding
{
///
/// Summary description for DyanmicToolbarBuilder.
///
internal class DynamicToolbarBuilder : AbstractBuilder
{
#region Private Data
private ServiceProvider m_provider;
private IUICommandService m_commandService;
private IToolBarService m_toolbarService;
private IMessageService m_messageService;
//Used to temporarily store the file name of the XML stream
private string m_xmlFileName;
#endregion
public DynamicToolbarBuilder(ServiceProvider provider)
{
m_provider = provider;
m_commandService = m_provider.GetService(typeof(IUICommandService))
as IUICommandService;
m_toolbarService = m_provider.GetService(typeof(IToolBarService))
as IToolBarService;
m_messageService = m_provider.GetService(typeof(IMessageService))
as IMessageService;
}
public override void Build(Stream xmlStream)
{
m_xmlFileName = null;
//Debugger.Break();
FileStream fStream = xmlStream as FileStream;
if (fStream != null)
{
m_xmlFileName = fStream.Name;
}
XmlDocument domObject = ReadXML(xmlStream);
XmlNodeList items =
domObject.DocumentElement.SelectNodes("Toolbar");
BuildFromNodeList(items, "");
}
private void BuildFromNodeList(XmlNodeList items, string s)
{
foreach (XmlNode toolbarNode in items)
{
string name = toolbarNode.SelectSingleNode("@name").Value;
m_toolbarService.AddToolBar(name);
XmlNodeList toolbarItems = toolbarNode.SelectNodes("./*");
BuildToolbar(name, toolbarItems);
}
}
private void BuildToolbar(string toolbarName, XmlNodeList items)
{
foreach (XmlNode item in items)
{
string element = item.Name;
switch (element)
{
case "Button":
{
BuildButton(item, toolbarName);
break;
}
default:
{
string messageText = "Invalid Tag in XML: " + element;
m_messageService.AddMessage(MessageChannelType.Errors,
messageText);
break;
}
}
}
}
private void BuildButton(XmlNode item, string toolbarName)
{
UICommand command = GetCommand(item.SelectSingleNode("Command"));
Image tempImage = GetImage(item.SelectSingleNode("Image"));
if (tempImage != null)
{
string buttonName = item.SelectSingleNode("@name").Value;
m_toolbarService.AddToolBarButton(toolbarName, buttonName,
tempImage, command);
}
}
private UICommand GetCommand(XmlNode node)
{
UICommand command = null;
if (node != null)
{
string name = node.SelectSingleNode("@name").Value;
command = m_commandService.GetCommand(name);
}
return command;
}
private Image GetImage(XmlNode imageNode)
{
Image retVal = null;
//imageNode.Attributes.GetNamedItem("@file");
XmlNode fileNameNode = imageNode.SelectSingleNode("File");
XmlNode resourceNode = imageNode.SelectSingleNode("Resource");
if (fileNameNode != null)
{
string fullPath;
string fileName = fileNameNode.InnerText;
if (m_xmlFileName != null)
{
FileInfo info = new FileInfo(m_xmlFileName);
fullPath = info.DirectoryName + @"\" + fileName;
}
else
{
fullPath = fileName;
}
try
{
retVal = new Bitmap(fullPath);
}
catch (Exception e)
{
Message msg = new Message();
msg.m_strText = "Bitmap resource not loaded:" +
fullPath;
msg.m_strDetails = e.ToString();
m_messageService.AddMessage(MessageChannelType.Errors,
msg);
}
}
else if (resourceNode != null)
{
string resourceName = resourceNode.InnerText;
using (Stream stream = GetResourceStream(resourceName))
{
if (stream != null)
{
retVal = new Bitmap(stream);
}
else
{
string messageText = "Bitmap resource not found:" +
resourceName;
m_messageService.AddMessage(MessageChannelType.Errors,
messageText);
}
}
}
if (retVal != null)
{
retVal = ConvertToScreenBitDepth(retVal);
}
return retVal;
}
///
/// Converts an Image object to use the current desktop's bit-dpeth
///
///
///
///
/// inspired from:
/// http://www.dotnet247.com/247reference/msgs/40/202528.aspx
///
private Image ConvertToScreenBitDepth(Image originalbitmap)
{
Image retVal;
// Get the current desktop screen graphics.
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
// Make a bitmap using that color depth.
retVal =
new Bitmap(originalbitmap.Width, originalbitmap.Height, g);
}
// Start drawing on our new bitmap.
using (Graphics g = Graphics.FromImage(retVal))
{
//Copy the loaded bitmap to the bitmap with proper screen
//depth.
g.DrawImage(originalbitmap, 0, 0, retVal.Width, retVal.Height);
}
return retVal;
}
private Stream GetResourceStream(string name)
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach(Assembly assembly in assemblies)
{
StringCollection resources = new StringCollection();
resources.AddRange(assembly.GetManifestResourceNames());
if (resources.Contains(name))
{
return assembly.GetManifestResourceStream(name);
}
}
return null;
}
}
}