OSDN Git Service

Add the ability to add & remove notebook stacks.
authorRandy Baumgarte <randy@fbn.cx>
Thu, 11 Nov 2010 17:59:06 +0000 (12:59 -0500)
committerRandy Baumgarte <randy@fbn.cx>
Wed, 15 Dec 2010 15:15:51 +0000 (10:15 -0500)
shortcuts_sample.txt
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/NotebookEdit.java
src/cx/fbn/nevernote/dialog/StackNotebook.java [new file with mode: 0644]
src/cx/fbn/nevernote/gui/MainMenuBar.java
src/cx/fbn/nevernote/gui/NotebookTreeWidget.java
src/cx/fbn/nevernote/gui/TagTreeWidget.java
src/cx/fbn/nevernote/signals/TagSignal.java
src/cx/fbn/nevernote/sql/DatabaseConnection.java
src/cx/fbn/nevernote/sql/NotebookTable.java
src/cx/fbn/nevernote/utilities/ListManager.java

index 51f1bb2..807bcd3 100644 (file)
@@ -10,6 +10,7 @@ File_Notebook_Edit                            // Edit an existing notebook
 File_Notebook_Delete                           // Delete the existing notebook
 File_Notebook_Close                            // Open/Close (i.e. archive) a notebook
 File_Notebook_Icon                             // Modify the selected notebook icon
+File_Notebook_Stack                            // Stack/Unstack notebooks
 File_Tag_Add                   Ctrl+Shift+T    // Add a notebook
 File_Tag_Edit                                  // Edit an existing notebook
 File_Tag_Delete                                        // Delete the existing notebook
index 86714c1..5e6f845 100644 (file)
@@ -140,6 +140,7 @@ import cx.fbn.nevernote.dialog.NotebookEdit;
 import cx.fbn.nevernote.dialog.OnlineNoteHistory;
 import cx.fbn.nevernote.dialog.SavedSearchEdit;
 import cx.fbn.nevernote.dialog.SetIcon;
+import cx.fbn.nevernote.dialog.StackNotebook;
 import cx.fbn.nevernote.dialog.TagEdit;
 import cx.fbn.nevernote.dialog.ThumbnailViewer;
 import cx.fbn.nevernote.dialog.WatchFolder;
