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();
+ }
+ }
+ }
}
}