From 01153ad1a851b7840d50a6509aeaed30d627c0a0 Mon Sep 17 00:00:00 2001 From: morkt Date: Thu, 7 Jan 2016 19:06:08 +0400 Subject: [PATCH] moved GUI project to a subdirectory. --- GARbro.sln | 2 +- AboutBox.xaml => GUI/AboutBox.xaml | 288 +- AboutBox.xaml.cs => GUI/AboutBox.xaml.cs | 554 ++-- App.config => GUI/App.config | 192 +- App.xaml => GUI/App.xaml | 18 +- App.xaml.cs => GUI/App.xaml.cs | 224 +- ArcParameters.xaml => GUI/ArcParameters.xaml | 48 +- .../ArcParameters.xaml.cs | 44 +- AutoComplete.cs => GUI/AutoComplete.cs | 0 ConvertMedia.xaml => GUI/ConvertMedia.xaml | 0 .../ConvertMedia.xaml.cs | 0 CreateArchive.xaml => GUI/CreateArchive.xaml | 0 .../CreateArchive.xaml.cs | 0 DragScroll.cs => GUI/DragScroll.cs | 332 +- .../EnterMaskDialog.xaml | 0 .../EnterMaskDialog.xaml.cs | 0 .../ExtractArchive.xaml | 144 +- .../ExtractArchive.xaml.cs | 142 +- ExtractDialog.cs => GUI/ExtractDialog.cs | 222 +- ExtractFile.xaml => GUI/ExtractFile.xaml | 80 +- .../ExtractFile.xaml.cs | 204 +- GARbro.GUI.csproj => GUI/GARbro.GUI.csproj | 612 ++-- .../GARbro.GUI.csproj.user | 32 +- GarConvert.cs => GUI/GarConvert.cs | 0 GarCreate.cs => GUI/GarCreate.cs | 0 GarExtract.cs => GUI/GarExtract.cs | 0 HistoryStack.cs => GUI/HistoryStack.cs | 218 +- ImagePreview.cs => GUI/ImagePreview.cs | 596 ++-- ListViewEx.cs => GUI/ListViewEx.cs | 0 MainWindow.xaml => GUI/MainWindow.xaml | 800 ++--- MainWindow.xaml.cs => GUI/MainWindow.xaml.cs | 2764 ++++++++--------- ModalWindow.cs => GUI/ModalWindow.cs | 176 +- NAudio.cs => GUI/NAudio.cs | 0 .../Properties}/AssemblyInfo.cs | 110 +- .../Properties}/Resources.Designer.cs | 126 +- {Properties => GUI/Properties}/Resources.resx | 232 +- .../Properties}/Settings.Designer.cs | 722 ++--- .../Properties}/Settings.settings | 178 +- {Properties => GUI/Properties}/app.manifest | 112 +- {Resources => GUI/Resources}/Formats.dat | Bin Settings.cs => GUI/Settings.cs | 86 +- Shell.cs => GUI/Shell.cs | 690 ++-- .../Strings}/guiStrings.Designer.cs | 2098 ++++++------- .../Strings}/guiStrings.ko-KR.resx | 0 {Strings => GUI/Strings}/guiStrings.resx | 902 +++--- .../Strings}/guiStrings.ru-RU.resx | 944 +++--- TextViewer.xaml => GUI/TextViewer.xaml | 0 TextViewer.xaml.cs => GUI/TextViewer.xaml.cs | 0 Utility.cs => GUI/Utility.cs | 302 +- ViewModel.cs => GUI/ViewModel.cs | 460 +-- packages.config => GUI/packages.config | 14 +- Images/32x32/back button.png | Bin 4843 -> 0 bytes Images/32x32/forward button.png | Bin 4773 -> 0 bytes Images/32x32/help.png | Bin 2427 -> 0 bytes Images/48x48/refresh.png | Bin 3068 -> 0 bytes Images/64x64/info.png | Bin 9247 -> 0 bytes Images/sample.ico | Bin 1078 -> 0 bytes Images/search4files.ico | Bin 22486 -> 0 bytes Images/splashscreen.png | Bin 7216 -> 0 bytes packages/repositories.config | 6 - 60 files changed, 7334 insertions(+), 7340 deletions(-) rename AboutBox.xaml => GUI/AboutBox.xaml (98%) rename AboutBox.xaml.cs => GUI/AboutBox.xaml.cs (97%) rename App.config => GUI/App.config (97%) rename App.xaml => GUI/App.xaml (98%) rename App.xaml.cs => GUI/App.xaml.cs (97%) rename ArcParameters.xaml => GUI/ArcParameters.xaml (98%) rename ArcParameters.xaml.cs => GUI/ArcParameters.xaml.cs (96%) rename AutoComplete.cs => GUI/AutoComplete.cs (100%) rename ConvertMedia.xaml => GUI/ConvertMedia.xaml (100%) rename ConvertMedia.xaml.cs => GUI/ConvertMedia.xaml.cs (100%) rename CreateArchive.xaml => GUI/CreateArchive.xaml (100%) rename CreateArchive.xaml.cs => GUI/CreateArchive.xaml.cs (100%) rename DragScroll.cs => GUI/DragScroll.cs (97%) rename EnterMaskDialog.xaml => GUI/EnterMaskDialog.xaml (100%) rename EnterMaskDialog.xaml.cs => GUI/EnterMaskDialog.xaml.cs (100%) rename ExtractArchive.xaml => GUI/ExtractArchive.xaml (98%) rename ExtractArchive.xaml.cs => GUI/ExtractArchive.xaml.cs (97%) rename ExtractDialog.cs => GUI/ExtractDialog.cs (97%) rename ExtractFile.xaml => GUI/ExtractFile.xaml (98%) rename ExtractFile.xaml.cs => GUI/ExtractFile.xaml.cs (97%) rename GARbro.GUI.csproj => GUI/GARbro.GUI.csproj (95%) rename GARbro.GUI.csproj.user => GUI/GARbro.GUI.csproj.user (95%) rename GarConvert.cs => GUI/GarConvert.cs (100%) rename GarCreate.cs => GUI/GarCreate.cs (100%) rename GarExtract.cs => GUI/GarExtract.cs (100%) rename HistoryStack.cs => GUI/HistoryStack.cs (96%) rename ImagePreview.cs => GUI/ImagePreview.cs (97%) rename ListViewEx.cs => GUI/ListViewEx.cs (100%) rename MainWindow.xaml => GUI/MainWindow.xaml (98%) rename MainWindow.xaml.cs => GUI/MainWindow.xaml.cs (97%) rename ModalWindow.cs => GUI/ModalWindow.cs (97%) rename NAudio.cs => GUI/NAudio.cs (100%) rename {Properties => GUI/Properties}/AssemblyInfo.cs (93%) rename {Properties => GUI/Properties}/Resources.Designer.cs (97%) rename {Properties => GUI/Properties}/Resources.resx (97%) rename {Properties => GUI/Properties}/Settings.Designer.cs (97%) rename {Properties => GUI/Properties}/Settings.settings (97%) rename {Properties => GUI/Properties}/app.manifest (98%) rename {Resources => GUI/Resources}/Formats.dat (100%) rename Settings.cs => GUI/Settings.cs (97%) rename Shell.cs => GUI/Shell.cs (97%) rename {Strings => GUI/Strings}/guiStrings.Designer.cs (97%) rename {Strings => GUI/Strings}/guiStrings.ko-KR.resx (100%) rename {Strings => GUI/Strings}/guiStrings.resx (97%) rename {Strings => GUI/Strings}/guiStrings.ru-RU.resx (97%) rename TextViewer.xaml => GUI/TextViewer.xaml (100%) rename TextViewer.xaml.cs => GUI/TextViewer.xaml.cs (100%) rename Utility.cs => GUI/Utility.cs (97%) rename ViewModel.cs => GUI/ViewModel.cs (97%) rename packages.config => GUI/packages.config (96%) delete mode 100644 Images/32x32/back button.png delete mode 100644 Images/32x32/forward button.png delete mode 100644 Images/32x32/help.png delete mode 100644 Images/48x48/refresh.png delete mode 100644 Images/64x64/info.png delete mode 100644 Images/sample.ico delete mode 100644 Images/search4files.ico delete mode 100644 Images/splashscreen.png delete mode 100644 packages/repositories.config diff --git a/GARbro.sln b/GARbro.sln index c762691c..7ca45af6 100644 --- a/GARbro.sln +++ b/GARbro.sln @@ -16,7 +16,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArcFormats", "ArcFormats\Ar EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GameRes", "GameRes\GameRes.csproj", "{453C087F-E416-4AE9-8C03-D8760DA0574B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GARbro.GUI", "GARbro.GUI.csproj", "{2935BE57-C4E0-43E7-86DE-C1848C820B19}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GARbro.GUI", "GUI\GARbro.GUI.csproj", "{2935BE57-C4E0-43E7-86DE-C1848C820B19}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Image.Convert", "Image.Convert\Image.Convert.csproj", "{757EB8B1-F62C-4690-AC3D-DAE4A5576B3E}" ProjectSection(ProjectDependencies) = postProject diff --git a/AboutBox.xaml b/GUI/AboutBox.xaml similarity index 98% rename from AboutBox.xaml rename to GUI/AboutBox.xaml index 1f581465..8c8330fd 100644 --- a/AboutBox.xaml +++ b/GUI/AboutBox.xaml @@ -1,144 +1,144 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainWindow.xaml.cs b/GUI/MainWindow.xaml.cs similarity index 97% rename from MainWindow.xaml.cs rename to GUI/MainWindow.xaml.cs index 63203fba..e650699e 100644 --- a/MainWindow.xaml.cs +++ b/GUI/MainWindow.xaml.cs @@ -1,1382 +1,1382 @@ -// 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.IO; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Input; -using System.Windows.Threading; -using Microsoft.VisualBasic.FileIO; -using GARbro.GUI.Properties; -using GARbro.GUI.Strings; -using GameRes; -using Rnd.Windows; -using Microsoft.Win32; -using NAudio.Wave; - -namespace GARbro.GUI -{ - /// - /// Interaction logic for MainWindow.xaml - /// - public partial class MainWindow : Window - { - private App m_app; - - const StringComparison StringIgnoreCase = StringComparison.CurrentCultureIgnoreCase; - - public MainWindow() - { - m_app = Application.Current as App; - InitializeComponent(); - if (this.Top < 0) this.Top = 0; - if (this.Left < 0) this.Left = 0; - InitDirectoryChangesWatcher(); - InitPreviewPane(); - - if (null == Settings.Default.appRecentFiles) - Settings.Default.appRecentFiles = new StringCollection(); - m_recent_files = new LinkedList (Settings.Default.appRecentFiles.Cast().Take (MaxRecentFiles)); - RecentFilesMenu.ItemsSource = RecentFiles; - - FormatCatalog.Instance.ParametersRequest += (s, e) => Dispatcher.Invoke (() => OnParametersRequest (s, e)); - - CurrentDirectory.SizeChanged += (s, e) => { - if (e.WidthChanged) - { - pathLine.MinWidth = e.NewSize.Width-79; - this.MinWidth = e.NewSize.Width+79; - } - }; - pathLine.EnterKeyDown += acb_OnKeyDown; - } - - void WindowLoaded (object sender, RoutedEventArgs e) - { - lv_SetSortMode (Settings.Default.lvSortColumn, Settings.Default.lvSortDirection); - Dispatcher.InvokeAsync (WindowRendered, DispatcherPriority.ContextIdle); - ImageData.SetDefaultDpi (Desktop.DpiX, Desktop.DpiY); - } - - void WindowRendered () - { - DirectoryViewModel vm = null; - try - { - vm = GetNewViewModel (m_app.InitPath); - } - catch (Exception X) - { - PopupError (X.Message, guiStrings.MsgErrorOpening); - } - if (null == vm) - { - vm = CreateViewModel (Directory.GetCurrentDirectory(), true); - } - ViewModel = vm; - lv_SelectItem (0); - if (!vm.IsArchive) - SetStatusText (guiStrings.MsgReady); - } - - void WindowKeyDown (object sender, KeyEventArgs e) - { - if (MainMenuBar.Visibility != Visibility.Visible && Key.System == e.Key) - { - MainMenuBar.Visibility = Visibility.Visible; - MainMenuBar.IsKeyboardFocusWithinChanged += HideMenuBar; - } - } - - void HideMenuBar (object sender, DependencyPropertyChangedEventArgs e) - { - if (!MainMenuBar.IsKeyboardFocusWithin) - { - MainMenuBar.IsKeyboardFocusWithinChanged -= HideMenuBar; - MainMenuBar.Visibility = Visibility.Collapsed; - } - } - - /// - /// Save settings when main window is about to close - /// - protected override void OnClosing (CancelEventArgs e) - { - try - { - SaveSettings(); - AudioDevice = null; - CurrentAudio = null; - } - catch (Exception X) - { - Trace.WriteLine (X.Message, "[OnClosing]"); - Trace.WriteLine (X.StackTrace, "Stack trace"); - } - base.OnClosing (e); - } - - /// - /// Manually save settings that are not automatically saved by bindings. - /// - private void SaveSettings() - { - if (null != m_lvSortByColumn) - { - Settings.Default.lvSortColumn = SortMode; - Settings.Default.lvSortDirection = m_lvSortDirection; - } - else - Settings.Default.lvSortColumn = ""; - - Settings.Default.appRecentFiles.Clear(); - foreach (var file in m_recent_files) - Settings.Default.appRecentFiles.Add (file); - - string cwd = CurrentPath; - if (!string.IsNullOrEmpty (cwd)) - { - if (ViewModel.IsArchive) - cwd = Path.GetDirectoryName (cwd); - } - else - cwd = Directory.GetCurrentDirectory(); - Settings.Default.appLastDirectory = cwd; - } - - /// - /// Set status line text. Could be called from any thread. - /// - public void SetStatusText (string text) - { - Dispatcher.Invoke (() => { appStatusText.Text = text; }); - } - - public void SetResourceText (string text) - { - Dispatcher.Invoke (() => { appResourceText.Text = text; }); - } - - /// - /// Popup error message box. Could be called from any thread. - /// - public void PopupError (string message, string title) - { - Dispatcher.Invoke (() => MessageBox.Show (this, message, title, MessageBoxButton.OK, MessageBoxImage.Error)); - } - - const int MaxRecentFiles = 9; - LinkedList m_recent_files; - - // Item1 = file name, Item2 = menu item string - public IEnumerable> RecentFiles - { - get - { - int i = 1; - return m_recent_files.Select (f => Tuple.Create (f, string.Format ("_{0} {1}", i++, f))); - } - } - - void PushRecentFile (string file) - { - var node = m_recent_files.Find (file); - if (node != null && node == m_recent_files.First) - return; - if (null == node) - { - while (MaxRecentFiles <= m_recent_files.Count) - m_recent_files.RemoveLast(); - m_recent_files.AddFirst (file); - } - else - { - m_recent_files.Remove (node); - m_recent_files.AddFirst (node); - } - RecentFilesMenu.ItemsSource = RecentFiles; - } - - /// - /// Set data context of the ListView. - /// - - public DirectoryViewModel ViewModel - { - get - { - var source = CurrentDirectory.ItemsSource as CollectionView; - if (null == source) - return null; - return source.SourceCollection as DirectoryViewModel; - } - private set - { - StopWatchDirectoryChanges(); - var cvs = this.Resources["ListViewSource"] as CollectionViewSource; - cvs.Source = value; - - // update path textbox - var path_component = value.Path.Last(); - if (string.IsNullOrEmpty (path_component) && value.Path.Count > 1) - path_component = value.Path[value.Path.Count-2]; - pathLine.Text = path_component; - - if (value.IsArchive && value.Path.Count <= 2) - PushRecentFile (value.Path.First()); - - lv_Sort (SortMode, m_lvSortDirection); - if (!value.IsArchive && !string.IsNullOrEmpty (value.Path.First())) - { - WatchDirectoryChanges (value.Path.First()); - } - CurrentDirectory.UpdateLayout(); - } - } - - /// - /// Save current position and update view model. - /// - void PushViewModel (DirectoryViewModel vm) - { - SaveCurrentPosition(); - ViewModel = vm; - } - - DirectoryViewModel GetNewViewModel (string path) - { - if (!string.IsNullOrEmpty (path)) - { - if (!VFS.IsVirtual) - path = Path.GetFullPath (path); - var entry = VFS.FindFile (path); - if (!(entry is SubDirEntry)) - SetBusyState(); - VFS.ChDir (entry); - } - return new DirectoryViewModel (VFS.FullPath, VFS.GetFiles(), VFS.IsVirtual); - } - - private bool m_busy_state = false; - - public void SetBusyState() - { - m_busy_state = true; - Mouse.OverrideCursor = Cursors.Wait; - Dispatcher.InvokeAsync (() => { - m_busy_state = false; - Mouse.OverrideCursor = null; - }, DispatcherPriority.ApplicationIdle); - } - - /// - /// Create view model corresponding to . Returns null on error. - /// - DirectoryViewModel TryCreateViewModel (string path) - { - try - { - return GetNewViewModel (path); - } - catch (Exception X) - { - SetStatusText (string.Format ("{0}: {1}", Path.GetFileName (path), X.Message)); - return null; - } - } - - /// - /// Create view model corresponding to or empty view model if there was - /// an error accessing path. - /// - DirectoryViewModel CreateViewModel (string path, bool suppress_warning = false) - { - try - { - return GetNewViewModel (path); - } - catch (Exception X) - { - if (!suppress_warning) - PopupError (X.Message, guiStrings.MsgErrorOpening); - return new DirectoryViewModel (new string[] { "" }, new Entry[0], false); - } - } - - #region Refresh view on filesystem changes - - private FileSystemWatcher m_watcher = new FileSystemWatcher(); - - void InitDirectoryChangesWatcher () - { - m_watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.FileName | NotifyFilters.DirectoryName; - m_watcher.Changed += InvokeRefreshView; - m_watcher.Created += InvokeRefreshView; - m_watcher.Deleted += InvokeRefreshView; - m_watcher.Renamed += InvokeRefreshView; - } - - void WatchDirectoryChanges (string path) - { - m_watcher.Path = path; - m_watcher.EnableRaisingEvents = true; - } - - public void StopWatchDirectoryChanges() - { - m_watcher.EnableRaisingEvents = false; - } - - public void ResumeWatchDirectoryChanges () - { - m_watcher.EnableRaisingEvents = !ViewModel.IsArchive; - } - - private void InvokeRefreshView (object source, FileSystemEventArgs e) - { - var watcher = source as FileSystemWatcher; - var vm = ViewModel; - if (!vm.IsArchive && vm.Path.First() == watcher.Path) - { - watcher.EnableRaisingEvents = false; - Dispatcher.Invoke (RefreshView); - } - } - #endregion - - /// - /// Select specified item within CurrentDirectory and bring it into a view. - /// - - void lv_SelectItem (EntryViewModel item) - { - if (item != null) - { - CurrentDirectory.SelectedItem = item; - CurrentDirectory.ScrollIntoView (item); - var lvi = (ListViewItem)CurrentDirectory.ItemContainerGenerator.ContainerFromItem (item); - if (lvi != null) - lvi.Focus(); - } - } - - void lv_SelectItem (int index) - { - CurrentDirectory.SelectedIndex = index; - CurrentDirectory.ScrollIntoView (CurrentDirectory.SelectedItem); - var lvi = (ListViewItem)CurrentDirectory.ItemContainerGenerator.ContainerFromIndex (index); - if (lvi != null) - lvi.Focus(); - } - - void lv_SelectItem (string name) - { - if (!string.IsNullOrEmpty (name)) - lv_SelectItem (ViewModel.Find (name)); - } - - private void lv_Focus () - { - if (CurrentDirectory.SelectedIndex != -1) - { - var item = CurrentDirectory.SelectedItem; - var lvi = CurrentDirectory.ItemContainerGenerator.ContainerFromItem (item) as ListViewItem; - if (lvi != null) - { - lvi.Focus(); - return; - } - } - CurrentDirectory.Focus(); - } - - void lvi_Selected (object sender, RoutedEventArgs args) - { - var lvi = sender as ListViewItem; - if (lvi == null) - return; - var entry = lvi.Content as EntryViewModel; - if (entry == null) - return; - PreviewEntry (entry.Source); - } - - EntryViewModel m_last_selected = null; - - void lv_SelectionChanged (object sender, SelectionChangedEventArgs args) - { - var lv = sender as ListView; - if (null == lv) - return; - var item = lv.SelectedItem as EntryViewModel; - if (item != null && m_last_selected != item) - { - m_last_selected = item; - PreviewEntry (item.Source); - } - } - - void lvi_DoubleClick (object sender, MouseButtonEventArgs args) - { - var lvi = sender as ListViewItem; - if (Commands.OpenItem.CanExecute (null, lvi)) - { - Commands.OpenItem.Execute (null, lvi); - args.Handled = true; - } - } - - /// - /// Get currently selected item from ListView widget. - /// - private ListViewItem lv_GetCurrentContainer () - { - int current = CurrentDirectory.SelectedIndex; - if (-1 == current) - return null; - - return CurrentDirectory.ItemContainerGenerator.ContainerFromIndex (current) as ListViewItem; - } - - GridViewColumnHeader m_lvSortByColumn = null; - ListSortDirection m_lvSortDirection = ListSortDirection.Ascending; - - public string SortMode - { - get { return GetValue (SortModeProperty) as string; } - private set { SetValue (SortModeProperty, value); } - } - - public static readonly DependencyProperty SortModeProperty = - DependencyProperty.RegisterAttached ("SortMode", typeof(string), typeof(MainWindow), new UIPropertyMetadata()); - - void lv_SetSortMode (string sortBy, ListSortDirection direction) - { - m_lvSortByColumn = null; - GridView view = CurrentDirectory.View as GridView; - foreach (var column in view.Columns) - { - var header = column.Header as GridViewColumnHeader; - if (null != header && !string.IsNullOrEmpty (sortBy) && sortBy.Equals (header.Tag)) - { - if (ListSortDirection.Ascending == direction) - column.HeaderTemplate = Resources["SortArrowUp"] as DataTemplate; - else - column.HeaderTemplate = Resources["SortArrowDown"] as DataTemplate; - m_lvSortByColumn = header; - m_lvSortDirection = direction; - } - else - { - column.HeaderTemplate = Resources["SortArrowNone"] as DataTemplate; - } - } - SortMode = sortBy; - } - - private void lv_Sort (string sortBy, ListSortDirection direction) - { - var dataView = CollectionViewSource.GetDefaultView (CurrentDirectory.ItemsSource) as ListCollectionView; - dataView.CustomSort = new FileSystemComparer (sortBy, direction); - } - - /// - /// Sort Listview by columns - /// - void lv_ColumnHeaderClicked (object sender, RoutedEventArgs e) - { - var headerClicked = e.OriginalSource as GridViewColumnHeader; - - if (null == headerClicked) - return; - if (headerClicked.Role == GridViewColumnHeaderRole.Padding) - return; - - ListSortDirection direction; - if (headerClicked != m_lvSortByColumn) - direction = ListSortDirection.Ascending; - else if (m_lvSortDirection == ListSortDirection.Ascending) - direction = ListSortDirection.Descending; - else - direction = ListSortDirection.Ascending; - - string sortBy = headerClicked.Tag.ToString(); - lv_Sort (sortBy, direction); - SortMode = sortBy; - - // Remove arrow from previously sorted header - if (m_lvSortByColumn != null && m_lvSortByColumn != headerClicked) - { - m_lvSortByColumn.Column.HeaderTemplate = Resources["SortArrowNone"] as DataTemplate; - } - - if (ListSortDirection.Ascending == direction) - { - headerClicked.Column.HeaderTemplate = Resources["SortArrowUp"] as DataTemplate; - } - else - { - headerClicked.Column.HeaderTemplate = Resources["SortArrowDown"] as DataTemplate; - } - m_lvSortByColumn = headerClicked; - m_lvSortDirection = direction; - } - - /// - /// Handle "Sort By" commands. - /// - - private void SortByExec (object sender, ExecutedRoutedEventArgs e) - { - string sort_by = e.Parameter as string; - lv_Sort (sort_by, ListSortDirection.Ascending); - lv_SetSortMode (sort_by, ListSortDirection.Ascending); - } - - /// - /// Handle "Set file type" commands. - /// - private void SetFileTypeExec (object sender, ExecutedRoutedEventArgs e) - { - var selected = CurrentDirectory.SelectedItems.Cast().Where (x => !x.IsDirectory); - if (!selected.Any()) - return; - string type = e.Parameter as string; - foreach (var entry in selected) - { - entry.Type = type; - } - } - - /// - /// Event handler for keys pressed in the directory view pane - /// - - private void lv_TextInput (object sender, TextCompositionEventArgs e) - { - LookupItem (e.Text, e.Timestamp); - e.Handled = true; - } - - private void lv_KeyDown (object sender, KeyEventArgs e) - { - if (e.IsDown && Key.Space == e.Key && LookupActive) - { - LookupItem (" ", e.Timestamp); - e.Handled = true; - } - } - - class InputData - { - public int LastTime = 0; - public StringBuilder Phrase = new StringBuilder(); - public bool Mismatch = false; - - public bool LookupActive - { - get { return Phrase.Length > 0 && Environment.TickCount - LastTime < TextLookupTimeout; } - } - - public void Reset () - { - Phrase.Clear (); - Mismatch = false; - } - } - - const int TextLookupTimeout = 1000; // milliseconds - - InputData m_current_input = new InputData(); - - public bool LookupActive { get { return m_current_input.LookupActive; } } - - /// - /// Lookup item in listview pane by first letters of name. - /// - - private void LookupItem (string key, int timestamp) - { - if (string.IsNullOrEmpty (key)) - return; - var source = CurrentDirectory.ItemsSource as CollectionView; - if (source == null) - return; - - if (timestamp - m_current_input.LastTime > TextLookupTimeout) - { - m_current_input.Reset(); - } - m_current_input.LastTime = timestamp; - if (m_current_input.Mismatch) - return; - - if (!(1 == m_current_input.Phrase.Length && m_current_input.Phrase[0] == key[0])) - { - m_current_input.Phrase.Append (key); - } - int start_index = CurrentDirectory.SelectedIndex; - if (1 == m_current_input.Phrase.Length) - { - // lookup starting from the next item - if (start_index != -1 && start_index+1 < source.Count) - ++start_index; - } - var items = source.Cast(); - if (start_index > 0) - { - items = items.Skip (start_index).Concat (items.Take (start_index)); - } - string input = m_current_input.Phrase.ToString(); - var matched = items.Where (e => e.Name.StartsWith (input, StringIgnoreCase)).FirstOrDefault(); - if (null != matched) - lv_SelectItem (matched); - else - m_current_input.Mismatch = true; - } - - static readonly Regex FullpathRe = new Regex (@"^(?:[a-z]:|[\\/])", RegexOptions.IgnoreCase); - - private void acb_OnKeyDown (object sender, KeyEventArgs e) - { - if (e.Key != Key.Return) - return; - string path = (sender as AutoCompleteBox).Text; - if (string.IsNullOrEmpty (path)) - return; - if (FullpathRe.IsMatch (path)) - { - OpenFile (path); - return; - } - try - { - PushViewModel (GetNewViewModel (path)); - lv_Focus(); - } - catch (Exception X) - { - PopupError (X.Message, guiStrings.MsgErrorOpening); - } - } - - #region Navigation history implementation - - internal string CurrentPath { get { return ViewModel.Path.First(); } } - - HistoryStack m_history = new HistoryStack(); - - public DirectoryPosition GetCurrentPosition () - { - var evm = CurrentDirectory.SelectedItem as EntryViewModel; - return new DirectoryPosition (ViewModel, evm); - } - - public bool SetCurrentPosition (DirectoryPosition pos) - { - try - { - VFS.FullPath = pos.Path; - var vm = TryCreateViewModel (pos.Path.Last()); - if (null == vm) - return false; - ViewModel = vm; - if (null != pos.Item) - lv_SelectItem (pos.Item); - return true; - } - catch (Exception X) - { - // if VFS.FullPath throws an exception, ViewModel becomes inconsistent at this point - // and should be rebuilt - ViewModel = CreateViewModel (VFS.Top.CurrentDirectory, true); - SetStatusText (X.Message); - return false; - } - } - - public void SaveCurrentPosition () - { - m_history.Push (GetCurrentPosition()); - } - - public void ChangePosition (DirectoryPosition new_pos) - { - var current = GetCurrentPosition(); - if (!current.Path.SequenceEqual (new_pos.Path)) - SaveCurrentPosition(); - SetCurrentPosition (new_pos); - } - - private void GoBackExec (object sender, ExecutedRoutedEventArgs e) - { - DirectoryPosition current = m_history.Undo (GetCurrentPosition()); - if (current != null) - SetCurrentPosition (current); - } - - private void GoForwardExec (object sender, ExecutedRoutedEventArgs e) - { - DirectoryPosition current = m_history.Redo (GetCurrentPosition()); - if (current != null) - SetCurrentPosition (current); - } - - private void CanExecuteGoBack (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = m_history.CanUndo(); - } - - private void CanExecuteGoForward (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = m_history.CanRedo(); - } - #endregion - - private void OpenFileExec (object control, ExecutedRoutedEventArgs e) - { - var dlg = new OpenFileDialog { - CheckFileExists = true, - CheckPathExists = true, - Multiselect = false, - Title = guiStrings.TextChooseArchive, - }; - if (!dlg.ShowDialog (this).Value) - return; - OpenFile (dlg.FileName); - } - - private void OpenFile (string filename) - { - if (filename == CurrentPath || string.IsNullOrEmpty (filename)) - return; - try - { - if (File.Exists (filename)) - VFS.FullPath = new string[] { filename, "" }; - else - VFS.FullPath = new string[] { filename }; - var vm = new DirectoryViewModel (VFS.FullPath, VFS.GetFiles(), VFS.IsVirtual); - PushViewModel (vm); - if (null != VFS.CurrentArchive) - SetStatusText (VFS.CurrentArchive.Description); - lv_SelectItem (0); - } - catch (OperationCanceledException X) - { - SetStatusText (X.Message); - } - catch (Exception X) - { - PopupError (string.Format("{0}:\n{1}", filename, X.Message), guiStrings.MsgErrorOpening); - } - } - - private void OpenRecentExec (object control, ExecutedRoutedEventArgs e) - { - string filename = e.Parameter as string; - if (string.IsNullOrEmpty (filename)) - return; - OpenFile (filename); - } - - /// - /// Open file/directory. - /// - private void OpenItemExec (object control, ExecutedRoutedEventArgs e) - { - EntryViewModel entry = null; - var lvi = e.OriginalSource as ListViewItem; - if (lvi != null) - entry = lvi.Content as EntryViewModel; - if (null == entry) - entry = CurrentDirectory.SelectedItem as EntryViewModel; - if (null == entry) - return; - if ("audio" == entry.Type) - { - PlayFile (entry.Source); - return; - } - OpenDirectoryEntry (ViewModel, entry); - } - - private void OpenDirectoryEntry (DirectoryViewModel vm, EntryViewModel entry) - { - string old_dir = null == vm ? "" : vm.Path.Last(); - string new_dir = entry.Source.Name; - if (".." == new_dir) - { - if (null != vm && !vm.IsArchive) - new_dir = Path.Combine (old_dir, entry.Name); - if (vm.Path.Count > 1 && string.IsNullOrEmpty (old_dir)) - old_dir = vm.Path[vm.Path.Count-2]; - } - Trace.WriteLine (new_dir, "OpenDirectoryEntry"); - int old_fs_count = VFS.Count; - vm = TryCreateViewModel (new_dir); - if (null == vm) - { - if (VFS.Count == old_fs_count) - return; - vm = new DirectoryViewModel (VFS.FullPath, new Entry[0], VFS.IsVirtual); - PushViewModel (vm); - } - else - { - PushViewModel (vm); - if (VFS.Count > old_fs_count && null != VFS.CurrentArchive) - SetStatusText (string.Format ("{0}: {1}", VFS.CurrentArchive.Description, - Localization.Format ("MsgFiles", VFS.CurrentArchive.Dir.Count()))); - else - SetStatusText (""); - } - if (".." == entry.Name) - lv_SelectItem (Path.GetFileName (old_dir)); - else - lv_SelectItem (0); - } - - WaveOutEvent m_audio_device; - WaveOutEvent AudioDevice - { - get { return m_audio_device; } - set - { - var old_value = m_audio_device; - m_audio_device = value; - if (old_value != null) - old_value.Dispose(); - } - } - - WaveStream m_audio_input; - WaveStream CurrentAudio - { - get { return m_audio_input; } - set - { - var old_value = m_audio_input; - m_audio_input = value; - if (old_value != null) - old_value.Dispose(); - } - } - - private void PlayFile (Entry entry) - { - SoundInput sound = null; - try - { - SetBusyState(); - using (var input = VFS.OpenStream (entry)) - { - FormatCatalog.Instance.LastError = null; - sound = AudioFormat.Read (input); - if (null == sound) - { - if (null != FormatCatalog.Instance.LastError) - throw FormatCatalog.Instance.LastError; - return; - } - - if (AudioDevice != null) - { - AudioDevice.PlaybackStopped -= OnPlaybackStopped; - AudioDevice = null; - } - CurrentAudio = new WaveStreamImpl (sound); - AudioDevice = new WaveOutEvent(); - AudioDevice.Init (CurrentAudio); - AudioDevice.PlaybackStopped += OnPlaybackStopped; - AudioDevice.Play(); - var fmt = CurrentAudio.WaveFormat; - SetResourceText (string.Format ("Playing {0} / {3} / {2}bps / {1}Hz", entry.Name, - fmt.SampleRate, sound.SourceBitrate / 1000, - CurrentAudio.TotalTime.ToString ("m':'ss"))); - } - } - catch (Exception X) - { - SetStatusText (X.Message); - if (null != sound) - sound.Dispose(); - } - } - - private void OnPlaybackStopped (object sender, StoppedEventArgs e) - { - try - { - SetResourceText (""); - CurrentAudio = null; - } - catch (Exception X) - { - Trace.WriteLine (X.Message, "[OnPlaybackStopped]"); - } - } - - /// - /// Launch specified file. - /// - private void SystemOpen (string file) - { - try - { - Process.Start (file); - } - catch (Exception X) - { - SetStatusText (X.Message); - } - } - - /// - /// Refresh current view. - /// - private void RefreshExec (object sender, ExecutedRoutedEventArgs e) - { - RefreshView(); - } - - public void RefreshView () - { - VFS.Flush(); - var pos = GetCurrentPosition(); - SetCurrentPosition (pos); - } - - /// - /// Open current file in Explorer. - /// - - private void ExploreItemExec (object sender, ExecutedRoutedEventArgs e) - { - var entry = CurrentDirectory.SelectedItem as EntryViewModel; - if (entry != null && !ViewModel.IsArchive) - { - try - { - string name = Path.Combine (CurrentPath, entry.Name); - Process.Start ("explorer.exe", "/select,"+name); - } - catch (Exception X) - { - // ignore - Trace.WriteLine (X.Message, "explorer.exe"); - } - } - } - - /// - /// Delete item from both media library and disk drive. - /// - private void DeleteItemExec (object sender, ExecutedRoutedEventArgs e) - { - var items = CurrentDirectory.SelectedItems.Cast().Where (f => !f.IsDirectory); - if (!items.Any()) - return; - - this.IsEnabled = false; - try - { - VFS.Flush(); - ResetPreviewPane(); - if (!items.Skip (1).Any()) // items.Count() == 1 - { - string item_name = Path.Combine (CurrentPath, items.First().Name); - Trace.WriteLine (item_name, "DeleteItemExec"); - FileSystem.DeleteFile (item_name, UIOption.AllDialogs, RecycleOption.SendToRecycleBin); - DeleteItem (lv_GetCurrentContainer()); - SetStatusText (string.Format(guiStrings.MsgDeletedItem, item_name)); - } - else - { - int count = 0; - StopWatchDirectoryChanges (); - try - { - var file_list = items.Select (entry => Path.Combine (CurrentPath, entry.Name)); - GARbro.Shell.File.Delete (file_list); - count = file_list.Count(); - } - catch - { - ResumeWatchDirectoryChanges(); - throw; - } - RefreshView(); - SetStatusText (Localization.Format ("MsgDeletedItems", count)); - } - } - catch (OperationCanceledException) - { - } - catch (Exception X) - { - SetStatusText (X.Message); - } - finally - { - this.IsEnabled = true; - } - } - - /// - /// Delete item at the specified position within ListView, correctly adjusting current - /// position. - /// - private void DeleteItem (ListViewItem item) - { - int i = CurrentDirectory.SelectedIndex; - int next = -1; - if (i+1 < CurrentDirectory.Items.Count) - next = i + 1; - else if (i > 0) - next = i - 1; - - if (next != -1) - CurrentDirectory.SelectedIndex = next; - - var entry = item.Content as EntryViewModel; - if (entry != null) - { - ViewModel.Remove (entry); - } - } - - /// - /// Rename selected item. - /// - private void RenameItemExec(object sender, ExecutedRoutedEventArgs e) - { - RenameElement (lv_GetCurrentContainer()); - } - - /// - /// Rename item contained within specified framework control. - /// - void RenameElement (ListViewItem item) - { - if (item == null) - return; -/* - TextBlock block = FindByName (item, "item_Text") as TextBlock; - TextBox box = FindSibling (block, "item_Input") as TextBox; - - if (block == null || box == null) - return; - - IsRenameActive = true; - - block.Visibility = Visibility.Collapsed; - box.Text = block.Text; - box.Visibility = Visibility.Visible; - box.Select (0, box.Text.Length); - box.Focus(); -*/ - } - - /// - /// Select files matching mask. - /// - void AddSelectionExec (object sender, ExecutedRoutedEventArgs e) - { - try - { - var ext_list = new SortedSet(); - foreach (var entry in ViewModel) - { - var ext = Path.GetExtension (entry.Name).ToLowerInvariant(); - if (!string.IsNullOrEmpty (ext)) - ext_list.Add (ext); - } - var selection = new EnterMaskDialog (ext_list.Select (ext => "*"+ext)); - selection.Owner = this; - var result = selection.ShowDialog(); - if (!result.Value) - return; - if ("*.*" == selection.Mask.Text) - { - CurrentDirectory.SelectAll(); - return; - } - var mask = Regex.Escape (selection.Mask.Text).Replace (@"\*", ".*").Replace (@"\?", "."); - var glob = new Regex ("^"+mask+"$", RegexOptions.IgnoreCase); - var matching = ViewModel.Where (entry => glob.IsMatch (entry.Name)); - if (!matching.Any()) - { - SetStatusText (string.Format (guiStrings.MsgNoMatching, selection.Mask.Text)); - return; - } - int count = 0; - foreach (var item in matching) - { - if (!CurrentDirectory.SelectedItems.Contains (item)) - { - CurrentDirectory.SelectedItems.Add (item); - ++count; - } - } - if (count != 0) - SetStatusText (Localization.Format ("MsgSelectedFiles", count)); - } - catch (Exception X) - { - SetStatusText (X.Message); - } - } - - void SelectAllExec (object sender, ExecutedRoutedEventArgs e) - { - CurrentDirectory.SelectAll(); - } - - void NextItemExec (object sender, ExecutedRoutedEventArgs e) - { - if (LookupActive) - return; - - var index = CurrentDirectory.SelectedIndex + 1; - if (index < CurrentDirectory.Items.Count) - CurrentDirectory.SelectedIndex = index; - } - - /// - /// Handle "Exit" command. - /// - void ExitExec (object sender, ExecutedRoutedEventArgs e) - { - Application.Current.Shutdown(); - } - - private void AboutExec (object sender, ExecutedRoutedEventArgs e) - { - var about = new AboutBox(); - about.Owner = this; - about.ShowDialog(); - } - - private void CanExecuteAlways (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = true; - } - - private void CanExecuteControlCommand (object sender, CanExecuteRoutedEventArgs e) - { - Control target = e.Source as Control; - e.CanExecute = target != null; - } - - private void CanExecuteOnSelected (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = CurrentDirectory.SelectedIndex != -1; - } - - private void CanExecuteConvertMedia (object sender, CanExecuteRoutedEventArgs e) - { - if (CurrentDirectory.SelectedItems.Count >= 1) - { - e.CanExecute = !ViewModel.IsArchive; - } - } - - private void CanExecuteOnImage (object sender, CanExecuteRoutedEventArgs e) - { - var entry = CurrentDirectory.SelectedItem as EntryViewModel; - e.CanExecute = !ViewModel.IsArchive && entry != null && entry.Type == "image"; - } - - private void CanExecuteInArchive (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = ViewModel.IsArchive && CurrentDirectory.SelectedIndex != -1; - } - - private void CanExecuteCreateArchive (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = !ViewModel.IsArchive && CurrentDirectory.SelectedItems.Count > 0; - } - - private void CanExecuteInDirectory (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = !ViewModel.IsArchive; - } - - private void CanExecuteExtract (object sender, CanExecuteRoutedEventArgs e) - { - if (ViewModel.IsArchive) - { - e.CanExecute = true; - return; - } - else if (CurrentDirectory.SelectedIndex != -1) - { - var entry = CurrentDirectory.SelectedItem as EntryViewModel; - if (entry != null && !entry.IsDirectory) - { - e.CanExecute = true; - return; - } - } - e.CanExecute = false; - } - - private void CanExecuteOnPhysicalFile (object sender, CanExecuteRoutedEventArgs e) - { - if (!ViewModel.IsArchive && CurrentDirectory.SelectedIndex != -1) - { - var entry = CurrentDirectory.SelectedItem as EntryViewModel; - if (entry != null && !entry.IsDirectory) - { - e.CanExecute = true; - return; - } - } - e.CanExecute = false; - } - - private void OnParametersRequest (object sender, ParametersRequestEventArgs e) - { - var format = sender as IResource; - if (null != format) - { - var control = format.GetAccessWidget() as UIElement; - if (null != control) - { - bool busy_state = m_busy_state; - var param_dialog = new ArcParametersDialog (control, e.Notice); - param_dialog.Owner = this; - e.InputResult = param_dialog.ShowDialog() ?? false; - if (e.InputResult) - e.Options = format.GetOptions (control); - if (busy_state) - SetBusyState(); - } - } - } - - private void CanExecuteFitWindow (object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = ImageCanvas.Source != null; - } - - private void HideStatusBarExec (object sender, ExecutedRoutedEventArgs e) - { - ToggleVisibility (AppStatusBar); - } - - private void HideMenuBarExec (object sender, ExecutedRoutedEventArgs e) - { - ToggleVisibility (MainMenuBar); - } - - private void HideToolBarExec (object sender, ExecutedRoutedEventArgs e) - { - ToggleVisibility (MainToolBar); - } - - static void ToggleVisibility (UIElement item) - { - var status = item.Visibility; - if (Visibility.Visible == status) - item.Visibility = Visibility.Collapsed; - else - item.Visibility = Visibility.Visible; - } - } - - public class SortModeToBooleanConverter : IValueConverter - { - public object Convert (object value, Type targetType, object parameter, CultureInfo culture) - { - string actual_mode = value as string; - string check_mode = parameter as string; - if (string.IsNullOrEmpty (check_mode)) - return string.IsNullOrEmpty (actual_mode); - return check_mode.Equals (actual_mode); - } - - public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } - - public class BooleanToCollapsedVisibilityConverter : IValueConverter - { - #region IValueConverter Members - - public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) - { - //reverse conversion (false=>Visible, true=>collapsed) on any given parameter - bool input = (null == parameter) ? (bool)value : !((bool)value); - return (input) ? Visibility.Visible : Visibility.Collapsed; - } - - public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) - { - throw new NotImplementedException(); - } - - #endregion - } - - public static class Commands - { - public static readonly RoutedCommand OpenItem = new RoutedCommand(); - public static readonly RoutedCommand OpenFile = new RoutedCommand(); - public static readonly RoutedCommand OpenRecent = new RoutedCommand(); - public static readonly RoutedCommand ExtractItem = new RoutedCommand(); - public static readonly RoutedCommand CreateArchive = new RoutedCommand(); - public static readonly RoutedCommand SortBy = new RoutedCommand(); - public static readonly RoutedCommand Exit = new RoutedCommand(); - public static readonly RoutedCommand About = new RoutedCommand(); - public static readonly RoutedCommand GoBack = new RoutedCommand(); - public static readonly RoutedCommand GoForward = new RoutedCommand(); - public static readonly RoutedCommand DeleteItem = new RoutedCommand(); - public static readonly RoutedCommand RenameItem = new RoutedCommand(); - public static readonly RoutedCommand ExploreItem = new RoutedCommand(); - public static readonly RoutedCommand ConvertMedia = new RoutedCommand(); - public static readonly RoutedCommand Refresh = new RoutedCommand(); - public static readonly RoutedCommand Browse = new RoutedCommand(); - public static readonly RoutedCommand FitWindow = new RoutedCommand(); - public static readonly RoutedCommand HideStatusBar = new RoutedCommand(); - public static readonly RoutedCommand HideMenuBar = new RoutedCommand(); - public static readonly RoutedCommand HideToolBar = new RoutedCommand(); - public static readonly RoutedCommand AddSelection = new RoutedCommand(); - public static readonly RoutedCommand SelectAll = new RoutedCommand(); - public static readonly RoutedCommand SetFileType = new RoutedCommand(); - public static readonly RoutedCommand NextItem = new RoutedCommand(); - } -} +// 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.IO; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Threading; +using Microsoft.VisualBasic.FileIO; +using GARbro.GUI.Properties; +using GARbro.GUI.Strings; +using GameRes; +using Rnd.Windows; +using Microsoft.Win32; +using NAudio.Wave; + +namespace GARbro.GUI +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + private App m_app; + + const StringComparison StringIgnoreCase = StringComparison.CurrentCultureIgnoreCase; + + public MainWindow() + { + m_app = Application.Current as App; + InitializeComponent(); + if (this.Top < 0) this.Top = 0; + if (this.Left < 0) this.Left = 0; + InitDirectoryChangesWatcher(); + InitPreviewPane(); + + if (null == Settings.Default.appRecentFiles) + Settings.Default.appRecentFiles = new StringCollection(); + m_recent_files = new LinkedList (Settings.Default.appRecentFiles.Cast().Take (MaxRecentFiles)); + RecentFilesMenu.ItemsSource = RecentFiles; + + FormatCatalog.Instance.ParametersRequest += (s, e) => Dispatcher.Invoke (() => OnParametersRequest (s, e)); + + CurrentDirectory.SizeChanged += (s, e) => { + if (e.WidthChanged) + { + pathLine.MinWidth = e.NewSize.Width-79; + this.MinWidth = e.NewSize.Width+79; + } + }; + pathLine.EnterKeyDown += acb_OnKeyDown; + } + + void WindowLoaded (object sender, RoutedEventArgs e) + { + lv_SetSortMode (Settings.Default.lvSortColumn, Settings.Default.lvSortDirection); + Dispatcher.InvokeAsync (WindowRendered, DispatcherPriority.ContextIdle); + ImageData.SetDefaultDpi (Desktop.DpiX, Desktop.DpiY); + } + + void WindowRendered () + { + DirectoryViewModel vm = null; + try + { + vm = GetNewViewModel (m_app.InitPath); + } + catch (Exception X) + { + PopupError (X.Message, guiStrings.MsgErrorOpening); + } + if (null == vm) + { + vm = CreateViewModel (Directory.GetCurrentDirectory(), true); + } + ViewModel = vm; + lv_SelectItem (0); + if (!vm.IsArchive) + SetStatusText (guiStrings.MsgReady); + } + + void WindowKeyDown (object sender, KeyEventArgs e) + { + if (MainMenuBar.Visibility != Visibility.Visible && Key.System == e.Key) + { + MainMenuBar.Visibility = Visibility.Visible; + MainMenuBar.IsKeyboardFocusWithinChanged += HideMenuBar; + } + } + + void HideMenuBar (object sender, DependencyPropertyChangedEventArgs e) + { + if (!MainMenuBar.IsKeyboardFocusWithin) + { + MainMenuBar.IsKeyboardFocusWithinChanged -= HideMenuBar; + MainMenuBar.Visibility = Visibility.Collapsed; + } + } + + /// + /// Save settings when main window is about to close + /// + protected override void OnClosing (CancelEventArgs e) + { + try + { + SaveSettings(); + AudioDevice = null; + CurrentAudio = null; + } + catch (Exception X) + { + Trace.WriteLine (X.Message, "[OnClosing]"); + Trace.WriteLine (X.StackTrace, "Stack trace"); + } + base.OnClosing (e); + } + + /// + /// Manually save settings that are not automatically saved by bindings. + /// + private void SaveSettings() + { + if (null != m_lvSortByColumn) + { + Settings.Default.lvSortColumn = SortMode; + Settings.Default.lvSortDirection = m_lvSortDirection; + } + else + Settings.Default.lvSortColumn = ""; + + Settings.Default.appRecentFiles.Clear(); + foreach (var file in m_recent_files) + Settings.Default.appRecentFiles.Add (file); + + string cwd = CurrentPath; + if (!string.IsNullOrEmpty (cwd)) + { + if (ViewModel.IsArchive) + cwd = Path.GetDirectoryName (cwd); + } + else + cwd = Directory.GetCurrentDirectory(); + Settings.Default.appLastDirectory = cwd; + } + + /// + /// Set status line text. Could be called from any thread. + /// + public void SetStatusText (string text) + { + Dispatcher.Invoke (() => { appStatusText.Text = text; }); + } + + public void SetResourceText (string text) + { + Dispatcher.Invoke (() => { appResourceText.Text = text; }); + } + + /// + /// Popup error message box. Could be called from any thread. + /// + public void PopupError (string message, string title) + { + Dispatcher.Invoke (() => MessageBox.Show (this, message, title, MessageBoxButton.OK, MessageBoxImage.Error)); + } + + const int MaxRecentFiles = 9; + LinkedList m_recent_files; + + // Item1 = file name, Item2 = menu item string + public IEnumerable> RecentFiles + { + get + { + int i = 1; + return m_recent_files.Select (f => Tuple.Create (f, string.Format ("_{0} {1}", i++, f))); + } + } + + void PushRecentFile (string file) + { + var node = m_recent_files.Find (file); + if (node != null && node == m_recent_files.First) + return; + if (null == node) + { + while (MaxRecentFiles <= m_recent_files.Count) + m_recent_files.RemoveLast(); + m_recent_files.AddFirst (file); + } + else + { + m_recent_files.Remove (node); + m_recent_files.AddFirst (node); + } + RecentFilesMenu.ItemsSource = RecentFiles; + } + + /// + /// Set data context of the ListView. + /// + + public DirectoryViewModel ViewModel + { + get + { + var source = CurrentDirectory.ItemsSource as CollectionView; + if (null == source) + return null; + return source.SourceCollection as DirectoryViewModel; + } + private set + { + StopWatchDirectoryChanges(); + var cvs = this.Resources["ListViewSource"] as CollectionViewSource; + cvs.Source = value; + + // update path textbox + var path_component = value.Path.Last(); + if (string.IsNullOrEmpty (path_component) && value.Path.Count > 1) + path_component = value.Path[value.Path.Count-2]; + pathLine.Text = path_component; + + if (value.IsArchive && value.Path.Count <= 2) + PushRecentFile (value.Path.First()); + + lv_Sort (SortMode, m_lvSortDirection); + if (!value.IsArchive && !string.IsNullOrEmpty (value.Path.First())) + { + WatchDirectoryChanges (value.Path.First()); + } + CurrentDirectory.UpdateLayout(); + } + } + + /// + /// Save current position and update view model. + /// + void PushViewModel (DirectoryViewModel vm) + { + SaveCurrentPosition(); + ViewModel = vm; + } + + DirectoryViewModel GetNewViewModel (string path) + { + if (!string.IsNullOrEmpty (path)) + { + if (!VFS.IsVirtual) + path = Path.GetFullPath (path); + var entry = VFS.FindFile (path); + if (!(entry is SubDirEntry)) + SetBusyState(); + VFS.ChDir (entry); + } + return new DirectoryViewModel (VFS.FullPath, VFS.GetFiles(), VFS.IsVirtual); + } + + private bool m_busy_state = false; + + public void SetBusyState() + { + m_busy_state = true; + Mouse.OverrideCursor = Cursors.Wait; + Dispatcher.InvokeAsync (() => { + m_busy_state = false; + Mouse.OverrideCursor = null; + }, DispatcherPriority.ApplicationIdle); + } + + /// + /// Create view model corresponding to . Returns null on error. + /// + DirectoryViewModel TryCreateViewModel (string path) + { + try + { + return GetNewViewModel (path); + } + catch (Exception X) + { + SetStatusText (string.Format ("{0}: {1}", Path.GetFileName (path), X.Message)); + return null; + } + } + + /// + /// Create view model corresponding to or empty view model if there was + /// an error accessing path. + /// + DirectoryViewModel CreateViewModel (string path, bool suppress_warning = false) + { + try + { + return GetNewViewModel (path); + } + catch (Exception X) + { + if (!suppress_warning) + PopupError (X.Message, guiStrings.MsgErrorOpening); + return new DirectoryViewModel (new string[] { "" }, new Entry[0], false); + } + } + + #region Refresh view on filesystem changes + + private FileSystemWatcher m_watcher = new FileSystemWatcher(); + + void InitDirectoryChangesWatcher () + { + m_watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.FileName | NotifyFilters.DirectoryName; + m_watcher.Changed += InvokeRefreshView; + m_watcher.Created += InvokeRefreshView; + m_watcher.Deleted += InvokeRefreshView; + m_watcher.Renamed += InvokeRefreshView; + } + + void WatchDirectoryChanges (string path) + { + m_watcher.Path = path; + m_watcher.EnableRaisingEvents = true; + } + + public void StopWatchDirectoryChanges() + { + m_watcher.EnableRaisingEvents = false; + } + + public void ResumeWatchDirectoryChanges () + { + m_watcher.EnableRaisingEvents = !ViewModel.IsArchive; + } + + private void InvokeRefreshView (object source, FileSystemEventArgs e) + { + var watcher = source as FileSystemWatcher; + var vm = ViewModel; + if (!vm.IsArchive && vm.Path.First() == watcher.Path) + { + watcher.EnableRaisingEvents = false; + Dispatcher.Invoke (RefreshView); + } + } + #endregion + + /// + /// Select specified item within CurrentDirectory and bring it into a view. + /// + + void lv_SelectItem (EntryViewModel item) + { + if (item != null) + { + CurrentDirectory.SelectedItem = item; + CurrentDirectory.ScrollIntoView (item); + var lvi = (ListViewItem)CurrentDirectory.ItemContainerGenerator.ContainerFromItem (item); + if (lvi != null) + lvi.Focus(); + } + } + + void lv_SelectItem (int index) + { + CurrentDirectory.SelectedIndex = index; + CurrentDirectory.ScrollIntoView (CurrentDirectory.SelectedItem); + var lvi = (ListViewItem)CurrentDirectory.ItemContainerGenerator.ContainerFromIndex (index); + if (lvi != null) + lvi.Focus(); + } + + void lv_SelectItem (string name) + { + if (!string.IsNullOrEmpty (name)) + lv_SelectItem (ViewModel.Find (name)); + } + + private void lv_Focus () + { + if (CurrentDirectory.SelectedIndex != -1) + { + var item = CurrentDirectory.SelectedItem; + var lvi = CurrentDirectory.ItemContainerGenerator.ContainerFromItem (item) as ListViewItem; + if (lvi != null) + { + lvi.Focus(); + return; + } + } + CurrentDirectory.Focus(); + } + + void lvi_Selected (object sender, RoutedEventArgs args) + { + var lvi = sender as ListViewItem; + if (lvi == null) + return; + var entry = lvi.Content as EntryViewModel; + if (entry == null) + return; + PreviewEntry (entry.Source); + } + + EntryViewModel m_last_selected = null; + + void lv_SelectionChanged (object sender, SelectionChangedEventArgs args) + { + var lv = sender as ListView; + if (null == lv) + return; + var item = lv.SelectedItem as EntryViewModel; + if (item != null && m_last_selected != item) + { + m_last_selected = item; + PreviewEntry (item.Source); + } + } + + void lvi_DoubleClick (object sender, MouseButtonEventArgs args) + { + var lvi = sender as ListViewItem; + if (Commands.OpenItem.CanExecute (null, lvi)) + { + Commands.OpenItem.Execute (null, lvi); + args.Handled = true; + } + } + + /// + /// Get currently selected item from ListView widget. + /// + private ListViewItem lv_GetCurrentContainer () + { + int current = CurrentDirectory.SelectedIndex; + if (-1 == current) + return null; + + return CurrentDirectory.ItemContainerGenerator.ContainerFromIndex (current) as ListViewItem; + } + + GridViewColumnHeader m_lvSortByColumn = null; + ListSortDirection m_lvSortDirection = ListSortDirection.Ascending; + + public string SortMode + { + get { return GetValue (SortModeProperty) as string; } + private set { SetValue (SortModeProperty, value); } + } + + public static readonly DependencyProperty SortModeProperty = + DependencyProperty.RegisterAttached ("SortMode", typeof(string), typeof(MainWindow), new UIPropertyMetadata()); + + void lv_SetSortMode (string sortBy, ListSortDirection direction) + { + m_lvSortByColumn = null; + GridView view = CurrentDirectory.View as GridView; + foreach (var column in view.Columns) + { + var header = column.Header as GridViewColumnHeader; + if (null != header && !string.IsNullOrEmpty (sortBy) && sortBy.Equals (header.Tag)) + { + if (ListSortDirection.Ascending == direction) + column.HeaderTemplate = Resources["SortArrowUp"] as DataTemplate; + else + column.HeaderTemplate = Resources["SortArrowDown"] as DataTemplate; + m_lvSortByColumn = header; + m_lvSortDirection = direction; + } + else + { + column.HeaderTemplate = Resources["SortArrowNone"] as DataTemplate; + } + } + SortMode = sortBy; + } + + private void lv_Sort (string sortBy, ListSortDirection direction) + { + var dataView = CollectionViewSource.GetDefaultView (CurrentDirectory.ItemsSource) as ListCollectionView; + dataView.CustomSort = new FileSystemComparer (sortBy, direction); + } + + /// + /// Sort Listview by columns + /// + void lv_ColumnHeaderClicked (object sender, RoutedEventArgs e) + { + var headerClicked = e.OriginalSource as GridViewColumnHeader; + + if (null == headerClicked) + return; + if (headerClicked.Role == GridViewColumnHeaderRole.Padding) + return; + + ListSortDirection direction; + if (headerClicked != m_lvSortByColumn) + direction = ListSortDirection.Ascending; + else if (m_lvSortDirection == ListSortDirection.Ascending) + direction = ListSortDirection.Descending; + else + direction = ListSortDirection.Ascending; + + string sortBy = headerClicked.Tag.ToString(); + lv_Sort (sortBy, direction); + SortMode = sortBy; + + // Remove arrow from previously sorted header + if (m_lvSortByColumn != null && m_lvSortByColumn != headerClicked) + { + m_lvSortByColumn.Column.HeaderTemplate = Resources["SortArrowNone"] as DataTemplate; + } + + if (ListSortDirection.Ascending == direction) + { + headerClicked.Column.HeaderTemplate = Resources["SortArrowUp"] as DataTemplate; + } + else + { + headerClicked.Column.HeaderTemplate = Resources["SortArrowDown"] as DataTemplate; + } + m_lvSortByColumn = headerClicked; + m_lvSortDirection = direction; + } + + /// + /// Handle "Sort By" commands. + /// + + private void SortByExec (object sender, ExecutedRoutedEventArgs e) + { + string sort_by = e.Parameter as string; + lv_Sort (sort_by, ListSortDirection.Ascending); + lv_SetSortMode (sort_by, ListSortDirection.Ascending); + } + + /// + /// Handle "Set file type" commands. + /// + private void SetFileTypeExec (object sender, ExecutedRoutedEventArgs e) + { + var selected = CurrentDirectory.SelectedItems.Cast().Where (x => !x.IsDirectory); + if (!selected.Any()) + return; + string type = e.Parameter as string; + foreach (var entry in selected) + { + entry.Type = type; + } + } + + /// + /// Event handler for keys pressed in the directory view pane + /// + + private void lv_TextInput (object sender, TextCompositionEventArgs e) + { + LookupItem (e.Text, e.Timestamp); + e.Handled = true; + } + + private void lv_KeyDown (object sender, KeyEventArgs e) + { + if (e.IsDown && Key.Space == e.Key && LookupActive) + { + LookupItem (" ", e.Timestamp); + e.Handled = true; + } + } + + class InputData + { + public int LastTime = 0; + public StringBuilder Phrase = new StringBuilder(); + public bool Mismatch = false; + + public bool LookupActive + { + get { return Phrase.Length > 0 && Environment.TickCount - LastTime < TextLookupTimeout; } + } + + public void Reset () + { + Phrase.Clear (); + Mismatch = false; + } + } + + const int TextLookupTimeout = 1000; // milliseconds + + InputData m_current_input = new InputData(); + + public bool LookupActive { get { return m_current_input.LookupActive; } } + + /// + /// Lookup item in listview pane by first letters of name. + /// + + private void LookupItem (string key, int timestamp) + { + if (string.IsNullOrEmpty (key)) + return; + var source = CurrentDirectory.ItemsSource as CollectionView; + if (source == null) + return; + + if (timestamp - m_current_input.LastTime > TextLookupTimeout) + { + m_current_input.Reset(); + } + m_current_input.LastTime = timestamp; + if (m_current_input.Mismatch) + return; + + if (!(1 == m_current_input.Phrase.Length && m_current_input.Phrase[0] == key[0])) + { + m_current_input.Phrase.Append (key); + } + int start_index = CurrentDirectory.SelectedIndex; + if (1 == m_current_input.Phrase.Length) + { + // lookup starting from the next item + if (start_index != -1 && start_index+1 < source.Count) + ++start_index; + } + var items = source.Cast(); + if (start_index > 0) + { + items = items.Skip (start_index).Concat (items.Take (start_index)); + } + string input = m_current_input.Phrase.ToString(); + var matched = items.Where (e => e.Name.StartsWith (input, StringIgnoreCase)).FirstOrDefault(); + if (null != matched) + lv_SelectItem (matched); + else + m_current_input.Mismatch = true; + } + + static readonly Regex FullpathRe = new Regex (@"^(?:[a-z]:|[\\/])", RegexOptions.IgnoreCase); + + private void acb_OnKeyDown (object sender, KeyEventArgs e) + { + if (e.Key != Key.Return) + return; + string path = (sender as AutoCompleteBox).Text; + if (string.IsNullOrEmpty (path)) + return; + if (FullpathRe.IsMatch (path)) + { + OpenFile (path); + return; + } + try + { + PushViewModel (GetNewViewModel (path)); + lv_Focus(); + } + catch (Exception X) + { + PopupError (X.Message, guiStrings.MsgErrorOpening); + } + } + + #region Navigation history implementation + + internal string CurrentPath { get { return ViewModel.Path.First(); } } + + HistoryStack m_history = new HistoryStack(); + + public DirectoryPosition GetCurrentPosition () + { + var evm = CurrentDirectory.SelectedItem as EntryViewModel; + return new DirectoryPosition (ViewModel, evm); + } + + public bool SetCurrentPosition (DirectoryPosition pos) + { + try + { + VFS.FullPath = pos.Path; + var vm = TryCreateViewModel (pos.Path.Last()); + if (null == vm) + return false; + ViewModel = vm; + if (null != pos.Item) + lv_SelectItem (pos.Item); + return true; + } + catch (Exception X) + { + // if VFS.FullPath throws an exception, ViewModel becomes inconsistent at this point + // and should be rebuilt + ViewModel = CreateViewModel (VFS.Top.CurrentDirectory, true); + SetStatusText (X.Message); + return false; + } + } + + public void SaveCurrentPosition () + { + m_history.Push (GetCurrentPosition()); + } + + public void ChangePosition (DirectoryPosition new_pos) + { + var current = GetCurrentPosition(); + if (!current.Path.SequenceEqual (new_pos.Path)) + SaveCurrentPosition(); + SetCurrentPosition (new_pos); + } + + private void GoBackExec (object sender, ExecutedRoutedEventArgs e) + { + DirectoryPosition current = m_history.Undo (GetCurrentPosition()); + if (current != null) + SetCurrentPosition (current); + } + + private void GoForwardExec (object sender, ExecutedRoutedEventArgs e) + { + DirectoryPosition current = m_history.Redo (GetCurrentPosition()); + if (current != null) + SetCurrentPosition (current); + } + + private void CanExecuteGoBack (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = m_history.CanUndo(); + } + + private void CanExecuteGoForward (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = m_history.CanRedo(); + } + #endregion + + private void OpenFileExec (object control, ExecutedRoutedEventArgs e) + { + var dlg = new OpenFileDialog { + CheckFileExists = true, + CheckPathExists = true, + Multiselect = false, + Title = guiStrings.TextChooseArchive, + }; + if (!dlg.ShowDialog (this).Value) + return; + OpenFile (dlg.FileName); + } + + private void OpenFile (string filename) + { + if (filename == CurrentPath || string.IsNullOrEmpty (filename)) + return; + try + { + if (File.Exists (filename)) + VFS.FullPath = new string[] { filename, "" }; + else + VFS.FullPath = new string[] { filename }; + var vm = new DirectoryViewModel (VFS.FullPath, VFS.GetFiles(), VFS.IsVirtual); + PushViewModel (vm); + if (null != VFS.CurrentArchive) + SetStatusText (VFS.CurrentArchive.Description); + lv_SelectItem (0); + } + catch (OperationCanceledException X) + { + SetStatusText (X.Message); + } + catch (Exception X) + { + PopupError (string.Format("{0}:\n{1}", filename, X.Message), guiStrings.MsgErrorOpening); + } + } + + private void OpenRecentExec (object control, ExecutedRoutedEventArgs e) + { + string filename = e.Parameter as string; + if (string.IsNullOrEmpty (filename)) + return; + OpenFile (filename); + } + + /// + /// Open file/directory. + /// + private void OpenItemExec (object control, ExecutedRoutedEventArgs e) + { + EntryViewModel entry = null; + var lvi = e.OriginalSource as ListViewItem; + if (lvi != null) + entry = lvi.Content as EntryViewModel; + if (null == entry) + entry = CurrentDirectory.SelectedItem as EntryViewModel; + if (null == entry) + return; + if ("audio" == entry.Type) + { + PlayFile (entry.Source); + return; + } + OpenDirectoryEntry (ViewModel, entry); + } + + private void OpenDirectoryEntry (DirectoryViewModel vm, EntryViewModel entry) + { + string old_dir = null == vm ? "" : vm.Path.Last(); + string new_dir = entry.Source.Name; + if (".." == new_dir) + { + if (null != vm && !vm.IsArchive) + new_dir = Path.Combine (old_dir, entry.Name); + if (vm.Path.Count > 1 && string.IsNullOrEmpty (old_dir)) + old_dir = vm.Path[vm.Path.Count-2]; + } + Trace.WriteLine (new_dir, "OpenDirectoryEntry"); + int old_fs_count = VFS.Count; + vm = TryCreateViewModel (new_dir); + if (null == vm) + { + if (VFS.Count == old_fs_count) + return; + vm = new DirectoryViewModel (VFS.FullPath, new Entry[0], VFS.IsVirtual); + PushViewModel (vm); + } + else + { + PushViewModel (vm); + if (VFS.Count > old_fs_count && null != VFS.CurrentArchive) + SetStatusText (string.Format ("{0}: {1}", VFS.CurrentArchive.Description, + Localization.Format ("MsgFiles", VFS.CurrentArchive.Dir.Count()))); + else + SetStatusText (""); + } + if (".." == entry.Name) + lv_SelectItem (Path.GetFileName (old_dir)); + else + lv_SelectItem (0); + } + + WaveOutEvent m_audio_device; + WaveOutEvent AudioDevice + { + get { return m_audio_device; } + set + { + var old_value = m_audio_device; + m_audio_device = value; + if (old_value != null) + old_value.Dispose(); + } + } + + WaveStream m_audio_input; + WaveStream CurrentAudio + { + get { return m_audio_input; } + set + { + var old_value = m_audio_input; + m_audio_input = value; + if (old_value != null) + old_value.Dispose(); + } + } + + private void PlayFile (Entry entry) + { + SoundInput sound = null; + try + { + SetBusyState(); + using (var input = VFS.OpenStream (entry)) + { + FormatCatalog.Instance.LastError = null; + sound = AudioFormat.Read (input); + if (null == sound) + { + if (null != FormatCatalog.Instance.LastError) + throw FormatCatalog.Instance.LastError; + return; + } + + if (AudioDevice != null) + { + AudioDevice.PlaybackStopped -= OnPlaybackStopped; + AudioDevice = null; + } + CurrentAudio = new WaveStreamImpl (sound); + AudioDevice = new WaveOutEvent(); + AudioDevice.Init (CurrentAudio); + AudioDevice.PlaybackStopped += OnPlaybackStopped; + AudioDevice.Play(); + var fmt = CurrentAudio.WaveFormat; + SetResourceText (string.Format ("Playing {0} / {3} / {2}bps / {1}Hz", entry.Name, + fmt.SampleRate, sound.SourceBitrate / 1000, + CurrentAudio.TotalTime.ToString ("m':'ss"))); + } + } + catch (Exception X) + { + SetStatusText (X.Message); + if (null != sound) + sound.Dispose(); + } + } + + private void OnPlaybackStopped (object sender, StoppedEventArgs e) + { + try + { + SetResourceText (""); + CurrentAudio = null; + } + catch (Exception X) + { + Trace.WriteLine (X.Message, "[OnPlaybackStopped]"); + } + } + + /// + /// Launch specified file. + /// + private void SystemOpen (string file) + { + try + { + Process.Start (file); + } + catch (Exception X) + { + SetStatusText (X.Message); + } + } + + /// + /// Refresh current view. + /// + private void RefreshExec (object sender, ExecutedRoutedEventArgs e) + { + RefreshView(); + } + + public void RefreshView () + { + VFS.Flush(); + var pos = GetCurrentPosition(); + SetCurrentPosition (pos); + } + + /// + /// Open current file in Explorer. + /// + + private void ExploreItemExec (object sender, ExecutedRoutedEventArgs e) + { + var entry = CurrentDirectory.SelectedItem as EntryViewModel; + if (entry != null && !ViewModel.IsArchive) + { + try + { + string name = Path.Combine (CurrentPath, entry.Name); + Process.Start ("explorer.exe", "/select,"+name); + } + catch (Exception X) + { + // ignore + Trace.WriteLine (X.Message, "explorer.exe"); + } + } + } + + /// + /// Delete item from both media library and disk drive. + /// + private void DeleteItemExec (object sender, ExecutedRoutedEventArgs e) + { + var items = CurrentDirectory.SelectedItems.Cast().Where (f => !f.IsDirectory); + if (!items.Any()) + return; + + this.IsEnabled = false; + try + { + VFS.Flush(); + ResetPreviewPane(); + if (!items.Skip (1).Any()) // items.Count() == 1 + { + string item_name = Path.Combine (CurrentPath, items.First().Name); + Trace.WriteLine (item_name, "DeleteItemExec"); + FileSystem.DeleteFile (item_name, UIOption.AllDialogs, RecycleOption.SendToRecycleBin); + DeleteItem (lv_GetCurrentContainer()); + SetStatusText (string.Format(guiStrings.MsgDeletedItem, item_name)); + } + else + { + int count = 0; + StopWatchDirectoryChanges (); + try + { + var file_list = items.Select (entry => Path.Combine (CurrentPath, entry.Name)); + GARbro.Shell.File.Delete (file_list); + count = file_list.Count(); + } + catch + { + ResumeWatchDirectoryChanges(); + throw; + } + RefreshView(); + SetStatusText (Localization.Format ("MsgDeletedItems", count)); + } + } + catch (OperationCanceledException) + { + } + catch (Exception X) + { + SetStatusText (X.Message); + } + finally + { + this.IsEnabled = true; + } + } + + /// + /// Delete item at the specified position within ListView, correctly adjusting current + /// position. + /// + private void DeleteItem (ListViewItem item) + { + int i = CurrentDirectory.SelectedIndex; + int next = -1; + if (i+1 < CurrentDirectory.Items.Count) + next = i + 1; + else if (i > 0) + next = i - 1; + + if (next != -1) + CurrentDirectory.SelectedIndex = next; + + var entry = item.Content as EntryViewModel; + if (entry != null) + { + ViewModel.Remove (entry); + } + } + + /// + /// Rename selected item. + /// + private void RenameItemExec(object sender, ExecutedRoutedEventArgs e) + { + RenameElement (lv_GetCurrentContainer()); + } + + /// + /// Rename item contained within specified framework control. + /// + void RenameElement (ListViewItem item) + { + if (item == null) + return; +/* + TextBlock block = FindByName (item, "item_Text") as TextBlock; + TextBox box = FindSibling (block, "item_Input") as TextBox; + + if (block == null || box == null) + return; + + IsRenameActive = true; + + block.Visibility = Visibility.Collapsed; + box.Text = block.Text; + box.Visibility = Visibility.Visible; + box.Select (0, box.Text.Length); + box.Focus(); +*/ + } + + /// + /// Select files matching mask. + /// + void AddSelectionExec (object sender, ExecutedRoutedEventArgs e) + { + try + { + var ext_list = new SortedSet(); + foreach (var entry in ViewModel) + { + var ext = Path.GetExtension (entry.Name).ToLowerInvariant(); + if (!string.IsNullOrEmpty (ext)) + ext_list.Add (ext); + } + var selection = new EnterMaskDialog (ext_list.Select (ext => "*"+ext)); + selection.Owner = this; + var result = selection.ShowDialog(); + if (!result.Value) + return; + if ("*.*" == selection.Mask.Text) + { + CurrentDirectory.SelectAll(); + return; + } + var mask = Regex.Escape (selection.Mask.Text).Replace (@"\*", ".*").Replace (@"\?", "."); + var glob = new Regex ("^"+mask+"$", RegexOptions.IgnoreCase); + var matching = ViewModel.Where (entry => glob.IsMatch (entry.Name)); + if (!matching.Any()) + { + SetStatusText (string.Format (guiStrings.MsgNoMatching, selection.Mask.Text)); + return; + } + int count = 0; + foreach (var item in matching) + { + if (!CurrentDirectory.SelectedItems.Contains (item)) + { + CurrentDirectory.SelectedItems.Add (item); + ++count; + } + } + if (count != 0) + SetStatusText (Localization.Format ("MsgSelectedFiles", count)); + } + catch (Exception X) + { + SetStatusText (X.Message); + } + } + + void SelectAllExec (object sender, ExecutedRoutedEventArgs e) + { + CurrentDirectory.SelectAll(); + } + + void NextItemExec (object sender, ExecutedRoutedEventArgs e) + { + if (LookupActive) + return; + + var index = CurrentDirectory.SelectedIndex + 1; + if (index < CurrentDirectory.Items.Count) + CurrentDirectory.SelectedIndex = index; + } + + /// + /// Handle "Exit" command. + /// + void ExitExec (object sender, ExecutedRoutedEventArgs e) + { + Application.Current.Shutdown(); + } + + private void AboutExec (object sender, ExecutedRoutedEventArgs e) + { + var about = new AboutBox(); + about.Owner = this; + about.ShowDialog(); + } + + private void CanExecuteAlways (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = true; + } + + private void CanExecuteControlCommand (object sender, CanExecuteRoutedEventArgs e) + { + Control target = e.Source as Control; + e.CanExecute = target != null; + } + + private void CanExecuteOnSelected (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = CurrentDirectory.SelectedIndex != -1; + } + + private void CanExecuteConvertMedia (object sender, CanExecuteRoutedEventArgs e) + { + if (CurrentDirectory.SelectedItems.Count >= 1) + { + e.CanExecute = !ViewModel.IsArchive; + } + } + + private void CanExecuteOnImage (object sender, CanExecuteRoutedEventArgs e) + { + var entry = CurrentDirectory.SelectedItem as EntryViewModel; + e.CanExecute = !ViewModel.IsArchive && entry != null && entry.Type == "image"; + } + + private void CanExecuteInArchive (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = ViewModel.IsArchive && CurrentDirectory.SelectedIndex != -1; + } + + private void CanExecuteCreateArchive (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = !ViewModel.IsArchive && CurrentDirectory.SelectedItems.Count > 0; + } + + private void CanExecuteInDirectory (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = !ViewModel.IsArchive; + } + + private void CanExecuteExtract (object sender, CanExecuteRoutedEventArgs e) + { + if (ViewModel.IsArchive) + { + e.CanExecute = true; + return; + } + else if (CurrentDirectory.SelectedIndex != -1) + { + var entry = CurrentDirectory.SelectedItem as EntryViewModel; + if (entry != null && !entry.IsDirectory) + { + e.CanExecute = true; + return; + } + } + e.CanExecute = false; + } + + private void CanExecuteOnPhysicalFile (object sender, CanExecuteRoutedEventArgs e) + { + if (!ViewModel.IsArchive && CurrentDirectory.SelectedIndex != -1) + { + var entry = CurrentDirectory.SelectedItem as EntryViewModel; + if (entry != null && !entry.IsDirectory) + { + e.CanExecute = true; + return; + } + } + e.CanExecute = false; + } + + private void OnParametersRequest (object sender, ParametersRequestEventArgs e) + { + var format = sender as IResource; + if (null != format) + { + var control = format.GetAccessWidget() as UIElement; + if (null != control) + { + bool busy_state = m_busy_state; + var param_dialog = new ArcParametersDialog (control, e.Notice); + param_dialog.Owner = this; + e.InputResult = param_dialog.ShowDialog() ?? false; + if (e.InputResult) + e.Options = format.GetOptions (control); + if (busy_state) + SetBusyState(); + } + } + } + + private void CanExecuteFitWindow (object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = ImageCanvas.Source != null; + } + + private void HideStatusBarExec (object sender, ExecutedRoutedEventArgs e) + { + ToggleVisibility (AppStatusBar); + } + + private void HideMenuBarExec (object sender, ExecutedRoutedEventArgs e) + { + ToggleVisibility (MainMenuBar); + } + + private void HideToolBarExec (object sender, ExecutedRoutedEventArgs e) + { + ToggleVisibility (MainToolBar); + } + + static void ToggleVisibility (UIElement item) + { + var status = item.Visibility; + if (Visibility.Visible == status) + item.Visibility = Visibility.Collapsed; + else + item.Visibility = Visibility.Visible; + } + } + + public class SortModeToBooleanConverter : IValueConverter + { + public object Convert (object value, Type targetType, object parameter, CultureInfo culture) + { + string actual_mode = value as string; + string check_mode = parameter as string; + if (string.IsNullOrEmpty (check_mode)) + return string.IsNullOrEmpty (actual_mode); + return check_mode.Equals (actual_mode); + } + + public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } + + public class BooleanToCollapsedVisibilityConverter : IValueConverter + { + #region IValueConverter Members + + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + //reverse conversion (false=>Visible, true=>collapsed) on any given parameter + bool input = (null == parameter) ? (bool)value : !((bool)value); + return (input) ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + + #endregion + } + + public static class Commands + { + public static readonly RoutedCommand OpenItem = new RoutedCommand(); + public static readonly RoutedCommand OpenFile = new RoutedCommand(); + public static readonly RoutedCommand OpenRecent = new RoutedCommand(); + public static readonly RoutedCommand ExtractItem = new RoutedCommand(); + public static readonly RoutedCommand CreateArchive = new RoutedCommand(); + public static readonly RoutedCommand SortBy = new RoutedCommand(); + public static readonly RoutedCommand Exit = new RoutedCommand(); + public static readonly RoutedCommand About = new RoutedCommand(); + public static readonly RoutedCommand GoBack = new RoutedCommand(); + public static readonly RoutedCommand GoForward = new RoutedCommand(); + public static readonly RoutedCommand DeleteItem = new RoutedCommand(); + public static readonly RoutedCommand RenameItem = new RoutedCommand(); + public static readonly RoutedCommand ExploreItem = new RoutedCommand(); + public static readonly RoutedCommand ConvertMedia = new RoutedCommand(); + public static readonly RoutedCommand Refresh = new RoutedCommand(); + public static readonly RoutedCommand Browse = new RoutedCommand(); + public static readonly RoutedCommand FitWindow = new RoutedCommand(); + public static readonly RoutedCommand HideStatusBar = new RoutedCommand(); + public static readonly RoutedCommand HideMenuBar = new RoutedCommand(); + public static readonly RoutedCommand HideToolBar = new RoutedCommand(); + public static readonly RoutedCommand AddSelection = new RoutedCommand(); + public static readonly RoutedCommand SelectAll = new RoutedCommand(); + public static readonly RoutedCommand SetFileType = new RoutedCommand(); + public static readonly RoutedCommand NextItem = new RoutedCommand(); + } +} diff --git a/ModalWindow.cs b/GUI/ModalWindow.cs similarity index 97% rename from ModalWindow.cs rename to GUI/ModalWindow.cs index 6b1aa5cc..f5c3839d 100644 --- a/ModalWindow.cs +++ b/GUI/ModalWindow.cs @@ -1,88 +1,88 @@ -//! \file ModalWindow.cs -//! \date Tue Aug 02 10:20:50 2011 -//! \brief Window without an icon. -// -// Copyright (C) 2011 by poddav -// -// 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.Windows; -using System.Windows.Interop; -using System.Runtime.InteropServices; - -namespace Rnd.Windows -{ - /// - /// Window without an icon. - /// - public class ModalWindow : Window - { - protected override void OnSourceInitialized(EventArgs e) - { - base.OnSourceInitialized(e); - - HideIcon (this); - } - - internal class NativeMethods - { - [DllImport ("user32.dll")] - internal static extern int GetWindowLong (IntPtr hwnd, int index); - - [DllImport ("user32.dll")] - internal static extern int SetWindowLong (IntPtr hwnd, int index, int newStyle); - - [DllImport ("user32.dll")] - internal static extern bool SetWindowPos (IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags); - - [DllImport ("user32.dll")] - internal static extern IntPtr SendMessage (IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam); - } - - const int GWL_EXSTYLE = -20; - const int WS_EX_DLGMODALFRAME = 0x0001; - - const int SWP_NOSIZE = 0x0001; - const int SWP_NOMOVE = 0x0002; - const int SWP_NOZORDER = 0x0004; - const int SWP_FRAMECHANGED = 0x0020; - const uint WM_SETICON = 0x0080; - - /// - /// Win32 mumbo-jumbo to hide window icon and its menu. - /// - - public static void HideIcon (Window window) - { - // Get this window's handle - IntPtr hwnd = new WindowInteropHelper (window).Handle; - - // Change the extended window style to not show a window icon - int extendedStyle = NativeMethods.GetWindowLong (hwnd, GWL_EXSTYLE); - NativeMethods.SetWindowLong (hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME); - NativeMethods.SendMessage (hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero); - NativeMethods.SendMessage (hwnd, WM_SETICON, new IntPtr (1), IntPtr.Zero); - - // Update the window's non-client area to reflect the changes - NativeMethods.SetWindowPos (hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - } - } -} +//! \file ModalWindow.cs +//! \date Tue Aug 02 10:20:50 2011 +//! \brief Window without an icon. +// +// Copyright (C) 2011 by poddav +// +// 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.Windows; +using System.Windows.Interop; +using System.Runtime.InteropServices; + +namespace Rnd.Windows +{ + /// + /// Window without an icon. + /// + public class ModalWindow : Window + { + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + + HideIcon (this); + } + + internal class NativeMethods + { + [DllImport ("user32.dll")] + internal static extern int GetWindowLong (IntPtr hwnd, int index); + + [DllImport ("user32.dll")] + internal static extern int SetWindowLong (IntPtr hwnd, int index, int newStyle); + + [DllImport ("user32.dll")] + internal static extern bool SetWindowPos (IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags); + + [DllImport ("user32.dll")] + internal static extern IntPtr SendMessage (IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam); + } + + const int GWL_EXSTYLE = -20; + const int WS_EX_DLGMODALFRAME = 0x0001; + + const int SWP_NOSIZE = 0x0001; + const int SWP_NOMOVE = 0x0002; + const int SWP_NOZORDER = 0x0004; + const int SWP_FRAMECHANGED = 0x0020; + const uint WM_SETICON = 0x0080; + + /// + /// Win32 mumbo-jumbo to hide window icon and its menu. + /// + + public static void HideIcon (Window window) + { + // Get this window's handle + IntPtr hwnd = new WindowInteropHelper (window).Handle; + + // Change the extended window style to not show a window icon + int extendedStyle = NativeMethods.GetWindowLong (hwnd, GWL_EXSTYLE); + NativeMethods.SetWindowLong (hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME); + NativeMethods.SendMessage (hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero); + NativeMethods.SendMessage (hwnd, WM_SETICON, new IntPtr (1), IntPtr.Zero); + + // Update the window's non-client area to reflect the changes + NativeMethods.SetWindowPos (hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + } + } +} diff --git a/NAudio.cs b/GUI/NAudio.cs similarity index 100% rename from NAudio.cs rename to GUI/NAudio.cs diff --git a/Properties/AssemblyInfo.cs b/GUI/Properties/AssemblyInfo.cs similarity index 93% rename from Properties/AssemblyInfo.cs rename to GUI/Properties/AssemblyInfo.cs index 42f50728..96b87f3f 100644 --- a/Properties/AssemblyInfo.cs +++ b/GUI/Properties/AssemblyInfo.cs @@ -1,55 +1,55 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Game Resource browser")] -[assembly: AssemblyDescription("Game Resource browser")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany ("mørkt")] -[assembly: AssemblyProduct("GARbro.GUI")] -[assembly: AssemblyCopyright ("Copyright © 2014-2015 mørkt")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] - - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion ("1.2.12.953")] -[assembly: AssemblyFileVersion ("1.2.12.953")] +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Game Resource browser")] +[assembly: AssemblyDescription("Game Resource browser")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany ("mørkt")] +[assembly: AssemblyProduct("GARbro.GUI")] +[assembly: AssemblyCopyright ("Copyright © 2014-2015 mørkt")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion ("1.2.12.0")] +[assembly: AssemblyFileVersion ("1.2.12.0")] diff --git a/Properties/Resources.Designer.cs b/GUI/Properties/Resources.Designer.cs similarity index 97% rename from Properties/Resources.Designer.cs rename to GUI/Properties/Resources.Designer.cs index 836235e8..8d74d938 100644 --- a/Properties/Resources.Designer.cs +++ b/GUI/Properties/Resources.Designer.cs @@ -1,63 +1,63 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18444 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GARbro.GUI.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GARbro.GUI.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18444 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GARbro.GUI.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GARbro.GUI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Properties/Resources.resx b/GUI/Properties/Resources.resx similarity index 97% rename from Properties/Resources.resx rename to GUI/Properties/Resources.resx index ffecec85..af7dbebb 100644 --- a/Properties/Resources.resx +++ b/GUI/Properties/Resources.resx @@ -1,117 +1,117 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/GUI/Properties/Settings.Designer.cs similarity index 97% rename from Properties/Settings.Designer.cs rename to GUI/Properties/Settings.Designer.cs index a8a205fc..7d21d9ad 100644 --- a/Properties/Settings.Designer.cs +++ b/GUI/Properties/Settings.Designer.cs @@ -1,361 +1,361 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34209 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GARbro.GUI.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool UpgradeRequired { - get { - return ((bool)(this["UpgradeRequired"])); - } - set { - this["UpgradeRequired"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("NaN")] - public double winTop { - get { - return ((double)(this["winTop"])); - } - set { - this["winTop"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("NaN")] - public double winLeft { - get { - return ((double)(this["winLeft"])); - } - set { - this["winLeft"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("1024")] - public double winWidth { - get { - return ((double)(this["winWidth"])); - } - set { - this["winWidth"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("600")] - public double winHeight { - get { - return ((double)(this["winHeight"])); - } - set { - this["winHeight"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Normal")] - public global::System.Windows.WindowState winState { - get { - return ((global::System.Windows.WindowState)(this["winState"])); - } - set { - this["winState"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("265")] - public double lvNameColumnWidth { - get { - return ((double)(this["lvNameColumnWidth"])); - } - set { - this["lvNameColumnWidth"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("75")] - public double lvTypeColumnWidth { - get { - return ((double)(this["lvTypeColumnWidth"])); - } - set { - this["lvTypeColumnWidth"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("75")] - public double lvSizeColumnWidth { - get { - return ((double)(this["lvSizeColumnWidth"])); - } - set { - this["lvSizeColumnWidth"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Name")] - public string lvSortColumn { - get { - return ((string)(this["lvSortColumn"])); - } - set { - this["lvSortColumn"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Ascending")] - public global::System.ComponentModel.ListSortDirection lvSortDirection { - get { - return ((global::System.ComponentModel.ListSortDirection)(this["lvSortDirection"])); - } - set { - this["lvSortDirection"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("448")] - public global::System.Windows.GridLength lvPanelWidth { - get { - return ((global::System.Windows.GridLength)(this["lvPanelWidth"])); - } - set { - this["lvPanelWidth"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool appExtractImages { - get { - return ((bool)(this["appExtractImages"])); - } - set { - this["appExtractImages"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool appExtractText { - get { - return ((bool)(this["appExtractText"])); - } - set { - this["appExtractText"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string appImageFormat { - get { - return ((string)(this["appImageFormat"])); - } - set { - this["appImageFormat"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("65001")] - public int appTextEncoding { - get { - return ((int)(this["appTextEncoding"])); - } - set { - this["appTextEncoding"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string appLastDirectory { - get { - return ((string)(this["appLastDirectory"])); - } - set { - this["appLastDirectory"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string appArchiveFormat { - get { - return ((string)(this["appArchiveFormat"])); - } - set { - this["appArchiveFormat"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - public global::System.Collections.Specialized.StringCollection appRecentFiles { - get { - return ((global::System.Collections.Specialized.StringCollection)(this["appRecentFiles"])); - } - set { - this["appRecentFiles"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string appLastCreatedArchive { - get { - return ((string)(this["appLastCreatedArchive"])); - } - set { - this["appLastCreatedArchive"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Visible")] - public global::System.Windows.Visibility winMenuBarVisibility { - get { - return ((global::System.Windows.Visibility)(this["winMenuBarVisibility"])); - } - set { - this["winMenuBarVisibility"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Visible")] - public global::System.Windows.Visibility winToolBarVisibility { - get { - return ((global::System.Windows.Visibility)(this["winToolBarVisibility"])); - } - set { - this["winToolBarVisibility"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Visible")] - public global::System.Windows.Visibility winStatusBarVisibility { - get { - return ((global::System.Windows.Visibility)(this["winStatusBarVisibility"])); - } - set { - this["winStatusBarVisibility"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("PNG")] - public string appLastImageFormat { - get { - return ((string)(this["appLastImageFormat"])); - } - set { - this["appLastImageFormat"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool appConvertAudio { - get { - return ((bool)(this["appConvertAudio"])); - } - set { - this["appConvertAudio"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool appExtractAudio { - get { - return ((bool)(this["appExtractAudio"])); - } - set { - this["appExtractAudio"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool appIgnoreConversionErrors { - get { - return ((bool)(this["appIgnoreConversionErrors"])); - } - set { - this["appIgnoreConversionErrors"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string appLastDestination { - get { - return ((string)(this["appLastDestination"])); - } - set { - this["appLastDestination"] = value; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GARbro.GUI.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool UpgradeRequired { + get { + return ((bool)(this["UpgradeRequired"])); + } + set { + this["UpgradeRequired"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("NaN")] + public double winTop { + get { + return ((double)(this["winTop"])); + } + set { + this["winTop"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("NaN")] + public double winLeft { + get { + return ((double)(this["winLeft"])); + } + set { + this["winLeft"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1024")] + public double winWidth { + get { + return ((double)(this["winWidth"])); + } + set { + this["winWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("600")] + public double winHeight { + get { + return ((double)(this["winHeight"])); + } + set { + this["winHeight"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Normal")] + public global::System.Windows.WindowState winState { + get { + return ((global::System.Windows.WindowState)(this["winState"])); + } + set { + this["winState"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("265")] + public double lvNameColumnWidth { + get { + return ((double)(this["lvNameColumnWidth"])); + } + set { + this["lvNameColumnWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("75")] + public double lvTypeColumnWidth { + get { + return ((double)(this["lvTypeColumnWidth"])); + } + set { + this["lvTypeColumnWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("75")] + public double lvSizeColumnWidth { + get { + return ((double)(this["lvSizeColumnWidth"])); + } + set { + this["lvSizeColumnWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Name")] + public string lvSortColumn { + get { + return ((string)(this["lvSortColumn"])); + } + set { + this["lvSortColumn"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Ascending")] + public global::System.ComponentModel.ListSortDirection lvSortDirection { + get { + return ((global::System.ComponentModel.ListSortDirection)(this["lvSortDirection"])); + } + set { + this["lvSortDirection"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("448")] + public global::System.Windows.GridLength lvPanelWidth { + get { + return ((global::System.Windows.GridLength)(this["lvPanelWidth"])); + } + set { + this["lvPanelWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool appExtractImages { + get { + return ((bool)(this["appExtractImages"])); + } + set { + this["appExtractImages"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool appExtractText { + get { + return ((bool)(this["appExtractText"])); + } + set { + this["appExtractText"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string appImageFormat { + get { + return ((string)(this["appImageFormat"])); + } + set { + this["appImageFormat"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("65001")] + public int appTextEncoding { + get { + return ((int)(this["appTextEncoding"])); + } + set { + this["appTextEncoding"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string appLastDirectory { + get { + return ((string)(this["appLastDirectory"])); + } + set { + this["appLastDirectory"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string appArchiveFormat { + get { + return ((string)(this["appArchiveFormat"])); + } + set { + this["appArchiveFormat"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Collections.Specialized.StringCollection appRecentFiles { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["appRecentFiles"])); + } + set { + this["appRecentFiles"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string appLastCreatedArchive { + get { + return ((string)(this["appLastCreatedArchive"])); + } + set { + this["appLastCreatedArchive"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Visible")] + public global::System.Windows.Visibility winMenuBarVisibility { + get { + return ((global::System.Windows.Visibility)(this["winMenuBarVisibility"])); + } + set { + this["winMenuBarVisibility"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Visible")] + public global::System.Windows.Visibility winToolBarVisibility { + get { + return ((global::System.Windows.Visibility)(this["winToolBarVisibility"])); + } + set { + this["winToolBarVisibility"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Visible")] + public global::System.Windows.Visibility winStatusBarVisibility { + get { + return ((global::System.Windows.Visibility)(this["winStatusBarVisibility"])); + } + set { + this["winStatusBarVisibility"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("PNG")] + public string appLastImageFormat { + get { + return ((string)(this["appLastImageFormat"])); + } + set { + this["appLastImageFormat"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool appConvertAudio { + get { + return ((bool)(this["appConvertAudio"])); + } + set { + this["appConvertAudio"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool appExtractAudio { + get { + return ((bool)(this["appExtractAudio"])); + } + set { + this["appExtractAudio"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool appIgnoreConversionErrors { + get { + return ((bool)(this["appIgnoreConversionErrors"])); + } + set { + this["appIgnoreConversionErrors"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string appLastDestination { + get { + return ((string)(this["appLastDestination"])); + } + set { + this["appLastDestination"] = value; + } + } + } +} diff --git a/Properties/Settings.settings b/GUI/Properties/Settings.settings similarity index 97% rename from Properties/Settings.settings rename to GUI/Properties/Settings.settings index 5ca6b625..0a8838d0 100644 --- a/Properties/Settings.settings +++ b/GUI/Properties/Settings.settings @@ -1,90 +1,90 @@ - - - - - - True - - - NaN - - - NaN - - - 1024 - - - 600 - - - Normal - - - 265 - - - 75 - - - 75 - - - Name - - - Ascending - - - 448 - - - True - - - True - - - - - - 65001 - - - - - - - - - - - - - - - Visible - - - Visible - - - Visible - - - PNG - - - False - - - True - - - False - - - - - + + + + + + True + + + NaN + + + NaN + + + 1024 + + + 600 + + + Normal + + + 265 + + + 75 + + + 75 + + + Name + + + Ascending + + + 448 + + + True + + + True + + + + + + 65001 + + + + + + + + + + + + + + + Visible + + + Visible + + + Visible + + + PNG + + + False + + + True + + + False + + + + + \ No newline at end of file diff --git a/Properties/app.manifest b/GUI/Properties/app.manifest similarity index 98% rename from Properties/app.manifest rename to GUI/Properties/app.manifest index 5d2bdc37..cc922d5e 100644 --- a/Properties/app.manifest +++ b/GUI/Properties/app.manifest @@ -1,56 +1,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/Formats.dat b/GUI/Resources/Formats.dat similarity index 100% rename from Resources/Formats.dat rename to GUI/Resources/Formats.dat diff --git a/Settings.cs b/GUI/Settings.cs similarity index 97% rename from Settings.cs rename to GUI/Settings.cs index cc3aad29..97c648d9 100644 --- a/Settings.cs +++ b/GUI/Settings.cs @@ -1,43 +1,43 @@ -namespace GARbro.GUI.Properties { - - - // This class allows you to handle specific events on the settings class: - // The SettingChanging event is raised before a setting's value is changed. - // The PropertyChanged event is raised after a setting's value is changed. - // The SettingsLoaded event is raised after the setting values are loaded. - // The SettingsSaving event is raised before the setting values are saved. - internal sealed partial class Settings { - - public Settings() { - // // To add event handlers for saving and changing settings, uncomment the lines below: - // - // this.SettingChanging += this.SettingChangingEventHandler; - // - // this.SettingsSaving += this.SettingsSavingEventHandler; - // - this.SettingsLoaded += OnSettingsLoadedHandler; - } - - void OnSettingsLoadedHandler (object sender, System.Configuration.SettingsLoadedEventArgs e) - { - if (Settings.Default.UpgradeRequired) - { - Settings.Default.Upgrade(); - Settings.Default.UpgradeRequired = false; - Settings.Default.Save(); - } - - // do not restore in minimized state - if (Settings.Default.winState == System.Windows.WindowState.Minimized) - Settings.Default.winState = System.Windows.WindowState.Normal; - } - - private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { - // Add code to handle the SettingChangingEvent event here. - } - - private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { - // Add code to handle the SettingsSaving event here. - } - } -} +namespace GARbro.GUI.Properties { + + + // This class allows you to handle specific events on the settings class: + // The SettingChanging event is raised before a setting's value is changed. + // The PropertyChanged event is raised after a setting's value is changed. + // The SettingsLoaded event is raised after the setting values are loaded. + // The SettingsSaving event is raised before the setting values are saved. + internal sealed partial class Settings { + + public Settings() { + // // To add event handlers for saving and changing settings, uncomment the lines below: + // + // this.SettingChanging += this.SettingChangingEventHandler; + // + // this.SettingsSaving += this.SettingsSavingEventHandler; + // + this.SettingsLoaded += OnSettingsLoadedHandler; + } + + void OnSettingsLoadedHandler (object sender, System.Configuration.SettingsLoadedEventArgs e) + { + if (Settings.Default.UpgradeRequired) + { + Settings.Default.Upgrade(); + Settings.Default.UpgradeRequired = false; + Settings.Default.Save(); + } + + // do not restore in minimized state + if (Settings.Default.winState == System.Windows.WindowState.Minimized) + Settings.Default.winState = System.Windows.WindowState.Normal; + } + + private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { + // Add code to handle the SettingChangingEvent event here. + } + + private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { + // Add code to handle the SettingsSaving event here. + } + } +} diff --git a/Shell.cs b/GUI/Shell.cs similarity index 97% rename from Shell.cs rename to GUI/Shell.cs index b75598cc..0134b362 100644 --- a/Shell.cs +++ b/GUI/Shell.cs @@ -1,345 +1,345 @@ -//! \file Shell.cs -//! \date Tue Aug 02 13:48:55 2011 -//! \brief Win32 shell functions. -// -// Copyright (C) 2011 by poddav -// -// 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.IO; -using System.Text; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace GARbro.Shell -{ - /// - /// Wrapper around MoveFileEx WINAPI call. - /// - class File - { - [DllImport("kernel32.dll", EntryPoint="MoveFileExW", SetLastError=true, CharSet=CharSet.Unicode)] - public static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags); - - [Flags] - public enum MoveFileFlags : uint - { - ReplaceExisting = 0x00000001, - CopyAllowed = 0x00000002, - DelayUntilReboot = 0x00000004, - WriteThrough = 0x00000008, - CreateHardlink = 0x00000010, - FailIfNotTrackable = 0x00000020 - } - - public static bool Rename (string szFrom, string szTo) - { - return MoveFileEx (szFrom, szTo, MoveFileFlags.ReplaceExisting); - } - - public static int GetLastError () - { - return Marshal.GetLastWin32Error(); - } - - /// - /// Possible flags for the SHFileOperation method. - /// - [Flags] - public enum FileOperationFlags : ushort - { - /// - /// Do not show a dialog during the process - /// - FOF_SILENT = 0x0004, - /// - /// Do not ask the user to confirm selection - /// - FOF_NOCONFIRMATION = 0x0010, - /// - /// Delete the file to the recycle bin. (Required flag to send a file to the bin - /// - FOF_ALLOWUNDO = 0x0040, - /// - /// Do not show the names of the files or folders that are being recycled. - /// - FOF_SIMPLEPROGRESS = 0x0100, - /// - /// Surpress errors, if any occur during the process. - /// - FOF_NOERRORUI = 0x0400, - /// - /// Warn if files are too big to fit in the recycle bin and will need - /// to be deleted completely. - /// - FOF_WANTNUKEWARNING = 0x4000, - } - - /// - /// File Operation Function Type for SHFileOperation - /// - public enum FileOperationType : uint - { - /// - /// Move the objects - /// - FO_MOVE = 0x0001, - /// - /// Copy the objects - /// - FO_COPY = 0x0002, - /// - /// Delete (or recycle) the objects - /// - FO_DELETE = 0x0003, - /// - /// Rename the object(s) - /// - FO_RENAME = 0x0004, - } - - /// - /// SHFILEOPSTRUCT for SHFileOperation from COM - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)] - private struct SHFILEOPSTRUCT - { - - public IntPtr hwnd; - [MarshalAs(UnmanagedType.U4)] - public FileOperationType wFunc; - public string pFrom; - public string pTo; - public FileOperationFlags fFlags; - [MarshalAs(UnmanagedType.Bool)] - public bool fAnyOperationsAborted; - public IntPtr hNameMappings; - public string lpszProgressTitle; - } - - [DllImport("shell32.dll", CharSet = CharSet.Auto)] - private static extern int SHFileOperation (ref SHFILEOPSTRUCT FileOp); - - /// - /// Send file to recycle bin - /// - /// Location of directory or file to recycle - /// FileOperationFlags to add in addition to FOF_ALLOWUNDO - public static bool Delete (string path, FileOperationFlags flags) - { - var fs = new SHFILEOPSTRUCT - { - wFunc = FileOperationType.FO_DELETE, - pFrom = path + '\0' + '\0', - fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags - }; - return 0 == SHFileOperation (ref fs); - } - - public static bool Delete (IEnumerable file_list, FileOperationFlags flags) - { - var files = new StringBuilder(); - foreach (var file in file_list) - { - files.Append (file); - files.Append ('\0'); - } - if (0 == files.Length) - return false; - files.Append ('\0'); - var fs = new SHFILEOPSTRUCT - { - wFunc = FileOperationType.FO_DELETE, - pFrom = files.ToString(), - fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags - }; - return 0 == SHFileOperation (ref fs); - } - - public static bool Delete (IEnumerable file_list) - { - return Delete (file_list, FileOperationFlags.FOF_WANTNUKEWARNING); - } - - /// - /// Send file to recycle bin. Display dialog, display warning if files are too big to fit (FOF_WANTNUKEWARNING) - /// - /// Location of directory or file to recycle - public static bool Delete (string path) - { - return Delete (path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_WANTNUKEWARNING); - } - - /// - /// Send file silently to recycle bin. Surpress dialog, surpress errors, delete if too large. - /// - /// Location of directory or file to recycle - public static bool MoveToRecycleBin (string path) - { - return Delete (path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT); - - } - } - - public class TemporaryFile : IDisposable - { - private string m_name; - public string Name { get { return m_name; } } - - public TemporaryFile () - { - m_name = Path.GetRandomFileName(); - } - - public TemporaryFile (string filename) - { - m_name = filename; - } - - public TemporaryFile (string path, string filename) - { - m_name = Path.Combine (path, filename); - } - - #region IDisposable Members - bool disposed = false; - - public void Dispose () - { - Dispose (true); - GC.SuppressFinalize (this); - } - - protected virtual void Dispose (bool disposing) - { - if (!disposed) - { - if (disposing) - { - System.IO.File.Delete (m_name); - } - disposed = true; - } - } - #endregion - }; - - /// - /// Wrapper around SHGetFileInfo WINAPI call. - /// - class FileInfo - { - [DllImport("shell32.dll", CharSet=CharSet.Auto)] - public static extern IntPtr SHGetFileInfo( - string pszPath, Int32 dwFileAttributes, - ref SHFILEINFO psfi, int cbFileInfo, int uFlags); - - [DllImport("User32.dll")] - public static extern int DestroyIcon(IntPtr hIcon); - - [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] - public struct SHFILEINFO - { - public IntPtr hIcon; - public int iIcon; - public uint dwAttributes; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] - public string szDisplayName; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] - public string szTypeName; - - public SHFILEINFO(bool b) - { - hIcon = IntPtr.Zero; - iIcon = 0; - dwAttributes = 0; - szDisplayName = ""; - szTypeName = ""; - } - }; - - [Flags] - public enum SHGFI : uint - { - /// get icon - Icon = 0x000000100, - /// get display name - DisplayName = 0x000000200, - /// get type name - TypeName = 0x000000400, - /// get attributes - Attributes = 0x000000800, - /// get icon location - IconLocation = 0x000001000, - /// return exe type - ExeType = 0x000002000, - /// get system icon index - SysIconIndex = 0x000004000, - /// put a link overlay on icon - LinkOverlay = 0x000008000, - /// show icon in selected state - Selected = 0x000010000, - /// get only specified attributes - Attr_Specified = 0x000020000, - /// get large icon - LargeIcon = 0x000000000, - /// get small icon - SmallIcon = 0x000000001, - /// get open icon - OpenIcon = 0x000000002, - /// get shell size icon - ShellIconSize = 0x000000004, - /// pszPath is a pidl - PIDL = 0x000000008, - /// use passed dwFileAttribute - UseFileAttributes= 0x000000010, - /// apply the appropriate overlays - AddOverlays = 0x000000020, - /// Get the index of the overlay in the upper 8 bits of the iIcon - OverlayIndex = 0x000000040, - } - - public static string GetTypeName (string filename) - { - SHFILEINFO info = new SHFILEINFO(true); - int szInfo = Marshal.SizeOf (info); - int result = (int)SHGetFileInfo (filename, 0, ref info, szInfo, (int)SHGFI.TypeName); - - // If uFlags does not contain SHGFI_EXETYPE or SHGFI_SYSICONINDEX, - // the return value is nonzero if successful, or zero otherwise. - if (result != 0) - return info.szTypeName; - else - return string.Empty; - } - - public static SHFILEINFO? GetInfo (string filename, SHGFI flags) - { - SHFILEINFO info = new SHFILEINFO(true); - int szInfo = Marshal.SizeOf (info); - int result = (int)SHGetFileInfo (filename, 0, ref info, szInfo, (int)flags); - - return result != 0? new Nullable (info): null; - } - } -} +//! \file Shell.cs +//! \date Tue Aug 02 13:48:55 2011 +//! \brief Win32 shell functions. +// +// Copyright (C) 2011 by poddav +// +// 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.IO; +using System.Text; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace GARbro.Shell +{ + /// + /// Wrapper around MoveFileEx WINAPI call. + /// + class File + { + [DllImport("kernel32.dll", EntryPoint="MoveFileExW", SetLastError=true, CharSet=CharSet.Unicode)] + public static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags); + + [Flags] + public enum MoveFileFlags : uint + { + ReplaceExisting = 0x00000001, + CopyAllowed = 0x00000002, + DelayUntilReboot = 0x00000004, + WriteThrough = 0x00000008, + CreateHardlink = 0x00000010, + FailIfNotTrackable = 0x00000020 + } + + public static bool Rename (string szFrom, string szTo) + { + return MoveFileEx (szFrom, szTo, MoveFileFlags.ReplaceExisting); + } + + public static int GetLastError () + { + return Marshal.GetLastWin32Error(); + } + + /// + /// Possible flags for the SHFileOperation method. + /// + [Flags] + public enum FileOperationFlags : ushort + { + /// + /// Do not show a dialog during the process + /// + FOF_SILENT = 0x0004, + /// + /// Do not ask the user to confirm selection + /// + FOF_NOCONFIRMATION = 0x0010, + /// + /// Delete the file to the recycle bin. (Required flag to send a file to the bin + /// + FOF_ALLOWUNDO = 0x0040, + /// + /// Do not show the names of the files or folders that are being recycled. + /// + FOF_SIMPLEPROGRESS = 0x0100, + /// + /// Surpress errors, if any occur during the process. + /// + FOF_NOERRORUI = 0x0400, + /// + /// Warn if files are too big to fit in the recycle bin and will need + /// to be deleted completely. + /// + FOF_WANTNUKEWARNING = 0x4000, + } + + /// + /// File Operation Function Type for SHFileOperation + /// + public enum FileOperationType : uint + { + /// + /// Move the objects + /// + FO_MOVE = 0x0001, + /// + /// Copy the objects + /// + FO_COPY = 0x0002, + /// + /// Delete (or recycle) the objects + /// + FO_DELETE = 0x0003, + /// + /// Rename the object(s) + /// + FO_RENAME = 0x0004, + } + + /// + /// SHFILEOPSTRUCT for SHFileOperation from COM + /// + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)] + private struct SHFILEOPSTRUCT + { + + public IntPtr hwnd; + [MarshalAs(UnmanagedType.U4)] + public FileOperationType wFunc; + public string pFrom; + public string pTo; + public FileOperationFlags fFlags; + [MarshalAs(UnmanagedType.Bool)] + public bool fAnyOperationsAborted; + public IntPtr hNameMappings; + public string lpszProgressTitle; + } + + [DllImport("shell32.dll", CharSet = CharSet.Auto)] + private static extern int SHFileOperation (ref SHFILEOPSTRUCT FileOp); + + /// + /// Send file to recycle bin + /// + /// Location of directory or file to recycle + /// FileOperationFlags to add in addition to FOF_ALLOWUNDO + public static bool Delete (string path, FileOperationFlags flags) + { + var fs = new SHFILEOPSTRUCT + { + wFunc = FileOperationType.FO_DELETE, + pFrom = path + '\0' + '\0', + fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags + }; + return 0 == SHFileOperation (ref fs); + } + + public static bool Delete (IEnumerable file_list, FileOperationFlags flags) + { + var files = new StringBuilder(); + foreach (var file in file_list) + { + files.Append (file); + files.Append ('\0'); + } + if (0 == files.Length) + return false; + files.Append ('\0'); + var fs = new SHFILEOPSTRUCT + { + wFunc = FileOperationType.FO_DELETE, + pFrom = files.ToString(), + fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags + }; + return 0 == SHFileOperation (ref fs); + } + + public static bool Delete (IEnumerable file_list) + { + return Delete (file_list, FileOperationFlags.FOF_WANTNUKEWARNING); + } + + /// + /// Send file to recycle bin. Display dialog, display warning if files are too big to fit (FOF_WANTNUKEWARNING) + /// + /// Location of directory or file to recycle + public static bool Delete (string path) + { + return Delete (path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_WANTNUKEWARNING); + } + + /// + /// Send file silently to recycle bin. Surpress dialog, surpress errors, delete if too large. + /// + /// Location of directory or file to recycle + public static bool MoveToRecycleBin (string path) + { + return Delete (path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT); + + } + } + + public class TemporaryFile : IDisposable + { + private string m_name; + public string Name { get { return m_name; } } + + public TemporaryFile () + { + m_name = Path.GetRandomFileName(); + } + + public TemporaryFile (string filename) + { + m_name = filename; + } + + public TemporaryFile (string path, string filename) + { + m_name = Path.Combine (path, filename); + } + + #region IDisposable Members + bool disposed = false; + + public void Dispose () + { + Dispose (true); + GC.SuppressFinalize (this); + } + + protected virtual void Dispose (bool disposing) + { + if (!disposed) + { + if (disposing) + { + System.IO.File.Delete (m_name); + } + disposed = true; + } + } + #endregion + }; + + /// + /// Wrapper around SHGetFileInfo WINAPI call. + /// + class FileInfo + { + [DllImport("shell32.dll", CharSet=CharSet.Auto)] + public static extern IntPtr SHGetFileInfo( + string pszPath, Int32 dwFileAttributes, + ref SHFILEINFO psfi, int cbFileInfo, int uFlags); + + [DllImport("User32.dll")] + public static extern int DestroyIcon(IntPtr hIcon); + + [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] + public struct SHFILEINFO + { + public IntPtr hIcon; + public int iIcon; + public uint dwAttributes; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string szDisplayName; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string szTypeName; + + public SHFILEINFO(bool b) + { + hIcon = IntPtr.Zero; + iIcon = 0; + dwAttributes = 0; + szDisplayName = ""; + szTypeName = ""; + } + }; + + [Flags] + public enum SHGFI : uint + { + /// get icon + Icon = 0x000000100, + /// get display name + DisplayName = 0x000000200, + /// get type name + TypeName = 0x000000400, + /// get attributes + Attributes = 0x000000800, + /// get icon location + IconLocation = 0x000001000, + /// return exe type + ExeType = 0x000002000, + /// get system icon index + SysIconIndex = 0x000004000, + /// put a link overlay on icon + LinkOverlay = 0x000008000, + /// show icon in selected state + Selected = 0x000010000, + /// get only specified attributes + Attr_Specified = 0x000020000, + /// get large icon + LargeIcon = 0x000000000, + /// get small icon + SmallIcon = 0x000000001, + /// get open icon + OpenIcon = 0x000000002, + /// get shell size icon + ShellIconSize = 0x000000004, + /// pszPath is a pidl + PIDL = 0x000000008, + /// use passed dwFileAttribute + UseFileAttributes= 0x000000010, + /// apply the appropriate overlays + AddOverlays = 0x000000020, + /// Get the index of the overlay in the upper 8 bits of the iIcon + OverlayIndex = 0x000000040, + } + + public static string GetTypeName (string filename) + { + SHFILEINFO info = new SHFILEINFO(true); + int szInfo = Marshal.SizeOf (info); + int result = (int)SHGetFileInfo (filename, 0, ref info, szInfo, (int)SHGFI.TypeName); + + // If uFlags does not contain SHGFI_EXETYPE or SHGFI_SYSICONINDEX, + // the return value is nonzero if successful, or zero otherwise. + if (result != 0) + return info.szTypeName; + else + return string.Empty; + } + + public static SHFILEINFO? GetInfo (string filename, SHGFI flags) + { + SHFILEINFO info = new SHFILEINFO(true); + int szInfo = Marshal.SizeOf (info); + int result = (int)SHGetFileInfo (filename, 0, ref info, szInfo, (int)flags); + + return result != 0? new Nullable (info): null; + } + } +} diff --git a/Strings/guiStrings.Designer.cs b/GUI/Strings/guiStrings.Designer.cs similarity index 97% rename from Strings/guiStrings.Designer.cs rename to GUI/Strings/guiStrings.Designer.cs index ae8586f9..b2955d1f 100644 --- a/Strings/guiStrings.Designer.cs +++ b/GUI/Strings/guiStrings.Designer.cs @@ -1,1049 +1,1049 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34209 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace GARbro.GUI.Strings { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class guiStrings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal guiStrings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GARbro.GUI.Strings.guiStrings", typeof(guiStrings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Cancel. - /// - public static string ButtonCancel { - get { - return ResourceManager.GetString("ButtonCancel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Convert. - /// - public static string ButtonConvert { - get { - return ResourceManager.GetString("ButtonConvert", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract. - /// - public static string ButtonExtract { - get { - return ResourceManager.GetString("ButtonExtract", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to OK. - /// - public static string ButtonOK { - get { - return ResourceManager.GetString("ButtonOK", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _Close. - /// - public static string CtxMenuClose { - get { - return ResourceManager.GetString("CtxMenuClose", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Convert multimedia.... - /// - public static string CtxMenuConvert { - get { - return ResourceManager.GetString("CtxMenuConvert", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Copy. - /// - public static string CtxMenuCopy { - get { - return ResourceManager.GetString("CtxMenuCopy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Create archive.... - /// - public static string CtxMenuCreate { - get { - return ResourceManager.GetString("CtxMenuCreate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cut. - /// - public static string CtxMenuCut { - get { - return ResourceManager.GetString("CtxMenuCut", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _Delete. - /// - public static string CtxMenuDelete { - get { - return ResourceManager.GetString("CtxMenuDelete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Browse in _Explorer. - /// - public static string CtxMenuExplorer { - get { - return ResourceManager.GetString("CtxMenuExplorer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract. - /// - public static string CtxMenuExtract { - get { - return ResourceManager.GetString("CtxMenuExtract", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Assign file type. - /// - public static string CtxMenuFileType { - get { - return ResourceManager.GetString("CtxMenuFileType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Open. - /// - public static string CtxMenuOpen { - get { - return ResourceManager.GetString("CtxMenuOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Paste. - /// - public static string CtxMenuPaste { - get { - return ResourceManager.GetString("CtxMenuPaste", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Refresh. - /// - public static string CtxMenuRefresh { - get { - return ResourceManager.GetString("CtxMenuRefresh", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _Rename. - /// - public static string CtxMenuRename { - get { - return ResourceManager.GetString("CtxMenuRename", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sort by. - /// - public static string CtxMenuSortBy { - get { - return ResourceManager.GetString("CtxMenuSortBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name. - /// - public static string CtxMenuSortByName { - get { - return ResourceManager.GetString("CtxMenuSortByName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Size. - /// - public static string CtxMenuSortBySize { - get { - return ResourceManager.GetString("CtxMenuSortBySize", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type. - /// - public static string CtxMenuSortByType { - get { - return ResourceManager.GetString("CtxMenuSortByType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unsorted. - /// - public static string CtxMenuUnsorted { - get { - return ResourceManager.GetString("CtxMenuUnsorted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name. - /// - public static string HeaderName { - get { - return ResourceManager.GetString("HeaderName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Size. - /// - public static string HeaderSize { - get { - return ResourceManager.GetString("HeaderSize", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type. - /// - public static string HeaderType { - get { - return ResourceManager.GetString("HeaderType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Archive format. - /// - public static string LabelArchiveFormat { - get { - return ResourceManager.GetString("LabelArchiveFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Archive name. - /// - public static string LabelArchiveName { - get { - return ResourceManager.GetString("LabelArchiveName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Archive options. - /// - public static string LabelArchiveOptions { - get { - return ResourceManager.GetString("LabelArchiveOptions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Choose destination format for images. - /// - public static string LabelDestinationFormat { - get { - return ResourceManager.GetString("LabelDestinationFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Encoding. - /// - public static string LabelEncoding { - get { - return ResourceManager.GetString("LabelEncoding", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enter wildcard mask. - /// - public static string LabelEnterMask { - get { - return ResourceManager.GetString("LabelEnterMask", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract files from {0} to. - /// - public static string LabelExtractAllTo { - get { - return ResourceManager.GetString("LabelExtractAllTo", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract {0} to. - /// - public static string LabelExtractFileTo { - get { - return ResourceManager.GetString("LabelExtractFileTo", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Skip incovertible files.. - /// - public static string LabelSkipFailures { - get { - return ResourceManager.GetString("LabelSkipFailures", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to About Game Resource browser. - /// - public static string MenuAbout { - get { - return ResourceManager.GetString("MenuAbout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to E_xit. - /// - public static string MenuExit { - get { - return ResourceManager.GetString("MenuExit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _File. - /// - public static string MenuFile { - get { - return ResourceManager.GetString("MenuFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fit preview _window to image. - /// - public static string MenuFitWindow { - get { - return ResourceManager.GetString("MenuFitWindow", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _Help. - /// - public static string MenuHelp { - get { - return ResourceManager.GetString("MenuHelp", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Open.... - /// - public static string MenuOpen { - get { - return ResourceManager.GetString("MenuOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Recent files. - /// - public static string MenuRecent { - get { - return ResourceManager.GetString("MenuRecent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show/hide main _menu bar. - /// - public static string MenuToggleMenuBar { - get { - return ResourceManager.GetString("MenuToggleMenuBar", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show/hide _status bar. - /// - public static string MenuToggleStatusBar { - get { - return ResourceManager.GetString("MenuToggleStatusBar", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show/hide _toolbar. - /// - public static string MenuToggleToolBar { - get { - return ResourceManager.GetString("MenuToggleToolBar", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _View. - /// - public static string MenuView { - get { - return ResourceManager.GetString("MenuView", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Choose files to extract. - /// - public static string MsgChooseFiles { - get { - return ResourceManager.GetString("MsgChooseFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Are you sure you want to delete these files?. - /// - public static string MsgConfirmDeleteFiles { - get { - return ResourceManager.GetString("MsgConfirmDeleteFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Converting file {0}. - /// - public static string MsgConvertingFile { - get { - return ResourceManager.GetString("MsgConvertingFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Creating archive {0}. - /// - public static string MsgCreatingArchive { - get { - return ResourceManager.GetString("MsgCreatingArchive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Deleted {0}. - /// - public static string MsgDeletedItem { - get { - return ResourceManager.GetString("MsgDeletedItem", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Deleted {0} file. - /// - public static string MsgDeletedItems1 { - get { - return ResourceManager.GetString("MsgDeletedItems1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Deleted {0} files. - /// - public static string MsgDeletedItems2 { - get { - return ResourceManager.GetString("MsgDeletedItems2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to directory not found. - /// - public static string MsgDirectoryNotFound { - get { - return ResourceManager.GetString("MsgDirectoryNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to archive is empty. - /// - public static string MsgEmptyArchive { - get { - return ResourceManager.GetString("MsgEmptyArchive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error extracting file. - /// - public static string MsgErrorExtracting { - get { - return ResourceManager.GetString("MsgErrorExtracting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error opening file. - /// - public static string MsgErrorOpening { - get { - return ResourceManager.GetString("MsgErrorOpening", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted {0} into {1}. - /// - public static string MsgExtractComplete { - get { - return ResourceManager.GetString("MsgExtractComplete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted {0} file. - /// - public static string MsgExtractedFiles1 { - get { - return ResourceManager.GetString("MsgExtractedFiles1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted {0} files. - /// - public static string MsgExtractedFiles2 { - get { - return ResourceManager.GetString("MsgExtractedFiles2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracting files from {0}. - /// - public static string MsgExtractingArchive { - get { - return ResourceManager.GetString("MsgExtractingArchive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracting file from {0}. - /// - public static string MsgExtractingFile { - get { - return ResourceManager.GetString("MsgExtractingFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracting files from {0} to {1}. - /// - public static string MsgExtractingTo { - get { - return ResourceManager.GetString("MsgExtractingTo", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} file. - /// - public static string MsgFiles1 { - get { - return ResourceManager.GetString("MsgFiles1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} files. - /// - public static string MsgFiles2 { - get { - return ResourceManager.GetString("MsgFiles2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Image {0} x {1} x {2}bpp. - /// - public static string MsgImageSize { - get { - return ResourceManager.GetString("MsgImageSize", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to no files to extract. - /// - public static string MsgNoFiles { - get { - return ResourceManager.GetString("MsgNoFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No entries matching "{0}". - /// - public static string MsgNoMatching { - get { - return ResourceManager.GetString("MsgNoMatching", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No media files selected.. - /// - public static string MsgNoMediaFiles { - get { - return ResourceManager.GetString("MsgNoMediaFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to File {0} - ///already exists. - /// - ///Overwrite?. - /// - public static string MsgOverwrite { - get { - return ResourceManager.GetString("MsgOverwrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ready. - /// - public static string MsgReady { - get { - return ResourceManager.GetString("MsgReady", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} file added to selection. - /// - public static string MsgSelectedFiles1 { - get { - return ResourceManager.GetString("MsgSelectedFiles1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} files added to selection. - /// - public static string MsgSelectedFiles2 { - get { - return ResourceManager.GetString("MsgSelectedFiles2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to unable to interpret audio format. - /// - public static string MsgUnableInterpretAudio { - get { - return ResourceManager.GetString("MsgUnableInterpretAudio", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to unable to interpret image format. - /// - public static string MsgUnableInterpretImage { - get { - return ResourceManager.GetString("MsgUnableInterpretImage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version {0}. - /// - public static string MsgVersion { - get { - return ResourceManager.GetString("MsgVersion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Archives. - /// - public static string TextAboutArchives { - get { - return ResourceManager.GetString("TextAboutArchives", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Audio. - /// - public static string TextAboutAudio { - get { - return ResourceManager.GetString("TextAboutAudio", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [builtin]. - /// - public static string TextAboutBuiltin { - get { - return ResourceManager.GetString("TextAboutBuiltin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Images. - /// - public static string TextAboutImages { - get { - return ResourceManager.GetString("TextAboutImages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to License. - /// - public static string TextAboutLicense { - get { - return ResourceManager.GetString("TextAboutLicense", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to About Game Resource browser. - /// - public static string TextAboutTitle { - get { - return ResourceManager.GetString("TextAboutTitle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to All Files. - /// - public static string TextAllFiles { - get { - return ResourceManager.GetString("TextAllFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to as is. - /// - public static string TextAsIs { - get { - return ResourceManager.GetString("TextAsIs", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Audio will be converted to either WAV, MP3 or OGG.. - /// - public static string TextAudioConversion { - get { - return ResourceManager.GetString("TextAudioConversion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Choose archive location. - /// - public static string TextChooseArchive { - get { - return ResourceManager.GetString("TextChooseArchive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Choose destination directory. - /// - public static string TextChooseDestDir { - get { - return ResourceManager.GetString("TextChooseDestDir", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Confirm overwrite. - /// - public static string TextConfirmOverwrite { - get { - return ResourceManager.GetString("TextConfirmOverwrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Convert audio to common format. - /// - public static string TextConvertAudio { - get { - return ResourceManager.GetString("TextConvertAudio", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Media conversion. - /// - public static string TextConvertMedia { - get { - return ResourceManager.GetString("TextConvertMedia", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Create archive. - /// - public static string TextCreateArchive { - get { - return ResourceManager.GetString("TextCreateArchive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Archive creation error. - /// - public static string TextCreateArchiveError { - get { - return ResourceManager.GetString("TextCreateArchiveError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Delete files. - /// - public static string TextDeleteFiles { - get { - return ResourceManager.GetString("TextDeleteFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Text encoding. - /// - public static string TextEncoding { - get { - return ResourceManager.GetString("TextEncoding", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error occured while extracting file - ///{0} - ///{1}. - /// - public static string TextErrorExtracting { - get { - return ResourceManager.GetString("TextErrorExtracting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract audio. - /// - public static string TextExtractAudio { - get { - return ResourceManager.GetString("TextExtractAudio", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract images. - /// - public static string TextExtractImages { - get { - return ResourceManager.GetString("TextExtractImages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract text. - /// - public static string TextExtractText { - get { - return ResourceManager.GetString("TextExtractText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extract from archive. - /// - public static string TextExtractTitle { - get { - return ResourceManager.GetString("TextExtractTitle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multimedia conversion error. - /// - public static string TextMediaConvertError { - get { - return ResourceManager.GetString("TextMediaConvertError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Archive parameters. - /// - public static string TextParametersTitle { - get { - return ResourceManager.GetString("TextParametersTitle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Save as. - /// - public static string TextSaveAs { - get { - return ResourceManager.GetString("TextSaveAs", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Save images as. - /// - public static string TextSaveImagesAs { - get { - return ResourceManager.GetString("TextSaveImagesAs", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Select files. - /// - public static string TextSelectFiles { - get { - return ResourceManager.GetString("TextSelectFiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Game Resource browser. - /// - public static string TextTitle { - get { - return ResourceManager.GetString("TextTitle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Either WAV, MP3 or OGG. - /// - public static string TooltipAudioFormats { - get { - return ResourceManager.GetString("TooltipAudioFormats", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Back. - /// - public static string TooltipBack { - get { - return ResourceManager.GetString("TooltipBack", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Forward. - /// - public static string TooltipForward { - get { - return ResourceManager.GetString("TooltipForward", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to <DIR>. - /// - public static string Type_directory { - get { - return ResourceManager.GetString("Type_directory", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to none. - /// - public static string Type_NONE { - get { - return ResourceManager.GetString("Type_NONE", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GARbro.GUI.Strings { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class guiStrings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal guiStrings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GARbro.GUI.Strings.guiStrings", typeof(guiStrings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string ButtonCancel { + get { + return ResourceManager.GetString("ButtonCancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Convert. + /// + public static string ButtonConvert { + get { + return ResourceManager.GetString("ButtonConvert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract. + /// + public static string ButtonExtract { + get { + return ResourceManager.GetString("ButtonExtract", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + public static string ButtonOK { + get { + return ResourceManager.GetString("ButtonOK", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Close. + /// + public static string CtxMenuClose { + get { + return ResourceManager.GetString("CtxMenuClose", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Convert multimedia.... + /// + public static string CtxMenuConvert { + get { + return ResourceManager.GetString("CtxMenuConvert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy. + /// + public static string CtxMenuCopy { + get { + return ResourceManager.GetString("CtxMenuCopy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create archive.... + /// + public static string CtxMenuCreate { + get { + return ResourceManager.GetString("CtxMenuCreate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cut. + /// + public static string CtxMenuCut { + get { + return ResourceManager.GetString("CtxMenuCut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Delete. + /// + public static string CtxMenuDelete { + get { + return ResourceManager.GetString("CtxMenuDelete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Browse in _Explorer. + /// + public static string CtxMenuExplorer { + get { + return ResourceManager.GetString("CtxMenuExplorer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract. + /// + public static string CtxMenuExtract { + get { + return ResourceManager.GetString("CtxMenuExtract", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Assign file type. + /// + public static string CtxMenuFileType { + get { + return ResourceManager.GetString("CtxMenuFileType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open. + /// + public static string CtxMenuOpen { + get { + return ResourceManager.GetString("CtxMenuOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paste. + /// + public static string CtxMenuPaste { + get { + return ResourceManager.GetString("CtxMenuPaste", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh. + /// + public static string CtxMenuRefresh { + get { + return ResourceManager.GetString("CtxMenuRefresh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Rename. + /// + public static string CtxMenuRename { + get { + return ResourceManager.GetString("CtxMenuRename", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sort by. + /// + public static string CtxMenuSortBy { + get { + return ResourceManager.GetString("CtxMenuSortBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string CtxMenuSortByName { + get { + return ResourceManager.GetString("CtxMenuSortByName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Size. + /// + public static string CtxMenuSortBySize { + get { + return ResourceManager.GetString("CtxMenuSortBySize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + public static string CtxMenuSortByType { + get { + return ResourceManager.GetString("CtxMenuSortByType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsorted. + /// + public static string CtxMenuUnsorted { + get { + return ResourceManager.GetString("CtxMenuUnsorted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string HeaderName { + get { + return ResourceManager.GetString("HeaderName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Size. + /// + public static string HeaderSize { + get { + return ResourceManager.GetString("HeaderSize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + public static string HeaderType { + get { + return ResourceManager.GetString("HeaderType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archive format. + /// + public static string LabelArchiveFormat { + get { + return ResourceManager.GetString("LabelArchiveFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archive name. + /// + public static string LabelArchiveName { + get { + return ResourceManager.GetString("LabelArchiveName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archive options. + /// + public static string LabelArchiveOptions { + get { + return ResourceManager.GetString("LabelArchiveOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose destination format for images. + /// + public static string LabelDestinationFormat { + get { + return ResourceManager.GetString("LabelDestinationFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Encoding. + /// + public static string LabelEncoding { + get { + return ResourceManager.GetString("LabelEncoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter wildcard mask. + /// + public static string LabelEnterMask { + get { + return ResourceManager.GetString("LabelEnterMask", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract files from {0} to. + /// + public static string LabelExtractAllTo { + get { + return ResourceManager.GetString("LabelExtractAllTo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract {0} to. + /// + public static string LabelExtractFileTo { + get { + return ResourceManager.GetString("LabelExtractFileTo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skip incovertible files.. + /// + public static string LabelSkipFailures { + get { + return ResourceManager.GetString("LabelSkipFailures", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About Game Resource browser. + /// + public static string MenuAbout { + get { + return ResourceManager.GetString("MenuAbout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to E_xit. + /// + public static string MenuExit { + get { + return ResourceManager.GetString("MenuExit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _File. + /// + public static string MenuFile { + get { + return ResourceManager.GetString("MenuFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fit preview _window to image. + /// + public static string MenuFitWindow { + get { + return ResourceManager.GetString("MenuFitWindow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Help. + /// + public static string MenuHelp { + get { + return ResourceManager.GetString("MenuHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open.... + /// + public static string MenuOpen { + get { + return ResourceManager.GetString("MenuOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recent files. + /// + public static string MenuRecent { + get { + return ResourceManager.GetString("MenuRecent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show/hide main _menu bar. + /// + public static string MenuToggleMenuBar { + get { + return ResourceManager.GetString("MenuToggleMenuBar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show/hide _status bar. + /// + public static string MenuToggleStatusBar { + get { + return ResourceManager.GetString("MenuToggleStatusBar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show/hide _toolbar. + /// + public static string MenuToggleToolBar { + get { + return ResourceManager.GetString("MenuToggleToolBar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _View. + /// + public static string MenuView { + get { + return ResourceManager.GetString("MenuView", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose files to extract. + /// + public static string MsgChooseFiles { + get { + return ResourceManager.GetString("MsgChooseFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to delete these files?. + /// + public static string MsgConfirmDeleteFiles { + get { + return ResourceManager.GetString("MsgConfirmDeleteFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Converting file {0}. + /// + public static string MsgConvertingFile { + get { + return ResourceManager.GetString("MsgConvertingFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Creating archive {0}. + /// + public static string MsgCreatingArchive { + get { + return ResourceManager.GetString("MsgCreatingArchive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deleted {0}. + /// + public static string MsgDeletedItem { + get { + return ResourceManager.GetString("MsgDeletedItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deleted {0} file. + /// + public static string MsgDeletedItems1 { + get { + return ResourceManager.GetString("MsgDeletedItems1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deleted {0} files. + /// + public static string MsgDeletedItems2 { + get { + return ResourceManager.GetString("MsgDeletedItems2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to directory not found. + /// + public static string MsgDirectoryNotFound { + get { + return ResourceManager.GetString("MsgDirectoryNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to archive is empty. + /// + public static string MsgEmptyArchive { + get { + return ResourceManager.GetString("MsgEmptyArchive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error extracting file. + /// + public static string MsgErrorExtracting { + get { + return ResourceManager.GetString("MsgErrorExtracting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error opening file. + /// + public static string MsgErrorOpening { + get { + return ResourceManager.GetString("MsgErrorOpening", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted {0} into {1}. + /// + public static string MsgExtractComplete { + get { + return ResourceManager.GetString("MsgExtractComplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted {0} file. + /// + public static string MsgExtractedFiles1 { + get { + return ResourceManager.GetString("MsgExtractedFiles1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted {0} files. + /// + public static string MsgExtractedFiles2 { + get { + return ResourceManager.GetString("MsgExtractedFiles2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracting files from {0}. + /// + public static string MsgExtractingArchive { + get { + return ResourceManager.GetString("MsgExtractingArchive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracting file from {0}. + /// + public static string MsgExtractingFile { + get { + return ResourceManager.GetString("MsgExtractingFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracting files from {0} to {1}. + /// + public static string MsgExtractingTo { + get { + return ResourceManager.GetString("MsgExtractingTo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} file. + /// + public static string MsgFiles1 { + get { + return ResourceManager.GetString("MsgFiles1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} files. + /// + public static string MsgFiles2 { + get { + return ResourceManager.GetString("MsgFiles2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Image {0} x {1} x {2}bpp. + /// + public static string MsgImageSize { + get { + return ResourceManager.GetString("MsgImageSize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to no files to extract. + /// + public static string MsgNoFiles { + get { + return ResourceManager.GetString("MsgNoFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No entries matching "{0}". + /// + public static string MsgNoMatching { + get { + return ResourceManager.GetString("MsgNoMatching", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No media files selected.. + /// + public static string MsgNoMediaFiles { + get { + return ResourceManager.GetString("MsgNoMediaFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File {0} + ///already exists. + /// + ///Overwrite?. + /// + public static string MsgOverwrite { + get { + return ResourceManager.GetString("MsgOverwrite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready. + /// + public static string MsgReady { + get { + return ResourceManager.GetString("MsgReady", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} file added to selection. + /// + public static string MsgSelectedFiles1 { + get { + return ResourceManager.GetString("MsgSelectedFiles1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} files added to selection. + /// + public static string MsgSelectedFiles2 { + get { + return ResourceManager.GetString("MsgSelectedFiles2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unable to interpret audio format. + /// + public static string MsgUnableInterpretAudio { + get { + return ResourceManager.GetString("MsgUnableInterpretAudio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unable to interpret image format. + /// + public static string MsgUnableInterpretImage { + get { + return ResourceManager.GetString("MsgUnableInterpretImage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version {0}. + /// + public static string MsgVersion { + get { + return ResourceManager.GetString("MsgVersion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archives. + /// + public static string TextAboutArchives { + get { + return ResourceManager.GetString("TextAboutArchives", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Audio. + /// + public static string TextAboutAudio { + get { + return ResourceManager.GetString("TextAboutAudio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [builtin]. + /// + public static string TextAboutBuiltin { + get { + return ResourceManager.GetString("TextAboutBuiltin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Images. + /// + public static string TextAboutImages { + get { + return ResourceManager.GetString("TextAboutImages", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to License. + /// + public static string TextAboutLicense { + get { + return ResourceManager.GetString("TextAboutLicense", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About Game Resource browser. + /// + public static string TextAboutTitle { + get { + return ResourceManager.GetString("TextAboutTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All Files. + /// + public static string TextAllFiles { + get { + return ResourceManager.GetString("TextAllFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to as is. + /// + public static string TextAsIs { + get { + return ResourceManager.GetString("TextAsIs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Audio will be converted to either WAV, MP3 or OGG.. + /// + public static string TextAudioConversion { + get { + return ResourceManager.GetString("TextAudioConversion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose archive location. + /// + public static string TextChooseArchive { + get { + return ResourceManager.GetString("TextChooseArchive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose destination directory. + /// + public static string TextChooseDestDir { + get { + return ResourceManager.GetString("TextChooseDestDir", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirm overwrite. + /// + public static string TextConfirmOverwrite { + get { + return ResourceManager.GetString("TextConfirmOverwrite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Convert audio to common format. + /// + public static string TextConvertAudio { + get { + return ResourceManager.GetString("TextConvertAudio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media conversion. + /// + public static string TextConvertMedia { + get { + return ResourceManager.GetString("TextConvertMedia", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create archive. + /// + public static string TextCreateArchive { + get { + return ResourceManager.GetString("TextCreateArchive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archive creation error. + /// + public static string TextCreateArchiveError { + get { + return ResourceManager.GetString("TextCreateArchiveError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete files. + /// + public static string TextDeleteFiles { + get { + return ResourceManager.GetString("TextDeleteFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text encoding. + /// + public static string TextEncoding { + get { + return ResourceManager.GetString("TextEncoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error occured while extracting file + ///{0} + ///{1}. + /// + public static string TextErrorExtracting { + get { + return ResourceManager.GetString("TextErrorExtracting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract audio. + /// + public static string TextExtractAudio { + get { + return ResourceManager.GetString("TextExtractAudio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract images. + /// + public static string TextExtractImages { + get { + return ResourceManager.GetString("TextExtractImages", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract text. + /// + public static string TextExtractText { + get { + return ResourceManager.GetString("TextExtractText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extract from archive. + /// + public static string TextExtractTitle { + get { + return ResourceManager.GetString("TextExtractTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multimedia conversion error. + /// + public static string TextMediaConvertError { + get { + return ResourceManager.GetString("TextMediaConvertError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archive parameters. + /// + public static string TextParametersTitle { + get { + return ResourceManager.GetString("TextParametersTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save as. + /// + public static string TextSaveAs { + get { + return ResourceManager.GetString("TextSaveAs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save images as. + /// + public static string TextSaveImagesAs { + get { + return ResourceManager.GetString("TextSaveImagesAs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select files. + /// + public static string TextSelectFiles { + get { + return ResourceManager.GetString("TextSelectFiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game Resource browser. + /// + public static string TextTitle { + get { + return ResourceManager.GetString("TextTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Either WAV, MP3 or OGG. + /// + public static string TooltipAudioFormats { + get { + return ResourceManager.GetString("TooltipAudioFormats", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Back. + /// + public static string TooltipBack { + get { + return ResourceManager.GetString("TooltipBack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Forward. + /// + public static string TooltipForward { + get { + return ResourceManager.GetString("TooltipForward", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <DIR>. + /// + public static string Type_directory { + get { + return ResourceManager.GetString("Type_directory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to none. + /// + public static string Type_NONE { + get { + return ResourceManager.GetString("Type_NONE", resourceCulture); + } + } + } +} diff --git a/Strings/guiStrings.ko-KR.resx b/GUI/Strings/guiStrings.ko-KR.resx similarity index 100% rename from Strings/guiStrings.ko-KR.resx rename to GUI/Strings/guiStrings.ko-KR.resx diff --git a/Strings/guiStrings.resx b/GUI/Strings/guiStrings.resx similarity index 97% rename from Strings/guiStrings.resx rename to GUI/Strings/guiStrings.resx index 9ed61ce3..270ee6ea 100644 --- a/Strings/guiStrings.resx +++ b/GUI/Strings/guiStrings.resx @@ -1,452 +1,452 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cancel - - - Extract - - - OK - - - _Close - - - Copy - - - Create archive... - - - Cut - - - _Delete - - - Browse in _Explorer - - - Extract - - - Open - - - Paste - - - Refresh - - - _Rename - - - Sort by - - - Name - - - Size - - - Type - - - Unsorted - - - Name - - - Size - - - Type - - - Archive format - - - Archive name - - - Archive options - - - Extract files from {0} to - - - Extract {0} to - - - About Game Resource browser - - - Deleted {0} - - - directory not found - - - archive is empty - - - Error extracting file - - - Error opening file - - - Extracted {0} into {1} - - - Extracted {0} file - - - Extracting files from {0} - - - Extracting file from {0} - - - Extracting files from {0} to {1} - - - Image {0} x {1} x {2}bpp - - - no files to extract - - - Ready - - - unable to interpret image format - - - Version {0} - - - [builtin] - - - Archives - - - Images - - - About Game Resource browser - - - All Files - - - as is - - - Choose archive location - - - Choose destination directory - - - Create archive - - - Archive creation error - - - <DIR> - - - Text encoding - - - Extract images - - - Extract text - - - Extract from archive - - - Archive parameters - - - Save as - - - Save images as - - - Game Resource browser - - - Back - - - Forward - - - File {0} -already exists. - -Overwrite? - - - Confirm overwrite - - - Creating archive {0} - - - Open... - - - Recent files - - - Choose files to extract - - - E_xit - - - _File - - - _Help - - - Extracted {0} files - - - {0} file - - - {0} files - - - Are you sure you want to delete these files? - - - Delete files - - - Deleted {0} file - - - Deleted {0} files - - - Fit preview _window to image - - - Show/hide main _menu bar - - - Show/hide _status bar - - - Show/hide _toolbar - - - _View - - - Convert multimedia... - - - Convert - - - Choose destination format for images - - - Media conversion - - - Converting file {0} - - - Multimedia conversion error - - - Encoding - - - Convert audio to common format - - - Extract audio - - - Either WAV, MP3 or OGG - - - Audio - - - License - - - unable to interpret audio format - - - No media files selected. - - - Audio will be converted to either WAV, MP3 or OGG. - - - Skip incovertible files. - - - No entries matching "{0}" - - - {0} file added to selection - - - {0} files added to selection - - - Enter wildcard mask - - - Select files - - - Error occured while extracting file -{0} -{1} - - - Assign file type - - - none - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancel + + + Extract + + + OK + + + _Close + + + Copy + + + Create archive... + + + Cut + + + _Delete + + + Browse in _Explorer + + + Extract + + + Open + + + Paste + + + Refresh + + + _Rename + + + Sort by + + + Name + + + Size + + + Type + + + Unsorted + + + Name + + + Size + + + Type + + + Archive format + + + Archive name + + + Archive options + + + Extract files from {0} to + + + Extract {0} to + + + About Game Resource browser + + + Deleted {0} + + + directory not found + + + archive is empty + + + Error extracting file + + + Error opening file + + + Extracted {0} into {1} + + + Extracted {0} file + + + Extracting files from {0} + + + Extracting file from {0} + + + Extracting files from {0} to {1} + + + Image {0} x {1} x {2}bpp + + + no files to extract + + + Ready + + + unable to interpret image format + + + Version {0} + + + [builtin] + + + Archives + + + Images + + + About Game Resource browser + + + All Files + + + as is + + + Choose archive location + + + Choose destination directory + + + Create archive + + + Archive creation error + + + <DIR> + + + Text encoding + + + Extract images + + + Extract text + + + Extract from archive + + + Archive parameters + + + Save as + + + Save images as + + + Game Resource browser + + + Back + + + Forward + + + File {0} +already exists. + +Overwrite? + + + Confirm overwrite + + + Creating archive {0} + + + Open... + + + Recent files + + + Choose files to extract + + + E_xit + + + _File + + + _Help + + + Extracted {0} files + + + {0} file + + + {0} files + + + Are you sure you want to delete these files? + + + Delete files + + + Deleted {0} file + + + Deleted {0} files + + + Fit preview _window to image + + + Show/hide main _menu bar + + + Show/hide _status bar + + + Show/hide _toolbar + + + _View + + + Convert multimedia... + + + Convert + + + Choose destination format for images + + + Media conversion + + + Converting file {0} + + + Multimedia conversion error + + + Encoding + + + Convert audio to common format + + + Extract audio + + + Either WAV, MP3 or OGG + + + Audio + + + License + + + unable to interpret audio format + + + No media files selected. + + + Audio will be converted to either WAV, MP3 or OGG. + + + Skip incovertible files. + + + No entries matching "{0}" + + + {0} file added to selection + + + {0} files added to selection + + + Enter wildcard mask + + + Select files + + + Error occured while extracting file +{0} +{1} + + + Assign file type + + + none + \ No newline at end of file diff --git a/Strings/guiStrings.ru-RU.resx b/GUI/Strings/guiStrings.ru-RU.resx similarity index 97% rename from Strings/guiStrings.ru-RU.resx rename to GUI/Strings/guiStrings.ru-RU.resx index 841efeb7..20682e3c 100644 --- a/Strings/guiStrings.ru-RU.resx +++ b/GUI/Strings/guiStrings.ru-RU.resx @@ -1,473 +1,473 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Отмена - - - Извлечь - - - _Закрыть - - - Копировать - - - Создать архив... - - - Вырезать - - - Удалить - - - Просмотр в Explorer - - - Извлечь - - - Открыть - - - Вставить - - - Обновить - - - Переименовать - - - Сортировка - - - по имени - - - по размеру - - - по типу - - - не сортировать - - - Имя - - - Размер - - - Тип - - - Формат архива - - - Имя архива - - - Настройки архивирования - - - Извлечь файлы из {0} в - - - Извлечь {0} в - - - О программе - - - Удалён файл {0} - - - каталог не найден - - - архив пуст - - - Ошибка извлечения файла - - - Ошибка открытия файла - - - {0} извлечён в {1} - - - Извлекаются файлы из {0} - - - Файл извлекается из {0} - - - Извлекаются файлы из {0} в {1} - - - Изображение {0} x {1} x {2}bpp - - - отсутствуют файлы, удовлетворяющие выбранным критериям - - - Готов - - - не удалось интерпретировать формат изображения - - - Версия {0} - - - [встроен] - - - Архивы - - - Изображения - - - Об обозревателе игровых ресурсов - - - Все файлы - - - исходном - - - Выберите месторасположение архива - - - Выберите место извлечения - - - Создать архив - - - Ошибка при создании архива - - - Кодировка текста - - - Извлекать изображения - - - Извлекать текст - - - Извлечь из архива - - - OK - - - Параметры архива - - - Сохранить в формате - - - Сохранить в формате - - - Обозреватель игровых ресурсов - - - Назад - - - Вперёд - - - Файл под именем '{0}' -уже существует. - -Перезаписать? - - - Подтвердите перезапись - - - Создание архива {0} - - - архив - - - изображение - - - сценарий - - - Открыть... - - - Недавние файлы - - - Выберите файлы для извлечения - - - Выход - - - _Файл - - - _Справка - - - Извлечён {0} файл - - - Извлечено {0} файла - - - Извлечено {0} файлов - - - {0} файл - - - {0} файла - - - {0} файлов - - - Вы действительно хотите удалить эти файлы? - - - Удалить файлы - - - Удалён {0} файл - - - Удалено {0} файла - - - Удалено {0} файлов - - - Подогнать размер окна под изображение - - - Вкл/выкл главное меню - - - Вкл/выкл полосу статуса - - - Вкл/выкл панель инструментов - - - Просмотр - - - Конверсия мультимедиа... - - - Преобразовать - - - Формат преобразования изображений - - - Преобразование мультимедиа - - - Преобразование файла {0} - - - Ошибка конверсии мультимедиа - - - Кодировка - - - Преобразовывать аудио в стандартный формат - - - Извлекать аудио - - - WAV, MP3, либо OGG - - - Аудио - - - Лицензия - - - звук - - - не удалось интерпретировать формат аудио - - - Пропускать файлы, не поддавшиеся конверсии. - - - Среди выбранных файлов нет мультимедиа. - - - Аудио-файлы будут преобразованы в WAV, MP3 или OGG. - - - Нет файлов, подходящих под маску "{0}" - - - {0} файл добавлен к выбранным - - - {0} файла добавлено к выбранным - - - {0} файлов добавлено к выбранным - - - Маска для имён файлов - - - Выбрать файлы - - - Произошёл сбой во время извлечения файла -{0} -{1} - - - Задать тип файла - - - без типа - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Отмена + + + Извлечь + + + _Закрыть + + + Копировать + + + Создать архив... + + + Вырезать + + + Удалить + + + Просмотр в Explorer + + + Извлечь + + + Открыть + + + Вставить + + + Обновить + + + Переименовать + + + Сортировка + + + по имени + + + по размеру + + + по типу + + + не сортировать + + + Имя + + + Размер + + + Тип + + + Формат архива + + + Имя архива + + + Настройки архивирования + + + Извлечь файлы из {0} в + + + Извлечь {0} в + + + О программе + + + Удалён файл {0} + + + каталог не найден + + + архив пуст + + + Ошибка извлечения файла + + + Ошибка открытия файла + + + {0} извлечён в {1} + + + Извлекаются файлы из {0} + + + Файл извлекается из {0} + + + Извлекаются файлы из {0} в {1} + + + Изображение {0} x {1} x {2}bpp + + + отсутствуют файлы, удовлетворяющие выбранным критериям + + + Готов + + + не удалось интерпретировать формат изображения + + + Версия {0} + + + [встроен] + + + Архивы + + + Изображения + + + Об обозревателе игровых ресурсов + + + Все файлы + + + исходном + + + Выберите месторасположение архива + + + Выберите место извлечения + + + Создать архив + + + Ошибка при создании архива + + + Кодировка текста + + + Извлекать изображения + + + Извлекать текст + + + Извлечь из архива + + + OK + + + Параметры архива + + + Сохранить в формате + + + Сохранить в формате + + + Обозреватель игровых ресурсов + + + Назад + + + Вперёд + + + Файл под именем '{0}' +уже существует. + +Перезаписать? + + + Подтвердите перезапись + + + Создание архива {0} + + + архив + + + изображение + + + сценарий + + + Открыть... + + + Недавние файлы + + + Выберите файлы для извлечения + + + Выход + + + _Файл + + + _Справка + + + Извлечён {0} файл + + + Извлечено {0} файла + + + Извлечено {0} файлов + + + {0} файл + + + {0} файла + + + {0} файлов + + + Вы действительно хотите удалить эти файлы? + + + Удалить файлы + + + Удалён {0} файл + + + Удалено {0} файла + + + Удалено {0} файлов + + + Подогнать размер окна под изображение + + + Вкл/выкл главное меню + + + Вкл/выкл полосу статуса + + + Вкл/выкл панель инструментов + + + Просмотр + + + Конверсия мультимедиа... + + + Преобразовать + + + Формат преобразования изображений + + + Преобразование мультимедиа + + + Преобразование файла {0} + + + Ошибка конверсии мультимедиа + + + Кодировка + + + Преобразовывать аудио в стандартный формат + + + Извлекать аудио + + + WAV, MP3, либо OGG + + + Аудио + + + Лицензия + + + звук + + + не удалось интерпретировать формат аудио + + + Пропускать файлы, не поддавшиеся конверсии. + + + Среди выбранных файлов нет мультимедиа. + + + Аудио-файлы будут преобразованы в WAV, MP3 или OGG. + + + Нет файлов, подходящих под маску "{0}" + + + {0} файл добавлен к выбранным + + + {0} файла добавлено к выбранным + + + {0} файлов добавлено к выбранным + + + Маска для имён файлов + + + Выбрать файлы + + + Произошёл сбой во время извлечения файла +{0} +{1} + + + Задать тип файла + + + без типа + \ No newline at end of file diff --git a/TextViewer.xaml b/GUI/TextViewer.xaml similarity index 100% rename from TextViewer.xaml rename to GUI/TextViewer.xaml diff --git a/TextViewer.xaml.cs b/GUI/TextViewer.xaml.cs similarity index 100% rename from TextViewer.xaml.cs rename to GUI/TextViewer.xaml.cs diff --git a/Utility.cs b/GUI/Utility.cs similarity index 97% rename from Utility.cs rename to GUI/Utility.cs index 18edbe2c..f289b480 100644 --- a/Utility.cs +++ b/GUI/Utility.cs @@ -1,151 +1,151 @@ -//! \file Utility.cs -//! \date Sun Jul 06 07:40:34 2014 -//! \brief utility classes. -// -// Copyright (C) 2014 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.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using System.Windows.Input; -using GARbro.GUI.Strings; - -namespace GARbro.GUI -{ - internal class NativeMethods - { - [DllImport ("shlwapi.dll", CharSet = CharSet.Unicode)] - internal static extern int StrCmpLogicalW (string psz1, string psz2); - - [DllImport ("gdi32.dll")] - internal static extern int GetDeviceCaps (IntPtr hDc, int nIndex); - - [DllImport ("user32.dll")] - internal static extern IntPtr GetDC (IntPtr hWnd); - - [DllImport ("user32.dll")] - internal static extern int ReleaseDC (IntPtr hWnd, IntPtr hDc); - } - - public static class Desktop - { - public static int DpiX { get { return dpi_x; } } - public static int DpiY { get { return dpi_y; } } - - public const int LOGPIXELSX = 88; - public const int LOGPIXELSY = 90; - - private static int dpi_x = GetCaps (LOGPIXELSX); - private static int dpi_y = GetCaps (LOGPIXELSY); - - public static int GetCaps (int cap) - { - IntPtr hdc = NativeMethods.GetDC (IntPtr.Zero); - if (hdc == IntPtr.Zero) - return 96; - int dpi = NativeMethods.GetDeviceCaps (hdc, cap); - NativeMethods.ReleaseDC (IntPtr.Zero, hdc); - return dpi; - } - } - - public sealed class NumericStringComparer : IComparer - { - public int Compare (string a, string b) - { - return NativeMethods.StrCmpLogicalW (a, b); - } - } - - public class WaitCursor : IDisposable - { - private Cursor m_previousCursor; - - public WaitCursor() - { - m_previousCursor = Mouse.OverrideCursor; - Mouse.OverrideCursor = Cursors.Wait; - } - - #region IDisposable Members - bool disposed = false; - public void Dispose() - { - Dispose (true); - GC.SuppressFinalize (this); - } - - protected virtual void Dispose (bool disposing) - { - if (!disposed) - { - Mouse.OverrideCursor = m_previousCursor; - disposed = true; - } - } - #endregion - } - - public static class Localization - { - public static string Plural (int n, string msg_id) - { - string suffix; - if (CultureInfo.CurrentUICulture.Name == "ru-RU") - { - suffix = (n%10==1 && n%100!=11 ? "1" : n%10>=2 && n% 10<=4 && (n%100<10 || n%100>=20) ? "2" : "3"); - } - else // assume en-EN - { - suffix = 1 == n ? "1" : "2"; - } - try - { - var res = guiStrings.ResourceManager.GetString (msg_id+suffix); - if (null == res) - { - Trace.WriteLine (string.Format ("Missing string resource for '{0}' token", msg_id+suffix)); - if (suffix != "1") - res = guiStrings.ResourceManager.GetString (msg_id+"1"); - if (null == res) - res = guiStrings.ResourceManager.GetString (msg_id); - } - return res ?? msg_id; - } - catch (Exception X) - { - Trace.WriteLine (X.Message, "Localization.Plural"); - return msg_id; - } - } - - public static string Format (string msg_id, int n) - { - return string.Format (Plural (n, msg_id), n); - } - - // Localization.Format ("{0:file:files} copied", count); -// public static string Format (string format, params object[] args); - } -} +//! \file Utility.cs +//! \date Sun Jul 06 07:40:34 2014 +//! \brief utility classes. +// +// Copyright (C) 2014 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.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Windows.Input; +using GARbro.GUI.Strings; + +namespace GARbro.GUI +{ + internal class NativeMethods + { + [DllImport ("shlwapi.dll", CharSet = CharSet.Unicode)] + internal static extern int StrCmpLogicalW (string psz1, string psz2); + + [DllImport ("gdi32.dll")] + internal static extern int GetDeviceCaps (IntPtr hDc, int nIndex); + + [DllImport ("user32.dll")] + internal static extern IntPtr GetDC (IntPtr hWnd); + + [DllImport ("user32.dll")] + internal static extern int ReleaseDC (IntPtr hWnd, IntPtr hDc); + } + + public static class Desktop + { + public static int DpiX { get { return dpi_x; } } + public static int DpiY { get { return dpi_y; } } + + public const int LOGPIXELSX = 88; + public const int LOGPIXELSY = 90; + + private static int dpi_x = GetCaps (LOGPIXELSX); + private static int dpi_y = GetCaps (LOGPIXELSY); + + public static int GetCaps (int cap) + { + IntPtr hdc = NativeMethods.GetDC (IntPtr.Zero); + if (hdc == IntPtr.Zero) + return 96; + int dpi = NativeMethods.GetDeviceCaps (hdc, cap); + NativeMethods.ReleaseDC (IntPtr.Zero, hdc); + return dpi; + } + } + + public sealed class NumericStringComparer : IComparer + { + public int Compare (string a, string b) + { + return NativeMethods.StrCmpLogicalW (a, b); + } + } + + public class WaitCursor : IDisposable + { + private Cursor m_previousCursor; + + public WaitCursor() + { + m_previousCursor = Mouse.OverrideCursor; + Mouse.OverrideCursor = Cursors.Wait; + } + + #region IDisposable Members + bool disposed = false; + public void Dispose() + { + Dispose (true); + GC.SuppressFinalize (this); + } + + protected virtual void Dispose (bool disposing) + { + if (!disposed) + { + Mouse.OverrideCursor = m_previousCursor; + disposed = true; + } + } + #endregion + } + + public static class Localization + { + public static string Plural (int n, string msg_id) + { + string suffix; + if (CultureInfo.CurrentUICulture.Name == "ru-RU") + { + suffix = (n%10==1 && n%100!=11 ? "1" : n%10>=2 && n% 10<=4 && (n%100<10 || n%100>=20) ? "2" : "3"); + } + else // assume en-EN + { + suffix = 1 == n ? "1" : "2"; + } + try + { + var res = guiStrings.ResourceManager.GetString (msg_id+suffix); + if (null == res) + { + Trace.WriteLine (string.Format ("Missing string resource for '{0}' token", msg_id+suffix)); + if (suffix != "1") + res = guiStrings.ResourceManager.GetString (msg_id+"1"); + if (null == res) + res = guiStrings.ResourceManager.GetString (msg_id); + } + return res ?? msg_id; + } + catch (Exception X) + { + Trace.WriteLine (X.Message, "Localization.Plural"); + return msg_id; + } + } + + public static string Format (string msg_id, int n) + { + return string.Format (Plural (n, msg_id), n); + } + + // Localization.Format ("{0:file:files} copied", count); +// public static string Format (string format, params object[] args); + } +} diff --git a/ViewModel.cs b/GUI/ViewModel.cs similarity index 97% rename from ViewModel.cs rename to GUI/ViewModel.cs index 2baed350..10dc8690 100644 --- a/ViewModel.cs +++ b/GUI/ViewModel.cs @@ -1,230 +1,230 @@ -//! \file ViewModel.cs -//! \date Wed Jul 02 07:29:11 2014 -//! \brief GARbro directory list. -// -// Copyright (C) 2014 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.IO; -using System.Linq; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Text.RegularExpressions; -using System.Globalization; -using System.Windows.Data; -using GameRes; -using GARbro.GUI.Strings; - -namespace GARbro.GUI -{ - public class DirectoryViewModel : ObservableCollection - { - public IReadOnlyList Path { get; private set; } - public IEnumerable Source { get; private set; } - public bool IsArchive { get; private set; } - - public DirectoryViewModel (IEnumerable path, IEnumerable filelist, bool is_archive) - { - Path = path.ToList(); - Source = filelist; - IsArchive = is_archive; - ImportFromSource(); - } - - protected void ImportFromSource () - { - var last_dir = Path.Last(); - if (IsArchive || !string.IsNullOrEmpty (last_dir) && null != Directory.GetParent (last_dir)) - { - Add (new EntryViewModel (new SubDirEntry (".."), -2)); - } - foreach (var entry in Source) - { - int prio = entry is SubDirEntry ? -1 : 0; - Add (new EntryViewModel (entry, prio)); - } - } - - public EntryViewModel Find (string name) - { - return this.FirstOrDefault (e => e.Name.Equals (name, StringComparison.InvariantCultureIgnoreCase)); - } - } - - public class EntryViewModel : INotifyPropertyChanged - { - public EntryViewModel (Entry entry, int priority) - { - Source = entry; - Name = Path.GetFileName (entry.Name); - Priority = priority; - } - - public event PropertyChangedEventHandler PropertyChanged; - - public Entry Source { get; private set; } - - public string Name { get; private set; } - public string Type - { - get { return Source.Type; } - set - { - if (Source.Type != value) - { - Source.Type = value; - OnPropertyChanged ("Type"); - } - } - } - public uint? Size { get { return IsDirectory ? null : (uint?)Source.Size; } } - public int Priority { get; private set; } - public bool IsDirectory { get { return Priority < 0; } } - - private void OnPropertyChanged (string property = "") - { - if (PropertyChanged != null) - { - PropertyChanged (this, new PropertyChangedEventArgs (property)); - } - } - } - - public sealed class FileSystemComparer : IComparer - { - private string m_property; - private int m_direction; - private static Comparer s_default_comparer = new Comparer (CultureInfo.CurrentUICulture); - - public FileSystemComparer (string property, ListSortDirection direction) - { - m_property = property; - m_direction = direction == ListSortDirection.Ascending ? 1 : -1; - } - - public int Compare (object a, object b) - { - var v_a = a as EntryViewModel; - var v_b = b as EntryViewModel; - if (null == v_a || null == v_b) - return s_default_comparer.Compare (a, b) * m_direction; - - if (v_a.Priority < v_b.Priority) - return -1; - if (v_a.Priority > v_b.Priority) - return 1; - if (string.IsNullOrEmpty (m_property)) - return 0; - int order; - if (m_property != "Name") - { - if ("Type" == m_property) - { - // empty strings placed in the end - if (string.IsNullOrEmpty (v_a.Type)) - order = string.IsNullOrEmpty (v_b.Type) ? 0 : m_direction; - else if (string.IsNullOrEmpty (v_b.Type)) - order = -m_direction; - else - order = string.Compare (v_a.Type, v_b.Type, true) * m_direction; - } - else - { - var prop_a = a.GetType ().GetProperty (m_property).GetValue (a); - var prop_b = b.GetType ().GetProperty (m_property).GetValue (b); - order = s_default_comparer.Compare (prop_a, prop_b) * m_direction; - } - if (0 == order) - order = CompareNames (v_a.Name, v_b.Name); - } - else - order = CompareNames (v_a.Name, v_b.Name) * m_direction; - return order; - } - - static int CompareNames (string a, string b) - { -// return NativeMethods.StrCmpLogicalW (a, b); - return string.Compare (a, b, StringComparison.CurrentCultureIgnoreCase); - } - } - - /// - /// Image format model for formats drop-down list widgets. - /// - public class ImageFormatModel - { - public ImageFormat Source { get; private set; } - public string Tag { - get { return null != Source ? Source.Tag : guiStrings.TextAsIs; } - } - - public ImageFormatModel (ImageFormat impl = null) - { - Source = impl; - } - } - - /// - /// Stores current position within directory view model. - /// - public class DirectoryPosition - { - public IEnumerable Path { get; set; } - public string Item { get; set; } - - public DirectoryPosition (DirectoryViewModel vm, EntryViewModel item) - { - Path = vm.Path; - Item = null != item ? item.Name : null; - } - - public DirectoryPosition (string filename) - { - Path = new string[] { System.IO.Path.GetDirectoryName (filename) }; - Item = System.IO.Path.GetFileName (filename); - } - } - - public class EntryTypeConverter : IValueConverter - { - public object Convert (object value, Type targetType, object parameter, CultureInfo culture) - { - var type = value as string; - if (!string.IsNullOrEmpty (type)) - { - var translation = guiStrings.ResourceManager.GetString ("Type_"+type, guiStrings.Culture); - if (!string.IsNullOrEmpty (translation)) - return translation; - } - return value; - } - - public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} +//! \file ViewModel.cs +//! \date Wed Jul 02 07:29:11 2014 +//! \brief GARbro directory list. +// +// Copyright (C) 2014 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.IO; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Text.RegularExpressions; +using System.Globalization; +using System.Windows.Data; +using GameRes; +using GARbro.GUI.Strings; + +namespace GARbro.GUI +{ + public class DirectoryViewModel : ObservableCollection + { + public IReadOnlyList Path { get; private set; } + public IEnumerable Source { get; private set; } + public bool IsArchive { get; private set; } + + public DirectoryViewModel (IEnumerable path, IEnumerable filelist, bool is_archive) + { + Path = path.ToList(); + Source = filelist; + IsArchive = is_archive; + ImportFromSource(); + } + + protected void ImportFromSource () + { + var last_dir = Path.Last(); + if (IsArchive || !string.IsNullOrEmpty (last_dir) && null != Directory.GetParent (last_dir)) + { + Add (new EntryViewModel (new SubDirEntry (".."), -2)); + } + foreach (var entry in Source) + { + int prio = entry is SubDirEntry ? -1 : 0; + Add (new EntryViewModel (entry, prio)); + } + } + + public EntryViewModel Find (string name) + { + return this.FirstOrDefault (e => e.Name.Equals (name, StringComparison.InvariantCultureIgnoreCase)); + } + } + + public class EntryViewModel : INotifyPropertyChanged + { + public EntryViewModel (Entry entry, int priority) + { + Source = entry; + Name = Path.GetFileName (entry.Name); + Priority = priority; + } + + public event PropertyChangedEventHandler PropertyChanged; + + public Entry Source { get; private set; } + + public string Name { get; private set; } + public string Type + { + get { return Source.Type; } + set + { + if (Source.Type != value) + { + Source.Type = value; + OnPropertyChanged ("Type"); + } + } + } + public uint? Size { get { return IsDirectory ? null : (uint?)Source.Size; } } + public int Priority { get; private set; } + public bool IsDirectory { get { return Priority < 0; } } + + private void OnPropertyChanged (string property = "") + { + if (PropertyChanged != null) + { + PropertyChanged (this, new PropertyChangedEventArgs (property)); + } + } + } + + public sealed class FileSystemComparer : IComparer + { + private string m_property; + private int m_direction; + private static Comparer s_default_comparer = new Comparer (CultureInfo.CurrentUICulture); + + public FileSystemComparer (string property, ListSortDirection direction) + { + m_property = property; + m_direction = direction == ListSortDirection.Ascending ? 1 : -1; + } + + public int Compare (object a, object b) + { + var v_a = a as EntryViewModel; + var v_b = b as EntryViewModel; + if (null == v_a || null == v_b) + return s_default_comparer.Compare (a, b) * m_direction; + + if (v_a.Priority < v_b.Priority) + return -1; + if (v_a.Priority > v_b.Priority) + return 1; + if (string.IsNullOrEmpty (m_property)) + return 0; + int order; + if (m_property != "Name") + { + if ("Type" == m_property) + { + // empty strings placed in the end + if (string.IsNullOrEmpty (v_a.Type)) + order = string.IsNullOrEmpty (v_b.Type) ? 0 : m_direction; + else if (string.IsNullOrEmpty (v_b.Type)) + order = -m_direction; + else + order = string.Compare (v_a.Type, v_b.Type, true) * m_direction; + } + else + { + var prop_a = a.GetType ().GetProperty (m_property).GetValue (a); + var prop_b = b.GetType ().GetProperty (m_property).GetValue (b); + order = s_default_comparer.Compare (prop_a, prop_b) * m_direction; + } + if (0 == order) + order = CompareNames (v_a.Name, v_b.Name); + } + else + order = CompareNames (v_a.Name, v_b.Name) * m_direction; + return order; + } + + static int CompareNames (string a, string b) + { +// return NativeMethods.StrCmpLogicalW (a, b); + return string.Compare (a, b, StringComparison.CurrentCultureIgnoreCase); + } + } + + /// + /// Image format model for formats drop-down list widgets. + /// + public class ImageFormatModel + { + public ImageFormat Source { get; private set; } + public string Tag { + get { return null != Source ? Source.Tag : guiStrings.TextAsIs; } + } + + public ImageFormatModel (ImageFormat impl = null) + { + Source = impl; + } + } + + /// + /// Stores current position within directory view model. + /// + public class DirectoryPosition + { + public IEnumerable Path { get; set; } + public string Item { get; set; } + + public DirectoryPosition (DirectoryViewModel vm, EntryViewModel item) + { + Path = vm.Path; + Item = null != item ? item.Name : null; + } + + public DirectoryPosition (string filename) + { + Path = new string[] { System.IO.Path.GetDirectoryName (filename) }; + Item = System.IO.Path.GetFileName (filename); + } + } + + public class EntryTypeConverter : IValueConverter + { + public object Convert (object value, Type targetType, object parameter, CultureInfo culture) + { + var type = value as string; + if (!string.IsNullOrEmpty (type)) + { + var translation = guiStrings.ResourceManager.GetString ("Type_"+type, guiStrings.Culture); + if (!string.IsNullOrEmpty (translation)) + return translation; + } + return value; + } + + public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/packages.config b/GUI/packages.config similarity index 96% rename from packages.config rename to GUI/packages.config index 38cd96bb..d8e6610d 100644 --- a/packages.config +++ b/GUI/packages.config @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/Images/32x32/back button.png b/Images/32x32/back button.png deleted file mode 100644 index 3c0c2310c8d48cd16509d62c3bc61e41d6f0b07b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4843 zcmV4Tx0C=2@)_XLR`5y=H_cK>x+zsPyh$xqYqKjM8hC-2hl3^r;nZ`uAp*CH2 zi|w+aP@9ON)~eK6+Ab1_(7jx0T@p#9BJ=xWRNL9J=eM78o^w9W=bYzzp6B)be4q0H zupkRtUPQdmWzixJ{A;{x1pxqeEOp= z7uBEXx`UqWtdOp*s(*hD03a_43U=bTD-~-H8089gef;rOHTxbtWss%{*zt&RXfU0~zW9)0q#0pR=0?v7Ttqu8r z06?fW#4oq81^^Ipa{%fSiDYOZK+ga^rAs6uM7>c#7M4?{THDx8x3ixybJlD}Cuf&A z+_~S)b9Hl{zre%OYvCeqpT)j@{sDnO!AnAxE)884#tV<&M=px_Qf%@3*FH+rDGxuHCzT_;JtP^o*bO?LTnv=giDQS=on= z|oqrOYj4)o*WYSrxZT*)bf>wwrM30$z5DkcJbd`*@slS{+uGYZI-fm%{#RFbPw$Jq zm;D2;24BB<`)>Hd$B|EC5|F7h8Cj;hf|9Z-OO36erLCi<&oP)FH83-`oMJWA+Gg4~ zf`g;ezadB!J|m1P#Kgu4J}V?7N)@CGo40(wHEo;JLCWyi;ZRog;m;1o^G}>8C_GtI zeCl*bN$Hty7``Z6y>`8(=0@$!n{{6mT3W^t#tk|;pFRJptE;=GS1K^{=I!wNkE3G} zkSJ6dogvGVQ&3b=R$-~Bvo*A|b#(RgIffIAj3=7>O~Ljn!{58Xef|OuPbr1ZVqZUh z|A4@t;NT@8OG87Kh4H>{eC~=kfpGO|QM_2ZCLwX0WRtWrz7hG-8RH~Ja{ftD`h`R) zQu#-fv@fpL+^D@-SAVPFc4O0>=9bpG_wGM@^!Q0zd&jfqUERHXF9!yP-VT2l8Iu6g z^9}&C=|El@;7kE4XVG%+^*$Mki~QRCC4qWDPQkn-TSJPLHieFa8S{K1O89NdRia#1Y=|yf`7)Lt zcT~{6+E5f3Unm|(OkR6qo!a_{4QDrzQwmchTl~K-Nn>okywhM;>h8`x#px;;>wkK- zf6>oonORwK*~vL8bK8#wANS60D7;nVUEEyKb|$)PQ#td(q>745o_{1(D_n88`uO_# z+KRd*^^(T4|xdFb^>^5je#zeBV0_VevsF5RQO7y1(Vrw^zP3=duy+VFPH zJL6%Q_qRVD8c80F9GfbUjQ>kXpn(Y$Xu}v*n2q@e#wu(?1`1G#R=gtQh{=Q-5k>4E zP7zJS2a*xViinsjs^_RTs$a=TGw?RlH|&~l-e`|8f1-nl zlF3Wc#!1DK51OT#M_Ytg&Y$9FWk1!{+S+ESt=%-|>7I6B_VF{)W@gSRn|w=E!hXnMMNMK9dF=%n|(#WY_BKY@Q%Kywfy*m=pukg8C| zGM}&v-rWc@ern|PD6JK1qMKG3#q5af5x5D48-}og3l?JqHsJtDQHNfFNmvrzL;`V`xK0d_3`jntEu`N_y<{WuQgSA_ zmBOY3P!3T#sAkl7>SdZLEu40au1H@_uaeP|NtS76%wwFE)t22R`+*tD?2rqRYm)bp zZ&dJ8c%T@j*r&8snWmhnVxdx_8m2nN%2f+eS5j|e@73_tsp|FX z-{SmckY~7ag4jr4%%2!);%(|TDPZz4vsm*)i#?V{rd+goFm=>M-`0JaczU5-+YI(h zuUR{0H#urLEpsk)8RmMu>03T&GF@m(i$3ND`v zD`uQ3D_M4iboNBqs&e+ZD;LBU^)6LZ##OPaEB*|>O21ZI!@Y6;W?VgSYv*lxWBMIh z^WGN8-BtHm9?X82_n7>|^Xa~}who)luxI<9H*`_EC-=DbE`O2SckpFVfBC?L;wKWgFBZKA&3!(qWJ<2 zmlqQqF5>Y8p9d~BJix_Va1a3jVjzGB(cnV>4!GbU2GIzI2t4p1_z&y-w-86J6$1cQ zAWRZPN39TZT!g}yNDfyJD_kRv6q$3}<0350Io4KIHUJ= zJ#**2&e>=0z5L_cd6gE>#GS0%bI;jlec%4p+H0?)M1+qz)aC=-8!lbD?Ys@`TUK|s zuFYjs6F`*sLT}%A?>onaUwiM!$yeq0?L!~gsfc{2wd{QSsxKZm{=~sIqp>4Jkv=Oj zDk76L8x@h0PUJ{Y)f^ZKvtzUS7@eSF`Rt}w_0 z&O;(#J^0!@4TKu93W5O2z-#?3e&U%o4*ucbb9c+Tca5DB<6H!CpZw(&-}ufAkL|sx zeSK>Pl>|yQ1qV>-OeH}9Sq+UL{CP?ZuiJUcgGKQk{lnb)W+H&5`lp2k&|2^U2Hm zUp|vWxOf#J>f(nky!{8a9J+3EYwJiECSnLQWHfjMPHF@ccsCycUsJ&ecn=i|6A>)0 zgHK{P8Xkd1oP}Uie3?`(g90Td)4vbr*NE_ZOkB2(bg>AeuFs-W#nz zoPgB8=APBAXW!{9!e9w@Z|z*Y^UK?Rs?==_O3epw5rOtg&bw{Twd*b$s|W)#9_xg7 z7C4y)KUIMBdDy!KZtjNGER@XroXDj_Vh7eif6+4?2{(P}{GH1_yYs6HLoi1`eeB-u ztFGN}M_o2U|Fpwdi%A@D;#0>ib=Wrv7d69g^ZYsXFd%n^j?sK+ERUH*Gq*yPf zxO%x`&-wHF&k6kcgz);fU=mN1I80(m5{ogZ#fc?O9M(D}%L!pNWYzkP8pI=N#S%)_Drf)6uo`l4IQ~S8$5c={9U`?9Sw}ZN-X3lp^$+Ab^VU42_lf z(#CrBUYuW;ue|VfMBnLzbs2?9w=iB(K<_-F6r+hyry-*R=RD4N3_>a6$YCn&C5RYyiV zg^FQpCZ<$Ph+|8|cnvyRBQUBEaixl(R545y4Y9FUWAO-oIvJhSf8sv)7`GmtJ62@6 zZ19OCG6|DKL#dijEJYsi7EmE@Y7`1VK+;?Qp%i<1$0L*o*3agE!^FZ&p;Dn@3UG~1ldv2O7bi-i%i3DH zf*`(@xvhB}S|i>g0>1XEfmeDE3R16K$JNC z(O)8?K#50rL5WAi<88YCopV^5DiB98BPUM3Tt;?q@WCH(chB1*y5)s1sXT(&09yCYTJ8Y-hiaL&z{wH{|Z&RVSX;2njj64P%F z9bjteDAgy877B;#WJy|rO+pf<)iK2LlNSbg=+BE=zAfE3D%B*N zYb=SebJxZs7~`;sC5dB32gXk@Svkx^!HI~k^#esip{36Zj31hAYy9q#C5;#hLEuqJ zp|wU^P+AiL4?f?IO+4S+-pNeW^6b$uaF)dA`F_s}-U}ig=O7yhlaob~!HHiHm51PM z1GSDwDW&MSe+j7d^mIJ3cH_!RRG1+V2((6Pg;F)s3Xyah_N>TJF^-WLLpG>^BXeO( z!G(+lml*nv4<6>k@a+^QdzpBkBqE~I>=mK6w?eTpz|hqFr~1c7l}pgx5yuH8PUa35 zQwxXkj(3KN3{F%~-qoa@4MBPx#R-8pura6pJvKn!)Q_n6VJ2R!&Yp&IJz;u2@6WNS zyPbUF?r?qkz1>|ct*C%D`Vz*C5StTNf1GNi z59=mzrs+LGHFk#y+f=aRuQ-=VOXO7 zr3yTsoNd+r6@kTyTob^W5b_~CtAe?Q(}Tif*1^AQ+8e**&b8wInZW;R{0HW}qc^2Q RRqg-)002ovPDHLkV1i9_RO4Tx0C=2@)_XLR`5y=H_cK>x+zsPyh$xqYqKjM8hC-2hl3^r;nZ`uAp*CH2 zi|w+aP@9ON)~eK6+Ab1_(7jx0T@p#9BJ=xWRNL9J=eM78o^w9W=bYzzp6B)be4q0H zupkRtUPQdmWzixJ{A;{x1pxqeEOp= z7uBEXx`UqWtdOp*s(*hD03a_43U=bTD-~-H8089gef;rOHTxbtWss%{*zt&RXfU0~zW9)0q#0pR=0?v7Ttqu8r z06?fW#4oq81^^Ipa{%fSiDYOZK+ga^rAs6uM7>c#7M4?{THDx8x3ixybJlD}Cuf&A z+_~S)b9Hl{zre%OYvCeqpT)j@{sDnO!AnAxE)884#tV<&M=px_Qf%@3*FH+rDGxuHCzT_;JtP^o*bO?LTnv=giDQS=on= z|oqrOYj4)o*WYSrxZT*)bf>wwrM30$z5DkcJbd`*@slS{+uGYZI-fm%{#RFbPw$Jq zm;D2;24BB<`)>Hd$B|EC5|F7h8Cj;hf|9Z-OO36erLCi<&oP)FH83-`oMJWA+Gg4~ zf`g;ezadB!J|m1P#Kgu4J}V?7N)@CGo40(wHEo;JLCWyi;ZRog;m;1o^G}>8C_GtI zeCl*bN$Hty7``Z6y>`8(=0@$!n{{6mT3W^t#tk|;pFRJptE;=GS1K^{=I!wNkE3G} zkSJ6dogvGVQ&3b=R$-~Bvo*A|b#(RgIffIAj3=7>O~Ljn!{58Xef|OuPbr1ZVqZUh z|A4@t;NT@8OG87Kh4H>{eC~=kfpGO|QM_2ZCLwX0WRtWrz7hG-8RH~Ja{ftD`h`R) zQu#-fv@fpL+^D@-SAVPFc4O0>=9bpG_wGM@^!Q0zd&jfqUERHXF9!yP-VT2l8Iu6g z^9}&C=|El@;7kE4XVG%+^*$Mki~QRCC4qWDPQkn-TSJPLHieFa8S{K1O89NdRia#1Y=|yf`7)Lt zcT~{6+E5f3Unm|(OkR6qo!a_{4QDrzQwmchTl~K-Nn>okywhM;>h8`x#px;;>wkK- zf6>oonORwK*~vL8bK8#wANS60D7;nVUEEyKb|$)PQ#td(q>745o_{1(D_n88`uO_# z+KRd*^^(T4|xdFb^>^5je#zeBV0_VevsF5RQO7y1(Vrw^zP3=duy+VFPH zJL6%Q_qRVD8c80F9GfbUjQ>kXpn(Y$Xu}v*n2q@e#wu(?1`1G#R=gtQh{=Q-5k>4E zP7zJS2a*xViinsjs^_RTs$a=TGw?RlH|&~l-e`|8f1-nl zlF3Wc#!1DK51OT#M_Ytg&Y$9FWk1!{+S+ESt=%-|>7I6B_VF{)W@gSRn|w=E!hXnMMNMK9dF=%n|(#WY_BKY@Q%Kywfy*m=pukg8C| zGM}&v-rWc@ern|PD6JK1qMKG3#q5af5x5D48-}og3l?JqHsJtDQHNfFNmvrzL;`V`xK0d_3`jntEu`N_y<{WuQgSA_ zmBOY3P!3T#sAkl7>SdZLEu40au1H@_uaeP|NtS76%wwFE)t22R`+*tD?2rqRYm)bp zZ&dJ8c%T@j*r&8snWmhnVxdx_8m2nN%2f+eS5j|e@73_tsp|FX z-{SmckY~7ag4jr4%%2!);%(|TDPZz4vsm*)i#?V{rd+goFm=>M-`0JaczU5-+YI(h zuUR{0H#urLEpsk)8RmMu>03T&GF@m(i$3ND`v zD`uQ3D_M4iboNBqs&e+ZD;LBU^)6LZ##OPaEB*|>O21ZI!@Y6;W?VgSYv*lxWBMIh z^WGN8-BtHm9?X82_n7>|^Xa~}who)luxI<9H*`_EC-=DbE`O2SckpFVfBC?L;wKWgFBZKA&3!(qWJ<2 zmlqQqF5>Y8p9d~BJix_Va1a3jVjzGB(cnV>4!GbU2GIzI2t4p1_z&y-w-86J6$1cQ zAWRZPN39TZT!g}yNDfyJD_kRv6q$3}<0350Io4KIHUJ=Zd5m3k6~{ln-@R{{>AYDxGo3ojlrG9rN-Yo&FjSB& z!LpQAQWI2)VvHC;3=vQ;?t&(0B0@|^Pza%tXd@y9BA9?h3PG0IB6OX$(@x);x4(Dq zZ#n*PUpq5hC?wwGlhx z5WoQC7`ElH8{R(f+Ml0#^Rd_d@WSt8*FA;f1{aZI8eMmHpMTds?|taasPaZlWJgnE zTTSGhipZw2$lER3ToHMw(2< zZ@J>(&s}oDnS*JlTc}xxeX?q$5=&N*{HB4dhFl7Q5H=Oy*N?pVo9Dmt=&d5ZXdEp8 z;ZZUo>2rR2#@Ft=>W|l*KQxSo|CS)~5GV+B@~Hr&TRtr)Cs6dTw+y>fT~E(U|LXL4*M9PspE-AA;dl+UmLYNwyX3R!plP9D zpkb3uSZPAOk=)ZX$^T6U#zEP@e~O?{T)%qh4FgwScjMs;o&k`%c*W`~Fa6kxawP01 zIgFDT!UwHt;M6X-as*b+gTTSw3K%~VB7qXN6g+*i(p+)%(!14?2j(9YKrQ%b*E!2i zzNIIZW&5PXT1RXgk@1IuHd+=t80|<>pG(7C^)NssZK zXqvyVmO{-CImOatqpQ{E4~J#|D5do1!okb3ZE5mVgEfvQwlrf)WGr!PiQ^<#BeF!X z=Wjbb&+M9N;kFdqe1@hgju<--W38nbS)zjwv14DwaKcE>f?&A+teIUf^5d?axm{;g zB2UwK!Z0KVJYk?|qN!Vmy~3gJN&yN%@!$mPuLgYfqbbq>w51i_JU7FSo-46^pJt#d zz#5Npi8Z_<3_^MbyUzmFPXPqdpPiK*t~4y76yAfYEnvpR%oqJD(OQJ zMZVw|D=OyqC863fnr~m&$z6Zi$2--4!Oj#)rXZAebab~bQtI-I$kS1%lv12@f6h3` zH6n}FiUy9lRp>zT-3w;3s4sPR_q^}bo(=fHiUHO>HpZCqvn#7UZJ%j2m;27O&;1%;L1}wNr$@i5SS?xJE1e9$z^67DQw);;NN+R zb{^{m>l{r4?Jdp7)DPa5EYI0$t=yO_)#C0T2nYg=_kz}n-@lS){aYncK~j6ARq`BA zin{TPbf@^1 zlg4Ci3s?(?hIJlSsK~c!*i7u|&;?;@-kWYSqn9_fsWc z(o$(`s_e=?Q}6G*CY8zHtRe_BYFh6n2F457aB4Tc^j?{-KmH!I$dL{du@$@s-h0Fg z)_YP4CJPnJ?!uE4Z3))dX#ndiwNonWD?c*6Cx6k%NPk!CHO{rfwL+_@`o~WA{`zg) ze9( z2xEJSarEx^Pbk$lGTy8n6rYiSBn!(!hL(4eZJW=W-rIW@4qVgM)kecY)5(l|pc03~ zQ3RniVS7+Yn3d9K9AkS+wP@@9dnq;^r#!Zo!mlbaP4p;J@l7cPhk9twjMCSAeR{a( z^MeB&xpWv3*<>DYN4!fYbZcPEhKf`Gm3qwn-NpB0Pw{>#jb{-VXXk6>!)L;yzL+R= zQ;Io#-L!YjA)P*(*|{~@f!rs0yW6tabbwL{k)-A%+aoE36KYLEAz$0?_ErBvvHB#< zcr$4|!PZx+hl?K*;7~cbmUqyV?Ioq=kj|V=uI)T>nbXqk>5qijR4&w{L=bCS97nd` zYSDJe(Z7hyOEhX*Fp_6%=OjGTkYfnF@2iQ z@)%o1Tmk1NuuNhb6&i&yg*WQ(f;*P@aRFw6tV+>0FGDKKl1is=VKC#SP+5v5qP({W zTjJvhe<*+>VNkH@um|(HRwI14fFBy*|9$-rx=tp`qTBfW00000NkvXXu0mjf-#|s< diff --git a/Images/32x32/help.png b/Images/32x32/help.png deleted file mode 100644 index 9b190d8886bc7e3195aa40429d532cd0cb6ee81f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 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 B`o91G diff --git a/Images/sample.ico b/Images/sample.ico deleted file mode 100644 index 435cca2471cd31bb825ff1e6eb180c1939a9eb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmc&zF%p6>5L_S)1H}g<-VtX@^EF=Zz9{mlQwW;#il~Wy%sJax^Jn}JGe|Bw=NmFB ge8aqPJmI~ud$Eb6)2}9ELOWr8V4xU|6W(XUPqgg+2mk;8 diff --git a/Images/search4files.ico b/Images/search4files.ico deleted file mode 100644 index 27aff3ed16ace6eddb264e941d88458cbdf1f008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22486 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 QNYNymlq~`gie5(l4_2!F9{>OV diff --git a/Images/splashscreen.png b/Images/splashscreen.png deleted file mode 100644 index d0f1688f5e9cb8fc4fab72d2c9300df491c86fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7216 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 diff --git a/packages/repositories.config b/packages/repositories.config deleted file mode 100644 index 1a5dce06..00000000 --- a/packages/repositories.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file