X-Git-Url: http://git.sourceforge.jp/view?p=neighbornote%2FNeighborNote.git;a=blobdiff_plain;f=src%2Fcx%2Ffbn%2Fnevernote%2FNeverNote.java;h=0a1a9a222077d25bc7afb65d16fbc197e7f53e47;hp=ff0bf466213b454ff419c682c89c82b57ba74f23;hb=c25d1c3915e8f9f537ae8c938ce1a22cba09a474;hpb=b80ee2d0c114ca05dd87844eeb9a1a9715558152 diff --git a/src/cx/fbn/nevernote/NeverNote.java b/src/cx/fbn/nevernote/NeverNote.java index ff0bf46..0a1a9a2 100644 --- a/src/cx/fbn/nevernote/NeverNote.java +++ b/src/cx/fbn/nevernote/NeverNote.java @@ -1,6 +1,7 @@ /* - * This file is part of NixNote + * This file is part of NixNote/NeighborNote * Copyright 2009 Randy Baumgarte + * Copyright 2013 Yuki Takahashi * * This file may be licensed under the terms of of the * GNU General Public License Version 2 (the ``GPL''). @@ -41,14 +42,15 @@ import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; 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; +import com.evernote.edam.error.EDAMErrorCode; import com.evernote.edam.error.EDAMNotFoundException; import com.evernote.edam.error.EDAMSystemException; import com.evernote.edam.error.EDAMUserException; @@ -65,6 +67,7 @@ import com.evernote.edam.type.Resource; import com.evernote.edam.type.SavedSearch; import com.evernote.edam.type.Tag; import com.evernote.edam.type.User; +import com.evernote.thrift.TException; import com.trolltech.qt.QThread; import com.trolltech.qt.core.QByteArray; import com.trolltech.qt.core.QDateTime; @@ -81,12 +84,14 @@ import com.trolltech.qt.core.QModelIndex; import com.trolltech.qt.core.QSize; import com.trolltech.qt.core.QTemporaryFile; import com.trolltech.qt.core.QTextCodec; +import com.trolltech.qt.core.QTextStream; import com.trolltech.qt.core.QThreadPool; import com.trolltech.qt.core.QTimer; import com.trolltech.qt.core.QTranslator; 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.DockWidgetArea; import com.trolltech.qt.core.Qt.ItemDataRole; import com.trolltech.qt.core.Qt.KeyboardModifier; import com.trolltech.qt.core.Qt.MouseButton; @@ -112,6 +117,7 @@ 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.QListWidgetItem; import com.trolltech.qt.gui.QMainWindow; import com.trolltech.qt.gui.QMenu; import com.trolltech.qt.gui.QMessageBox; @@ -141,6 +147,7 @@ import com.trolltech.qt.network.QNetworkRequest; import com.trolltech.qt.webkit.QWebPage.WebAction; import com.trolltech.qt.webkit.QWebSettings; +import cx.fbn.nevernote.clipboard.ClipBoardObserver; import cx.fbn.nevernote.config.InitializationException; import cx.fbn.nevernote.config.StartupConfig; import cx.fbn.nevernote.dialog.AccountDialog; @@ -175,8 +182,12 @@ import cx.fbn.nevernote.gui.DateAttributeFilterTable; import cx.fbn.nevernote.gui.ExternalBrowse; import cx.fbn.nevernote.gui.MainMenuBar; import cx.fbn.nevernote.gui.NotebookTreeWidget; +import cx.fbn.nevernote.gui.RensoNoteList; +import cx.fbn.nevernote.gui.RensoNoteListDock; import cx.fbn.nevernote.gui.SavedSearchTreeWidget; import cx.fbn.nevernote.gui.SearchPanel; +import cx.fbn.nevernote.gui.TabBrowse; +import cx.fbn.nevernote.gui.TabBrowserWidget; import cx.fbn.nevernote.gui.TableView; import cx.fbn.nevernote.gui.TagTreeWidget; import cx.fbn.nevernote.gui.Thumbnailer; @@ -241,9 +252,9 @@ public class NeverNote extends QMainWindow{ NoteFilter filter; // Note filter 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 readOnly; // Is this note read-only? + HashMap noteDirty; // Has the note been changed? + HashMap inkNote; // if this is an ink note, it is read only + HashMap readOnly; // Is this note read-only? ListManager listManager; // DB runnable task @@ -318,19 +329,22 @@ 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 + int enRelatedNotesThreadDeadCount=0; // number of consecutive dead times for the EvernoteRelatedNotes Thread boolean disableTagThreadCheck=false; boolean disableNotebookThreadCheck=false; boolean disableTrashThreadCheck=false; boolean disableSaveThreadCheck=false; boolean disableSyncThreadCheck=false; boolean disableIndexThreadCheck=false; + boolean disableENRelatedNotesThreadCheck=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? + HashMap> historyGuids; // タブごとの以前見たノートのGUID + HashMap historyPosition; // Position within the viewed items + HashMap fromHistory; // Is this from the history queue? + String trashNoteGuid; // Guid to restore / set into or out of trash to save position List thumbGenerators; // generate preview image ThumbnailViewer thumbnailViewer; // View preview thumbnail; @@ -348,6 +362,12 @@ public class NeverNote extends QMainWindow{ private QTimer blockTimer; BrowserWindow blockingWindow; + private final TabBrowserWidget tabBrowser; // ブラウザウィンドウをタブ化 + private final HashMap tabWindows; // タブウィンドウ + private final RensoNoteListDock rensoNoteListDock; // 連想ノートリストドックウィジェット + ClipBoardObserver cbObserver; + String rensoNotePressedItemGuid; + String iconPath = new String("classpath:cx/fbn/nevernote/icons/"); @@ -359,11 +379,13 @@ public class NeverNote extends QMainWindow{ // Application Constructor @SuppressWarnings("static-access") public NeverNote(DatabaseConnection dbConn) { + cbObserver = new ClipBoardObserver(); + 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 NixNote is already running.\n\n" + - "Please end any other process or shutdown the other NixNote before starting.\n\nExiting program.")); + "is accessing the database or NeighborNote is already running.\n\n" + + "Please end any other process or shutdown the other NeighborNote before starting.\n\nExiting program.")); QMessageBox.critical(null, tr("Database Connection Error") ,msg); System.exit(16); @@ -391,16 +413,18 @@ public class NeverNote extends QMainWindow{ logger.log(logger.EXTREME, "Starting GUI build"); QTranslator nevernoteTranslator = new QTranslator(); - nevernoteTranslator.load(Global.getFileManager().getTranslateFilePath("nevernote_" + QLocale.system().name() + ".qm")); + nevernoteTranslator.load(Global.getFileManager().getTranslateFilePath("neighbornote_" + QLocale.system().name() + ".qm")); QApplication.instance().installTranslator(nevernoteTranslator); Global.originalPalette = QApplication.palette(); QApplication.setStyle(Global.getStyle()); if (Global.useStandardPalette()) QApplication.setPalette(QApplication.style().standardPalette()); - setWindowTitle(tr("NixNote")); + setWindowTitle(tr("NeighborNote")); mainLeftRightSplitter = new QSplitter(); + mainLeftRightSplitter.setOrientation(Qt.Orientation.Horizontal); + setCentralWidget(mainLeftRightSplitter); leftSplitter1 = new QSplitter(); leftSplitter1.setOrientation(Qt.Orientation.Vertical); @@ -417,15 +441,18 @@ 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.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), - Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + indexRunner = new IndexRunner("indexRunner.log", + Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), + Global.getResourceDatabaseUrl(), + Global.getBehaviorDatabaseUrl(), 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(); +// indexRunner.indexNoteBody = Global.indexNoteBody(); +// indexRunner.indexNoteTitle = Global.indexNoteTitle(); +// indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters(); indexThread.start(); synchronizeAnimationTimer = new QTimer(); @@ -440,15 +467,18 @@ public class NeverNote extends QMainWindow{ logger.log(logger.EXTREME, "Setting sync thread & timers"); syncThreadsReady=1; - syncRunner = new SyncRunner("syncRunner.log", - Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), - Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + syncRunner = new SyncRunner("syncRunner.log", Global.getDatabaseUrl(), + Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), + Global.getBehaviorDatabaseUrl(), Global.getDatabaseUserid(), + Global.getDatabaseUserPassword(), Global.cipherPassword); + syncTime = new SyncTimes().timeValue(Global.getSyncInterval()); syncTimer = new QTimer(); syncTimer.timeout.connect(this, "syncTimer()"); syncRunner.status.message.connect(this, "setMessage(String)"); syncRunner.syncSignal.finished.connect(this, "syncThreadComplete(Boolean)"); syncRunner.syncSignal.errorDisconnect.connect(this, "remoteErrorDisconnect()"); + syncRunner.limitSignal.rateLimitReached.connect(this, "informRateLimit(Integer)"); syncRunning = false; if (syncTime > 0) { automaticSync = true; @@ -464,9 +494,12 @@ public class NeverNote extends QMainWindow{ logger.log(logger.EXTREME, "Starting thumnail thread"); pdfReadyQueue = new ArrayList(); - thumbnailRunner = new ThumbnailRunner("thumbnailRunner.log", - Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), - Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword); + thumbnailRunner = new ThumbnailRunner("thumbnailRunner.log", + Global.getDatabaseUrl(), Global.getIndexDatabaseUrl(), + Global.getResourceDatabaseUrl(), + Global.getBehaviorDatabaseUrl(), Global.getDatabaseUserid(), + Global.getDatabaseUserPassword(), Global.cipherPassword); + thumbnailThread = new QThread(thumbnailRunner, "Thumbnail Thread"); thumbnailRunner.noteSignal.thumbnailPageReady.connect(this, "thumbnailHTMLReady(String,QByteArray,Integer)"); thumbnailThread.start(); @@ -510,7 +543,7 @@ 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, this); searchField = new QComboBox(); searchField.setObjectName("searchField"); @@ -549,18 +582,51 @@ public class NeverNote extends QMainWindow{ noteCache = new HashMap(); readOnlyCache = new HashMap(); inkNoteCache = new HashMap(); - browserWindow = new BrowserWindow(conn); - + browserWindow = new BrowserWindow(conn, cbObserver); + + // 下から移動してきた。 + historyGuids = new HashMap>(); + historyPosition = new HashMap(); + fromHistory = new HashMap(); + + // タブブラウザ作成 + tabWindows = new HashMap(); + tabBrowser = new TabBrowserWidget(this); + tabBrowser.setStyleSheet("QTabBar::tab{width:150px;}"); + tabBrowser.setMovable(true); + tabBrowser.setTabsClosable(true); + TabBrowse tab = new TabBrowse(conn, tabBrowser, cbObserver); + browserWindow = tab.getBrowserWindow(); + int index = tabBrowser.addNewTab(tab, ""); + tabWindows.put(index, tab); + tabBrowser.currentChanged.connect(this, "tabWindowChanged(int)"); + tabBrowser.tabCloseRequested.connect(this, "tabCloseRequested(int)"); + + noteDirty = new HashMap(); + noteDirty.put(index, false); + + inkNote = new HashMap(); + readOnly = new HashMap(); + + // 履歴記録のハッシュマップを初期化 + historyGuids.put(index, new ArrayList()); + historyPosition.put(index, 0); + fromHistory.put(index, false); + mainLeftRightSplitter.addWidget(leftSplitter1); mainLeftRightSplitter.addWidget(browserIndexSplitter); - if (Global.getListView() == Global.View_List_Wide) { - browserIndexSplitter.addWidget(noteTableView); - browserIndexSplitter.addWidget(browserWindow); - } else { - mainLeftRightSplitter.addWidget(noteTableView); - mainLeftRightSplitter.addWidget(browserWindow); - } + // 連想ノートリストをセットアップ + rensoNoteListDock = new RensoNoteListDock(conn, this, syncRunner, iconPath, tr("Renso Note List")); + addDockWidget(DockWidgetArea.RightDockWidgetArea, rensoNoteListDock); + + if (Global.getListView() == Global.View_List_Wide) { + browserIndexSplitter.addWidget(noteTableView); + browserIndexSplitter.addWidget(tabBrowser); + } else { + mainLeftRightSplitter.addWidget(noteTableView); + mainLeftRightSplitter.addWidget(tabBrowser); + } // Setup the thumbnail viewer thumbnailViewer = new ThumbnailViewer(); @@ -622,8 +688,15 @@ public class NeverNote extends QMainWindow{ savedSearchTree.itemSelectionChanged.connect(this, "updateSavedSearchSelection()"); savedSearchTree.setVisible(Global.isWindowVisible("savedSearchTree")); menuBar.hideSavedSearches.setChecked(Global.isWindowVisible("savedSearchTree")); + + // noteTableViewに新しいタブで開くを追加 + noteTableView.setOpenNewTabAction(menuBar.noteOpenNewTab); noteTableView.setAddAction(menuBar.noteAdd); + + // noteTableViewに新しいタブでノート追加を追加 + noteTableView.setAddNoteNewTabAction(menuBar.noteAddNewTab); + noteTableView.setDeleteAction(menuBar.noteDelete); noteTableView.setRestoreAction(menuBar.noteRestoreAction); noteTableView.setNoteDuplicateAction(menuBar.noteDuplicateAction); @@ -649,17 +722,29 @@ public class NeverNote extends QMainWindow{ noteTableView.setVisible(Global.isWindowVisible("noteList")); menuBar.hideNoteList.setChecked(Global.isWindowVisible("noteList")); - if (!Global.isWindowVisible("editorButtonBar")) + if (!Global.isWindowVisible("editorButtonBar")) { + menuBar.showEditorBar.setChecked(false); toggleEditorButtonBar(); + } + if (!Global.isWindowVisible("leftPanel")) menuBar.hideLeftSide.setChecked(true); - if (Global.isWindowVisible("noteInformation")) + + if (Global.isWindowVisible("noteInformation")) { + menuBar.noteAttributes.setChecked(true); toggleNoteInformation(); + } + quotaBar.setVisible(Global.isWindowVisible("quota")); - if (!quotaBar.isVisible()) + // IFIXED quotaBar.isVisible() → Global.isWindowVisible("quota") + // なぜかquotaBar.isVisible()が常にfalseを返すようなので修正 + if (!Global.isWindowVisible("quota")) menuBar.hideQuota.setChecked(false); + searchField.setVisible(Global.isWindowVisible("searchField")); - if (!searchField.isVisible()) + // IFIXED !searchField.isVisible() → !Global.isWindowVisible("searchField") + // なぜかsearchField.isVisible()が常にfalseを返すようなので修正 + if (!Global.isWindowVisible("searchField")) menuBar.hideSearch.setChecked(false); if (searchField.isHidden() && quotaBar.isHidden() && zoomSpinner.isHidden() && notebookTree.isHidden()) @@ -686,16 +771,21 @@ public class NeverNote extends QMainWindow{ trayIcon = new QSystemTrayIcon(this); - trayIcon.setToolTip(tr("NixNote")); + trayIcon.setToolTip(tr("NeighborNote")); trayIcon.setContextMenu(trayMenu); trayIcon.activated.connect(this, "trayActivated(com.trolltech.qt.gui.QSystemTrayIcon$ActivationReason)"); currentNoteGuid=""; currentNoteGuid = Global.getLastViewedNoteGuid(); - historyGuids = new ArrayList(); - historyPosition = 0; - fromHistory = false; - noteDirty = false; + if (currentNoteGuid.equals("")) + currentNote = new Note(); + + /* 上に移動したのでここには不要 + * historyGuids = new ArrayList(); + * historyPosition = 0; + * fromHistory = false; + */ + if (!currentNoteGuid.trim().equals("")) { currentNote = conn.getNoteTable().getNote(currentNoteGuid, true,true,false,false,true); } @@ -746,8 +836,11 @@ public class NeverNote extends QMainWindow{ threadMonitorTimer.timeout.connect(this, "threadMonitorCheck()"); threadMonitorTimer.start(1000*10); // Check for threads every 10 seconds; - historyGuids.add(currentNoteGuid); - historyPosition = 1; + // IFIXED 恐らく不要なのでコメントアウト + /* + * historyGuids.add(currentNoteGuid); + * historyPosition = 1; + */ menuBar.blockSignals(true); menuBar.narrowListView.blockSignals(true); @@ -761,14 +854,17 @@ public class NeverNote extends QMainWindow{ menuBar.blockSignals(false); menuBar.narrowListView.blockSignals(false); menuBar.wideListView.blockSignals(false); - - if (Global.getListView() == Global.View_List_Wide) { - browserIndexSplitter.addWidget(noteTableView); - browserIndexSplitter.addWidget(browserWindow); - } else { - mainLeftRightSplitter.addWidget(noteTableView); - mainLeftRightSplitter.addWidget(browserWindow); - } + + // IFIXED 上に同じコードがあるのでコメントアウト + /* + * if (Global.getListView() == Global.View_List_Wide) { + * browserIndexSplitter.addWidget(noteTableView); + * browserIndexSplitter.addWidget(tabBrowser); + * browserIndexSplitter.addWidget(browserWindow); } else { + * mainLeftRightSplitter.addWidget(noteTableView); + * mainLeftRightSplitter.addWidget(tabBrowser); + * mainLeftRightSplitter.addWidget(browserWindow); } + */ messageTimer = new QTimer(); messageTimer.timeout.connect(this, "clearMessage()"); @@ -798,11 +894,13 @@ public class NeverNote extends QMainWindow{ } } - - - - if (Global.checkVersionUpgrade()) + if (Global.checkVersionUpgrade()) { checkForUpdates(); + } + + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + menuBar.noteAddNewTab.setEnabled(false); + } } @@ -918,13 +1016,18 @@ public class NeverNote extends QMainWindow{ File f = Global.getFileManager().getDbDirFile(Global.databaseName + ".h2.db"); File fr = Global.getFileManager().getDbDirFile(Global.resourceDatabaseName + ".h2.db"); - File fi = Global.getFileManager().getDbDirFile(Global.resourceDatabaseName + ".h2.db"); + // IFIXED resourceDatabaseNameになっていたので修正 + File fi = Global.getFileManager().getDbDirFile(Global.indexDatabaseName + ".h2.db"); + File fb = Global.getFileManager().getDbDirFile(Global.behaviorDatabaseName + ".h2.db"); + if (!f.exists()) Global.setDatabaseUrl(""); if (!fr.exists()) Global.setResourceDatabaseUrl(""); if (!fi.exists()) Global.setIndexDatabaseUrl(""); + if (!fb.exists()) + Global.setBehaviorDatabaseUrl(""); if (Global.getDatabaseUrl().toUpperCase().indexOf("CIPHER=") > -1) { boolean goodCheck = false; @@ -939,7 +1042,7 @@ public class NeverNote extends QMainWindow{ } } DatabaseConnection dbConn = new DatabaseConnection(logger,Global.getDatabaseUrl(), - Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), + Global.getIndexDatabaseUrl(), Global.getResourceDatabaseUrl(), Global.getBehaviorDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword, 0); return dbConn; } @@ -955,6 +1058,9 @@ public class NeverNote extends QMainWindow{ st.execute("shutdown"); st = conn.getIndexConnection().createStatement(); st.execute("shutdown"); + st = conn.getBehaviorConnection().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, @@ -962,9 +1068,12 @@ public class NeverNote extends QMainWindow{ 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); + ChangeFileEncryption.execute(dbPath, "Behavior", encryptCipher, null, Global.cipherPassword.toCharArray(), true); + Global.setDatabaseUrl(Global.getDatabaseUrl() + ";CIPHER="+encryptCipher); Global.setResourceDatabaseUrl(Global.getResourceDatabaseUrl() + ";CIPHER="+encryptCipher); Global.setIndexDatabaseUrl(Global.getIndexDatabaseUrl() + ";CIPHER="+encryptCipher); + Global.setBehaviorDatabaseUrl(Global.getBehaviorDatabaseUrl() + ";CIPHER=" + encryptCipher); QMessageBox.information(this, tr("Encryption Complete"), tr("Encryption is complete")); } @@ -1067,11 +1176,13 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Entering NeverNote.closeEvent"); waitCursor(true); - if (currentNote!= null & browserWindow!=null) { - if (currentNote.getTitle() != null && browserWindow != null + if (currentNote != null & browserWindow != null) { + if (currentNote.getTitle() != null && browserWindow != null && !currentNote.getTitle().equals(browserWindow.getTitle())) - conn.getNoteTable().updateNoteTitle(currentNote.getGuid(), browserWindow.getTitle()); + conn.getNoteTable().updateNoteTitle(currentNote.getGuid(), + browserWindow.getTitle()); } + saveNote(); setMessage(tr("Beginning shutdown.")); @@ -1084,6 +1195,15 @@ public class NeverNote extends QMainWindow{ browser.close(); } + // タブブラウザに対してクローズ処理を行う + Collection win = tabWindows.values(); + Iterator it = win.iterator(); + tabBrowser.currentChanged.disconnect(); + tabBrowser.tabCloseRequested.disconnect(); + while (it.hasNext()) { + TabBrowse browser = it.next(); + browser.close(); + } externalFileEditedSaver(); if (Global.isConnected && Global.synchronizeOnClose()) { @@ -1102,6 +1222,9 @@ public class NeverNote extends QMainWindow{ saveNote(); listManager.stop(); saveWindowState(); + + // 連想ノートリストのEvernote関連ノート取得スレッドを終了 + rensoNoteListDock.getRensoNoteList().stopThread(); if (tempFiles != null) tempFiles.clear(); @@ -1223,8 +1346,10 @@ public class NeverNote extends QMainWindow{ QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor)); } else { - while (QApplication.overrideCursor() != null) + if (QApplication.overrideCursor() != null) QApplication.restoreOverrideCursor(); + else + QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.ArrowCursor)); } listManager.refreshCounters(); } @@ -1298,10 +1423,11 @@ public class NeverNote extends QMainWindow{ @SuppressWarnings("unused") private void settings() { logger.log(logger.HIGH, "Entering NeverNote.settings"); + saveNoteColumnPositions(); saveNoteIndexWidth(); showColumns(); - ConfigDialog settings = new ConfigDialog(this); + ConfigDialog settings = new ConfigDialog(this, conn); String dateFormat = Global.getDateFormat(); String timeFormat = Global.getTimeFormat(); @@ -1310,17 +1436,22 @@ public class NeverNote extends QMainWindow{ settings.exec(); indexRunner.indexAttachmentsLocally = Global.indexAttachmentsLocally(); - indexRunner.indexNoteBody = Global.indexNoteBody(); - indexRunner.indexNoteTitle = Global.indexNoteTitle(); - indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters(); +// indexRunner.indexNoteBody = Global.indexNoteBody(); +// indexRunner.indexNoteTitle = Global.indexNoteTitle(); +// indexRunner.specialIndexCharacters = Global.getSpecialIndexCharacters(); indexRunner.indexImageRecognition = Global.indexImageRecognition(); if (Global.showTrayIcon() || Global.minimizeOnClose()) trayIcon.show(); else trayIcon.hide(); showColumns(); - if (menuBar.showEditorBar.isChecked()) - showEditorButtons(browserWindow); + if (menuBar.showEditorBar.isChecked()){ + for(int i = 0; i < tabBrowser.count(); i++){ + BrowserWindow browser = ((TabBrowse) tabBrowser.widget(i)).getBrowserWindow(); + showEditorButtons(browser); + } + + } // Reset the save timer if (Global.getAutoSaveInterval() > 0) @@ -1353,7 +1484,8 @@ public class NeverNote extends QMainWindow{ restoreState(Global.restoreState(objectName())); mainLeftRightSplitter.setObjectName("mainLeftRightSplitter"); browserIndexSplitter.setObjectName("browserIndexSplitter"); - leftSplitter1.setObjectName("leftSplitter1"); + leftSplitter1.setObjectName("leftSplitter1"); + rensoNoteListDock.setObjectName("rensoNoteListDock"); // Restore the actual positions. if (mainWindow) @@ -1361,6 +1493,7 @@ public class NeverNote extends QMainWindow{ mainLeftRightSplitter.restoreState(Global.restoreState(mainLeftRightSplitter.objectName())); browserIndexSplitter.restoreState(Global.restoreState(browserIndexSplitter.objectName())); leftSplitter1.restoreState(Global.restoreState(leftSplitter1.objectName())); + rensoNoteListDock.restoreGeometry(Global.restoreGeometry(rensoNoteListDock.objectName())); } // Save window positions for the next start @@ -1370,6 +1503,7 @@ public class NeverNote extends QMainWindow{ Global.saveState(browserIndexSplitter.objectName(), browserIndexSplitter.saveState()); Global.saveState(leftSplitter1.objectName(), leftSplitter1.saveState()); Global.saveState(objectName(), saveState()); + Global.saveGeometry(rensoNoteListDock.objectName(), rensoNoteListDock.saveGeometry()); } // Load the style sheet private void loadStyleSheet() { @@ -1508,6 +1642,12 @@ public class NeverNote extends QMainWindow{ menuBar.notebookShareAction.setEnabled(true); menuBar.notebookIconAction.setEnabled(true); menuBar.notebookStackAction.setEnabled(true); + + // ゴミ箱から元の画面に戻す。連想ノートリストをONに。 + if (!rensoNoteListDock.isEnabled()) { + rensoNoteListDock.setEnabled(true); + } + List selections = notebookTree.selectedItems(); selectedNotebookGUIDs.clear(); String guid = ""; @@ -1775,6 +1915,13 @@ public class NeverNote extends QMainWindow{ Iterator set = externalWindows.keySet().iterator(); while(set.hasNext()) externalWindows.get(set.next()).getBrowserWindow().setNotebookList(filteredBooks); + + Iteratorit = tabWindows.keySet().iterator(); + while (it.hasNext()) { + tabWindows.get(it.next()).getBrowserWindow() + .setNotebookList(filteredBooks); + } + logger.log(logger.HIGH, "Leaving NeverNote.editNotebook"); } // Publish a notebook @@ -1920,6 +2067,8 @@ public class NeverNote extends QMainWindow{ // A note's notebook has been updated @SuppressWarnings("unused") private void updateNoteNotebook(String guid, String notebookGuid) { + // 同じノートブックに入れられたノート間の履歴を登録 + conn.getHistoryTable().addSameNotebookHistory(guid, notebookGuid); // Update the list manager listManager.updateNoteNotebook(guid, notebookGuid); @@ -2013,6 +2162,13 @@ public class NeverNote extends QMainWindow{ while(set.hasNext()) externalWindows.get(set.next()).getBrowserWindow().setNotebookList(filteredBooks); + // 全てのタブウィンドウを更新 + Iterator it = tabWindows.keySet().iterator(); + while (it.hasNext()) { + tabWindows.get(it.next()).getBrowserWindow() + .setNotebookList(filteredBooks); + } + waitCursor(false); } // Change the notebook's icon @@ -2258,6 +2414,11 @@ public class NeverNote extends QMainWindow{ menuBar.noteRestoreAction.setVisible(false); + // ゴミ箱から元の画面に戻す。連想ノートリストをONに。 + if (!rensoNoteListDock.isEnabled()) { + rensoNoteListDock.setEnabled(true); + } + List selections = tagTree.selectedItems(); QTreeWidgetItem currentSelection; selectedTagGUIDs.clear(); @@ -2337,7 +2498,7 @@ public class NeverNote extends QMainWindow{ newTags.add(tags.get(i)); } - listManager.saveNoteTags(guid, tags); + listManager.saveNoteTags(guid, tags, true); listManager.countTagResults(listManager.getNoteIndex()); StringBuffer names = new StringBuffer(""); for (int i=0; i selections = savedSearchTree.selectedItems(); QTreeWidgetItem currentSelection; selectedSavedSearchGUID = ""; @@ -2757,6 +2931,8 @@ public class NeverNote extends QMainWindow{ status.setTagCount(listManager.getTagIndex().size()); status.setResourceCount(conn.getNoteTable().noteResourceTable.getResourceCount()); status.setWordCount(conn.getWordsTable().getWordCount()); + status.setHistoryCount(conn.getHistoryTable().getHistoryCount()); + status.setRensoClickCount(conn.getHistoryTable().getRensoClickCount()); waitCursor(false); status.exec(); } @@ -2766,7 +2942,7 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Entering NeverNote.compactDatabase"); if (QMessageBox.question(this, tr("Confirmation"), tr("This will free unused space in the database, "+ "but please be aware that depending upon the size of your database this can be time consuming " + - "and NixNote will be unresponsive until it is complete. Do you wish to continue?"), + "and NeighborNote 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; @@ -2797,7 +2973,12 @@ public class NeverNote extends QMainWindow{ if (!file.open(new QIODevice.OpenMode(QIODevice.OpenModeFlag.ReadOnly, QIODevice.OpenModeFlag.Text))) return; - textBox.setText(file.readAll().toString()); + // 日本語文字化け対策 + QTextCodec codec = QTextCodec.codecForName("UTF-8"); + QTextStream textStream = new QTextStream(file); + textStream.setCodec(codec); + textBox.setText(textStream.readAll().toString()); + file.close(); dialog.setWindowTitle(tr("Release Notes")); dialog.setLayout(layout); @@ -2817,9 +2998,9 @@ public class NeverNote extends QMainWindow{ private void about() { logger.log(logger.HIGH, "Entering NeverNote.about"); QMessageBox.about(this, - tr("About NixNote"), - tr("

