OSDN Git Service

Correct problem with tag tree reloading incorrectly after a sync.
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / gui / TagTreeWidget.java
index f30f254..0633557 100644 (file)
@@ -1,6 +1,7 @@
 /*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
+ * This file is part of NixNote \r
+ * Copyright 2009,2010 Randy Baumgarte\r
+ * Copyright 2010 Hiroshi Miura\r
  * \r
  * This file may be licensed under the terms of of the\r
  * GNU General Public License Version 2 (the ``GPL'').\r
 package cx.fbn.nevernote.gui;\r
 \r
 import java.util.ArrayList;\r
+import java.util.HashMap;\r
 import java.util.List;\r
 \r
+import com.evernote.edam.type.Note;\r
 import com.evernote.edam.type.Tag;\r
 import com.trolltech.qt.core.QByteArray;\r
 import com.trolltech.qt.core.QMimeData;\r
@@ -39,6 +42,7 @@ import com.trolltech.qt.gui.QDragMoveEvent;
 import com.trolltech.qt.gui.QHeaderView;\r
 import com.trolltech.qt.gui.QIcon;\r
 import com.trolltech.qt.gui.QMenu;\r
+import com.trolltech.qt.gui.QMouseEvent;\r
 import com.trolltech.qt.gui.QTreeWidget;\r
 import com.trolltech.qt.gui.QTreeWidgetItem;\r
 \r
@@ -52,10 +56,17 @@ public class TagTreeWidget extends QTreeWidget {
        private QAction editAction;\r
        private QAction deleteAction;\r
        private QAction addAction;\r
+       private QAction iconAction;\r
+       private QAction mergeAction;\r
        public TagSignal tagSignal;\r
        public NoteSignal noteSignal;\r
        private boolean showAllTags;\r
        private final DatabaseConnection db;\r
+       private HashMap<String, QIcon>  icons;\r
+       public Signal0 selectionSignal;\r
+       public String selectedTag;\r
+       private boolean rightButtonClicked;\r
+       private List<TagCounter> lastCount;\r
        \r
        \r
        public TagTreeWidget(DatabaseConnection d) {\r
@@ -69,17 +80,24 @@ public class TagTreeWidget extends QTreeWidget {
                header().setResizeMode(0, QHeaderView.ResizeMode.ResizeToContents);\r
                header().setResizeMode(1, QHeaderView.ResizeMode.Stretch);\r
                header().setMovable(false);\r
+               header().setStyleSheet("QHeaderView::section {border: 0.0em;}");\r
                db = d;\r
+               selectionSignal = new Signal0();\r
                tagSignal = new TagSignal();\r
                noteSignal = new NoteSignal();\r
                setDragDropMode(QAbstractItemView.DragDropMode.DragDrop);\r
        setHeaderLabels(headers);\r
-       setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection);\r
+\r
+//     setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection);\r
+       setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection);\r
        \r
+       selectedTag = "";\r
+       itemClicked.connect(this, "itemClicked()");\r
                int width = Global.getColumnWidth("tagTreeName");\r
                if (width>0)\r
                        setColumnWidth(0, width);\r
 \r
+               \r
        }\r
        \r
        public void setEditAction(QAction e) {\r
@@ -91,6 +109,11 @@ public class TagTreeWidget extends QTreeWidget {
        public void setAddAction(QAction a) {\r
                addAction = a;\r
        }\r
+       public void setIconAction(QAction i) {\r
+               iconAction = i;\r
+       }\r
+       public void setMergeAction(QAction i) { \r
+               mergeAction = i; }\r
        \r
        // Insert a new tag into the tree.  This is used when we dynamically add a \r
        // new tag after the full tag tree has been built.  It only adds to the\r
@@ -98,11 +121,11 @@ public class TagTreeWidget extends QTreeWidget {
        public void insertTag(String name, String guid) {\r
        String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
                QIcon icon = new QIcon(iconPath+"tag.png");\r
-               QTreeWidgetItem child;\r
+               NTreeWidgetItem child;\r
                Qt.Alignment ra = new Qt.Alignment(Qt.AlignmentFlag.AlignRight);\r
                \r
                // Build new tag & add it\r
-               child = new QTreeWidgetItem();\r
+               child = new NTreeWidgetItem();\r
                child.setText(0, name);\r
                child.setIcon(0,icon);\r
                child.setText(2, guid);\r
@@ -115,11 +138,56 @@ public class TagTreeWidget extends QTreeWidget {
        sortItems(0, SortOrder.AscendingOrder);\r
        }\r
        \r
+       private QIcon findDefaultIcon(String guid) {\r
+       String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
+               QIcon icon = new QIcon(iconPath+"tag.png");\r
+               QIcon linkedIcon = new QIcon(iconPath+"tag-orange.png");\r
+\r
+               if (db.getTagTable().getNotebookGuid(guid) == null || \r
+                               db.getTagTable().getNotebookGuid(guid).equals(""))\r
+                       return icon;\r
+               else\r
+                       return linkedIcon;\r
+       }\r
+       \r
+       List<String> findExpandedTags(QTreeWidgetItem item) {\r
+               List<String> list = new ArrayList<String>();\r
+               if (item.isExpanded()) \r
+                       list.add(item.text(0));\r
+               for (int i=0; i<item.childCount(); i++) {\r
+                       List<String> childrenList = findExpandedTags(item.child(i));\r
+                       for (int j=0; j<childrenList.size(); j++) {\r
+                               list.add(childrenList.get(j));\r
+                       }\r
+               }\r
+               \r
+               return list;\r
+       }\r
+       \r
+       void expandTags(QTreeWidgetItem item, List<String> expandedTags) {\r
+               for (int i=0; i<item.childCount(); i++) {\r
+                       expandTags(item.child(i), expandedTags);\r
+               }\r
+               \r
+               for (int i=0; i<expandedTags.size(); i++) {\r
+                       if (expandedTags.get(i).equalsIgnoreCase(item.text(0))) {\r
+                               expandItem(item);\r
+                               i=expandedTags.size();\r
+                       }\r
+               }\r
+       }\r
+       \r
        public void load(List<Tag> tags) {\r
        Tag tag;\r
-       List<QTreeWidgetItem> index = new ArrayList<QTreeWidgetItem>();\r
-       QTreeWidgetItem child;\r
+       List<NTreeWidgetItem> index = new ArrayList<NTreeWidgetItem>();\r
+       NTreeWidgetItem child;\r
                        \r
+       /* First, let's find out which stacks are expanded */\r
+       QTreeWidgetItem root =  invisibleRootItem();\r
+       List<String> expandedTags = findExpandedTags(root);\r
+\r
+\r
+       \r
        //Clear out the tree & reload\r
        clear();\r
        String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
