Files
Aaru/Aaru.Gui/Forms/frmMain.xeto.cs

321 lines
11 KiB
C#
Raw Normal View History

2018-08-27 18:29:55 +01:00
// /***************************************************************************
2020-02-27 12:31:25 +00:00
// Aaru Data Preservation Suite
2018-08-27 18:29:55 +01:00
// ----------------------------------------------------------------------------
//
// Filename : frmMain.xeto.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Main window.
//
// --[ Description ] ----------------------------------------------------------
//
// Implements main GUI window.
//
// --[ License ] --------------------------------------------------------------
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General public License for more details.
//
// You should have received a copy of the GNU General public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
2020-01-03 17:51:30 +00:00
// Copyright © 2011-2020 Natalia Portillo
2018-08-27 18:29:55 +01:00
// ****************************************************************************/
2018-08-28 23:29:06 +01:00
2018-08-27 15:07:51 +01:00
using System;
2018-08-27 18:25:11 +01:00
using System.ComponentModel;
using System.IO;
2020-02-27 00:33:26 +00:00
using Aaru.Console;
using Aaru.Core;
using Aaru.Core.Media.Info;
using Aaru.Devices;
2020-02-29 18:03:35 +00:00
using Aaru.Gui.Panels;
2018-10-07 23:29:28 +01:00
using Eto.Drawing;
2018-08-27 15:07:51 +01:00
using Eto.Forms;
using Eto.Serialization.Xaml;
2020-02-27 00:33:26 +00:00
namespace Aaru.Gui.Forms
2018-08-27 15:07:51 +01:00
{
public class frmMain : Form
{
2019-12-07 19:54:27 +00:00
readonly Bitmap devicesIcon;
readonly Bitmap ejectIcon;
readonly Bitmap hardDiskIcon;
readonly Bitmap imagesIcon;
readonly Label lblError;
/// <summary>This is to remember that column is an image to be set in future</summary>
readonly Image nullImage;
readonly Bitmap opticalIcon;
readonly TreeGridItem placeholderItem;
readonly Bitmap removableIcon;
readonly Bitmap sdIcon;
readonly Bitmap tapeIcon;
readonly TreeGridItemCollection treeImagesItems;
readonly ContextMenu treeImagesMenu;
readonly Bitmap usbIcon;
2020-01-03 18:13:57 +00:00
bool closing;
GridView grdFiles;
TreeGridView treeImages;
2018-08-27 15:07:51 +01:00
2018-08-27 18:25:11 +01:00
public frmMain(bool debug, bool verbose)
2018-08-27 15:07:51 +01:00
{
XamlReader.Load(this);
2018-10-07 23:29:28 +01:00
lblError = new Label();
grdFiles = new GridView();
nullImage = null;
2018-09-02 01:41:03 +01:00
2018-08-27 18:25:11 +01:00
ConsoleHandler.Init();
ConsoleHandler.Debug = debug;
ConsoleHandler.Verbose = verbose;
2018-08-27 15:07:51 +01:00
treeImagesItems = new TreeGridItemCollection();
2019-12-07 19:54:27 +00:00
treeImages.Columns.Add(new GridColumn
{
HeaderText = "Name", DataCell = new ImageTextCell(0, 1)
});
2018-08-27 15:07:51 +01:00
treeImages.AllowMultipleSelection = false;
treeImages.ShowHeader = false;
treeImages.DataStore = treeImagesItems;
2018-10-08 00:14:03 +01:00
// TODO: SVG
imagesIcon =
2019-12-07 19:54:27 +00:00
new Bitmap(ResourceHandler.
2020-02-27 13:57:32 +00:00
GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.inode-directory.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
devicesIcon =
2020-02-29 18:03:35 +00:00
new Bitmap(ResourceHandler.GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.computer.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
hardDiskIcon =
2020-02-29 18:03:35 +00:00
new Bitmap(ResourceHandler.GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.drive-harddisk.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
opticalIcon =
2020-02-29 18:03:35 +00:00
new Bitmap(ResourceHandler.GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.drive-optical.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
usbIcon =
2019-12-07 19:54:27 +00:00
new Bitmap(ResourceHandler.
2020-02-27 13:57:32 +00:00
GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.drive-removable-media-usb.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
removableIcon =
2019-12-07 19:54:27 +00:00
new Bitmap(ResourceHandler.
2020-02-27 13:57:32 +00:00
GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.drive-removable-media.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
sdIcon =
2019-12-07 19:54:27 +00:00
new Bitmap(ResourceHandler.
2020-02-27 13:57:32 +00:00
GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.media-flash-sd-mmc.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
tapeIcon =
2020-02-29 18:03:35 +00:00
new Bitmap(ResourceHandler.GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.media-tape.png"));
2019-12-07 19:54:27 +00:00
2018-10-08 00:14:03 +01:00
ejectIcon =
2020-02-29 18:03:35 +00:00
new Bitmap(ResourceHandler.GetResourceStream("Aaru.Gui.Assets.Icons.oxygen._32x32.media-eject.png"));
2019-12-07 19:54:27 +00:00
imagesRoot = new TreeGridItem
{
Values = new object[]
{
imagesIcon, "Images"
}
};
2018-10-08 00:14:03 +01:00
2019-12-07 19:54:27 +00:00
devicesRoot = new TreeGridItem
{
Values = new object[]
{
devicesIcon, "Devices"
}
};
2018-08-27 15:07:51 +01:00
treeImagesItems.Add(imagesRoot);
treeImagesItems.Add(devicesRoot);
2018-08-27 18:25:11 +01:00
2019-12-07 19:54:27 +00:00
placeholderItem = new TreeGridItem
{
Values = new object[]
{
nullImage, "You should not be seeing this"
}
};
2018-09-06 22:27:58 +01:00
2018-08-27 18:25:11 +01:00
Closing += OnClosing;
2018-11-17 00:06:50 +00:00
treeImagesMenu = new ContextMenu();
treeImagesMenu.Opening += OnTreeImagesMenuOpening;
treeImages.ContextMenu = treeImagesMenu;
}
void OnTreeImagesMenuOpening(object sender, EventArgs e)
{
OnTreeImagesSelectedItemChanged(treeImages, e);
treeImagesMenu.Items.Clear();
2019-12-07 19:54:27 +00:00
var menuItem = new ButtonMenuItem
{
Text = "Close all images"
};
2018-11-17 00:06:50 +00:00
menuItem.Click += CloseAllImages;
treeImagesMenu.Items.Add(menuItem);
2019-12-07 19:54:27 +00:00
menuItem = new ButtonMenuItem
{
Text = "Refresh devices"
};
// menuItem.Click += OnDeviceRefresh;
2018-11-17 00:06:50 +00:00
treeImagesMenu.Items.Add(menuItem);
2019-12-07 19:54:27 +00:00
if(!(treeImages.SelectedItem is TreeGridItem selectedItem))
return;
2018-11-17 00:06:50 +00:00
2019-12-07 19:54:27 +00:00
if(selectedItem.Values.Length < 4)
return;
2018-11-17 00:06:50 +00:00
}
2019-12-07 19:54:27 +00:00
// TODO
void CloseAllImages(object sender, EventArgs eventArgs) => Eto.Forms.MessageBox.Show("Not yet implemented");
2018-08-27 18:25:11 +01:00
void OnClosing(object sender, CancelEventArgs e)
{
// This prevents an infinite loop of crashes :p
2019-12-07 19:54:27 +00:00
if(closing)
return;
2018-08-27 18:25:11 +01:00
closing = true;
Application.Instance.Quit();
2018-08-27 15:07:51 +01:00
}
2018-09-02 01:41:03 +01:00
protected void OnTreeImagesSelectedItemChanged(object sender, EventArgs e)
{
2019-12-07 19:54:27 +00:00
if(!(sender is TreeGridView tree))
return;
2018-09-02 01:41:03 +01:00
2019-12-07 19:54:27 +00:00
if(!(tree.SelectedItem is TreeGridItem selectedItem))
return;
2018-09-02 01:41:03 +01:00
splMain.Panel2 = null;
2019-12-07 19:54:27 +00:00
if(selectedItem.Values.Length >= 4 &&
selectedItem.Values[3] is Panel infoPanel)
2018-09-09 01:00:54 +01:00
{
splMain.Panel2 = infoPanel;
2019-12-07 19:54:27 +00:00
2018-09-09 01:00:54 +01:00
return;
}
2019-12-07 19:54:27 +00:00
if(selectedItem.Values.Length < 4)
return;
2018-09-02 01:41:03 +01:00
2018-10-07 23:29:28 +01:00
switch(selectedItem.Values[3])
2018-09-02 01:41:03 +01:00
{
2018-10-24 23:16:45 +01:00
case string devErrorMessage when selectedItem.Parent == devicesRoot:
2018-09-02 01:41:03 +01:00
lblError.Text = devErrorMessage;
splMain.Panel2 = lblError;
2019-12-07 19:54:27 +00:00
2019-04-19 14:55:31 +01:00
break;
2018-09-02 01:41:03 +01:00
}
}
2018-09-06 22:27:58 +01:00
protected void OnTreeImagesItemExpanding(object sender, TreeGridViewItemCancelEventArgs e)
{
// First expansion of a device
2018-10-24 23:16:45 +01:00
if((e.Item as TreeGridItem)?.Children?.Count != 1 ||
2019-12-07 19:54:27 +00:00
((TreeGridItem)e.Item).Children[0] != placeholderItem)
return;
2018-10-24 23:16:45 +01:00
if(((TreeGridItem)e.Item).Parent == devicesRoot)
2018-09-06 22:27:58 +01:00
{
2019-12-07 19:54:27 +00:00
var deviceItem = (TreeGridItem)e.Item;
2018-09-06 22:27:58 +01:00
deviceItem.Children.Clear();
Device dev;
2019-12-07 19:54:27 +00:00
2018-09-06 22:27:58 +01:00
try
{
2018-10-07 23:29:28 +01:00
dev = new Device((string)deviceItem.Values[2]);
2019-12-07 19:54:27 +00:00
if(dev.IsRemote)
Statistics.AddRemote(dev.RemoteApplication, dev.RemoteVersion, dev.RemoteOperatingSystem,
dev.RemoteOperatingSystemVersion, dev.RemoteArchitecture);
2018-09-06 22:27:58 +01:00
if(dev.Error)
{
2018-10-07 23:29:28 +01:00
deviceItem.Values[3] = $"Error {dev.LastError} opening device";
2018-09-06 22:27:58 +01:00
e.Cancel = true;
treeImages.ReloadData();
treeImages.SelectedItem = deviceItem;
2019-12-07 19:54:27 +00:00
2018-09-06 22:27:58 +01:00
return;
}
}
catch(SystemException ex)
{
2018-10-07 23:29:28 +01:00
deviceItem.Values[3] = ex.Message;
2018-09-06 22:27:58 +01:00
e.Cancel = true;
treeImages.ReloadData();
2020-02-27 23:48:41 +00:00
AaruConsole.ErrorWriteLine(ex.Message);
2018-09-06 22:27:58 +01:00
treeImages.SelectedItem = deviceItem;
2019-12-07 19:54:27 +00:00
2018-09-06 22:27:58 +01:00
return;
}
if(!dev.IsRemovable)
deviceItem.Children.Add(new TreeGridItem
{
Values = new object[]
{
2019-12-07 19:54:27 +00:00
nullImage, "Non-removable device commands not yet implemented"
2018-09-06 22:27:58 +01:00
}
});
else
2018-09-09 01:00:54 +01:00
{
// TODO: Removable non-SCSI?
2019-12-07 19:54:27 +00:00
var scsiInfo = new ScsiInfo(dev);
2018-09-09 01:00:54 +01:00
if(!scsiInfo.MediaInserted)
2018-10-07 23:29:28 +01:00
deviceItem.Children.Add(new TreeGridItem
{
2019-12-07 19:54:27 +00:00
Values = new object[]
{
ejectIcon, "No media inserted"
}
2018-10-07 23:29:28 +01:00
});
2018-09-09 01:00:54 +01:00
else
2018-10-07 23:29:28 +01:00
{
// TODO: SVG
Stream logo =
2020-02-29 18:03:35 +00:00
ResourceHandler.GetResourceStream($"Aaru.Gui.Assets.Logos.Media.{scsiInfo.MediaType}.png");
2018-10-07 23:29:28 +01:00
2018-09-09 01:00:54 +01:00
deviceItem.Children.Add(new TreeGridItem
2018-09-06 22:27:58 +01:00
{
2018-09-09 01:00:54 +01:00
Values = new[]
{
2019-12-07 19:54:27 +00:00
logo == null ? null : new Bitmap(logo), scsiInfo.MediaType, deviceItem.Values[2],
2018-10-07 23:29:28 +01:00
new pnlScsiInfo(scsiInfo, (string)deviceItem.Values[2])
2018-09-09 01:00:54 +01:00
}
});
2018-10-07 23:29:28 +01:00
}
2018-09-09 01:00:54 +01:00
}
2018-09-06 22:27:58 +01:00
dev.Close();
}
}
2018-08-27 15:07:51 +01:00
#region XAML IDs
2019-12-07 19:54:27 +00:00
readonly TreeGridItem devicesRoot;
readonly TreeGridItem imagesRoot;
Splitter splMain;
2018-08-27 15:07:51 +01:00
#endregion
}
}