diff options
| author | MichaelTheShifter <[email protected]> | 2016-06-25 08:10:03 -0400 |
|---|---|---|
| committer | MichaelTheShifter <[email protected]> | 2016-06-25 08:10:03 -0400 |
| commit | 84f689b91a73e512b035df40bbcf556b008a3b81 (patch) | |
| tree | da1020b2b5866c7ce300ac7b9c97112fe80fa1b3 /source/WindowsFormsApplication1/Apps/File Skimmer.cs | |
| parent | 6707e2076a63dafab686fd533c95fb8ceb6c23fa (diff) | |
| download | shiftos-c--84f689b91a73e512b035df40bbcf556b008a3b81.tar.gz shiftos-c--84f689b91a73e512b035df40bbcf556b008a3b81.tar.bz2 shiftos-c--84f689b91a73e512b035df40bbcf556b008a3b81.zip | |
Sort source code into folders.
It feels better to know what's responsible for what... Plus I removed
some un-needed C# stuff.
Diffstat (limited to 'source/WindowsFormsApplication1/Apps/File Skimmer.cs')
| -rw-r--r-- | source/WindowsFormsApplication1/Apps/File Skimmer.cs | 602 |
1 files changed, 602 insertions, 0 deletions
diff --git a/source/WindowsFormsApplication1/Apps/File Skimmer.cs b/source/WindowsFormsApplication1/Apps/File Skimmer.cs new file mode 100644 index 0000000..4ee8531 --- /dev/null +++ b/source/WindowsFormsApplication1/Apps/File Skimmer.cs @@ -0,0 +1,602 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS +{ + public partial class File_Skimmer : Form + { + /// <summary> + /// Opens a file in the proper program. + /// </summary> + /// <param name="filepath">Path to the file.</param> + public void OpenFile(string filepath) + { + bool success = true; + FileInfo finf = new FileInfo(filepath); + switch(finf.Extension) + { + case ".saa": + if(API.Upgrades["shiftnet"] == true) + { + API.LaunchMod(finf.FullName); + } + else + { + success = false; + } + break; + case ".txt": + if (API.Upgrades["textpadopen"] == true) + { + var pad = new TextPad(); + pad.txtuserinput.Text = File.ReadAllText(finf.FullName); + API.CreateForm(pad, "TextPad", Properties.Resources.iconTextPad); + } else + { + success = false; + } + break; + case ".pkg": + case ".stp": + if (API.Upgrades["shiftnet"] == true) + { + API.CreateInfoboxSession("Package Installation", "Would you like to install the package?", infobox.InfoboxMode.YesNo); + API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + { + var result = API.GetInfoboxResult(); + if (result == "Yes") + { + try + { + var res = Package_Grabber.ExtractPackage(finf.FullName); + if (res == "fail") + { + throw new Exception("Michael was dumb and messed something up."); + } + else + { + Package_Grabber.InstallPackage(res + "\\"); + API.CreateInfoboxSession("Package Installer - Success", "The package has been installed successfully!", infobox.InfoboxMode.Info); + API.UpdateWindows(); + API.CurrentSession.SetupDesktop(); + } + } + catch (Exception ex) + { + if (API.DeveloperMode == true) + { + API.CreateInfoboxSession("Package Installer - Error", ex.Message, infobox.InfoboxMode.Info); + } + else + { + API.CreateInfoboxSession("Package Installer - Error", "An error has occurred while installing the package.", infobox.InfoboxMode.Info); + } + } + } + }; + } + else { + success = false; + } + break; + case ".skn": + if(API.Upgrades["skinning"] == true) + { + var loader = new SkinLoader(); + API.CreateForm(loader, API.LoadedNames.SkinLoaderName, Properties.Resources.iconSkinLoader); + loader.LoadSkin(finf.FullName); + } + else + { + success = false; + } + break; + case ".spk": + if (API.Upgrades["skinning"] == true) + { + var loader = new SkinLoader(); + loader.LoadedPack = finf.FullName; + API.CreateForm(loader, API.LoadedNames.SkinLoaderName, Properties.Resources.iconSkinLoader); + loader.SetupPackUI(); + } + else + { + success = false; + } + break; + default: + success = false; + break; + } + //If we made it this far and nothing happened, tell the user. + if(success == false) + { + API.CreateInfoboxSession("File Skimmer", "File Skimmer cannot find a program to open this file.", infobox.InfoboxMode.Info); + } + } + + /// <summary> + /// The File Skimmer. + /// </summary> + public File_Skimmer() + { + MountMgr.Init(); + InitializeComponent(); + } + + public File_Skimmer(FileSkimmerMode mode, string filters) + { + InitializeComponent(); + Mode = mode; + Filters = filters.Split(';'); + } + + public string CurrentFolder = Paths.SaveRoot; + + private void File_Skimmer_Load(object sender, EventArgs e) + { + SetupUI(); + ListFiles(); + lvfiles.DoubleClick += (object s, EventArgs a) => + { + if(lvfiles.SelectedItems.Count > 0) + { + var item = lvfiles.SelectedItems[0]; + string tag = (string)item.Tag; + if(Directory.Exists(tag)) + { + txtfilename.Text = new DirectoryInfo(tag).Name; + CurrentFolder = tag; + ListFiles(); + + } else + { + if(File.Exists(tag)) + { + if(Mode == FileSkimmerMode.Open) + { + FileInfo finf = new FileInfo(tag); + txtfilename.Text = finf.Name.Replace(finf.Extension, ""); + btnperformaction_Click(s, a); + } + else if(Mode == FileSkimmerMode.Default) + { + OpenFile(tag); + } + } else + { + if(tag == "_uponedir") + { + if (lbcurrentfolder.Text != "/") + { + if (MountPoint != null && lbcurrentfolder.Text == MountPoint.Replace("\\", "/")) + { + CurrentFolder = Paths.SaveRoot; + ListFiles(); + + } + else + { + CurrentFolder = Directory.GetParent(CurrentFolder).FullName; + ListFiles(); + } + } else + { + API.CreateInfoboxSession("Can't read directory", "File Skimmer is not able to read the requested directory as it is not formatted with the ShiftFS file system.", infobox.InfoboxMode.Info); + } + } + else if(tag.StartsWith("drv:")) + { + string drivepath = tag.Remove(0, 4); + CurrentFolder = drivepath; + MountPoint = drivepath; + ListFiles(); + } + } + } + } + }; + + txtfilename.KeyDown += (object s, KeyEventArgs a) => + { + if (a.KeyCode == Keys.Enter) + { + a.SuppressKeyPress = true; + btnperformaction_Click(s, (EventArgs)a); + } + }; + } + + string MountPoint = null; + + /// <summary> + /// Lists all the files in the current folder. + /// </summary> + public void ListFiles() + { + MountMgr.Init(); + SetupImages(); + txtfilename.Text = ""; + //SetupUI(); + newFolderToolStripMenuItem.Visible = API.Upgrades["fsnewfolder"]; + deleteToolStripMenuItem.Visible = API.Upgrades["fsdelete"]; + if(newFolderToolStripMenuItem.Visible == false && deleteToolStripMenuItem.Visible == false) + { + menuStrip1.Hide(); + } else + { + menuStrip1.Show(); + } + lbcurrentfolder.Text = CurrentFolder.Replace(Paths.SaveRoot, "/").Replace("\\", "/").Replace("//", "/"); + lvfiles.Items.Clear(); + lvfiles.LargeImageList = imgtypes; + ListViewItem upone = new ListViewItem(); + upone.Text = "Up One Level"; + upone.Tag = "_uponedir"; + upone.ImageKey = "directory"; + lvfiles.Items.Add(upone); + if(CurrentFolder == Paths.SaveRoot) + { + foreach(var drive in MountMgr.links) + { + var dinf = new DirectoryInfo(drive.Key); + var item = new ListViewItem(); + item.Text = drive.Value; + item.Tag = "drv:" + dinf.FullName; + lvfiles.Items.Add(item); + item.ImageKey = "directory"; + } + } + foreach (string dir in Directory.GetDirectories(CurrentFolder)) + { + var dirinf = new DirectoryInfo(dir); + ListViewItem lvitem = new ListViewItem(); + lvitem.Text = dirinf.Name; + lvitem.Tag = dirinf.FullName; + lvitem.ImageKey = "directory"; + if (!dirinf.Name.StartsWith("_")) + { + lvfiles.Items.Add(lvitem); + } + else { + if (API.DeveloperMode == true) + { + lvfiles.Items.Add(lvitem); + } + } + } + foreach (string file in Directory.GetFiles(CurrentFolder)) + { + var dirinf = new FileInfo(file); + ListViewItem lvitem = new ListViewItem(); + lvitem.Text = dirinf.Name; + lvitem.Tag = dirinf.FullName; + lvitem.ImageKey = GetFileType(dirinf.Extension); + if (!dirinf.Name.StartsWith("_")) + { + AddItem(lvitem); + } + else { + if (API.DeveloperMode == true) + { + AddItem(lvitem); + } + } + } + + } + + public FileSkimmerMode Mode = FileSkimmerMode.Default; + public string FileName = ""; + private string[] Filters = null; + + /// <summary> + /// Sets up the user interface. + /// </summary> + private void SetupUI() + { + switch(Mode) + { + case FileSkimmerMode.Default: + Filters = null; + this.toolStrip2.Hide(); + break; + case FileSkimmerMode.Open: + this.toolStrip2.Show(); + this.btnperformaction.Text = "Open"; + cbfiletypes.Items.Clear(); + foreach (string filter in Filters) + { + cbfiletypes.Items.Add(filter); + } + selectedFilter = Filters[0]; + cbfiletypes.Text = Filters[0]; + break; + case FileSkimmerMode.Save: + this.toolStrip2.Show(); + this.btnperformaction.Text = "Save"; + cbfiletypes.Items.Clear(); + foreach (string filter in Filters) + { + cbfiletypes.Items.Add(filter); + } + selectedFilter = Filters[0]; + cbfiletypes.Text = Filters[0]; + break; + case FileSkimmerMode.OpenFolder: + this.toolStrip2.Show(); + this.btnperformaction.Text = "Open"; + cbfiletypes.Visible = false; + selectedFilter = "dir"; + break; + } + } + + /// <summary> + /// UI mode. + /// </summary> + public enum FileSkimmerMode + { + Default, + Open, + Save, + OpenFolder + } + + /// <summary> + /// Adds an item to the file list. + /// </summary> + /// <param name="item">Item to add.</param> + private void AddItem(ListViewItem item) + { + if (Mode == FileSkimmerMode.Default) + { + lvfiles.Items.Add(item); + } else if(Mode == FileSkimmerMode.OpenFolder) { + if (Directory.Exists(item.Tag.ToString())) + { + lvfiles.Items.Add(item); + } + } else + { + if (item.Text.ToLower().EndsWith(selectedFilter.ToLower())) + { + lvfiles.Items.Add(item); + } + } + } + + /// <summary> + /// Adds appropriate icons from icon registry to display files. + /// </summary> + public void SetupImages() + { + imgtypes.Images.Clear(); + imgtypes.Images.Add("application", API.GetIcon("SAAFile")); + imgtypes.Images.Add("directory", API.GetIcon("Folder")); + imgtypes.Images.Add("doc", API.GetIcon("TextFile")); + imgtypes.Images.Add("skin", API.GetIcon("SkinFile")); + imgtypes.Images.Add("package", API.GetIcon("SetupPackage")); + imgtypes.Images.Add("none", API.GetIcon("UnrecognizedFile")); + } + + /// <summary> + /// Returns proper file ID based on extension + /// </summary> + /// <param name="extension">Extension to test.</param> + /// <returns>The File ID.</returns> + public string GetFileType(string extension) + { + SetupImages(); + switch(extension) + { + case ".owd": + case ".doc": + case ".docx": + case ".txt": + return "doc"; + case ".exe": + case ".saa": + return "application"; + case ".stp": + case ".pkg": + case ".mod": + return "package"; + case ".skn": + case ".spk": + return "skin"; + default: + return "none"; + } + } + + private void newFolderToolStripMenuItem_Click(object sender, EventArgs e) + { + API.CreateInfoboxSession("Create New Folder", "Please enter the name of the folder.", infobox.InfoboxMode.TextEntry); + API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + { + string dname = API.GetInfoboxResult(); + if (dname != "" && dname != "Cancelled") + { + string dirsepchar = ""; + switch (OSInfo.GetPlatformID()) + { + case "microsoft": + dirsepchar = "\\"; + break; + default: + dirsepchar = "/"; + break; + } + if (dname.Contains("/") || dname.Contains("\\")) + { + API.CreateInfoboxSession("Error", "Directories cannot have '\\' or '/' in their names!", infobox.InfoboxMode.Info); + } + else { + string fullname = CurrentFolder + dirsepchar + dname; + try + { + if (!Directory.Exists(fullname)) + { + Directory.CreateDirectory(fullname); + } + } + catch + { + API.CreateInfoboxSession("Error", "File Skimmer could not create the directory.", infobox.InfoboxMode.Info); + } + } + } + ListFiles(); + }; + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + string res = "nothing"; + if(lvfiles.SelectedItems.Count > 0) + { + var lvitem = lvfiles.SelectedItems[0]; + string lvtag = (string)lvitem.Tag; + switch(lvtag) + { + + case "_upOne": + res = "up"; + break; + default: + if(Directory.Exists(lvtag)) + { + res = "dir"; + } else + { + if(File.Exists(lvtag)) + { + res = "file"; + } + } + break; + } + switch(res) + { + case "file": + API.CreateInfoboxSession("Delete File", "Are you sure you want to delete this file?", infobox.InfoboxMode.YesNo); + API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + { + if(API.GetInfoboxResult() == "Yes") + { + File.Delete(lvtag); + ListFiles(); + } + }; + break; + case "dir": + var fname = lvtag; + if(CheckTag(fname) == true) + { + API.CreateInfoboxSession("Permission denied", "You cannot delete this directory as you are denied permission.", infobox.InfoboxMode.Info); + } + else + { + API.CreateInfoboxSession("Delete Folder", "Are you sure you want to delete this folder? Everything inside it will be permanently lost!", infobox.InfoboxMode.YesNo); + API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + { + if (API.GetInfoboxResult() == "Yes") + { + Directory.Delete(lvtag, true); + ListFiles(); + } + }; + } + break; + case "up": + API.CreateInfoboxSession("File Skimmer", "You cannot delete the 'Up One Level' file because it is not a real file.", infobox.InfoboxMode.Info); + break; + } + } + } + + /// <summary> + /// No idea what this does but it seems to be needed so don't touch it. + /// </summary> + /// <param name="fullpath">Path to a file.</param> + /// <returns>Oh NOW I know what this does. It returns whether this file can be deleted or if it's a vital save file.</returns> + private bool CheckTag(string fullpath) + { + var correct = fullpath + OSInfo.DirectorySeparator; + if (correct == Paths.SystemDir || correct == Paths.Applications || correct == Paths.Skins || correct == Paths.ToBeLoaded || correct == Paths.LoadedSkin || correct == Paths.SoftwareData || correct == Paths.Drivers || correct == Paths.Mod_AppLauncherEntries || correct == Paths.Mod_Temp) + { + return true; + } + else + { + return false; + } + } + + private string selectedFilter = null; + + private void cbfiletypes_SelectedIndexChanged(object sender, EventArgs e) + { + selectedFilter = (string)cbfiletypes.SelectedItem; + ListFiles(); + } + + private void btnperformaction_Click(object sender, EventArgs e) + { + if (txtfilename.Text != "") + { + string dirsepchar = "\\"; + switch (OSInfo.GetPlatformID()) + { + case "microsoft": + dirsepchar = "\\"; + break; + default: + dirsepchar = "/"; + break; + } + string fullPath = null; + if (Mode == FileSkimmerMode.OpenFolder) + { + fullPath = CurrentFolder + dirsepchar + txtfilename.Text; + } + else { + fullPath = CurrentFolder + dirsepchar + txtfilename.Text.Replace(selectedFilter, "") + selectedFilter; + } + FileName = fullPath; + this.Close(); + } + } + + private void btncancel_Click(object sender, EventArgs e) + { + FileName = ""; + this.Close(); + } + + private void lvfiles_SelectedIndexChanged(object sender, EventArgs e) + { + try + { + var itm = lvfiles.SelectedItems[0]; + if(File.Exists(itm.Tag.ToString())) + { + txtfilename.Text = itm.Text; + } + } + catch + { + + } + } + } +} |
