OSDN Git Service

Correct java cast exceptions when doing a getUserInformation.
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / utilities / ListManager.java
index 3694608..3ed0039 100644 (file)
@@ -28,12 +28,15 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Vector;\r
 \r
+import com.evernote.edam.type.LinkedNotebook;\r
 import com.evernote.edam.type.Note;\r
 import com.evernote.edam.type.Notebook;\r
 import com.evernote.edam.type.SavedSearch;\r
 import com.evernote.edam.type.Tag;\r
 import com.trolltech.qt.QThread;\r
 import com.trolltech.qt.core.QDateTime;\r
+import com.trolltech.qt.gui.QImage;\r
+import com.trolltech.qt.gui.QPixmap;\r
 import com.trolltech.qt.sql.QSqlQuery;\r
 import com.trolltech.qt.xml.QDomAttr;\r
 import com.trolltech.qt.xml.QDomDocument;\r
@@ -44,6 +47,7 @@ import cx.fbn.nevernote.Global;
 import cx.fbn.nevernote.filters.EnSearch;\r
 import cx.fbn.nevernote.filters.NotebookCounter;\r
 import cx.fbn.nevernote.filters.TagCounter;\r
+import cx.fbn.nevernote.gui.NoteTableModel;\r
 import cx.fbn.nevernote.signals.NotebookSignal;\r
 import cx.fbn.nevernote.signals.StatusSignal;\r
 import cx.fbn.nevernote.signals.TagSignal;\r