@@ -137,9 +205,14 @@ public class TagTreeWidget extends QTreeWidget {
                for (int i=0; i<tempList.size(); i++) {\r
                        tag = tempList.get(i);\r
                        if (tag.getParentGuid()==null || tag.getParentGuid().equals("")) {\r
-                               child = new QTreeWidgetItem();\r
+                               child = new NTreeWidgetItem();\r
                                child.setText(0, tag.getName());\r
-                               child.setIcon(0,icon);\r
+                               if (icons != null && !icons.containsKey(tag.getGuid())) {\r
+                                       child.setIcon(0, findDefaultIcon(tag.getGuid()));\r
+                               } else {\r
+                                       child.setIcon(0, icons.get(tag.getGuid()));\r
+                               }\r
+\r
                                child.setText(2, tag.getGuid());\r
                                child.setTextAlignment(1, ra.value());\r
                                index.add(child);\r
@@ -149,11 +222,16 @@ public class TagTreeWidget extends QTreeWidget {
                                // We need to find the parent\r
                                for (int j=0; j<index.size(); j++) {\r
                                        if (index.get(j).text(2).equals(tag.getParentGuid())) {\r
-                                       child = new QTreeWidgetItem();\r
+                                       child = new NTreeWidgetItem();\r
                                        child.setText(0, tag.getName());\r
                                        child.setIcon(0, icon);\r
                                        child.setText(2, tag.getGuid());\r
                                        child.setTextAlignment(1, ra.value());\r
+                                       if (icons != null && !icons.containsKey(tag.getGuid())) {\r
+                                               child.setIcon(0, findDefaultIcon(tag.getGuid()));\r
+                                       } else {\r
+                                               child.setIcon(0, icons.get(tag.getGuid()));\r
+                                       }\r
                                        tempList.remove(i);\r
                                        index.add(child);                                               \r
                                        index.get(j).addChild(child);\r
@@ -165,23 +243,20 @@ public class TagTreeWidget extends QTreeWidget {
        resizeColumnToContents(0);\r
        resizeColumnToContents(1);\r
        sortItems(0, SortOrder.AscendingOrder);\r
+       \r
+       expandTags(invisibleRootItem(), expandedTags);\r
+       if (lastCount != null)\r
+               updateCounts(lastCount);\r
        }\r
        // Show (unhide) all tags\r
        public void showAllTags(boolean value) {\r
                showAllTags = value;\r
        }\r
-       public void unhideAllTags() {\r
-               MatchFlags flags = new MatchFlags();\r
-               flags.set(MatchFlag.MatchWildcard);\r
-               flags.set(MatchFlag.MatchRecursive);\r
-               List <QTreeWidgetItem>  children = findItems("*", flags);\r
-               for (int i=0; i<children.size(); i++) {\r
-                       children.get(i).setHidden(false);\r
-               }\r
-       }\r
+\r
        // update the display with the current number of notes\r
        public void updateCounts(List<TagCounter> counts) {\r
                                \r
+               lastCount = counts;\r
                MatchFlags flags = new MatchFlags();\r
                flags.set(MatchFlag.MatchWildcard);\r
                flags.set(MatchFlag.MatchRecursive);\r
@@ -283,11 +358,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
@@ -296,12 +371,23 @@ public class TagTreeWidget extends QTreeWidget {
                        sortItems(0, SortOrder.AscendingOrder);\r
                        return true;\r
                }\r
+               \r
+               // If we are dropping a note\r
                if (data.hasFormat("application/x-nevernote-note")) {\r
+                       String notebookGuid = db.getTagTable().getNotebookGuid(parent.text(2));\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 (!db.getNoteTable().noteTagsTable.checkNoteNoteTags(element.trim(), parent.text(2))) {\r
+                               Note n = db.getNoteTable().getNote(element.trim(), false, false, false, false, false);\r
+                               \r
+                               // Check that...\r
+                               // 1.) Check that tag isn't already assigned to that note\r
+                               // 2.) Check that that tag is valid for that notebook or the tag isn't notebook specific\r
+                               // 3.) Check that the notebook isn't read only.\r
+                               if (!db.getNoteTable().noteTagsTable.checkNoteNoteTags(element.trim(), parent.text(2)) &&\r
+                                               (notebookGuid == null || n.getNotebookGuid().equalsIgnoreCase(notebookGuid) || notebookGuid.equals("")) &&\r
+                                               !db.getNotebookTable().isReadOnly(n.getNotebookGuid())) {\r
                                        db.getNoteTable().noteTagsTable.saveNoteTag(element.trim(), parent.text(2));\r
                                        noteSignal.tagsAdded.emit(element.trim(), parent.text(2));\r
                                }\r
@@ -319,9 +405,16 @@ public class TagTreeWidget extends QTreeWidget {
                menu.addAction(addAction);\r
                menu.addAction(editAction);\r
                menu.addAction(deleteAction);\r
+               menu.addAction(mergeAction);\r
+               menu.addSeparator();\r
+               menu.addAction(iconAction);\r
                menu.exec(event.globalPos());\r
        }\r
        \r
+       public void setIcons(HashMap<String, QIcon> i) {\r
+               icons = i;\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 void copyTreeItem(QTreeWidgetItem source, QTreeWidgetItem target) {\r
@@ -364,4 +457,32 @@ public class TagTreeWidget extends QTreeWidget {
                        }\r
                }\r
        }\r
+\r
+       @SuppressWarnings("unused")\r
+       private void itemClicked() {\r
+               \r
+               List<QTreeWidgetItem> selectedItem = selectedItems();\r
+               if (selectedItem.size() == 1) {\r
+                       if (selectedItem.get(0).text(0).equalsIgnoreCase(selectedTag) && !rightButtonClicked) {\r
+                               selectedTag = "";\r
+                               clearSelection();\r
+                       } else {\r
+                               selectedTag = selectedItem.get(0).text(0);\r
+                       }\r
+                       \r
+               }\r
+               selectionSignal.emit();\r
+       }\r
+\r
+       \r
+       @Override\r
+       public void mousePressEvent(QMouseEvent e) {\r
+               if (e.button() == Qt.MouseButton.RightButton)\r
+                       rightButtonClicked = true;\r
+               else\r
+                       rightButtonClicked = false;\r
+               super.mousePressEvent(e);\r
+       }\r
+\r
+       \r
 }\r