@@ -311,11 +312,11 @@ public class NeverNote extends QMainWindow{
        public NeverNote(DatabaseConnection dbConn)  {
                conn = dbConn;          
                if (conn.getConnection() == null) {
-                       String msg = "Unable to connect to the database.\n\nThe most probable reason is that some other process\n" +
+                       String msg = new String(tr("Unable to connect to the database.\n\nThe most probable reason is that some other process\n" +
                                "is accessing the database or NeverNote is already running.\n\n" +
-                               "Please end any other process or shutdown the other NeverNote before starting.\n\nExiting program.";
+                               "Please end any other process or shutdown the other NeverNote before starting.\n\nExiting program."));
                        
-            QMessageBox.critical(null, "Database Connection Error",msg);
+            QMessageBox.critical(null, tr("Database Connection Error") ,msg);
                        System.exit(16);
                }
 
@@ -440,7 +441,7 @@ public class NeverNote extends QMainWindow{
                importFilesKeep = new ArrayList<String>();
                externalFileSaveTimer.start();
                
-        notebookTree = new NotebookTreeWidget();
+        notebookTree = new NotebookTreeWidget(conn);
         attributeTree = new AttributeTreeWidget();
         tagTree = new TagTreeWidget(conn);
         savedSearchTree = new SavedSearchTreeWidget();
@@ -515,6 +516,7 @@ public class NeverNote extends QMainWindow{
                notebookTree.setEditAction(menuBar.notebookEditAction);
                notebookTree.setAddAction(menuBar.notebookAddAction);
                notebookTree.setIconAction(menuBar.notebookIconAction);
+               notebookTree.setStackAction(menuBar.notebookStackAction);
                notebookTree.setVisible(Global.isWindowVisible("notebookTree"));
                notebookTree.noteSignal.notebookChanged.connect(this, "updateNoteNotebook(String, String)");
                menuBar.hideNotebooks.setChecked(Global.isWindowVisible("notebookTree"));
@@ -1142,10 +1144,8 @@ public class NeverNote extends QMainWindow{
     // Setup the tree containing the user's notebooks.
     private void initializeNotebookTree() {       
        logger.log(logger.HIGH, "Entering NeverNote.initializeNotebookTree");
- //    notebookTree.itemSelectionChanged.connect(this, "notebookTreeSelection()");
        notebookTree.itemClicked.connect(this, "notebookTreeSelection()");
        listManager.notebookSignal.refreshNotebookTreeCounts.connect(notebookTree, "updateCounts(List, List)");
- //    notebookTree.resize(Global.getSize("notebookTree"));
        logger.log(logger.HIGH, "Leaving NeverNote.initializeNotebookTree");
     }   
     // Listener when a notebook is selected
@@ -1163,6 +1163,7 @@ public class NeverNote extends QMainWindow{
        menuBar.notebookEditAction.setEnabled(true);
        menuBar.notebookDeleteAction.setEnabled(true);
        menuBar.notebookIconAction.setEnabled(true);
+       menuBar.notebookStackAction.setEnabled(true);
        List<QTreeWidgetItem> selections = notebookTree.selectedItems();
        QTreeWidgetItem currentSelection;
        selectedNotebookGUIDs.clear();
@@ -1191,6 +1192,7 @@ public class NeverNote extends QMainWindow{
                        menuBar.notebookEditAction.setEnabled(false);
                        menuBar.notebookDeleteAction.setEnabled(false);
                        menuBar.notebookIconAction.setEnabled(false);
+               menuBar.notebookStackAction.setEnabled(false);
                }
                if (selectedNotebookGUIDs.size() == 1 && selectedNotebookGUIDs.get(0).equals(previousSelectedNotebook)) {
                        previousSelectedNotebook = selectedNotebookGUIDs.get(0);
@@ -1318,29 +1320,89 @@ public class NeverNote extends QMainWindow{
        }
        // Edit an existing notebook
        @SuppressWarnings("unused")
+       private void stackNotebook() {
+               logger.log(logger.HIGH, "Entering NeverNote.stackNotebook");
+               StackNotebook edit = new StackNotebook();
+               
+               List<QTreeWidgetItem> selections = notebookTree.selectedItems();
+               QTreeWidgetItem currentSelection;
+               for (int i=0; i<selections.size(); i++) {
+                       currentSelection = selections.get(0);
+                       String guid = currentSelection.text(2);
+                       if (guid.equalsIgnoreCase("")) {
+                                QMessageBox.critical(this, tr("Unable To Stack") ,tr("You can't stack the \"All Notebooks\" item."));
+                                return;
+                       }
+                       if (guid.equalsIgnoreCase("STACK")) {
+                                QMessageBox.critical(this, tr("Unable To Stack") ,tr("You can't stack a stack."));
+                                return;
+                       }
+               }
+
+               edit.setStackNames(conn.getNotebookTable().getAllStackNames());
+
+               
+               edit.exec();
+       
+               if (!edit.okPressed())
+                       return;
+        
+               String stack = edit.getStackName();
+               
+               for (int i=0; i<selections.size(); i++) {
+                       currentSelection = selections.get(i);
+                       String guid = currentSelection.text(2);
+                       listManager.updateNotebookStack(guid, stack);
+               }
+               notebookIndexUpdated();
+               logger.log(logger.HIGH, "Leaving NeverNote.stackNotebook");
+       }
+       // Edit an existing notebook
+       @SuppressWarnings("unused")
        private void editNotebook() {
                logger.log(logger.HIGH, "Entering NeverNote.editNotebook");
                NotebookEdit edit = new NotebookEdit();
-               edit.setTitle(tr("Edit Notebook"));
-               edit.setLocalCheckboxEnabled(false);
+               
                List<QTreeWidgetItem> selections = notebookTree.selectedItems();
                QTreeWidgetItem currentSelection;
                currentSelection = selections.get(0);
                edit.setNotebook(currentSelection.text(0));
-               edit.setNotebooks(listManager.getNotebookIndex());
-
+               
                String guid = currentSelection.text(2);
-               for (int i=0; i<listManager.getNotebookIndex().size(); i++) {
-                       if (listManager.getNotebookIndex().get(i).getGuid().equals(guid)) {
-                               edit.setDefaultNotebook(listManager.getNotebookIndex().get(i).isDefaultNotebook());
-                               i=listManager.getNotebookIndex().size();
+               if (!guid.equalsIgnoreCase("STACK")) {
+                       edit.setTitle(tr("Edit Notebook"));
+                       edit.setNotebooks(listManager.getNotebookIndex());
+                       edit.setLocalCheckboxEnabled(false);
+                       for (int i=0; i<listManager.getNotebookIndex().size(); i++) {
+                               if (listManager.getNotebookIndex().get(i).getGuid().equals(guid)) {
+                                       edit.setDefaultNotebook(listManager.getNotebookIndex().get(i).isDefaultNotebook());
+                                       i=listManager.getNotebookIndex().size();
+                               }
                        }
+               } else {
+                       edit.setTitle(tr("Edit Stack"));
+                       edit.setStacks(conn.getNotebookTable().getAllStackNames());
+                       edit.hideLocalCheckbox();
+                       edit.hideDefaultCheckbox();
                }
+               
                edit.exec();
        
                if (!edit.okPressed())
                        return;
         
+               
+               if (guid.equalsIgnoreCase("STACK")) {
+                       conn.getNotebookTable().renameStacks(currentSelection.text(0), edit.getNotebook());
+                       for (int j=0; j<listManager.getNotebookIndex().size(); j++) {
+                               if (listManager.getNotebookIndex().get(j).getStack().equalsIgnoreCase(currentSelection.text(0)))
+                                               listManager.getNotebookIndex().get(j).setStack(edit.getNotebook());
+                       }
+                       conn.getNotebookTable().renameStacks(currentSelection.text(0), edit.getNotebook());
+                       currentSelection.setText(0, edit.getNotebook());
+                       return;
+               }
+               
                updateListNotebookName(currentSelection.text(0), edit.getNotebook());
                currentSelection.setText(0, edit.getNotebook());
                
@@ -1377,6 +1439,8 @@ public class NeverNote extends QMainWindow{
        @SuppressWarnings("unused")
        private void deleteNotebook() {
                logger.log(logger.HIGH, "Entering NeverNote.deleteNotebook");
+               boolean stacksFound = false;
+               boolean notebooksFound = false;
                boolean assigned = false;
                // Check if any notes have this notebook
                List<QTreeWidgetItem> selections = notebookTree.selectedItems();
@@ -1384,13 +1448,18 @@ public class NeverNote extends QMainWindow{
                QTreeWidgetItem currentSelection;
                currentSelection = selections.get(i);
                String guid = currentSelection.text(2);
-               for (int j=0; j<listManager.getNoteIndex().size(); j++) {
-                       String noteGuid = listManager.getNoteIndex().get(j).getNotebookGuid();
-                       if (noteGuid.equals(guid)) {
-                               assigned = true;
-                               j=listManager.getNoteIndex().size();
-                               i=selections.size();
+               if (!guid.equalsIgnoreCase("STACK")) {
+                       notebooksFound = true;
+                       for (int j=0; j<listManager.getNoteIndex().size(); j++) {
+                               String noteGuid = listManager.getNoteIndex().get(j).getNotebookGuid();
+                               if (noteGuid.equals(guid)) {
+                                       assigned = true;
+                                       j=listManager.getNoteIndex().size();
+                                       i=selections.size();
+                               }
                        }
+               } else {
+                       stacksFound = true;
                }
         }
                if (assigned) {
@@ -1405,7 +1474,18 @@ public class NeverNote extends QMainWindow{
                }
         
         // If all notebooks are clear, verify the delete
-               if (QMessageBox.question(this, tr("Confirmation"), tr("Delete the selected notebooks?"),
+               String msg1 = new String(tr("Delete selected notebooks?"));
+               String msg2 = new String(tr("Remove selected stacks (notebooks will not be deleted)?"));
+               String msg3 = new String(tr("Delete selected notebooks & remove stacks? Notebooks under the stacks are" +
+                               " not deleted unless selected?"));
+               String msg = "";
+               if (stacksFound && notebooksFound)
+                       msg = msg3;
+               if (!stacksFound && notebooksFound)
+                       msg = msg1;
+               if (stacksFound && !notebooksFound)
+                       msg = msg2;
+               if (QMessageBox.question(this, tr("Confirmation"), msg,
                        QMessageBox.StandardButton.Yes, 
                        QMessageBox.StandardButton.No)==StandardButton.No.value()) {
                        return;
@@ -1416,16 +1496,18 @@ public class NeverNote extends QMainWindow{
                QTreeWidgetItem currentSelection;
                currentSelection = selections.get(i);
                String guid = currentSelection.text(2);
-               conn.getNotebookTable().expungeNotebook(guid, true);
-               listManager.deleteNotebook(guid);
+               if (currentSelection.text(2).equalsIgnoreCase("STACK")) {
+                               conn.getNotebookTable().renameStacks(currentSelection.text(0), "");
+                               listManager.renameStack(currentSelection.text(0), "");
+               } else {
+                       conn.getNotebookTable().expungeNotebook(guid, true);
+                       listManager.deleteNotebook(guid);
+               }
         }
-//        for (int i=<dbRunner.getLocalNotebooks().size()-1; i>=0; i--) {
- //            if (dbRunner.getLocalNotebooks().get(i).equals(arg0))
- //       }
+
         notebookTreeSelection();
         notebookTree.load(listManager.getNotebookIndex(), listManager.getLocalNotebooks());
         listManager.countNotebookResults(listManager.getNoteIndex());
-//             notebookTree.updateCounts(listManager.getNotebookIndex(), listManager.getNotebookCounter());
         logger.log(logger.HIGH, "Entering NeverNote.deleteNotebook");
        }
        // A note's notebook has been updated
index bcc6b04..3e8c3cb 100644 (file)
@@ -39,11 +39,15 @@ public class NotebookEdit extends QDialog {
        private final QCheckBox         isDefault;
        private boolean startDefault;
        private String startText;
+       private List<String> stacks;
+       private boolean stackEdit;
+       private final QLabel notebookLabel;
        private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");        
        
        // Constructor
        public NotebookEdit() {
                okPressed = false;
+               stackEdit = false;
                setWindowTitle(tr("Add Notebook"));
                setWindowIcon(new QIcon(iconPath+"notebook-green.png"));
                QGridLayout grid = new QGridLayout();
@@ -51,7 +55,8 @@ public class NotebookEdit extends QDialog {
                
                QGridLayout textLayout = new QGridLayout();
                notebook = new QLineEdit();
-               textLayout.addWidget(new QLabel(tr("Notebook Name")), 1,1);
+               notebookLabel = new QLabel(tr("Notebook Name"));
+               textLayout.addWidget(notebookLabel, 1,1);
                textLayout.addWidget(notebook, 1, 2);
                textLayout.setContentsMargins(10, 10,-10, -10);
                grid.addLayout(textLayout,1,1);
@@ -98,6 +103,13 @@ public class NotebookEdit extends QDialog {
                return notebook.text();
        }
        
+       // Set the stack names
+       public void setStacks(List<String> s) {
+               stacks = s;
+               stackEdit = true;
+               notebookLabel.setText(new String(tr("Stack Name")));
+       }
+       
        // Set the notebook name
        public void setNotebook(String name) {
                if (name.equalsIgnoreCase("All Notebooks")) {
@@ -154,6 +166,14 @@ public class NotebookEdit extends QDialog {
                        ok.setEnabled(false);
        }
        
+       // Hide checkboxes
+       public void hideDefaultCheckbox() {
+               isDefault.setVisible(false);
+       }
+       public void hideLocalCheckbox() {
+               localRemote.setVisible(false);
+       }
+       
        // Watch what text is being entered
        @SuppressWarnings("unused")
        private void textChanged() {
@@ -165,16 +185,26 @@ public class NotebookEdit extends QDialog {
                        ok.setEnabled(false);
                        return;
                }
-               if (currentNotebooks == null) {
-                       ok.setEnabled(false);
-                       return;
+               if (stackEdit) {
+                       for (int i=0; i<stacks.size(); i++) {
+                               if (stacks.get(i).equalsIgnoreCase(notebook.text())) {
+                                       ok.setEnabled(false);
+                                       return;
+                               }
+                       }
                }
-               for (int i=0; i<currentNotebooks.size(); i++) {
-                       String s = currentNotebooks.get(i).getName();
-                       if (s.equalsIgnoreCase(notebook.text())) {
+               if (!stackEdit) {
+                       if (currentNotebooks == null) {
                                ok.setEnabled(false);
                                return;
                        }
+                       for (int i=0; i<currentNotebooks.size(); i++) {
+                               String s = currentNotebooks.get(i).getName();
+                               if (s.equalsIgnoreCase(notebook.text())) {
+                                       ok.setEnabled(false);
+                                       return;
+                               }
+                       }
                }
                ok.setEnabled(true);
        }
diff --git a/src/cx/fbn/nevernote/dialog/StackNotebook.java b/src/cx/fbn/nevernote/dialog/StackNotebook.java
new file mode 100644 (file)
index 0000000..4fac977
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * This file is part of NeverNote 
+ * Copyright 2009 Randy Baumgarte
+ * 
+ * This file may be licensed under the terms of of the
+ * GNU General Public License Version 2 (the ``GPL'').
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the GPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the GPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+package cx.fbn.nevernote.dialog;
+
+import java.util.List;
+
+import com.trolltech.qt.gui.QComboBox;
+import com.trolltech.qt.gui.QDialog;
+import com.trolltech.qt.gui.QGridLayout;
+import com.trolltech.qt.gui.QLabel;
+import com.trolltech.qt.gui.QPushButton;
+
+public class StackNotebook extends QDialog {
+       private boolean                 okPressed;
+       private final QComboBox stack;
+       QPushButton                     ok;
+       List<String>                    currentStacks;
+       
+       // Constructor
+       public StackNotebook() {
+               okPressed = false;
+               setWindowTitle(tr("Stack Notebook"));
+               QGridLayout grid = new QGridLayout();
+               setLayout(grid);
+               
+               QGridLayout textGrid = new QGridLayout();
+               stack = new QComboBox();
+               stack.setEditable(true);
+               textGrid.addWidget(new QLabel(tr("Stack Name")), 1,1);
+               textGrid.addWidget(stack, 1, 2);
+               textGrid.setContentsMargins(10, 10,-10, -10);
+               grid.addLayout(textGrid,1,1);
+               
+               QGridLayout buttonGrid = new QGridLayout();
+               ok = new QPushButton(tr("OK"));
+               ok.clicked.connect(this, "okButtonPressed()");
+               ok.setEnabled(true);
+               QPushButton cancel = new QPushButton(tr("Cancel"));
+               cancel.clicked.connect(this, "cancelButtonPressed()");
+               stack.currentStringChanged.connect(this, "textChanged(String)");
+               buttonGrid.addWidget(ok, 3, 1);
+               buttonGrid.addWidget(cancel, 3,2);
+               grid.addLayout(buttonGrid,2,1);
+       }
+       
+       // The OK button was pressed
+       @SuppressWarnings("unused")
+       private void okButtonPressed() {
+               okPressed = true;
+               close();
+       }
+       
+       // The CANCEL button was pressed
+       @SuppressWarnings("unused")
+       private void cancelButtonPressed() {
+               okPressed = false;
+               close();
+       }
+       
+       // Get the name from the field
+       public String getStackName() {
+               return stack.currentText();
+       }
+       
+       public void setStackNames(List<String> names) {
+               currentStacks = names;
+               stack.clear();
+               for (int i=0; i<names.size(); i++) {
+                       stack.addItem(names.get(i));
+               }
+       }
+       
+       // Set the tag name
+       public void setStackName(String name) {
+               stack.setEditText(name);
+       }
+       
+       // Check if the OK button was pressed
+       public boolean okPressed() {
+               return okPressed;
+       }
+       
+       // Set the window title
+       public void setTitle(String s) {
+               setWindowTitle(s);
+       }
+       // List of existing tags
+       public void setTagList(List<String> t) {
+               currentStacks = t;
+       }
+       // Watch what text is being entered
+       @SuppressWarnings("unused")
+       private void textChanged(String text) {
+               ok.setEnabled(true);
+       }
+}
index 39a03d4..f17c303 100644 (file)
@@ -103,6 +103,7 @@ public class MainMenuBar extends QMenuBar {
        public QAction                  notebookDeleteAction;           // Delete a notebook\r
        public QAction                  notebookCloseAction;            // Close notebooks\r
        public QAction                  notebookIconAction;                     // Change the icon\r
+       public QAction                  notebookStackAction;            // Stack/Unstack the icon.\r
        \r
        public QAction                  savedSearchAddAction;           // Add a saved search\r
        public QAction                  savedSearchEditAction;          // Edit a saved search\r
@@ -459,6 +460,11 @@ public class MainMenuBar extends QMenuBar {
                notebookIconAction.triggered.connect(parent, "setNotebookIcon()");\r
                setupShortcut(notebookIconAction, "File_Notebook_Icon");\r
                \r
+               notebookStackAction = new QAction(tr("Set Stack"), this);\r
+               notebookStackAction.setEnabled(false);\r
+               notebookStackAction.triggered.connect(parent, "stackNotebook()");\r
+               setupShortcut(notebookStackAction, "File_Notebook_Stack");\r
+               \r
                tagAddAction = new QAction(tr("Add"),this);\r
                tagAddAction.triggered.connect(parent, "addTag()");\r
                //tagAddAction.setShortcut("Ctrl+Shift+T");\r
@@ -668,6 +674,7 @@ public class MainMenuBar extends QMenuBar {
                notebookMenu.addAction(notebookEditAction);\r
                notebookMenu.addAction(notebookDeleteAction);\r
                notebookMenu.addSeparator();\r
+               notebookMenu.addAction(notebookStackAction);\r
                notebookMenu.addAction(notebookCloseAction);\r
                notebookMenu.addSeparator();\r
                notebookMenu.addAction(notebookIconAction);\r
index 86a645c..5fcd3a1 100644 (file)
@@ -45,14 +45,18 @@ import com.trolltech.qt.gui.QTreeWidgetItem.ChildIndicatorPolicy;
 import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.filters.NotebookCounter;\r
 import cx.fbn.nevernote.signals.NoteSignal;\r
+import cx.fbn.nevernote.sql.DatabaseConnection;\r
 \r
 public class NotebookTreeWidget extends QTreeWidget {\r
        private QAction                                 deleteAction;\r
        private QAction                                 addAction;\r
        private QAction                                 editAction;\r
        private QAction                                 iconAction;\r
+       private QAction                                 stackAction;\r
        public NoteSignal                               noteSignal;\r
        private HashMap<String, QIcon>  icons;\r
+       private final DatabaseConnection                db;\r
+       private List<NotebookCounter> lastCounts;\r
        private final HashMap<String, QTreeWidgetItem>  stacks;\r
 //     private final QTreeWidgetItem                   previousMouseOver;\r
 //     private boolean                                 previousMouseOverWasSelected;\r
@@ -69,12 +73,17 @@ public class NotebookTreeWidget extends QTreeWidget {
                editAction = e;\r
        }\r
        \r
+       public void setStackAction(QAction e) {\r
+               stackAction = e;\r
+       }\r
+       \r
        public void setIconAction(QAction e) {\r
                iconAction = e;\r
        }\r
        \r
-       public NotebookTreeWidget() {\r
+       public NotebookTreeWidget(DatabaseConnection db) {\r
                noteSignal = new NoteSignal();\r
+               this.db = db;\r
 //             setProperty("hideTree", true);\r
                List<String> labels = new ArrayList<String>();\r
                labels.add("Notebooks");\r
@@ -157,6 +166,7 @@ public class NotebookTreeWidget extends QTreeWidget {
        Notebook book;\r
        QTreeWidgetItem child;\r
        clear();\r
+       stacks.clear();\r
        \r
        if (books == null)\r
                return;\r
@@ -180,15 +190,9 @@ public class NotebookTreeWidget extends QTreeWidget {
                        String stackName = book.getStack();\r
                        QTreeWidgetItem parent;\r
                        if (!stacks.containsKey(stackName)) {\r
-                               String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
-                       QIcon stackIcon = new QIcon(iconPath+"books2.png");\r
-                               parent = new QTreeWidgetItem();\r
-                               stacks.put(stackName, parent);\r
-                               parent.setText(0, stackName);\r
-                               parent.setIcon(0, stackIcon);\r
-                               parent.setText(2, "STACK");\r
-                               parent.setTextAlignment(1, ra.value());\r
+                               parent = createStackIcon(stackName, ra);\r
                                addTopLevelItem(parent);\r
+                               stacks.put(stackName, parent);\r
                        } else\r
                                parent = stacks.get(stackName);\r
                        parent.addChild(child);\r
@@ -214,9 +218,9 @@ public class NotebookTreeWidget extends QTreeWidget {
 \r
        // update the display with the current number of notes\r
        public void updateCounts(List<Notebook> books, List<NotebookCounter> counts) {\r
+               lastCounts = counts;\r
                QTreeWidgetItem root = invisibleRootItem();\r
                QTreeWidgetItem child;\r
-               HashMap<String, Integer> stackCounts = new HashMap<String, Integer>();\r
                \r
                QBrush blue = new QBrush();\r
                QBrush black = new QBrush();\r
@@ -299,6 +303,7 @@ public class NotebookTreeWidget extends QTreeWidget {
                menu.addAction(addAction);\r
                menu.addAction(editAction);\r
                menu.addAction(deleteAction);\r
+               menu.addAction(stackAction);\r
                menu.addSeparator();\r
                menu.addAction(iconAction);\r
                menu.exec(event.globalPos());\r
@@ -311,6 +316,20 @@ public class NotebookTreeWidget extends QTreeWidget {
                        event.accept();\r
                        return;\r
                }\r
+               if (event.source() == this) {\r
+                       event.mimeData().setData("application/x-nevernote-notebook", new QByteArray(currentItem().text(2)));\r
+                       List<QTreeWidgetItem> selected = selectedItems();\r
+                       for (int i=0; i<selected.size(); i++) {\r
+                               if (selected.get(i).text(2).equalsIgnoreCase("STACK") || \r
+                                       selected.get(i).text(2).equals("")) {\r
+                                               event.ignore();\r
+                                               return;\r
+                                       }\r
+                       }\r
+                       event.accept();\r
+                       return;\r
+               }\r
+               event.ignore();\r
        }\r
        \r
        \r
@@ -340,16 +359,113 @@ public class NotebookTreeWidget extends QTreeWidget {
        \r
        @Override\r
        public boolean dropMimeData(QTreeWidgetItem parent, int index, QMimeData data, Qt.DropAction action) {\r
+               if (data.hasFormat("application/x-nevernote-notebook")) {\r
+                       return false;\r
+               }\r
+               \r
+               if (data.hasFormat("application/x-nevernote-notebook")) {\r
+                       QByteArray d = data.data("application/x-nevernote-notebook");\r
+                       String current = d.toString();\r
+                       \r
+                       // If dropping to the top level, then remove the stack\r
+                       if (parent == null) {\r
+                               db.getNotebookTable().clearStack(current);\r
+                               return true;\r
+                       } \r
+                       \r
+                       // If trying to drop under the "All notebooks" then ignore\r
+                       if (parent.text(2).equals(""))\r
+                               return false;\r
+                       \r
+                       \r
+                       // If we are NOT droping directly onto the stack icon\r
+                       // we need to find the stack widget\r
+                       String stackName;\r
+                       QTreeWidgetItem stackItem;\r
+                       List<QTreeWidgetItem> currentItems = selectedItems();\r
+                       if (!parent.text(2).equalsIgnoreCase("STACK")) {\r
+                               \r
+                               // If a parent stack exists, then use it.\r
+                               if (parent.parent() != null) {\r
+                                       stackName = parent.parent().text(0);\r
+                                       stackItem = parent.parent();\r
+                               } else {\r
+                                       \r
+                                       currentItems.add(parent);\r
+                                       // If a stack doesn't exist, then we need to create one\r
+                                       stackName = "New Stack";        \r
+                                       // Find a new stack name that isn't in use\r
+                                       for (int i=1; i<101; i++) {\r
+                                               if (stacks.containsKey(stackName))\r
+                                                       stackName = "New Stack(" +new Integer(i).toString() + ")";\r
+                                               else\r
+                                                       break;\r
+                                       }\r
+                                       db.getNotebookTable().setStack(parent.text(2), stackName);\r
+                                       Qt.Alignment ra = new Qt.Alignment(Qt.AlignmentFlag.AlignRight);\r
+                                       stackItem = createStackIcon(stackName, ra);\r
+                                       addTopLevelItem(stackItem);\r
+                               }\r
+                       } else {\r
+                               stackName = parent.text(0);\r
+                               stackItem = parent;\r
+                       }\r
+                       \r
+                       List<QTreeWidgetItem> newItems = new ArrayList<QTreeWidgetItem>();\r
+                       for (int i=0; i<currentItems.size(); i++) {\r
+                               newItems.add(copyTreeItem(currentItems.get(i)));\r
+                               currentItems.get(i).setHidden(true);\r
+                       }\r
+                       db.getNotebookTable().setStack(current, stackName);             \r
+                       stackItem.addChildren(newItems);\r
+                       \r
+                       return true;\r
+               }\r
+               \r
+               \r
+               // If we are dropping a note onto a notebook\r
                if (data.hasFormat("application/x-nevernote-note")) {\r
                        QByteArray d = data.data("application/x-nevernote-note");\r
                        String s = d.toString();\r
                        String noteGuidArray[] = s.split(" ");\r
                        for (String element : noteGuidArray) {\r
-                               if (!parent.text(0).equalsIgnoreCase("All Notebooks"))\r
+                               if (!parent.text(0).equalsIgnoreCase("All Notebooks") && \r
+                                               !parent.text(2).equalsIgnoreCase("STACK"))\r
                                        noteSignal.notebookChanged.emit(element.trim(), parent.text(2));\r
                        }\r
                        return true;\r
                }\r
                return false;\r
        }\r
+       \r
+\r
+       private QTreeWidgetItem createStackIcon(String stackName, Qt.Alignment ra) {\r
+               String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
+               QIcon stackIcon = new QIcon(iconPath+"books2.png");\r
+               QTreeWidgetItem parent = new QTreeWidgetItem();\r
+               stacks.put(stackName, parent);\r
+               parent.setText(0, stackName);\r
+               parent.setIcon(0, stackIcon);\r
+               parent.setText(2, "STACK");\r
+               parent.setTextAlignment(1, ra.value());\r
+               return parent;\r
+       }\r
+\r
+       \r
+       \r
+       // Copy an individual item within the tree.  I need to do this because\r
+       // Qt doesn't call the dropMimeData on a move, just a copy.\r
+       private QTreeWidgetItem copyTreeItem(QTreeWidgetItem source) {\r
+               QTreeWidgetItem target = new QTreeWidgetItem(this);\r
+               target.setText(0, source.text(0));\r
+               target.setIcon(0, source.icon(0));\r
+               target.setText(1, source.text(1));\r
+               target.setText(2, source.text(2));\r
+               Qt.Alignment ra = new Qt.Alignment(Qt.AlignmentFlag.AlignRight);\r
+               target.setTextAlignment(1, ra.value());\r
+               source.setHidden(true);\r
+\r
+               return target;\r
+       }\r
+\r
 }\r
index 7859383..c3a803d 100644 (file)
@@ -296,11 +296,11 @@ public class TagTreeWidget extends QTreeWidget {
                                return false;\r
                        QTreeWidgetItem newChild;\r
                        if (parent == null) {\r
-                               tagSignal.changeParent.emit(current, "");\r
+//                             tagSignal.changeParent.emit(current, "");\r
                                db.getTagTable().updateTagParent(current, "");\r
                                newChild = new QTreeWidgetItem(this);\r
                        } else {\r
-                               tagSignal.changeParent.emit(current, parent.text(2));\r
+//                             tagSignal.changeParent.emit(current, parent.text(2));\r
                                db.getTagTable().updateTagParent(current, parent.text(2));\r
                                newChild = new QTreeWidgetItem(parent);\r
                        }\r
index 5a3094a..141ea1d 100644 (file)
@@ -28,7 +28,7 @@ import cx.fbn.nevernote.filters.TagCounter;
 \r
 public class TagSignal extends QSignalEmitter {\r
        public Signal0 listChanged = new Signal0();\r
-       public Signal2<String,String> changeParent = new Signal2<String, String>();\r
+//     public Signal2<String,String> changeParent = new Signal2<String, String>();\r
        public Signal1<List<TagCounter>> refreshTagTreeCounts = new Signal1<List<TagCounter>>();\r
        public Signal1<List<TagCounter>> countsChanged = new Signal1<List<TagCounter>>();\r
 \r
index 44c0cc6..47a6113 100644 (file)
@@ -140,23 +140,7 @@ public class DatabaseConnection {
                        Global.setDatabaseVersion(version);
                } 
                if (version.equals("0.86")) {
-/*                     sharedNotebookTable.dropTable();
-                       linkedNotebookTable.dropTable();
-                       
-                       executeSql("alter table notebook drop column publishingUri");
-                       executeSql("alter table notebook drop column publishingOrder");
-                       executeSql("alter table notebook drop column publishingAscending");
-                       executeSql("alter table notebook drop column publishingPublicDescription");
-                       executeSql("alter table notebook drop column stack");
-                       executeSql("alter table notebook drop column icon");
-                       executeSql("alter table tag drop column icon");
-                       executeSql("alter table SavedSearch drop column icon");
-                       
-                       executeSql("drop index NOTE_THUMBNAIL_INDEX;");
-                       executeSql("drop index NOTE_EXPUNGED_INDEX;");
-                       executeSql("drop index NOTE_DUEDATE_INDEX;");
-                       executeSql("drop index RESOURCES_GUID_INDEX;");
-*/             
+       
                        executeSql("alter table notebook add column publishingUri VarChar");
                        executeSql("alter table notebook add column publishingOrder Integer");
                        executeSql("alter table notebook add column publishingAscending VarChar");
@@ -207,7 +191,6 @@ public class DatabaseConnection {
        
        public void createTables() {
                Global.setDatabaseVersion("0.85");
-//             Global.setDatabaseVersion("0.95");
                Global.setAutomaticLogin(false);
                Global.saveCurrentNoteGuid("");
                Global.saveUploadAmount(0);
@@ -220,8 +203,7 @@ public class DatabaseConnection {
                watchFolderTable.createTable();
                invalidXMLTable.createTable();
                wordsTable.createTable();
-               syncTable.createTable();
-               
+               syncTable.createTable();                
        }
        
        public Connection getConnection() {
index 41379db..e528364 100644 (file)
@@ -70,7 +70,41 @@ public class NotebookTable {
         newnote.setName("My Notebook");\r
         newnote.setPublished(false);\r
         newnote.setGuid("1");\r
-        addNotebook(newnote, true, false);\r
+        \r
+        // Setup an initial notebook\r
+               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
+        query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
+                               +"serviceCreated, serviceUpdated, published, "   \r
+                               + "isDirty, autoEncrypt, " \r
+                               + "local, archived) Values("\r
+                               +":guid, :sequence, :name, :defaultNotebook,  "\r
+                               +":serviceCreated, :serviceUpdated, :published, "\r
+                               +":isDirty, :autoEncrypt, "\r
+                               +":local, false)");\r
+               query.bindValue(":guid", newnote.getGuid());\r
+               query.bindValue(":sequence", newnote.getUpdateSequenceNum());\r
+               query.bindValue(":name", newnote.getName());\r
+               query.bindValue(":defaultNotebook", newnote.isDefaultNotebook());\r
+               \r
+               StringBuilder serviceCreated = new StringBuilder(simple.format(newnote.getServiceCreated()));                   \r
+               StringBuilder serviceUpdated = new StringBuilder(simple.format(newnote.getServiceUpdated()));\r
+               if (serviceUpdated.toString() == null)\r
+                       serviceUpdated = serviceCreated;\r
+               query.bindValue(":serviceCreated", serviceCreated.toString());\r
+               query.bindValue(":serviceUpdated", serviceCreated.toString());\r
+               query.bindValue(":published",newnote.isPublished());\r
+               \r
+               query.bindValue(":isDirty", true);\r
+               query.bindValue(":autoEncrypt", false);\r
+               query.bindValue(":local", false);\r
+\r
+               boolean check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Initial Notebook Table insert failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError().toString());\r
+               }\r
+\r
                \r
        }\r
        // Drop the table\r
@@ -86,12 +120,12 @@ public class NotebookTable {
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                check = query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
                                +"serviceCreated, serviceUpdated, published, "   \r
-                               + "isDirty, autoEncrypt, stack" \r
+                               + "isDirty, autoEncrypt, stack\r
                                + "local, archived) Values("\r
                                +":guid, :sequence, :name, :defaultNotebook,  "\r
                                +":serviceCreated, :serviceUpdated, :published, "\r
                                +":isDirty, :autoEncrypt, "\r
-                               +":local, false, :stack)");\r
+                               +":stack, :local, false)");\r
                query.bindValue(":guid", tempNotebook.getGuid());\r
                query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
                query.bindValue(":name", tempNotebook.getName());\r
@@ -349,7 +383,7 @@ public class NotebookTable {
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                                        \r
                check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, serviceUpdated, published from Notebook where isDirty = true and local=false");\r
+                               "serviceCreated, serviceUpdated, published, stack from Notebook where isDirty = true and local=false");\r
                if (!check) \r
                        logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
                while (query.next()) {\r
@@ -368,7 +402,8 @@ public class NotebookTable {
                                e.printStackTrace();\r
                        }\r
                        tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
-                       index.add(tempNotebook); \r
+                       tempNotebook.setStack(query.valueString(7));\r
+                       index.add(tempNotebook);\r
                }       \r
                return index;   \r
        }\r
@@ -509,5 +544,68 @@ public class NotebookTable {
                return counts;\r
        }\r
 \r
+       // Get/Set stacks\r
+       public void clearStack(String guid) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update notebook set stack='' where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error clearing notebook stack.");\r
+       }\r
+       // Get/Set stacks\r
+       public void setStack(String guid, String stack) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update notebook set stack=:stack, isDirty=true where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":stack", stack);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error setting notebook stack.");\r
+       }\r
+       // Get all stack names\r
+       public List<String> getAllStackNames() {\r
+               List<String> stacks = new ArrayList<String>();\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               if (!query.exec("Select distinct stack from notebook")) {\r
+                       logger.log(logger.EXTREME, "Error getting all stack names.");\r
+                       return null;\r
+               }\r
+               \r
+               while (query.next()) {\r
+                       if (query.valueString(0) != null && !query.valueString(0).trim().equals(""))\r
+                               stacks.add(query.valueString(0));\r
+               }\r
+               return stacks;\r
+       }\r
+       // Rename a stack\r
+       public void renameStacks(String oldName, String newName) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               if (!query.prepare("update notebook set stack=:newName where stack=:oldName")) {\r
+                       logger.log(logger.EXTREME, "Error preparing in renameStacks.");\r
+                       return;\r
+               }\r
+               query.bindValue(":oldName", oldName);\r
+               query.bindValue(":newName", newName);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "Error updating stack names");\r
+                       return;\r
+               }\r
+       }\r
+       // Get/Set stacks\r
+       public boolean stackExists(String stack) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select guid from notebook where stack=:stack limit 1");\r
+               query.bindValue(":stack", stack);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error setting notebook stack.");\r
+               if (query.next())\r
+                       return true;\r
+               else\r
+                       return false;\r
+       }\r
 }\r
 \r
index 1e964ed..6e0696b 100644 (file)
@@ -797,6 +797,15 @@ public class ListManager  {
                }\r
                conn.getNotebookTable().expungeNotebook(guid, true);            \r
        }\r
+       // Rename a stack\r
+       public void renameStack(String oldName, String newName) {\r
+               for (int i=0; i<getNotebookIndex().size(); i++) {\r
+                       if (getNotebookIndex().get(i).getStack() != null && \r
+                                       getNotebookIndex().get(i).getStack().equalsIgnoreCase(oldName)) {\r
+                               getNotebookIndex().get(i).setStack(newName);\r
+                       }\r
+               }       \r
+       }\r
        // Update a notebook sequence number\r
        public void updateNotebookSequence(String guid, int sequence) {\r
                logger.log(logger.HIGH, "Entering ListManager.updateNotebookSequence");\r
@@ -827,6 +836,21 @@ public class ListManager  {
                logger.log(logger.HIGH, "Leaving ListManager.updateNotebookGuid");\r
 \r
        }\r
+       // Update a notebook Guid number\r
+       public void updateNotebookStack(String oldGuid, String stack) {\r
+               logger.log(logger.HIGH, "Entering ListManager.updateNotebookGuid");\r
+\r
+               conn.getNotebookTable().setStack(oldGuid, stack);\r
+               \r
+               for (int i=0; i<notebookIndex.size(); i++) {\r
+                       if (notebookIndex.get(i).getGuid().equals(oldGuid)) {\r
+                               notebookIndex.get(i).setStack(stack);\r
+                               i=notebookIndex.size()+1;\r
+                       }\r
+               }\r
+               logger.log(logger.HIGH, "Leaving ListManager.updateNotebookGuid");\r
+\r
+       }\r
        \r
        \r
        //************************************************************************************\r