OSDN Git Service

Add the ability to pin notes.
authorRandy Baumgarte <randy@fbn.cx>
Fri, 26 Aug 2011 16:52:50 +0000 (12:52 -0400)
committerRandy Baumgarte <randy@fbn.cx>
Fri, 26 Aug 2011 16:52:50 +0000 (12:52 -0400)
src/cx/fbn/nevernote/Global.java
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/filters/NoteSortFilterProxyModel.java
src/cx/fbn/nevernote/gui/BrowserWindow.java
src/cx/fbn/nevernote/gui/NoteTableModel.java
src/cx/fbn/nevernote/gui/TableView.java
src/cx/fbn/nevernote/signals/NoteSignal.java
src/cx/fbn/nevernote/sql/DatabaseConnection.java
src/cx/fbn/nevernote/sql/NoteTable.java
src/cx/fbn/nevernote/utilities/ListManager.java
src/cx/fbn/nevernote/xml/ExportData.java

index 01c731d..900ef9b 100644 (file)
@@ -126,7 +126,8 @@ public class Global {
     public static int noteTableSubjectDatePosition = 8;\r
     public static int noteTableSynchronizedPosition = 9;\r
     public static int noteTableThumbnailPosition = 10;\r
-    public static int noteTableColumnCount = 11;\r
+    public static int noteTablePinnedPosition = 11;\r
+    public static int noteTableColumnCount = 12;\r
     public static Integer cryptCounter = 0;\r
     \r
     //public static int minimumWordCount = 2;\r
index 3ca3c48..ce68e97 100644 (file)
@@ -164,6 +164,7 @@ import cx.fbn.nevernote.dialog.TagMerge;
 import cx.fbn.nevernote.dialog.ThumbnailViewer;
 import cx.fbn.nevernote.dialog.UpgradeAvailableDialog;
 import cx.fbn.nevernote.dialog.WatchFolder;
+import cx.fbn.nevernote.evernote.NoteMetadata;
 import cx.fbn.nevernote.filters.FilterEditorNotebooks;
 import cx.fbn.nevernote.filters.FilterEditorTags;
 import cx.fbn.nevernote.gui.AttributeTreeWidget;
@@ -618,6 +619,7 @@ public class NeverNote extends QMainWindow{
                noteTableView.setNoteDuplicateAction(menuBar.noteDuplicateAction);
                noteTableView.setNoteHistoryAction(menuBar.noteOnlineHistoryAction);
                noteTableView.noteSignal.titleColorChanged.connect(this, "titleColorChanged(Integer)");
+               noteTableView.noteSignal.notePinned.connect(this, "notePinned()");
                noteTableView.setMergeNotesAction(menuBar.noteMergeAction);
                noteTableView.setCopyAsUrlAction(menuBar.noteCopyAsUrlAction);
                noteTableView.doubleClicked.connect(this, "listDoubleClick()");
@@ -1313,6 +1315,8 @@ public class NeverNote extends QMainWindow{
                Global.setColumnPosition("noteTableGuidPosition", position);
                position = noteTableView.header.visualIndex(Global.noteTableThumbnailPosition);
                Global.setColumnPosition("noteTableThumbnailPosition", position);
+               position = noteTableView.header.visualIndex(Global.noteTablePinnedPosition);
+               Global.setColumnPosition("noteTablePinnedPosition", position);
 
        }
        // Save column widths for the next time
@@ -4037,7 +4041,7 @@ public class NeverNote extends QMainWindow{
     // Title color has changed
     @SuppressWarnings("unused")
        private void titleColorChanged(Integer color) {
-       logger.log(logger.HIGH, "Entering NeverNote.updateListAuthor");
+       logger.log(logger.HIGH, "Entering NeverNote.titleColorChanged");
 
        QColor backgroundColor = new QColor();
                QColor foregroundColor = new QColor(QColor.black);
@@ -4066,7 +4070,23 @@ public class NeverNote extends QMainWindow{
                        }
                }
        }
-       logger.log(logger.HIGH, "Leaving NeverNote.updateListAuthor");
+       logger.log(logger.HIGH, "Leaving NeverNote.titleColorChanged");
+    }
+    // A note has been pinned or unpinned
+       private void notePinned() {
+               logger.log(logger.EXTREME, "Entering NeverNote.notePinned()");
+
+       for (int j=0; j<selectedNoteGUIDs.size(); j++) {
+               NoteMetadata meta = listManager.getNoteMetadata().get(selectedNoteGUIDs.get(j));
+               boolean pinned = !meta.isPinned();
+               meta.setPinned(pinned);   // Toggle the pinned/unpinned 
+               
+               // Update the list & table
+               listManager.updateNoteMetadata(meta);   
+               noteTableView.proxyModel.addGuid(selectedNoteGUIDs.get(j), meta);
+       }
+       
+               logger.log(logger.EXTREME, "Leaving NeverNote.setNoteDirty()");
     }
     // Wide list was chosen
     public void narrowListView() {
@@ -4267,26 +4287,26 @@ public class NeverNote extends QMainWindow{
                
                // Set the note as dirty and check if its status is synchronized in the display table
                noteDirty = true;
-               for (int i=0; i<listManager.getUnsynchronizedNotes().size(); i++) {
-                       if (listManager.getUnsynchronizedNotes().get(i).equals(currentNoteGuid))
+               if (listManager.getNoteMetadata().containsKey(currentNoteGuid) && 
+                               listManager.getNoteMetadata().get(currentNoteGuid).isDirty()) {
                                return;
                }
                
                // If this wasn't already marked as unsynchronized, then we need to update the table
                listManager.getNoteTableModel().updateNoteSyncStatus(currentNoteGuid, false);
-/*     listManager.getUnsynchronizedNotes().add(currentNoteGuid);
+//     listManager.getUnsynchronizedNotes().add(currentNoteGuid);
        for (int i=0; i<listManager.getNoteTableModel().rowCount(); i++) {
                QModelIndex modelIndex =  listManager.getNoteTableModel().index(i, Global.noteTableGuidPosition);
                if (modelIndex != null) {
                        SortedMap<Integer, Object> ix = listManager.getNoteTableModel().itemData(modelIndex);
                        String tableGuid =  (String)ix.values().toArray()[0];
                        if (tableGuid.equals(currentNoteGuid)) {
-                               listManager.getNoteTableModel().setData(i, Global.noteTableSynchronizedPosition, "false");
+                               listManager.getNoteTableModel().proxyModel.setData(i, Global.noteTableSynchronizedPosition, "false");
                                return;
                        }
                }
        }
- */    
+       
                logger.log(logger.EXTREME, "Leaving NeverNote.setNoteDirty()");
     }
     @SuppressWarnings("unused")
@@ -4740,8 +4760,10 @@ public class NeverNote extends QMainWindow{
        }
        
        conn.getNoteTable().addNote(newNote, true);
-       listManager.getUnsynchronizedNotes().add(newNote.getGuid());
-       listManager.addNote(newNote);
+       NoteMetadata metadata = new NoteMetadata();
+       metadata.setGuid(newNote.getGuid());
+       metadata.setDirty(true);
+       listManager.addNote(newNote, metadata);
 //     noteTableView.insertRow(newNote, true, -1);
        
        currentNote = newNote;
@@ -4825,15 +4847,15 @@ public class NeverNote extends QMainWindow{
 
        for (int i=0; i<listManager.getNoteIndex().size(); i++) {
                if (listManager.getNoteIndex().get(i).getGuid().equals(newGuid)) {
-                       noteTableView.proxyModel.addGuid(newGuid);
+                       noteTableView.proxyModel.addGuid(newGuid, listManager.getNoteMetadata().get(newGuid));
                        i=listManager.getNoteIndex().size();
                }
        }
        
-       if (listManager.getNoteTableModel().titleColors.containsKey(oldGuid)) {
-               int color = listManager.getNoteTableModel().titleColors.get(oldGuid);
-               listManager.getNoteTableModel().titleColors.put(newGuid, color);
-               listManager.getNoteTableModel().titleColors.remove(oldGuid);
+       if (listManager.getNoteTableModel().metaData.containsKey(oldGuid)) {
+               NoteMetadata meta = listManager.getNoteTableModel().metaData.get(oldGuid);
+               listManager.getNoteTableModel().metaData.put(newGuid, meta);
+               listManager.getNoteTableModel().metaData.remove(oldGuid);
        }
        
     }
@@ -4949,10 +4971,13 @@ public class NeverNote extends QMainWindow{
                newNote.setResources(resList);
                
                // Add note to the database
-               listManager.addNote(newNote);
                conn.getNoteTable().addNote(newNote, true);
-               listManager.getUnsynchronizedNotes().add(newNote.getGuid());
-               noteTableView.insertRow(newNote, true, -1);
+               NoteMetadata metaData = new NoteMetadata();
+               NoteMetadata oldMeta = listManager.getNoteMetadata().get(oldNote.getGuid());
+               metaData.copy(oldMeta);
+               metaData.setGuid(newNote.getGuid());
+               listManager.addNote(newNote, metaData);
+               noteTableView.insertRow(newNote, metaData, true, -1);
                currentNoteGuid = newNote.getGuid();
                currentNote = newNote;
                refreshEvernoteNote(true);
@@ -5262,7 +5287,9 @@ public class NeverNote extends QMainWindow{
                        n.getResources().get(i).setActive(true);
                        conn.getNoteTable().noteResourceTable.saveNoteResource(n.getResources().get(i), true);
                }
-       listManager.addNote(n);
+               NoteMetadata metadata = new NoteMetadata();
+               metadata.setGuid(n.getGuid());
+       listManager.addNote(n, metadata);
        conn.getNoteTable().addNote(n, true);
        refreshEvernoteNote(true);
        setMessage(tr("Note has been restored."));
@@ -5475,7 +5502,7 @@ public class NeverNote extends QMainWindow{
                if (currentNote == null) {
                        currentNote = conn.getNoteTable().getNote(currentNoteGuid, false, false, false, false, true);
                }
-               listManager.setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());
+               listManager.refreshNoteMetadata();
                noteIndexUpdated(false);
                noteTableView.selectionModel().blockSignals(true);
                scrollToGuid(currentNoteGuid);
@@ -6075,10 +6102,12 @@ public class NeverNote extends QMainWindow{
                                        Note newNote = importer.getNote();
                                        newNote.setNotebookGuid(notebook);
                                        newNote.setTitle(dir.at(i));
-                                       listManager.addNote(newNote);
+                                       NoteMetadata metadata = new NoteMetadata();
+                                       metadata.setDirty(true);
+                                       metadata.setGuid(newNote.getGuid());
+                                       listManager.addNote(newNote, metadata);
                                        conn.getNoteTable().addNote(newNote, true);
-                                       listManager.getUnsynchronizedNotes().add(newNote.getGuid());
-                                       noteTableView.insertRow(newNote, true, -1);
+                                       noteTableView.insertRow(newNote, metadata, true, -1);
                                        listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
                                        listManager.countNotebookResults(listManager.getNoteIndex());
                                        importedFiles.add(list.get(i).absoluteFilePath());
@@ -6116,10 +6145,12 @@ public class NeverNote extends QMainWindow{
                                Note newNote = importer.getNote();
                                newNote.setNotebookGuid(notebook);
                                newNote.setTitle(dir.at(i));
-                               listManager.addNote(newNote);
+                               NoteMetadata metadata = new NoteMetadata();
+                               metadata.setDirty(true);
+                               metadata.setGuid(newNote.getGuid());
+                               listManager.addNote(newNote, metadata);
                                conn.getNoteTable().addNote(newNote, true);
-                               listManager.getUnsynchronizedNotes().add(newNote.getGuid());
-                               noteTableView.insertRow(newNote, true, -1);
+                               noteTableView.insertRow(newNote, metadata, true, -1);
                                listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
                                listManager.countNotebookResults(listManager.getNoteIndex());
                                dir.remove(dir.at(i));
index 810b503..a99777c 100644 (file)
@@ -19,7 +19,7 @@
 \r
 package cx.fbn.nevernote.filters;\r
 \r
-import java.util.TreeSet;\r
+import java.util.HashMap;\r
 \r
 import com.trolltech.qt.core.QAbstractItemModel;\r
 import com.trolltech.qt.core.QModelIndex;\r
@@ -30,38 +30,40 @@ import com.trolltech.qt.gui.QImage;
 import com.trolltech.qt.gui.QSortFilterProxyModel;\r
 \r
 import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
 \r
 public class NoteSortFilterProxyModel extends QSortFilterProxyModel {\r
-       private final TreeSet<String> guids;\r
+       private final HashMap<String, NoteMetadata> guids;\r
+       private final HashMap<String, NoteMetadata> pinnedGuids;\r
        public Signal2<Integer,Integer> sortChanged;\r
        public boolean blocked;\r
        \r
        public NoteSortFilterProxyModel(QObject parent) {\r
                super(parent);\r
-               guids = new TreeSet<String>();\r
+               guids = new HashMap<String, NoteMetadata>();\r
+               pinnedGuids = new HashMap<String, NoteMetadata>();\r
                setDynamicSortFilter(true);\r
                sortChanged = new Signal2<Integer,Integer>();\r
-//             logger = new ApplicationLogger("filter.log");\r
        }\r
        public void clear() {\r
                guids.clear();\r
        }\r
-       public void addGuid(String guid) {\r
-//             if (!guids.containsKey(guid))\r
-                       guids.add(guid);\r
+       public void addGuid(String guid, NoteMetadata meta) {\r
+               if (!guids.containsKey(guid))\r
+                       guids.put(guid, meta);\r
+               if (meta.isPinned() == true && !pinnedGuids.containsKey(guid))\r
+                       pinnedGuids.put(guid, meta);\r
        }\r
        public void filter() {\r
                invalidateFilter();\r
        }\r
        @Override\r
        protected boolean filterAcceptsRow(int sourceRow, QModelIndex sourceParent) {\r
-               if (guids.size() == 0)\r
-                       return false;\r
                QAbstractItemModel model = sourceModel();\r
                QModelIndex guidIndex = sourceModel().index(sourceRow, Global.noteTableGuidPosition);\r
                String guid = (String)model.data(guidIndex);\r
                \r
-               if (guids.contains(guid))\r
+               if (guids.containsKey(guid) || pinnedGuids.containsKey(guid))\r
                        return true;\r
                else\r
                        return false;\r
index 64422fd..23264d8 100644 (file)
@@ -2091,6 +2091,8 @@ public class BrowserWindow extends QWidget {
        // Check the note title\r
        private void checkNoteTitle() {\r
                String text = browser.page().currentFrame().toPlainText();\r
+               if (saveNoteTitle == null)\r
+                       saveNoteTitle = new String();\r
                if (saveNoteTitle.trim().equals("") || saveNoteTitle.trim().equals("Untitled Note")) {\r
                        int newLine = text.indexOf("\n");\r
                        if (newLine > 0) {\r
index 15a944d..3b8187e 100644 (file)
@@ -1,6 +1,5 @@
 package cx.fbn.nevernote.gui;\r
 \r
-import java.util.ArrayList;\r
 import java.util.Collections;\r
 import java.util.HashMap;\r
 import java.util.List;\r
@@ -18,6 +17,7 @@ import com.trolltech.qt.gui.QImage;
 import com.trolltech.qt.gui.QPixmap;\r
 \r
 import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
 import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
@@ -26,15 +26,14 @@ public class NoteTableModel extends QAbstractTableModel {
        private final Object[]                  headers;\r
        private List<Note>                              noteIndex;\r
        private List<Note>                              masterNoteIndex;\r
-       private List<String>                    unsynchronizedNotes;\r
-       public HashMap<String,Integer>  titleColors;\r
+       public HashMap<String,NoteMetadata>     metaData;\r
        public NoteSortFilterProxyModel proxyModel;             // note sort model\r
        \r
        public NoteTableModel(ListManager m) {\r
                headers = new Object[Global.noteTableColumnCount];\r
                listManager = m;\r
                masterNoteIndex = null;\r
-               unsynchronizedNotes = new ArrayList<String>();\r
+               metaData = new HashMap<String,NoteMetadata>();\r
        }\r
        \r
        public List<Note> getNoteIndex() {\r
@@ -53,19 +52,10 @@ public class NoteTableModel extends QAbstractTableModel {
                proxyModel = m;\r
        }\r
        \r
-       public List<String> getUnsynchronizedNotes() {\r
-               return unsynchronizedNotes;\r
-       }\r
-       public void setUnsynchronizedNotes(List<String> list) {\r
-               unsynchronizedNotes = list;\r
-       }\r
-       \r
-       public HashMap<String, Integer> getTitleColors() {\r
-               return titleColors;\r
-       }\r
-       public void setTitleColors(HashMap<String, Integer> map) {\r
-               titleColors = map;\r
+       public void setNoteMetadata(HashMap<String, NoteMetadata> list) {\r
+               metaData = list;\r
        }\r
+\r
        \r
        @Override\r
        public int columnCount(QModelIndex arg0) {\r
@@ -82,7 +72,8 @@ public class NoteTableModel extends QAbstractTableModel {
         }\r
         case Qt.ItemDataRole.DecorationRole: {\r
                if (index.column() == Global.noteTableThumbnailPosition ||\r
-                       index.column() == Global.noteTableSynchronizedPosition)\r
+                       index.column() == Global.noteTableSynchronizedPosition ||\r
+                       index.column() == Global.noteTablePinnedPosition)\r
                        return valueAt(index.row(), index.column());\r
                else\r
                        return null;\r
@@ -90,8 +81,8 @@ public class NoteTableModel extends QAbstractTableModel {
         case Qt.ItemDataRole.BackgroundRole: {\r
                String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition);\r
                QColor backgroundColor = new QColor(QColor.white);\r
-               if (titleColors != null && titleColors.containsKey(guid)) {\r
-                       int color = titleColors.get(guid);\r
+               if (metaData != null && metaData.containsKey(guid)) {\r
+                       int color = metaData.get(guid).getColor();\r
                        backgroundColor.setRgb(color);\r
                }\r
                return backgroundColor;\r
@@ -100,8 +91,8 @@ public class NoteTableModel extends QAbstractTableModel {
                String guid = (String)valueAt(index.row(), Global.noteTableGuidPosition);\r
                QColor backgroundColor = new QColor(QColor.white);\r
                QColor foregroundColor = new QColor(QColor.black);\r
-               if (titleColors != null && titleColors.containsKey(guid)) {\r
-                       int color = titleColors.get(guid);\r
+               if (metaData != null && metaData.containsKey(guid)) {\r
+                       int color = metaData.get(guid).getColor();\r
                        backgroundColor.setRgb(color);\r
                        if (backgroundColor.rgb() == QColor.black.rgb() || backgroundColor.rgb() == QColor.blue.rgb()) \r
                                foregroundColor.setRgb(QColor.white.rgb());\r
@@ -148,9 +139,16 @@ public class NoteTableModel extends QAbstractTableModel {
                        String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
                        QIcon dotIcon = new QIcon(iconPath+"dot.png");\r
                        String guid = note.getGuid();\r
-                       for (int i=0; i<unsynchronizedNotes.size(); i++) {\r
-                               if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid)) \r
-                                       return dotIcon;\r
+                       if (metaData.containsKey(guid) && metaData.get(guid).isDirty()) \r
+                               return dotIcon;\r
+                       return null;\r
+               }\r
+               if (col == Global.noteTablePinnedPosition) {\r
+                       String guid = note.getGuid();\r
+                       if (metaData.containsKey(guid) && metaData.get(guid).isPinned()) {\r
+                               String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
+                               QIcon dotIcon = new QIcon(iconPath+"dot.png");\r
+                               return dotIcon;\r
                        }\r
                        return null;\r
                }\r
@@ -408,26 +406,8 @@ public class NoteTableModel extends QAbstractTableModel {
 \r
        public void updateNoteSyncStatus(String guid, boolean sync) {\r
                \r
-               boolean found = false;\r
-               for (int i=0; i<unsynchronizedNotes.size(); i++) {                      \r
-                       // If the note is now synchronized, but it is in the unsynchronized list, remove it\r
-                       if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid) && sync) {\r
-                               unsynchronizedNotes.remove(i);\r
-                               found = true;\r
-                               i=unsynchronizedNotes.size();\r
-                       }\r
-                       \r
-                       // If the note is not synchronized, but it is already in the unsynchronized list, do nothing\r
-                       if (unsynchronizedNotes.get(i).equalsIgnoreCase(guid) && sync) {\r
-                               found = true;\r
-                               i=unsynchronizedNotes.size();\r
-                       }\r
-               }\r
-               \r
-               // If we've gotten through the entire list, then we consider it synchronized.  If this is \r
-               // wrong, add it to the list.\r
-               if (!sync && !found) \r
-                       unsynchronizedNotes.add(guid);\r
+               if (metaData.containsKey(guid)) \r
+                       metaData.get(guid).setDirty(!sync);\r
                \r
                // Now we need to go through the table & update it\r
                for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
@@ -444,10 +424,29 @@ public class NoteTableModel extends QAbstractTableModel {
                }\r
        }\r
        \r
-       public void addNote(Note n) {\r
+       public void updateNotePinnedStatus(String guid, boolean pinned) {\r
+               // Now we need to go through the table & update it\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               QModelIndex idx = createIndex(i, Global.noteTablePinnedPosition, nativePointer());\r
+                               String value;\r
+                               if (metaData.containsKey(guid));\r
+                                       metaData.get(guid).setPinned(pinned);\r
+                               if (pinned)\r
+                                       value = tr("true");\r
+                               else\r
+                                       value = tr("false");\r
+                               setData(idx, value, Qt.ItemDataRole.EditRole); \r
+                               return;\r
+                       }       \r
+               }\r
+       }\r
+\r
+       \r
+       public void addNote(Note n, NoteMetadata meta) {\r
                getNoteIndex().add(n);\r
                getMasterNoteIndex().add(n);\r
-               proxyModel.addGuid(n.getGuid());\r
+               proxyModel.addGuid(n.getGuid(), meta);\r
                proxyModel.invalidate();\r
 //             proxyModel.filter();\r
        }\r
@@ -463,10 +462,8 @@ public class NoteTableModel extends QAbstractTableModel {
                }\r
        }\r
        \r
-       public void updateNoteTitleColor(String guid, Integer color) {\r
-               getTitleColors().remove(guid);\r
-               getTitleColors().put(guid, color);\r
-               layoutChanged.emit();\r
+       public void setMetaData(HashMap<String, NoteMetadata> h) {\r
+               metaData = h;\r
        }\r
 \r
        @Override\r
@@ -478,4 +475,16 @@ public class NoteTableModel extends QAbstractTableModel {
                return new Qt.ItemFlags(flags);\r
        }\r
        \r
+       public void updateNoteTitleColor(String guid, int color) {\r
+               NoteMetadata m = metaData.get(guid);\r
+               if (m == null) {\r
+                       m = new NoteMetadata();\r
+                       m.setGuid(guid);\r
+                       metaData.put(guid, m);\r
+               }\r
+               if (metaData.containsKey(guid) && metaData.get(guid).getColor() != color) {\r
+                       metaData.get(guid).setColor(color);     \r
+                       layoutChanged.emit();\r
+               }\r
+       }\r
 }\r
index 4c86a16..6e7c411 100644 (file)
@@ -41,6 +41,7 @@ import com.trolltech.qt.gui.QMenu;
 import com.trolltech.qt.gui.QTableView;\r
 \r
 import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
 import cx.fbn.nevernote.filters.NoteSortFilterProxyModel;\r
 import cx.fbn.nevernote.signals.NoteSignal;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
@@ -67,6 +68,7 @@ public class TableView extends QTableView {
     private QAction    noteTitleColorGray;\r
     private QAction    noteTitleColorCyan;\r
     private QAction    noteTitleColorMagenta;\r
+    private QAction notePinned;\r
     private QAction copyAsUrlAction;\r
 \r
 \r
@@ -112,6 +114,7 @@ public class TableView extends QTableView {
         runner.getNoteTableModel().setHeaderData(Global.noteTableSourceUrlPosition, Qt.Orientation.Horizontal, tr("Source Url"), Qt.ItemDataRole.DisplayRole);\r
         runner.getNoteTableModel().setHeaderData(Global.noteTableSubjectDatePosition, Qt.Orientation.Horizontal, tr("Subject Date"), Qt.ItemDataRole.DisplayRole);\r
         runner.getNoteTableModel().setHeaderData(Global.noteTableSynchronizedPosition, Qt.Orientation.Horizontal, tr("Synchronized"), Qt.ItemDataRole.DisplayRole);\r
+        runner.getNoteTableModel().setHeaderData(Global.noteTablePinnedPosition, Qt.Orientation.Horizontal, tr("Pinned"), Qt.ItemDataRole.DisplayRole);\r
         runner.getNoteTableModel().setHeaderData(Global.noteTableThumbnailPosition, Qt.Orientation.Horizontal, tr("Thumbnail"), Qt.ItemDataRole.DisplayRole);\r
         header.sortIndicatorChanged.connect(this, "resetViewport()");\r
        \r
@@ -169,10 +172,16 @@ public class TableView extends QTableView {
                                verticalHeader().setDefaultSectionSize(Global.largeThumbnailSize.height());\r
                }\r
                for (int i=0; i<runner.getNoteIndex().size(); i++) {\r
-                       if (Global.showDeleted == true && !runner.getNoteIndex().get(i).isActive())\r
-                               proxyModel.addGuid(runner.getNoteIndex().get(i).getGuid());\r
-                       if (!Global.showDeleted == true && runner.getNoteIndex().get(i).isActive())                     \r
-                               proxyModel.addGuid(runner.getNoteIndex().get(i).getGuid());\r
+                       String guid = runner.getNoteIndex().get(i).getGuid();\r
+                       NoteMetadata metaInfo = runner.getNoteMetadata().get(guid);\r
+                       if (Global.showDeleted == true && !runner.getNoteIndex().get(i).isActive()) {\r
+                               proxyModel.addGuid(guid, null);\r
+                       }\r
+                       if (!Global.showDeleted == true && \r
+                                       (runner.getNoteIndex().get(i).isActive() || \r
+                                                       metaInfo.isPinned())) {         \r
+                               proxyModel.addGuid(guid, metaInfo);\r
+                       }\r
                }\r
 \r
                if (!reload) {\r
@@ -186,7 +195,9 @@ public class TableView extends QTableView {
        \r
                for (int i=0; i<runner.getMasterNoteIndex().size(); i++) {\r
                        if (runner.getMasterNoteIndex().get(i) != null) {       \r
-                               insertRow(runner.getMasterNoteIndex().get(i), false, i);                                                        \r
+                               Note note = runner.getMasterNoteIndex().get(i);\r
+                               NoteMetadata meta = runner.getNoteMetadata().get(note.getGuid());\r
+                               insertRow(runner.getMasterNoteIndex().get(i), meta, false, i);                                                  \r
                        }\r
                } \r
                proxyModel.invalidate();\r
@@ -237,6 +248,10 @@ public class TableView extends QTableView {
                to = Global.getColumnPosition("noteTableSynchronizedPosition");\r
                if (to>=0) header.moveSection(from, to);\r
 \r
+               from = header.visualIndex(Global.noteTablePinnedPosition);\r
+               to = Global.getColumnPosition("noteTablePinnedPosition");\r
+               if (to>=0) header.moveSection(from, to);\r
+\r
                \r
                from = header.visualIndex(Global.noteTableGuidPosition);\r
                to = Global.getColumnPosition("noteTableGuidPosition");\r
@@ -272,6 +287,8 @@ public class TableView extends QTableView {
                width = Global.getColumnWidth("noteTableSynchronizedPosition");\r
                if (width>0) setColumnWidth(Global.noteTableSynchronizedPosition, width);\r
                width = Global.getColumnWidth("noteTableThumbnailPosition");\r
+               if (width>0) setColumnWidth(Global.noteTablePinnedPosition, width);\r
+               width = Global.getColumnWidth("noteTablePinnedPosition");\r
                if (width>0) setColumnWidth(Global.noteTableThumbnailPosition, width);\r
                width = Global.getColumnWidth("noteTableGuidPosition");\r
                if (width>0) setColumnWidth(Global.noteTableGuidPosition, width);\r
@@ -298,9 +315,9 @@ public class TableView extends QTableView {
                }\r
        }\r
        \r
-       public void insertRow(Note tempNote, boolean newNote, int row) {\r
+       public void insertRow(Note tempNote, NoteMetadata meta, boolean newNote, int row) {\r
                if (newNote)\r
-                       proxyModel.addGuid(tempNote.getGuid());\r
+                       proxyModel.addGuid(tempNote.getGuid(), meta);\r
                if (row > runner.getNoteTableModel().rowCount())\r
                        runner.getNoteTableModel().insertRow(0);\r
                \r
@@ -388,6 +405,9 @@ public class TableView extends QTableView {
            noteTitleColorGray = new QAction(titleColorMenu);\r
            noteTitleColorCyan = new QAction(titleColorMenu);\r
            noteTitleColorMagenta = new QAction(titleColorMenu);\r
+           \r
+           notePinned = new QAction(titleColorMenu);\r
+           menu.addAction(notePinned);\r
     \r
            noteTitleColorWhite.setText(tr("White"));\r
            noteTitleColorRed.setText(tr("Red"));\r
@@ -398,6 +418,7 @@ public class TableView extends QTableView {
            noteTitleColorGray.setText(tr("Gray"));\r
            noteTitleColorCyan.setText(tr("Cyan"));\r
            noteTitleColorMagenta.setText(tr("Magenta"));\r
+           notePinned.setText(tr("Pin/Unpin"));\r
            \r
            titleColorMenu.addAction(noteTitleColorWhite);\r
            titleColorMenu.addAction(noteTitleColorRed);\r
@@ -420,7 +441,7 @@ public class TableView extends QTableView {
            noteTitleColorGray.triggered.connect(this, "titleColorGray()");\r
            noteTitleColorCyan.triggered.connect(this, "titleColorCyan()");\r
            noteTitleColorMagenta.triggered.connect(this, "titleColorMagenta()");\r
-           \r
+           notePinned.triggered.connect(this, "notePinned()");\r
                menu.exec(event.globalPos());\r
        }\r
        \r
@@ -443,7 +464,8 @@ public class TableView extends QTableView {
        private void titleColorCyan() {noteSignal.titleColorChanged.emit(QColor.cyan.rgb());}\r
     @SuppressWarnings("unused")\r
        private void titleColorMagenta() {noteSignal.titleColorChanged.emit(QColor.magenta.rgb());}\r
-       \r
+       @SuppressWarnings("unused")\r
+       private void notePinned() {noteSignal.notePinned.emit();}\r
        \r
 \r
        @Override\r
@@ -525,6 +547,10 @@ public class TableView extends QTableView {
                Global.saveColumnVisible("synchronized", toggle);\r
                setColumnHidden(Global.noteTableSynchronizedPosition, !toggle);\r
        }\r
+       public void togglePinned(Boolean toggle) {\r
+               Global.saveColumnVisible("pinned", toggle);\r
+               setColumnHidden(Global.noteTablePinnedPosition, !toggle);\r
+       }\r
        public void toggleGuid(Boolean toggle) {\r
                Global.saveColumnVisible("guid", toggle);\r
                setColumnHidden(Global.noteTableGuidPosition, !toggle);\r
index 0148168..a9bd056 100644 (file)
@@ -49,6 +49,7 @@ public class NoteSignal extends QSignalEmitter {
        public Signal2<String, String>          noteSaveRunnerError = new Signal2<String, String>();\r
        public Signal3<String,QByteArray,Integer>               thumbnailPageReady = new Signal3<String,QByteArray,Integer>();\r
        public Signal3<BrowserWindow,String,String>     browserLinkClicked = new Signal3<BrowserWindow,String,String>();\r
+       public Signal0                          notePinned = new Signal0();\r
 }\r
 \r
 \r
index 2315180..3d69554 100644 (file)
@@ -252,8 +252,10 @@ public class DatabaseConnection {
                        executeSql("alter table notebook add column NARROW_SORT_COLUMN integer");
                        executeSql("update notebook set NARROW_SORT_COLUMN = -1");
                }
-
-               
+               if (!dbTableColumnExists("NOTE", "PINNED")) {
+                       executeSql("alter table note add column pinned integer");
+                       executeSql("update note set pinned = 0");
+               }
        }
        
        public void executeSql(String sql) {
index c1725df..264ae7a 100644 (file)
@@ -40,6 +40,7 @@ import com.trolltech.qt.gui.QPixmap;
 \r
 import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.evernote.EnmlConverter;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
 import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.Pair;\r
@@ -921,26 +922,7 @@ public class NoteTable {
 \r
                return returnValue;     \r
        }\r
-       // Get a list of notes that need to be updated\r
-       public List <String> getUnsynchronizedGUIDs() {\r
-               String guid;\r
-               List<String> index = new ArrayList<String>();\r
-               \r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.exec("Select guid from Note where isDirty=true");\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
-               \r
-               // Get a list of the notes\r
-               while (query.next()) {\r
-                       guid = new String();\r
-                       guid = query.valueString(0);\r
-                       index.add(guid); \r
-               }       \r
-               return index;   \r
-       }\r
+\r
        // Reset the dirty bit\r
        public void  resetDirtyFlag(String guid) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
@@ -1213,7 +1195,7 @@ public class NoteTable {
        //* Title color functions\r
        //**********************************************************************************\r
        // Get the title color of all notes\r
-       public List<Pair<String, Integer>> getNoteTitleColors() {\r
+/*     public List<Pair<String, Integer>> getNoteTitleColors() {\r
                List<Pair<String,Integer>> returnValue = new ArrayList<Pair<String,Integer>>();\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
@@ -1235,6 +1217,42 @@ public class NoteTable {
 \r
                return returnValue;\r
        }\r
+       */\r
+       \r
+       // Get note meta information\r
+       public void updateNoteMetadata(NoteMetadata meta) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.prepare("Update Note set titleColor=:color, pinned=:pinned where guid=:guid"))\r
+                       logger.log(logger.EXTREME, "Note SQL prepare has failed on updateNoteMetadata.");\r
+               query.bindValue(":color", meta.getColor());\r
+               query.bindValue(":pinned", meta.isPinned());\r
+               query.bindValue(":guid", meta.getGuid());\r
+               query.exec();\r
+               return;\r
+       }\r
+       \r
+       // Get note meta information\r
+       public HashMap<String, NoteMetadata> getNoteMetaInformation() {\r
+               HashMap<String, NoteMetadata> returnValue = new HashMap<String, NoteMetadata>();\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               if (!query.exec("Select guid,titleColor, isDirty, pinned from Note"))\r
+                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getNoteMetaInformation.");\r
+\r
+               // Get a list of the notes\r
+               while (query.next()) {\r
+                       NoteMetadata note = new NoteMetadata();\r
+                       note.setGuid(query.valueString(0));\r
+                       note.setColor(query.valueInteger(1));\r
+                       note.setDirty(query.valueBoolean(2, false));\r
+                       int pinned = query.valueInteger(3);\r
+                       if (pinned > 0) \r
+                               note.setPinned(true);\r
+                       returnValue.put(note.getGuid(), note); \r
+               }       \r
+\r
+               return returnValue;\r
+       }\r
        // Set a title color\r
        public void  setNoteTitleColor(String guid, int color) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
index 608ad9a..b64e0cb 100644 (file)
@@ -44,6 +44,7 @@ import com.trolltech.qt.xml.QDomElement;
 import com.trolltech.qt.xml.QDomNodeList;\r
 \r
 import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
 import cx.fbn.nevernote.filters.EnSearch;\r
 import cx.fbn.nevernote.filters.NotebookCounter;\r
 import cx.fbn.nevernote.filters.TagCounter;\r
@@ -70,7 +71,6 @@ public class ListManager  {
        private List<Notebook>                  notebookIndex;\r
        private List<Notebook>                  archiveNotebookIndex;\r
        private List<String>                    localNotebookIndex;\r
-       \r
        private List<LinkedNotebook>    linkedNotebookIndex;\r
 \r
        private List<SavedSearch>               searchIndex;\r
@@ -253,7 +253,7 @@ public class ListManager  {
                }\r
                \r
                \r
-               setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
+               //setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
                \r
                linkedNotebookIndex = conn.getLinkedNotebookTable().getAll();\r
                \r
@@ -264,7 +264,7 @@ public class ListManager  {
                setTagIndex(conn.getTagTable().getAll());       \r
        }\r
        public void reloadIndexes() {\r
-               setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
+               //setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
 \r
                List<Notebook> local = conn.getNotebookTable().getAllLocal();\r
                localNotebookIndex = new ArrayList<String>();\r
@@ -369,6 +369,16 @@ public class ListManager  {
        // Save the current note list\r
        private void setNoteIndex(List<Note> n) {\r
                noteModel.setNoteIndex(n);\r
+               refreshNoteMetadata();\r
+       }\r
+       public void refreshNoteMetadata() {\r
+               noteModel.setNoteMetadata(conn.getNoteTable().getNoteMetaInformation());\r
+       }\r
+       // Update a note's meta data\r
+       public void updateNoteMetadata(NoteMetadata meta) {\r
+               noteModel.metaData.remove(meta);\r
+               noteModel.metaData.put(meta.getGuid(), meta);\r
+               conn.getNoteTable().updateNoteMetadata(meta);\r
        }\r
        // Get the note index\r
        public synchronized List<Note> getNoteIndex() {\r
@@ -393,13 +403,10 @@ public class ListManager  {
        public List<String> getLocalNotebooks() {\r
                return localNotebookIndex;\r
        }\r
-       // Unsynchronized Note List\r
-       public List<String> getUnsynchronizedNotes() {\r
-               return noteModel.getUnsynchronizedNotes();\r
-       }\r
-       public void setUnsynchronizedNotes(List<String> l) {\r
-               noteModel.setUnsynchronizedNotes(l);\r
-       }\r
+\r
+//     public void setUnsynchronizedNotes(List<String> l) {\r
+//             noteModel.setUnsynchronizedNotes(l);\r
+//     }\r
        // Return a count of items in the trash\r
        public int getTrashCount() {\r
                return trashCount;\r
@@ -415,6 +422,9 @@ public class ListManager  {
 //     public HashMap<String, QImage> getThumbnails() {\r
 //             return thumbnailList;\r
 //     }\r
+       public HashMap<String, NoteMetadata> getNoteMetadata() {\r
+               return noteModel.metaData;\r
+       }\r
        public QImage getThumbnail(String guid) {\r
 //             if (getThumbnails().containsKey(guid))\r
 //                     return getThumbnails().get(guid);\r
@@ -589,8 +599,9 @@ public class ListManager  {
                conn.getNoteTable().updateNote(n, true);\r
        }\r
        // Add a note.  \r
-       public void addNote(Note n) {\r
-               noteModel.addNote(n);\r
+       public void addNote(Note n, NoteMetadata meta) {\r
+               noteModel.addNote(n, meta);\r
+               noteModel.metaData.put(n.getGuid(), meta);\r
        }\r
        // Expunge a note\r
        public void expungeNote(String guid) {\r
@@ -1075,14 +1086,7 @@ public class ListManager  {
                conn.getNoteTable().setNoteTitleColor(guid, color);\r
        }\r
        public void loadNoteTitleColors() {\r
-               List<Pair<String,Integer>> colors = conn.getNoteTable().getNoteTitleColors();\r
-               if (noteModel.getTitleColors() == null)\r
-                       noteModel.setTitleColors(new HashMap<String,Integer>());\r
-               else\r
-                       noteModel.getTitleColors().clear();\r
-               for (int i=0; i<colors.size(); i++) {\r
-                       noteModel.getTitleColors().put(colors.get(i).getFirst(), colors.get(i).getSecond());\r
-               }\r
+               noteModel.setMetaData(getNoteMetadata());\r
        }\r
        \r
        //********************************************************************************\r
index 2601015..a15ad8d 100644 (file)
@@ -39,9 +39,9 @@ import com.trolltech.qt.core.QIODevice;
 import com.trolltech.qt.xml.QXmlStreamWriter;\r
 \r
 import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.evernote.NoteMetadata;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class ExportData {\r
        \r
@@ -64,7 +64,7 @@ public class ExportData {
        private final HashMap<String,String>            dirtyNotes;\r
        private final HashMap<String,String>            dirtyLinkedNotebooks;\r
        private final HashMap<Long,String>                      dirtySharedNotebooks;\r
-       private HashMap<String,Integer>                         titleColors;\r
+       private HashMap<String, NoteMetadata>                   noteMeta;\r
        private final boolean                                           fullBackup;\r
        private final DatabaseConnection                        conn;\r
        private QXmlStreamWriter                                        writer;         \r
@@ -148,11 +148,8 @@ public class ExportData {
                dirtyNotes.put(dn.get(i).getGuid(), "");\r
        }\r
        \r
-       List<Pair<String,Integer>> tColors = conn.getNoteTable().getNoteTitleColors();\r
-       titleColors = new HashMap<String,Integer>();\r
-       for (int i=0; i<tColors.size(); i++) {\r
-               titleColors.put(tColors.get(i).getFirst(), tColors.get(i).getSecond());\r
-       }\r
+       noteMeta = conn.getNoteTable().getNoteMetaInformation();\r
+\r
        \r
        searches = conn.getSavedSearchTable().getAll();\r
        \r
@@ -309,8 +306,10 @@ public class ExportData {
                        createTextNode("Dirty", "true");\r
                else\r
                        createTextNode("Dirty", "false");\r
-               if (titleColors.containsKey(note.getGuid()))\r
-                       createTextNode("TitleColor", new String(titleColors.get(note.getGuid()).toString()));\r
+               if (noteMeta.containsKey(note.getGuid())) {\r
+                       Integer color = new Integer(noteMeta.get(note.getGuid()).getColor());\r
+                       createTextNode("TitleColor", color.toString());\r
+               }\r
                exportableNotebooks.put(note.getNotebookGuid(), "");\r
                \r
                if (note.getTagGuidsSize() > 0) {\r