959 lines
29 KiB
C#
959 lines
29 KiB
C#
|
using BookmarkManager;
|
|||
|
using FizzyLauncher.Models;
|
|||
|
using FizzyLauncher.Text.Json;
|
|||
|
using RyzStudio.Windows.Forms;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Reflection;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Text.Json;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using System.Windows.Forms;
|
|||
|
|
|||
|
namespace FizzyLauncher
|
|||
|
{
|
|||
|
public partial class MainForm : Form
|
|||
|
{
|
|||
|
//[DllImport("user32.dll")]
|
|||
|
//protected static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
|
|||
|
|
|||
|
//[DllImport("user32.dll")]
|
|||
|
//protected static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
|||
|
|
|||
|
|
|||
|
public enum AppMode
|
|||
|
{
|
|||
|
Clear = 0,
|
|||
|
Open,
|
|||
|
New
|
|||
|
}
|
|||
|
|
|||
|
//public enum LoadFileType
|
|||
|
//{
|
|||
|
// None = 0,
|
|||
|
// Jsnx,
|
|||
|
// Ryz
|
|||
|
//}
|
|||
|
|
|||
|
//protected BackgroundWorker loadFileThread = null;
|
|||
|
//protected bool isBusy = false;
|
|||
|
|
|||
|
protected OptionsForm optionsForm = null;
|
|||
|
|
|||
|
protected AppMode appMode = AppMode.Clear;
|
|||
|
protected string sessionFilename = null;
|
|||
|
protected string sessionPassword = null;
|
|||
|
protected bool isBusy = false;
|
|||
|
|
|||
|
|
|||
|
//protected LoadFileType loadFileType = LoadFileType.None;
|
|||
|
//protected bool usePassword = false;
|
|||
|
|
|||
|
|
|||
|
//protected const int MOD_ALT = 0x1;
|
|||
|
//protected const int MOD_CONTROL = 0x2;
|
|||
|
//protected const int MOD_SHIFT = 0x4;
|
|||
|
//protected const int MOD_WIN = 0x8;
|
|||
|
//protected const int WM_HOTKEY = 0x312;
|
|||
|
//protected const int WM_QUERYENDSESSION = 0x0011;
|
|||
|
|
|||
|
//protected string sessionFilename = null;
|
|||
|
|
|||
|
//protected bool requestExit = false;
|
|||
|
|
|||
|
|
|||
|
public MainForm()
|
|||
|
{
|
|||
|
InitializeComponent();
|
|||
|
|
|||
|
//tileContainer1.OnColumnSizeChanged += tileContainer1_OnSizeChanged;
|
|||
|
|
|||
|
this.AutoScaleMode = AutoScaleMode.None;
|
|||
|
this.StartPosition = FormStartPosition.WindowsDefaultLocation;
|
|||
|
this.ClientSize = new System.Drawing.Size(300, 580);
|
|||
|
//this.Visible = false;
|
|||
|
|
|||
|
ApplicationMode = AppMode.Clear;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnLoad(EventArgs e)
|
|||
|
{
|
|||
|
base.OnLoad(e);
|
|||
|
|
|||
|
//ThreadControl.SetVisible(this, false);
|
|||
|
ThreadControl.SetSize(this, 300, 580);
|
|||
|
}
|
|||
|
|
|||
|
protected async override void OnShown(EventArgs e)
|
|||
|
{
|
|||
|
base.OnShown(e);
|
|||
|
|
|||
|
//ThreadControl.SetVisible(this, false);
|
|||
|
|
|||
|
//string jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig");
|
|||
|
//if (File.Exists(jsonfigFilename))
|
|||
|
//{
|
|||
|
// await loadFile(jsonfigFilename);
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// this.CurrentSession = new LauncherSession();
|
|||
|
|
|||
|
// ThreadControl.SetVisible(this, true);
|
|||
|
//}
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnClosing(CancelEventArgs e)
|
|||
|
{
|
|||
|
base.OnClosing(e);
|
|||
|
|
|||
|
// if (this.CurrentSession == null) this.CurrentSession = new LauncherSession();
|
|||
|
|
|||
|
// if (this.CurrentSession.HideOnClose && !requestExit)
|
|||
|
// {
|
|||
|
// this.Visible = !this.Visible;
|
|||
|
// e.Cancel = true;
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// requestExit = false;
|
|||
|
|
|||
|
// if (string.IsNullOrWhiteSpace(sessionFilename))
|
|||
|
// {
|
|||
|
// // do nothing
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// if (this.CurrentSession.AutoSave == LauncherSession.AutoSaveOption.Prompt)
|
|||
|
// {
|
|||
|
// DialogResult dr = MessageBox.Show("Save existing session?", "Exit", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
|
|||
|
// if (dr == DialogResult.Yes)
|
|||
|
// {
|
|||
|
// bool rv = saveFile(sessionFilename, false);
|
|||
|
// if (!rv)
|
|||
|
// {
|
|||
|
// e.Cancel = true;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// else if (dr == DialogResult.No)
|
|||
|
// {
|
|||
|
// // do nothing
|
|||
|
// }
|
|||
|
// else if (dr == DialogResult.Cancel)
|
|||
|
// {
|
|||
|
// e.Cancel = true;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// else if (this.CurrentSession.AutoSave == LauncherSession.AutoSaveOption.Yes)
|
|||
|
// {
|
|||
|
// saveFile(sessionFilename, false);
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
// if (this.CurrentSession.HotKey != null)
|
|||
|
// {
|
|||
|
// if (this.CurrentSession.HotKey.KeyCode != Keys.None)
|
|||
|
// {
|
|||
|
//#if !DEBUG
|
|||
|
// UnregisterHotKey((IntPtr)Handle, 1);
|
|||
|
//#endif
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public LauncherSession CurrentSession { get; set; } = null;
|
|||
|
|
|||
|
public bool IsBusy
|
|||
|
{
|
|||
|
get => isBusy;
|
|||
|
set
|
|||
|
{
|
|||
|
treeView1.Enabled = !value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected AppMode ApplicationMode
|
|||
|
{
|
|||
|
get => appMode;
|
|||
|
set
|
|||
|
{
|
|||
|
appMode = value;
|
|||
|
|
|||
|
switch (value)
|
|||
|
{
|
|||
|
case AppMode.Clear:
|
|||
|
ThreadControl.SetText(this, AppResource.app_name);
|
|||
|
|
|||
|
ThreadControl.SetEnable(closeToolStripMenuItem, false);
|
|||
|
|
|||
|
ThreadControl.SetEnable(saveToolStripMenuItem, false);
|
|||
|
ThreadControl.SetEnable(saveAsToolStripMenuItem, false);
|
|||
|
|
|||
|
ThreadControl.SetEnable(expandAllToolStripMenuItem, false);
|
|||
|
ThreadControl.SetEnable(collapseAllToolStripMenuItem, false);
|
|||
|
|
|||
|
//ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, false);
|
|||
|
//this.AllowSave = false;
|
|||
|
//ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, false);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, findEditMenuItem, false);
|
|||
|
|
|||
|
//ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, false);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, false);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, false);
|
|||
|
|
|||
|
break;
|
|||
|
case AppMode.Open:
|
|||
|
ThreadControl.SetEnable(closeToolStripMenuItem, true);
|
|||
|
|
|||
|
ThreadControl.SetEnable(saveToolStripMenuItem, true);
|
|||
|
ThreadControl.SetEnable(saveAsToolStripMenuItem, true);
|
|||
|
|
|||
|
ThreadControl.SetEnable(expandAllToolStripMenuItem, true);
|
|||
|
ThreadControl.SetEnable(collapseAllToolStripMenuItem, true);
|
|||
|
|
|||
|
//ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, true);
|
|||
|
//this.AllowSave = true;
|
|||
|
//ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, findEditMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, true);
|
|||
|
|
|||
|
break;
|
|||
|
case AppMode.New:
|
|||
|
ThreadControl.SetText(this, AppResource.app_name);
|
|||
|
|
|||
|
ThreadControl.SetEnable(closeToolStripMenuItem, true);
|
|||
|
|
|||
|
ThreadControl.SetEnable(saveToolStripMenuItem, false);
|
|||
|
ThreadControl.SetEnable(saveAsToolStripMenuItem, true);
|
|||
|
|
|||
|
ThreadControl.SetEnable(expandAllToolStripMenuItem, true);
|
|||
|
ThreadControl.SetEnable(collapseAllToolStripMenuItem, true);
|
|||
|
|
|||
|
//ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, true);
|
|||
|
//this.AllowSave = true;
|
|||
|
//ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, findEditMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, true);
|
|||
|
//ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, true);
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//public void Clear(int columnCount)
|
|||
|
//{
|
|||
|
// //tileContainer1.Clear();
|
|||
|
// //tileContainer1.Add(columnCount);
|
|||
|
|
|||
|
// sessionFilename = null;
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
//protected async Task collapseWindow(int width, int increment = 6)
|
|||
|
//{
|
|||
|
// await Task.Run(() =>
|
|||
|
// {
|
|||
|
// while (this.Width > width)
|
|||
|
// {
|
|||
|
// ThreadControl.SetWidth(this, (this.Width - increment));
|
|||
|
|
|||
|
// Application.DoEvents();
|
|||
|
// }
|
|||
|
|
|||
|
// ThreadControl.SetWidth(this, width);
|
|||
|
// });
|
|||
|
//}
|
|||
|
|
|||
|
//protected async Task expandWindow(int width, int increment = 8)
|
|||
|
//{
|
|||
|
// await Task.Run(() =>
|
|||
|
// {
|
|||
|
// while (this.Width < width)
|
|||
|
// {
|
|||
|
// ThreadControl.SetWidth(this, (this.Width + increment));
|
|||
|
|
|||
|
// Application.DoEvents();
|
|||
|
// }
|
|||
|
|
|||
|
// ThreadControl.SetWidth(this, width);
|
|||
|
// });
|
|||
|
//}
|
|||
|
|
|||
|
// protected void invalidateHotKey()
|
|||
|
// {
|
|||
|
//#if !DEBUG
|
|||
|
// if (this.InvokeRequired)
|
|||
|
// {
|
|||
|
// this.Invoke(new MethodInvoker(() =>
|
|||
|
// {
|
|||
|
// UnregisterHotKey((IntPtr)Handle, 1);
|
|||
|
// }));
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// UnregisterHotKey((IntPtr)Handle, 1);
|
|||
|
// }
|
|||
|
//#endif
|
|||
|
|
|||
|
// if (this.CurrentSession.HotKey != null)
|
|||
|
// {
|
|||
|
// if (this.CurrentSession.HotKey.KeyCode != Keys.None)
|
|||
|
// {
|
|||
|
//#if !DEBUG
|
|||
|
// if (this.InvokeRequired)
|
|||
|
// {
|
|||
|
// this.Invoke(new MethodInvoker(() =>
|
|||
|
// {
|
|||
|
// RegisterHotKey((IntPtr)Handle, 1, this.CurrentSession.HotKey.ModifierCode, this.CurrentSession.HotKey.Key);
|
|||
|
// }));
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// RegisterHotKey((IntPtr)Handle, 1, this.CurrentSession.HotKey.ModifierCode, this.CurrentSession.HotKey.Key);
|
|||
|
// }
|
|||
|
//#endif
|
|||
|
// }
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
//protected void newSession()
|
|||
|
//{
|
|||
|
//NewForm form = new NewForm(this);
|
|||
|
//form.ShowDialog();
|
|||
|
//}
|
|||
|
|
|||
|
//protected async Task loadFile(string filename)
|
|||
|
//{
|
|||
|
// await Task.Run(() =>
|
|||
|
// {
|
|||
|
// if (isBusy)
|
|||
|
// {
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// if (string.IsNullOrWhiteSpace(filename))
|
|||
|
// {
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// if (!File.Exists(filename))
|
|||
|
// {
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// string sourceCode = null;
|
|||
|
|
|||
|
// try
|
|||
|
// {
|
|||
|
// sessionFilename = filename;
|
|||
|
|
|||
|
// sourceCode = File.ReadAllText(sessionFilename);
|
|||
|
// }
|
|||
|
// catch (Exception exc)
|
|||
|
// {
|
|||
|
// MessageBox.Show(exc.Message, "Load session");
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// if (string.IsNullOrWhiteSpace(sourceCode))
|
|||
|
// {
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// // load options
|
|||
|
// var options = new JsonSerializerOptions();
|
|||
|
// options.Converters.Add(new JsonPointConverter());
|
|||
|
// options.Converters.Add(new JsonSizeConverter());
|
|||
|
|
|||
|
// try
|
|||
|
// {
|
|||
|
// this.CurrentSession = JsonSerializer.Deserialize<LauncherSession>(sourceCode, options);
|
|||
|
// }
|
|||
|
// catch (Exception exc)
|
|||
|
// {
|
|||
|
// MessageBox.Show("Unable to read session", "Load session");
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// if (this.CurrentSession == null)
|
|||
|
// {
|
|||
|
// this.CurrentSession = new LauncherSession();
|
|||
|
// }
|
|||
|
|
|||
|
// // load tiles
|
|||
|
// //tileContainer1.Load(this.CurrentSession.Groups);
|
|||
|
|
|||
|
// // reposition
|
|||
|
// if (!this.CurrentSession.StartPosition.IsEmpty) ThreadControl.SetLocation(this, this.CurrentSession.StartPosition);
|
|||
|
|
|||
|
// //
|
|||
|
// ThreadControl.SetTopMost(this, this.CurrentSession.AlwaysOnTop);
|
|||
|
// ThreadControl.SetVisible(this, true);
|
|||
|
// ThreadControl.SetChecked(collapseAllToolStripMenuItem, this.CurrentSession.EnableAnimation);
|
|||
|
// ThreadControl.SetChecked(expandAllToolStripMenuItem, this.CurrentSession.EnableBigIconInFolder);
|
|||
|
// //ThreadControl.SetClientHeight(this, this.CurrentSession.DefaultHeight);
|
|||
|
|
|||
|
// ThreadControl.SetFocus(this);
|
|||
|
|
|||
|
// // hotkey
|
|||
|
// invalidateHotKey();
|
|||
|
|
|||
|
// });
|
|||
|
//}
|
|||
|
|
|||
|
//protected bool saveFile(string filename, bool showNotices = true)
|
|||
|
//{
|
|||
|
//if (isBusy)
|
|||
|
//{
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
|
|||
|
//if (string.IsNullOrWhiteSpace(filename))
|
|||
|
//{
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
|
|||
|
//if (tileContainer1.GroupCount <= 0)
|
|||
|
//{
|
|||
|
// return true;
|
|||
|
//}
|
|||
|
|
|||
|
//isBusy = true;
|
|||
|
|
|||
|
//// update session
|
|||
|
//if (this.CurrentSession == null)
|
|||
|
//{
|
|||
|
// this.CurrentSession = new LauncherSession();
|
|||
|
//}
|
|||
|
|
|||
|
//this.CurrentSession.DefaultHeight = this.Height;
|
|||
|
//this.CurrentSession.AlwaysOnTop = this.TopMost;
|
|||
|
//this.CurrentSession.StartPosition = this.Location;
|
|||
|
//this.CurrentSession.Groups = tileContainer1.GroupModels?.ToList() ?? new List<TileGroupModel>();
|
|||
|
|
|||
|
//var options = new JsonSerializerOptions();
|
|||
|
//options.Converters.Add(new JsonPointConverter());
|
|||
|
//options.Converters.Add(new JsonSizeConverter());
|
|||
|
|
|||
|
//try
|
|||
|
//{
|
|||
|
// File.WriteAllText(filename, JsonSerializer.Serialize(this.CurrentSession, options));
|
|||
|
|
|||
|
// if (showNotices)
|
|||
|
// {
|
|||
|
// MessageBox.Show("Session saved!", "Save session", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
// }
|
|||
|
//}
|
|||
|
//catch (Exception exc)
|
|||
|
//{
|
|||
|
// MessageBox.Show(exc.Message, "Save session");
|
|||
|
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
|
|||
|
//isBusy = false;
|
|||
|
|
|||
|
//return true;
|
|||
|
//}
|
|||
|
|
|||
|
//protected bool saveAsFile()
|
|||
|
//{
|
|||
|
//if (isBusy)
|
|||
|
//{
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
|
|||
|
//if (saveFileDialog1.ShowDialog() == DialogResult.OK)
|
|||
|
//{
|
|||
|
// bool rv = saveFile(saveFileDialog1.FileName);
|
|||
|
// if (rv)
|
|||
|
// {
|
|||
|
// sessionFilename = saveFileDialog1.FileName;
|
|||
|
// }
|
|||
|
|
|||
|
// return rv;
|
|||
|
//}
|
|||
|
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
|
|||
|
#region main menu
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// New
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void newToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = true;
|
|||
|
|
|||
|
CloseFile();
|
|||
|
|
|||
|
sessionFilename = null;
|
|||
|
sessionPassword = null;
|
|||
|
|
|||
|
treeView1.Clear("Untitled");
|
|||
|
|
|||
|
ApplicationMode = AppMode.New;
|
|||
|
|
|||
|
this.IsBusy = false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Open file
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private async void openToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = true;
|
|||
|
|
|||
|
CloseFile();
|
|||
|
|
|||
|
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
|||
|
{
|
|||
|
Result result = await LoadFile(openFileDialog1.FileName);
|
|||
|
if (!result.IsSuccess)
|
|||
|
{
|
|||
|
MessageBox.Show(result.Message, "Open File", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Close
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = true;
|
|||
|
|
|||
|
CloseFile();
|
|||
|
|
|||
|
sessionFilename = null;
|
|||
|
sessionPassword = null;
|
|||
|
|
|||
|
treeView1.Clear();
|
|||
|
|
|||
|
ApplicationMode = AppMode.Clear;
|
|||
|
|
|||
|
this.IsBusy = false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Save
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private async void saveToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (ApplicationMode == AppMode.Clear)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = true;
|
|||
|
|
|||
|
Result result = await SaveFile(sessionFilename, sessionPassword);
|
|||
|
if (result.IsSuccess)
|
|||
|
{
|
|||
|
MessageBox.Show("File saved!", "Save File", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MessageBox.Show(result.Message, "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Save As
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private async void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (ApplicationMode == AppMode.Clear)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = true;
|
|||
|
|
|||
|
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
|
|||
|
{
|
|||
|
Result result = await SaveAsFile(saveFileDialog1.FileName);
|
|||
|
if (result.IsSuccess)
|
|||
|
{
|
|||
|
MessageBox.Show("File saved!", "Save As File", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MessageBox.Show(result.Message, "Save As File", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
this.IsBusy = false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Exit
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
this.Close();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Find
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void findToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
//tileContainer1.Add();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Expand all
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void expandAllToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy) return;
|
|||
|
if (ApplicationMode == AppMode.Clear) return;
|
|||
|
|
|||
|
if (treeView1.SelectedNode == null)
|
|||
|
{
|
|||
|
treeView1.ExpandAll();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
treeView1.SelectedNode.ExpandAll();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Collapse all
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy) return;
|
|||
|
if (ApplicationMode == AppMode.Clear) return;
|
|||
|
|
|||
|
if (treeView1.SelectedNode == null)
|
|||
|
{
|
|||
|
treeView1.CollapseAll();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
treeView1.SelectedNode.Collapse(false);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Always on top
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
this.TopMost = !this.TopMost;
|
|||
|
|
|||
|
alwaysOnTopToolStripMenuItem.Checked = this.TopMost;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Options
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void optionsToolStripMenuItem_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (this.IsBusy)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (optionsForm == null) optionsForm = new OptionsForm(this);
|
|||
|
optionsForm.ShowDialog();
|
|||
|
|
|||
|
//invalidateHotKey();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// View help
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void viewHelpToolStripMenuItem1_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
System.Diagnostics.Process.Start("https://www.hiimray.co.uk/software-bookmark-manager");
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
// do nothing
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// About
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
MessageBox.Show(Application.ProductName + " v" + Application.ProductVersion, "About", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
|
|||
|
protected async void CloseFile()
|
|||
|
{
|
|||
|
if (this.ApplicationMode == AppMode.Clear)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (!treeView1.HasChanged)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (this.ApplicationMode == AppMode.New)
|
|||
|
{
|
|||
|
DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
|
|||
|
if (response == DialogResult.Yes)
|
|||
|
{
|
|||
|
Result result = await SaveAsFile(sessionFilename);
|
|||
|
if (!result.IsSuccess)
|
|||
|
{
|
|||
|
MessageBox.Show(result.Message, "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (response == DialogResult.Cancel)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (this.ApplicationMode == AppMode.Open)
|
|||
|
{
|
|||
|
DialogResult response = MessageBox.Show("Save changes to open bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
|
|||
|
if (response == DialogResult.Yes)
|
|||
|
{
|
|||
|
Result result = await SaveFile(sessionFilename, sessionPassword);
|
|||
|
if (!result.IsSuccess)
|
|||
|
{
|
|||
|
MessageBox.Show(result.Message, "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (response == DialogResult.Cancel)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected SupportedFileBase GetSupportedFileHandler(string filename)
|
|||
|
{
|
|||
|
SupportedFileBase rs = null;
|
|||
|
|
|||
|
List<Type> typeList = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsSubclassOf(typeof(SupportedFileBase))).ToList();
|
|||
|
foreach (Type t in typeList)
|
|||
|
{
|
|||
|
rs = (SupportedFileBase)Activator.CreateInstance(t);
|
|||
|
if (rs == null)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (rs.IsSupported(filename))
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
rs = null;
|
|||
|
}
|
|||
|
|
|||
|
return rs;
|
|||
|
}
|
|||
|
|
|||
|
protected async Task<Result> LoadFile(string filename)
|
|||
|
{
|
|||
|
return await Task.Run(() =>
|
|||
|
{
|
|||
|
sessionFilename = null;
|
|||
|
sessionPassword = null;
|
|||
|
ApplicationMode = AppMode.Clear;
|
|||
|
|
|||
|
treeView1.Clear();
|
|||
|
|
|||
|
if (string.IsNullOrWhiteSpace(filename))
|
|||
|
{
|
|||
|
return Result.Create(false, "Filename is empty");
|
|||
|
}
|
|||
|
|
|||
|
if (!File.Exists(filename))
|
|||
|
{
|
|||
|
return Result.Create(false, "File not found");
|
|||
|
}
|
|||
|
|
|||
|
sessionFilename = filename;
|
|||
|
|
|||
|
SupportedFileBase fileHandler = GetSupportedFileHandler(sessionFilename);
|
|||
|
if (fileHandler == null)
|
|||
|
{
|
|||
|
return Result.Create(false, "Handler not found for this file type");
|
|||
|
}
|
|||
|
|
|||
|
if (fileHandler.IsEncrypted(sessionFilename))
|
|||
|
{
|
|||
|
PasswordForm passwordForm = new PasswordForm(this);
|
|||
|
if (passwordForm.ShowDialog() == DialogResult.OK)
|
|||
|
{
|
|||
|
sessionPassword = passwordForm.Password;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Result result = fileHandler.Load(treeView1, sessionFilename, sessionPassword);
|
|||
|
if (!result.IsSuccess)
|
|||
|
{
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
if (treeView1.Nodes.Count > 0)
|
|||
|
{
|
|||
|
ThreadControl.Expand(treeView1.Nodes[0]);
|
|||
|
}
|
|||
|
|
|||
|
ApplicationMode = AppMode.Open;
|
|||
|
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
protected async Task<Result> SaveFile(string filename, string password = null)
|
|||
|
{
|
|||
|
return await Task.Run(() =>
|
|||
|
{
|
|||
|
if (string.IsNullOrWhiteSpace(filename))
|
|||
|
{
|
|||
|
return Result.Create(false, "Filename is empty");
|
|||
|
}
|
|||
|
|
|||
|
SupportedFileBase fileHandler = GetSupportedFileHandler(filename);
|
|||
|
if (fileHandler == null)
|
|||
|
{
|
|||
|
return Result.Create(false, "Handler not found for this file type");
|
|||
|
}
|
|||
|
|
|||
|
Result result = fileHandler.Save(treeView1, filename, password);
|
|||
|
if (result.IsSuccess)
|
|||
|
{
|
|||
|
treeView1.SetNoChanges();
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
protected async Task<Result> SaveAsFile(string filename)
|
|||
|
{
|
|||
|
return await Task.Run(() =>
|
|||
|
{
|
|||
|
if (string.IsNullOrWhiteSpace(filename))
|
|||
|
{
|
|||
|
return Result.Create(false, "Filename is empty");
|
|||
|
}
|
|||
|
|
|||
|
SupportedFileBase fileHandler = GetSupportedFileHandler(filename);
|
|||
|
if (fileHandler == null)
|
|||
|
{
|
|||
|
return Result.Create(false, "Handler not found for this file type");
|
|||
|
}
|
|||
|
|
|||
|
string password = null;
|
|||
|
|
|||
|
if (fileHandler.IsEncryptionSupported)
|
|||
|
{
|
|||
|
PasswordForm passwordForm = new PasswordForm(this);
|
|||
|
if (passwordForm.ShowDialog() == DialogResult.OK)
|
|||
|
{
|
|||
|
if (!string.IsNullOrWhiteSpace(passwordForm.Password))
|
|||
|
{
|
|||
|
password = passwordForm.Password;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Result result = fileHandler.Save(treeView1, filename, password);
|
|||
|
if (result.IsSuccess)
|
|||
|
{
|
|||
|
treeView1.SetNoChanges();
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|