X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=src%2Fcx%2Ffbn%2Fnevernote%2FNeverNote.java;h=84a07328ddd6c36825f911a47a34d0f7b4f69930;hb=60d1413aeada792496774e4947f0d1afe39258c4;hp=a3e6bace7e399aa320ad708c65d3f7bc85f02b73;hpb=b1a222fb38e3339f08c2a20b0a1998adb8fccb0b;p=neighbornote%2FNeighborNote.git diff --git a/src/cx/fbn/nevernote/NeverNote.java b/src/cx/fbn/nevernote/NeverNote.java index a3e6bac..84a0732 100644 --- a/src/cx/fbn/nevernote/NeverNote.java +++ b/src/cx/fbn/nevernote/NeverNote.java @@ -43,6 +43,8 @@ import java.util.List; import java.util.SortedMap; import java.util.Vector; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.h2.tools.ChangeFileEncryption; @@ -52,9 +54,11 @@ import com.evernote.edam.error.EDAMUserException; import com.evernote.edam.notestore.NoteFilter; import com.evernote.edam.notestore.NoteVersionId; import com.evernote.edam.type.Data; +import com.evernote.edam.type.LinkedNotebook; import com.evernote.edam.type.Note; import com.evernote.edam.type.NoteAttributes; import com.evernote.edam.type.Notebook; +import com.evernote.edam.type.Publishing; import com.evernote.edam.type.QueryFormat; import com.evernote.edam.type.Resource; import com.evernote.edam.type.SavedSearch; @@ -92,6 +96,7 @@ import com.trolltech.qt.gui.QCloseEvent; import com.trolltech.qt.gui.QColor; import com.trolltech.qt.gui.QComboBox; import com.trolltech.qt.gui.QComboBox.InsertPolicy; +import com.trolltech.qt.gui.QCursor; import com.trolltech.qt.gui.QDesktopServices; import com.trolltech.qt.gui.QDialog; import com.trolltech.qt.gui.QFileDialog; @@ -101,8 +106,8 @@ import com.trolltech.qt.gui.QGridLayout; import com.trolltech.qt.gui.QHBoxLayout; import com.trolltech.qt.gui.QIcon; import com.trolltech.qt.gui.QImage; +import com.trolltech.qt.gui.QKeySequence; import com.trolltech.qt.gui.QLabel; -import com.trolltech.qt.gui.QListWidget; import com.trolltech.qt.gui.QMainWindow; import com.trolltech.qt.gui.QMenu; import com.trolltech.qt.gui.QMessageBox; @@ -112,6 +117,7 @@ import com.trolltech.qt.gui.QPalette.ColorRole; import com.trolltech.qt.gui.QPixmap; import com.trolltech.qt.gui.QPrintDialog; import com.trolltech.qt.gui.QPrinter; +import com.trolltech.qt.gui.QShortcut; import com.trolltech.qt.gui.QSizePolicy; import com.trolltech.qt.gui.QSizePolicy.Policy; import com.trolltech.qt.gui.QSpinBox; @@ -123,6 +129,9 @@ import com.trolltech.qt.gui.QTableWidgetItem; import com.trolltech.qt.gui.QTextEdit; import com.trolltech.qt.gui.QToolBar; import com.trolltech.qt.gui.QTreeWidgetItem; +import com.trolltech.qt.network.QNetworkAccessManager; +import com.trolltech.qt.network.QNetworkReply; +import com.trolltech.qt.network.QNetworkRequest; import com.trolltech.qt.webkit.QWebPage.WebAction; import com.trolltech.qt.webkit.QWebSettings; @@ -134,14 +143,23 @@ import cx.fbn.nevernote.dialog.DBEncryptDialog; import cx.fbn.nevernote.dialog.DatabaseLoginDialog; import cx.fbn.nevernote.dialog.DatabaseStatus; import cx.fbn.nevernote.dialog.FindDialog; +import cx.fbn.nevernote.dialog.IgnoreSync; +import cx.fbn.nevernote.dialog.LogFileDialog; import cx.fbn.nevernote.dialog.LoginDialog; import cx.fbn.nevernote.dialog.NotebookArchive; import cx.fbn.nevernote.dialog.NotebookEdit; import cx.fbn.nevernote.dialog.OnlineNoteHistory; +import cx.fbn.nevernote.dialog.PublishNotebook; import cx.fbn.nevernote.dialog.SavedSearchEdit; +import cx.fbn.nevernote.dialog.SetIcon; +import cx.fbn.nevernote.dialog.ShareNotebook; +import cx.fbn.nevernote.dialog.StackNotebook; import cx.fbn.nevernote.dialog.TagEdit; import cx.fbn.nevernote.dialog.ThumbnailViewer; +import cx.fbn.nevernote.dialog.UpgradeAvailableDialog; import cx.fbn.nevernote.dialog.WatchFolder; +import cx.fbn.nevernote.filters.FilterEditorNotebooks; +import cx.fbn.nevernote.filters.FilterEditorTags; import cx.fbn.nevernote.gui.AttributeTreeWidget; import cx.fbn.nevernote.gui.BrowserWindow; import cx.fbn.nevernote.gui.DateAttributeFilterTable; @@ -184,6 +202,7 @@ public class NeverNote extends QMainWindow{ QAction trayExitAction; // Exit the application QAction trayShowAction; // toggle the show/hide action QAction trayAddNoteAction; // Add a note from the system tray + QNetworkAccessManager versionChecker; // Used when checking for new versions NotebookTreeWidget notebookTree; // List of notebooks AttributeTreeWidget attributeTree; // List of note attributes @@ -195,6 +214,7 @@ public class NeverNote extends QMainWindow{ public BrowserWindow browserWindow; // Window containing browser & labels public QToolBar toolBar; // The tool bar under the menu QComboBox searchField; // search filter bar on the toolbar; + QShortcut searchShortcut; // Shortcut to search bar boolean searchPerformed = false; // Search was done? QuotaProgressBar quotaBar; // The current quota usage @@ -209,7 +229,9 @@ public class NeverNote extends QMainWindow{ String currentNoteGuid; // GUID of the current note Note currentNote; // The currently viewed note boolean noteDirty; // Has the note been changed? - boolean inkNote; // if this is an ink note, it is read only + boolean inkNote; // if this is an ink note, it is read only + boolean readOnly; // Is this note read-only? + ListManager listManager; // DB runnable task @@ -251,7 +273,7 @@ public class NeverNote extends QMainWindow{ QAction synchronizeButton; // Synchronize with Evernote QAction allNotesButton; // Reset & view all notes QTimer synchronizeAnimationTimer; // Timer to change animation button - double synchronizeIconAngle; // Used to rotate sync icon + int synchronizeIconAngle; // Used to rotate sync icon QAction printButton; // Print Button QAction tagButton; // Tag edit button QAction attributeButton; // Attribute information button @@ -280,8 +302,16 @@ public class NeverNote extends QMainWindow{ int tagDeadCount=0; // number of consecutive dead times for the tag thread int trashDeadCount=0; // number of consecutive dead times for the trash thread int saveThreadDeadCount=0; // number of consecutive dead times for the save thread + boolean disableTagThreadCheck=false; + boolean disableNotebookThreadCheck=false; + boolean disableTrashThreadCheck=false; + boolean disableSaveThreadCheck=false; + boolean disableSyncThreadCheck=false; + boolean disableIndexThreadCheck=false; HashMap noteCache; // Cash of note content + HashMap readOnlyCache; // List of cashe notes that are read-only + HashMap inkNoteCache; // List of cache notes that are ink notes List historyGuids; // GUIDs of previously viewed items int historyPosition; // Position within the viewed items boolean fromHistory; // Is this from the history queue? @@ -294,6 +324,11 @@ public class NeverNote extends QMainWindow{ Signal0 minimizeToTray; boolean windowMaximized = false; // Keep track of the window state for restores List pdfReadyQueue; // Queue of PDFs that are ready to be rendered. + List syncIcons; // Array of icons used in sync animation + private boolean closeAction = false; // Used to say when to close or when to minimize + private static Logger log = Logger.getLogger(NeverNote.class); + private String saveLastPath; // last path we used + private final QTimer messageTimer; // Timer to clear the status message. String iconPath = new String("classpath:cx/fbn/nevernote/icons/"); @@ -305,18 +340,19 @@ public class NeverNote extends QMainWindow{ //*************************************************************** //*************************************************************** // Application Constructor + @SuppressWarnings("static-access") public NeverNote(DatabaseConnection dbConn) { conn = dbConn; if (conn.getConnection() == null) { - String msg = "Unable to connect to the database.\n\nThe most probable reason is that some other process\n" + + String msg = new String(tr("Unable to connect to the database.\n\nThe most probable reason is that some other process\n" + "is accessing the database or NeverNote is already running.\n\n" + - "Please end any other process or shutdown the other NeverNote before starting.\n\nExiting program."; + "Please end any other process or shutdown the other NeverNote before starting.\n\nExiting program.")); - QMessageBox.critical(null, "Database Connection Error",msg); + QMessageBox.critical(null, tr("Database Connection Error") ,msg); System.exit(16); } - thread().setPriority(Thread.MAX_PRIORITY); +// thread().setPriority(Thread.MAX_PRIORITY); logger = new ApplicationLogger("nevernote.log"); logger.log(logger.HIGH, "Starting Application"); @@ -364,8 +400,11 @@ public class NeverNote extends QMainWindow{ listManager = new ListManager(conn, logger); logger.log(logger.EXTREME, "Building index runners & timers"); - indexRunner = new IndexRunner("indexRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + indexRunner = new IndexRunner("indexRunner.log", + Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), + Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); indexThread = new QThread(indexRunner, "Index Thread"); + indexRunner.indexAttachmentsLocally = Global.indexAttachmentsLocally(); indexThread.start(); synchronizeAnimationTimer = new QTimer(); @@ -380,7 +419,9 @@ public class NeverNote extends QMainWindow{ logger.log(logger.EXTREME, "Setting sync thread & timers"); syncThreadsReady=1; - syncRunner = new SyncRunner("syncRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + syncRunner = new SyncRunner("syncRunner.log", + Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), + Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); syncTime = new SyncTimes().timeValue(Global.getSyncInterval()); syncTimer = new QTimer(); syncTimer.timeout.connect(this, "syncTimer()"); @@ -402,7 +443,9 @@ public class NeverNote extends QMainWindow{ logger.log(logger.EXTREME, "Starting thumnail thread"); pdfReadyQueue = new ArrayList(); - thumbnailRunner = new ThumbnailRunner("thumbnailRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + thumbnailRunner = new ThumbnailRunner("thumbnailRunner.log", + Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), + Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); thumbnailThread = new QThread(thumbnailRunner, "Thumbnail Thread"); thumbnailRunner.noteSignal.thumbnailPageReady.connect(this, "thumbnailHTMLReady(String,QByteArray,Integer)"); thumbnailThread.start(); @@ -410,7 +453,7 @@ public class NeverNote extends QMainWindow{ thumbnailTimer = new QTimer(); thumbnailTimer.timeout.connect(this, "thumbnailTimer()"); thumbnailTimer(); - thumbnailTimer.setInterval(5*1000); // Thumbnail every 2 min + thumbnailTimer.setInterval(500*1000); // Thumbnail every minute thumbnailTimer.start(); logger.log(logger.EXTREME, "Starting authentication timer"); @@ -437,7 +480,7 @@ public class NeverNote extends QMainWindow{ importFilesKeep = new ArrayList(); externalFileSaveTimer.start(); - notebookTree = new NotebookTreeWidget(); + notebookTree = new NotebookTreeWidget(conn); attributeTree = new AttributeTreeWidget(); tagTree = new TagTreeWidget(conn); savedSearchTree = new SavedSearchTreeWidget(); @@ -454,6 +497,8 @@ public class NeverNote extends QMainWindow{ // Setup the browser window noteCache = new HashMap(); + readOnlyCache = new HashMap(); + inkNoteCache = new HashMap(); browserWindow = new BrowserWindow(conn); mainLeftRightSplitter.addWidget(leftSplitter1); @@ -472,6 +517,9 @@ public class NeverNote extends QMainWindow{ searchField.activatedIndex.connect(this, "searchFieldChanged()"); searchField.setDuplicatesEnabled(false); searchField.editTextChanged.connect(this,"searchFieldTextChanged(String)"); + searchShortcut = new QShortcut(this); + setupShortcut(searchShortcut, "Focus_Search"); + searchShortcut.activated.connect(this, "focusSearch()"); quotaBar = new QuotaProgressBar(); @@ -502,6 +550,7 @@ public class NeverNote extends QMainWindow{ tagTree.setDeleteAction(menuBar.tagDeleteAction); tagTree.setEditAction(menuBar.tagEditAction); tagTree.setAddAction(menuBar.tagAddAction); + tagTree.setIconAction(menuBar.tagIconAction); tagTree.setVisible(Global.isWindowVisible("tagTree")); tagTree.noteSignal.tagsAdded.connect(this, "tagsAdded(String, String)"); menuBar.hideTags.setChecked(Global.isWindowVisible("tagTree")); @@ -510,13 +559,20 @@ public class NeverNote extends QMainWindow{ notebookTree.setDeleteAction(menuBar.notebookDeleteAction); notebookTree.setEditAction(menuBar.notebookEditAction); notebookTree.setAddAction(menuBar.notebookAddAction); + notebookTree.setIconAction(menuBar.notebookIconAction); + notebookTree.setStackAction(menuBar.notebookStackAction); + notebookTree.setPublishAction(menuBar.notebookPublishAction); + notebookTree.setShareAction(menuBar.notebookShareAction); notebookTree.setVisible(Global.isWindowVisible("notebookTree")); notebookTree.noteSignal.notebookChanged.connect(this, "updateNoteNotebook(String, String)"); + notebookTree.noteSignal.tagsChanged.connect(this, "updateNoteTags(String, List)"); + notebookTree.noteSignal.tagsChanged.connect(this, "updateListTags(String, List)"); menuBar.hideNotebooks.setChecked(Global.isWindowVisible("notebookTree")); savedSearchTree.setAddAction(menuBar.savedSearchAddAction); savedSearchTree.setEditAction(menuBar.savedSearchEditAction); savedSearchTree.setDeleteAction(menuBar.savedSearchDeleteAction); + savedSearchTree.setIconAction(menuBar.savedSearchIconAction); savedSearchTree.itemSelectionChanged.connect(this, "updateSavedSearchSelection()"); savedSearchTree.setVisible(Global.isWindowVisible("savedSearchTree")); menuBar.hideSavedSearches.setChecked(Global.isWindowVisible("savedSearchTree")); @@ -528,8 +584,8 @@ public class NeverNote extends QMainWindow{ noteTableView.setNoteHistoryAction(menuBar.noteOnlineHistoryAction); noteTableView.noteSignal.titleColorChanged.connect(this, "titleColorChanged(Integer)"); noteTableView.setMergeNotesAction(menuBar.noteMergeAction); - noteTableView.rowChanged.connect(this, "scrollToGuid(String)"); - noteTableView.resetViewport.connect(this, "scrollToCurrentGuid()"); +/// noteTableView.rowChanged.connect(this, "scrollToGuid(String)"); +/// noteTableView.resetViewport.connect(this, "scrollToCurrentGuid()"); noteTableView.doubleClicked.connect(this, "listDoubleClick()"); listManager.trashSignal.countChanged.connect(trashTree, "updateCounts(Integer)"); @@ -564,7 +620,7 @@ public class NeverNote extends QMainWindow{ trayExitAction = new QAction("Exit", this); trayAddNoteAction = new QAction("Add Note", this); - trayExitAction.triggered.connect(this, "close()"); + trayExitAction.triggered.connect(this, "closeNeverNote()"); trayAddNoteAction.triggered.connect(this, "addNote()"); trayShowAction.triggered.connect(this, "trayToggleVisible()"); @@ -636,14 +692,18 @@ public class NeverNote extends QMainWindow{ historyGuids.add(currentNoteGuid); historyPosition = 1; + menuBar.blockSignals(true); + menuBar.narrowListView.blockSignals(true); + menuBar.wideListView.blockSignals(true); if (Global.getListView() == Global.View_List_Narrow) { menuBar.narrowListView.setChecked(true); -// narrowListView(); } else{ menuBar.wideListView.setChecked(true); -// wideListView(); } + menuBar.blockSignals(false); + menuBar.narrowListView.blockSignals(false); + menuBar.wideListView.blockSignals(false); if (Global.getListView() == Global.View_List_Wide) { browserIndexSplitter.addWidget(noteTableView); @@ -653,15 +713,21 @@ public class NeverNote extends QMainWindow{ mainLeftRightSplitter.addWidget(browserWindow); } + messageTimer = new QTimer(); + messageTimer.timeout.connect(this, "clearMessage()"); + messageTimer.setInterval(1000*15); + clearMessage(); + int sortCol = Global.getSortColumn(); int sortOrder = Global.getSortOrder(); noteTableView.sortByColumn(sortCol, SortOrder.resolve(sortOrder)); - + if (Global.checkVersionUpgrade()) + checkForUpdates(); } - - + // Main entry point public static void main(String[] args) { + log.setLevel(Level.FATAL); QApplication.initialize(args); QPixmap pixmap = new QPixmap("classpath:cx/fbn/nevernote/icons/splash_logo.png"); QSplashScreen splash = new QSplashScreen(pixmap); @@ -679,7 +745,7 @@ public class NeverNote extends QMainWindow{ dbConn = setupDatabaseConnection(); // Must be last stage of setup - only safe once DB is open hence we know we are the only instance running - Global.getFileManager().purgeResDirectory(); + Global.getFileManager().purgeResDirectory(true); } catch (InitializationException e) { // Fatal @@ -732,7 +798,9 @@ public class NeverNote extends QMainWindow{ Global.getDatabaseUserPassword(), Global.cipherPassword); } } - DatabaseConnection dbConn = new DatabaseConnection(logger,Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + DatabaseConnection dbConn = new DatabaseConnection(logger,Global.getDatabaseUrl(), + Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), + Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword, 0); return dbConn; } @@ -743,8 +811,8 @@ public class NeverNote extends QMainWindow{ try { Statement st = conn.getConnection().createStatement(); st.execute("shutdown"); - if (QMessageBox.question(this, "Are you sure", - "Are you sure you wish to encrypt the database?", + if (QMessageBox.question(this, tr("Are you sure"), + tr("Are you sure you wish to encrypt the database?"), QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) == StandardButton.Yes.value()) { ChangeFileEncryption.execute(dbPath, dbName, encryptCipher, null, Global.cipherPassword.toCharArray(), true); @@ -837,6 +905,11 @@ public class NeverNote extends QMainWindow{ // Exit point @Override public void closeEvent(QCloseEvent event) { + if (Global.minimizeOnClose() && !closeAction && Global.showTrayIcon()) { + event.ignore(); + hide(); + return; + } logger.log(logger.HIGH, "Entering NeverNote.closeEvent"); waitCursor(true); @@ -860,17 +933,17 @@ public class NeverNote extends QMainWindow{ externalFileEditedSaver(); if (Global.isConnected && Global.synchronizeOnClose()) { setMessage(tr("Performing synchronization before closing.")); + syncRunner.syncNeeded = true; syncRunner.addWork("SYNC"); + } else { + syncRunner.keepRunning = false; } + syncRunner.addWork("STOP"); setMessage("Closing Program."); threadMonitorTimer.stop(); - syncRunner.addWork("STOP"); - syncRunner.keepRunning = false; thumbnailRunner.addWork("STOP"); - syncRunner.keepRunning = false; indexRunner.addWork("STOP"); - syncRunner.keepRunning = false; saveNote(); listManager.stop(); saveWindowState(); @@ -912,19 +985,31 @@ public class NeverNote extends QMainWindow{ Global.keepRunning = false; try { logger.log(logger.MEDIUM, "Waiting for indexThread to stop"); - indexRunner.thread().join(50); - logger.log(logger.MEDIUM, "Index thread has stopped"); + if (indexRunner.thread().isAlive()) + indexRunner.thread().join(50); + if (!indexRunner.thread().isAlive()) + logger.log(logger.MEDIUM, "Index thread has stopped"); + else { + logger.log(logger.MEDIUM, "Index thread still running - interrupting"); + indexRunner.thread().interrupt(); + } } catch (InterruptedException e1) { e1.printStackTrace(); } - if (!syncRunner.isIdle()) { - try { - logger.log(logger.MEDIUM, "Waiting for syncThread to stop"); - syncThread.join(); - logger.log(logger.MEDIUM, "Sync thread has stopped"); - } catch (InterruptedException e1) { - e1.printStackTrace(); + + if (!syncRunner.thread().isAlive()) { + logger.log(logger.MEDIUM, "Waiting for syncThread to stop"); + if (syncRunner.thread().isAlive()) { + System.out.println(tr("Synchronizing. Please be patient.")); + for(;syncRunner.thread().isAlive();) { + try { + wait(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } + logger.log(logger.MEDIUM, "Sync thread has stopped"); } if (encryptOnShutdown) { @@ -933,28 +1018,58 @@ public class NeverNote extends QMainWindow{ if (decryptOnShutdown) { decryptOnShutdown(); } + try { + Global.getFileManager().purgeResDirectory(false); + } catch (InitializationException e) { + System.out.println(tr("Empty res directory purge failed")); + e.printStackTrace(); + } logger.log(logger.HIGH, "Leaving NeverNote.closeEvent"); } + @SuppressWarnings("unused") + private void closeNeverNote() { + closeAction = true; + close(); + } public void setMessage(String s) { logger.log(logger.HIGH, "Entering NeverNote.setMessage"); + + statusBar.show(); logger.log(logger.HIGH, "Message: " +s); statusBar.showMessage(s); emitLog.add(s); + + + messageTimer.stop(); + messageTimer.setSingleShot(true); + messageTimer.start(); + + logger.log(logger.HIGH, "Leaving NeverNote.setMessage"); } + + private void clearMessage() { + statusBar.clearMessage(); + statusBar.hide(); + } private void waitCursor(boolean wait) { -// if (wait) -// QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor)); -// else -// QApplication.restoreOverrideCursor(); + if (wait) { + if (QApplication.overrideCursor() == null) + QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor)); + } + else { + while (QApplication.overrideCursor() != null) + QApplication.restoreOverrideCursor(); + } } private void setupIndexListeners() { - indexRunner.noteSignal.noteIndexed.connect(this, "indexThreadComplete(String)"); - indexRunner.resourceSignal.resourceIndexed.connect(this, "indexThreadComplete(String)"); -// indexRunner.threadSignal.indexNeeded.connect(listManager, "setIndexNeeded(String, String, Boolean)"); +// indexRunner.noteSignal.noteIndexed.connect(this, "indexThreadComplete(String)"); +// indexRunner.resourceSignal.resourceIndexed.connect(this, "indexThreadComplete(String)"); + indexRunner.signal.indexStarted.connect(this, "indexStarted()"); + indexRunner.signal.indexFinished.connect(this, "indexComplete()"); } private void setupSyncSignalListeners() { syncRunner.tagSignal.listChanged.connect(this, "tagIndexUpdated()"); @@ -971,6 +1086,7 @@ public class NeverNote extends QMainWindow{ syncRunner.noteSignal.noteChanged.connect(this, "invalidateNoteCache(String, String)"); syncRunner.resourceSignal.resourceGuidChanged.connect(this, "noteResourceGuidChanged(String,String,String)"); syncRunner.noteSignal.noteDownloaded.connect(listManager, "noteDownloaded(Note)"); + syncRunner.noteSignal.notebookChanged.connect(this, "updateNoteNotebook(String, String)"); syncRunner.syncSignal.refreshLists.connect(this, "refreshLists()"); } @@ -998,6 +1114,15 @@ public class NeverNote extends QMainWindow{ browser.resourceSignal.contentChanged.connect(this, "externalFileEdited(String)"); } + //************************************************** + //* Setup shortcuts + //************************************************** + private void setupShortcut(QShortcut action, String text) { + if (!Global.shortcutKeys.containsAction(text)) + return; + action.setKey(new QKeySequence(Global.shortcutKeys.getShortcut(text))); + } + //*************************************************************** //*************************************************************** //* Settings and look & feel @@ -1017,6 +1142,7 @@ public class NeverNote extends QMainWindow{ indexTimer.start(indexTime); // reset indexing timer settings.exec(); + indexRunner.indexAttachmentsLocally = Global.indexAttachmentsLocally(); if (Global.showTrayIcon()) trayIcon.show(); else @@ -1035,6 +1161,8 @@ public class NeverNote extends QMainWindow{ // if (!dateFormat.equals(Global.getDateFormat()) || // !timeFormat.equals(Global.getTimeFormat())) { noteCache.clear(); + readOnlyCache.clear(); + inkNoteCache.clear(); noteIndexUpdated(true); // } @@ -1065,8 +1193,15 @@ public class NeverNote extends QMainWindow{ } // Load the style sheet private void loadStyleSheet() { - String fileName = Global.getFileManager().getQssDirPath("default.qss"); + String fileName = Global.getFileManager().getQssDirPathUser("default.qss"); + fileName = Global.getFileManager().getQssDirPath("default.qss"); QFile file = new QFile(fileName); + + // If a user default.qss doesn't exist, we use the one shipped with NeverNote + if (!file.exists()) { + fileName = Global.getFileManager().getQssDirPath("default.qss"); + file = new QFile(fileName); + } file.open(OpenModeFlag.ReadOnly); String styleSheet = file.readAll().toString(); file.close(); @@ -1136,9 +1271,9 @@ public class NeverNote extends QMainWindow{ // Setup the tree containing the user's notebooks. private void initializeNotebookTree() { logger.log(logger.HIGH, "Entering NeverNote.initializeNotebookTree"); - notebookTree.itemSelectionChanged.connect(this, "notebookTreeSelection()"); +// notebookTree.itemClicked.connect(this, "notebookTreeSelection()"); + notebookTree.selectionSignal.connect(this, "notebookTreeSelection()"); listManager.notebookSignal.refreshNotebookTreeCounts.connect(notebookTree, "updateCounts(List, List)"); - // notebookTree.resize(Global.getSize("notebookTree")); logger.log(logger.HIGH, "Leaving NeverNote.initializeNotebookTree"); } // Listener when a notebook is selected @@ -1155,31 +1290,41 @@ public class NeverNote extends QMainWindow{ menuBar.noteRestoreAction.setVisible(false); menuBar.notebookEditAction.setEnabled(true); menuBar.notebookDeleteAction.setEnabled(true); + menuBar.notebookPublishAction.setEnabled(true); + menuBar.notebookShareAction.setEnabled(true); + menuBar.notebookIconAction.setEnabled(true); + menuBar.notebookStackAction.setEnabled(true); List selections = notebookTree.selectedItems(); - QTreeWidgetItem currentSelection; selectedNotebookGUIDs.clear(); - if (!Global.mimicEvernoteInterface) { - for (int i=0; i 0) { + guid = (selections.get(0).text(2)); + stackName = selections.get(0).text(0); + } + if (!Global.mimicEvernoteInterface) { + // If no notebooks are selected, we make it look like the "all notebooks" one was selected + if (selections.size()==0) { + selectedNotebookGUIDs.clear(); + for (int i=0; i < listManager.getNotebookIndex().size(); i++) { + selectedNotebookGUIDs.add(listManager.getNotebookIndex().get(i).getGuid()); + } + menuBar.notebookEditAction.setEnabled(false); + menuBar.notebookDeleteAction.setEnabled(false); + menuBar.notebookStackAction.setEnabled(false); + menuBar.notebookIconAction.setEnabled(false); + } + } + if (!guid.equals("") && !guid.equals("STACK")) { + selectedNotebookGUIDs.add(guid); + menuBar.notebookIconAction.setEnabled(true); } else { - String guid = ""; - if (selections.size() > 0) - guid = (selections.get(0).text(2)); - if (!guid.equals("")) - selectedNotebookGUIDs.add(guid); + menuBar.notebookIconAction.setEnabled(true); + for (int j=0; j icons = conn.getNotebookTable().getAllIcons(); + notebookTree.setIcons(icons); + + if (selectedNotebookGUIDs == null) selectedNotebookGUIDs = new ArrayList(); List books = conn.getNotebookTable().getAll(); for (int i=books.size()-1; i>=0; i--) { @@ -1271,29 +1421,90 @@ public class NeverNote extends QMainWindow{ } // Edit an existing notebook @SuppressWarnings("unused") + private void stackNotebook() { + logger.log(logger.HIGH, "Entering NeverNote.stackNotebook"); + StackNotebook edit = new StackNotebook(); + + List selections = notebookTree.selectedItems(); + QTreeWidgetItem currentSelection; + for (int i=0; i selections = notebookTree.selectedItems(); QTreeWidgetItem currentSelection; currentSelection = selections.get(0); edit.setNotebook(currentSelection.text(0)); - edit.setNotebooks(listManager.getNotebookIndex()); - + String guid = currentSelection.text(2); - for (int i=0; i filteredBooks = notebookFilter.getValidNotebooks(currentNote, listManager.getNotebookIndex()); + browserWindow.setNotebookList(filteredBooks); + Iterator set = externalWindows.keySet().iterator(); + while(set.hasNext()) + externalWindows.get(set.next()).getBrowserWindow().setNotebookList(filteredBooks); logger.log(logger.HIGH, "Leaving NeverNote.editNotebook"); } + // Publish a notebook + @SuppressWarnings("unused") + private void publishNotebook() { + List selections = notebookTree.selectedItems(); + QTreeWidgetItem currentSelection; + currentSelection = selections.get(0); + String guid = currentSelection.text(2); + + if (guid.equalsIgnoreCase("STACK") || guid.equalsIgnoreCase("")) + return; + + Notebook n = null; + int position = 0; + for (int i=0; i selections = notebookTree.selectedItems(); + QTreeWidgetItem currentSelection; + currentSelection = selections.get(0); + String guid = currentSelection.text(2); + + if (guid.equalsIgnoreCase("STACK") || guid.equalsIgnoreCase("")) + return; + + Notebook n = null;; + for (int i=0; i selections = notebookTree.selectedItems(); @@ -1337,13 +1625,18 @@ public class NeverNote extends QMainWindow{ QTreeWidgetItem currentSelection; currentSelection = selections.get(i); String guid = currentSelection.text(2); - for (int j=0; j=0; i--) { - // if (dbRunner.getLocalNotebooks().get(i).equals(arg0)) - // } - notebookTreeSelection(); - notebookTree.load(listManager.getNotebookIndex(), listManager.getLocalNotebooks()); - listManager.countNotebookResults(listManager.getNoteIndex()); -// notebookTree.updateCounts(listManager.getNotebookIndex(), listManager.getNotebookCounter()); + + notebookIndexUpdated(); +// notebookTreeSelection(); +// notebookTree.load(listManager.getNotebookIndex(), listManager.getLocalNotebooks()); +// listManager.countNotebookResults(listManager.getNoteIndex()); logger.log(logger.HIGH, "Entering NeverNote.deleteNotebook"); } // A note's notebook has been updated @@ -1453,6 +1760,7 @@ public class NeverNote extends QMainWindow{ listManager.loadNotesIndex(); notebookIndexUpdated(); noteIndexUpdated(false); + reloadTagTree(true); // noteIndexUpdated(false); // Build a list of non-closed notebooks @@ -1466,12 +1774,100 @@ public class NeverNote extends QMainWindow{ if (!found) nbooks.add(listManager.getNotebookIndex().get(i)); } + + FilterEditorNotebooks notebookFilter = new FilterEditorNotebooks(conn, logger); + List filteredBooks = notebookFilter.getValidNotebooks(currentNote, listManager.getNotebookIndex()); + browserWindow.setNotebookList(filteredBooks); + + // Update any external windows + Iterator set = externalWindows.keySet().iterator(); + while(set.hasNext()) + externalWindows.get(set.next()).getBrowserWindow().setNotebookList(filteredBooks); + waitCursor(false); - browserWindow.setNotebookList(nbooks); } + // Change the notebook's icon + @SuppressWarnings("unused") + private void setNotebookIcon() { + boolean stackSelected = false; + boolean allNotebookSelected = false; + + QTreeWidgetItem currentSelection; + List selections = notebookTree.selectedItems(); + if (selections.size() == 0) + return; + + currentSelection = selections.get(0); + String guid = currentSelection.text(2); + if (guid.equalsIgnoreCase("")) + allNotebookSelected = true; + if (guid.equalsIgnoreCase("STACK")) + stackSelected = true; + QIcon currentIcon = currentSelection.icon(0); + QIcon icon; + SetIcon dialog; + + if (!stackSelected && !allNotebookSelected) { + icon = conn.getNotebookTable().getIcon(guid); + if (icon == null) { + dialog = new SetIcon(currentIcon, saveLastPath); + dialog.setUseDefaultIcon(true); + } else { + dialog = new SetIcon(icon, saveLastPath); + dialog.setUseDefaultIcon(false); + } + } else { + if (stackSelected) { + icon = conn.getSystemIconTable().getIcon(currentSelection.text(0), "STACK"); + } else { + icon = conn.getSystemIconTable().getIcon(currentSelection.text(0), "ALLNOTEBOOK"); + } + if (icon == null) { + dialog = new SetIcon(currentIcon, saveLastPath); + dialog.setUseDefaultIcon(true); + } else { + dialog = new SetIcon(icon, saveLastPath); + dialog.setUseDefaultIcon(false); + } + } + dialog.exec(); + if (dialog.okPressed()) { + saveLastPath = dialog.getPath(); + + QIcon newIcon = dialog.getIcon(); + if (stackSelected) { + conn.getSystemIconTable().setIcon(currentSelection.text(0), "STACK", newIcon, dialog.getFileType()); + if (newIcon == null) { + newIcon = new QIcon(iconPath+"books2.png"); + } + currentSelection.setIcon(0,newIcon); + return; + } + if (allNotebookSelected) { + conn.getSystemIconTable().setIcon(currentSelection.text(0), "ALLNOTEBOOK", newIcon, dialog.getFileType()); + if (newIcon == null) { + newIcon = new QIcon(iconPath+"notebook-green.png"); + } + currentSelection.setIcon(0,newIcon); + return; + } + conn.getNotebookTable().setIcon(guid, newIcon, dialog.getFileType()); + if (newIcon == null) { + boolean isPublished = false;; + boolean found = false; + for (int i=0; i 0 && !notebookTree.selectedItems().get(0).text(0).equalsIgnoreCase("All Notebooks")) filter = true; @@ -1595,7 +1996,9 @@ public class NeverNote extends QMainWindow{ // Setup the tree containing the user's tags private void initializeTagTree() { logger.log(logger.HIGH, "Entering NeverNote.initializeTagTree"); - tagTree.itemSelectionChanged.connect(this, "tagTreeSelection()"); +// tagTree.itemSelectionChanged.connect(this, "tagTreeSelection()"); +// tagTree.itemClicked.connect(this, "tagTreeSelection()"); + tagTree.selectionSignal.connect(this, "tagTreeSelection()"); listManager.tagSignal.refreshTagTreeCounts.connect(tagTree, "updateCounts(List)"); logger.log(logger.HIGH, "Leaving NeverNote.initializeTagTree"); } @@ -1619,10 +2022,12 @@ public class NeverNote extends QMainWindow{ if (selections.size() > 0) { menuBar.tagEditAction.setEnabled(true); menuBar.tagDeleteAction.setEnabled(true); + menuBar.tagIconAction.setEnabled(true); } else { menuBar.tagEditAction.setEnabled(false); menuBar.tagDeleteAction.setEnabled(false); + menuBar.tagIconAction.setEnabled(true); } listManager.setSelectedTags(selectedTagGUIDs); listManager.loadNotesIndex(); @@ -1638,11 +2043,15 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Entering NeverNote.tagIndexUpdated"); if (selectedTagGUIDs == null) selectedTagGUIDs = new ArrayList(); -// selectedTagGUIDs.clear(); // clear out old entries + if (reload) + listManager.reloadTagIndex(); tagTree.blockSignals(true); - if (reload) + if (reload) { + tagTree.setIcons(conn.getTagTable().getAllIcons()); tagTree.load(listManager.getTagIndex()); + } + for (int i=selectedTagGUIDs.size()-1; i>=0; i--) { boolean found = tagTree.selectGuid(selectedTagGUIDs.get(i)); if (!found) @@ -1763,11 +2172,44 @@ public class NeverNote extends QMainWindow{ menuBar.noteRestoreAction.setVisible(false); menuBar.tagEditAction.setEnabled(false); menuBar.tagDeleteAction.setEnabled(false); + menuBar.tagIconAction.setEnabled(false); selectedTagGUIDs.clear(); listManager.setSelectedTags(selectedTagGUIDs); tagTree.blockSignals(false); } + // Change the icon for a tag + @SuppressWarnings("unused") + private void setTagIcon() { + QTreeWidgetItem currentSelection; + List selections = tagTree.selectedItems(); + if (selections.size() == 0) + return; + + currentSelection = selections.get(0); + String guid = currentSelection.text(2); + + QIcon currentIcon = currentSelection.icon(0); + QIcon icon = conn.getTagTable().getIcon(guid); + SetIcon dialog; + if (icon == null) { + dialog = new SetIcon(currentIcon, saveLastPath); + dialog.setUseDefaultIcon(true); + } else { + dialog = new SetIcon(icon, saveLastPath); + dialog.setUseDefaultIcon(false); + } + dialog.exec(); + if (dialog.okPressed()) { + saveLastPath = dialog.getPath(); + QIcon newIcon = dialog.getIcon(); + conn.getTagTable().setIcon(guid, newIcon, dialog.getFileType()); + if (newIcon == null) + newIcon = new QIcon(iconPath+"tag.png"); + currentSelection.setIcon(0, newIcon); + } + } + //*************************************************************** //*************************************************************** @@ -1883,6 +2325,7 @@ public class NeverNote extends QMainWindow{ String currentGuid = selectedSavedSearchGUID; menuBar.savedSearchEditAction.setEnabled(true); menuBar.savedSearchDeleteAction.setEnabled(true); + menuBar.savedSearchIconAction.setEnabled(true); List selections = savedSearchTree.selectedItems(); QTreeWidgetItem currentSelection; selectedSavedSearchGUID = ""; @@ -1909,6 +2352,7 @@ public class NeverNote extends QMainWindow{ private void clearSavedSearchFilter() { menuBar.savedSearchEditAction.setEnabled(false); menuBar.savedSearchDeleteAction.setEnabled(false); + menuBar.savedSearchIconAction.setEnabled(false); savedSearchTree.blockSignals(true); savedSearchTree.clearSelection(); savedSearchTree.blockSignals(false); @@ -1922,6 +2366,7 @@ public class NeverNote extends QMainWindow{ if (selectedSavedSearchGUID == null) selectedSavedSearchGUID = new String(); savedSearchTree.blockSignals(true); + savedSearchTree.setIcons(conn.getSavedSearchTable().getAllIcons()); savedSearchTree.load(listManager.getSavedSearchIndex()); savedSearchTree.selectGuid(selectedSavedSearchGUID); savedSearchTree.blockSignals(false); @@ -1933,17 +2378,20 @@ public class NeverNote extends QMainWindow{ menuBar.savedSearchEditAction.setEnabled(true); menuBar.savedSearchDeleteAction.setEnabled(true); + menuBar.savedSearchIconAction.setEnabled(true); List selections = savedSearchTree.selectedItems(); if (selections.size() > 0) { menuBar.savedSearchEditAction.setEnabled(true); menuBar.savedSearchDeleteAction.setEnabled(true); + menuBar.savedSearchIconAction.setEnabled(true); selectedSavedSearchGUID = selections.get(0).text(1); SavedSearch s = conn.getSavedSearchTable().getSavedSearch(selectedSavedSearchGUID); searchField.setEditText(s.getQuery()); } else { menuBar.savedSearchEditAction.setEnabled(false); menuBar.savedSearchDeleteAction.setEnabled(false); + menuBar.savedSearchIconAction.setEnabled(false); selectedSavedSearchGUID = ""; searchField.setEditText(""); } @@ -1965,6 +2413,38 @@ public class NeverNote extends QMainWindow{ Global.saveWindowVisible("savedSearchTree", savedSearchTree.isVisible()); logger.log(logger.HIGH, "Leaving NeverNote.toggleSavedSearchWindow"); } + // Change the icon for a saved search + @SuppressWarnings("unused") + private void setSavedSearchIcon() { + QTreeWidgetItem currentSelection; + List selections = savedSearchTree.selectedItems(); + if (selections.size() == 0) + return; + + currentSelection = selections.get(0); + String guid = currentSelection.text(1); + + QIcon currentIcon = currentSelection.icon(0); + QIcon icon = conn.getSavedSearchTable().getIcon(guid); + SetIcon dialog; + if (icon == null) { + dialog = new SetIcon(currentIcon, saveLastPath); + dialog.setUseDefaultIcon(true); + } else { + dialog = new SetIcon(icon, saveLastPath); + dialog.setUseDefaultIcon(false); + } + dialog.exec(); + if (dialog.okPressed()) { + saveLastPath = dialog.getPath(); + QIcon newIcon = dialog.getIcon(); + conn.getSavedSearchTable().setIcon(guid, newIcon, dialog.getFileType()); + if (newIcon == null) + newIcon = new QIcon(iconPath+"search.png"); + currentSelection.setIcon(0, newIcon); + } + + } @@ -1978,6 +2458,7 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void databaseStatus() { waitCursor(true); + indexRunner.interrupt = true; int dirty = conn.getNoteTable().getDirtyCount(); int unindexed = conn.getNoteTable().getUnindexedCount(); DatabaseStatus status = new DatabaseStatus(); @@ -1985,6 +2466,7 @@ public class NeverNote extends QMainWindow{ status.setUnindexed(unindexed); status.setNoteCount(conn.getNoteTable().getNoteCount()); status.setNotebookCount(listManager.getNotebookIndex().size()); + status.setUnindexedResourceCount(conn.getNoteTable().noteResourceTable.getUnindexedCount()); status.setSavedSearchCount(listManager.getSavedSearchIndex().size()); status.setTagCount(listManager.getTagIndex().size()); status.setResourceCount(conn.getNoteTable().noteResourceTable.getResourceCount()); @@ -2040,15 +2522,8 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void logger() { logger.log(logger.HIGH, "Entering NeverNote.logger"); - QDialog dialog = new QDialog(this); - QHBoxLayout layout = new QHBoxLayout(); - QListWidget textBox = new QListWidget(); - layout.addWidget(textBox); - textBox.addItems(emitLog); - - dialog.setLayout(layout); - dialog.setWindowTitle(tr("Mesasge Log")); - dialog.show(); + LogFileDialog dialog = new LogFileDialog(emitLog); + dialog.exec(); logger.log(logger.HIGH, "Leaving NeverNote.logger"); } // Menu option "help/about" was selected @@ -2093,30 +2568,128 @@ public class NeverNote extends QMainWindow{ Global.saveWindowVisible("leftPanel", hidden); } + public void checkForUpdates() { + // Send off thread to check for a new version + versionChecker = new QNetworkAccessManager(this); + versionChecker.finished.connect(this, "upgradeFileRead(QNetworkReply)"); + QNetworkRequest request = new QNetworkRequest(); + request.setUrl(new QUrl(Global.getUpdatesAvailableUrl())); + versionChecker.get(request); + } + @SuppressWarnings("unused") + private void upgradeFileRead(QNetworkReply reply) { + if (!reply.isReadable()) + return; + + String winVersion = Global.version; + String osxVersion = Global.version; + String linuxVersion = Global.version; + String linux64Version = Global.version; + String version = Global.version; + + // Determine the versions available + QByteArray data = reply.readLine(); + while (data != null && !reply.atEnd()) { + String line = data.toString(); + String lineVersion; + if (line.contains(":")) + lineVersion = line.substring(line.indexOf(":")+1).replace(" ", "").replace("\n", ""); + else + lineVersion = ""; + if (line.toLowerCase().contains("windows")) + winVersion = lineVersion; + else if (line.toLowerCase().contains("os-x")) + osxVersion = lineVersion; + else if (line.toLowerCase().contains("linux amd64")) + linux64Version = lineVersion; + else if (line.toLowerCase().contains("linux i386")) + linuxVersion = lineVersion; + else if (line.toLowerCase().contains("default")) + version = lineVersion; + // Read the next line + data = reply.readLine(); + } + + // Now we need to determine what system we are on. + if (System.getProperty("os.name").toLowerCase().contains("windows")) + version = winVersion; + if (System.getProperty("os.name").toLowerCase().contains("mac os")) + version = osxVersion; + if (System.getProperty("os.name").toLowerCase().contains("Linux")) { + if (System.getProperty("os.arch").contains("amd64") || + System.getProperty("os.arch").contains("x86_64")) + version = linux64Version; + else + version = linuxVersion; + } + + + for (String validVersion : Global.validVersions) { + if (version.equals(validVersion)) + return; + } + + UpgradeAvailableDialog dialog = new UpgradeAvailableDialog(); + dialog.exec(); + if (dialog.remindMe()) + Global.setCheckVersionUpgrade(true); + else + Global.setCheckVersionUpgrade(false); + } + //*************************************************************** //*************************************************************** //** These functions deal with the Toolbar //*************************************************************** - //*************************************************************** + //*************************************************************** + @SuppressWarnings("unused") + private void focusSearch() { + searchField.setFocus(); + } + // Text in the search bar has been cleared private void searchFieldCleared() { + saveNote(); + + // This is done because we want to force a reload of + // images. Some images we may want to highlight the text. + readOnlyCache.clear(); + inkNoteCache.clear(); + noteCache.clear(); + QWebSettings.setMaximumPagesInCache(0); + QWebSettings.setObjectCacheCapacities(0, 0, 0); + searchField.setEditText(""); saveNoteColumnPositions(); saveNoteIndexWidth(); + noteIndexUpdated(true); + if (currentNote == null && listManager.getNoteIndex().size() > 0) { + currentNote = listManager.getNoteIndex().get(0); + currentNoteGuid = currentNote.getGuid(); + } + if (currentNote != null) + loadNoteBrowserInformation(browserWindow); } // text in the search bar changed. We only use this to tell if it was cleared, // otherwise we trigger off searchFieldChanged. @SuppressWarnings("unused") private void searchFieldTextChanged(String text) { + QWebSettings.setMaximumPagesInCache(0); + QWebSettings.setObjectCacheCapacities(0, 0, 0); + if (text.trim().equals("")) { searchFieldCleared(); if (searchPerformed) { + + // This is done because we want to force a reload of + // images. Some images we may want to highlight the text. noteCache.clear(); + readOnlyCache.clear(); + inkNoteCache.clear(); + listManager.setEnSearch(""); -///// listManager.clearNoteIndexSearch(); - //noteIndexUpdated(true); listManager.loadNotesIndex(); refreshEvernoteNote(true); noteIndexUpdated(false); @@ -2128,12 +2701,13 @@ public class NeverNote extends QMainWindow{ private void searchFieldChanged() { logger.log(logger.HIGH, "Entering NeverNote.searchFieldChanged"); noteCache.clear(); + readOnlyCache.clear(); + inkNoteCache.clear(); saveNoteColumnPositions(); saveNoteIndexWidth(); String text = searchField.currentText(); listManager.setEnSearch(text.trim()); listManager.loadNotesIndex(); -//--->>> noteIndexUpdated(true); noteIndexUpdated(false); refreshEvernoteNote(true); searchPerformed = true; @@ -2385,41 +2959,33 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void updateSyncButton() { - /* synchronizeFrame++; - if (synchronizeFrame == 4) - synchronizeFrame = 0; - synchronizeButton.setIcon(synchronizeAnimation.get(synchronizeFrame)); - */ -/* - QPixmap pix = new QPixmap(iconPath+"synchronize.png"); - QMatrix matrix = new QMatrix(); - synchronizeIconAngle = synchronizeIconAngle + 1.0; - if (synchronizeIconAngle >= 365.0) - synchronizeIconAngle = 0.0; - matrix.translate(pix.size().width()/2, pix.size().height()/2); - matrix.rotate( synchronizeIconAngle ); - matrix.translate(-pix.size().width()/2, -pix.size().height()/2); - pix = pix.transformed(matrix, TransformationMode.SmoothTransformation); - synchronizeButton.setIcon(pix); -*/ - - - QPixmap pix = new QPixmap(iconPath+"synchronize.png"); - QPixmap rotatedPix = new QPixmap(pix.size()); - QPainter p = new QPainter(rotatedPix); - - rotatedPix.fill(toolBar.palette().color(ColorRole.Button)); - QSize size = pix.size(); - p.translate(size.width()/2, size.height()/2); - synchronizeIconAngle = synchronizeIconAngle+1.0; - if (synchronizeIconAngle >= 359.0) - synchronizeIconAngle = 0.0; - p.rotate(synchronizeIconAngle); - p.setBackgroundMode(BGMode.OpaqueMode); - p.translate(-size.width()/2, -size.height()/2); - p.drawPixmap(0,0, pix); - p.end(); - synchronizeButton.setIcon(rotatedPix); + + if (syncIcons == null) { + syncIcons = new ArrayList(); + double angle = 0.0; + synchronizeIconAngle = 0; + QPixmap pix = new QPixmap(iconPath+"synchronize.png"); + syncIcons.add(pix); + for (int i=0; i<=360; i++) { + QPixmap rotatedPix = new QPixmap(pix.size()); + QPainter p = new QPainter(rotatedPix); + rotatedPix.fill(toolBar.palette().color(ColorRole.Button)); + QSize size = pix.size(); + p.translate(size.width()/2, size.height()/2); + angle = angle+1.0; + p.rotate(angle); + p.setBackgroundMode(BGMode.OpaqueMode); + p.translate(-size.width()/2, -size.height()/2); + p.drawPixmap(0,0, pix); + p.end(); + syncIcons.add(rotatedPix); + } + } + + synchronizeIconAngle++; + if (synchronizeIconAngle > 359) + synchronizeIconAngle=0; + synchronizeButton.setIcon(syncIcons.get(synchronizeIconAngle)); } // Synchronize with Evernote @@ -2429,7 +2995,7 @@ public class NeverNote extends QMainWindow{ if (!Global.isConnected) remoteConnect(); if (Global.isConnected) - synchronizeAnimationTimer.start(10); + synchronizeAnimationTimer.start(5); // synchronizeAnimationTimer.start(200); syncTimer(); logger.log(logger.HIGH, "Leaving NeverNote.evernoteSync"); @@ -2550,7 +3116,6 @@ public class NeverNote extends QMainWindow{ menuBar.noteRestoreAction.setVisible(false); listManager.loadNotesIndex(); -//--->>> noteIndexUpdated(true); noteIndexUpdated(false); } } @@ -2589,6 +3154,7 @@ public class NeverNote extends QMainWindow{ menuBar.connectAction.setText(tr("Connect")); menuBar.connectAction.setToolTip(tr("Connect to Evernote")); menuBar.synchronizeAction.setEnabled(false); + Global.isConnected = false; synchronizeAnimationTimer.stop(); return; } @@ -2610,56 +3176,67 @@ public class NeverNote extends QMainWindow{ } catch (FileNotFoundException e) { // File not found, so we'll just get empty strings anyway. } + + if (Global.getProxyValue("url").equals("")) { + System.setProperty("http.proxyHost","") ; + System.setProperty("http.proxyPort", "") ; + System.setProperty("https.proxyHost","") ; + System.setProperty("https.proxyPort", "") ; + } else { + // PROXY + System.setProperty("http.proxyHost",Global.getProxyValue("url")) ; + System.setProperty("http.proxyPort", Global.getProxyValue("port")) ; + System.setProperty("https.proxyHost",Global.getProxyValue("url")) ; + System.setProperty("https.proxyPort", Global.getProxyValue("port")) ; + + if (Global.getProxyValue("userid").equals("")) { + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new + PasswordAuthentication(Global.getProxyValue("userid"),Global.getProxyValue("password").toCharArray()); + } + }); + } + } + + syncRunner.userStoreUrl = Global.userStoreUrl; + syncRunner.noteStoreUrl = Global.noteStoreUrl; + syncRunner.noteStoreUrlBase = Global.noteStoreUrlBase; + String userid = aes.getUserid(); String password = aes.getPassword(); if (!userid.equals("") && !password.equals("")) { Global.username = userid; Global.password = password; + syncRunner.username = Global.username; + syncRunner.password = Global.password; + syncRunner.enConnect(); } - // Show the login dialog box - if (!Global.automaticLogin() || userid.equals("")|| password.equals("")) { - LoginDialog login = new LoginDialog(); - login.exec(); + Global.isConnected = syncRunner.isConnected; - if (!login.okPressed()) { - return; - } + if (!Global.isConnected) { + // Show the login dialog box + if (!Global.automaticLogin() || userid.equals("")|| password.equals("")) { + LoginDialog login = new LoginDialog(); + login.exec(); + + if (!login.okPressed()) { + return; + } - Global.username = login.getUserid(); - Global.password = login.getPassword(); + Global.username = login.getUserid(); + Global.password = login.getPassword(); + } + syncRunner.username = Global.username; + syncRunner.password = Global.password; + syncRunner.enConnect(); + Global.isConnected = syncRunner.isConnected; } - syncRunner.username = Global.username; - syncRunner.password = Global.password; - syncRunner.userStoreUrl = Global.userStoreUrl; - syncRunner.noteStoreUrl = Global.noteStoreUrl; - syncRunner.noteStoreUrlBase = Global.noteStoreUrlBase; - if (Global.getProxyValue("url").equals("")) { - System.setProperty("http.proxyHost","") ; - System.setProperty("http.proxyPort", "") ; - System.setProperty("https.proxyHost","") ; - System.setProperty("https.proxyPort", "") ; - } else { - // PROXY - System.setProperty("http.proxyHost",Global.getProxyValue("url")) ; - System.setProperty("http.proxyPort", Global.getProxyValue("port")) ; - System.setProperty("https.proxyHost",Global.getProxyValue("url")) ; - System.setProperty("https.proxyPort", Global.getProxyValue("port")) ; - - if (Global.getProxyValue("userid").equals("")) { - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new - PasswordAuthentication(Global.getProxyValue("userid"),Global.getProxyValue("password").toCharArray()); - }}); - } - } - - - syncRunner.enConnect(); - Global.isConnected = syncRunner.isConnected; + if (!Global.isConnected) + return; setupOnlineMenu(); setupConnectMenuOptions(); logger.log(logger.HIGH, "Leaving NeverNote.remoteConnect"); @@ -2688,10 +3265,10 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void attributeTreeClicked(QTreeWidgetItem item, Integer integer) { - clearTagFilter(); - clearNotebookFilter(); +// clearTagFilter(); +// clearNotebookFilter(); clearTrashFilter(); - clearSavedSearchFilter(); +// clearSavedSearchFilter(); if (attributeTreeSelected == null || item.nativeId() != attributeTreeSelected.nativeId()) { if (item.childCount() > 0) { @@ -2858,7 +3435,7 @@ public class NeverNote extends QMainWindow{ nextButton.setEnabled(false); fromHistory = false; - scrollToGuid(currentNoteGuid); +// scrollToGuid(currentNoteGuid); refreshEvernoteNote(true); logger.log(logger.HIGH, "Leaving NeverNote.noteTableSelection"); } @@ -2869,7 +3446,24 @@ public class NeverNote extends QMainWindow{ refreshEvernoteNoteList(); logger.log(logger.HIGH, "Calling note table reload in NeverNote.noteIndexUpdated() - "+reload); noteTableView.load(reload); - scrollToGuid(currentNoteGuid); + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + int pos; + if (noteTableView.proxyModel.sortOrder() == SortOrder.AscendingOrder) + pos = noteTableView.proxyModel.rowCount(); + else + pos = 1; + if (noteTableView.proxyModel.rowCount() == 0) + pos = 0; + if (pos>0) { + QModelIndex i = noteTableView.proxyModel.index(pos-1, Global.noteTableGuidPosition); + if (i!=null) { + currentNoteGuid = (String)i.data(); + } + } + } + if (!noteTableView.isColumnHidden(Global.noteTableGuidPosition)) + showColumns(); + scrollToGuid(currentNoteGuid); logger.log(logger.HIGH, "Leaving NeverNote.noteIndexUpdated"); } // Called when the list of notes is updated @@ -2906,15 +3500,12 @@ public class NeverNote extends QMainWindow{ browserWindow.setDisabled(true); } - if (saveCurrentNoteGuid.equals("") && listManager.getNoteIndex().size() > 0) { - currentNote = listManager.getNoteIndex().get(listManager.getNoteIndex().size()-1); - currentNoteGuid = currentNote.getGuid(); - refreshEvernoteNote(true); + if (!saveCurrentNoteGuid.equals("")) { + refreshEvernoteNote(false); } else { - //we can reload if note not dirty - refreshEvernoteNote(!noteDirty); + currentNoteGuid = ""; } - reloadTagTree(); + reloadTagTree(false); logger.log(logger.HIGH, "Leaving NeverNote.refreshEvernoteNoteList"); } @@ -3055,6 +3646,7 @@ public class NeverNote extends QMainWindow{ } logger.log(logger.HIGH, "Leaving NeverNote.updateListAuthor"); } + @SuppressWarnings("unused") private void updateListGuid(String oldGuid, String newGuid) { logger.log(logger.HIGH, "Entering NeverNote.updateListTitle"); @@ -3172,7 +3764,6 @@ public class NeverNote extends QMainWindow{ } logger.log(logger.HIGH, "Leaving NeverNote.updateListDateCreated"); } - @SuppressWarnings("unused") private void updateListDateChanged(String guid, QDateTime date) { logger.log(logger.HIGH, "Entering NeverNote.updateListDateChanged"); @@ -3197,7 +3788,6 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Leaving NeverNote.updateListDateChanged"); } // Redo scroll - @SuppressWarnings("unused") private void scrollToCurrentGuid() { //scrollToGuid(currentNoteGuid); List selections = noteTableView.selectionModel().selectedRows(); @@ -3208,6 +3798,7 @@ public class NeverNote extends QMainWindow{ String guid = (String)index.model().index(row, Global.noteTableGuidPosition).data(); scrollToGuid(guid); } + // Scroll to the current GUID in tthe list. // Scroll to a particular index item private void scrollToGuid(String guid) { if (currentNote == null || guid == null) @@ -3221,7 +3812,6 @@ public class NeverNote extends QMainWindow{ } } } - if (!currentNote.isActive() && !Global.showDeleted) { for (int i=0; i", ""); browser.getBrowser().setContent(js); noteCache.put(currentNoteGuid, js.toString()); + + if (formatter.resourceError) + resourceErrorMessage(); + readOnly = formatter.readOnly; + inkNote = formatter.inkNote; + if (readOnly) + readOnlyCache.put(currentNoteGuid, true); + if (inkNote) + inkNoteCache.put(currentNoteGuid, true); } else { logger.log(logger.HIGH, "Note content is being pulled from the cache"); String cachedContent = formatter.modifyCachedTodoTags(noteCache.get(currentNoteGuid)); js = new QByteArray(cachedContent); browser.getBrowser().setContent(js); + if (readOnlyCache.containsKey(currentNoteGuid)) + readOnly = true; + if (inkNoteCache.containsKey(currentNoteGuid)) + inkNote = true; } if (conn.getNoteTable().isThumbnailNeeded(currentNoteGuid)) { thumbnailHTMLReady(currentNoteGuid, js, Global.calculateThumbnailZoom(js.toString())); } - if (formatter.resourceError) - resourceErrorMessage(); - inkNote = formatter.readOnly; - - browser.getBrowser().page().setContentEditable(!inkNote); // We don't allow editing of ink notes + if (readOnly || inkNote) + browser.getBrowser().page().setContentEditable(false); // We don't allow editing of ink notes + else + browser.getBrowser().page().setContentEditable(true); + browser.setReadOnly(readOnly); + deleteButton.setEnabled(!readOnly); + tagButton.setEnabled(!readOnly); + menuBar.noteDelete.setEnabled(!readOnly); + menuBar.noteTags.setEnabled(!readOnly); browser.setNote(currentNote); + if (currentNote != null && currentNote.getNotebookGuid() != null && + conn.getNotebookTable().isLinked(currentNote.getNotebookGuid())) { + deleteButton.setEnabled(false); + menuBar.notebookDeleteAction.setEnabled(false); + } else { + deleteButton.setEnabled(true); + menuBar.notebookDeleteAction.setEnabled(true); + } + // Build a list of non-closed notebooks List nbooks = new ArrayList(); for (int i=0; i tagList = tagFilter.getValidTags(currentNote); + browser.setAllTags(tagList); + browser.setCurrentTags(currentNote.getTagNames()); noteDirty = false; - scrollToGuid(currentNoteGuid); +// scrollToGuid(currentNoteGuid); browser.loadingData(false); if (thumbnailViewer.isActiveWindow()) thumbnailView(); + + FilterEditorNotebooks notebookFilter = new FilterEditorNotebooks(conn, logger); + browser.setNotebookList(notebookFilter.getValidNotebooks(currentNote, listManager.getNotebookIndex())); + waitCursor(false); logger.log(logger.HIGH, "Leaving NeverNote.refreshEvernoteNote"); } @@ -3661,31 +4308,16 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void fullReindex() { logger.log(logger.HIGH, "Entering NeverNote.fullReindex"); - // If we are deleting non-trash notes - if (currentNote == null) return; - if (currentNote.getDeleted() == 0) { - if (QMessageBox.question(this, tr("Confirmation"), tr("This will cause all notes & attachments to be reindexed, "+ - "but please be aware that depending upon the size of your database updating all these records " + - "can be time consuming and NeverNote will be unresponsive until it is complete. Do you wish to continue?"), - QMessageBox.StandardButton.Yes, - QMessageBox.StandardButton.No)==StandardButton.No.value() && Global.verifyDelete() == true) { - return; - } - } - waitCursor(true); - setMessage(tr("Marking notes for reindex.")); - conn.getNoteTable().reindexAllNotes(); - conn.getNoteTable().noteResourceTable.reindexAll(); + indexRunner.addWork("REINDEXALL"); setMessage(tr("Database will be reindexed.")); - waitCursor(false); - logger.log(logger.HIGH, "Leaving NeverNote.fullRefresh"); + logger.log(logger.HIGH, "Leaving NeverNote.fullReindex"); } // Listener when a user wants to reindex a specific note @SuppressWarnings("unused") private void reindexNote() { logger.log(logger.HIGH, "Entering NeverNote.reindexNote"); for (int i=0; i 1) setMessage(tr("Notes will be reindexed.")); @@ -3796,7 +4428,8 @@ public class NeverNote extends QMainWindow{ } } if (!match) - goodNotebooks.add(listManager.getNotebookIndex().get(i).deepCopy()); + //goodNotebooks.add(listManager.getNotebookIndex().get(i).deepCopy()); + goodNotebooks.add((Notebook)Global.deepCopy(listManager.getNotebookIndex().get(i))); } // Now we have a list of good notebooks, so we can look for the default found = false; @@ -3851,11 +4484,16 @@ public class NeverNote extends QMainWindow{ currentNote = newNote; currentNoteGuid = currentNote.getGuid(); + noteTableView.clearSelection(); refreshEvernoteNote(true); listManager.countNotebookResults(listManager.getNoteIndex()); browserWindow.titleLabel.setFocus(); browserWindow.titleLabel.selectAll(); -// notebookTree.updateCounts(listManager.getNotebookIndex(), listManager.getNotebookCounter()); +// notebookTree.updateCounts(listManager.getNotebookIndex(), listManager.getNotebookCounter()); + + // If the window is hidden, then we want to popup this in an external window & + if (!isVisible()) + listDoubleClick(); logger.log(logger.HIGH, "Leaving NeverNote.addNote"); } // Restore a note from the trash; @@ -3883,7 +4521,8 @@ public class NeverNote extends QMainWindow{ browserWindow.getBrowser().page().findText(find.getText(), find.getFlags()); find.setFocus(); } - private void updateNoteTitle(String guid, String title) { + @SuppressWarnings("unused") + private void updateNoteTitle(String guid, String title) { listManager.setNoteSynchronized(guid, false); } // Signal received that note content has changed. Normally we just need the guid to remove @@ -3891,36 +4530,44 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void invalidateNoteCache(String guid, String content) { String v = noteCache.remove(guid); - if (content != null) { - //noteCache.put(guid, content); - } +// if (guid.equals(currentNoteGuid) && !noteDirty) + refreshEvernoteNote(true); } // Signal received that a note guid has changed @SuppressWarnings("unused") private void noteGuidChanged(String oldGuid, String newGuid) { if (noteCache.containsKey(oldGuid)) { - String cache = noteCache.get(oldGuid); - noteCache.put(newGuid, cache); - noteCache.remove(oldGuid); + if (!oldGuid.equals(currentNoteGuid)) { + String cache = noteCache.get(oldGuid); + noteCache.put(newGuid, cache); + noteCache.remove(oldGuid); + } else { + noteCache.remove(oldGuid); + noteCache.put(newGuid, browserWindow.getContent()); + } } + listManager.updateNoteGuid(oldGuid, newGuid, false); if (currentNoteGuid.equals(oldGuid)) { if (currentNote != null) currentNote.setGuid(newGuid); currentNoteGuid = newGuid; } - if (externalWindows.containsKey(oldGuid)) { + + if (externalWindows.containsKey(oldGuid)) { ExternalBrowse b = externalWindows.get(oldGuid); externalWindows.remove(oldGuid); b.getBrowserWindow().getNote().setGuid(newGuid); externalWindows.put(newGuid, b); } + for (int i=0; i resList = conn.getNoteTable().noteResourceTable.getNoteResources(guid, true); oldNote.setContent(conn.getNoteTable().getNoteContentBinary(guid)); oldNote.setResources(resList); @@ -3987,11 +4634,37 @@ public class NeverNote extends QMainWindow{ Long l = new Long(currentTime.getTimeInMillis()); String newGuid = new String(Long.toString(l)); - Note newNote = oldNote.deepCopy(); +// Note newNote = oldNote.deepCopy(); + Note newNote = (Note)Global.deepCopy(oldNote); newNote.setUpdateSequenceNum(0); newNote.setGuid(newGuid); newNote.setDeleted(0); newNote.setActive(true); + + /* + List tagNames = new ArrayList(); + List tagGuids = new ArrayList();; + for (int i=0; i resList = oldNote.getResources(); if (resList == null) resList = new ArrayList(); @@ -4008,17 +4681,24 @@ public class NeverNote extends QMainWindow{ resList.get(i).setGuid(newResGuid); resList.get(i).setUpdateSequenceNum(0); resList.get(i).setActive(true); - conn.getNoteTable().noteResourceTable.saveNoteResource(new Resource(resList.get(i).deepCopy()), true); + conn.getNoteTable().noteResourceTable.saveNoteResource( + (Resource)Global.deepCopy(resList.get(i)), true); } 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); + currentNoteGuid = newNote.getGuid(); + currentNote = newNote; + refreshEvernoteNote(true); listManager.countNotebookResults(listManager.getNoteIndex()); waitCursor(false); } // View all notes + @SuppressWarnings("unused") private void allNotes() { clearAttributeFilter(); clearNotebookFilter(); @@ -4152,7 +4832,6 @@ public class NeverNote extends QMainWindow{ } } private void thumbnailHTMLReady(String guid, QByteArray html, Integer zoom) { - logger.log(logger.HIGH, "Entering thumnailHTMLReady()"); logger.log(logger.HIGH, "Thumbnail ready for " +guid); // Find an idle preview object @@ -4189,9 +4868,11 @@ public class NeverNote extends QMainWindow{ private void setupOnlineMenu() { if (!Global.isConnected) { menuBar.noteOnlineHistoryAction.setEnabled(false); + menuBar.selectiveSyncAction.setEnabled(false); return; } else { menuBar.noteOnlineHistoryAction.setEnabled(true); + menuBar.selectiveSyncAction.setEnabled(true); } } @SuppressWarnings("unused") @@ -4210,10 +4891,10 @@ public class NeverNote extends QMainWindow{ versions = null; try { if (Global.isPremium()) - versions = syncRunner.noteStore.listNoteVersions(syncRunner.authToken, currentNoteGuid); + versions = syncRunner.localNoteStore.listNoteVersions(syncRunner.authToken, currentNoteGuid); else versions = new ArrayList(); - currentOnlineNote = syncRunner.noteStore.getNote(syncRunner.authToken, currentNoteGuid, true, true, false, false); + currentOnlineNote = syncRunner.localNoteStore.getNote(syncRunner.authToken, currentNoteGuid, true, true, false, false); } catch (EDAMUserException e) { setMessage("EDAMUserException: " +e.getMessage()); return; @@ -4268,9 +4949,9 @@ public class NeverNote extends QMainWindow{ try { if (index > -1) { usn = versions.get(index).getUpdateSequenceNum(); - historyNote = syncRunner.noteStore.getNoteVersion(syncRunner.authToken, currentNoteGuid, usn, true, true, true); + historyNote = syncRunner.localNoteStore.getNoteVersion(syncRunner.authToken, currentNoteGuid, usn, true, true, true); } else - historyNote = syncRunner.noteStore.getNote(syncRunner.authToken, currentNoteGuid, true,true,true,true); + historyNote = syncRunner.localNoteStore.getNote(syncRunner.authToken, currentNoteGuid, true,true,true,true); } catch (EDAMUserException e) { setMessage("EDAMUserException: " +e.getMessage()); waitCursor(false); @@ -4323,7 +5004,138 @@ public class NeverNote extends QMainWindow{ refreshEvernoteNote(true); setMessage(tr("Note has been restored.")); } - + @SuppressWarnings("unused") + private void setupSelectiveSync() { + + // Get a list of valid notebooks + List notebooks = null; + List tags = null; + List linkedNotebooks = null; + try { + notebooks = syncRunner.localNoteStore.listNotebooks(syncRunner.authToken); + tags = syncRunner.localNoteStore.listTags(syncRunner.authToken); + linkedNotebooks = syncRunner.localNoteStore.listLinkedNotebooks(syncRunner.authToken); + } catch (EDAMUserException e) { + setMessage("EDAMUserException: " +e.getMessage()); + return; + } catch (EDAMSystemException e) { + setMessage("EDAMSystemException: " +e.getMessage()); + return; + } catch (TException e) { + setMessage("EDAMTransactionException: " +e.getMessage()); + return; + } catch (EDAMNotFoundException e) { + setMessage("EDAMNotFoundException: " +e.getMessage()); + return; + } + + // Split up notebooks into synchronized & non-synchronized + List ignoredBooks = new ArrayList(); + List dbIgnoredNotebooks = conn.getSyncTable().getIgnoreRecords("NOTEBOOK"); + + for (int i=notebooks.size()-1; i>=0; i--) { + for (int j=0; j ignoredTags = new ArrayList(); + List dbIgnoredTags = conn.getSyncTable().getIgnoreRecords("TAG"); + + for (int i=tags.size()-1; i>=0; i--) { + for (int j=0; j ignoredLinkedNotebooks = new ArrayList(); + List dbIgnoredLinkedNotebooks = conn.getSyncTable().getIgnoreRecords("LINKEDNOTEBOOK"); + for (int i=linkedNotebooks.size()-1; i>=0; i--) { + String notebookGuid = linkedNotebooks.get(i).getGuid(); + for (int j=0; j oldIgnoreNotebooks = conn.getSyncTable().getIgnoreRecords("NOTEBOOK"); + for (int i=0; i newNotebooks = new ArrayList(); + for (int i=ignore.getIgnoredBookList().count()-1; i>=0; i--) { + String text = ignore.getIgnoredBookList().takeItem(i).text(); + for (int j=0; j oldIgnoreTags = conn.getSyncTable().getIgnoreRecords("TAG"); + for (int i=0; i newTags = new ArrayList(); + for (int i=ignore.getIgnoredTagList().count()-1; i>=0; i--) { + String text = ignore.getIgnoredTagList().takeItem(i).text(); + for (int j=0; j oldIgnoreLinkedNotebooks = conn.getSyncTable().getIgnoreRecords("LINKEDNOTEBOOK"); + for (int i=0; i newLinked = new ArrayList(); + for (int i=ignore.getIgnoredLinkedNotebookList().count()-1; i>=0; i--) { + String text = ignore.getIgnoredLinkedNotebookList().takeItem(i).text(); + for (int j=0; j 0) { + thumbnailRunner.interrupt = true; saveNoteIndexWidth(); saveNoteColumnPositions(); if (syncRunner.addWork("SYNC")) { @@ -4422,6 +5235,7 @@ public class NeverNote extends QMainWindow{ } public void refreshLists() { logger.log(logger.EXTREME, "Entering NeverNote.refreshLists"); + System.out.println("<><><><><><><><><><><><><><><><><><><><>"); updateQuotaBar(); listManager.refreshLists(currentNote, noteDirty, browserWindow.getContent()); tagIndexUpdated(true); @@ -4477,66 +5291,20 @@ public class NeverNote extends QMainWindow{ logger.log(logger.EXTREME, "Index timer activated. Sync running="+syncRunning); if (syncRunning) return; - // Look for any unindexed notes. We only refresh occasionally - // and do one at a time to keep overhead down. - if (!indexDisabled && indexRunner.getWorkQueueSize() == 0) { - List notes = conn.getNoteTable().getNextUnindexed(1); - String unindexedNote = null; - if (notes.size() > 0) - unindexedNote = notes.get(0); - if (unindexedNote != null && Global.keepRunning) { - indexNoteContent(unindexedNote); - } - if (notes.size()>0) { - indexTimer.setInterval(100); - return; - } - List unindexedResources = conn.getNoteTable().noteResourceTable.getNextUnindexed(1); - if (unindexedResources.size() > 0 && indexRunner.getWorkQueueSize() == 0) { - String unindexedResource = unindexedResources.get(0); - if (unindexedResource != null && Global.keepRunning) { - indexNoteResource(unindexedResource); - } - } - if (unindexedResources.size() > 0) { - indexTimer.setInterval(100); - return; - } else { - indexTimer.setInterval(indexTime); - } - if (indexRunning) { - setMessage(tr("Index completed.")); - logger.log(logger.LOW, "Indexing has completed."); - indexRunning = false; - indexTimer.setInterval(indexTime); - } + if (!indexDisabled && indexRunner.idle) { + thumbnailRunner.interrupt = true; + indexRunner.addWork("SCAN"); } logger.log(logger.EXTREME, "Leaving neverNote index timer"); } - private synchronized void indexNoteContent(String unindexedNote) { - logger.log(logger.EXTREME, "Entering NeverNote.indexNoteContent()"); - logger.log(logger.MEDIUM, "Unindexed Note found: "+unindexedNote); - indexRunner.setIndexType(indexRunner.CONTENT); - indexRunner.addWork("CONTENT "+unindexedNote); - if (!indexRunning) { - setMessage(tr("Indexing notes.")); - logger.log(logger.LOW, "Beginning to index note contents."); - indexRunning = true; - } - logger.log(logger.EXTREME, "Leaving NeverNote.indexNoteContent()"); - } - private synchronized void indexNoteResource(String unindexedResource) { - logger.log(logger.EXTREME, "Leaving NeverNote.indexNoteResource()"); - indexRunner.addWork(new String("RESOURCE "+unindexedResource)); - if (!indexRunning) { - setMessage(tr("Indexing notes.")); - indexRunning = true; - } - logger.log(logger.EXTREME, "Leaving NeverNote.indexNoteResource()"); + + @SuppressWarnings("unused") + private void indexStarted() { + setMessage(tr("Indexing notes")); } @SuppressWarnings("unused") - private void indexThreadComplete(String guid) { - logger.log(logger.MEDIUM, "Index complete for "+guid); + private void indexComplete() { + setMessage(tr("Index complete")); } @SuppressWarnings("unused") private synchronized void toggleNoteIndexing() { @@ -4559,47 +5327,64 @@ public class NeverNote extends QMainWindow{ alive = listManager.threadCheck(Global.tagCounterThreadId); if (!alive) { tagDeadCount++; - if (tagDeadCount > MAX) + if (tagDeadCount > MAX && !disableTagThreadCheck) { QMessageBox.information(this, tr("A thread his died."), tr("It appears as the tag counter thread has died. I recommend "+ "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + disableTagThreadCheck = true; + } } else tagDeadCount=0; alive = listManager.threadCheck(Global.notebookCounterThreadId); if (!alive) { notebookThreadDeadCount++; - QMessageBox.information(this, tr("A thread his died."), tr("It appears as the notebook counter thread has died. I recommend "+ - "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + if (notebookThreadDeadCount > MAX && !disableNotebookThreadCheck) { + QMessageBox.information(this, tr("A thread his died."), tr("It appears as the notebook counter thread has died. I recommend "+ + "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + disableNotebookThreadCheck=true; + } } else notebookThreadDeadCount=0; alive = listManager.threadCheck(Global.trashCounterThreadId); if (!alive) { trashDeadCount++; - QMessageBox.information(this, tr("A thread his died."), ("It appears as the trash counter thread has died. I recommend "+ - "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + if (trashDeadCount > MAX && !disableTrashThreadCheck) { + QMessageBox.information(this, tr("A thread his died."), ("It appears as the trash counter thread has died. I recommend "+ + "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + disableTrashThreadCheck = true; + } } else trashDeadCount = 0; alive = listManager.threadCheck(Global.saveThreadId); if (!alive) { saveThreadDeadCount++; - QMessageBox.information(this, tr("A thread his died."), tr("It appears as the note saver thread has died. I recommend "+ - "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + if (saveThreadDeadCount > MAX && !disableSaveThreadCheck) { + QMessageBox.information(this, tr("A thread his died."), tr("It appears as the note saver thread has died. I recommend "+ + "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + disableSaveThreadCheck = true; + } } else saveThreadDeadCount=0; if (!syncThread.isAlive()) { syncThreadDeadCount++; - QMessageBox.information(this, tr("A thread his died."), tr("It appears as the synchronization thread has died. I recommend "+ - "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + if (syncThreadDeadCount > MAX && !disableSyncThreadCheck) { + QMessageBox.information(this, tr("A thread his died."), tr("It appears as the synchronization thread has died. I recommend "+ + "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + disableSyncThreadCheck = true; + } } else syncThreadDeadCount=0; if (!indexThread.isAlive()) { indexThreadDeadCount++; - QMessageBox.information(this, tr("A thread his died."), tr("It appears as the index thread has died. I recommend "+ - "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + if (indexThreadDeadCount > MAX && !disableIndexThreadCheck) { + QMessageBox.information(this, tr("A thread his died."), tr("It appears as the index thread has died. I recommend "+ + "checking stopping NeverNote, saving the logs for later viewing, and restarting. Sorry.")); + disableIndexThreadCheck = true; + } } else indexThreadDeadCount=0; @@ -4607,8 +5392,9 @@ public class NeverNote extends QMainWindow{ } private void thumbnailTimer() { - if (Global.enableThumbnails()) + if (Global.enableThumbnails() && !syncRunning && indexRunner.idle) { thumbnailRunner.addWork("SCAN"); + } } //************************************************** @@ -4622,13 +5408,18 @@ public class NeverNote extends QMainWindow{ fd.setWindowTitle(tr("Backup Database")); fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptSave); - fd.setDirectory(System.getProperty("user.home")); + if (saveLastPath == null || saveLastPath.equals("")) + fd.setDirectory(System.getProperty("user.home")); + else + fd.setDirectory(saveLastPath); if (fd.exec() == 0 || fd.selectedFiles().size() == 0) { return; } waitCursor(true); + saveLastPath = fd.selectedFiles().get(0); + saveLastPath = saveLastPath.substring(0,saveLastPath.lastIndexOf("/")); setMessage(tr("Backing up database")); saveNote(); // conn.backupDatabase(Global.getUpdateSequenceNumber(), Global.getSequenceDate()); @@ -4663,13 +5454,19 @@ public class NeverNote extends QMainWindow{ fd.setWindowTitle(tr("Restore Database")); fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptOpen); - fd.setDirectory(System.getProperty("user.home")); + if (saveLastPath == null || saveLastPath.equals("")) + fd.setDirectory(System.getProperty("user.home")); + else + fd.setDirectory(saveLastPath); if (fd.exec() == 0 || fd.selectedFiles().size() == 0) { return; } waitCursor(true); + saveLastPath = fd.selectedFiles().get(0); + saveLastPath = saveLastPath.substring(0,saveLastPath.lastIndexOf("/")); + setMessage(tr("Restoring database")); ImportData noteReader = new ImportData(conn, true); noteReader.importData(fd.selectedFiles().get(0)); @@ -4728,7 +5525,10 @@ public class NeverNote extends QMainWindow{ fd.setWindowTitle(tr("Import Notes")); fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptOpen); - fd.setDirectory(System.getProperty("user.home")); + if (saveLastPath == null || saveLastPath.equals("")) + fd.setDirectory(System.getProperty("user.home")); + else + fd.setDirectory(saveLastPath); if (fd.exec() == 0 || fd.selectedFiles().size() == 0) { return; } @@ -4743,6 +5543,7 @@ public class NeverNote extends QMainWindow{ ImportData noteReader = new ImportData(conn, false); String fileName = fd.selectedFiles().get(0); +// saveLastPath.substring(0,fileName.lastIndexOf("/")); if (!fileName.endsWith(".nnex")) fileName = fileName +".nnex";