/*\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
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
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
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
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
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
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
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
// 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
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
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
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
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
}\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