@@ -66,13 +70,15 @@ public class ListManager  {
        private List<Notebook>                  notebookIndex;\r
        private List<Notebook>                  archiveNotebookIndex;\r
        private List<String>                    localNotebookIndex;\r
-       private List<Note>                              noteIndex;\r
+       \r
+       private List<LinkedNotebook>    linkedNotebookIndex;\r
+\r
        private List<SavedSearch>               searchIndex;\r
 \r
        private List<String>                    selectedNotebooks;\r
+       private final NoteTableModel                    noteModel;\r
+       \r
        \r
-       private List<Note>                              masterNoteIndex;\r
-       private List<String>                    unsynchronizedNotes;\r
        private List<String>                    selectedTags;\r
        private String                                  selectedSearch;\r
        ThreadSignal                                    signals;\r
@@ -83,9 +89,8 @@ public class ListManager  {
        private final QThread                   tagThread;\r
        \r
        private final CounterRunner             trashCounterRunner;\r
-       private final QThread                                   trashThread;\r
+       private final QThread                   trashThread;\r
        public TrashSignal                              trashSignal;\r
-       public HashMap<String,Integer>  titleColors;\r
        \r
        private List<NotebookCounter>   notebookCounter;                                // count of displayed notes in each notebook\r
        private List<TagCounter>                tagCounter;                                             // count of displayed notes for each tag\r
@@ -95,17 +100,19 @@ public class ListManager  {
        public HashMap<String, String>  wordMap;\r
        public TagSignal                                tagSignal;\r
        public NotebookSignal                   notebookSignal;\r
+       public boolean                                  refreshCounters;                        // Used to control when to recount lists\r
        private int                                             trashCount;\r
-       private final int id;\r
-    SaveRunner                 saveRunner;                                     // Thread used to save content.  Used because the xml conversion is slowwwww\r
-    QThread                            saveThread;\r
+    public SaveRunner                          saveRunner;                                     // Thread used to save content.  Used because the xml conversion is slowwwww\r
+    QThread                                                    saveThread;\r
        \r
+//    private final HashMap<String, QImage> thumbnailList;\r
+    \r
        // Constructor\r
-       public ListManager(DatabaseConnection d, ApplicationLogger l, int instance_id) {\r
+       public ListManager(DatabaseConnection d, ApplicationLogger l) {\r
                conn = d;\r
                logger = l;\r
-               id = instance_id;\r
-               \r
+                       \r
+               conn.getTagTable().cleanupTags();\r
        status = new StatusSignal();\r
                signals = new ThreadSignal();\r
                \r
@@ -113,46 +120,59 @@ public class ListManager  {
                enSearchChanged = false;\r
                \r
                // Setup arrays\r
-               masterNoteIndex = null;\r
+               noteModel = new NoteTableModel(this);\r
                selectedTags = new ArrayList<String>();\r
 \r
                notebookCounter = new ArrayList<NotebookCounter>();\r
                tagCounter = new ArrayList<TagCounter>();\r
                selectedNotebooks = new ArrayList<String>();\r
-               unsynchronizedNotes = new ArrayList<String>();\r
-               \r
+                               \r
                reloadIndexes();\r
                \r
                notebookSignal = new NotebookSignal();\r
-               notebookCounterRunner = new CounterRunner("notebook_counter.log", CounterRunner.NOTEBOOK, Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
+               notebookCounterRunner = new CounterRunner("notebook_counter.log", CounterRunner.NOTEBOOK, \r
+                                               Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(),\r
+                                               Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                notebookCounterRunner.setNoteIndex(getNoteIndex());\r
                notebookCounterRunner.notebookSignal.countsChanged.connect(this, "setNotebookCounter(List)");\r
                notebookThread = new QThread(notebookCounterRunner, "Notebook Counter Thread");\r
                notebookThread.start();\r
                \r
                tagSignal = new TagSignal();\r
-               tagCounterRunner = new CounterRunner("tag_counter.log", CounterRunner.TAG, Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
+               tagCounterRunner = new CounterRunner("tag_counter.log", CounterRunner.TAG, \r
+                               Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(),\r
+                               Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                tagCounterRunner.setNoteIndex(getNoteIndex());\r
                tagCounterRunner.tagSignal.countsChanged.connect(this, "setTagCounter(List)");\r
                tagThread = new QThread(tagCounterRunner, "Tag Counter Thread");\r
                tagThread.start();\r
                \r
                trashSignal = new TrashSignal();\r
-               trashCounterRunner = new CounterRunner("trash_counter.log", CounterRunner.TRASH, Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
+               trashCounterRunner = new CounterRunner("trash_counter.log", CounterRunner.TRASH, \r
+                               Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(),\r
+                               Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                trashCounterRunner.trashSignal.countChanged.connect(this, "trashSignalReceiver(Integer)");\r
                trashThread = new QThread(trashCounterRunner, "Trash Counter Thread");\r
                trashThread.start();\r
-               reloadTrashCount();\r
+//             reloadTrashCount();\r
                \r
                wordMap = new HashMap<String, String>();\r
                tagSignal = new TagSignal();\r
                \r
                logger.log(logger.EXTREME, "Setting save thread");\r
-               saveRunner = new SaveRunner("saveRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
+               saveRunner = new SaveRunner("saveRunner.log", \r
+                               Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(),\r
+                               Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                saveThread = new QThread(saveRunner, "Save Runner Thread");\r
                saveThread.start();\r
-\r
+               \r
+//             thumbnailList = conn.getNoteTable().getThumbnails();\r
+//             thumbnailList = new HashMap<String,QImage>();\r
+               \r
+               linkedNotebookIndex = conn.getLinkedNotebookTable().getAll();\r
                loadNoteTitleColors();\r
+               refreshCounters = true;\r
+               refreshCounters();\r
                                \r
        }\r
        \r
@@ -191,7 +211,6 @@ public class ListManager  {
                        e.printStackTrace();\r
                }\r
 \r
-\r
        }\r
 \r
        //***************************************************************\r
@@ -215,30 +234,35 @@ public class ListManager  {
                for (int i=0; i<local.size(); i++)\r
                        localNotebookIndex.add(local.get(i).getGuid());\r
                \r
-               masterNoteIndex = conn.getNoteTable().getAllNotes();\r
+               noteModel.setMasterNoteIndex(conn.getNoteTable().getAllNotes());\r
                // For performance reasons, we didn't get the tags for every note individually.  We now need to \r
                // get them\r
                List<cx.fbn.nevernote.sql.NoteTagsRecord> noteTags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
                        List<String> tags = new ArrayList<String>();\r
                        List<String> names = new ArrayList<String>();\r
                        for (int j=0; j<noteTags.size(); j++) {\r
-                               if (masterNoteIndex.get(i).getGuid().equals(noteTags.get(j).noteGuid)) {\r
+                               if (getMasterNoteIndex().get(i).getGuid().equals(noteTags.get(j).noteGuid)) {\r
                                        tags.add(noteTags.get(j).tagGuid);\r
                                        names.add(getTagNameByGuid(noteTags.get(j).tagGuid));\r
                                }\r
                        }\r
                        \r
-                       masterNoteIndex.get(i).setTagGuids(tags);\r
-                       masterNoteIndex.get(i).setTagNames(names);\r
+                       getMasterNoteIndex().get(i).setTagGuids(tags);\r
+                       getMasterNoteIndex().get(i).setTagNames(names);\r
                }\r
                \r
                \r
                setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
                \r
+               linkedNotebookIndex = conn.getLinkedNotebookTable().getAll();\r
+               \r
                enSearchChanged = true;\r
        }\r
 \r
+       public void reloadTagIndex() {\r
+               setTagIndex(conn.getTagTable().getAll());       \r
+       }\r
        public void reloadIndexes() {\r
                setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());\r
 \r
@@ -247,8 +271,7 @@ public class ListManager  {
                for (int i=0; i<local.size(); i++)\r
                        localNotebookIndex.add(local.get(i).getGuid());\r
                \r
-               // Load tags\r
-               setTagIndex(conn.getTagTable().getAll());\r
+               reloadTagIndex();\r
                // Load notebooks\r
                setNotebookIndex(conn.getNotebookTable().getAll());\r
                // load archived notebooks (if note using the EN interface)\r
@@ -256,30 +279,30 @@ public class ListManager  {
                // load saved search index\r
                setSavedSearchIndex(conn.getSavedSearchTable().getAll());\r
                // Load search helper utility\r
-               enSearch = new EnSearch(conn,  logger, "", getTagIndex(), Global.getMinimumWordLength(), Global.getRecognitionWeight());\r
+               enSearch = new EnSearch(conn,  logger, "", getTagIndex(), Global.getRecognitionWeight());\r
                logger.log(logger.HIGH, "Building note index");\r
 \r
-               if (masterNoteIndex == null) { \r
-                       masterNoteIndex = conn.getNoteTable().getAllNotes();\r
-               }\r
+//             if (getMasterNoteIndex() == null) { \r
+                       noteModel.setMasterNoteIndex(conn.getNoteTable().getAllNotes());\r
+//             }\r
                // For performance reasons, we didn't get the tags for every note individually.  We now need to \r
                // get them\r
                List<cx.fbn.nevernote.sql.NoteTagsRecord> noteTags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
                        List<String> tags = new ArrayList<String>();\r
                        List<String> names = new ArrayList<String>();\r
                        for (int j=0; j<noteTags.size(); j++) {\r
-                               if (masterNoteIndex.get(i).getGuid().equals(noteTags.get(j).noteGuid)) {\r
+                               if (getMasterNoteIndex().get(i).getGuid().equals(noteTags.get(j).noteGuid)) {\r
                                        tags.add(noteTags.get(j).tagGuid);\r
                                        names.add(getTagNameByGuid(noteTags.get(j).tagGuid));\r
                                }\r
                        }\r
                        \r
-                       masterNoteIndex.get(i).setTagGuids(tags);\r
-                       masterNoteIndex.get(i).setTagNames(names);\r
+                       getMasterNoteIndex().get(i).setTagGuids(tags);\r
+                       getMasterNoteIndex().get(i).setTagNames(names);\r
                }\r
                \r
-               setNoteIndex(masterNoteIndex);\r
+               setNoteIndex(getMasterNoteIndex());\r
 \r
        }\r
        \r
@@ -288,7 +311,7 @@ public class ListManager  {
        //* selected notebooks\r
        //***************************************************************\r
        //***************************************************************\r
-       // Return the selected notebook(s)\r
+       // Return the selected notebook(s)\r
        public List<String> getSelectedNotebooks() {\r
                return selectedNotebooks;\r
        }\r
@@ -305,6 +328,10 @@ public class ListManager  {
     //** These functions deal with setting & retrieving the master lists\r
     //***************************************************************\r
     //***************************************************************\r
+       // Get the note table model\r
+       public NoteTableModel getNoteTableModel() {\r
+               return noteModel;\r
+       }\r
        // save the saved search index\r
        private void setSavedSearchIndex(List<SavedSearch> t) {\r
                searchIndex = t;\r
@@ -333,16 +360,19 @@ public class ListManager  {
                return notebookIndex;\r
 \r
        }\r
+       public List<LinkedNotebook> getLinkedNotebookIndex() {\r
+               return linkedNotebookIndex;\r
+       }\r
        public List<Notebook> getArchiveNotebookIndex() {\r
                return archiveNotebookIndex;\r
        }\r
        // Save the current note list\r
        private void setNoteIndex(List<Note> n) {\r
-               noteIndex = n;\r
+               noteModel.setNoteIndex(n);\r
        }\r
        // Get the note index\r
        public synchronized List<Note> getNoteIndex() {\r
-               return noteIndex;\r
+               return noteModel.getNoteIndex();\r
        }\r
        // Save the count of notes per notebook\r
        public void setNotebookCounter(List<NotebookCounter> n) {\r
@@ -365,10 +395,10 @@ public class ListManager  {
        }\r
        // Unsynchronized Note List\r
        public List<String> getUnsynchronizedNotes() {\r
-               return unsynchronizedNotes;\r
+               return noteModel.getUnsynchronizedNotes();\r
        }\r
        public void setUnsynchronizedNotes(List<String> l) {\r
-               unsynchronizedNotes = l;\r
+               noteModel.setUnsynchronizedNotes(l);\r
        }\r
        // Return a count of items in the trash\r
        public int getTrashCount() {\r
@@ -379,16 +409,41 @@ public class ListManager  {
                return enSearch;\r
        }\r
        public List<Note> getMasterNoteIndex() {\r
-               return masterNoteIndex;\r
+               return noteModel.getMasterNoteIndex();\r
+       }\r
+       // Thumbnails\r
+//     public HashMap<String, QImage> getThumbnails() {\r
+//             return thumbnailList;\r
+//     }\r
+       public QImage getThumbnail(String guid) {\r
+//             if (getThumbnails().containsKey(guid))\r
+//                     return getThumbnails().get(guid);\r
+               \r
+               QImage img = new QImage();\r
+               img = QImage.fromData(conn.getNoteTable().getThumbnail(guid));\r
+               if (img == null || img.isNull()) \r
+                       return null;\r
+               //getThumbnails().put(guid, img);\r
+               return img;\r
+       }\r
+       public QPixmap getThumbnailPixmap(String guid) {\r
+//             if (getThumbnails().containsKey(guid))\r
+//                     return getThumbnails().get(guid);\r
+               \r
+               QPixmap img = new QPixmap();\r
+               img.loadFromData(conn.getNoteTable().getThumbnail(guid));\r
+               if (img == null || img.isNull()) \r
+                       return null;\r
+               //getThumbnails().put(guid, img);\r
+               return img;\r
        }\r
-       \r
     //***************************************************************\r
     //***************************************************************\r
     //** These functions deal with setting & retrieving filters\r
     //***************************************************************\r
     //***************************************************************\r
        public void setEnSearch(String t) {\r
-               enSearch = new EnSearch(conn,logger, t, getTagIndex(), Global.getMinimumWordLength(), Global.getRecognitionWeight());\r
+               enSearch = new EnSearch(conn,logger, t, getTagIndex(), Global.getRecognitionWeight());\r
                enSearchChanged = true;\r
        }\r
        // Save search tags\r
@@ -457,11 +512,11 @@ public class ListManager  {
                        }\r
                }\r
                \r
-               for (int i=0; i<noteIndex.size(); i++) {\r
-                       if (noteIndex.get(i).getGuid().equals(noteGuid)) {\r
-                               noteIndex.get(i).setTagNames(tags);\r
-                               noteIndex.get(i).setTagGuids(tagGuids);\r
-                               i=noteIndex.size()+1;\r
+               for (int i=0; i<getNoteIndex().size(); i++) {\r
+                       if (getNoteIndex().get(i).getGuid().equals(noteGuid)) {\r
+                               getNoteIndex().get(i).setTagNames(tags);\r
+                               getNoteIndex().get(i).setTagGuids(tagGuids);\r
+                               i=getNoteIndex().size()+1;\r
                        }\r
                }\r
                if (newTagCreated)\r
@@ -479,11 +534,11 @@ public class ListManager  {
                        l=currentTime.getTimeInMillis();\r
                }\r
                \r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).setActive(false);\r
-                               masterNoteIndex.get(i).setDeleted(l);\r
-                               i=masterNoteIndex.size();\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               getMasterNoteIndex().get(i).setActive(false);\r
+                               getMasterNoteIndex().get(i).setDeleted(l);\r
+                               i=getMasterNoteIndex().size();\r
                        }\r
                }\r
                for (int i=0; i<getNoteIndex().size(); i++) {\r
@@ -499,11 +554,11 @@ public class ListManager  {
        // Delete a note\r
        public void restoreNote(String guid) {\r
                trashCounterRunner.abortCount = true;\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).setActive(true);\r
-                               masterNoteIndex.get(i).setDeleted(0);\r
-                               i=masterNoteIndex.size();\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               getMasterNoteIndex().get(i).setActive(true);\r
+                               getMasterNoteIndex().get(i).setDeleted(0);\r
+                               i=getMasterNoteIndex().size();\r
                        }\r
                }\r
                for (int i=0; i<getNoteIndex().size(); i++) {\r
@@ -518,10 +573,10 @@ public class ListManager  {
        }\r
        public void updateNote(Note n) {\r
                \r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(n.getGuid())) {\r
-                               masterNoteIndex.remove(i);\r
-                               masterNoteIndex.add(n);\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(n.getGuid())) {\r
+                               getMasterNoteIndex().remove(i);\r
+                               getMasterNoteIndex().add(n);\r
                        }\r
                }\r
                for (int i=0; i<getNoteIndex().size(); i++) {\r
@@ -535,16 +590,15 @@ public class ListManager  {
        }\r
        // Add a note.  \r
        public void addNote(Note n) {\r
-               getNoteIndex().add(n);\r
-               masterNoteIndex.add(n);\r
+               noteModel.addNote(n);\r
        }\r
        // Expunge a note\r
        public void expungeNote(String guid) {\r
                trashCounterRunner.abortCount = true;\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.remove(i);\r
-                               i=masterNoteIndex.size();\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               getMasterNoteIndex().remove(i);\r
+                               i=getMasterNoteIndex().size();\r
                        }\r
                }\r
                for (int i=0; i<getNoteIndex().size(); i++) {\r
@@ -559,9 +613,9 @@ public class ListManager  {
        // Expunge a note\r
        public void emptyTrash() {\r
                trashCounterRunner.abortCount = true;           \r
-               for (int i=masterNoteIndex.size()-1; i>=0; i--) {\r
-                       if (!masterNoteIndex.get(i).isActive()) {\r
-                               masterNoteIndex.remove(i);\r
+               for (int i=getMasterNoteIndex().size()-1; i>=0; i--) {\r
+                       if (!getMasterNoteIndex().get(i).isActive()) {\r
+                               getMasterNoteIndex().remove(i);\r
                        }\r
                }\r
                \r
@@ -621,68 +675,30 @@ public class ListManager  {
        }\r
        // Update a note creation date\r
        public void updateNoteCreatedDate(String guid, QDateTime date) {\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).setCreated(date.toTime_t()*1000);\r
-                               i = masterNoteIndex.size();\r
-                       }       \r
-               }\r
-               // Update the list tables \r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).setCreated(date.toTime_t()*1000);\r
-                               i = getNoteIndex().size();\r
-                       }\r
-               }\r
+               noteModel.updateNoteCreatedDate(guid, date);\r
                conn.getNoteTable().updateNoteCreatedDate(guid, date);\r
        }\r
        // Subject date has been changed\r
        public void updateNoteSubjectDate(String guid, QDateTime date) {\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).getAttributes().setSubjectDate(date.toTime_t()*1000);\r
-                               i = masterNoteIndex.size();\r
-                       }       \r
-               }\r
-               // Update the list tables \r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).setCreated(date.toTime_t()*1000);\r
-                               i = getNoteIndex().size();\r
-                       }\r
-               }\r
+               noteModel.updateNoteSubjectDate(guid, date);\r
                conn.getNoteTable().updateNoteSubjectDate(guid, date);\r
        }\r
        // Author has changed\r
        public void updateNoteAuthor(String guid, String author) {\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).getAttributes().setAuthor(author);\r
-                               masterNoteIndex.get(i).getAttributes().setAltitudeIsSet(true);\r
-                               i = masterNoteIndex.size();\r
-                       }       \r
-               }\r
-               // Update the list tables \r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).getAttributes().setAuthor(author);\r
-                               getNoteIndex().get(i).getAttributes().setAuthorIsSet(true);\r
-                               i = getNoteIndex().size();\r
-                       }\r
-               }\r
+               noteModel.updateNoteAuthor(guid, author);\r
                conn.getNoteTable().updateNoteAuthor(guid, author);\r
        }\r
        // Author has changed\r
        public void updateNoteGeoTag(String guid, Double lon, Double lat, Double alt) {\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).getAttributes().setLongitude(lon);\r
-                               masterNoteIndex.get(i).getAttributes().setLongitudeIsSet(true);\r
-                               masterNoteIndex.get(i).getAttributes().setLatitude(lat);\r
-                               masterNoteIndex.get(i).getAttributes().setLatitudeIsSet(true);\r
-                               masterNoteIndex.get(i).getAttributes().setAltitude(alt);\r
-                               masterNoteIndex.get(i).getAttributes().setAltitudeIsSet(true);\r
-                               i = masterNoteIndex.size();\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               getMasterNoteIndex().get(i).getAttributes().setLongitude(lon);\r
+                               getMasterNoteIndex().get(i).getAttributes().setLongitudeIsSet(true);\r
+                               getMasterNoteIndex().get(i).getAttributes().setLatitude(lat);\r
+                               getMasterNoteIndex().get(i).getAttributes().setLatitudeIsSet(true);\r
+                               getMasterNoteIndex().get(i).getAttributes().setAltitude(alt);\r
+                               getMasterNoteIndex().get(i).getAttributes().setAltitudeIsSet(true);\r
+                               i = getMasterNoteIndex().size();\r
                        }       \r
                }\r
                // Update the list tables \r
@@ -699,79 +715,27 @@ public class ListManager  {
                }\r
                conn.getNoteTable().updateNoteGeoTags(guid, lon, lat, alt);\r
        }\r
-       // Author has changed\r
+       // Source URL changed\r
        public void updateNoteSourceUrl(String guid, String url) {\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).getAttributes().setSourceURL(url);\r
-                               masterNoteIndex.get(i).getAttributes().setSourceURLIsSet(true);\r
-                               i = masterNoteIndex.size();\r
-                       }       \r
-               }\r
-               // Update the list tables \r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).getAttributes().setSourceURL(url);\r
-                               getNoteIndex().get(i).getAttributes().setSourceURLIsSet(true);\r
-                               i = getNoteIndex().size();\r
-                       }\r
-               }\r
+               noteModel.updateNoteSourceUrl(guid, url);\r
                conn.getNoteTable().updateNoteSourceUrl(guid, url);\r
        }\r
        // Update a note last changed date\r
        public void updateNoteAlteredDate(String guid, QDateTime date) {\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).setUpdated(date.toTime_t()*1000);\r