NixNote


Version ") - +Global.version + tr("About NeighborNote"), + tr("

NeighborNote


Version ") + +Global.version + "(based on NixNote 1.6)" //+"1.2.120724" +tr("
" +"Open Source Evernote Client.

" @@ -3006,6 +3187,7 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Entering NeverNote.setupToolBar"); toolBar = addToolBar(tr("Tool Bar")); toolBar.setObjectName("toolBar"); + toolBar.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon); menuBar.setupToolBarVisible(); if (!Global.isWindowVisible("toolBar")) toolBar.setVisible(false); @@ -3015,78 +3197,87 @@ public class NeverNote extends QMainWindow{ // toolBar.addWidget(menuBar); // menuBar.setSizePolicy(Policy.Minimum, Policy.Minimum); // toolBar.addSeparator(); - prevButton = toolBar.addAction(tr("Previous")); + prevButton = toolBar.addAction(tr("")); + prevButton.setToolTip(tr("Previous")); QIcon prevIcon = new QIcon(iconPath+"back.png"); prevButton.setIcon(prevIcon); prevButton.triggered.connect(this, "previousViewedAction()"); - togglePrevArrowButton(Global.isToolbarButtonVisible("prevArrow")); + togglePrevArrowButton(Global.isToolbarButtonVisible("prevArrow", true)); - nextButton = toolBar.addAction(tr("Next")); + nextButton = toolBar.addAction(tr("")); + nextButton.setToolTip(tr("Next")); QIcon nextIcon = new QIcon(iconPath+"forward.png"); nextButton.setIcon(nextIcon); nextButton.triggered.connect(this, "nextViewedAction()"); - toggleNextArrowButton(Global.isToolbarButtonVisible("nextArrow")); + toggleNextArrowButton(Global.isToolbarButtonVisible("nextArrow", true)); + + toolBar.addSeparator(); upButton = toolBar.addAction(tr("Up")); QIcon upIcon = new QIcon(iconPath+"up.png"); upButton.setIcon(upIcon); upButton.triggered.connect(this, "upAction()"); - toggleUpArrowButton(Global.isToolbarButtonVisible("upArrow")); + toggleUpArrowButton(Global.isToolbarButtonVisible("upArrow", false)); downButton = toolBar.addAction(tr("Down")); QIcon downIcon = new QIcon(iconPath+"down.png"); downButton.setIcon(downIcon); downButton.triggered.connect(this, "downAction()"); - toggleDownArrowButton(Global.isToolbarButtonVisible("downArrow")); + toggleDownArrowButton(Global.isToolbarButtonVisible("downArrow", false)); synchronizeButton = toolBar.addAction(tr("Synchronize")); synchronizeButton.setIcon(new QIcon(iconPath+"synchronize.png")); synchronizeIconAngle = 0; synchronizeButton.triggered.connect(this, "evernoteSync()"); - toggleSynchronizeButton(Global.isToolbarButtonVisible("synchronize")); + toggleSynchronizeButton(Global.isToolbarButtonVisible("synchronize", true)); printButton = toolBar.addAction(tr("Print")); QIcon printIcon = new QIcon(iconPath+"print.png"); printButton.setIcon(printIcon); printButton.triggered.connect(this, "printNote()"); - togglePrintButton(Global.isToolbarButtonVisible("print")); + togglePrintButton(Global.isToolbarButtonVisible("print", false)); tagButton = toolBar.addAction(tr("Tag")); QIcon tagIcon = new QIcon(iconPath+"tag.png"); tagButton.setIcon(tagIcon); tagButton.triggered.connect(browserWindow, "modifyTags()"); - toggleTagButton(Global.isToolbarButtonVisible("tag")); + toggleTagButton(Global.isToolbarButtonVisible("tag", false)); attributeButton = toolBar.addAction(tr("Attributes")); QIcon attributeIcon = new QIcon(iconPath+"attribute.png"); attributeButton.setIcon(attributeIcon); - attributeButton.triggered.connect(this, "toggleNoteInformation()"); - toggleAttributeButton(Global.isToolbarButtonVisible("attribute")); + attributeButton.triggered.connect(this, "toggleNoteAttributes()"); + toggleAttributeButton(Global.isToolbarButtonVisible("attribute", true)); emailButton = toolBar.addAction(tr("Email")); QIcon emailIcon = new QIcon(iconPath+"email.png"); emailButton.setIcon(emailIcon); emailButton.triggered.connect(this, "emailNote()"); - toggleEmailButton(Global.isToolbarButtonVisible("email")); + toggleEmailButton(Global.isToolbarButtonVisible("email", false)); deleteButton = toolBar.addAction(tr("Delete")); QIcon deleteIcon = new QIcon(iconPath+"delete.png"); deleteButton.setIcon(deleteIcon); deleteButton.triggered.connect(this, "deleteNote()"); - toggleDeleteButton(Global.isToolbarButtonVisible("delete")); + toggleDeleteButton(Global.isToolbarButtonVisible("delete", true)); newButton = toolBar.addAction(tr("New")); QIcon newIcon = new QIcon(iconPath+"new.png"); - newButton.triggered.connect(this, "addNote()"); + if (Global.toolBarNewAction()) { + newButton.triggered.connect(this, "noteAddNewTab()"); + } else { + newButton.triggered.connect(this, "addNote()"); + } + newButton.setIcon(newIcon); - toggleNewButton(Global.isToolbarButtonVisible("new")); + toggleNewButton(Global.isToolbarButtonVisible("new", true)); 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")); + toggleAllNotesButton(Global.isToolbarButtonVisible("allNotes", true)); //toolBar.addSeparator(); //toolBar.addWidget(new QLabel(tr("Quota:"))); @@ -3171,9 +3362,9 @@ public class NeverNote extends QMainWindow{ contextMenu.addAction(allNotesAction); allNotesAction.triggered.connect(this, "toggleAllNotesButton(Boolean)"); - QAction searchClearAction = addContextAction("searchClear", tr("Search Clear")); - contextMenu.addAction(searchClearAction); - searchClearAction.triggered.connect(this, "toggleSearchClearButton(Boolean)"); +// QAction searchClearAction = addContextAction("searchClear", tr("Search Clear")); +// contextMenu.addAction(searchClearAction); +// searchClearAction.triggered.connect(this, "toggleSearchClearButton(Boolean)"); return contextMenu; @@ -3182,7 +3373,7 @@ public class NeverNote extends QMainWindow{ QAction newAction = new QAction(this); newAction.setText(name); newAction.setCheckable(true); - newAction.setChecked(Global.isToolbarButtonVisible(config)); + newAction.setChecked(Global.isToolbarButtonVisible(config, true)); return newAction; } private void togglePrevArrowButton(Boolean toggle) { @@ -3233,11 +3424,11 @@ public class NeverNote extends QMainWindow{ allNotesButton.setVisible(toggle); Global.saveToolbarButtonsVisible("allNotes", toggle); } - @SuppressWarnings("unused") - private void toggleSearchClearButton(Boolean toggle) { - searchClearButton.setVisible(toggle); - Global.saveToolbarButtonsVisible("searchClear", toggle); - } +// @SuppressWarnings("unused") +// private void toggleSearchClearButton(Boolean toggle) { +// searchClearButton.setVisible(toggle); +// Global.saveToolbarButtonsVisible("searchClear", toggle); +// } @@ -3364,14 +3555,25 @@ public class NeverNote extends QMainWindow{ Global.showDeleted = false; menuBar.noteRestoreAction.setEnabled(false); menuBar.noteRestoreAction.setVisible(false); + // ゴミ箱から元の画面に戻す。連想ノートリストをONに。 + rensoNoteListDock.setEnabled(true); } else { trashNoteGuid = tempGuid; currentNoteGuid = trashNoteGuid; menuBar.noteRestoreAction.setEnabled(true); menuBar.noteRestoreAction.setVisible(true); + // ゴミ箱を開く。連想ノートリストをOFFに。 + rensoNoteListDock.setEnabled(false); + Global.showDeleted = true; } + + menuBar.noteAddNewTab.setEnabled(newButton.isEnabled()); + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + menuBar.noteAddNewTab.setEnabled(false); + } + listManager.loadNotesIndex(); noteIndexUpdated(false); //// browserWindow.setEnabled(newButton.isEnabled()); @@ -3391,6 +3593,10 @@ public class NeverNote extends QMainWindow{ listManager.setSelectedSavedSearch(""); newButton.setEnabled(!newButton.isEnabled()); menuBar.noteAdd.setEnabled(newButton.isEnabled()); + menuBar.noteAddNewTab.setEnabled(newButton.isEnabled()); + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + menuBar.noteAddNewTab.setEnabled(false); + } menuBar.noteAdd.setVisible(true); browserWindow.clear(); @@ -3405,6 +3611,11 @@ public class NeverNote extends QMainWindow{ listManager.loadNotesIndex(); noteIndexUpdated(false); + + // ゴミ箱から元の画面に戻す。連想ノートリストをONに。 + if (!rensoNoteListDock.isEnabled()) { + rensoNoteListDock.setEnabled(true); + } } } // Show/Hide trash window @@ -3424,6 +3635,11 @@ public class NeverNote extends QMainWindow{ Global.showDeleted = false; newButton.setEnabled(true); menuBar.noteAdd.setEnabled(true); + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + menuBar.noteAddNewTab.setEnabled(false); + } else { + menuBar.noteAddNewTab.setEnabled(true); + } menuBar.noteAdd.setVisible(true); trashTree.blockSignals(true); trashTree.clearSelection(); @@ -3464,7 +3680,7 @@ public class NeverNote extends QMainWindow{ OAuthTokenizer tokenizer = new OAuthTokenizer(); AESEncrypter aes = new AESEncrypter(); try { - aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("oauth.txt"))); + aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("oauthkey.txt"))); } catch (FileNotFoundException e) { // File not found, so we'll just get empty strings anyway. } @@ -3508,6 +3724,7 @@ public class NeverNote extends QMainWindow{ Global.isConnected = syncRunner.isConnected; + boolean autoLoginMessageFlag = false; if (!Global.isConnected) { OAuthWindow window = new OAuthWindow(logger); if (window.error) { @@ -3526,7 +3743,7 @@ public class NeverNote extends QMainWindow{ } aes.setString(window.response); try { - aes.encrypt(new FileOutputStream(Global.getFileManager().getHomeDirFile("oauth.txt"))); + aes.encrypt(new FileOutputStream(Global.getFileManager().getHomeDirFile("oauthkey.txt"))); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -3534,6 +3751,7 @@ public class NeverNote extends QMainWindow{ syncRunner.authToken = tokenizer.oauth_token; syncRunner.enConnect(); Global.isConnected = syncRunner.isConnected; + autoLoginMessageFlag = true; } // Global.username = syncRunner.username; @@ -3541,9 +3759,16 @@ public class NeverNote extends QMainWindow{ return; setupOnlineMenu(); setupConnectMenuOptions(); + + // 初回ログイン時に自動ログインが無効だったら、有効化するか確認する + if (autoLoginMessageFlag && !Global.automaticLogin()) { + if (QMessageBox.question(this, tr("Confirmation"), tr("Are you sure you want to enable the auto-login feature?"), + QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) == StandardButton.Yes.value()) { + Global.setAutomaticLogin(true); + } + } + logger.log(logger.HIGH, "Leaving NeverNote.remoteConnect"); - - } private void setupConnectMenuOptions() { logger.log(logger.HIGH, "entering NeverNote.setupConnectMenuOptions"); @@ -3573,6 +3798,11 @@ public class NeverNote extends QMainWindow{ // clearNotebookFilter(); clearTrashFilter(); // clearSavedSearchFilter(); + + // ゴミ箱から元の画面に戻す。連想ノートリストをONに。 + if (!rensoNoteListDock.isEnabled()) { + rensoNoteListDock.setEnabled(true); + } if (attributeTreeSelected == null || item.nativeId() != attributeTreeSelected.nativeId()) { if (item.childCount() > 0) { @@ -3684,6 +3914,22 @@ public class NeverNote extends QMainWindow{ saveNote(); + // 右クリックだったときの処理 + if (QApplication.mouseButtons().isSet(MouseButton.RightButton)) { + // 選択されたノートのguidをselectedNoteGUIDsにセット + List selections = noteTableView.selectionModel().selectedRows(); + if(selections.size() > 0){ + selectedNoteGUIDs.clear(); + for(int i = 0; i < selections.size(); i++){ + int row = selections.get(i).row(); + QModelIndex index = noteTableView.proxyModel.index(row, Global.noteTableGuidPosition); + SortedMap ix = noteTableView.proxyModel.itemData(index); + selectedNoteGUIDs.add((String) ix.values().toArray()[0]); + } + } + return; + } + // If we have more than one selection, then set the merge note action to true. List selections = noteTableView.selectionModel().selectedRows(); if (selections.size() > 1) @@ -3693,14 +3939,26 @@ public class NeverNote extends QMainWindow{ // 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)) + // Shiftキーを押しながらの場合の処理も追加 + if ((QApplication.keyboardModifiers().isSet(KeyboardModifier.ControlModifier) || + QApplication.keyboardModifiers().isSet(KeyboardModifier.ShiftModifier)) && + QApplication.mouseButtons().isSet(MouseButton.LeftButton)){ + selectedNoteGUIDs.clear(); + for (int i=0; i ix = noteTableView.proxyModel.itemData(index); + selectedNoteGUIDs.add((String)ix.values().toArray()[0]); + } return; - - if (historyGuids.size() == 0) { - historyGuids.add(currentNoteGuid); - historyPosition = 1; } + + // IFIXED 恐らく不要なのでコメントアウト +// if (historyGuids.size() == 0) { +// historyGuids.add(currentNoteGuid); +// historyPosition = 1; +// } + noteTableView.showColumn(Global.noteTableGuidPosition); if (!Global.isColumnVisible("guid")) @@ -3712,6 +3970,9 @@ public class NeverNote extends QMainWindow{ menuBar.noteOnlineHistoryAction.setEnabled(true); menuBar.noteMergeAction.setEnabled(true); selectedNoteGUIDs.clear(); + if (currentNoteGuid != null && !currentNoteGuid.equals("") && !Global.showDeleted) { + menuBar.noteAddNewTab.setEnabled(true); + } if (selections.size() != 1 || Global.showDeleted) { menuBar.noteDuplicateAction.setEnabled(false); } @@ -3733,31 +3994,81 @@ public class NeverNote extends QMainWindow{ downButton.setEnabled(false); index = noteTableView.proxyModel.index(row, Global.noteTableGuidPosition); SortedMap ix = noteTableView.proxyModel.itemData(index); - currentNoteGuid = (String)ix.values().toArray()[0]; + + currentNoteGuid = (String)ix.values().toArray()[0]; selectedNoteGUIDs.add(currentNoteGuid); } } nextButton.setEnabled(true); prevButton.setEnabled(true); - if (!fromHistory) { - int endPosition = historyGuids.size()-1; - for (int j=historyPosition; j<=endPosition; j++) { - historyGuids.remove(historyGuids.size()-1); - } - historyGuids.add(currentNoteGuid); - historyPosition = historyGuids.size(); - } - if (historyPosition <= 1) - prevButton.setEnabled(false); - if (historyPosition == historyGuids.size()) - nextButton.setEnabled(false); - - fromHistory = false; + + int currentIndex = tabBrowser.currentIndex(); + ArrayList histGuids = historyGuids.get(currentIndex); + int histPosition = historyPosition.get(currentIndex); + boolean fromHist = fromHistory.get(currentIndex); + + if (!fromHist) { + int endPosition = histGuids.size() - 1; + + for (int j = histPosition; j <= endPosition; j++) { + histGuids.remove(histGuids.size() - 1); + } + histGuids.add(currentNoteGuid); + historyPosition.put(currentIndex, histGuids.size()); + histPosition = histGuids.size(); + } + if (histPosition <= 1){ + prevButton.setEnabled(false); + } + if (histPosition == histGuids.size()) + nextButton.setEnabled(false); + fromHistory.put(currentIndex, false); + fromHist = false; + scrollToGuid(currentNoteGuid); refreshEvernoteNote(true); + + if (currentNoteGuid != null && !currentNoteGuid.equals("")) { + if (!Global.showDeleted) { // ゴミ箱じゃなければ + addBrowseHistory(); + } + } + + // 連想ノートリストを更新 + rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid); + + waitCursor(false); logger.log(logger.HIGH, "Leaving NeverNote.noteTableSelection"); - } + } + + // 複数ノートの同時閲覧履歴をデータベースに保存 + private void addBrowseHistory() { + // このノートと他のタブウィンドウノートの関連性を内部データベースのHistoryテーブルに登録 + if (tabWindows.size() >= 2) { + Iterator it = tabWindows.keySet().iterator(); + while (it.hasNext()) { + int tabIndex = it.next(); + String nextGuid = ((TabBrowse) tabBrowser.widget(tabIndex)).getBrowserWindow().getNote().getGuid(); + // guid1=guid2のデータは登録しない + if (!currentNoteGuid.equals(nextGuid)) { + conn.getHistoryTable().addHistory("browse", currentNoteGuid, nextGuid); + } + } + } + // このノートと他の外部ウィンドウノートの関連性を内部データベースのHistoryテーブルに登録 + if (externalWindows.size() >= 1) { + Iterator it = externalWindows.keySet().iterator(); + while (it.hasNext()) { + String nextGuid = it.next(); + // guid1=guid2のデータは登録しない + if (!currentNoteGuid.equals(nextGuid)) { + conn.getHistoryTable().addHistory("browse", currentNoteGuid, nextGuid); + } + } + } + } + // Trigger a refresh when the note db has been updated private void noteIndexUpdated(boolean reload) { logger.log(logger.HIGH, "Entering NeverNote.noteIndexUpdated"); @@ -3795,9 +4106,12 @@ public class NeverNote extends QMainWindow{ String saveCurrentNoteGuid = new String(); String tempNoteGuid = new String(); - - historyGuids.clear(); - historyPosition = 0; + + int currentIndex = tabBrowser.currentIndex(); + ArrayList histGuids = historyGuids.get(currentIndex); + histGuids.clear(); + historyPosition.put(currentIndex, 0); + prevButton.setEnabled(false); nextButton.setEnabled(false); @@ -3817,9 +4131,10 @@ public class NeverNote extends QMainWindow{ currentNote = null; browserWindow.clear(); browserWindow.setDisabled(true); + waitCursor(false); } - if (Global.showDeleted && listManager.getNotebookIndex().size() > 0 && saveCurrentNoteGuid.equals("")) { + if (Global.showDeleted && listManager.getNoteIndex().size() > 0 && saveCurrentNoteGuid.equals("")) { currentNoteGuid = listManager.getNoteIndex().get(0).getGuid(); saveCurrentNoteGuid = currentNoteGuid; refreshEvernoteNote(true); @@ -3834,48 +4149,67 @@ public class NeverNote extends QMainWindow{ logger.log(logger.HIGH, "Leaving NeverNote.refreshEvernoteNoteList"); } - // Called when the previous arrow button is clicked - @SuppressWarnings("unused") + + // Called when the previous arrow button is clicked + @SuppressWarnings("unused") private void previousViewedAction() { - if (!prevButton.isEnabled()) - return; - if (historyPosition == 0) - return; - historyPosition--; - if (historyPosition <= 0) - return; - String historyGuid = historyGuids.get(historyPosition-1); - fromHistory = true; - for (int i=0; i ix = noteTableView.model().itemData(modelIndex); - String tableGuid = (String)ix.values().toArray()[0]; - if (tableGuid.equals(historyGuid)) { - noteTableView.selectRow(i); - return; - } - } - } - } + int currentIndex = tabBrowser.currentIndex(); + ArrayList histGuids = historyGuids.get(currentIndex); + int histPosition = historyPosition.get(currentIndex); + boolean fromHist = fromHistory.get(currentIndex); + if (!prevButton.isEnabled()) + return; + if (histPosition == 0) + return; + histPosition--; + historyPosition.put(currentIndex, histPosition); + if (histPosition <= 0) + return; + String historyGuid = histGuids.get(histPosition - 1); + fromHistory.put(currentIndex, true); + fromHist = true; + for (int i = 0; i < noteTableView.model().rowCount(); i++) { + QModelIndex modelIndex = noteTableView.model().index(i, + Global.noteTableGuidPosition); + if (modelIndex != null) { + SortedMap ix = noteTableView.model().itemData( + modelIndex); + String tableGuid = (String) ix.values().toArray()[0]; + if (tableGuid.equals(historyGuid)) { + noteTableView.selectRow(i); + return; + } + } + } + } + @SuppressWarnings("unused") private void nextViewedAction() { if (!nextButton.isEnabled()) return; - String historyGuid = historyGuids.get(historyPosition); - historyPosition++; - fromHistory = true; - for (int i=0; i ix = noteTableView.model().itemData(modelIndex); - String tableGuid = (String)ix.values().toArray()[0]; - if (tableGuid.equals(historyGuid)) { - noteTableView.selectRow(i); - return; - } - } - } + + int currentIndex = tabBrowser.currentIndex(); + ArrayList histGuids = historyGuids.get(currentIndex); + int histPosition = historyPosition.get(currentIndex); + boolean fromHist = fromHistory.get(currentIndex); + String historyGuid = histGuids.get(histPosition); + histPosition++; + historyPosition.put(currentIndex, histPosition); + fromHistory.put(currentIndex, true); + fromHist = true; + for (int i = 0; i < noteTableView.model().rowCount(); i++) { + QModelIndex modelIndex = noteTableView.model().index(i, + Global.noteTableGuidPosition); + if (modelIndex != null) { + SortedMap ix = noteTableView.model().itemData( + modelIndex); + String tableGuid = (String) ix.values().toArray()[0]; + if (tableGuid.equals(historyGuid)) { + noteTableView.selectRow(i); + return; + } + } + } } // Called when the up arrow is clicked @SuppressWarnings("unused") @@ -4224,8 +4558,7 @@ public class NeverNote extends QMainWindow{ listManager.updateNoteMetadata(meta); noteTableView.proxyModel.addGuid(selectedNoteGUIDs.get(j), meta); } - - logger.log(logger.EXTREME, "Leaving NeverNote.setNoteDirty()"); + logger.log(logger.EXTREME, "Leaving NeverNote.notePinned()"); } // Wide list was chosen public void narrowListView() { @@ -4249,7 +4582,8 @@ public class NeverNote extends QMainWindow{ menuBar.narrowListView.blockSignals(false); mainLeftRightSplitter.addWidget(noteTableView); - mainLeftRightSplitter.addWidget(browserWindow); + mainLeftRightSplitter.addWidget(tabBrowser); + restoreWindowState(false); noteTableView.repositionColumns(); noteTableView.resizeColumnWidths(); @@ -4288,7 +4622,8 @@ public class NeverNote extends QMainWindow{ menuBar.narrowListView.blockSignals(false); browserIndexSplitter.setVisible(true); browserIndexSplitter.addWidget(noteTableView); - browserIndexSplitter.addWidget(browserWindow); + browserIndexSplitter.addWidget(tabBrowser); + restoreWindowState(false); noteTableView.repositionColumns(); noteTableView.resizeColumnWidths(); @@ -4356,10 +4691,12 @@ public class NeverNote extends QMainWindow{ 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); + ExternalBrowse newBrowser = new ExternalBrowse(conn, cbObserver); + newBrowser.setWindowIcon(appIcon); externalWindows.put(guid, newBrowser); showEditorButtons(newBrowser.getBrowserWindow()); @@ -4394,45 +4731,302 @@ public class NeverNote extends QMainWindow{ private void externalWindowClosing(String guid) { externalWindows.remove(guid); } - - + // *************************************************************** + // *************************************************************** + // ** タブウィンドウの機能 + // *************************************************************** + // *************************************************************** + @SuppressWarnings("unused") + private void openNewTab() { + saveNote(); + + // selectedNoteGUIDsをディープコピー + List copySelected = new ArrayList(selectedNoteGUIDs); + + for (int i=0; i < copySelected.size() ; i++) { + openTabEditor(copySelected.get(i)); + } + } + + // 連想ノートリストから新しいタブで開く + @SuppressWarnings("unused") + private void openNewTabFromRNL(){ + if(rensoNotePressedItemGuid != null){ + String prevCurrentNoteGuid = new String(currentNoteGuid); + + saveNote(); + openTabEditor(rensoNotePressedItemGuid); + + // 連想ノートリストアイテムクリック操作を記録 + conn.getHistoryTable().addHistory("rensoItemClick", prevCurrentNoteGuid, rensoNotePressedItemGuid); + } + } + + private void openTabEditor(String guid) { + + Note note = conn.getNoteTable().getNote(guid, true, true, false, true, true); + // 新しいタブエディタを作成 + TabBrowse newBrowser = new TabBrowse(conn, tabBrowser, cbObserver); + showEditorButtons(newBrowser.getBrowserWindow()); + + String noteTitle = note.getTitle(); + int index = tabBrowser.addNewTab(newBrowser, noteTitle); + tabWindows.put(index, newBrowser); + noteDirty.put(index, false); + + // noteTableViewの選択を変更するとselectionChangedが発生してしまうので一度切断 + noteTableView.selectionModel().selectionChanged.disconnect(this, "noteTableSelection()"); + loadNoteBrowserInformation(newBrowser.getBrowserWindow(), guid, note); + // 再接続 + noteTableView.selectionModel().selectionChanged.connect(this, "noteTableSelection()"); + + setupBrowserWindowListeners(newBrowser.getBrowserWindow(), false); + + // ExtendedInformationを必要があれば表示する + toggleNoteInformation(); + // Sourceを必要があれば表示する + viewSource(); + // EditorButtonsBarを必要があれば表示する + toggleEditorButtonBar(); + + // 履歴記録のハッシュマップを初期化 + ArrayList histGuids = new ArrayList(); + historyGuids.put(index, histGuids); + historyPosition.put(index, 0); + fromHistory.put(index, false); + + // 履歴に今開いたノートを追加 + histGuids.add(guid); + historyPosition.put(index, histGuids.size()); + + tabBrowser.setCurrentIndex(index); + + if (guid != null && !guid.equals("")) { + if (!Global.showDeleted) { // ゴミ箱じゃなければ + addBrowseHistory(); + } + } + } + + // タブが閉じられた + @SuppressWarnings("unused") + private void tabCloseRequested(int index) { + tabWindowClosing((TabBrowse)tabBrowser.widget(index)); + } + + // タブが閉じられた + private void tabWindowClosing(TabBrowse tab) { + // タブが1つしかなかったら閉じない + if (tabBrowser.count() <= 1) { + return; + } + + int index = tabBrowser.indexOf(tab); +// String guid = tab.getBrowserWindow().getNote().getGuid(); +// String content = tab.getBrowserWindow().getContent(); + BrowserWindow browser = tab.getBrowserWindow(); +// // ノートが変更されていたら保存 +// if (tab.getNoteDirty()) { +// saveNoteTabBrowser(guid, content, true, browser); +// } + + // シグナル切断 + browser.noteSignal.tagsChanged.disconnect(); + browser.noteSignal.titleChanged.disconnect(); + browser.noteSignal.noteChanged.disconnect(); + browser.noteSignal.notebookChanged.disconnect(); + browser.noteSignal.createdDateChanged.disconnect(); + browser.noteSignal.alteredDateChanged.disconnect(); + + // ノートを削除 + tabWindows.remove(index); + tabBrowser.removeTab(index); + noteDirty.remove(index); + inkNote.remove(index); + readOnly.remove(index); + + // 履歴記録のハッシュマップを削除 + historyGuids.remove(index); + historyPosition.remove(index); + fromHistory.remove(index); + + // タブのインデックスを更新(削除によって空いた部分を詰める) + for(int i = index ; tabWindows.containsKey(i + 1) ; i++){ + // tabWindows + TabBrowse nextTab = tabWindows.get(i + 1); + tabWindows.put(i, nextTab); + tabWindows.remove(i + 1); + // noteDirty + boolean isNoteDirty = noteDirty.get(i + 1); + noteDirty.put(i, isNoteDirty); + noteDirty.remove(i + 1); + // inkNote + boolean isInkNote = inkNote.get(i + 1); + inkNote.put(i, isInkNote); + inkNote.remove(i + 1); + // readOnly + boolean isReadOnly = readOnly.get(i + 1); + readOnly.put(i, isReadOnly); + readOnly.remove(i + 1); + // historyGuids + ArrayList histGuids = historyGuids.get(i + 1); + historyGuids.put(i, histGuids); + historyGuids.remove(i + 1); + // historyPosition + int histPosition = historyPosition.get(i + 1); + historyPosition.put(i, histPosition); + historyPosition.remove(i + 1); + // fromHistory + boolean fromHist = fromHistory.get(i + 1); + fromHistory.put(i, fromHist); + fromHistory.remove(i + 1); + } + + // タブが残り1つになったら、閉じるボタンを消す + if (tabBrowser.count() == 1) { + tabBrowser.hideTabCloseButton(0); + } + + // タブの閉じるボタンを押すと、tabWindowClosingより先にtabWindowChangedが呼ばれてしまうので、手動で呼びなおす + tabWindowChanged(tabBrowser.currentIndex()); + } + + @SuppressWarnings("unused") + private void noteAddNewTab() { + saveNote(); + + // ノートを何も開いていないときは現在のタブにノート追加 + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + addNote(); + return; + } + + // ノート追加前に開いていたノートとの関連性を記録するためにguidをとっておく + TabBrowse prevTab = (TabBrowse)tabBrowser.currentWidget(); + String prevTabGuid = null; + if (prevTab.getBrowserWindow() != null && prevTab.getBrowserWindow().getNote() != null) { + prevTabGuid = prevTab.getBrowserWindow().getNote().getGuid(); + } + + openEmptyTabEditor(); + addNote(); + + // 追加されたノートのguidを取得し、ノート追加操作履歴としてデータベースに登録 + if (prevTabGuid != null && !prevTabGuid.equals("")) { + TabBrowse addedTab = (TabBrowse)tabBrowser.currentWidget(); + String addedTabGuid = addedTab.getBrowserWindow().getNote().getGuid(); + if (addedTabGuid != null && !addedTabGuid.equals("")) { + if (!prevTabGuid.equals(addedTabGuid)) { + conn.getHistoryTable().addHistory("addNewNote", prevTabGuid, addedTabGuid); + } + } + } + } + + private void openEmptyTabEditor() { + // 新しいタブエディタを作成 + TabBrowse newBrowser = new TabBrowse(conn, tabBrowser, cbObserver); + showEditorButtons(newBrowser.getBrowserWindow()); + + setupBrowserWindowListeners(newBrowser.getBrowserWindow(), false); + + int index = tabBrowser.addNewTab(newBrowser, ""); + tabWindows.put(index, newBrowser); + noteDirty.put(index, false); + + // ExtendedInformationを必要があれば表示する + toggleNoteInformation(); + // Sourceを必要があれば表示する + viewSource(); + // EditorButtonsBarを必要があれば表示する + toggleEditorButtonBar(); + + // 履歴記録のハッシュマップを初期化 + ArrayList histGuids = new ArrayList(); + historyGuids.put(index, histGuids); + historyPosition.put(index, 0); + fromHistory.put(index, false); + + tabBrowser.setCurrentIndex(index); + } + //*************************************************************** //*************************************************************** //** These functions deal with Note specific things //*************************************************************** //*************************************************************** private void setNoteDirty() { + for (String guid: selectedNoteGUIDs) { + setNoteDirty(guid); + } + } + + private void setNoteDirty(String targetGuid) { logger.log(logger.EXTREME, "Entering NeverNote.setNoteDirty()"); // Find if the note is being edited externally. If it is, update it. - if (externalWindows.containsKey(currentNoteGuid)) { + if (externalWindows.containsKey(targetGuid)) { QTextCodec codec = QTextCodec.codecForName("UTF-8"); QByteArray unicode = codec.fromUnicode(browserWindow.getContent()); - ExternalBrowse window = externalWindows.get(currentNoteGuid); + ExternalBrowse window = externalWindows.get(targetGuid); window.getBrowserWindow().setContent(unicode); } + // 他のタブで同じノートを開いていないか探す。もしあったら、内容を更新する。 + Collection tabIndexes = tabWindows.keySet(); + Iterator indexIterator = tabIndexes.iterator(); + + for (TabBrowse tab: tabWindows.values()) { + int index = indexIterator.next(); + String guid = tab.getBrowserWindow().getNote().getGuid(); + + QTextCodec codec = QTextCodec.codecForName("UTF-8"); + QByteArray unicode = codec.fromUnicode(browserWindow.getContent()); + + if (guid.equals(guid)) { + if (index != tabBrowser.currentIndex()) { + TabBrowse window = tabWindows.get(index); + window.getBrowserWindow().setContent(unicode); + } + } + } + + // ターゲットノートがタブで開かれていて、かつDirty = trueかどうかを取得する // If the note is dirty, then it is unsynchronized by default. - if (noteDirty) + int index = -1; + boolean isNoteDirty = false; + for (TabBrowse tab: tabWindows.values()) { + if (tab.getBrowserWindow().getNote().getGuid().equals(targetGuid)) { + index = tabBrowser.indexOf(tab); + isNoteDirty = noteDirty.get(index); + break; + } + } + if (isNoteDirty) { return; + } // Set the note as dirty and check if its status is synchronized in the display table - noteDirty = true; - if (listManager.getNoteMetadata().containsKey(currentNoteGuid) && - listManager.getNoteMetadata().get(currentNoteGuid).isDirty()) { + // まだダーティでなく、かつタブで開かれている場合にnoteDirty = trueにする + if (index >= 0) { + noteDirty.put(index, true); + } + + if (listManager.getNoteMetadata().containsKey(targetGuid) && + listManager.getNoteMetadata().get(targetGuid).isDirty()) { return; } // If this wasn't already marked as unsynchronized, then we need to update the table - listManager.getNoteTableModel().updateNoteSyncStatus(currentNoteGuid, false); -// listManager.getUnsynchronizedNotes().add(currentNoteGuid); + listManager.getNoteTableModel().updateNoteSyncStatus(targetGuid, false); +// listManager.getUnsynchronizedNotes().add(targetGuid); for (int i=0; i ix = listManager.getNoteTableModel().itemData(modelIndex); String tableGuid = (String)ix.values().toArray()[0]; - if (tableGuid.equals(currentNoteGuid)) { + if (tableGuid.equals(targetGuid)) { listManager.getNoteTableModel().proxyModel.setData(i, Global.noteTableSynchronizedPosition, "false"); return; } @@ -4448,7 +5042,8 @@ public class NeverNote extends QMainWindow{ noteCache.remove(guid); noteCache.put(guid, unicode.toString()); if (guid.equals(currentNoteGuid)) { - noteDirty = true; + int index = tabBrowser.currentIndex(); + noteDirty.put(index, true); browserWindow.setContent(unicode); } if (save) { @@ -4457,12 +5052,36 @@ public class NeverNote extends QMainWindow{ } } + +// private void saveNoteTabBrowser(String guid, String content, Boolean save, +// BrowserWindow browser) { +// QTextCodec codec = QTextCodec.codecForName("UTF-8"); +// QByteArray unicode = codec.fromUnicode(content); +// noteCache.remove(guid); +// noteCache.put(guid, unicode.toString()); +// if (save) { +// thumbnailRunner.addWork("GENERATE " + guid); +// saveNote(guid, browser); +// } +// } + private void saveNote() { - if (noteDirty) { - saveNote(currentNoteGuid, browserWindow); - thumbnailRunner.addWork("GENERATE "+ currentNoteGuid); - noteDirty = false; - } + // すべてのタブに対して、Dirtyを確認し、trueならセーブする + Collection dirtyIndex = noteDirty.keySet(); + Iterator indexIterator = dirtyIndex.iterator(); + for (boolean isNoteDirty: noteDirty.values()) { + int index = indexIterator.next(); + if (isNoteDirty) { + if (index < 0) { + return; + } + BrowserWindow b = tabWindows.get(index).getBrowserWindow(); + String guid = b.getNote().getGuid(); + saveNote(guid, b); + thumbnailRunner.addWork("GENERATE "+ guid); + noteDirty.put(index, false); + } + } } private void saveNote(String guid, BrowserWindow window) { logger.log(logger.EXTREME, "Inside NeverNote.saveNote()"); @@ -4498,12 +5117,14 @@ public class NeverNote extends QMainWindow{ browserWindow.setEnabled(false); return; } - inkNote = false; - readOnly = false; - if (Global.showDeleted || currentNoteGuid == null || currentNoteGuid.equals("")) - readOnly = true; + inkNote.put(tabBrowser.currentIndex(), false); + readOnly.put(tabBrowser.currentIndex(), false); + + if (Global.showDeleted || currentNoteGuid == null || currentNoteGuid.equals("")) { + readOnly.put(tabBrowser.currentIndex(), true); + } Global.cryptCounter =0; - if (readOnly) { + if (readOnly.get(tabBrowser.currentIndex())) { browserWindow.setReadOnly(true); } @@ -4514,8 +5135,13 @@ public class NeverNote extends QMainWindow{ browserWindow.loadingData(true); currentNote = conn.getNoteTable().getNote(currentNoteGuid, true,true,false,false,true); - if (currentNote == null) + if (currentNote == null) { + waitCursor(false); return; + } + + tabBrowser.setTabTitle(tabBrowser.currentIndex(), currentNote.getTitle()); + loadNoteBrowserInformation(browserWindow, currentNoteGuid, currentNote); } @@ -4524,6 +5150,16 @@ public class NeverNote extends QMainWindow{ formatter.setNote(note, Global.pdfPreview()); formatter.setHighlight(listManager.getEnSearch()); QByteArray js; + int tabIndex = -1; + + // 対象のタブインデックスを取得 + for (TabBrowse tab: tabWindows.values()) { + if (tab.getBrowserWindow() == browser) { + tabIndex = tabBrowser.indexOf(tab); + break; + } + } + if (!noteCache.containsKey(guid)) { js = new QByteArray(); // We need to prepend the note with or encoded characters are ugly @@ -4548,43 +5184,58 @@ public class NeverNote extends QMainWindow{ noteCache.put(guid, js.toString()); if (formatter.resourceError) - resourceErrorMessage(); + resourceErrorMessage(tabIndex); if (formatter.formatError) { waitCursor(false); QMessageBox.information(this, tr("Error"), - tr("NixNote had issues formatting this note." + + tr("NeighborNote 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) + + if (tabIndex >= 0) { + readOnly.put(tabIndex, formatter.readOnly); + inkNote.put(tabIndex, formatter.inkNote); + } + + if (tabIndex >= 0 && readOnly.get(tabIndex)) { readOnlyCache.put(guid, true); - if (inkNote) + } + if (tabIndex >= 0 && inkNote.get(tabIndex)) { inkNoteCache.put(guid, true); + } + } else { logger.log(logger.HIGH, "Note content is being pulled from the cache"); String cachedContent = formatter.modifyCachedTodoTags(noteCache.get(guid)); js = new QByteArray(cachedContent); browser.setContent(js); - if (readOnlyCache.containsKey(guid)) - readOnly = true; - if (inkNoteCache.containsKey(guid)) - inkNote = true; + if (readOnlyCache.containsKey(guid) && tabIndex >= 0) { + readOnly.put(tabIndex, true); + } else { + readOnly.put(tabIndex, false); + } + if (inkNoteCache.containsKey(guid) && tabIndex >= 0) { + inkNote.put(tabIndex, true); + } else { + inkNote.put(tabIndex, false); + } } if (conn.getNoteTable().isThumbnailNeeded(guid)) { thumbnailHTMLReady(guid, js, Global.calculateThumbnailZoom(js.toString())); } - if (readOnly || inkNote || - (note.getAttributes() != null && note.getAttributes().getContentClass() != null && note.getAttributes().getContentClass() != "")) + if (tabIndex >= 0 && (readOnly.get(tabIndex) || inkNote.get(tabIndex) || + (note.getAttributes() != null && note.getAttributes().getContentClass() != null && note.getAttributes().getContentClass() != ""))) 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); + if (tabIndex >= 0) { + browser.setReadOnly(readOnly.get(tabIndex)); + deleteButton.setEnabled(!readOnly.get(tabIndex)); + tagButton.setEnabled(!readOnly.get(tabIndex)); + menuBar.noteDelete.setEnabled(!readOnly.get(tabIndex)); + menuBar.noteTags.setEnabled(!readOnly.get(tabIndex)); + } browser.setNote(note); if (note != null && note.getNotebookGuid() != null && @@ -4625,7 +5276,14 @@ public class NeverNote extends QMainWindow{ browser.setAllTags(tagList); browser.setCurrentTags(note.getTagNames()); - noteDirty = false; + for (TabBrowse tab: tabWindows.values()) { + if (tab.getBrowserWindow().getNote().getGuid().equals(guid)) { + int index = tabBrowser.indexOf(tab); + noteDirty.put(index, false); + break; + } + } + scrollToGuid(guid); browser.loadingData(false); @@ -4638,14 +5296,32 @@ public class NeverNote extends QMainWindow{ waitCursor(false); logger.log(logger.HIGH, "Leaving NeverNote.refreshEvernoteNote"); } + + @SuppressWarnings("unused") + private void toggleNoteAttributes() { + menuBar.noteAttributes.setChecked(!menuBar.noteAttributes.isChecked()); + toggleNoteInformation(); + } + // Save a generated thumbnail private void toggleNoteInformation() { logger.log(logger.HIGH, "Entering NeverNote.toggleNoteInformation"); - browserWindow.toggleInformation(); + + boolean isChecked = menuBar.noteAttributes.isChecked(); + + for(int i = 0; i < tabBrowser.count(); i++){ + BrowserWindow browser = ((TabBrowse) tabBrowser.widget(i)).getBrowserWindow(); + boolean isExtended = browser.isExtended(); + if((isChecked && !isExtended) || (!isChecked && isExtended)){ + browser.toggleInformation(); + } + } + menuBar.noteAttributes.setChecked(browserWindow.isExtended()); Global.saveWindowVisible("noteInformation", browserWindow.isExtended()); logger.log(logger.HIGH, "Leaving NeverNote.toggleNoteInformation"); } + // Listener triggered when a print button is pressed @SuppressWarnings("unused") private void printNote() { @@ -4728,6 +5404,7 @@ 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(); @@ -4750,11 +5427,17 @@ public class NeverNote extends QMainWindow{ return; } } - if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) + if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) { selectedNoteGUIDs.add(currentNoteGuid); - for (int i=0; i deleteNoteGUIDs = new ArrayList(selectedNoteGUIDs); // タブを閉じるとselectedNoteGUIDsが変わってしまうのでその前にコピー + closeTabs(selectedNoteGUIDs); + for (String guid : deleteNoteGUIDs) { + listManager.deleteNote(guid); + } + + closeExternalWindows(deleteNoteGUIDs); } else { // If we are deleting from the trash. if (Global.verifyDelete()) { @@ -4769,36 +5452,90 @@ public class NeverNote extends QMainWindow{ } if (QMessageBox.question(this, "Confirmation", msg, QMessageBox.StandardButton.Yes, - QMessageBox.StandardButton.No)==StandardButton.No.value()) { + QMessageBox.StandardButton.No)==StandardButton.No.value()) { return; } } if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals("")) selectedNoteGUIDs.add(currentNoteGuid); - for (int i=selectedNoteGUIDs.size()-1; i>=0; i--) { + + List deleteNoteGUIDs = new ArrayList(selectedNoteGUIDs); // タブを閉じるとselectedNoteGUIDsが変わってしまうのでその前にコピー + for (int i=deleteNoteGUIDs.size()-1; i>=0; i--) { for (int j=listManager.getNoteTableModel().rowCount()-1; j>=0; j--) { QModelIndex modelIndex = listManager.getNoteTableModel().index(j, Global.noteTableGuidPosition); if (modelIndex != null) { SortedMap ix = listManager.getNoteTableModel().itemData(modelIndex); String tableGuid = (String)ix.values().toArray()[0]; - if (tableGuid.equals(selectedNoteGUIDs.get(i))) { + if (tableGuid.equals(deleteNoteGUIDs.get(i))) { listManager.getNoteTableModel().removeRow(j); j=-1; } } } - listManager.expungeNote(selectedNoteGUIDs.get(i)); + closeTab(deleteNoteGUIDs.get(i)); + listManager.expungeNote(deleteNoteGUIDs.get(i)); + + conn.getHistoryTable().expungeHistory(deleteNoteGUIDs.get(i)); + conn.getExcludedTable().expungeExcludedNote(deleteNoteGUIDs.get(i)); + conn.getStaredTable().expungeStaredNote(deleteNoteGUIDs.get(i)); } + + closeExternalWindows(deleteNoteGUIDs); } - currentNoteGuid = ""; + + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + menuBar.noteAddNewTab.setEnabled(false); + } + listManager.loadNotesIndex(); noteIndexUpdated(false); refreshEvernoteNote(true); scrollToGuid(currentNoteGuid); logger.log(logger.HIGH, "Leaving NeverNote.deleteNote"); } + + // 対象ノートをタブで開いていたら閉じる + private void closeTabs(List noteGUIDs) { + for (String guid : noteGUIDs) { + closeTab(guid); + } + } + + // 対象ノートをタブで開いていたら閉じる + private void closeTab(String noteGUID) { + List closeTabs = new ArrayList(); + + for (TabBrowse tab : tabWindows.values()) { + String guid = tab.getBrowserWindow().getNote().getGuid(); + + if (guid.equals(noteGUID)) { + closeTabs.add(tab); + } + } + + for (TabBrowse tab : closeTabs) { + tabWindowClosing(tab); + } + } + + // 対象ノートを外部ウィンドウで開いていたら閉じる + private void closeExternalWindows(List noteGUIDs) { + List closeWindows = new ArrayList(); + + for (Map.Entry e : externalWindows.entrySet()) { + for (String guid : noteGUIDs) { + if (guid.equals(e.getKey())) { + closeWindows.add(e.getValue()); + } + } + } + + for (ExternalBrowse externalBrowse : closeWindows) { + externalBrowse.close(); + } + } + // Add a new note - @SuppressWarnings("unused") private void addNote() { logger.log(logger.HIGH, "Inside NeverNote.addNote"); // browserWindow.setEnabled(true); @@ -4900,9 +5637,20 @@ public class NeverNote extends QMainWindow{ listManager.addNote(newNote, metadata); // noteTableView.insertRow(newNote, true, -1); + String prevCurrentNoteGuid = new String(currentNoteGuid); + currentNote = newNote; currentNoteGuid = currentNote.getGuid(); - noteTableView.clearSelection(); + // IFIXED こいつのせいで、ノート追加時にcurrentNoteGuidが更新されないので消す + // noteTableView.clearSelection(); + + // 新規に作成したノートとそれまで開いていたノートの関連性を追加 + if (prevCurrentNoteGuid != null && !prevCurrentNoteGuid.equals("")) { + if (currentNoteGuid != null && !currentNoteGuid.equals("")) { + conn.getHistoryTable().addHistory("addNewNote", prevCurrentNoteGuid, currentNoteGuid); + } + } + refreshEvernoteNote(true); listManager.countNotebookResults(listManager.getNoteIndex()); browserWindow.titleLabel.setFocus(); @@ -4987,6 +5735,13 @@ public class NeverNote extends QMainWindow{ b.getBrowserWindow().getNote().setGuid(newGuid); externalWindows.put(newGuid, b); } + + for(int i = 0; i < tabBrowser.count(); i++){ + TabBrowse b = (TabBrowse)tabBrowser.widget(i); + if (b.getBrowserWindow().getNote().getGuid().equals(oldGuid)) { + b.getBrowserWindow().getNote().setGuid(newGuid); + } + } for (int i=0; i windows = externalWindows.values(); + Iterator windowIterator = windows.iterator(); + Collection guids = externalWindows.keySet(); + Iterator guidIterator = guids.iterator(); + List closeWindows = new ArrayList(); + + while (windowIterator.hasNext()) { + ExternalBrowse browser = windowIterator.next(); + String guid = guidIterator.next(); + + for (int i = 0; i < sources.size(); i++) { + if (guid.equals(sources.get(i))) { + closeWindows.add(browser); + } + } + } + + for (int i = closeWindows.size() - 1; i >= 0; i--) { + closeWindows.get(i).close(); + } + + // マージしたノート(child)をタブで開いていたら、閉じる + List closeTabs = new ArrayList(); + for (TabBrowse tab : tabWindows.values()) { + String guid = tab.getBrowserWindow().getNote().getGuid(); + + for (String source : sources) { + if (guid.equals(source)) { + closeTabs.add(tab); + } + } + } + for (TabBrowse tab : closeTabs) { + tabWindowClosing(tab); + } + noteIndexUpdated(false); + // IFIXED + // マージ後の新しいノートコンテンツを表示するためキャッシュを削除 + noteCache.remove(masterGuid); + refreshEvernoteNote(true); waitCursor(false); } @@ -5254,7 +6087,7 @@ public class NeverNote extends QMainWindow{ } } 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. "+ + tr("\".\n\nThis is probably due to a document that is too complex for NeighborNote 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."); @@ -5330,6 +6163,9 @@ public class NeverNote extends QMainWindow{ setMessage("EDAMUserException: " +e.getMessage()); return; } catch (EDAMSystemException e) { + if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) { + QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") + + e.getRateLimitDuration() + tr(" seconds.")); + } setMessage("EDAMSystemException: " +e.getMessage()); return; } catch (EDAMNotFoundException e) { @@ -5343,7 +6179,8 @@ public class NeverNote extends QMainWindow{ // If we've gotten this far, we have a good note. if (historyWindow == null) { - historyWindow = new OnlineNoteHistory(logger, conn); + historyWindow = new OnlineNoteHistory(logger, conn, cbObserver); + historyWindow.historyCombo.activated.connect(this, "reloadHistoryWindow(String)"); historyWindow.restoreAsNew.clicked.connect(this, "restoreHistoryNoteAsNew()"); historyWindow.restore.clicked.connect(this, "restoreHistoryNote()"); @@ -5388,6 +6225,9 @@ public class NeverNote extends QMainWindow{ waitCursor(false); return null; } catch (EDAMSystemException e) { + if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) { + QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") + + e.getRateLimitDuration() + tr(" seconds.")); + } setMessage("EDAMSystemException: " +e.getMessage()); waitCursor(false); return null; @@ -5452,6 +6292,9 @@ public class NeverNote extends QMainWindow{ setMessage("EDAMUserException: " +e.getMessage()); return; } catch (EDAMSystemException e) { + if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) { + QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") + + e.getRateLimitDuration() + tr(" seconds.")); + } setMessage("EDAMSystemException: " +e.getMessage()); return; } catch (TException e) { @@ -5577,8 +6420,11 @@ public class NeverNote extends QMainWindow{ //********************************************************** //********************************************************** // An error has happended fetching a resource. let the user know - private void resourceErrorMessage() { - if (inkNote) + private void resourceErrorMessage(int tabIndex) { + if (tabIndex < 0) { + return; + } + if (inkNote.get(tabIndex)) return; waitCursor(false); QMessageBox.information(this, tr("DOUGH!!!"), tr("Well, this is embarrassing."+ @@ -5591,7 +6437,7 @@ public class NeverNote extends QMainWindow{ "Don't get angry. I'm doing it to prevent you from messing up\n"+ "this note on the Evernote servers. Sorry."+ "\n\nP.S. You might want to re-synchronize to see if it corrects this problem.\nWho knows, you might get lucky.")); - inkNote = true; + inkNote.put(tabIndex, true); browserWindow.setReadOnly(true); waitCursor(true); } @@ -5697,7 +6543,22 @@ public class NeverNote extends QMainWindow{ public void refreshLists() { logger.log(logger.EXTREME, "Entering NeverNote.refreshLists"); updateQuotaBar(); - listManager.refreshLists(currentNote, noteDirty, browserWindow.getContent()); + // すべてのタブのノートを調べて、Dirtyならばセーブする。その後refreshListsする。 + Collection tabIndex = noteDirty.keySet(); + Iterator indexIterator = tabIndex.iterator(); + HashMap saveNotes = new HashMap(); + HashMap saveContents = new HashMap(); + for (boolean isNoteDirty: noteDirty.values()) { + int index = indexIterator.next(); + if (isNoteDirty) { + saveNotes.put(index, tabWindows.get(index).getBrowserWindow().getNote()); + saveContents.put(index, tabWindows.get(index).getBrowserWindow().getContent()); + } + } + + listManager.saveUpdatedNotes(saveNotes, saveContents); + listManager.refreshLists(); + tagIndexUpdated(true); notebookIndexUpdated(); savedSearchIndexUpdated(); @@ -5755,7 +6616,7 @@ public class NeverNote extends QMainWindow{ thumbnailRunner.interrupt = true; indexRunner.addWork("SCAN"); } - logger.log(logger.EXTREME, "Leaving NixNote index timer"); + logger.log(logger.EXTREME, "Leaving NeighborNote index timer"); } @SuppressWarnings("unused") @@ -5789,7 +6650,7 @@ public class NeverNote extends QMainWindow{ tagDeadCount++; if (tagDeadCount > MAX && !disableTagThreadCheck) { 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.")); + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); disableTagThreadCheck = true; } } else @@ -5800,7 +6661,7 @@ public class NeverNote extends QMainWindow{ notebookThreadDeadCount++; if (notebookThreadDeadCount > MAX && !disableNotebookThreadCheck) { 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.")); + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); disableNotebookThreadCheck=true; } } else @@ -5811,7 +6672,7 @@ public class NeverNote extends QMainWindow{ trashDeadCount++; if (trashDeadCount > MAX && !disableTrashThreadCheck) { 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.")); + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); disableTrashThreadCheck = true; } } else @@ -5822,7 +6683,7 @@ public class NeverNote extends QMainWindow{ saveThreadDeadCount++; if (saveThreadDeadCount > MAX && !disableSaveThreadCheck) { 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.")); + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); disableSaveThreadCheck = true; } } else @@ -5832,7 +6693,7 @@ public class NeverNote extends QMainWindow{ syncThreadDeadCount++; if (syncThreadDeadCount > MAX && !disableSyncThreadCheck) { 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.")); + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); disableSyncThreadCheck = true; } } else @@ -5842,13 +6703,21 @@ public class NeverNote extends QMainWindow{ indexThreadDeadCount++; if (indexThreadDeadCount > MAX && !disableIndexThreadCheck) { 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.")); + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); disableIndexThreadCheck = true; } } else indexThreadDeadCount=0; - + if (!rensoNoteListDock.getRensoNoteList().getEnRelatedNotesThread().isAlive()) { + enRelatedNotesThreadDeadCount++; + if (enRelatedNotesThreadDeadCount > MAX && !disableENRelatedNotesThreadCheck) { + QMessageBox.information(this, tr("A thread has died."), tr("It appears as the Evernote Related Notes thread has died. I recommend "+ + "checking stopping NeighborNote, saving the logs for later viewing, and restarting. Sorry.")); + disableENRelatedNotesThreadCheck = true; + } + } else + enRelatedNotesThreadDeadCount=0; } private void thumbnailTimer() { @@ -6524,7 +7393,11 @@ public class NeverNote extends QMainWindow{ //* View / Hide source HTML for a note //************************************************* public void viewSource() { - browserWindow.showSource(menuBar.viewSource.isChecked()); + // すべてのタブに対して + for(int i = 0; i < tabBrowser.count(); i++){ + BrowserWindow browser = ((TabBrowse) tabBrowser.widget(i)).getBrowserWindow(); + browser.showSource(menuBar.viewSource.isChecked()); + } } //************************************************* // Block the program. This is used for things @@ -6555,4 +7428,314 @@ public class NeverNote extends QMainWindow{ blockingWindow = null; blockSignals(false); } + + // タブが変更された + private void tabWindowChanged(int index) { + if (index < 0 || index >= tabBrowser.count()) { + return; + } + + saveNote(); + + TabBrowse tab = (TabBrowse) tabBrowser.widget(index); + if (tab.getBrowserWindow().getNote() != null) { + currentNoteGuid = tab.getBrowserWindow().getNote().getGuid(); + currentNote = tab.getBrowserWindow().getNote(); + } else { + currentNoteGuid = ""; + currentNote = null; + } + + // 選択ノートを更新 + selectedNoteGUIDs.clear(); + if (currentNoteGuid != null && !currentNoteGuid.equals("")) { + selectedNoteGUIDs.add(currentNoteGuid); + } + + // browserWindowを更新 + browserWindow.noteSignal.noteChanged.disconnect(this,"setNoteDirty()"); + browserWindow.focusLost.disconnect(this, "saveNote()"); + browserWindow = tab.getBrowserWindow(); + browserWindow.noteSignal.noteChanged.connect(this, "setNoteDirty()"); + browserWindow.focusLost.connect(this, "saveNote()"); + // メニューバーのボタンを新しいbrowserWindowに合わせる + menuBar.refreshTargetWindow(); + + // 現在ゴミ箱かつ移るタブがアクティブなら通常テーブルに、現在通常テーブルかつこれから非アクティブのタブに移るならゴミ箱を表示させる + boolean nextIsActive; + if (tab.getBrowserWindow().getNote() != null) { + nextIsActive = tab.getBrowserWindow().getNote().isActive(); + } else { + nextIsActive = true; + } + if (Global.showDeleted && nextIsActive) { + switchNoteTable(false); + } else if (!Global.showDeleted && !nextIsActive) { + switchNoteTable(true); + } + + // noteTableViewの選択を変更するとselectionChangedが発生してしまうので一度切断 + noteTableView.selectionModel().selectionChanged.disconnect(this,"noteTableSelection()"); + scrollToGuid(currentNoteGuid); + // 再接続 + noteTableView.selectionModel().selectionChanged.connect(this,"noteTableSelection()"); + + menuBar.noteDuplicateAction.setEnabled(true); + menuBar.noteOnlineHistoryAction.setEnabled(true); + menuBar.noteMergeAction.setEnabled(true); + + if (Global.showDeleted) { + menuBar.noteDuplicateAction.setEnabled(false); + } + if (!Global.isConnected) { + menuBar.noteOnlineHistoryAction.setEnabled(false); + } + menuBar.noteMergeAction.setEnabled(false); + try { + int row = noteTableView.selectionModel().selectedRows().get(0).row(); + if (row == 0) + upButton.setEnabled(false); + else + upButton.setEnabled(true); + if (row < listManager.getNoteTableModel().rowCount() - 1) + downButton.setEnabled(true); + else + downButton.setEnabled(false); + } catch (Exception e) { + upButton.setEnabled(false); + downButton.setEnabled(false); + } + + int currentIndex = tabBrowser.currentIndex(); + ArrayList histGuids = historyGuids.get(currentIndex); + int histPosition = historyPosition.get(currentIndex); + + // prev, nextボタンの有効・無効化 + nextButton.setEnabled(true); + prevButton.setEnabled(true); + + if (histPosition <= 1){ + prevButton.setEnabled(false); + } + if (histPosition == histGuids.size()){ + nextButton.setEnabled(false); + } + + refreshEvernoteNote(true); + + // 連想ノートリストを更新 + rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid); + } + + // 生存ノートテーブル→ゴミ箱(またはその逆)に切り替える + private void switchNoteTable(boolean toDeleted) { + clearNotebookFilter(); + clearTagFilter(); + clearAttributeFilter(); + clearSavedSearchFilter(); + + listManager.getSelectedNotebooks().clear(); + listManager.getSelectedTags().clear(); + listManager.setSelectedSavedSearch(""); + + // toggle the add buttons + newButton.setEnabled(!newButton.isEnabled()); + menuBar.noteAdd.setEnabled(newButton.isEnabled()); + menuBar.noteAddNewTab.setEnabled(newButton.isEnabled()); + if (currentNoteGuid == null || currentNoteGuid.equals("")) { + menuBar.noteAddNewTab.setEnabled(false); + } + menuBar.noteAdd.setVisible(true); + + if (!toDeleted) { // 生存ノートテーブルへ + trashTree.itemSelectionChanged.disconnect(this, "trashTreeSelection()"); + trashTree.clearSelection(); + trashTree.itemSelectionChanged.connect(this, "trashTreeSelection()"); + Global.showDeleted = false; + menuBar.noteRestoreAction.setEnabled(false); + menuBar.noteRestoreAction.setVisible(false); + // ゴミ箱から元の画面に戻す。連想ノートリストをONに。 + rensoNoteListDock.setEnabled(true); + } else { // ゴミ箱へ + trashTree.itemSelectionChanged.disconnect(this, "trashTreeSelection()"); + trashTree.setCurrentItem(trashTree.getTrashItem()); + trashTree.itemSelectionChanged.connect(this, "trashTreeSelection()"); + Global.showDeleted = true; + menuBar.noteRestoreAction.setEnabled(true); + menuBar.noteRestoreAction.setVisible(true); + // ゴミ箱を開く。連想ノートリストをOFFに。 + rensoNoteListDock.setEnabled(false); + } + + listManager.loadNotesIndex(); + // noteTableViewの選択を変更するとselectionChangedが発生してしまうので一度切断 + noteTableView.selectionModel().selectionChanged.disconnect(this,"noteTableSelection()"); + noteIndexUpdated(false); + // 再接続 + noteTableView.selectionModel().selectionChanged.connect(this,"noteTableSelection()"); + + browserWindow.setReadOnly(!newButton.isEnabled()); + } + + // ユーザが連想ノートリストのアイテムを選択した時の処理 + @SuppressWarnings("unused") + private void rensoNoteItemPressed(QListWidgetItem current) { + logger.log(logger.HIGH, "Nevernote.rensoNoteSelectionChangeに入った"); + + rensoNotePressedItemGuid = rensoNoteListDock.getRensoNoteList().getNoteGuid(current); + + // 右クリックだったら終了 + if (QApplication.mouseButtons().isSet(MouseButton.RightButton)) { + return; + } + + saveNote(); + + String prevCurrentNoteGuid = new String(currentNoteGuid); + + for (int i = 0; i < noteTableView.model().rowCount(); i++) { + QModelIndex modelIndex = noteTableView.model().index(i, + Global.noteTableGuidPosition); + if (modelIndex != null) { + SortedMap ix = noteTableView.model().itemData( + modelIndex); + String tableGuid = (String) ix.values().toArray()[0]; + if (tableGuid.equals(rensoNotePressedItemGuid)) { + noteTableView.selectRow(i); + break; + } + } + } + + // 連想ノートリストアイテムクリック操作を記録 + conn.getHistoryTable().addHistory("rensoItemClick", prevCurrentNoteGuid, currentNoteGuid); + + logger.log(logger.HIGH, "Nevernote.rensoNoteSelectionChangeを出た"); + } + + // 関連ノートリストからノートを除外する + @SuppressWarnings("unused") + private void excludeNote() { + if (rensoNotePressedItemGuid != null) { + saveNote(); + excludeNote(rensoNotePressedItemGuid); + } + } + + // 関連ノートリストからノートを除外する + private void excludeNote(String guid) { + if (Global.verifyExclude()) { + String msg; + Note note = conn.getNoteTable().getNote(guid, false, false, false, false, false); + String title = note.getTitle(); + if (title != null) { + msg = new String(tr("Exclude note \"") +title +"\"?"); + } else { + msg = new String(tr("Exclude note selected note?")); + } + + if (QMessageBox.question(this, tr("Confirmation"), msg, + QMessageBox.StandardButton.Yes, + QMessageBox.StandardButton.No)==StandardButton.No.value() && Global.verifyDelete() == true) { + return; + } + } + + // Historyデータベースから除外するノートのデータを削除 + conn.getHistoryTable().expungeHistory(guid, currentNoteGuid); + + // 除外ノートテーブルに追加 + conn.getExcludedTable().addExclusion(guid, currentNoteGuid); + + rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid); + } + + // 関連ノートリストのノートにスターを付ける + @SuppressWarnings("unused") + private void starNote() { + if (rensoNotePressedItemGuid != null) { + saveNote(); + starNote(rensoNotePressedItemGuid); + } + } + + // 関連ノートリストのノートにスターを付ける + private void starNote(String guid) { + // スター付きノートテーブルに追加 + conn.getStaredTable().addStaredItem(currentNoteGuid, guid); + + rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid); + } + + // 関連ノートリストのノートからスターを外す + @SuppressWarnings("unused") + private void unstarNote() { + if (rensoNotePressedItemGuid != null) { + saveNote(); + unstarNote(rensoNotePressedItemGuid); + } + } + + // 関連ノートリストのノートからスターを外す + private void unstarNote(String guid) { + // スター付きノートテーブルから削除 + conn.getStaredTable().removeStaredItem(currentNoteGuid, guid); + + rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid); + } + + // currentNoteGuidを返す + public String getCurrentNoteGuid() { + return currentNoteGuid; + } + + @SuppressWarnings("unused") + // タブ入れ替えによってタブインデックスが変わったので、インデックスで管理しているハッシュマップ達も入れ替える + private void tabIndexChanged(int from, int to) { + // tabWindows + TabBrowse tab = tabWindows.get(from); + tabWindows.put(from, tabWindows.get(to)); + tabWindows.put(to, tab); + // noteDirty + boolean isNoteDirty = noteDirty.get(from); + noteDirty.put(from, noteDirty.get(to)); + noteDirty.put(to, isNoteDirty); + // inkNote + boolean isInkNote = inkNote.get(from); + inkNote.put(from, inkNote.get(to)); + inkNote.put(to, isInkNote); + // readOnly + boolean isReadOnly = readOnly.get(from); + readOnly.put(from, readOnly.get(to)); + readOnly.put(to, isReadOnly); + // historyGuids + ArrayList histGuids = historyGuids.get(from); + historyGuids.put(from, historyGuids.get(to)); + historyGuids.put(to, histGuids); + // historyPosition + int histPosition = historyPosition.get(from); + historyPosition.put(from, historyPosition.get(to)); + historyPosition.put(to, histPosition); + // fromHistory + boolean fromHist = fromHistory.get(from); + fromHistory.put(from, fromHistory.get(to)); + fromHistory.put(to, fromHist); + } + + // 連想ノートリストのgetter + public RensoNoteList getRensoNoteList() { + return rensoNoteListDock.getRensoNoteList(); + } + + // 帯域制限の超過をユーザに通知 + @SuppressWarnings("unused") + private void informRateLimit(Integer rateLimitDuration) { + QMessageBox.warning(this, tr("Rate limit reached"), tr("Evernote usage has been temporarily exceeded. Please try again in ") + + rateLimitDuration + tr(" seconds.")); + } + + // ツールバーの「新規」ボタンの接続スロットを設定 + public void connectNewButtonSlot(String slot) { + newButton.triggered.disconnect(); + newButton.triggered.connect(this, slot); + } }