X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=src%2Fcx%2Ffbn%2Fnevernote%2FNeverNote.java;h=128040832fcf547108066b44cc8452bfe33cb04c;hb=a2374669b35e3f686e611278fb31c8d8fd3f3fc2;hp=ec063efd3b9fcc424f83b1360789ea8e1fe4894a;hpb=ecafa1d814186d45dcd924d90ac79be90f5709ba;p=neighbornote%2FNeighborNote.git diff --git a/src/cx/fbn/nevernote/NeverNote.java b/src/cx/fbn/nevernote/NeverNote.java index ec063ef..1280408 100644 --- a/src/cx/fbn/nevernote/NeverNote.java +++ b/src/cx/fbn/nevernote/NeverNote.java @@ -1,5 +1,5 @@ /* - * This file is part of NeverNote + * This file is part of NixNote * Copyright 2009 Randy Baumgarte * * This file may be licensed under the terms of of the @@ -75,6 +75,7 @@ import com.trolltech.qt.core.QFileSystemWatcher; import com.trolltech.qt.core.QIODevice; import com.trolltech.qt.core.QIODevice.OpenModeFlag; import com.trolltech.qt.core.QLocale; +import com.trolltech.qt.core.QMimeData; import com.trolltech.qt.core.QModelIndex; import com.trolltech.qt.core.QSize; import com.trolltech.qt.core.QTemporaryFile; @@ -86,16 +87,18 @@ import com.trolltech.qt.core.QUrl; import com.trolltech.qt.core.Qt; import com.trolltech.qt.core.Qt.BGMode; import com.trolltech.qt.core.Qt.ItemDataRole; +import com.trolltech.qt.core.Qt.KeyboardModifier; +import com.trolltech.qt.core.Qt.MouseButton; import com.trolltech.qt.core.Qt.SortOrder; import com.trolltech.qt.core.Qt.WidgetAttribute; import com.trolltech.qt.gui.QAbstractItemView; import com.trolltech.qt.gui.QAbstractItemView.ScrollHint; import com.trolltech.qt.gui.QAction; import com.trolltech.qt.gui.QApplication; +import com.trolltech.qt.gui.QClipboard; 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; @@ -106,8 +109,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; @@ -117,6 +120,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; @@ -143,6 +147,7 @@ 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; @@ -151,11 +156,15 @@ 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.SharedNotebookSyncError; import cx.fbn.nevernote.dialog.StackNotebook; +import cx.fbn.nevernote.dialog.SynchronizationRequiredWarning; import cx.fbn.nevernote.dialog.TagEdit; +import cx.fbn.nevernote.dialog.TagMerge; import cx.fbn.nevernote.dialog.ThumbnailViewer; import cx.fbn.nevernote.dialog.UpgradeAvailableDialog; import cx.fbn.nevernote.dialog.WatchFolder; +import cx.fbn.nevernote.evernote.NoteMetadata; import cx.fbn.nevernote.filters.FilterEditorNotebooks; import cx.fbn.nevernote.filters.FilterEditorTags; import cx.fbn.nevernote.gui.AttributeTreeWidget; @@ -165,6 +174,7 @@ import cx.fbn.nevernote.gui.ExternalBrowse; import cx.fbn.nevernote.gui.MainMenuBar; import cx.fbn.nevernote.gui.NotebookTreeWidget; import cx.fbn.nevernote.gui.SavedSearchTreeWidget; +import cx.fbn.nevernote.gui.SearchPanel; import cx.fbn.nevernote.gui.TableView; import cx.fbn.nevernote.gui.TagTreeWidget; import cx.fbn.nevernote.gui.Thumbnailer; @@ -212,6 +222,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 @@ -280,6 +291,8 @@ public class NeverNote extends QMainWindow{ QSpinBox zoomSpinner; // Zoom zoom QAction searchClearButton; // Clear the search field + SearchPanel searchLayout; // Widget to hold search field, zoom, & quota + QSplitter mainLeftRightSplitter; // main splitter for left/right side QSplitter leftSplitter1; // first left hand splitter QSplitter browserIndexSplitter; // splitter between note index & note text @@ -325,7 +338,9 @@ public class NeverNote extends QMainWindow{ 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. + private QTimer blockTimer; + BrowserWindow blockingWindow; String iconPath = new String("classpath:cx/fbn/nevernote/icons/"); @@ -341,14 +356,14 @@ public class NeverNote extends QMainWindow{ conn = dbConn; if (conn.getConnection() == null) { 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.")); + "is accessing the database or NixNote is already running.\n\n" + + "Please end any other process or shutdown the other NixNote before starting.\n\nExiting program.")); QMessageBox.critical(null, tr("Database Connection Error") ,msg); System.exit(16); } - - thread().setPriority(Thread.MAX_PRIORITY); + setObjectName("mainWindow"); +// thread().setPriority(Thread.MAX_PRIORITY); logger = new ApplicationLogger("nevernote.log"); logger.log(logger.HIGH, "Starting Application"); @@ -377,7 +392,7 @@ public class NeverNote extends QMainWindow{ QApplication.setStyle(Global.getStyle()); if (Global.useStandardPalette()) QApplication.setPalette(QApplication.style().standardPalette()); - setWindowTitle("NeverNote"); + setWindowTitle(tr("NixNote")); mainLeftRightSplitter = new QSplitter(); setCentralWidget(mainLeftRightSplitter); @@ -388,9 +403,9 @@ public class NeverNote extends QMainWindow{ browserIndexSplitter.setOrientation(Qt.Orientation.Vertical); //* Setup threads & thread timers - int indexRunnerCount = Global.getIndexThreads(); - indexRunnerCount = 1; - QThreadPool.globalInstance().setMaxThreadCount(indexRunnerCount+5); // increase max thread count +// int indexRunnerCount = Global.getIndexThreads(); +// indexRunnerCount = 1; + QThreadPool.globalInstance().setMaxThreadCount(Global.threadCount); // increase max thread count logger.log(logger.EXTREME, "Building list manager"); listManager = new ListManager(conn, logger); @@ -401,6 +416,10 @@ public class NeverNote extends QMainWindow{ Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); indexThread = new QThread(indexRunner, "Index Thread"); indexRunner.indexAttachmentsLocally = Global.indexAttachmentsLocally(); + indexRunner.indexImageRecognition = Global.indexImageRecognition(); + indexRunner.indexNoteBody = Global.indexNoteBody(); + indexRunner.indexNoteTitle = Global.indexNoteTitle(); + indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters(); indexThread.start(); synchronizeAnimationTimer = new QTimer(); @@ -481,15 +500,40 @@ public class NeverNote extends QMainWindow{ tagTree = new TagTreeWidget(conn); savedSearchTree = new SavedSearchTreeWidget(); trashTree = new TrashTreeWidget(); - noteTableView = new TableView(logger, listManager); + noteTableView = new TableView(logger, listManager); + + searchField = new QComboBox(); + searchField.setObjectName("searchField"); + //setStyleSheet("QComboBox#searchField { background-color: yellow }"); + searchField.setEditable(true); + 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(); + // Setup the zoom + zoomSpinner = new QSpinBox(); + zoomSpinner.setMinimum(10); + zoomSpinner.setMaximum(1000); + zoomSpinner.setAccelerated(true); + zoomSpinner.setSingleStep(10); + zoomSpinner.setValue(100); + zoomSpinner.valueChanged.connect(this, "zoomChanged()"); + + searchLayout = new SearchPanel(searchField, quotaBar, notebookTree, zoomSpinner); + QGridLayout leftGrid = new QGridLayout(); + leftSplitter1.setContentsMargins(5, 0, 0, 7); leftSplitter1.setLayout(leftGrid); - leftGrid.addWidget(notebookTree, 1, 1); + leftGrid.addWidget(searchLayout,1,1); leftGrid.addWidget(tagTree,2,1); leftGrid.addWidget(attributeTree,3,1); leftGrid.addWidget(savedSearchTree,4,1); - leftGrid.addWidget(trashTree, 5, 1); + leftGrid.addWidget(trashTree,5, 1); // Setup the browser window noteCache = new HashMap(); @@ -507,14 +551,6 @@ public class NeverNote extends QMainWindow{ mainLeftRightSplitter.addWidget(noteTableView); mainLeftRightSplitter.addWidget(browserWindow); } - - searchField = new QComboBox(); - searchField.setEditable(true); - searchField.activatedIndex.connect(this, "searchFieldChanged()"); - searchField.setDuplicatesEnabled(false); - searchField.editTextChanged.connect(this,"searchFieldTextChanged(String)"); - - quotaBar = new QuotaProgressBar(); // Setup the thumbnail viewer thumbnailViewer = new ThumbnailViewer(); @@ -541,13 +577,20 @@ public class NeverNote extends QMainWindow{ emitLog = new ArrayList(); tagTree.setDeleteAction(menuBar.tagDeleteAction); + tagTree.setMergeAction(menuBar.tagMergeAction); tagTree.setEditAction(menuBar.tagEditAction); tagTree.setAddAction(menuBar.tagAddAction); tagTree.setIconAction(menuBar.tagIconAction); tagTree.setVisible(Global.isWindowVisible("tagTree")); + leftSplitter1.setVisible(Global.isWindowVisible("leftPanel")); tagTree.noteSignal.tagsAdded.connect(this, "tagsAdded(String, String)"); menuBar.hideTags.setChecked(Global.isWindowVisible("tagTree")); listManager.tagSignal.listChanged.connect(this, "reloadTagTree()"); + + if (!Global.isWindowVisible("zoom")) { + searchLayout.hideZoom(); + menuBar.hideZoom.setChecked(false); + } notebookTree.setDeleteAction(menuBar.notebookDeleteAction); notebookTree.setEditAction(menuBar.notebookEditAction); @@ -576,9 +619,9 @@ public class NeverNote extends QMainWindow{ noteTableView.setNoteDuplicateAction(menuBar.noteDuplicateAction); noteTableView.setNoteHistoryAction(menuBar.noteOnlineHistoryAction); noteTableView.noteSignal.titleColorChanged.connect(this, "titleColorChanged(Integer)"); + noteTableView.noteSignal.notePinned.connect(this, "notePinned()"); noteTableView.setMergeNotesAction(menuBar.noteMergeAction); - noteTableView.rowChanged.connect(this, "scrollToGuid(String)"); - noteTableView.resetViewport.connect(this, "scrollToCurrentGuid()"); + noteTableView.setCopyAsUrlAction(menuBar.noteCopyAsUrlAction); noteTableView.doubleClicked.connect(this, "listDoubleClick()"); listManager.trashSignal.countChanged.connect(trashTree, "updateCounts(Integer)"); @@ -602,6 +645,15 @@ public class NeverNote extends QMainWindow{ menuBar.hideLeftSide.setChecked(true); if (Global.isWindowVisible("noteInformation")) toggleNoteInformation(); + quotaBar.setVisible(Global.isWindowVisible("quota")); + if (!quotaBar.isVisible()) + menuBar.hideQuota.setChecked(false); + searchField.setVisible(Global.isWindowVisible("searchField")); + if (!searchField.isVisible()) + menuBar.hideSearch.setChecked(false); + + if (searchField.isHidden() && quotaBar.isHidden() && zoomSpinner.isHidden() && notebookTree.isHidden()) + searchLayout.hide(); setMenuBar(menuBar); setupToolBar(); @@ -609,9 +661,9 @@ public class NeverNote extends QMainWindow{ find.getOkButton().clicked.connect(this, "doFindText()"); // Setup the tray icon menu bar - trayShowAction = new QAction("Show/Hide", this); - trayExitAction = new QAction("Exit", this); - trayAddNoteAction = new QAction("Add Note", this); + trayShowAction = new QAction(tr("Show/Hide"), this); + trayExitAction = new QAction(tr("Exit"), this); + trayAddNoteAction = new QAction(tr("Add Note"), this); trayExitAction.triggered.connect(this, "closeNeverNote()"); trayAddNoteAction.triggered.connect(this, "addNote()"); @@ -624,7 +676,7 @@ public class NeverNote extends QMainWindow{ trayIcon = new QSystemTrayIcon(this); - trayIcon.setToolTip("NeverNote"); + trayIcon.setToolTip(tr("NixNote")); trayIcon.setContextMenu(trayMenu); trayIcon.activated.connect(this, "trayActivated(com.trolltech.qt.gui.QSystemTrayIcon$ActivationReason)"); @@ -706,9 +758,18 @@ 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.proxyModel.blocked = true; noteTableView.sortByColumn(sortCol, SortOrder.resolve(sortOrder)); + noteTableView.proxyModel.blocked = false; + noteTableView.proxyModel.sortChanged.connect(this, "tableSortOrderChanged(Integer,Integer)"); + if (Global.checkVersionUpgrade()) checkForUpdates(); } @@ -770,9 +831,14 @@ public class NeverNote extends QMainWindow{ ApplicationLogger logger = new ApplicationLogger("nevernote-database.log"); File f = Global.getFileManager().getDbDirFile(Global.databaseName + ".h2.db"); - boolean dbExists = f.exists(); - if (!dbExists) + File fr = Global.getFileManager().getDbDirFile(Global.resourceDatabaseName + ".h2.db"); + File fi = Global.getFileManager().getDbDirFile(Global.resourceDatabaseName + ".h2.db"); + if (!f.exists()) Global.setDatabaseUrl(""); + if (!fr.exists()) + Global.setResourceDatabaseUrl(""); + if (!fi.exists()) + Global.setIndexDatabaseUrl(""); if (Global.getDatabaseUrl().toUpperCase().indexOf("CIPHER=") > -1) { boolean goodCheck = false; @@ -795,17 +861,26 @@ public class NeverNote extends QMainWindow{ // Encrypt the database upon shutdown private void encryptOnShutdown() { String dbPath= Global.getFileManager().getDbDirPath(""); - String dbName = "NeverNote"; try { + Statement st = conn.getConnection().createStatement(); st.execute("shutdown"); + st = conn.getResourceConnection().createStatement(); + st.execute("shutdown"); + st = conn.getIndexConnection().createStatement(); + st.execute("shutdown"); 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); + ChangeFileEncryption.execute(dbPath, "NeverNote", encryptCipher, null, Global.cipherPassword.toCharArray(), true); + ChangeFileEncryption.execute(dbPath, "Resources", encryptCipher, null, Global.cipherPassword.toCharArray(), true); + ChangeFileEncryption.execute(dbPath, "Index", encryptCipher, null, Global.cipherPassword.toCharArray(), true); Global.setDatabaseUrl(Global.getDatabaseUrl() + ";CIPHER="+encryptCipher); - QMessageBox.information(this, "Encryption Complete", "Encryption is complete"); + Global.setResourceDatabaseUrl(Global.getResourceDatabaseUrl() + ";CIPHER="+encryptCipher); + Global.setIndexDatabaseUrl(Global.getIndexDatabaseUrl() + ";CIPHER="+encryptCipher); + + QMessageBox.information(this, tr("Encryption Complete"), tr("Encryption is complete")); } } catch (SQLException e) { e.printStackTrace(); @@ -830,6 +905,8 @@ public class NeverNote extends QMainWindow{ ChangeFileEncryption.execute(dbPath, dbName, encryptCipher, Global.cipherPassword.toCharArray(), null, true); Global.setDatabaseUrl(""); + Global.setResourceDatabaseUrl(""); + Global.setIndexDatabaseUrl(""); QMessageBox.information(this, tr("Decryption Complete"), tr("Decryption is complete")); } } catch (SQLException e) { @@ -860,7 +937,7 @@ public class NeverNote extends QMainWindow{ } } else { DBEncryptDialog dialog = new DBEncryptDialog(); - dialog.setWindowTitle("Database Decryption"); + dialog.setWindowTitle(tr("Database Decryption")); dialog.hideEncryption(); dialog.exec(); if (dialog.okPressed()) { @@ -921,17 +998,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(); @@ -984,14 +1061,20 @@ public class NeverNote extends QMainWindow{ } 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) { @@ -1016,11 +1099,25 @@ public class NeverNote extends QMainWindow{ } 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) { @@ -1031,6 +1128,7 @@ public class NeverNote extends QMainWindow{ while (QApplication.overrideCursor() != null) QApplication.restoreOverrideCursor(); } + listManager.refreshCounters(); } private void setupIndexListeners() { @@ -1078,10 +1176,22 @@ public class NeverNote extends QMainWindow{ browser.noteSignal.geoChanged.connect(listManager, "updateNoteGeoTag(String, Double,Double,Double)"); browser.noteSignal.geoChanged.connect(this, "setNoteDirty()"); browser.noteSignal.sourceUrlChanged.connect(listManager, "updateNoteSourceUrl(String, String)"); + browser.blockApplication.connect(this, "blockApplication(BrowserWindow)"); + browser.unblockApplication.connect(this, "unblockApplication()"); if (master) browser.focusLost.connect(this, "saveNote()"); browser.resourceSignal.contentChanged.connect(this, "externalFileEdited(String)"); + browser.evernoteLinkClicked.connect(this, "evernoteLinkClick(String, 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 @@ -1102,6 +1212,10 @@ public class NeverNote extends QMainWindow{ settings.exec(); indexRunner.indexAttachmentsLocally = Global.indexAttachmentsLocally(); + indexRunner.indexNoteBody = Global.indexNoteBody(); + indexRunner.indexNoteTitle = Global.indexNoteTitle(); + indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters(); + indexRunner.indexImageRecognition = Global.indexImageRecognition(); if (Global.showTrayIcon()) trayIcon.show(); else @@ -1116,21 +1230,29 @@ public class NeverNote extends QMainWindow{ else saveTimer.stop(); - // This is a hack to force a reload of the index in case the date or time changed. -// if (!dateFormat.equals(Global.getDateFormat()) || -// !timeFormat.equals(Global.getTimeFormat())) { - noteCache.clear(); - readOnlyCache.clear(); - inkNoteCache.clear(); - noteIndexUpdated(true); -// } + // Set special reloads + if (settings.getDebugPage().reloadSharedNotebooksClicked()) { + conn.executeSql("Delete from LinkedNotebook"); + conn.executeSql("delete from SharedNotebook"); + conn.executeSql("Delete from Notebook where linked=true"); + conn.executeSql("Insert into Sync (key, value) values ('FullLinkedNotebookSync', 'true')"); + conn.executeSql("Insert into Sync (key, value) values ('FullSharedNotebookSync', 'true')"); + } + + // Reload user data + noteCache.clear(); + readOnlyCache.clear(); + inkNoteCache.clear(); + noteIndexUpdated(true); + logger.log(logger.HIGH, "Leaving NeverNote.settings"); } // Restore things to the way they were private void restoreWindowState(boolean mainWindow) { // We need to name things or this doesn't work. setObjectName("NeverNote"); + restoreState(Global.restoreState(objectName())); mainLeftRightSplitter.setObjectName("mainLeftRightSplitter"); browserIndexSplitter.setObjectName("browserIndexSplitter"); leftSplitter1.setObjectName("leftSplitter1"); @@ -1149,16 +1271,19 @@ public class NeverNote extends QMainWindow{ Global.saveState(mainLeftRightSplitter.objectName(), mainLeftRightSplitter.saveState()); Global.saveState(browserIndexSplitter.objectName(), browserIndexSplitter.saveState()); Global.saveState(leftSplitter1.objectName(), leftSplitter1.saveState()); + Global.saveState(objectName(), saveState()); } // Load the style sheet private void loadStyleSheet() { + String styleSheetName = "default.qss"; + if (Global.getStyle().equalsIgnoreCase("cleanlooks")) + styleSheetName = "default-cleanlooks.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"); + fileName = Global.getFileManager().getQssDirPath(styleSheetName); file = new QFile(fileName); } file.open(OpenModeFlag.ReadOnly); @@ -1190,6 +1315,8 @@ public class NeverNote extends QMainWindow{ Global.setColumnPosition("noteTableGuidPosition", position); position = noteTableView.header.visualIndex(Global.noteTableThumbnailPosition); Global.setColumnPosition("noteTableThumbnailPosition", position); + position = noteTableView.header.visualIndex(Global.noteTablePinnedPosition); + Global.setColumnPosition("noteTablePinnedPosition", position); } // Save column widths for the next time @@ -1221,6 +1348,32 @@ public class NeverNote extends QMainWindow{ Global.setColumnWidth("noteTableGuidPosition", width); } + @SuppressWarnings("unused") + private void toggleSearchWindow() { + logger.log(logger.HIGH, "Entering NeverNote.toggleSearchWindow"); + searchLayout.toggleSearchField(); + menuBar.hideSearch.setChecked(searchField.isVisible()); + Global.saveWindowVisible("searchField", searchField.isVisible()); + logger.log(logger.HIGH, "Leaving NeverNote.toggleSearchWindow"); + } + @SuppressWarnings("unused") + private void toggleQuotaWindow() { + logger.log(logger.HIGH, "Entering NeverNote.toggleQuotaWindow"); + searchLayout.toggleQuotaBar(); + menuBar.hideQuota.setChecked(quotaBar.isVisible()); + Global.saveWindowVisible("quota", quotaBar.isVisible()); + logger.log(logger.HIGH, "Leaving NeverNote.toggleQuotaWindow"); + } + @SuppressWarnings("unused") + private void toggleZoomWindow() { + logger.log(logger.HIGH, "Entering NeverNote.toggleZoomWindow"); + searchLayout.toggleZoom(); + menuBar.hideZoom.setChecked(zoomSpinner.isVisible()); + Global.saveWindowVisible("zoom", zoomSpinner.isVisible()); + logger.log(logger.HIGH, "Leaving NeverNote.toggleZoomWindow"); + } + + //*************************************************************** //*************************************************************** @@ -1238,7 +1391,8 @@ public class NeverNote extends QMainWindow{ // Listener when a notebook is selected private void notebookTreeSelection() { logger.log(logger.HIGH, "Entering NeverNote.notebookTreeSelection"); - + noteTableView.proxyModel.blocked = true; + clearTrashFilter(); clearAttributeFilter(); clearSavedSearchFilter(); @@ -1288,6 +1442,21 @@ public class NeverNote extends QMainWindow{ listManager.setSelectedNotebooks(selectedNotebookGUIDs); listManager.loadNotesIndex(); noteIndexUpdated(false); + refreshEvernoteNote(true); + listManager.refreshCounters = true; + listManager.refreshCounters(); + if (selectedNotebookGUIDs.size() == 1) { + int col = conn.getNotebookTable().getSortColumn(selectedNotebookGUIDs.get(0)); + int order = conn.getNotebookTable().getSortOrder(selectedNotebookGUIDs.get(0)); + if (col != -1) { + noteTableView.proxyModel.blocked = true; + if (order == 1) + noteTableView.sortByColumn(col, Qt.SortOrder.DescendingOrder); + else + noteTableView.sortByColumn(col, Qt.SortOrder.AscendingOrder); + } + } + noteTableView.proxyModel.blocked = false; logger.log(logger.HIGH, "Leaving NeverNote.notebookTreeSelection"); } @@ -1330,17 +1499,17 @@ public class NeverNote extends QMainWindow{ if (!found) selectedNotebookGUIDs.remove(i); } + listManager.refreshCounters = true; + listManager.refreshCounters(); notebookTree.blockSignals(false); logger.log(logger.HIGH, "Leaving NeverNote.notebookIndexUpdated"); } // Show/Hide note information + @SuppressWarnings("unused") private void toggleNotebookWindow() { logger.log(logger.HIGH, "Entering NeverNote.toggleNotebookWindow"); - if (notebookTree.isVisible()) - notebookTree.hide(); - else - notebookTree.show(); + searchLayout.toggleNotebook(); menuBar.hideNotebooks.setChecked(notebookTree.isVisible()); Global.saveWindowVisible("notebookTree", notebookTree.isVisible()); logger.log(logger.HIGH, "Leaving NeverNote.toggleNotebookWindow"); @@ -1840,6 +2009,14 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Inside NeverNote.addTag"); TagEdit edit = new TagEdit(); edit.setTagList(listManager.getTagIndex()); + + List selections = tagTree.selectedItems(); + QTreeWidgetItem currentSelection = null; + if (selections.size() > 0) { + currentSelection = selections.get(0); + edit.setParentTag(currentSelection.text(0)); + } + edit.exec(); if (!edit.okPressed()) @@ -1853,6 +2030,11 @@ public class NeverNote extends QMainWindow{ newTag.setUpdateSequenceNum(0); newTag.setGuid(randint); newTag.setName(edit.getTag()); + if (edit.getParentTag().isChecked()) { + newTag.setParentGuid(currentSelection.text(2)); + newTag.setParentGuidIsSet(true); + currentSelection.setExpanded(true); + } conn.getTagTable().addTag(newTag, true); listManager.getTagIndex().add(newTag); reloadTagTree(true); @@ -1867,13 +2049,15 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Entering NeverNote.reloadTagTree"); tagIndexUpdated(reload); boolean filter = false; - listManager.countTagResults(listManager.getNoteIndex()); + if (reload) + listManager.countTagResults(listManager.getNoteIndex()); if (notebookTree.selectedItems().size() > 0 && !notebookTree.selectedItems().get(0).text(0).equalsIgnoreCase("All Notebooks")) filter = true; if (tagTree.selectedItems().size() > 0) filter = true; tagTree.showAllTags(!filter); + tagIndexUpdated(false); logger.log(logger.HIGH, "Leaving NeverNote.reloadTagTree"); } // Edit an existing tag @@ -1987,9 +2171,16 @@ public class NeverNote extends QMainWindow{ menuBar.tagDeleteAction.setEnabled(false); menuBar.tagIconAction.setEnabled(true); } + if (selections.size() > 1) + menuBar.tagMergeAction.setEnabled(true); + else + menuBar.tagMergeAction.setEnabled(false); listManager.setSelectedTags(selectedTagGUIDs); listManager.loadNotesIndex(); noteIndexUpdated(false); + refreshEvernoteNote(true); + listManager.refreshCounters = true; + listManager.refreshCounters(); logger.log(logger.HIGH, "Leaving NeverNote.tagTreeSelection"); } // trigger the tag index to be refreshed @@ -2009,6 +2200,7 @@ public class NeverNote extends QMainWindow{ 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) @@ -2020,6 +2212,7 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Leaving NeverNote.tagIndexUpdated"); } // Show/Hide note information + @SuppressWarnings("unused") private void toggleTagWindow() { logger.log(logger.HIGH, "Entering NeverNote.toggleTagWindow"); if (tagTree.isVisible()) @@ -2128,6 +2321,7 @@ public class NeverNote extends QMainWindow{ tagTree.clearSelection(); menuBar.noteRestoreAction.setVisible(false); menuBar.tagEditAction.setEnabled(false); + menuBar.tagMergeAction.setEnabled(false); menuBar.tagDeleteAction.setEnabled(false); menuBar.tagIconAction.setEnabled(false); selectedTagGUIDs.clear(); @@ -2166,7 +2360,37 @@ public class NeverNote extends QMainWindow{ } } + // Merge tags + @SuppressWarnings("unused") + private void mergeTags() { + List tags = new ArrayList(); + List selections = tagTree.selectedItems(); + for (int i=0; i noteGuids = conn.getNoteTable().noteTagsTable.getTagNotes(tags.get(i).getGuid()); + for (int j=0; j
NeverNote

Version ") + tr("About NixNote"), + tr("

NixNote


Version ") +Global.version +tr("
Evernote" +"An Open Source Evernote Client.

" @@ -2507,7 +2725,9 @@ public class NeverNote extends QMainWindow{ +"JTidy is copyrighted under the World Wide Web Consortium
" +"Apache Common Utilities licensed under the Apache License Version 2.0
" +"Jazzy is licened under the LGPL
" - +"Java is a registered trademark of Oracle Corporation.

")); + +"Java is a registered trademark of Oracle Corporation.

" + +"Special thanks to:
BitRock InstallBuilder for the Windows installer" + +"
CodeCogs (www.codecogs.com) for the LaTeX image rendering.")); logger.log(logger.HIGH, "Leaving NeverNote.about"); } // Hide the entire left hand side @@ -2518,16 +2738,10 @@ public class NeverNote extends QMainWindow{ hidden = !menuBar.hideLeftSide.isChecked(); menuBar.hideLeftSide.setChecked(!hidden); - if (notebookTree.isVisible() != hidden) - toggleNotebookWindow(); - if (savedSearchTree.isVisible() != hidden) - toggleSavedSearchWindow(); - if (tagTree.isVisible() != hidden) - toggleTagWindow(); - if (attributeTree.isVisible() != hidden) - toggleAttributesWindow(); - if (trashTree.isVisible() != hidden) - toggleTrashWindow(); + if (!hidden) + leftSplitter1.setHidden(true); + else + leftSplitter1.setHidden(false); Global.saveWindowVisible("leftPanel", hidden); @@ -2589,8 +2803,10 @@ public class NeverNote extends QMainWindow{ } - if (Global.version.equals(version)) - return; + for (String validVersion : Global.validVersions) { + if (version.equals(validVersion)) + return; + } UpgradeAvailableDialog dialog = new UpgradeAvailableDialog(); dialog.exec(); @@ -2605,7 +2821,12 @@ public class NeverNote extends QMainWindow{ //*************************************************************** //** 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(); @@ -2626,8 +2847,9 @@ public class NeverNote extends QMainWindow{ currentNote = listManager.getNoteIndex().get(0); currentNoteGuid = currentNote.getGuid(); } + refreshEvernoteNote(true); if (currentNote != null) - loadNoteBrowserInformation(browserWindow); + loadNoteBrowserInformation(browserWindow, currentNoteGuid, currentNote); } // text in the search bar changed. We only use this to tell if it was cleared, // otherwise we trigger off searchFieldChanged. @@ -2650,6 +2872,7 @@ public class NeverNote extends QMainWindow{ listManager.loadNotesIndex(); refreshEvernoteNote(true); noteIndexUpdated(false); + refreshEvernoteNote(true); } searchPerformed = false; } @@ -2665,7 +2888,6 @@ public class NeverNote extends QMainWindow{ String text = searchField.currentText(); listManager.setEnSearch(text.trim()); listManager.loadNotesIndex(); -//--->>> noteIndexUpdated(true); noteIndexUpdated(false); refreshEvernoteNote(true); searchPerformed = true; @@ -2676,117 +2898,115 @@ public class NeverNote extends QMainWindow{ private void setupToolBar() { logger.log(logger.HIGH, "Entering NeverNote.setupToolBar"); toolBar = addToolBar(tr("Tool Bar")); + toolBar.setObjectName("toolBar"); menuBar.setupToolBarVisible(); if (!Global.isWindowVisible("toolBar")) toolBar.setVisible(false); else toolBar.setVisible(true); - prevButton = toolBar.addAction("Previous"); +// toolBar.addWidget(menuBar); +// menuBar.setSizePolicy(Policy.Minimum, Policy.Minimum); +// toolBar.addSeparator(); + prevButton = toolBar.addAction(tr("Previous")); QIcon prevIcon = new QIcon(iconPath+"back.png"); prevButton.setIcon(prevIcon); prevButton.triggered.connect(this, "previousViewedAction()"); togglePrevArrowButton(Global.isToolbarButtonVisible("prevArrow")); - nextButton = toolBar.addAction("Next"); + nextButton = toolBar.addAction(tr("Next")); QIcon nextIcon = new QIcon(iconPath+"forward.png"); nextButton.setIcon(nextIcon); nextButton.triggered.connect(this, "nextViewedAction()"); toggleNextArrowButton(Global.isToolbarButtonVisible("nextArrow")); - upButton = toolBar.addAction("Up"); + upButton = toolBar.addAction(tr("Up")); QIcon upIcon = new QIcon(iconPath+"up.png"); upButton.setIcon(upIcon); upButton.triggered.connect(this, "upAction()"); toggleUpArrowButton(Global.isToolbarButtonVisible("upArrow")); - downButton = toolBar.addAction("Down"); + downButton = toolBar.addAction(tr("Down")); QIcon downIcon = new QIcon(iconPath+"down.png"); downButton.setIcon(downIcon); downButton.triggered.connect(this, "downAction()"); toggleDownArrowButton(Global.isToolbarButtonVisible("downArrow")); - synchronizeButton = toolBar.addAction("Synchronize"); + synchronizeButton = toolBar.addAction(tr("Synchronize")); synchronizeButton.setIcon(new QIcon(iconPath+"synchronize.png")); synchronizeIconAngle = 0; synchronizeButton.triggered.connect(this, "evernoteSync()"); toggleSynchronizeButton(Global.isToolbarButtonVisible("synchronize")); - printButton = toolBar.addAction("Print"); + printButton = toolBar.addAction(tr("Print")); QIcon printIcon = new QIcon(iconPath+"print.png"); printButton.setIcon(printIcon); printButton.triggered.connect(this, "printNote()"); togglePrintButton(Global.isToolbarButtonVisible("print")); - tagButton = toolBar.addAction("Tag"); + tagButton = toolBar.addAction(tr("Tag")); QIcon tagIcon = new QIcon(iconPath+"tag.png"); tagButton.setIcon(tagIcon); tagButton.triggered.connect(browserWindow, "modifyTags()"); toggleTagButton(Global.isToolbarButtonVisible("tag")); - attributeButton = toolBar.addAction("Attributes"); + attributeButton = toolBar.addAction(tr("Attributes")); QIcon attributeIcon = new QIcon(iconPath+"attribute.png"); attributeButton.setIcon(attributeIcon); attributeButton.triggered.connect(this, "toggleNoteInformation()"); toggleAttributeButton(Global.isToolbarButtonVisible("attribute")); - emailButton = toolBar.addAction("Email"); + emailButton = toolBar.addAction(tr("Email")); QIcon emailIcon = new QIcon(iconPath+"email.png"); emailButton.setIcon(emailIcon); emailButton.triggered.connect(this, "emailNote()"); toggleEmailButton(Global.isToolbarButtonVisible("email")); - deleteButton = toolBar.addAction("Delete"); + deleteButton = toolBar.addAction(tr("Delete")); QIcon deleteIcon = new QIcon(iconPath+"delete.png"); deleteButton.setIcon(deleteIcon); deleteButton.triggered.connect(this, "deleteNote()"); toggleDeleteButton(Global.isToolbarButtonVisible("delete")); - newButton = toolBar.addAction("New"); + newButton = toolBar.addAction(tr("New")); QIcon newIcon = new QIcon(iconPath+"new.png"); newButton.triggered.connect(this, "addNote()"); newButton.setIcon(newIcon); toggleNewButton(Global.isToolbarButtonVisible("new")); - allNotesButton = toolBar.addAction("All Notes"); + allNotesButton = toolBar.addAction(tr("All Notes")); QIcon allIcon = new QIcon(iconPath+"books.png"); allNotesButton.triggered.connect(this, "allNotes()"); allNotesButton.setIcon(allIcon); toggleAllNotesButton(Global.isToolbarButtonVisible("allNotes")); - toolBar.addSeparator(); - toolBar.addWidget(new QLabel(tr("Quota:"))); - toolBar.addWidget(quotaBar); + //toolBar.addSeparator(); + //toolBar.addWidget(new QLabel(tr("Quota:"))); + //toolBar.addWidget(quotaBar); //quotaBar.setSizePolicy(Policy.Minimum, Policy.Minimum); updateQuotaBar(); - toolBar.addSeparator(); + //toolBar.addSeparator(); - // Setup the zoom - zoomSpinner = new QSpinBox(); - zoomSpinner.setMinimum(10); - zoomSpinner.setMaximum(1000); - zoomSpinner.setAccelerated(true); - zoomSpinner.setSingleStep(10); - zoomSpinner.setValue(100); - zoomSpinner.valueChanged.connect(this, "zoomChanged()"); - toolBar.addWidget(new QLabel(tr("Zoom"))); - toolBar.addWidget(zoomSpinner); + //toolBar.addWidget(new QLabel(tr("Zoom"))); + //toolBar.addWidget(zoomSpinner); //toolBar.addWidget(new QLabel(" ")); - toolBar.addSeparator(); - toolBar.addWidget(new QLabel(tr(" Search:"))); - toolBar.addWidget(searchField); + //toolBar.addSeparator(); + //toolBar.addWidget(new QLabel(tr(" Search:"))); + //toolBar.addWidget(searchField); QSizePolicy sizePolicy = new QSizePolicy(); sizePolicy.setHorizontalPolicy(Policy.MinimumExpanding); - searchField.setSizePolicy(sizePolicy); - searchField.setInsertPolicy(InsertPolicy.InsertAtTop); + QLabel spacer = new QLabel(""); + spacer.setSizePolicy(sizePolicy); + toolBar.addWidget(spacer); + //searchField.setInsertPolicy(InsertPolicy.InsertAtTop); - searchClearButton = toolBar.addAction("Search Clear"); - QIcon searchClearIcon = new QIcon(iconPath+"searchclear.png"); - searchClearButton.setIcon(searchClearIcon); - searchClearButton.triggered.connect(this, "searchFieldCleared()"); - toggleSearchClearButton(Global.isToolbarButtonVisible("searchClear")); + //searchClearButton = toolBar.addAction("Search Clear"); + //QIcon searchClearIcon = new QIcon(iconPath+"searchclear.png"); + //searchClearButton.setIcon(searchClearIcon); + //searchClearButton.triggered.connect(this, "searchFieldCleared()"); + //toggleSearchClearButton(Global.isToolbarButtonVisible("searchClear")); logger.log(logger.HIGH, "Leaving NeverNote.setupToolBar"); } @@ -2906,7 +3126,8 @@ public class NeverNote extends QMainWindow{ allNotesButton.setVisible(toggle); Global.saveToolbarButtonsVisible("allNotes", toggle); } - private void toggleSearchClearButton(Boolean toggle) { + @SuppressWarnings("unused") + private void toggleSearchClearButton(Boolean toggle) { searchClearButton.setVisible(toggle); Global.saveToolbarButtonsVisible("searchClear", toggle); } @@ -2947,7 +3168,7 @@ public class NeverNote extends QMainWindow{ } // Synchronize with Evernote - @SuppressWarnings("unused") + private void evernoteSync() { logger.log(logger.HIGH, "Entering NeverNote.evernoteSync"); if (!Global.isConnected) @@ -3054,7 +3275,9 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void emptyTrash() { // browserWindow.clear(); + logger.log(logger.EXTREME, "Emptying Trash"); listManager.emptyTrash(); + logger.log(logger.EXTREME, "Resetting view after trash empty"); if (trashTree.selectedItems().size() > 0) { listManager.getSelectedNotebooks().clear(); listManager.getSelectedTags().clear(); @@ -3074,11 +3297,11 @@ public class NeverNote extends QMainWindow{ menuBar.noteRestoreAction.setVisible(false); listManager.loadNotesIndex(); -//--->>> noteIndexUpdated(true); noteIndexUpdated(false); } } // Show/Hide trash window + @SuppressWarnings("unused") private void toggleTrashWindow() { logger.log(logger.HIGH, "Entering NeverNote.toggleTrashWindow"); if (trashTree.isVisible()) @@ -3135,56 +3358,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"); @@ -3271,6 +3505,7 @@ public class NeverNote extends QMainWindow{ } // Show/Hide attribute search window + @SuppressWarnings("unused") private void toggleAttributesWindow() { logger.log(logger.HIGH, "Entering NeverNote.toggleAttributesWindow"); if (attributeTree.isVisible()) @@ -3324,7 +3559,15 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void noteTableSelection() { logger.log(logger.HIGH, "Entering NeverNote.noteTableSelection"); + saveNote(); + + // If the ctrl key is pressed, then they are selecting multiple + // entries and we don't want to change the currently viewed note. + if (QApplication.keyboardModifiers().isSet(KeyboardModifier.ControlModifier) && + QApplication.mouseButtons().isSet(MouseButton.LeftButton)) + return; + if (historyGuids.size() == 0) { historyGuids.add(currentNoteGuid); historyPosition = 1; @@ -3406,12 +3649,12 @@ public class NeverNote extends QMainWindow{ QModelIndex i = noteTableView.proxyModel.index(pos-1, Global.noteTableGuidPosition); if (i!=null) { currentNoteGuid = (String)i.data(); - noteTableView.selectRow(pos-1); } } } - showColumns(); - scrollToGuid(currentNoteGuid); + if (!noteTableView.isColumnHidden(Global.noteTableGuidPosition)) + showColumns(); + scrollToGuid(currentNoteGuid); logger.log(logger.HIGH, "Leaving NeverNote.noteIndexUpdated"); } // Called when the list of notes is updated @@ -3746,6 +3989,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) @@ -3759,7 +4003,6 @@ public class NeverNote extends QMainWindow{ } } } - if (!currentNote.isActive() && !Global.showDeleted) { for (int i=0; i selectedNotebook = notebookTree.selectedItems(); + if (selectedNotebook.size() > 0 && !selectedNotebook.get(0).text(0).equalsIgnoreCase("All Notebooks") && !selectedNotebook.get(0).text(2).equalsIgnoreCase("STACK")) { + QTreeWidgetItem currentSelectedNotebook = selectedNotebook.get(0); + String notebook; + notebook = currentSelectedNotebook.text(2); + conn.getNotebookTable().setSortOrder(notebook, column, order); + } + } - + //*************************************************************** + @SuppressWarnings("unused") + private void evernoteLinkClick(String syncGuid, String locGuid) { + String guid = null; + if (conn.getNoteTable().guidExists(syncGuid)) { + guid = syncGuid; + } else { + // If we didn't find it via the synchronized guid, look under the local guid + // Iwe don't find it there, look to see if the GUID is posted under the local GUID, but was + // later synchronized (that causes the guid to change so we need to find the new one). + if (conn.getNoteTable().guidExists(locGuid)) + guid = locGuid; + else + guid = conn.getNoteTable().findAlternateGuid(locGuid); + } + if (guid != null) { + openExternalEditor(guid); + return; + } + + //If we've gotten this far, we can't find the note + QMessageBox.information(this, tr("Note Not Found"), tr("Sorry, but I can't"+ + " seem to find that note.")); + } //*************************************************************** //*************************************************************** //** External editor window functions //*************************************************************** //*************************************************************** private void listDoubleClick() { - saveNote(); - if (externalWindows.containsKey(currentNoteGuid)) { - externalWindows.get(currentNoteGuid).raise(); + saveNote(); + openExternalEditor(currentNoteGuid); + } + private void openExternalEditor(String guid) { + + if (externalWindows.containsKey(guid)) { + externalWindows.get(guid).raise(); return; } + Note note = conn.getNoteTable().getNote(guid, true, true, false, true, true); // We have a new external editor to create QIcon appIcon = new QIcon(iconPath+"nevernote.png"); ExternalBrowse newBrowser = new ExternalBrowse(conn); newBrowser.setWindowIcon(appIcon); - externalWindows.put(currentNoteGuid, newBrowser); + externalWindows.put(guid, newBrowser); showEditorButtons(newBrowser.getBrowserWindow()); - loadNoteBrowserInformation(newBrowser.getBrowserWindow()); + loadNoteBrowserInformation(newBrowser.getBrowserWindow(), guid, note); setupBrowserWindowListeners(newBrowser.getBrowserWindow(), false); newBrowser.windowClosing.connect(this, "externalWindowClosing(String)"); newBrowser.getBrowserWindow().noteSignal.titleChanged.connect(this, "externalWindowTitleEdited(String, String)"); newBrowser.getBrowserWindow().noteSignal.tagsChanged.connect(this, "externalWindowTagsEdited(String, List)"); newBrowser.contentsChanged.connect(this, "saveNoteExternalBrowser(String, String, Boolean, BrowserWindow)"); + newBrowser.getBrowserWindow().blockApplication.connect(this, "blockApplication(BrowserWindow)"); + newBrowser.getBrowserWindow().unblockApplication.connect(this, "unblockApplication()"); browserWindow.noteSignal.tagsChanged.connect(newBrowser, "updateTags(String, List)"); browserWindow.noteSignal.titleChanged.connect(newBrowser, "updateTitle(String, String)"); @@ -3955,7 +4263,7 @@ public class NeverNote extends QMainWindow{ private void externalWindowClosing(String guid) { externalWindows.remove(guid); } - + //*************************************************************** @@ -3972,7 +4280,7 @@ public class NeverNote extends QMainWindow{ QTextCodec codec = QTextCodec.codecForName("UTF-8"); QByteArray unicode = codec.fromUnicode(browserWindow.getContent()); ExternalBrowse window = externalWindows.get(currentNoteGuid); - window.getBrowserWindow().getBrowser().setContent(unicode); + window.getBrowserWindow().setContent(unicode); } // If the note is dirty, then it is unsynchronized by default. @@ -3981,26 +4289,26 @@ public class NeverNote extends QMainWindow{ // Set the note as dirty and check if its status is synchronized in the display table noteDirty = true; - for (int i=0; i ix = listManager.getNoteTableModel().itemData(modelIndex); String tableGuid = (String)ix.values().toArray()[0]; if (tableGuid.equals(currentNoteGuid)) { - listManager.getNoteTableModel().setData(i, Global.noteTableSynchronizedPosition, "false"); + listManager.getNoteTableModel().proxyModel.setData(i, Global.noteTableSynchronizedPosition, "false"); return; } } } - */ + logger.log(logger.EXTREME, "Leaving NeverNote.setNoteDirty()"); } @SuppressWarnings("unused") @@ -4011,7 +4319,7 @@ public class NeverNote extends QMainWindow{ noteCache.put(guid, unicode.toString()); if (guid.equals(currentNoteGuid)) { noteDirty = true; - browserWindow.getBrowser().setContent(unicode); + browserWindow.setContent(unicode); } if (save) { thumbnailRunner.addWork("GENERATE "+ guid); @@ -4024,11 +4332,10 @@ public class NeverNote extends QMainWindow{ saveNote(currentNoteGuid, browserWindow); thumbnailRunner.addWork("GENERATE "+ currentNoteGuid); noteDirty = false; - } + } } private void saveNote(String guid, BrowserWindow window) { logger.log(logger.EXTREME, "Inside NeverNote.saveNote()"); - logger.log(logger.EXTREME, "Note is dirty."); waitCursor(true); logger.log(logger.EXTREME, "Saving to cache"); @@ -4063,10 +4370,10 @@ public class NeverNote extends QMainWindow{ } inkNote = false; readOnly = false; - if (Global.showDeleted) + if (Global.showDeleted || currentNoteGuid == null || currentNoteGuid.equals("")) readOnly = true; Global.cryptCounter =0; - if (currentNoteGuid.equals("")) { + if (readOnly) { browserWindow.setReadOnly(true); return; } @@ -4080,16 +4387,15 @@ public class NeverNote extends QMainWindow{ currentNote = conn.getNoteTable().getNote(currentNoteGuid, true,true,false,false,true); if (currentNote == null) return; - - loadNoteBrowserInformation(browserWindow); + loadNoteBrowserInformation(browserWindow, currentNoteGuid, currentNote); } - private void loadNoteBrowserInformation(BrowserWindow browser) { + private void loadNoteBrowserInformation(BrowserWindow browser, String guid, Note note) { NoteFormatter formatter = new NoteFormatter(logger, conn, tempFiles); - formatter.setNote(currentNote, Global.pdfPreview()); + formatter.setNote(note, Global.pdfPreview()); formatter.setHighlight(listManager.getEnSearch()); QByteArray js; - if (!noteCache.containsKey(currentNoteGuid) || conn.getNoteTable().isThumbnailNeeded(currentNoteGuid)) { + if (!noteCache.containsKey(guid)) { js = new QByteArray(); // We need to prepend the note with or encoded characters are ugly js.append(""); @@ -4098,37 +4404,46 @@ public class NeverNote extends QMainWindow{ js.append(""); js.append(""); js.append(""); - formatter.setNote(currentNote, Global.pdfPreview()); + formatter.setNote(note, Global.pdfPreview()); js.append(formatter.rebuildNoteHTML()); js.append(""); js.replace("", ""); js.replace("", ""); js.replace("", ""); - browser.getBrowser().setContent(js); - noteCache.put(currentNoteGuid, js.toString()); +// if (Global.enableHTMLEntitiesFix) { +// browser.getBrowser().setContent(new QByteArray(StringEscapeUtils.unescapeHtml(js.toString()))); +// } else + browser.setContent(js); + noteCache.put(guid, js.toString()); if (formatter.resourceError) resourceErrorMessage(); + if (formatter.formatError) { + waitCursor(false); + QMessageBox.information(this, tr("Error"), + tr("NixNote had issues formatting this note." + + " To protect your data this note is being marked as read-only.")); + waitCursor(true); + } readOnly = formatter.readOnly; inkNote = formatter.inkNote; if (readOnly) - readOnlyCache.put(currentNoteGuid, true); + readOnlyCache.put(guid, true); if (inkNote) - inkNoteCache.put(currentNoteGuid, true); + inkNoteCache.put(guid, true); } else { logger.log(logger.HIGH, "Note content is being pulled from the cache"); - String cachedContent = formatter.modifyCachedTodoTags(noteCache.get(currentNoteGuid)); + String cachedContent = formatter.modifyCachedTodoTags(noteCache.get(guid)); js = new QByteArray(cachedContent); - browser.getBrowser().setContent(js); - if (readOnlyCache.containsKey(currentNoteGuid)) + browser.setContent(js); + if (readOnlyCache.containsKey(guid)) readOnly = true; - if (inkNoteCache.containsKey(currentNoteGuid)) + if (inkNoteCache.containsKey(guid)) inkNote = true; } - if (conn.getNoteTable().isThumbnailNeeded(currentNoteGuid)) { - thumbnailHTMLReady(currentNoteGuid, js, Global.calculateThumbnailZoom(js.toString())); + if (conn.getNoteTable().isThumbnailNeeded(guid)) { + thumbnailHTMLReady(guid, js, Global.calculateThumbnailZoom(js.toString())); } - if (readOnly || inkNote) browser.getBrowser().page().setContentEditable(false); // We don't allow editing of ink notes else @@ -4138,9 +4453,10 @@ public class NeverNote extends QMainWindow{ tagButton.setEnabled(!readOnly); menuBar.noteDelete.setEnabled(!readOnly); menuBar.noteTags.setEnabled(!readOnly); - browser.setNote(currentNote); + browser.setNote(note); - if (conn.getNotebookTable().isLinked(currentNote.getNotebookGuid())) { + if (note != null && note.getNotebookGuid() != null && + conn.getNotebookTable().isLinked(note.getNotebookGuid())) { deleteButton.setEnabled(false); menuBar.notebookDeleteAction.setEnabled(false); } else { @@ -4160,32 +4476,32 @@ public class NeverNote extends QMainWindow{ nbooks.add(listManager.getNotebookIndex().get(i)); } - browser.setTitle(currentNote.getTitle()); - browser.setTag(getTagNamesForNote(currentNote)); - browser.setAuthor(currentNote.getAttributes().getAuthor()); - - browser.setAltered(currentNote.getUpdated()); - browser.setCreation(currentNote.getCreated()); - if (currentNote.getAttributes().getSubjectDate() > 0) - browser.setSubjectDate(currentNote.getAttributes().getSubjectDate()); + browser.setTitle(note.getTitle()); + browser.setTag(getTagNamesForNote(note)); + browser.setAuthor(note.getAttributes().getAuthor()); + + browser.setAltered(note.getUpdated()); + browser.setCreation(note.getCreated()); + if (note.getAttributes().getSubjectDate() > 0) + browser.setSubjectDate(note.getAttributes().getSubjectDate()); else - browser.setSubjectDate(currentNote.getCreated()); - browser.setUrl(currentNote.getAttributes().getSourceURL()); + browser.setSubjectDate(note.getCreated()); + browser.setUrl(note.getAttributes().getSourceURL()); FilterEditorTags tagFilter = new FilterEditorTags(conn, logger); - List tagList = tagFilter.getValidTags(currentNote); + List tagList = tagFilter.getValidTags(note); browser.setAllTags(tagList); - browser.setCurrentTags(currentNote.getTagNames()); + browser.setCurrentTags(note.getTagNames()); noteDirty = false; - scrollToGuid(currentNoteGuid); + scrollToGuid(guid); browser.loadingData(false); if (thumbnailViewer.isActiveWindow()) thumbnailView(); FilterEditorNotebooks notebookFilter = new FilterEditorNotebooks(conn, logger); - browser.setNotebookList(notebookFilter.getValidNotebooks(currentNote, listManager.getNotebookIndex())); + browser.setNotebookList(notebookFilter.getValidNotebooks(note, listManager.getNotebookIndex())); waitCursor(false); logger.log(logger.HIGH, "Leaving NeverNote.refreshEvernoteNote"); @@ -4280,11 +4596,23 @@ public class NeverNote extends QMainWindow{ return; if (currentNoteGuid.equals("")) return; - + String title = null; + if (selectedNoteGUIDs.size() == 1) + title = conn.getNoteTable().getNote(selectedNoteGUIDs.get(0),false,false,false,false,false).getTitle(); + // If we are deleting non-trash notes if (currentNote.isActive()) { if (Global.verifyDelete()) { - if (QMessageBox.question(this, tr("Confirmation"), tr("Delete selected note(s)?"), + String msg; + if (selectedNoteGUIDs.size() > 1) { + msg = new String(tr("Delete ") +selectedNoteGUIDs.size() +" notes?"); + } else { + if (title != null) + msg = new String(tr("Delete note \"") +title +"\"?"); + else + msg = new String(tr("Delete note selected note?")); + } + if (QMessageBox.question(this, tr("Confirmation"), msg, QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No)==StandardButton.No.value() && Global.verifyDelete() == true) { return; @@ -4298,7 +4626,16 @@ public class NeverNote extends QMainWindow{ } else { // If we are deleting from the trash. if (Global.verifyDelete()) { - if (QMessageBox.question(this, "Confirmation", "Permanently delete selected note(s)?", + String msg; + if (selectedNoteGUIDs.size() > 1) { + msg = new String(tr("Permanently delete ") +selectedNoteGUIDs.size() +" notes?"); + } else { + if (title != null) + msg = new String(tr("Permanently delete note \"") +title +"\"?"); + else + msg = new String(tr("Permanently delete note selected note?")); + } + if (QMessageBox.question(this, "Confirmation", msg, QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No)==StandardButton.No.value()) { return; @@ -4360,7 +4697,7 @@ public class NeverNote extends QMainWindow{ String notebook = null; listManager.getNotebookIndex().get(0).getGuid(); List selectedNotebook = notebookTree.selectedItems(); - if (selectedNotebook.size() > 0 && !selectedNotebook.get(0).text(0).equalsIgnoreCase("All Notebooks")) { + if (selectedNotebook.size() > 0 && !selectedNotebook.get(0).text(0).equalsIgnoreCase("All Notebooks") && !selectedNotebook.get(0).text(2).equalsIgnoreCase("STACK")) { QTreeWidgetItem currentSelectedNotebook = selectedNotebook.get(0); notebook = currentSelectedNotebook.text(2); } else { @@ -4375,7 +4712,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; @@ -4398,7 +4736,7 @@ public class NeverNote extends QMainWindow{ newNote.setUpdateSequenceNum(0); newNote.setGuid(randint); newNote.setNotebookGuid(notebook); - newNote.setTitle(""); + newNote.setTitle("Untitled Note"); newNote.setContent(noteString.toString()); newNote.setDeleted(0); newNote.setCreated(System.currentTimeMillis()); @@ -4424,12 +4762,15 @@ public class NeverNote extends QMainWindow{ } conn.getNoteTable().addNote(newNote, true); - listManager.getUnsynchronizedNotes().add(newNote.getGuid()); - listManager.addNote(newNote); + NoteMetadata metadata = new NoteMetadata(); + metadata.setGuid(newNote.getGuid()); + metadata.setDirty(true); + listManager.addNote(newNote, metadata); // noteTableView.insertRow(newNote, true, -1); currentNote = newNote; currentNoteGuid = currentNote.getGuid(); + noteTableView.clearSelection(); refreshEvernoteNote(true); listManager.countNotebookResults(listManager.getNoteIndex()); browserWindow.titleLabel.setFocus(); @@ -4439,6 +4780,7 @@ public class NeverNote extends QMainWindow{ // If the window is hidden, then we want to popup this in an external window & if (!isVisible()) listDoubleClick(); + waitCursor(false); logger.log(logger.HIGH, "Leaving NeverNote.addNote"); } // Restore a note from the trash; @@ -4474,9 +4816,8 @@ public class NeverNote extends QMainWindow{ // it from the cache. @SuppressWarnings("unused") private void invalidateNoteCache(String guid, String content) { - String v = noteCache.remove(guid); -// if (guid.equals(currentNoteGuid) && !noteDirty) - refreshEvernoteNote(true); + noteCache.remove(guid); + refreshEvernoteNote(true); } // Signal received that a note guid has changed @SuppressWarnings("unused") @@ -4508,15 +4849,15 @@ public class NeverNote extends QMainWindow{ for (int i=0; i resList = conn.getNoteTable().noteResourceTable.getNoteResources(guid, true); - oldNote.setContent(conn.getNoteTable().getNoteContentBinary(guid)); + oldNote.setContent(conn.getNoteTable().getNoteContentNoUTFConversion(guid)); oldNote.setResources(resList); duplicateNote(oldNote); } @@ -4579,11 +4920,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(); @@ -4600,13 +4967,22 @@ 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); - listManager.addNote(newNote); + + // Add note to the database conn.getNoteTable().addNote(newNote, true); - listManager.getUnsynchronizedNotes().add(newNote.getGuid()); - noteTableView.insertRow(newNote, true, -1); + NoteMetadata metaData = new NoteMetadata(); + NoteMetadata oldMeta = listManager.getNoteMetadata().get(oldNote.getGuid()); + metaData.copy(oldMeta); + metaData.setGuid(newNote.getGuid()); + listManager.addNote(newNote, metaData); + noteTableView.insertRow(newNote, metaData, true, -1); + currentNoteGuid = newNote.getGuid(); + currentNote = newNote; + refreshEvernoteNote(true); listManager.countNotebookResults(listManager.getNoteIndex()); waitCursor(false); } @@ -4623,6 +4999,7 @@ public class NeverNote extends QMainWindow{ notebookTree.selectGuid(""); } notebookTreeSelection(); + refreshEvernoteNote(true); } // Merge notes @SuppressWarnings("unused") @@ -4706,7 +5083,7 @@ public class NeverNote extends QMainWindow{ // A resource within a note has had a guid change @SuppressWarnings("unused") private void noteResourceGuidChanged(String noteGuid, String oldGuid, String newGuid) { - if (!oldGuid.equals(newGuid)) + if (oldGuid != null && !oldGuid.equals(newGuid)) Global.resourceMap.put(oldGuid, newGuid); } // View a thumbnail of the note @@ -4735,11 +5112,11 @@ public class NeverNote extends QMainWindow{ i=listManager.getMasterNoteIndex().size(); } } - msg = "An error has happened while saving the note \"" +title+ - "\".\n\nThis is probably due to a document that is too complex for Nevernote to process. "+ + msg = tr("An error has happened while saving the note \"") +title+ + tr("\".\n\nThis is probably due to a document that is too complex for NixNote to process. "+ "As a result, changes to the note may not be saved properly in the database."+ "\n\nA cached copy is being preserved so you can recover any data, but data may" + - "\nbe lost. Please review the note to recover any critical data before restarting."; + "\nbe lost. Please review the note to recover any critical data before restarting."); QMessageBox.information(this, tr("Error Saving Note"), tr(msg)); } @@ -4804,10 +5181,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; @@ -4816,7 +5193,7 @@ public class NeverNote extends QMainWindow{ return; } catch (EDAMNotFoundException e) { setMessage(tr("Note not found on server.")); - QMessageBox.information(this, "Error", "This note could not be found on Evernote's servers."); + QMessageBox.information(this, tr("Error"), tr("This note could not be found on Evernote's servers.")); return; } catch (TException e) { setMessage("EDAMTransactionException: " +e.getMessage()); @@ -4862,9 +5239,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); @@ -4912,7 +5289,9 @@ public class NeverNote extends QMainWindow{ n.getResources().get(i).setActive(true); conn.getNoteTable().noteResourceTable.saveNoteResource(n.getResources().get(i), true); } - listManager.addNote(n); + NoteMetadata metadata = new NoteMetadata(); + metadata.setGuid(n.getGuid()); + listManager.addNote(n, metadata); conn.getNoteTable().addNote(n, true); refreshEvernoteNote(true); setMessage(tr("Note has been restored.")); @@ -4925,9 +5304,9 @@ public class NeverNote extends QMainWindow{ List tags = null; List linkedNotebooks = null; try { - notebooks = syncRunner.noteStore.listNotebooks(syncRunner.authToken); - tags = syncRunner.noteStore.listTags(syncRunner.authToken); - linkedNotebooks = syncRunner.noteStore.listLinkedNotebooks(syncRunner.authToken); + 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; @@ -5060,6 +5439,7 @@ public class NeverNote extends QMainWindow{ private void resourceErrorMessage() { if (inkNote) return; + waitCursor(false); QMessageBox.information(this, tr("DOUGH!!!"), tr("Well, this is embarrassing."+ "\n\nSome attachments or images for this note appear to be missing from my database.\n"+ "In a perfect world this wouldn't happen, but it has.\n" + @@ -5072,6 +5452,7 @@ public class NeverNote extends QMainWindow{ "\n\nP.S. You might want to re-synchronize to see if it corrects this problem.\nWho knows, you might get lucky.")); inkNote = true; browserWindow.setReadOnly(true); + waitCursor(true); } @@ -5123,14 +5504,40 @@ public class NeverNote extends QMainWindow{ if (currentNote == null) { currentNote = conn.getNoteTable().getNote(currentNoteGuid, false, false, false, false, true); } - listManager.setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs()); - noteIndexUpdated(false); + listManager.refreshNoteMetadata(); + noteIndexUpdated(true); noteTableView.selectionModel().blockSignals(true); scrollToGuid(currentNoteGuid); noteTableView.selectionModel().blockSignals(false); refreshEvernoteNote(false); scrollToGuid(currentNoteGuid); waitCursor(false); + + // Check to see if there were any shared notebook errors + if (syncRunner.error && syncRunner.errorSharedNotebooks.size() > 0) { + String guid = syncRunner.errorSharedNotebooks.get(0); + String notebookGuid = conn.getLinkedNotebookTable().getLocalNotebookGuid(guid); + String localName = listManager.getNotebookNameByGuid(notebookGuid); + SharedNotebookSyncError syncDialog = new SharedNotebookSyncError(localName); + syncDialog.exec(); + if (syncDialog.okPressed()) { + if (syncDialog.doNothing.isChecked()) { + syncRunner.errorSharedNotebooksIgnored.put(guid, guid); + evernoteSync(); + } + if (syncDialog.deleteNotebook.isChecked()) { + conn.getNoteTable().expungeNotesByNotebook(notebookGuid, true, false); + conn.getNotebookTable().expungeNotebook(notebookGuid, false); + conn.getLinkedNotebookTable().expungeNotebook(guid, false); + conn.getLinkedNotebookTable().expungeNotebook(guid, false); + evernoteSync(); + } + refreshLists(); + return; + } + } + + // Finalize the synchronization if (!syncRunner.error) setMessage(tr("Synchronization Complete")); else @@ -5207,7 +5614,7 @@ public class NeverNote extends QMainWindow{ thumbnailRunner.interrupt = true; indexRunner.addWork("SCAN"); } - logger.log(logger.EXTREME, "Leaving neverNote index timer"); + logger.log(logger.EXTREME, "Leaving NixNote index timer"); } @SuppressWarnings("unused") @@ -5240,8 +5647,8 @@ public class NeverNote extends QMainWindow{ if (!alive) { tagDeadCount++; 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.")); + QMessageBox.information(this, tr("A thread has died."), tr("It appears as the tag counter thread has died. I recommend "+ + "checking stopping NixNote, saving the logs for later viewing, and restarting. Sorry.")); disableTagThreadCheck = true; } } else @@ -5251,8 +5658,8 @@ public class NeverNote extends QMainWindow{ if (!alive) { notebookThreadDeadCount++; 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.")); + QMessageBox.information(this, tr("A thread has died."), tr("It appears as the notebook counter thread has died. I recommend "+ + "checking stopping NixNote, saving the logs for later viewing, and restarting. Sorry.")); disableNotebookThreadCheck=true; } } else @@ -5262,8 +5669,8 @@ public class NeverNote extends QMainWindow{ if (!alive) { trashDeadCount++; 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.")); + QMessageBox.information(this, tr("A thread has died."), ("It appears as the trash counter thread has died. I recommend "+ + "checking stopping NixNote, saving the logs for later viewing, and restarting. Sorry.")); disableTrashThreadCheck = true; } } else @@ -5273,8 +5680,8 @@ public class NeverNote extends QMainWindow{ if (!alive) { saveThreadDeadCount++; 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.")); + QMessageBox.information(this, tr("A thread has died."), tr("It appears as the note saver thread has died. I recommend "+ + "checking stopping NixNote, saving the logs for later viewing, and restarting. Sorry.")); disableSaveThreadCheck = true; } } else @@ -5283,8 +5690,8 @@ public class NeverNote extends QMainWindow{ if (!syncThread.isAlive()) { syncThreadDeadCount++; 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.")); + QMessageBox.information(this, tr("A thread has died."), tr("It appears as the synchronization thread has died. I recommend "+ + "checking stopping NixNote, saving the logs for later viewing, and restarting. Sorry.")); disableSyncThreadCheck = true; } } else @@ -5293,8 +5700,8 @@ public class NeverNote extends QMainWindow{ if (!indexThread.isAlive()) { indexThreadDeadCount++; 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.")); + QMessageBox.information(this, tr("A thread has died."), tr("It appears as the index thread has died. I recommend "+ + "checking stopping NixNote, saving the logs for later viewing, and restarting. Sorry.")); disableIndexThreadCheck = true; } } else @@ -5318,7 +5725,7 @@ public class NeverNote extends QMainWindow{ fd.setFileMode(FileMode.AnyFile); fd.setConfirmOverwrite(true); fd.setWindowTitle(tr("Backup Database")); - fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); + fd.setFilter(tr("NixNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptSave); if (saveLastPath == null || saveLastPath.equals("")) fd.setDirectory(System.getProperty("user.home")); @@ -5364,7 +5771,7 @@ public class NeverNote extends QMainWindow{ fd.setFileMode(FileMode.ExistingFile); fd.setConfirmOverwrite(true); fd.setWindowTitle(tr("Restore Database")); - fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); + fd.setFilter(tr("NixNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptOpen); if (saveLastPath == null || saveLastPath.equals("")) fd.setDirectory(System.getProperty("user.home")); @@ -5402,7 +5809,7 @@ public class NeverNote extends QMainWindow{ fd.setFileMode(FileMode.AnyFile); fd.setConfirmOverwrite(true); fd.setWindowTitle(tr("Backup Database")); - fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); + fd.setFilter(tr("NixNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptSave); fd.setDirectory(System.getProperty("user.home")); if (fd.exec() == 0 || fd.selectedFiles().size() == 0) { @@ -5435,7 +5842,7 @@ public class NeverNote extends QMainWindow{ fd.setFileMode(FileMode.ExistingFile); fd.setConfirmOverwrite(true); fd.setWindowTitle(tr("Import Notes")); - fd.setFilter(tr("NeverNote Export (*.nnex);;All Files (*.*)")); + fd.setFilter(tr("NixNote Export (*.nnex);;All Files (*.*)")); fd.setAcceptMode(AcceptMode.AcceptOpen); if (saveLastPath == null || saveLastPath.equals("")) fd.setDirectory(System.getProperty("user.home")); @@ -5447,7 +5854,7 @@ public class NeverNote extends QMainWindow{ waitCursor(true); - setMessage("Importing Notes"); + setMessage(tr("Importing Notes")); saveNote(); if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) @@ -5479,7 +5886,7 @@ public class NeverNote extends QMainWindow{ setMessage(tr("Notes have been imported.")); waitCursor(false); - setMessage("Import completed."); + setMessage(tr("Import completed.")); waitCursor(false); @@ -5495,6 +5902,83 @@ public class NeverNote extends QMainWindow{ duplicateNote(currentNoteGuid); } + //************************************************** + //* Action from when a user clicks Copy As URL + //************************************************** + @SuppressWarnings("unused") + private void copyAsUrlClicked() { + QClipboard clipboard = QApplication.clipboard(); + QMimeData mime = new QMimeData(); + String url; + mime.setText(currentNoteGuid); + List urls = new ArrayList(); + + // Start building the URL + User user = Global.getUserInformation(); + + // Check that we have everything we need + if ((user.getShardId().equals("") || user.getId() == 0) && !Global.bypassSynchronizationWarning()) { + SynchronizationRequiredWarning warning = new SynchronizationRequiredWarning(this); + warning.exec(); + if (!warning.neverSynchronize()) + return; + else { + Global.setBypassSynchronizationWarning(true); + user.setShardId("s0"); + user.setId(0); + } + } + + + // Start building a list of URLs based upon the selected notes + noteTableView.showColumn(Global.noteTableGuidPosition); + + List selections = noteTableView.selectionModel().selectedRows(); + if (!Global.isColumnVisible("guid")) + noteTableView.hideColumn(Global.noteTableGuidPosition); + + // Check that the note is either synchronized, or in a local notebook + for (int i=0; i ix = noteTableView.proxyModel.itemData(index); + String selectedGuid = (String)ix.values().toArray()[0]; + + Note n = conn.getNoteTable().getNote(selectedGuid, false, false, false, false, false); + if (n.getUpdateSequenceNum() == 0 && !conn.getNotebookTable().isNotebookLocal(n.getNotebookGuid())) { + QMessageBox.critical(this, tr("Please Synchronize") ,tr("Please either synchronize or move any " + + "new notes to a local notebook.")); + return; + } + } + + // Start building the URLs + for (int i=0; i ix = noteTableView.proxyModel.itemData(index); + String selectedGuid = (String)ix.values().toArray()[0]; + mime.setText(selectedGuid); + + String lid; + String gid; + Note selectedNote = conn.getNoteTable().getNote(selectedGuid, false, false, false, false, false); + if (selectedNote.getUpdateSequenceNum() > 0) { + gid = selectedGuid; + lid = selectedGuid; + } else { + gid = "00000000-0000-0000-0000-000000000000"; + lid = selectedGuid; + } + url = new String("evernote://///view/") + new String(user.getId() + "/" +user.getShardId() +"/" + +gid+"/"+lid +"/"); + urls.add(new QUrl(url)); + } + mime.setUrls(urls); + clipboard.setMimeData(mime); + } //************************************************** @@ -5610,10 +6094,12 @@ public class NeverNote extends QMainWindow{ Note newNote = importer.getNote(); newNote.setNotebookGuid(notebook); newNote.setTitle(dir.at(i)); - listManager.addNote(newNote); + NoteMetadata metadata = new NoteMetadata(); + metadata.setDirty(true); + metadata.setGuid(newNote.getGuid()); + listManager.addNote(newNote, metadata); conn.getNoteTable().addNote(newNote, true); - listManager.getUnsynchronizedNotes().add(newNote.getGuid()); - noteTableView.insertRow(newNote, true, -1); + noteTableView.insertRow(newNote, metadata, true, -1); listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent()); listManager.countNotebookResults(listManager.getNoteIndex()); importedFiles.add(list.get(i).absoluteFilePath()); @@ -5651,10 +6137,12 @@ public class NeverNote extends QMainWindow{ Note newNote = importer.getNote(); newNote.setNotebookGuid(notebook); newNote.setTitle(dir.at(i)); - listManager.addNote(newNote); + NoteMetadata metadata = new NoteMetadata(); + metadata.setDirty(true); + metadata.setGuid(newNote.getGuid()); + listManager.addNote(newNote, metadata); conn.getNoteTable().addNote(newNote, true); - listManager.getUnsynchronizedNotes().add(newNote.getGuid()); - noteTableView.insertRow(newNote, true, -1); + noteTableView.insertRow(newNote, metadata, true, -1); listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent()); listManager.countNotebookResults(listManager.getNoteIndex()); dir.remove(dir.at(i)); @@ -5782,7 +6270,7 @@ public class NeverNote extends QMainWindow{ String content = browser.getContent().substring(0,position) + newSegment + browser.getContent().substring(endPos); - browser.getBrowser().setContent(new QByteArray(content));; + browser.setContent(new QByteArray(content));; } position = browser.getContent().indexOf("en-tag=\"en-media\" guid=\""+guid+"\" type=", position+1); @@ -5839,4 +6327,39 @@ public class NeverNote extends QMainWindow{ return true; } + //************************************************* + //* View / Hide source HTML for a note + //************************************************* + public void viewSource() { + browserWindow.showSource(menuBar.viewSource.isChecked()); + } + //************************************************* + // Block the program. This is used for things + // like async web calls. + //************************************************* + @SuppressWarnings("unused") + private void blockApplication(BrowserWindow b) { + // Block all signals + waitCursor(true); + blockSignals(true); + + blockTimer = new QTimer(); + blockTimer.setSingleShot(true); + blockTimer.setInterval(15000); + blockTimer.timeout.connect(this, "unblockApplication()"); + blockingWindow = b; + blockTimer.start(); + } + + @SuppressWarnings("unused") + private void unblockApplication() { + waitCursor(false); + if (blockingWindow != null && new GregorianCalendar().getTimeInMillis() > blockingWindow.unblockTime && blockingWindow.unblockTime != -1) { + QMessageBox.critical(null, tr("No Response from CodeCogs") ,tr("Unable to contact CodeCogs for LaTeX formula.")); + blockingWindow.unblockTime = -1; + blockingWindow.awaitingHttpResponse = false; + } + blockingWindow = null; + blockSignals(false); + } }