mirror of
https://github.com/crskycode/GARbro.git
synced 2024-11-23 13:45:34 +08:00
298 lines
10 KiB
C#
298 lines
10 KiB
C#
/// Game Resource browser
|
|
//
|
|
// Copyright (C) 2014-2015 by morkt
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Windows;
|
|
using System.Windows.Data;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Navigation;
|
|
using GARbro.GUI.Properties;
|
|
using GARbro.GUI.Strings;
|
|
|
|
namespace GARbro.GUI
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for AboutBox.xaml
|
|
/// </summary>
|
|
public partial class AboutBox : Rnd.Windows.ModalWindow
|
|
{
|
|
public AboutBox()
|
|
{
|
|
InitializeComponent();
|
|
LicenseTabText.Document = GetResourceDoc ("GARbro.GUI.LICENSE");
|
|
}
|
|
|
|
private void Button_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
this.Close();
|
|
}
|
|
|
|
#region License text backend
|
|
|
|
static FlowDocument GetResourceDoc (string resource)
|
|
{
|
|
var assembly = Assembly.GetExecutingAssembly();
|
|
using (var stream = assembly.GetManifestResourceStream (resource))
|
|
{
|
|
if (null == stream)
|
|
return new FlowDocument();
|
|
return ReadPlainText (stream);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Read plain text from stream and return it as FlowDocument.
|
|
/// </summary>
|
|
static FlowDocument ReadPlainText (Stream stream)
|
|
{
|
|
using (var reader = new StreamReader (stream))
|
|
{
|
|
var doc = new FlowDocument();
|
|
var para = new Paragraph();
|
|
for (;;)
|
|
{
|
|
var line = reader.ReadLine();
|
|
if (null == line)
|
|
break;
|
|
if (line.Length > 0)
|
|
{
|
|
if (para.Inlines.Count > 0)
|
|
para.Inlines.Add (" ");
|
|
para.Inlines.Add (line);
|
|
}
|
|
else
|
|
{
|
|
if (0 == para.Inlines.Count)
|
|
para.Inlines.Add (new LineBreak());
|
|
doc.Blocks.Add (para);
|
|
para = new Paragraph();
|
|
}
|
|
}
|
|
if (para.Inlines.Count > 0)
|
|
doc.Blocks.Add (para);
|
|
return doc;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Assembly Attribute Accessors
|
|
|
|
public string AssemblyTitle
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
|
|
if (attributes.Length > 0)
|
|
{
|
|
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
|
|
if (titleAttribute.Title != "")
|
|
{
|
|
return titleAttribute.Title;
|
|
}
|
|
}
|
|
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
|
|
}
|
|
}
|
|
|
|
public string VersionString
|
|
{
|
|
get
|
|
{
|
|
return string.Format (guiStrings.MsgVersion, AssemblyVersion);
|
|
}
|
|
}
|
|
|
|
public string AssemblyVersion
|
|
{
|
|
get
|
|
{
|
|
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
|
}
|
|
}
|
|
|
|
public string AssemblyDescription
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
|
|
}
|
|
}
|
|
|
|
public string AssemblyProduct
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyProductAttribute)attributes[0]).Product;
|
|
}
|
|
}
|
|
|
|
public string AssemblyCopyright
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
|
|
}
|
|
}
|
|
|
|
public string AssemblyCompany
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyCompanyAttribute)attributes[0]).Company;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
private void Hyperlink_RequestNavigate (object sender, RequestNavigateEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (e.Uri.IsAbsoluteUri)
|
|
{
|
|
Process.Start (new ProcessStartInfo (e.Uri.AbsoluteUri));
|
|
e.Handled = true;
|
|
}
|
|
else
|
|
throw new ApplicationException ("URI is not absolute");
|
|
}
|
|
catch (Exception X)
|
|
{
|
|
Trace.WriteLine ("Link navigation failed: "+X.Message, e.Uri.ToString());
|
|
}
|
|
}
|
|
}
|
|
|
|
public class BooleanToVisibiltyConverter : IValueConverter
|
|
{
|
|
/// <summary>Convert a boolean value to a Visibility value</summary>
|
|
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
|
{
|
|
bool isVisible = (bool)value;
|
|
|
|
// If visibility is inverted by the converter parameter, then invert our value
|
|
if (IsVisibilityInverted (parameter))
|
|
isVisible = !isVisible;
|
|
|
|
return (isVisible ? Visibility.Visible : Visibility.Collapsed);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Determine the visibility mode based on a converter parameter. This parameter is
|
|
/// of type Visibility, and specifies what visibility value to return when the boolean
|
|
/// value is true.
|
|
/// </summary>
|
|
private static Visibility GetVisibilityMode(object parameter)
|
|
{
|
|
// Default to Visible
|
|
Visibility mode = Visibility.Visible;
|
|
|
|
// If a parameter is specified, then we'll try to understand it as a Visibility value
|
|
if (parameter != null)
|
|
{
|
|
// If it's already a Visibility value, then just use it
|
|
if (parameter is Visibility)
|
|
{
|
|
mode = (Visibility)parameter;
|
|
}
|
|
else
|
|
{
|
|
// Let's try to parse the parameter as a Visibility value, throwing an exception when the parsing fails
|
|
try
|
|
{
|
|
mode = (Visibility)Enum.Parse(typeof(Visibility), parameter.ToString(), true);
|
|
}
|
|
catch (FormatException e)
|
|
{
|
|
throw new FormatException("Invalid Visibility specified as the ConverterParameter. Use Visible or Collapsed.", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return the detected mode
|
|
return mode;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Determine whether or not visibility is inverted based on a converter parameter.
|
|
/// When the parameter is specified as Collapsed, that means that when the boolean value
|
|
/// is true, we should return Collapsed, which is inverted.
|
|
/// </summary>
|
|
private static bool IsVisibilityInverted(object parameter)
|
|
{
|
|
return (GetVisibilityMode(parameter) == Visibility.Collapsed);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Support 2-way databinding of the VisibilityConverter, converting Visibility to a boolean
|
|
/// </summary>
|
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
|
{
|
|
bool isVisible = ((Visibility)value == Visibility.Visible);
|
|
|
|
// If visibility is inverted by the converter parameter, then invert our value
|
|
if (IsVisibilityInverted(parameter))
|
|
isVisible = !isVisible;
|
|
|
|
return isVisible;
|
|
}
|
|
}
|
|
|
|
[ValueConversion(typeof(bool), typeof(string))]
|
|
class CanCreateConverter : IValueConverter
|
|
{
|
|
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
|
{
|
|
return (bool)value ? "[r/w]" : "[r]";
|
|
}
|
|
|
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|