-                               i = masterNoteIndex.size();\r
-                       }       \r
-               }\r
-               // Update the list tables \r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).setUpdated(date.toTime_t()*1000);\r
-                               i = getNoteIndex().size();\r
-                       }\r
-               }\r
-               \r
+               noteModel.updateNoteChangedDate(guid, date);\r
                conn.getNoteTable().updateNoteAlteredDate(guid, date);\r
        }\r
        // Update a note title\r
        public void updateNoteTitle(String guid, String title) {\r
                logger.log(logger.HIGH, "Entering ListManager.updateNoteTitle");\r
                conn.getNoteTable().updateNoteTitle(guid, title);\r
-               \r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).setTitle(title);\r
-                               i = masterNoteIndex.size();\r
-                       }       \r
-               }\r
-               // Update the list tables \r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).setTitle(title);\r
-                               i = getNoteIndex().size();\r
-                       }\r
-               }\r
-               \r
+               noteModel.updateNoteTitle(guid, title);\r
                logger.log(logger.HIGH, "Leaving ListManager.updateNoteTitle");\r
        }\r
        // Update a note's notebook\r
        public void updateNoteNotebook(String guid, String notebookGuid) {\r
                logger.log(logger.HIGH, "Entering ListManager.updateNoteNotebook");\r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
-                               masterNoteIndex.get(i).setNotebookGuid(notebookGuid);\r
-                               i=masterNoteIndex.size();\r
-                       }\r
-               }\r
-               for (int i=0; i<getNoteIndex().size(); i++) {\r
-                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
-                               getNoteIndex().get(i).setNotebookGuid(notebookGuid);\r
-                               i=masterNoteIndex.size();\r
-                       }\r
-               }\r
+               noteModel.updateNoteNotebook(guid, notebookGuid);\r
                conn.getNoteTable().updateNoteNotebook(guid, notebookGuid, true);\r
                logger.log(logger.HIGH, "Leaving ListManager.updateNoteNotebook");\r
        }\r
