From 011785041e6a04892657996f31cbc752676b6b98 Mon Sep 17 00:00:00 2001 From: Nicholas Omann Date: Mon, 15 Jul 2019 18:54:32 -0700 Subject: [PATCH] beta 2 checkin --- AVM.csproj | 9 + Properties/Settings.Designer.cs | 54 +- Properties/Settings.settings | 25 +- app.config | 25 +- src/AboutBox.cs | 4 +- src/AboutBox.resx | 970 ++++++++++++++--------------- src/Database.cs | 368 +++++++---- src/DeleteConfirmation.Designer.cs | 102 +++ src/DeleteConfirmation.cs | 38 ++ src/DeleteConfirmation.resx | 120 ++++ src/GroupEditor.cs | 4 +- src/Importer.cs | 4 +- src/NodeEditor.Designer.cs | 2 +- src/NodeEditor.cs | 4 +- src/NodeViewer.cs | 27 +- src/Parsers/BackupParser.cs | 4 +- src/Parsers/FolderParser.cs | 4 +- src/Parsers/HuluParser.cs | 4 +- src/Parsers/YouTubeParser.cs | 4 +- src/Program.cs | 27 +- src/Settings.Designer.cs | 121 +++- src/Settings.cs | 37 +- src/Settings.resx | 3 + src/Types/EpisodeInfo.cs | 4 +- src/Types/FileData.cs | 4 +- src/Types/Group.cs | 4 +- src/Types/Node.cs | 4 +- src/WebPlayer.Designer.cs | 1 + src/WebPlayer.cs | 17 +- src/mainForm.Designer.cs | 67 +- src/mainForm.cs | 313 ++++++---- 31 files changed, 1550 insertions(+), 824 deletions(-) create mode 100644 src/DeleteConfirmation.Designer.cs create mode 100644 src/DeleteConfirmation.cs create mode 100644 src/DeleteConfirmation.resx diff --git a/AVM.csproj b/AVM.csproj index 747e311..feb9e34 100644 --- a/AVM.csproj +++ b/AVM.csproj @@ -57,6 +57,12 @@ + + Form + + + DeleteConfirmation.cs + Form @@ -112,6 +118,9 @@ + + DeleteConfirmation.cs + NodeEditor.cs Designer diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index 51cd8ef..b24eda6 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 +// Runtime Version:2.0.50727.3521 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -289,7 +289,7 @@ public string TimesPlayedColumnLabel { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("190")] + [global::System.Configuration.DefaultSettingValueAttribute("100")] public int NameColumnWidth { get { return ((int)(this["NameColumnWidth"])); @@ -301,7 +301,7 @@ public int NameColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("150")] public int EpisodeNameColumnWidth { get { return ((int)(this["EpisodeNameColumnWidth"])); @@ -313,7 +313,7 @@ public int EpisodeNameColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("50")] public int SeasonNumberColumnWidth { get { return ((int)(this["SeasonNumberColumnWidth"])); @@ -325,7 +325,7 @@ public int SeasonNumberColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("30")] public int EpisodeNumberColumnWidth { get { return ((int)(this["EpisodeNumberColumnWidth"])); @@ -337,7 +337,7 @@ public int EpisodeNumberColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("55")] public int VideoCodecColumnWidth { get { return ((int)(this["VideoCodecColumnWidth"])); @@ -349,7 +349,7 @@ public int VideoCodecColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("55")] public int AudioCodecColumnWidth { get { return ((int)(this["AudioCodecColumnWidth"])); @@ -361,7 +361,7 @@ public int AudioCodecColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("55")] public int ContainerColumnWidth { get { return ((int)(this["ContainerColumnWidth"])); @@ -373,7 +373,7 @@ public int ContainerColumnWidth { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("10")] + [global::System.Configuration.DefaultSettingValueAttribute("55")] public int TimesPlayedColumnWidth { get { return ((int)(this["TimesPlayedColumnWidth"])); @@ -417,5 +417,41 @@ public string MoreInfoService { this["MoreInfoService"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool PromptOnDelete { + get { + return ((bool)(this["PromptOnDelete"])); + } + set { + this["PromptOnDelete"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool DoubleClickPlay { + get { + return ((bool)(this["DoubleClickPlay"])); + } + set { + this["DoubleClickPlay"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool BackspaceDelete { + get { + return ((bool)(this["BackspaceDelete"])); + } + set { + this["BackspaceDelete"] = value; + } + } } } diff --git a/Properties/Settings.settings b/Properties/Settings.settings index 8d8b0f2..eedbb24 100644 --- a/Properties/Settings.settings +++ b/Properties/Settings.settings @@ -69,28 +69,28 @@ Played - 190 + 100 - 10 + 150 - 10 + 50 - 10 + 30 - 10 + 55 - 10 + 55 - 10 + 55 - 10 + 55 4 @@ -101,5 +101,14 @@ imdb + + True + + + False + + + False + \ No newline at end of file diff --git a/app.config b/app.config index 98e965b..1d6a43f 100644 --- a/app.config +++ b/app.config @@ -86,28 +86,28 @@ Played - 190 + 100 - 10 + 150 - 10 + 50 - 10 + 30 - 10 + 55 - 10 + 55 - 10 + 55 - 10 + 55 4 @@ -115,6 +115,15 @@ imdb + + True + + + False + + + False + diff --git a/src/AboutBox.cs b/src/AboutBox.cs index 7e7b5e2..1cd8f4d 100644 --- a/src/AboutBox.cs +++ b/src/AboutBox.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/AboutBox.resx b/src/AboutBox.resx index 3b8d559..f1bda5c 100644 --- a/src/AboutBox.resx +++ b/src/AboutBox.resx @@ -120,491 +120,491 @@ - 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 - gg== + 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 \ No newline at end of file diff --git a/src/Database.cs b/src/Database.cs index c8ee81c..839c13a 100644 --- a/src/Database.cs +++ b/src/Database.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation @@ -38,12 +38,21 @@ public class Database private long parentOfCurrentGroup = 0; private long currentGroup = 0; + #region Properties + /// + /// This is used to set or get the parent of the CurrentGroup. + /// public long ParentGroup { get { return parentOfCurrentGroup; } set { parentOfCurrentGroup = value; } } - + + /// + /// This is used to set or get the Current group being used by + /// the SQLite database. If it is set it will automatically + /// change the ParentGroup. + /// public long CurrentGroup { get { return currentGroup; } @@ -69,8 +78,15 @@ public long CurrentGroup parentOfCurrentGroup = 0; } } + #endregion - public Database(string databasePath) + #region Constructors + /// + /// This creates a Database at the path sent via databasePath. + /// If it doesn't exist then it will create it. + /// + /// This is the path to the SQLite database + public Database(string databasePath) { if (!System.IO.File.Exists(databasePath)) { @@ -120,13 +136,14 @@ public Database(string databasePath) dbBuilder.DataSource = databasePath; _database = new SQLiteConnection(dbBuilder.ConnectionString); _databasePath = databasePath; - } + } + #endregion - // GROUP DATABASE FUNCTIONS + #region Group Functions /// /// Fills listBox with the group that is currently selected. /// - /// + /// ListBox to be filled with groups. public void refreshGroups(System.Windows.Forms.ListBox listBox) { _database.Open(); @@ -150,14 +167,19 @@ public void refreshGroups(System.Windows.Forms.ListBox listBox) _database.Close(); } - public List getGroups(int groupID) + /// + /// Returns a List of all the groups inside the specified group. + /// + /// The id of the base group. + /// + public List getGroups(int groupId) { List list = new List(); _database.Open(); SQLiteTransaction trans = _database.BeginTransaction(); SQLiteCommand command = new SQLiteCommand( "SELECT name, group_id FROM groups " + - "WHERE parent_id = " + groupID + + "WHERE parent_id = " + groupId + " AND group_id > 0;", _database, trans); SQLiteDataReader reader = command.ExecuteReader(); @@ -174,6 +196,10 @@ public void refreshGroups(System.Windows.Forms.ListBox listBox) return list; } + /// + /// Returns a List of all the groups in the database. + /// + /// public List getAllGroups() { List list = new List(); @@ -198,7 +224,7 @@ public void refreshGroups(System.Windows.Forms.ListBox listBox) /// This will clear and populate a ComboBox with the Groups /// that are in the current ParentGroup. /// - /// + /// ComboBox to be populated. public void refreshComboBoxGroups(System.Windows.Forms.ComboBox comboBox) { _database.Open(); @@ -225,8 +251,8 @@ public void refreshComboBoxGroups(System.Windows.Forms.ComboBox comboBox) /// /// Fills listBox with the groups found using the passed in query string. /// - /// - /// + /// ListBox to be filled. + /// Serach string. public void searchGroups(System.Windows.Forms.ListBox listBox, string query) { @@ -251,6 +277,10 @@ public void searchGroups(System.Windows.Forms.ListBox listBox, _database.Close(); } + /// + /// Takes a List of groups and fills the database with them. + /// + /// List of groups to fill database with. public void fillGroups(List groups) { _database.Open(); @@ -272,7 +302,6 @@ public void fillGroups(List groups) adapter.InsertCommand.Transaction = trans; adapter.InsertCommand.ExecuteNonQuery(); - } trans.Commit(); @@ -280,10 +309,10 @@ public void fillGroups(List groups) } /// - /// This will add a group using the name provovided as its name + /// This will add a group using the name provided as its name /// and the current group as its parent. /// - /// + /// Name of the new group. public void addGroup(string name) { _database.Open(); @@ -301,8 +330,8 @@ public void addGroup(string name) /// /// Renames the group passed in from the database using the string that is passed in. /// - /// - /// + /// The group that is being renamed. + /// The new name for the group. public void renameGroup(AVM.Types.Group group, string newName) { @@ -319,13 +348,13 @@ public void renameGroup(AVM.Types.Group group, } /// - /// This function will recursivly delete a whole group, - /// its nodes and sub-groups.NOTE: This requires an open - /// transaction and needs to be commited or rolledback + /// This function will recursively delete a whole group, + /// its nodes and sub-groups. NOTE: This requires an open + /// transaction and needs to be committed or rolled back /// after. /// - /// - /// + /// The group you want to remove. + /// The current running transation. private void recursiveRemoveGroup(AVM.Types.Group group, SQLiteTransaction trans) { @@ -356,6 +385,80 @@ private void recursiveRemoveGroup(AVM.Types.Group group, reader.Close(); } + /// + /// Remove the group sent to the function from the database. + /// + /// The group to be removed. + public void removeGroup(AVM.Types.Group group) + { + _database.Open(); + SQLiteTransaction trans = _database.BeginTransaction(); + SQLiteCommand command = new SQLiteCommand( + "DELETE FROM groups " + + "WHERE group_id = " + group.Id + + " AND parent_id = " + group.ParentId + + " AND name = '" + group.Name + "';", + _database, trans); + command.ExecuteNonQuery(); + + // Delete sub-nodes + command = new SQLiteCommand( + "SELECT FROM nodes " + + "WHERE parent_group_id = " + group.Id + ";", + _database, trans); + //FINISH + trans.Commit(); + _database.Close(); + } + + /// + /// Returns the last group id which is also the largest. + /// + /// + public long getLastGroupId() + { + long last_id; + + _database.Open(); + SQLiteTransaction trans = _database.BeginTransaction(); + SQLiteCommand command = new SQLiteCommand( + "SELECT max(group_id) FROM groups;", + _database, trans); + SQLiteDataReader reader = command.ExecuteReader(); + reader.Read(); + last_id = reader.GetInt64(0); + _database.Close(); + + return last_id; + } + + /// + /// This moves the current group back to its parent. + /// + public void gotoParent() + { + if (parentOfCurrentGroup != 0) + { + _database.Open(); + SQLiteTransaction trans = _database.BeginTransaction(); + SQLiteCommand command = new SQLiteCommand( + "SELECT parent_id FROM groups " + + "WHERE group_id = " + parentOfCurrentGroup + ";", _database, trans); + SQLiteDataReader reader = command.ExecuteReader(); + reader.Read(); + parentOfCurrentGroup = reader.GetInt16(0); + reader.Close(); + trans.Rollback(); + _database.Close(); + } + } + #endregion + + #region Node Functions + /// + /// This function returns a List of all the nodes in the database. + /// + /// public List getAllNodes() { List list = new List(); @@ -417,13 +520,13 @@ private void recursiveRemoveGroup(AVM.Types.Group group, /// /// This will return a List of Nodes that are in the group /// specified by groupId. NOTE: This requires an open transaction - /// and needs to be commited or rolledback after. + /// and needs to be committed or rolled back after. /// - /// - /// + /// The id of the group to select nodes from. + /// The current transaction that is to be used. /// private List selectNodesInGroup(long groupId, - SQLiteTransaction trans) + SQLiteTransaction trans) { List tempList = new List(); SQLiteCommand command = new SQLiteCommand("SELECT * FROM nodes " + @@ -483,7 +586,7 @@ private void recursiveRemoveGroup(AVM.Types.Group group, /// /// This will remove all Nodes from the groupId sent in. /// NOTE: This requires an open transaction and needs to - /// be commited or rolledback after. + /// be committed or rolled back after. /// /// /// @@ -495,47 +598,11 @@ private void removeNodesFromGroup(long groupId, foreach (AVM.Types.Node node in nodeList) removeSingleNode(node, trans); } - - public void removeGroup(AVM.Types.Group group) - { - _database.Open(); - SQLiteTransaction trans = _database.BeginTransaction(); - SQLiteCommand command = new SQLiteCommand( - "DELETE FROM groups " + - "WHERE group_id = " + group.Id + - " AND parent_id = " + group.ParentId + - " AND name = '" + group.Name + "';", - _database, trans); - command.ExecuteNonQuery(); - - // Delete sub-nodes - command = new SQLiteCommand( - "SELECT FROM nodes " + - "WHERE parent_group_id = " + group.Id + ";", - _database, trans); - //FINISH - trans.Commit(); - _database.Close(); - } - - public void gotoParent() - { - if (parentOfCurrentGroup != 0) - { - _database.Open(); - SQLiteTransaction trans = _database.BeginTransaction(); - SQLiteCommand command = new SQLiteCommand( - "SELECT parent_id FROM groups " + - "WHERE group_id = " + parentOfCurrentGroup + ";", _database, trans); - SQLiteDataReader reader = command.ExecuteReader(); - reader.Read(); - parentOfCurrentGroup = reader.GetInt16(0); - reader.Close(); - trans.Rollback(); - _database.Close(); - } - } - + + /// + /// Fill the List passed with all the nodes in the current group. + /// + /// The List that is to be filled. public void refreshNodes(ref System.Collections.Generic.List list) { list.Clear(); @@ -546,6 +613,10 @@ public void refreshNodes(ref System.Collections.Generic.List lis _database.Close(); } + /// + /// Adds all the nodes in the supplied List to the database. + /// + /// List of all the nodes to be added. public void fillNodes(List nodes) { _database.Open(); @@ -606,12 +677,16 @@ public void fillNodes(List nodes) _database.Close(); } + /// + /// Add the supplied node to the database. + /// + /// Node to added to the database. public void addNode(AVM.Types.Node node) { _database.Open(); SQLiteTransaction trans = _database.BeginTransaction(); - // Create strings to make the data adapter + // Create strings to make the data adapter. string identifiers = "name, parent_group_id, type, url, embeded, comment"; string data = "@name, @parent_group_id, @type, @url, @embeded, @comment"; if (node.IsFile) @@ -625,20 +700,21 @@ public void addNode(AVM.Types.Node node) data += ", @episode_number, @season_number, @last_watched, @episode_name"; } - // Create the adapter + // Create the adapter. SQLiteDataAdapter adapter = new SQLiteDataAdapter(); adapter.InsertCommand = new SQLiteCommand( "INSERT INTO nodes (" + identifiers + ") " + "VALUES (" + data + ");", trans.Connection); - // Fill the adapter with values + // Fill the adapter with values. adapter.InsertCommand.Parameters.AddWithValue("@name", node.Name); adapter.InsertCommand.Parameters.AddWithValue("@parent_group_id", currentGroup); adapter.InsertCommand.Parameters.AddWithValue("@type", node.UrlType); adapter.InsertCommand.Parameters.AddWithValue("@url", node.Url); adapter.InsertCommand.Parameters.AddWithValue("@embeded", node.Embeded); adapter.InsertCommand.Parameters.AddWithValue("@comment", node.Comment); + // If file populate the SQLiteDataAdapter with file data. if (node.IsFile) { adapter.InsertCommand.Parameters.AddWithValue("@uri", node.File.Uri.ToString()); @@ -646,6 +722,7 @@ public void addNode(AVM.Types.Node node) adapter.InsertCommand.Parameters.AddWithValue("@audio_encoding", node.File.Audio_Encoding); adapter.InsertCommand.Parameters.AddWithValue("@container", node.File.Container); } + // If episode populate the SQLiteDataAdapter with episode data. if (node.IsEpisode) { adapter.InsertCommand.Parameters.AddWithValue("@episode_number", node.Episode.EpisodeNumber); @@ -661,11 +738,17 @@ public void addNode(AVM.Types.Node node) _database.Close(); } - public void updateNode(AVM.Types.Node old_node, AVM.Types.Node node) + /// + /// Update the supplied node with the new nodes information. + /// + /// Node to be updated. + /// Node with the new information. + public void updateNode(AVM.Types.Node old_node, + AVM.Types.Node node) { _database.Open(); SQLiteTransaction trans = _database.BeginTransaction(); - // fills node + // Fills node. string updateString = "name = @name" + ", type = @type" + ", url = @url" + @@ -678,7 +761,7 @@ public void updateNode(AVM.Types.Node old_node, AVM.Types.Node node) ", audio_encoding = @audio_encoding" + ", container = @container"; } - // If episode populate the updateString with episode data + // If episode populate the updateString with episode data. if (node.IsEpisode) { updateString += ", episode_number = @episode_number" + @@ -687,7 +770,7 @@ public void updateNode(AVM.Types.Node old_node, AVM.Types.Node node) ", episode_name = @episode_name"; } - // Create the adapter + // Create the adapter. SQLiteDataAdapter adapter = new SQLiteDataAdapter(); adapter.UpdateCommand = new SQLiteCommand( "UPDATE nodes SET " + updateString + @@ -699,7 +782,7 @@ public void updateNode(AVM.Types.Node old_node, AVM.Types.Node node) adapter.UpdateCommand.Parameters.AddWithValue("@url", node.Url); adapter.UpdateCommand.Parameters.AddWithValue("@embeded", node.Embeded); adapter.UpdateCommand.Parameters.AddWithValue("@comment", node.Comment); - // If file populate the SQLiteDataAdapter with file data + // If file populate the SQLiteDataAdapter with file data. if (node.IsFile) { adapter.UpdateCommand.Parameters.AddWithValue("@uri", node.File.Uri); @@ -707,7 +790,7 @@ public void updateNode(AVM.Types.Node old_node, AVM.Types.Node node) adapter.UpdateCommand.Parameters.AddWithValue("@audio_encoding", node.File.Audio_Encoding); adapter.UpdateCommand.Parameters.AddWithValue("@container", node.File.Container); } - // If episode populate the SQLiteDataAdapter with episode data + // If episode populate the SQLiteDataAdapter with episode data. if (node.IsEpisode) { adapter.UpdateCommand.Parameters.AddWithValue("@episode_number", node.Episode.EpisodeNumber); @@ -721,6 +804,13 @@ public void updateNode(AVM.Types.Node old_node, AVM.Types.Node node) _database.Close(); } + /// + /// Removes a single node from the database. + /// NOTE: A connection must be open and pass in a transaction + /// and after this is run it must be committed or rolled back. + /// + /// Node that is being removed. + /// Transaction that is being used. private void removeSingleNode(AVM.Types.Node node, SQLiteTransaction trans) { @@ -729,6 +819,10 @@ private void removeSingleNode(AVM.Types.Node node, command.ExecuteNonQuery(); } + /// + /// Remove the node that is supplied. + /// + /// Node to be removed. public void removeNode(AVM.Types.Node node) { _database.Open(); @@ -738,6 +832,10 @@ public void removeNode(AVM.Types.Node node) _database.Close(); } + /// + /// Increment the times played for a node. + /// + /// Node to be incremented. public void incrementPlayed(AVM.Types.Node node) { _database.Open(); @@ -751,6 +849,14 @@ public void incrementPlayed(AVM.Types.Node node) _database.Close(); } + /// + /// Search the database using the query and return it in the List. + /// NOTE: This can search only the group or in all groups. + /// + /// The list of nodes to be filled. + /// String that is used as the query. + /// True: Search all groups. + /// False: Search just current group. public void searchNodes(ref List nodes, string query, bool searchAll) @@ -819,7 +925,64 @@ public void searchNodes(ref List nodes, trans.Rollback(); _database.Close(); } + + /// + /// Gets the last node id which is also the largest node id. + /// + /// + public long getLastNodeId() + { + long last_id; + _database.Open(); + SQLiteTransaction trans = _database.BeginTransaction(); + SQLiteCommand command = new SQLiteCommand( + "SELECT max(node_id) FROM nodes;", + _database, trans); + SQLiteDataReader reader = command.ExecuteReader(); + reader.Read(); + if (reader.IsDBNull(0)) + last_id = 0; + else + last_id = reader.GetInt64(0); + _database.Close(); + + return last_id; + } + + /// + /// Sets the node passed in as the lastWatched. + /// + /// Node that just started playing. + public void lastWatched(AVM.Types.Node node) + { + // Make it so no Nodes in the same group are marked as last_watched + _database.Open(); + SQLiteTransaction trans = _database.BeginTransaction(); + SQLiteCommand command = new SQLiteCommand( + "UPDATE nodes SET last_watched = 0 WHERE parent_group_id = " + + node.ParentId + ";", + _database, + trans); + command.ExecuteNonQuery(); + + // Mark current node as last_watched + command = new SQLiteCommand( + "UPDATE nodes SET last_watched = 1 WHERE node_id = " + + node.Id + ";", + _database, + trans); + command.ExecuteNonQuery(); + trans.Commit(); + _database.Close(); + } + #endregion + + #region Misc Functions + + /// + /// This function empties the database. + /// public void Clear() { _database.Open(); @@ -836,7 +999,13 @@ public void Clear() _database.Close(); } - public string FindBreadcrumbs(long starting_id) + /// + /// This returns a breadcrumb list of all the groups going + /// back to the root group from the group whose id is supplied. + /// + /// Group to make breadcrumbs from. + /// + public string findBreadcrumbs(long starting_id) { string crums = ""; Stack groups = new Stack(); @@ -868,47 +1037,14 @@ public string FindBreadcrumbs(long starting_id) _database.Close(); return crums; } - - public long getLastNodeId() - { - long last_id; - - _database.Open(); - SQLiteTransaction trans = _database.BeginTransaction(); - SQLiteCommand command = new SQLiteCommand( - "SELECT max(node_id) FROM nodes;", - _database, trans); - SQLiteDataReader reader = command.ExecuteReader(); - reader.Read(); - if (reader.IsDBNull(0)) - last_id = 0; - else - last_id = reader.GetInt64(0); - _database.Close(); - - return last_id; - } - - public long getLastGroupId() - { - long last_id; - - _database.Open(); - SQLiteTransaction trans = _database.BeginTransaction(); - SQLiteCommand command = new SQLiteCommand( - "SELECT max(group_id) FROM groups;", - _database, trans); - SQLiteDataReader reader = command.ExecuteReader(); - reader.Read(); - last_id = reader.GetInt64(0); - _database.Close(); - - return last_id; - } - + + /// + /// This closes the database. + /// public void Kill() { _database.Close(); } + #endregion } } diff --git a/src/DeleteConfirmation.Designer.cs b/src/DeleteConfirmation.Designer.cs new file mode 100644 index 0000000..fd731af --- /dev/null +++ b/src/DeleteConfirmation.Designer.cs @@ -0,0 +1,102 @@ +namespace AVM +{ + partial class DeleteConfirmation + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.deleteLabel = new System.Windows.Forms.Label(); + this.dontPromptCheckBox = new System.Windows.Forms.CheckBox(); + this.deleteButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // deleteLabel + // + this.deleteLabel.AutoSize = true; + this.deleteLabel.Location = new System.Drawing.Point(13, 9); + this.deleteLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.deleteLabel.Name = "deleteLabel"; + this.deleteLabel.Size = new System.Drawing.Size(223, 16); + this.deleteLabel.TabIndex = 0; + this.deleteLabel.Text = "Are you sure you want to delete this?"; + // + // dontPromptCheckBox + // + this.dontPromptCheckBox.AutoSize = true; + this.dontPromptCheckBox.Location = new System.Drawing.Point(16, 49); + this.dontPromptCheckBox.Name = "dontPromptCheckBox"; + this.dontPromptCheckBox.Size = new System.Drawing.Size(152, 20); + this.dontPromptCheckBox.TabIndex = 3; + this.dontPromptCheckBox.Text = "Don\'t show this again"; + this.dontPromptCheckBox.UseVisualStyleBackColor = true; + // + // deleteButton + // + this.deleteButton.Location = new System.Drawing.Point(177, 47); + this.deleteButton.Name = "deleteButton"; + this.deleteButton.Size = new System.Drawing.Size(75, 23); + this.deleteButton.TabIndex = 1; + this.deleteButton.Text = "Delete"; + this.deleteButton.UseVisualStyleBackColor = true; + this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click); + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(258, 46); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // DeleteConfirmation + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(345, 79); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.deleteButton); + this.Controls.Add(this.dontPromptCheckBox); + this.Controls.Add(this.deleteLabel); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "DeleteConfirmation"; + this.Text = "Delete"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label deleteLabel; + private System.Windows.Forms.CheckBox dontPromptCheckBox; + private System.Windows.Forms.Button deleteButton; + private System.Windows.Forms.Button cancelButton; + } +} \ No newline at end of file diff --git a/src/DeleteConfirmation.cs b/src/DeleteConfirmation.cs new file mode 100644 index 0000000..fe38fbf --- /dev/null +++ b/src/DeleteConfirmation.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AVM +{ + public partial class DeleteConfirmation : Form + { + private bool _delete = false; + + public DeleteConfirmation() + { + InitializeComponent(); + } + + public bool Delete + { + get { return _delete; } + } + + private void deleteButton_Click(object sender, EventArgs e) + { + _delete = true; + Properties.Settings.Default.PromptOnDelete = !dontPromptCheckBox.Checked; + this.Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + Properties.Settings.Default.PromptOnDelete = !dontPromptCheckBox.Checked; + this.Close(); + } + } +} diff --git a/src/DeleteConfirmation.resx b/src/DeleteConfirmation.resx new file mode 100644 index 0000000..ff31a6d --- /dev/null +++ b/src/DeleteConfirmation.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/src/GroupEditor.cs b/src/GroupEditor.cs index 4d7ae72..6b78964 100644 --- a/src/GroupEditor.cs +++ b/src/GroupEditor.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Importer.cs b/src/Importer.cs index e0c1e01..ed06acf 100644 --- a/src/Importer.cs +++ b/src/Importer.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/NodeEditor.Designer.cs b/src/NodeEditor.Designer.cs index 88de36f..85ebbd0 100644 --- a/src/NodeEditor.Designer.cs +++ b/src/NodeEditor.Designer.cs @@ -365,7 +365,7 @@ private void InitializeComponent() this.youTubeTabPage.Padding = new System.Windows.Forms.Padding(3); this.youTubeTabPage.Size = new System.Drawing.Size(379, 279); this.youTubeTabPage.TabIndex = 0; - this.youTubeTabPage.Text = "You Tube"; + this.youTubeTabPage.Text = "YouTube"; this.youTubeTabPage.UseVisualStyleBackColor = true; // // youTubeLastWatchedCheckBox diff --git a/src/NodeEditor.cs b/src/NodeEditor.cs index bbed860..ee683fa 100644 --- a/src/NodeEditor.cs +++ b/src/NodeEditor.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/NodeViewer.cs b/src/NodeViewer.cs index f3ec342..8c3e10c 100644 --- a/src/NodeViewer.cs +++ b/src/NodeViewer.cs @@ -1,4 +1,29 @@ -using System; +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's +// +// Copyright (c) 2008-2009 Nicholas Omann +// +// 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.ComponentModel; using System.Data; diff --git a/src/Parsers/BackupParser.cs b/src/Parsers/BackupParser.cs index 89b11a9..2ace635 100644 --- a/src/Parsers/BackupParser.cs +++ b/src/Parsers/BackupParser.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Parsers/FolderParser.cs b/src/Parsers/FolderParser.cs index 0c887e8..f345d3d 100644 --- a/src/Parsers/FolderParser.cs +++ b/src/Parsers/FolderParser.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Parsers/HuluParser.cs b/src/Parsers/HuluParser.cs index afc5aee..e3f0403 100644 --- a/src/Parsers/HuluParser.cs +++ b/src/Parsers/HuluParser.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Parsers/YouTubeParser.cs b/src/Parsers/YouTubeParser.cs index f3dc728..12a0fd5 100644 --- a/src/Parsers/YouTubeParser.cs +++ b/src/Parsers/YouTubeParser.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Program.cs b/src/Program.cs index a87687c..579b1c5 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -1,4 +1,29 @@ -using System; +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's +// +// Copyright (c) 2008-2009 Nicholas Omann +// +// 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.Forms; namespace AVM diff --git a/src/Settings.Designer.cs b/src/Settings.Designer.cs index fab1502..b2746ee 100644 --- a/src/Settings.Designer.cs +++ b/src/Settings.Designer.cs @@ -50,6 +50,13 @@ private void InitializeComponent() this.huluWebPlayerCheckBox = new System.Windows.Forms.CheckBox(); this.youTubeWebPlayerCheckBox = new System.Windows.Forms.CheckBox(); this.otherTabPage = new System.Windows.Forms.TabPage(); + this.backspaceDeleteCheckBox = new System.Windows.Forms.CheckBox(); + this.lastWatchedColorPictureBox = new System.Windows.Forms.PictureBox(); + this.lastPlayedColorLabel = new System.Windows.Forms.Label(); + this.doubleClickPlayCheckBox = new System.Windows.Forms.CheckBox(); + this.promptOnDeleteCheckBox = new System.Windows.Forms.CheckBox(); + this.moreInfoComboBox = new System.Windows.Forms.ComboBox(); + this.moreInfoLabel = new System.Windows.Forms.Label(); this.patternLabel = new System.Windows.Forms.Label(); this.patternTextBox = new System.Windows.Forms.TextBox(); this.resetButton = new System.Windows.Forms.Button(); @@ -59,12 +66,12 @@ private void InitializeComponent() this.applyButton = new System.Windows.Forms.Button(); this.cancelButton = new System.Windows.Forms.Button(); this.backupSaveFileDialog = new System.Windows.Forms.SaveFileDialog(); - this.moreInfoLabel = new System.Windows.Forms.Label(); - this.moreInfoComboBox = new System.Windows.Forms.ComboBox(); + this.lastWatchedColorDialog = new System.Windows.Forms.ColorDialog(); this.settingsTabControl.SuspendLayout(); this.generalTabPage.SuspendLayout(); this.webTabPage.SuspendLayout(); this.otherTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lastWatchedColorPictureBox)).BeginInit(); this.tableLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // @@ -265,9 +272,9 @@ private void InitializeComponent() this.huluWebPlayerCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.huluWebPlayerCheckBox.Location = new System.Drawing.Point(8, 32); this.huluWebPlayerCheckBox.Name = "huluWebPlayerCheckBox"; - this.huluWebPlayerCheckBox.Size = new System.Drawing.Size(215, 20); + this.huluWebPlayerCheckBox.Size = new System.Drawing.Size(218, 20); this.huluWebPlayerCheckBox.TabIndex = 1; - this.huluWebPlayerCheckBox.Text = "Play Hulu videos in Web Player"; + this.huluWebPlayerCheckBox.Text = "Play Hulu videos in Web Player."; this.huluWebPlayerCheckBox.UseVisualStyleBackColor = true; // // youTubeWebPlayerCheckBox @@ -277,13 +284,18 @@ private void InitializeComponent() this.youTubeWebPlayerCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.youTubeWebPlayerCheckBox.Location = new System.Drawing.Point(8, 6); this.youTubeWebPlayerCheckBox.Name = "youTubeWebPlayerCheckBox"; - this.youTubeWebPlayerCheckBox.Size = new System.Drawing.Size(244, 20); + this.youTubeWebPlayerCheckBox.Size = new System.Drawing.Size(247, 20); this.youTubeWebPlayerCheckBox.TabIndex = 0; - this.youTubeWebPlayerCheckBox.Text = "Play YouTube videos in Web Player"; + this.youTubeWebPlayerCheckBox.Text = "Play YouTube videos in Web Player."; this.youTubeWebPlayerCheckBox.UseVisualStyleBackColor = true; // // otherTabPage // + this.otherTabPage.Controls.Add(this.backspaceDeleteCheckBox); + this.otherTabPage.Controls.Add(this.lastWatchedColorPictureBox); + this.otherTabPage.Controls.Add(this.lastPlayedColorLabel); + this.otherTabPage.Controls.Add(this.doubleClickPlayCheckBox); + this.otherTabPage.Controls.Add(this.promptOnDeleteCheckBox); this.otherTabPage.Controls.Add(this.moreInfoComboBox); this.otherTabPage.Controls.Add(this.moreInfoLabel); this.otherTabPage.Controls.Add(this.patternLabel); @@ -298,6 +310,75 @@ private void InitializeComponent() this.otherTabPage.Text = "Other"; this.otherTabPage.UseVisualStyleBackColor = true; // + // backspaceDeleteCheckBox + // + this.backspaceDeleteCheckBox.AutoSize = true; + this.backspaceDeleteCheckBox.Location = new System.Drawing.Point(8, 146); + this.backspaceDeleteCheckBox.Name = "backspaceDeleteCheckBox"; + this.backspaceDeleteCheckBox.Size = new System.Drawing.Size(268, 20); + this.backspaceDeleteCheckBox.TabIndex = 17; + this.backspaceDeleteCheckBox.Text = "Delete Video when Backspace pressed."; + this.backspaceDeleteCheckBox.UseVisualStyleBackColor = true; + // + // lastWatchedColorPictureBox + // + this.lastWatchedColorPictureBox.Location = new System.Drawing.Point(246, 169); + this.lastWatchedColorPictureBox.Name = "lastWatchedColorPictureBox"; + this.lastWatchedColorPictureBox.Size = new System.Drawing.Size(18, 16); + this.lastWatchedColorPictureBox.TabIndex = 16; + this.lastWatchedColorPictureBox.TabStop = false; + this.lastWatchedColorPictureBox.Click += new System.EventHandler(this.lastWatchedColorPictureBox_Click); + // + // lastPlayedColorLabel + // + this.lastPlayedColorLabel.AutoSize = true; + this.lastPlayedColorLabel.Location = new System.Drawing.Point(3, 169); + this.lastPlayedColorLabel.Name = "lastPlayedColorLabel"; + this.lastPlayedColorLabel.Size = new System.Drawing.Size(237, 16); + this.lastPlayedColorLabel.TabIndex = 15; + this.lastPlayedColorLabel.Text = "Color for Last Watched Video Highlight"; + // + // doubleClickPlayCheckBox + // + this.doubleClickPlayCheckBox.AutoSize = true; + this.doubleClickPlayCheckBox.Location = new System.Drawing.Point(8, 120); + this.doubleClickPlayCheckBox.Name = "doubleClickPlayCheckBox"; + this.doubleClickPlayCheckBox.Size = new System.Drawing.Size(155, 20); + this.doubleClickPlayCheckBox.TabIndex = 13; + this.doubleClickPlayCheckBox.Text = "Play on Double-Click."; + this.doubleClickPlayCheckBox.UseVisualStyleBackColor = true; + // + // promptOnDeleteCheckBox + // + this.promptOnDeleteCheckBox.AutoSize = true; + this.promptOnDeleteCheckBox.Location = new System.Drawing.Point(8, 94); + this.promptOnDeleteCheckBox.Name = "promptOnDeleteCheckBox"; + this.promptOnDeleteCheckBox.Size = new System.Drawing.Size(134, 20); + this.promptOnDeleteCheckBox.TabIndex = 12; + this.promptOnDeleteCheckBox.Text = "Prompt on Delete."; + this.promptOnDeleteCheckBox.UseVisualStyleBackColor = true; + // + // moreInfoComboBox + // + this.moreInfoComboBox.FormattingEnabled = true; + this.moreInfoComboBox.Items.AddRange(new object[] { + "imdb", + "Anime News Network", + "Wikipedia"}); + this.moreInfoComboBox.Location = new System.Drawing.Point(121, 64); + this.moreInfoComboBox.Name = "moreInfoComboBox"; + this.moreInfoComboBox.Size = new System.Drawing.Size(188, 24); + this.moreInfoComboBox.TabIndex = 11; + // + // moreInfoLabel + // + this.moreInfoLabel.AutoSize = true; + this.moreInfoLabel.Location = new System.Drawing.Point(3, 67); + this.moreInfoLabel.Name = "moreInfoLabel"; + this.moreInfoLabel.Size = new System.Drawing.Size(112, 16); + this.moreInfoLabel.TabIndex = 10; + this.moreInfoLabel.Text = "More Info Service"; + // // patternLabel // this.patternLabel.AutoSize = true; @@ -391,27 +472,6 @@ private void InitializeComponent() this.backupSaveFileDialog.DefaultExt = "xml"; this.backupSaveFileDialog.Filter = "xml files|*.xml|All files|*.*"; // - // moreInfoLabel - // - this.moreInfoLabel.AutoSize = true; - this.moreInfoLabel.Location = new System.Drawing.Point(3, 67); - this.moreInfoLabel.Name = "moreInfoLabel"; - this.moreInfoLabel.Size = new System.Drawing.Size(112, 16); - this.moreInfoLabel.TabIndex = 10; - this.moreInfoLabel.Text = "More Info Service"; - // - // moreInfoComboBox - // - this.moreInfoComboBox.FormattingEnabled = true; - this.moreInfoComboBox.Items.AddRange(new object[] { - "imdb", - "Anime News Network", - "Wikipedia"}); - this.moreInfoComboBox.Location = new System.Drawing.Point(121, 64); - this.moreInfoComboBox.Name = "moreInfoComboBox"; - this.moreInfoComboBox.Size = new System.Drawing.Size(188, 24); - this.moreInfoComboBox.TabIndex = 11; - // // Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -429,6 +489,7 @@ private void InitializeComponent() this.webTabPage.PerformLayout(); this.otherTabPage.ResumeLayout(false); this.otherTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lastWatchedColorPictureBox)).EndInit(); this.tableLayoutPanel1.ResumeLayout(false); this.ResumeLayout(false); @@ -469,5 +530,11 @@ private void InitializeComponent() private System.Windows.Forms.TextBox patternTextBox; private System.Windows.Forms.ComboBox moreInfoComboBox; private System.Windows.Forms.Label moreInfoLabel; + private System.Windows.Forms.CheckBox promptOnDeleteCheckBox; + private System.Windows.Forms.CheckBox doubleClickPlayCheckBox; + private System.Windows.Forms.ColorDialog lastWatchedColorDialog; + private System.Windows.Forms.PictureBox lastWatchedColorPictureBox; + private System.Windows.Forms.Label lastPlayedColorLabel; + private System.Windows.Forms.CheckBox backspaceDeleteCheckBox; } } \ No newline at end of file diff --git a/src/Settings.cs b/src/Settings.cs index efde738..cbaa47d 100644 --- a/src/Settings.cs +++ b/src/Settings.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation @@ -35,6 +35,7 @@ namespace AVM { public partial class Settings : Form { + private Color _lastWatchedColor; // Stores the color for Last Watched while its here. private Database _db; private bool _success = false; @@ -93,6 +94,16 @@ private void applyButton_Click(object sender, EventArgs e) Properties.Settings.Default.FileNamePattern = patternTextBox.Text; Properties.Settings.Default.MoreInfoService = moreInfoComboBox.Text; + + Properties.Settings.Default.PromptOnDelete = + promptOnDeleteCheckBox.Checked; + Properties.Settings.Default.DoubleClickPlay = + doubleClickPlayCheckBox.Checked; + Properties.Settings.Default.BackspaceDelete = + backspaceDeleteCheckBox.Checked; + + Properties.Settings.Default.LastWatchedColor = _lastWatchedColor; + _success = true; this.Close(); } @@ -170,12 +181,32 @@ private void loadProperties() huluWebPlayerCheckBox.Checked = Properties.Settings.Default.HuluWebPlayer; patternTextBox.Text = Properties.Settings.Default.FileNamePattern; moreInfoComboBox.Text = Properties.Settings.Default.MoreInfoService; + + promptOnDeleteCheckBox.Checked = + Properties.Settings.Default.PromptOnDelete; + doubleClickPlayCheckBox.Checked = + Properties.Settings.Default.DoubleClickPlay; + backspaceDeleteCheckBox.Checked = + Properties.Settings.Default.BackspaceDelete; + + _lastWatchedColor = Properties.Settings.Default.LastWatchedColor; + lastWatchedColorPictureBox.BackColor = _lastWatchedColor; } - private void resetButton_Click(object sender, EventArgs e) + private void resetButton_Click(object sender, + EventArgs e) { Properties.Settings.Default.Reset(); loadProperties(); } + + private void lastWatchedColorPictureBox_Click(object sender, + EventArgs e) + { + lastWatchedColorDialog.Color = _lastWatchedColor; + lastWatchedColorDialog.ShowDialog(); + _lastWatchedColor = lastWatchedColorDialog.Color; + lastWatchedColorPictureBox.BackColor = _lastWatchedColor; + } } } diff --git a/src/Settings.resx b/src/Settings.resx index 4c1a560..3354a43 100644 --- a/src/Settings.resx +++ b/src/Settings.resx @@ -120,4 +120,7 @@ 17, 17 + + 187, 17 + \ No newline at end of file diff --git a/src/Types/EpisodeInfo.cs b/src/Types/EpisodeInfo.cs index 7ccc907..e1bcc26 100644 --- a/src/Types/EpisodeInfo.cs +++ b/src/Types/EpisodeInfo.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Types/FileData.cs b/src/Types/FileData.cs index 97bd1da..dbe938e 100644 --- a/src/Types/FileData.cs +++ b/src/Types/FileData.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Types/Group.cs b/src/Types/Group.cs index 4407e4c..111a8b2 100644 --- a/src/Types/Group.cs +++ b/src/Types/Group.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/Types/Node.cs b/src/Types/Node.cs index e995d87..afac9dc 100644 --- a/src/Types/Node.cs +++ b/src/Types/Node.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation diff --git a/src/WebPlayer.Designer.cs b/src/WebPlayer.Designer.cs index e965593..0b7bc19 100644 --- a/src/WebPlayer.Designer.cs +++ b/src/WebPlayer.Designer.cs @@ -50,6 +50,7 @@ private void InitializeComponent() this.Controls.Add(this.videoWebBrowser); this.Name = "WebPlayer"; this.Text = "WebPlayer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.WebPlayer_FormClosing); this.Resize += new System.EventHandler(this.WebPlayer_Resize); this.ResumeLayout(false); diff --git a/src/WebPlayer.cs b/src/WebPlayer.cs index aba329c..7f86feb 100644 --- a/src/WebPlayer.cs +++ b/src/WebPlayer.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation @@ -66,11 +66,13 @@ public void PlayHulu(string url) private void WebPlayer_Resize(object sender, EventArgs e) { - string embeded = original_embeded; - embeded = embeded.Replace("WIDTH", videoWebBrowser.Width.ToString()); - embeded = embeded.Replace("HEIGHT", videoWebBrowser.Height.ToString()); if (_youTube) + { + string embeded = original_embeded; + embeded = embeded.Replace("WIDTH", videoWebBrowser.Width.ToString()); + embeded = embeded.Replace("HEIGHT", videoWebBrowser.Height.ToString()); videoWebBrowser.DocumentText = "" + embeded + ""; + } } private void videoWebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e) @@ -85,5 +87,10 @@ private void videoWebBrowser_Navigating(object sender, WebBrowserNavigatingEvent // videoWebBrowser //} } + + private void WebPlayer_FormClosing(object sender, FormClosingEventArgs e) + { + videoWebBrowser.ScriptErrorsSuppressed = true; + } } } diff --git a/src/mainForm.Designer.cs b/src/mainForm.Designer.cs index 9cb40aa..9fc52a7 100644 --- a/src/mainForm.Designer.cs +++ b/src/mainForm.Designer.cs @@ -51,9 +51,10 @@ private void InitializeComponent() this.groupTitleLabel = new System.Windows.Forms.Label(); this.nodeListView = new System.Windows.Forms.ListView(); this.nodeBoxMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.playToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.playNodeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.infoNodeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editNodeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteNodeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); this.newButton = new System.Windows.Forms.Button(); this.nodeSearchAllCheckBox = new System.Windows.Forms.CheckBox(); @@ -218,6 +219,7 @@ private void InitializeComponent() this.addNewGroupMenuItem.Name = "addNewGroupMenuItem"; this.addNewGroupMenuItem.Size = new System.Drawing.Size(159, 22); this.addNewGroupMenuItem.Text = "Add New Group"; + this.addNewGroupMenuItem.Visible = false; this.addNewGroupMenuItem.Click += new System.EventHandler(this.addNewGroupMenuItem_Click); // // renameGroupMenuItem @@ -362,36 +364,50 @@ private void InitializeComponent() this.nodeListView.View = System.Windows.Forms.View.Details; this.nodeListView.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.nodeListView_ColumnWidthChanged); this.nodeListView.DoubleClick += new System.EventHandler(this.nodeListView_DoubleClick); + this.nodeListView.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.nodeListView_KeyPress); // // nodeBoxMenu // this.nodeBoxMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.playToolStripMenuItem, - this.editToolStripMenuItem, - this.deleteToolStripMenuItem}); + this.playNodeMenuItem, + this.infoNodeMenuItem, + this.editNodeMenuItem, + this.deleteNodeMenuItem}); this.nodeBoxMenu.Name = "nodeBoxMenu"; - this.nodeBoxMenu.Size = new System.Drawing.Size(108, 70); + this.nodeBoxMenu.Size = new System.Drawing.Size(108, 92); + this.nodeBoxMenu.Opening += new System.ComponentModel.CancelEventHandler(this.nodeBoxMenu_Opening); // - // playToolStripMenuItem + // playNodeMenuItem // - this.playToolStripMenuItem.Name = "playToolStripMenuItem"; - this.playToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.playToolStripMenuItem.Text = "Play"; - this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click); + this.playNodeMenuItem.Enabled = false; + this.playNodeMenuItem.Name = "playNodeMenuItem"; + this.playNodeMenuItem.Size = new System.Drawing.Size(107, 22); + this.playNodeMenuItem.Text = "Play"; + this.playNodeMenuItem.Click += new System.EventHandler(this.playNodeMenuItem_Click); // - // editToolStripMenuItem + // infoNodeMenuItem // - this.editToolStripMenuItem.Name = "editToolStripMenuItem"; - this.editToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.editToolStripMenuItem.Text = "Edit"; - this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click); + this.infoNodeMenuItem.Enabled = false; + this.infoNodeMenuItem.Name = "infoNodeMenuItem"; + this.infoNodeMenuItem.Size = new System.Drawing.Size(107, 22); + this.infoNodeMenuItem.Text = "Info"; + this.infoNodeMenuItem.Click += new System.EventHandler(this.infoNodeMenuItem_Click); // - // deleteToolStripMenuItem + // editNodeMenuItem // - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.deleteToolStripMenuItem.Text = "Delete"; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + this.editNodeMenuItem.Enabled = false; + this.editNodeMenuItem.Name = "editNodeMenuItem"; + this.editNodeMenuItem.Size = new System.Drawing.Size(107, 22); + this.editNodeMenuItem.Text = "Edit"; + this.editNodeMenuItem.Click += new System.EventHandler(this.editNodeMenuItem_Click); + // + // deleteNodeMenuItem + // + this.deleteNodeMenuItem.Enabled = false; + this.deleteNodeMenuItem.Name = "deleteNodeMenuItem"; + this.deleteNodeMenuItem.Size = new System.Drawing.Size(107, 22); + this.deleteNodeMenuItem.Text = "Delete"; + this.deleteNodeMenuItem.Click += new System.EventHandler(this.deleteNodeMenuItem_Click); // // mainTableLayoutPanel // @@ -523,9 +539,9 @@ private void InitializeComponent() private System.Windows.Forms.TextBox searchGroupTextBox; private System.Windows.Forms.Label groupTitleLabel; private System.Windows.Forms.ContextMenuStrip nodeBoxMenu; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem playToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteNodeMenuItem; + private System.Windows.Forms.ToolStripMenuItem editNodeMenuItem; + private System.Windows.Forms.ToolStripMenuItem playNodeMenuItem; private System.Windows.Forms.CheckBox nodeSearchAllCheckBox; private System.Windows.Forms.TextBox nodeSearchTextBox; private System.Windows.Forms.Label nodeSearchLabel; @@ -534,6 +550,7 @@ private void InitializeComponent() private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; private System.Windows.Forms.Label searchGroupsLabel; + private System.Windows.Forms.ToolStripMenuItem infoNodeMenuItem; } } diff --git a/src/mainForm.cs b/src/mainForm.cs index 53b6c6e..b10f90c 100644 --- a/src/mainForm.cs +++ b/src/mainForm.cs @@ -1,6 +1,6 @@ -// Video Manager - Appliction used to manage Video Files and DVD's +// AVM - Appliction used to manage Web Videos, Video Files, and DVD's // -// Copyright (c) 2008 Nicholas Omann +// Copyright (c) 2008-2009 Nicholas Omann // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation @@ -47,13 +47,12 @@ private void mainForm_Load(object sender, EventArgs e) else nodeListView = Properties.Settings.Default.LastListView; - db = new AVM.Database(System.IO.Directory.GetCurrentDirectory().ToString() + "\\VideoManager.db3"); + //db = new AVM.Database(System.IO.Directory.GetCurrentDirectory().ToString() + "\\VideoManager.db3"); + db = new AVM.Database(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\VideoManager.db3"); db.ParentGroup = Properties.Settings.Default.LastParentGroup; db.refreshGroups(groupListBox); - - // FIXME: look into doing this better since it doesnt look right if (groupListBox.Items.Count > Properties.Settings.Default.LastSelectedIndex) groupListBox.SelectedIndex = Properties.Settings.Default.LastSelectedIndex; else @@ -61,7 +60,7 @@ private void mainForm_Load(object sender, EventArgs e) // See if a group is selected if (db.CurrentGroup != 0) - groupTitleLabel.Text = db.FindBreadcrumbs(db.CurrentGroup); //((AVM.Types.Group)groupListBox.SelectedItem).Name; + groupTitleLabel.Text = db.findBreadcrumbs(db.CurrentGroup); //((AVM.Types.Group)groupListBox.SelectedItem).Name; else groupTitleLabel.Text = ""; @@ -126,18 +125,32 @@ private void deleteGroupMenuItem_Click(object sender, EventArgs e) { if (groupListBox.SelectedIndex >= 0) { - db.removeGroup((AVM.Types.Group)groupListBox.SelectedItem); - db.refreshGroups(groupListBox); - db.CurrentGroup = db.ParentGroup; - if (groupListBox.Items.Count == 0) - forwardButton.Enabled = false; - db.refreshNodes(ref nodes); - loadNodes(); - // See if a group is selected - if (db.CurrentGroup != 0) - groupTitleLabel.Text = db.FindBreadcrumbs(db.CurrentGroup); //((AVM.Types.Group)groupListBox.SelectedItem).Name; + bool delete = false; // This decides if the group should actually be deleted. + + if (Properties.Settings.Default.PromptOnDelete) + { + DeleteConfirmation prompt = new DeleteConfirmation(); + prompt.ShowDialog(); + delete = prompt.Delete; + } else - groupTitleLabel.Text = ""; + delete = true; // If not prompted just delete it. + + if (delete) + { + db.removeGroup((AVM.Types.Group)groupListBox.SelectedItem); + db.refreshGroups(groupListBox); + db.CurrentGroup = db.ParentGroup; + if (groupListBox.Items.Count == 0) + forwardButton.Enabled = false; + db.refreshNodes(ref nodes); + loadNodes(); + // See if a group is selected + if (db.CurrentGroup != 0) + groupTitleLabel.Text = db.findBreadcrumbs(db.CurrentGroup); //((AVM.Types.Group)groupListBox.SelectedItem).Name; + else + groupTitleLabel.Text = ""; + } } } @@ -174,17 +187,6 @@ private void settingsButton_Click(object sender, EventArgs e) formatColumns(); loadNodes(); } - - //nodeListView.Items.Clear(); - //foreach (Video_Manager.Group node in groupTreeView.Nodes) - //{ - // loadGroup(node.Nodes); - // nodeListView.Items.Add(node.Text); - //} - //foreach(Video_Manager.Group group in groups) - //{ - // loadGroup(group); - //} } private void switchGroupToSelected(object sender, EventArgs e) @@ -233,9 +235,6 @@ private void importButton_Click(object sender, EventArgs e) private void newButton_Click(object sender, EventArgs e) { - //ListViewItem tempItem = new ListViewItem("New"); - //tempItem.SubItems.Add(new ListViewItem.ListViewSubItem(tempItem, "Bob")); - //nodeListView.Items.Add(tempItem); NodeEditor editor = new NodeEditor("New", null); editor.ShowDialog(); if (editor.Successful) @@ -252,12 +251,12 @@ private void groupListBox_SelectedIndexChanged(object sender, EventArgs e) { newButton.Enabled = true; db.CurrentGroup = ((AVM.Types.Group)groupListBox.SelectedItem).Id; - groupTitleLabel.Text = db.FindBreadcrumbs(db.CurrentGroup); + groupTitleLabel.Text = db.findBreadcrumbs(db.CurrentGroup); } else { db.CurrentGroup = db.ParentGroup; - groupTitleLabel.Text = db.FindBreadcrumbs(db.CurrentGroup); + groupTitleLabel.Text = db.findBreadcrumbs(db.CurrentGroup); } db.refreshNodes(ref nodes); loadNodes(); @@ -270,7 +269,6 @@ public void refreshGroups() private void loadNodes() { - // FIXME: make me know wtf i am! nodeListView.Items.Clear(); foreach (AVM.Types.Node node in nodes) { @@ -356,16 +354,32 @@ private void loadNodes() } } - private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + private void deleteNodeMenuItem_Click(object sender, EventArgs e) { - ListView.SelectedIndexCollection indexes = nodeListView.SelectedIndices; - foreach (int index in indexes) - db.removeNode(nodes[index]); - db.refreshNodes(ref nodes); - loadNodes(); + bool delete = false; // this is set to true if delete should take place + + // If PromptOnDelete then run the confirmation dialog + if (Properties.Settings.Default.PromptOnDelete) + { + DeleteConfirmation prompt = new DeleteConfirmation(); + prompt.ShowDialog(); + delete = prompt.Delete; + } + // else just set to delete + else + delete = true; + + if (delete) + { + ListView.SelectedIndexCollection indexes = nodeListView.SelectedIndices; + foreach (int index in indexes) + db.removeNode(nodes[index]); + db.refreshNodes(ref nodes); + loadNodes(); + } } - private void editToolStripMenuItem_Click(object sender, EventArgs e) + private void editNodeMenuItem_Click(object sender, EventArgs e) { if (nodeListView.SelectedIndices.Count > 0) { @@ -381,66 +395,9 @@ private void editToolStripMenuItem_Click(object sender, EventArgs e) } } - private void playToolStripMenuItem_Click(object sender, EventArgs e) + private void playNodeMenuItem_Click(object sender, EventArgs e) { - if (nodeListView.SelectedIndices.Count > 0) - { - // Increment the watched list by one - nodes[nodeListView.SelectedIndices[0]].TimesPlayed++; - db.incrementPlayed(nodes[nodeListView.SelectedIndices[0]]); - // Check if what is selected can be played just incase something got through - if (nodes[nodeListView.SelectedIndices[0]].IsYouTube || - nodes[nodeListView.SelectedIndices[0]].IsHulu || - nodes[nodeListView.SelectedIndices[0]].IsFile) - { - // If YouTube video - if (nodes[nodeListView.SelectedIndices[0]].IsYouTube) - { - // If set to use the WebPlayer use it else use default web browser - if ((Properties.Settings.Default.YouTubeWebPlayer == true) && - (nodes[nodeListView.SelectedIndices[0]].Embeded != null)) - { - this.WindowState = FormWindowState.Minimized; - nodes[nodeListView.SelectedIndices[0]].Play(); - } - else - { - System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(nodes[nodeListView.SelectedIndices[0]].Url); - System.Diagnostics.Process.Start(psi); - } - } - - // If Hulu video - if (nodes[nodeListView.SelectedIndices[0]].IsHulu) - { - // If set to use the WebPlayer use it else use default web browser - if ((Properties.Settings.Default.HuluWebPlayer == true) && - (nodes[nodeListView.SelectedIndices[0]].Embeded != null)) - { - this.WindowState = FormWindowState.Minimized; - nodes[nodeListView.SelectedIndices[0]].Play(); - } - else - { - System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(nodes[nodeListView.SelectedIndices[0]].Url); - System.Diagnostics.Process.Start(psi); - } - } - - // Plays files using whatever program has been set as a default for that file format. - // This should be the most user friendly way but maybe could be setup to always run - // a specific application to play it. The benefits from this I dont know. - if (nodes[nodeListView.SelectedIndices[0]].IsFile) - { - this.WindowState = FormWindowState.Minimized; - System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(nodes[nodeListView.SelectedIndices[0]].File.Uri.LocalPath); - System.Diagnostics.Process tempPlayer; - tempPlayer = System.Diagnostics.Process.Start(psi); - tempPlayer.WaitForExit(); - } - this.WindowState = FormWindowState.Normal; - } - } + playSelectedNode(); } /// @@ -495,9 +452,9 @@ private void formatColumns() Properties.Settings.Default.TimesPlayedColumnWidth); } - private void nodeListView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) + private void nodeListView_ColumnWidthChanged(object sender, + ColumnWidthChangedEventArgs e) { - // dont work until the columns all exist if (nodeListView.Columns.Count == Properties.Settings.Default.NumberOfColumns) { int index = 0; @@ -552,7 +509,8 @@ private void nodeListView_ColumnWidthChanged(object sender, ColumnWidthChangedEv } } - private void nodeSearchAllCheckBox_CheckedChanged(object sender, EventArgs e) + private void nodeSearchAllCheckBox_CheckedChanged(object sender, + EventArgs e) { if (nodeSearchTextBox.Text != "") { @@ -563,7 +521,8 @@ private void nodeSearchAllCheckBox_CheckedChanged(object sender, EventArgs e) loadNodes(); } } - private void nodeSearchTextBox_TextChanged(object sender, EventArgs e) + private void nodeSearchTextBox_TextChanged(object sender, + EventArgs e) { if (nodeSearchTextBox.Text != "") { @@ -577,7 +536,7 @@ private void nodeSearchTextBox_TextChanged(object sender, EventArgs e) db.refreshNodes(ref nodes); if (db.CurrentGroup != 0) - groupTitleLabel.Text = db.FindBreadcrumbs(db.CurrentGroup); //((AVM.Types.Group)groupListBox.SelectedItem).Name; + groupTitleLabel.Text = db.findBreadcrumbs(db.CurrentGroup); //((AVM.Types.Group)groupListBox.SelectedItem).Name; else groupTitleLabel.Text = ""; } @@ -585,16 +544,148 @@ private void nodeSearchTextBox_TextChanged(object sender, EventArgs e) loadNodes(); } - private void nodeListView_DoubleClick(object sender, EventArgs e) + private void nodeListView_DoubleClick(object sender, + EventArgs e) { - if (nodeListView.SelectedIndices.Count > 0) + if (Properties.Settings.Default.DoubleClickPlay) + playSelectedNode(); + else + if (nodeListView.SelectedIndices.Count > 0) + { + AVM.NodeViewer viewer = new AVM.NodeViewer( + nodes[nodeListView.SelectedIndices[0]]); + viewer.ShowDialog(); + if (viewer.Play) + playSelectedNode(); + } + } + + private void nodeBoxMenu_Opening(object sender, + CancelEventArgs e) + { + if (nodeListView.SelectedItems.Count > 0) + { + playNodeMenuItem.Enabled = true; + infoNodeMenuItem.Enabled = true; + editNodeMenuItem.Enabled = true; + deleteNodeMenuItem.Enabled = true; + } + else { - AVM.NodeViewer viewer = new AVM.NodeViewer( + playNodeMenuItem.Enabled = true; + infoNodeMenuItem.Enabled = true; + editNodeMenuItem.Enabled = true; + deleteNodeMenuItem.Enabled = true; + } + } + + private void infoNodeMenuItem_Click(object sender, EventArgs e) + { + AVM.NodeViewer viewer = new AVM.NodeViewer( nodes[nodeListView.SelectedIndices[0]]); - viewer.ShowDialog(); - if (viewer.Play) - playToolStripMenuItem_Click(sender, e); + viewer.ShowDialog(); + if (viewer.Play) + playNodeMenuItem_Click(sender, e); + } + + public void playSelectedNode() + { + if (nodeListView.SelectedIndices.Count > 0) + { + // Increment the watched list by one + nodes[nodeListView.SelectedIndices[0]].TimesPlayed++; + db.incrementPlayed(nodes[nodeListView.SelectedIndices[0]]); + // Mark as lastPlayed + if (nodes[nodeListView.SelectedIndices[0]].IsEpisode) + { + db.lastWatched(nodes[nodeListView.SelectedIndices[0]]); + nodes[nodeListView.SelectedIndices[0]].Episode.LastWatched = true; + } + + // Check if what is selected can be played just incase something got through + if (nodes[nodeListView.SelectedIndices[0]].IsYouTube || + nodes[nodeListView.SelectedIndices[0]].IsHulu || + nodes[nodeListView.SelectedIndices[0]].IsFile) + { + // If YouTube video + if (nodes[nodeListView.SelectedIndices[0]].IsYouTube) + { + // If set to use the WebPlayer use it else use default web browser + if ((Properties.Settings.Default.YouTubeWebPlayer == true) && + (nodes[nodeListView.SelectedIndices[0]].Embeded != null)) + { + this.WindowState = FormWindowState.Minimized; + nodes[nodeListView.SelectedIndices[0]].Play(); + } + else + { + System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(nodes[nodeListView.SelectedIndices[0]].Url); + System.Diagnostics.Process.Start(psi); + } + } + + // If Hulu video + if (nodes[nodeListView.SelectedIndices[0]].IsHulu) + { + // If set to use the WebPlayer use it else use default web browser + if ((Properties.Settings.Default.HuluWebPlayer == true) && + (nodes[nodeListView.SelectedIndices[0]].Embeded != null)) + { + this.WindowState = FormWindowState.Minimized; + nodes[nodeListView.SelectedIndices[0]].Play(); + } + else + { + System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(nodes[nodeListView.SelectedIndices[0]].Url); + System.Diagnostics.Process.Start(psi); + } + } + + // Plays files using whatever program has been set as a default for that file format. + // This should be the most user friendly way but maybe could be setup to always run + // a specific application to play it. The benefits from this I dont know. + if (nodes[nodeListView.SelectedIndices[0]].IsFile) + { + this.WindowState = FormWindowState.Minimized; + System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(nodes[nodeListView.SelectedIndices[0]].File.Uri.LocalPath); + System.Diagnostics.Process tempPlayer; + tempPlayer = System.Diagnostics.Process.Start(psi); + tempPlayer.WaitForExit(); + } + this.WindowState = FormWindowState.Normal; + } + db.refreshNodes(ref nodes); + loadNodes(); } } + + private void nodeListView_KeyPress(object sender, KeyPressEventArgs e) + { + if (Properties.Settings.Default.BackspaceDelete) + if ((e.KeyChar == '\b') && (nodeListView.SelectedItems.Count > 0)) + { + bool delete = false; // this is set to true if delete should take place + + // If PromptOnDelete then run the confirmation dialog + if (Properties.Settings.Default.PromptOnDelete) + { + DeleteConfirmation prompt = new DeleteConfirmation(); + prompt.ShowDialog(); + delete = prompt.Delete; + } + // else just set to delete + else + delete = true; + + if (delete) + { + ListView.SelectedIndexCollection indexes = nodeListView.SelectedIndices; + foreach (int index in indexes) + db.removeNode(nodes[index]); + db.refreshNodes(ref nodes); + loadNodes(); + } + } + } } }