summaryrefslogtreecommitdiff
path: root/platform/windows/gsview/About.xaml.cs
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2014-09-09 16:31:31 -0700
committerMichael Vrhel <michael.vrhel@artifex.com>2014-09-09 16:39:41 -0700
commit7ea99e3a8951e265d1437a77dcfee069de0edf76 (patch)
tree8e113fea67931064e2a9338d67b26aaabab27512 /platform/windows/gsview/About.xaml.cs
parent8a9519f2183b64fe220bcb1f6acedbe6acc190cd (diff)
downloadmupdf-7ea99e3a8951e265d1437a77dcfee069de0edf76.tar.xz
Rename of winrt to windows due to presence on gsview in this folder.
The contents of this folder will contain both winrt and gsview projects which are shared in a common visual studio 2013 solution.
Diffstat (limited to 'platform/windows/gsview/About.xaml.cs')
-rw-r--r--platform/windows/gsview/About.xaml.cs255
1 files changed, 255 insertions, 0 deletions
diff --git a/platform/windows/gsview/About.xaml.cs b/platform/windows/gsview/About.xaml.cs
new file mode 100644
index 00000000..6bd50cbe
--- /dev/null
+++ b/platform/windows/gsview/About.xaml.cs
@@ -0,0 +1,255 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using System.Windows;
+using System.Windows.Data;
+using System.Xml;
+using System.ComponentModel;
+
+namespace gsview
+{
+ /// <summary>
+ /// Interaction logic for About.xaml
+ /// </summary>
+ public partial class About : Window
+ {
+ /// <summary>
+ /// Default constructor is protected so callers must use one with a parent.
+ /// </summary>
+ protected About()
+ {
+ InitializeComponent();
+ }
+
+
+ /// <summary>
+ /// Constructor that takes a parent for this About dialog.
+ /// </summary>
+ /// <param name="parent">Parent window for this dialog.</param>
+ public About(Window parent)
+ : this()
+ {
+ this.Owner = parent;
+ }
+
+ /// <summary>
+ /// Handles click navigation on the hyperlink in the About dialog.
+ /// </summary>
+ /// <param name="sender">Object the sent the event.</param>
+ /// <param name="e">Navigation events arguments.</param>
+ private void hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
+ {
+ if (e.Uri != null && string.IsNullOrEmpty(e.Uri.OriginalString) == false)
+ {
+ string uri = e.Uri.AbsoluteUri;
+ Process.Start(new ProcessStartInfo(uri));
+ e.Handled = true;
+ }
+ }
+
+ #region AboutData Provider
+ #region Member data
+ private XmlDocument xmlDoc = null;
+ private string variabledescription;
+ private const string propertyNameTitle = "Title";
+ private const string propertyNameDescription = "Description";
+ private const string propertyNameProduct = "Product";
+ private const string propertyNameCopyright = "Copyright";
+ private const string propertyNameCompany = "Company";
+ private const string xPathRoot = "ApplicationInfo/";
+ private const string xPathTitle = xPathRoot + propertyNameTitle;
+ private const string xPathVersion = xPathRoot + "Version";
+ private const string xPathDescription = xPathRoot + propertyNameDescription;
+ private const string xPathProduct = xPathRoot + propertyNameProduct;
+ private const string xPathCopyright = xPathRoot + propertyNameCopyright;
+ private const string xPathCompany = xPathRoot + propertyNameCompany;
+ private const string xPathLink = xPathRoot + "Link";
+ private const string xPathLinkUri = xPathRoot + "Link/@Uri";
+ #endregion
+
+ #region Properties
+ /// <summary>
+ /// Gets the title property, which is display in the About dialogs window title.
+ /// </summary>
+ public string ProductTitle
+ {
+ get
+ {
+ string result = CalculatePropertyValue<AssemblyTitleAttribute>(propertyNameTitle, xPathTitle);
+ if (string.IsNullOrEmpty(result))
+ {
+ // otherwise, just get the name of the assembly itself.
+ result = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
+ }
+ return result;
+ }
+ }
+
+ /// <summary>
+ /// Gets the application's version information to show.
+ /// </summary>
+ public string Version
+ {
+ get
+ {
+ string result = string.Empty;
+ // first, try to get the version string from the assembly.
+ Version version = Assembly.GetExecutingAssembly().GetName().Version;
+ if (version != null)
+ {
+ result = version.ToString();
+ }
+ else
+ {
+ // if that fails, try to get the version from a resource in the Application.
+ result = GetLogicalResourceString(xPathVersion);
+ }
+ return result;
+ }
+ }
+
+ /// <summary>
+ /// Gets the description about the application.
+ /// </summary>
+ public string Description
+ {
+ get { return CalculatePropertyValue<AssemblyDescriptionAttribute>(propertyNameDescription, xPathDescription);}
+ }
+
+ public string VariableDescription
+ {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Gets the product's full name.
+ /// </summary>
+ public string Product
+ {
+ get { return CalculatePropertyValue<AssemblyProductAttribute>(propertyNameProduct, xPathProduct); }
+ }
+
+ /// <summary>
+ /// Gets the copyright information for the product.
+ /// </summary>
+ public string Copyright
+ {
+ get { return CalculatePropertyValue<AssemblyCopyrightAttribute>(propertyNameCopyright, xPathCopyright); }
+ }
+
+ /// <summary>
+ /// Gets the product's company name.
+ /// </summary>
+ public string Company
+ {
+ get { return CalculatePropertyValue<AssemblyCompanyAttribute>(propertyNameCompany, xPathCompany); }
+ }
+
+ /// <summary>
+ /// Gets the link text to display in the About dialog.
+ /// </summary>
+ public string LinkText
+ {
+ get { return GetLogicalResourceString(xPathLink); }
+ }
+
+ /// <summary>
+ /// Gets the link uri that is the navigation target of the link.
+ /// </summary>
+ public string LinkUri
+ {
+ get { return GetLogicalResourceString(xPathLinkUri); }
+ }
+ #endregion
+
+ #region Resource location methods
+ /// <summary>
+ /// Gets the specified property value either from a specific attribute, or from a resource dictionary.
+ /// </summary>
+ /// <typeparam name="T">Attribute type that we're trying to retrieve.</typeparam>
+ /// <param name="propertyName">Property name to use on the attribute.</param>
+ /// <param name="xpathQuery">XPath to the element in the XML data resource.</param>
+ /// <returns>The resulting string to use for a property.
+ /// Returns null if no data could be retrieved.</returns>
+ private string CalculatePropertyValue<T>(string propertyName, string xpathQuery)
+ {
+ string result = string.Empty;
+ // first, try to get the property value from an attribute.
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(T), false);
+ if (attributes.Length > 0)
+ {
+ T attrib = (T)attributes[0];
+ PropertyInfo property = attrib.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
+ if (property != null)
+ {
+ result = property.GetValue(attributes[0], null) as string;
+ }
+ }
+
+ // if the attribute wasn't found or it did not have a value, then look in an xml resource.
+ if (result == string.Empty)
+ {
+ // if that fails, try to get it from a resource.
+ result = GetLogicalResourceString(xpathQuery);
+ }
+ return result;
+ }
+
+ /// <summary>
+ /// Gets the XmlDataProvider's document from the resource dictionary.
+ /// </summary>
+ protected virtual XmlDocument ResourceXmlDocument
+ {
+ get
+ {
+ if (xmlDoc == null)
+ {
+ // if we haven't already found the resource XmlDocument, then try to find it.
+ XmlDataProvider provider = this.TryFindResource("aboutProvider") as XmlDataProvider;
+ if (provider != null)
+ {
+ // save away the XmlDocument, so we don't have to get it multiple times.
+ xmlDoc = provider.Document;
+ }
+ }
+ return xmlDoc;
+ }
+ }
+
+ /// <summary>
+ /// Gets the specified data element from the XmlDataProvider in the resource dictionary.
+ /// </summary>
+ /// <param name="xpathQuery">An XPath query to the XML element to retrieve.</param>
+ /// <returns>The resulting string value for the specified XML element.
+ /// Returns empty string if resource element couldn't be found.</returns>
+ protected virtual string GetLogicalResourceString(string xpathQuery)
+ {
+ string result = string.Empty;
+ // get the About xml information from the resources.
+ XmlDocument doc = this.ResourceXmlDocument;
+ if (doc != null)
+ {
+ // if we found the XmlDocument, then look for the specified data.
+ XmlNode node = doc.SelectSingleNode(xpathQuery);
+ if (node != null)
+ {
+ if (node is XmlAttribute)
+ {
+ // only an XmlAttribute has a Value set.
+ result = node.Value;
+ }
+ else
+ {
+ // otherwise, need to just return the inner text.
+ result = node.InnerText;
+ }
+ }
+ }
+ return result;
+ }
+ #endregion
+ #endregion
+ }
+}