@@ -781,32 +745,26 @@ public class ListManager  {
 \r
                conn.getNoteTable().updateNoteSequence(guid, sequence);\r
                \r
-               for (int i=0; i<noteIndex.size(); i++) {\r
-                       if (noteIndex.get(i).getGuid().equals(guid)) {\r
-                               noteIndex.get(i).setUpdateSequenceNum(sequence);\r
-                               i=noteIndex.size()+1;\r
+               for (int i=0; i<noteModel.getMasterNoteIndex().size(); i++) {\r
+                       if (noteModel.getMasterNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               noteModel.getMasterNoteIndex().get(i).setUpdateSequenceNum(sequence);\r
+                               i=noteModel.getMasterNoteIndex().size()+1;\r
+                       }\r
+               }\r
+               \r
+               for (int i=0; i<getNoteIndex().size(); i++) {\r
+                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               getNoteIndex().get(i).setUpdateSequenceNum(sequence);\r
+                               i=getNoteIndex().size()+1;\r
                        }\r
                }\r
                logger.log(logger.HIGH, "Leaving ListManager.updateNoteSequence");\r
        }\r
        public void updateNoteGuid(String oldGuid, String newGuid, boolean updateDatabase) {\r
                logger.log(logger.HIGH, "Entering ListManager.updateNoteGuid");\r
-               \r
                if (updateDatabase) \r
                        conn.getNoteTable().updateNoteGuid(oldGuid, newGuid);\r
-               \r
-               for (int i=0; i<masterNoteIndex.size(); i++) {\r
-                       if (masterNoteIndex.get(i).getGuid() != null && masterNoteIndex.get(i).getGuid().equals(oldGuid)) {\r
-                               masterNoteIndex.get(i).setGuid(newGuid);\r
-                               i=masterNoteIndex.size()+1;\r
-                       }\r
-               }\r
-               for (int i=0; i<noteIndex.size(); i++) {\r
-                       if (noteIndex.get(i).getGuid() != null && noteIndex.get(i).getGuid().equals(oldGuid)) {\r
-                               noteIndex.get(i).setGuid(newGuid);\r
-                               i=noteIndex.size()+1;\r
-                       }\r
-               }\r
+               noteModel.updateNoteGuid(oldGuid, newGuid);\r
                logger.log(logger.HIGH, "Leaving ListManager.updateNoteGuid");\r
 \r
        }\r
@@ -844,14 +802,7 @@ public class ListManager  {
                logger.log(logger.HIGH, "Leaving ListManager.updateTagGuid");\r
 \r
        }\r
-       // Count tag results\r
-//     @SuppressWarnings("unused")\r
-//     private void reloadTagCount() {\r
-//             tagCounterRunner.threadLock.lock(); \r
-//             tagCounterRunner.setNoteIndex(getNoteIndex());\r
-//             QThreadPool.globalInstance().tryStart(tagCounterRunner);\r
-//             tagCounterRunner.threadLock.unlock();\r
-//     }\r
+\r
 \r
        //************************************************************************************\r
        //************************************************************************************\r
@@ -863,11 +814,20 @@ public class ListManager  {
                for (int i=0; i<getNotebookIndex().size(); i++) {\r
                        if (getNotebookIndex().get(i).getGuid().equals(guid)) {\r
                                getNotebookIndex().remove(i);\r
-                               i=masterNoteIndex.size();\r
+                               i=getMasterNoteIndex().size();\r
                        }\r
                }\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
@@ -898,6 +858,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
@@ -905,85 +880,149 @@ public class ListManager  {
        //**  Load and filter the note index\r
        //************************************************************************************\r
        //************************************************************************************\r
-//     public void clearNoteIndexSearch() {\r
-//             setNoteIndex(masterNoteIndex);\r
-//     }\r
-       // Load the note index based upon what the user wants.\r
-       public void loadNotesIndex() {\r
-               logger.log(logger.EXTREME, "Entering ListManager.loadNotesIndex()");\r
+       \r
+       public void noteDownloaded(Note n) {\r
+               boolean found = false;\r
+               for (int i=0; i<getMasterNoteIndex().size(); i++) {\r
+                       if (getMasterNoteIndex().get(i).getGuid().equals(n.getGuid())) {\r
+                               getMasterNoteIndex().set(i,n);\r
+                               found = true;\r
+                               i=getMasterNoteIndex().size();\r
+                       }\r
+               }\r
+               \r
+               if (!found)\r
+                       getMasterNoteIndex().add(n);\r
+               \r
+               for (int i=0; i<getNoteIndex().size(); i++) {\r
+                       if (getNoteIndex().get(i).getGuid().equals(n.getGuid())) {\r
+                               if (filterRecord(getNoteIndex().get(i)))\r
+                                       getNoteIndex().add(n);\r
+                               getNoteIndex().remove(i);\r
+                               i=getNoteIndex().size();\r
+                       }\r
+               }\r
+               \r
+               if (filterRecord(n))\r
+                       getNoteIndex().add(n);\r
+               \r
+       }\r
+       // Check if a note matches the currently selected notebooks, tags, or attribute searches.\r
+       public boolean filterRecord(Note n) {\r
+                               \r
+               boolean goodNotebook = false;\r
+               boolean goodTag = false;\r
+               boolean goodStatus = false;\r
+                       \r
+               // Check note status\r
+               if (!n.isActive() && Global.showDeleted)\r
+                       return true;\r
+               else {\r
+                       if (n.isActive() && !Global.showDeleted)\r
+                               goodStatus = true;\r
+               }\r
+               \r
+               // Begin filtering results\r
+               if (goodStatus)\r
+                       goodNotebook = filterByNotebook(n.getNotebookGuid());\r
+               if (goodNotebook) \r
+                       goodTag = filterByTag(n.getTagGuids());\r
+               if (goodTag) {\r
+                       boolean goodCreatedBefore = false;\r
+                       boolean goodCreatedSince = false;\r
+                       boolean goodChangedBefore = false;\r
+                       boolean goodChangedSince = false;\r
+                       boolean goodContains = false;\r
+                       if (!Global.createdBeforeFilter.hasSelection())\r
+                               goodCreatedBefore = true;\r
+                       else\r
+                               goodCreatedBefore = Global.createdBeforeFilter.check(n);\r
+                               \r
+                       if (!Global.createdSinceFilter.hasSelection())\r
+                               goodCreatedSince = true;\r
+                       else\r
+                               goodCreatedSince = Global.createdSinceFilter.check(n);\r
+                               \r
+                       if (!Global.changedBeforeFilter.hasSelection())\r
+                               goodChangedBefore = true;\r
+                       else\r
+                               goodChangedBefore = Global.changedBeforeFilter.check(n);\r
+                               if (!Global.changedSinceFilter.hasSelection())\r
+                               goodChangedSince = true;\r
+                       else\r
+                               goodChangedSince = Global.changedSinceFilter.check(n);\r
+                       if (!Global.containsFilter.hasSelection())\r
+                               goodContains = true;\r
+                       else\r
+                               goodContains = Global.containsFilter.check(conn.getNoteTable(), n);\r
+                               \r
+                       if (goodCreatedSince && goodCreatedBefore && goodChangedSince && goodChangedBefore && goodContains)\r
+                               return true;\r
+               }       \r
+               return false;\r
+       }\r
+       \r
+       // Trigger a recount of counters\r
+       public void refreshCounters() {\r
+//             refreshCounters= false;\r
+               if (!refreshCounters)\r
+                       return;\r
+               refreshCounters = false;\r
                tagCounterRunner.abortCount = true;\r
                notebookCounterRunner.abortCount = true;\r
                trashCounterRunner.abortCount = true;\r
-               \r
-               List<Note> index = new ArrayList<Note>();\r
+               countNotebookResults(getNoteIndex());\r
+               countTagResults(getNoteIndex());\r
+               reloadTrashCount();\r
+\r
+       }\r
+       // Load the note index based upon what the user wants.\r
+       public void loadNotesIndex() {\r
+               logger.log(logger.EXTREME, "Entering ListManager.loadNotesIndex()");\r
                \r
                List<Note> matches;\r
-               if (enSearchChanged || masterNoteIndex == null)\r
+               if (enSearchChanged || getMasterNoteIndex() == null)\r
                        matches = enSearch.matchWords();\r
                else\r
-                       matches = masterNoteIndex;\r
+                       matches = getMasterNoteIndex();\r
                \r
                if (matches == null)\r
-                       matches = masterNoteIndex;\r
+                       matches = getMasterNoteIndex();\r
                \r
+               setNoteIndex(new ArrayList<Note>());\r
                for (int i=0; i<matches.size(); i++) {\r
-                       Note n = matches.get(i);\r
-                       boolean goodNotebook = false;\r
-                       boolean goodTag = false;\r
-                       boolean goodAttribute = false;\r
-                       boolean goodStatus = false;\r
-                       \r
-                       // Check note status\r
-                       if (!n.isActive() && Global.showDeleted)\r
-                               index.add(n);\r
-                       else {\r
-                               if (n.isActive() && !Global.showDeleted)\r
-                                       goodStatus = true;\r
-                               // Begin filtering results\r
-                               if (goodStatus)\r
-                                       goodNotebook = filterByNotebook(n.getNotebookGuid());\r
-                               if (goodNotebook) \r
-                                       goodTag = filterByTag(n.getTagGuids());\r
-                               if (goodTag)\r
-                                       goodAttribute = conn.getNoteTable().checkAttributeSelection(n);\r
-                               if (goodAttribute)\r
-                                       index.add(n);\r
-                       }\r
-\r
-               }       \r
-               countNotebookResults(index);\r
-               countTagResults(index);\r
+                       if (filterRecord(matches.get(i)))\r
+                               getNoteIndex().add(matches.get(i));\r
+               }\r
+               refreshCounters = true;\r
                enSearchChanged = false;\r
-               setNoteIndex(index);\r
-               reloadTrashCount();\r
                logger.log(logger.EXTREME, "Leaving ListManager.loadNotesIndex()");\r
        }\r
        public void countNotebookResults(List<Note> index) {\r
                logger.log(logger.EXTREME, "Entering ListManager.countNotebookResults()");\r
-               if (!Global.mimicEvernoteInterface) {\r
+               notebookCounterRunner.abortCount = true;\r
+               if (!Global.mimicEvernoteInterface) \r
                        notebookCounterRunner.setNoteIndex(index);\r
-                       notebookCounterRunner.release(CounterRunner.NOTEBOOK);\r
-               } else {\r
-                       notebookCounterRunner.setNoteIndex(masterNoteIndex);\r
-                       notebookCounterRunner.release(CounterRunner.NOTEBOOK_ALL);\r
-               }\r
+               else \r
+                       notebookCounterRunner.setNoteIndex(getMasterNoteIndex());\r
+               notebookCounterRunner.release(CounterRunner.NOTEBOOK);\r
                logger.log(logger.EXTREME, "Leaving ListManager.countNotebookResults()");\r
        }\r
        public void countTagResults(List<Note> index) {\r
                logger.log(logger.EXTREME, "Entering ListManager.countTagResults");\r
-               if (!Global.tagBehavior().equalsIgnoreCase("DoNothing")) {\r
+               trashCounterRunner.abortCount = true;\r
+               if (!Global.tagBehavior().equalsIgnoreCase("DoNothing")) \r
                        tagCounterRunner.setNoteIndex(index);\r
-                       tagCounterRunner.release(CounterRunner.TAG);\r
-               } else {\r
-                       tagCounterRunner.setNoteIndex(null);\r
-                       tagCounterRunner.release(CounterRunner.TAG_ALL);\r
-               }\r
+               else\r
+                       tagCounterRunner.setNoteIndex(getMasterNoteIndex());\r
+               tagCounterRunner.release(CounterRunner.TAG);\r
                logger.log(logger.EXTREME, "Leaving ListManager.countTagResults()");\r
        }\r
        // Update the count of items in the trash\r
        public void reloadTrashCount() {\r
                logger.log(logger.EXTREME, "Entering ListManager.reloadTrashCount");\r
-               trashCounterRunner.setNoteIndex(getNoteIndex());\r
+               trashCounterRunner.abortCount = true;\r
+               trashCounterRunner.setNoteIndex(getMasterNoteIndex());\r
                trashCounterRunner.release(CounterRunner.TRASH);\r
                logger.log(logger.EXTREME, "Leaving ListManager.reloadTrashCount");\r
        }       \r
@@ -1010,29 +1049,39 @@ public class ListManager  {
                if (selectedTags.size() == 0) \r
                        return true;\r
                \r
-               for (int i=0; i<selectedTags.size(); i++) {\r
-                       String selectedGuid = selectedTags.get(i);\r
-                       if (noteTags.contains(selectedGuid))\r
-                                       return true;\r
+               if (!Global.anyTagSelectionMatch()) {\r
+                       for (int i=0; i<selectedTags.size(); i++) {\r
+                               String selectedGuid = selectedTags.get(i);\r
+                               if (!noteTags.contains(selectedGuid))\r
+                                       return false;\r
+                       }\r
+                       return true;\r
+               } else {\r
+                       for (int i=0; i<selectedTags.size(); i++) {\r
+                               String selectedGuid = selectedTags.get(i);\r
+                               if (noteTags.contains(selectedGuid))\r
+                                               return true;\r
+                       }\r
+                       return false;\r
                }\r
-               return false;\r
        }\r
 \r
-       \r
+       public void setNoteSynchronized(String guid, boolean value) {\r
+               getNoteTableModel().updateNoteSyncStatus(guid, value);\r
+       }\r
        \r
        public void updateNoteTitleColor(String guid, Integer color) {\r
-               titleColors.remove(guid);\r
-               titleColors.put(guid, color);\r
+               noteModel.updateNoteTitleColor(guid, color);\r
                conn.getNoteTable().setNoteTitleColor(guid, color);\r
        }\r
        public void loadNoteTitleColors() {\r
                List<Pair<String,Integer>> colors = conn.getNoteTable().getNoteTitleColors();\r
-               if (titleColors == null)\r
-                       titleColors = new HashMap<String,Integer>();\r
+               if (noteModel.getTitleColors() == null)\r
+                       noteModel.setTitleColors(new HashMap<String,Integer>());\r
                else\r
-                       titleColors.clear();\r
+                       noteModel.getTitleColors().clear();\r
                for (int i=0; i<colors.size(); i++) {\r
-                       titleColors.put(colors.get(i).getFirst(), colors.get(i).getSecond());\r
+                       noteModel.getTitleColors().put(colors.get(i).getFirst(), colors.get(i).getSecond());\r
                }\r
        }\r
        \r
@@ -1050,8 +1099,6 @@ public class ListManager  {
                }\r
        }\r
        \r
-       \r
-       \r
        public boolean threadCheck(int id) {\r
                if (id == Global.notebookCounterThreadId) \r
                        return notebookThread.isAlive();\r