/*
- * 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'').
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.security.MessageDigest;
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;
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;
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;
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;
import com.trolltech.qt.gui.QToolBar;
import com.trolltech.qt.gui.QTreeWidgetItem;
import com.trolltech.qt.network.QNetworkAccessManager;
+import com.trolltech.qt.network.QNetworkProxy;
+import com.trolltech.qt.network.QNetworkProxy.ProxyType;
import com.trolltech.qt.network.QNetworkReply;
import com.trolltech.qt.network.QNetworkRequest;
import com.trolltech.qt.webkit.QWebPage.WebAction;
import com.trolltech.qt.webkit.QWebSettings;
+import cx.fbn.nevernote.clipboard.ClipBoardObserver;
import cx.fbn.nevernote.config.InitializationException;
import cx.fbn.nevernote.config.StartupConfig;
import cx.fbn.nevernote.dialog.AccountDialog;
import cx.fbn.nevernote.dialog.FindDialog;
import cx.fbn.nevernote.dialog.IgnoreSync;
import cx.fbn.nevernote.dialog.LogFileDialog;
-import cx.fbn.nevernote.dialog.LoginDialog;
import cx.fbn.nevernote.dialog.NotebookArchive;
import cx.fbn.nevernote.dialog.NotebookEdit;
import cx.fbn.nevernote.dialog.OnlineNoteHistory;
import cx.fbn.nevernote.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;
import cx.fbn.nevernote.gui.TrashTreeWidget;
import cx.fbn.nevernote.gui.controls.QuotaProgressBar;
+import cx.fbn.nevernote.oauth.OAuthTokenizer;
+import cx.fbn.nevernote.oauth.OAuthWindow;
import cx.fbn.nevernote.sql.DatabaseConnection;
import cx.fbn.nevernote.sql.WatchFolderRecord;
import cx.fbn.nevernote.threads.IndexRunner;
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<Integer, Boolean> noteDirty; // Has the note been changed?
+ HashMap<Integer, Boolean> inkNote; // if this is an ink note, it is read only
+ HashMap<Integer, Boolean> readOnly; // Is this note read-only?
ListManager listManager; // DB runnable task
QTimer authTimer; // Refresh authentication
QTimer externalFileSaveTimer; // Save files altered externally
QTimer thumbnailTimer; // Wakeup & scan for thumbnails
+ QTimer debugTimer;
List<String> externalFiles; // External files to save later
List<String> importFilesKeep; // Auto-import files to save later
List<String> importFilesDelete; // Auto-import files to save later
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<String, String> noteCache; // Cash of note content
HashMap<String, Boolean> readOnlyCache; // List of cashe notes that are read-only
HashMap<String, Boolean> inkNoteCache; // List of cache notes that are ink notes
- List<String> historyGuids; // GUIDs of previously viewed items
- int historyPosition; // Position within the viewed items
- boolean fromHistory; // Is this from the history queue?
+ HashMap<Integer, ArrayList<String>> historyGuids; // タブごとの以前見たノートのGUID
+ HashMap<Integer, Integer> historyPosition; // Position within the viewed items
+ HashMap<Integer, Boolean> fromHistory; // Is this from the history queue?
+
String trashNoteGuid; // Guid to restore / set into or out of trash to save position
List<Thumbnailer> thumbGenerators; // generate preview image
ThumbnailViewer thumbnailViewer; // View preview thumbnail;
boolean encryptOnShutdown; // should I encrypt when I close?
boolean decryptOnShutdown; // should I decrypt on shutdown;
String encryptCipher; // What cipher should I use?
- Signal0 minimizeToTray;
+ //Signal0 minimizeToTray;
boolean windowMaximized = false; // Keep track of the window state for restores
List<String> pdfReadyQueue; // Queue of PDFs that are ready to be rendered.
List<QPixmap> syncIcons; // Array of icons used in sync animation
private QTimer blockTimer;
BrowserWindow blockingWindow;
+ private final TabBrowserWidget tabBrowser; // ブラウザウィンドウをタブ化
+ private final HashMap<Integer, TabBrowse> tabWindows; // タブウィンドウ
+ private final RensoNoteListDock rensoNoteListDock; // 連想ノートリストドックウィジェット
+ ClipBoardObserver cbObserver;
+ String rensoNotePressedItemGuid;
+
String iconPath = new String("classpath:cx/fbn/nevernote/icons/");
// 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);
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);
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();
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;
logger.log(logger.EXTREME, "Starting thumnail thread");
pdfReadyQueue = new ArrayList<String>();
- 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();
thumbnailTimer.setInterval(500*1000); // Thumbnail every minute
thumbnailTimer.start();
+// debugTimer = new QTimer();
+// debugTimer.timeout.connect(this, "debugDirty()");
+// debugTimer.start(1000*60);
+
logger.log(logger.EXTREME, "Starting authentication timer");
authTimer = new QTimer();
authTimer.timeout.connect(this, "authTimer()");
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");
noteCache = new HashMap<String,String>();
readOnlyCache = new HashMap<String, Boolean>();
inkNoteCache = new HashMap<String, Boolean>();
- browserWindow = new BrowserWindow(conn);
-
+ browserWindow = new BrowserWindow(conn, cbObserver);
+
+ // 下から移動してきた。
+ historyGuids = new HashMap<Integer, ArrayList<String>>();
+ historyPosition = new HashMap<Integer, Integer>();
+ fromHistory = new HashMap<Integer, Boolean>();
+
+ // タブブラウザ作成
+ tabWindows = new HashMap<Integer, TabBrowse>();
+ 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, "tabWindowClosing(int)");
+
+ noteDirty = new HashMap<Integer, Boolean>();
+ noteDirty.put(index, false);
+
+ inkNote = new HashMap<Integer, Boolean>();
+ readOnly = new HashMap<Integer, Boolean>();
+
+ // 履歴記録のハッシュマップを初期化
+ historyGuids.put(index, new ArrayList<String>());
+ 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();
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);
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())
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<String>();
- historyPosition = 0;
- fromHistory = false;
- noteDirty = false;
+ if (currentNoteGuid.equals(""))
+ currentNote = new Note();
+
+ /* 上に移動したのでここには不要
+ * historyGuids = new ArrayList<String>();
+ * historyPosition = 0;
+ * fromHistory = false;
+ */
+
if (!currentNoteGuid.trim().equals("")) {
currentNote = conn.getNoteTable().getNote(currentNoteGuid, true,true,false,false,true);
}
tagTree.showAllTags(true);
QIcon appIcon = new QIcon(iconPath+"nevernote.png");
- setWindowIcon(appIcon);
- trayIcon.setIcon(appIcon);
- if (Global.showTrayIcon())
- trayIcon.show();
- else
- trayIcon.hide();
+ if (QSystemTrayIcon.isSystemTrayAvailable()) {
+ setWindowIcon(appIcon);
+ trayIcon.setIcon(appIcon);
+ if (Global.showTrayIcon() || Global.minimizeOnClose())
+ trayIcon.show();
+ else
+ trayIcon.hide();
+ }
scrollToGuid(currentNoteGuid);
if (Global.automaticLogin()) {
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);
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()");
int sortCol = Global.getSortColumn();
int sortOrder = Global.getSortOrder();
noteTableView.proxyModel.blocked = true;
+ // We sort the table twice to fix a bug. For some reaosn the table won't sort properly if it is in narrow
+ // list view and sorted descending on the date created. By sorting it twice it forces the proper sort. Ugly.
+ if (sortCol == 0 && sortOrder == 1 && Global.getListView() == Global.View_List_Narrow)
+ noteTableView.sortByColumn(sortCol, SortOrder.resolve(0));
noteTableView.sortByColumn(sortCol, SortOrder.resolve(sortOrder));
noteTableView.proxyModel.blocked = false;
noteTableView.proxyModel.sortChanged.connect(this, "tableSortOrderChanged(Integer,Integer)");
- if (Global.checkVersionUpgrade())
+ // Set the startup notebook
+ String defaultNotebook = Global.getStartupNotebook();
+ if (!defaultNotebook.equals("AllNotebooks") && !defaultNotebook.equals("")) {
+ for (int k=0; k<listManager.getNotebookIndex().size(); k++) {
+ if (listManager.getNotebookIndex().get(k).isDefaultNotebook()) {
+ notebookTree.clearSelection();
+ notebookTree.selectGuid(listManager.getNotebookIndex().get(k).getGuid());
+ notebookTree.selectionSignal.emit();
+ }
+ }
+ }
+
+ if (Global.checkVersionUpgrade()) {
checkForUpdates();
+ }
+
+ if (currentNoteGuid == null || currentNoteGuid.equals("")) {
+ menuBar.noteAddNewTab.setEnabled(false);
+ }
+ }
+
+
+ public void debugDirty() {
+ List<Note> dirty = conn.getNoteTable().getDirty();
+ logger.log(logger.LOW, "------ Dirty Notes List Begin ------");
+ for (int i=0; i<dirty.size(); i++) {
+ logger.log(logger.LOW, "GUID: " +dirty.get(i).getGuid() + " Title:" + dirty.get(i).getTitle());
+ }
+ logger.log(logger.LOW, "------ Dirty Notes List End ------");
}
// Main entry point
QMessageBox.critical(null, "Startup error", "Aborting: " + e.getMessage());
return;
}
+
+ // Setup proxy crap
+ String proxyUrl = Global.getProxyValue("url");
+ String proxyPort = Global.getProxyValue("port");
+ String proxyUserid = Global.getProxyValue("userid");
+ String proxyPassword = Global.getProxyValue("password");
+ boolean proxySet = false;
+ QNetworkProxy proxy = new QNetworkProxy();
+ proxy.setType(ProxyType.HttpProxy);
+ if (!proxyUrl.trim().equals("")) {
+ System.out.println("Proxy URL found: " +proxyUrl);
+ proxySet = true;
+ proxy.setHostName(proxyUrl);
+ }
+ if (!proxyPort.trim().equals("")) {
+ System.out.println("Proxy Port found: " +proxyPort);
+ proxySet = true;
+ proxy.setPort(Integer.parseInt(proxyPort));
+ }
+ if (!proxyUserid.trim().equals("")) {
+ System.out.println("Proxy Userid found: " +proxyUserid);
+ proxySet = true;
+ proxy.setUser(proxyUserid);
+ }
+ if (!proxyPassword.trim().equals("")) {
+ System.out.println("Proxy URL found: " +proxyPassword);
+ proxySet = true;
+ proxy.setPassword(proxyPassword);
+ }
+ if (proxySet) {
+ QNetworkProxy.setApplicationProxy(proxy);
+ }
+
NeverNote application = new NeverNote(dbConn);
+ if (Global.syncOnly) {
+ System.out.println("Performing synchronization only.");
+ application.remoteConnect();
+ if (Global.isConnected) {
+ application.syncRunner.syncNeeded = true;
+ application.syncRunner.addWork("SYNC");
+ application.syncRunner.addWork("STOP");
+ while(!application.syncRunner.isIdle());
+ application.closeNeverNote();
+ }
+ return;
+ }
application.setAttribute(WidgetAttribute.WA_DeleteOnClose, true);
if (Global.startMinimized())
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;
}
}
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;
}
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,
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"));
}
startupConfig.setHomeDirPath(arg.substring(arg.indexOf('=') + 1));
if (lower.startsWith("--disable-viewing"))
startupConfig.setDisableViewing(true);
+ if (lower.startsWith("--sync-only=true"))
+ startupConfig.setSyncOnly(true);
}
Global.setup(startupConfig);
+
}
// Exit point
@Override
public void closeEvent(QCloseEvent event) {
- if (Global.minimizeOnClose() && !closeAction && Global.showTrayIcon()) {
+ if (Global.minimizeOnClose() && !closeAction) {
event.ignore();
hide();
return;
logger.log(logger.HIGH, "Entering NeverNote.closeEvent");
waitCursor(true);
- if (currentNote!= null & browserWindow!=null) {
- if (!currentNote.getTitle().equals(browserWindow.getTitle()))
- conn.getNoteTable().updateNoteTitle(currentNote.getGuid(), browserWindow.getTitle());
+ if (currentNote != null & browserWindow != null) {
+ if (currentNote.getTitle() != null && browserWindow != null
+ && !currentNote.getTitle().equals(browserWindow.getTitle()))
+ conn.getNoteTable().updateNoteTitle(currentNote.getGuid(),
+ browserWindow.getTitle());
}
+
saveNote();
setMessage(tr("Beginning shutdown."));
browser.close();
}
+ // タブブラウザに対してクローズ処理を行う
+ Collection<TabBrowse> win = tabWindows.values();
+ Iterator<TabBrowse> it = win.iterator();
+ tabBrowser.currentChanged.disconnect();
+ tabBrowser.tabCloseRequested.disconnect();
+ while (it.hasNext()) {
+ TabBrowse browser = it.next();
+ browser.close();
+ }
externalFileEditedSaver();
if (Global.isConnected && Global.synchronizeOnClose()) {
saveNote();
listManager.stop();
saveWindowState();
+
+ // 連想ノートリストのEvernote関連ノート取得スレッドを終了
+ rensoNoteListDock.getRensoNoteList().stopThread();
if (tempFiles != null)
tempFiles.clear();
logger.log(logger.HIGH, "Leaving NeverNote.closeEvent");
}
- @SuppressWarnings("unused")
+
private void closeNeverNote() {
closeAction = true;
close();
}
public void setMessage(String s) {
- logger.log(logger.HIGH, "Entering NeverNote.setMessage");
-
- statusBar.show();
- logger.log(logger.HIGH, "Message: " +s);
- statusBar.showMessage(s);
- emitLog.add(s);
-
-
- messageTimer.stop();
- messageTimer.setSingleShot(true);
- messageTimer.start();
-
-
- logger.log(logger.HIGH, "Leaving NeverNote.setMessage");
+ if (logger != null)
+ logger.log(logger.HIGH, "Entering NeverNote.setMessage");
+ else
+ System.out.println("*** ERROR *** " +s);
+
+ if (statusBar != null) {
+ statusBar.show();
+ if (logger != null)
+ logger.log(logger.HIGH, "Message: " +s);
+ statusBar.showMessage(s);
+ if (emitLog != null)
+ emitLog.add(s);
+
+ if (messageTimer != null) {
+ messageTimer.stop();
+ messageTimer.setSingleShot(true);
+ messageTimer.start();
+ }
+ }
+
+ if (logger != null)
+ logger.log(logger.HIGH, "Leaving NeverNote.setMessage");
}
private void clearMessage() {
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();
}
@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();
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())
+ 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)
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)
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
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() {
Global.setColumnWidth("noteTableThumbnailPosition", width);
width = noteTableView.getColumnWidth(Global.noteTableGuidPosition);
Global.setColumnWidth("noteTableGuidPosition", width);
+ width = noteTableView.getColumnWidth(Global.noteTablePinnedPosition);
+ Global.setColumnWidth("noteTablePinnedPosition", width);
}
@SuppressWarnings("unused")
clearSavedSearchFilter();
if (Global.mimicEvernoteInterface) {
clearTagFilter();
- searchField.clear();
+ //searchField.clear();
+ searchField.clearEditText();
}
menuBar.noteRestoreAction.setVisible(false);
menuBar.notebookEditAction.setEnabled(true);
menuBar.notebookShareAction.setEnabled(true);
menuBar.notebookIconAction.setEnabled(true);
menuBar.notebookStackAction.setEnabled(true);
+
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ if (!rensoNoteListDock.isEnabled()) {
+ rensoNoteListDock.setEnabled(true);
+ }
+
List<QTreeWidgetItem> selections = notebookTree.selectedItems();
selectedNotebookGUIDs.clear();
String guid = "";
Iterator<String> set = externalWindows.keySet().iterator();
while(set.hasNext())
externalWindows.get(set.next()).getBrowserWindow().setNotebookList(filteredBooks);
+
+ Iterator<Integer>it = tabWindows.keySet().iterator();
+ while (it.hasNext()) {
+ tabWindows.get(it.next()).getBrowserWindow()
+ .setNotebookList(filteredBooks);
+ }
+
logger.log(logger.HIGH, "Leaving NeverNote.editNotebook");
}
// Publish a notebook
// 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);
while(set.hasNext())
externalWindows.get(set.next()).getBrowserWindow().setNotebookList(filteredBooks);
+ // 全てのタブウィンドウを更新
+ Iterator<Integer> it = tabWindows.keySet().iterator();
+ while (it.hasNext()) {
+ tabWindows.get(it.next()).getBrowserWindow()
+ .setNotebookList(filteredBooks);
+ }
+
waitCursor(false);
}
// Change the notebook's icon
if (currentNote != null && currentNote.getTagGuids().contains(guid))
browserWindow.setTag(getTagNamesForNote(currentNote));
logger.log(logger.HIGH, "Leaving NeverNote.editTag");
- return;
+ //return;
}
}
+ listManager.reloadNoteTagNames(guid, edit.getTag());
+ noteIndexUpdated(true);
+ refreshEvernoteNote(true);
browserWindow.setTag(getTagNamesForNote(currentNote));
logger.log(logger.HIGH, "Leaving NeverNote.editTag...");
}
menuBar.noteRestoreAction.setVisible(false);
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ if (!rensoNoteListDock.isEnabled()) {
+ rensoNoteListDock.setEnabled(true);
+ }
+
List<QTreeWidgetItem> selections = tagTree.selectedItems();
QTreeWidgetItem currentSelection;
selectedTagGUIDs.clear();
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<tags.size(); i++) {
}
}
browserWindow.setTag(names.toString());
- noteDirty = true;
+
+ for (TabBrowse tab: tabWindows.values()) {
+ if (tab.getBrowserWindow().getNote().getGuid().equals(guid)) {
+ int index = tabBrowser.indexOf(tab);
+ noteDirty.put(index, true);
+ break;
+ }
+ }
// Now, we need to add any new tags to the tag tree
for (int i=0; i<newTags.size(); i++)
String noteGuid = noteGuids.get(j);
conn.getNoteTable().noteTagsTable.deleteNoteTag(noteGuid);
if (!conn.getNoteTable().noteTagsTable.checkNoteNoteTags(noteGuid, newGuid))
- conn.getNoteTable().noteTagsTable.saveNoteTag(noteGuid, newGuid);
+ conn.getNoteTable().noteTagsTable.saveNoteTag(noteGuid, newGuid, true);
}
}
}
menuBar.savedSearchEditAction.setEnabled(true);
menuBar.savedSearchDeleteAction.setEnabled(true);
menuBar.savedSearchIconAction.setEnabled(true);
+
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ if (!rensoNoteListDock.isEnabled()) {
+ rensoNoteListDock.setEnabled(true);
+ }
+
List<QTreeWidgetItem> selections = savedSearchTree.selectedItems();
QTreeWidgetItem currentSelection;
selectedSavedSearchGUID = "";
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();
}
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;
QTextEdit textBox = new QTextEdit();
layout.addWidget(textBox);
textBox.setReadOnly(true);
- QFile file = new QFile(Global.getFileManager().getHomeDirPath("release.txt"));
+ QFile file = new QFile(Global.getFileManager().getProgramDirPath("release.txt"));
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);
private void about() {
logger.log(logger.HIGH, "Entering NeverNote.about");
QMessageBox.about(this,
- tr("About NixNote"),
- tr("<h4><center><b>NixNote</b></center></h4><hr><center>Version ")
- +Global.version
- +tr("<hr></center>Evernote"
- +"An Open Source Evernote Client.<br><br>"
+ tr("About NeighborNote"),
+ tr("<h4><center><b>NeighborNote</b></center></h4><hr><center>Version ")
+ +Global.version + "(based on NixNote 1.5)"
+ //+"1.2.120724"
+ +tr("<hr>"
+ +"Open Source Evernote Client.<br><br>"
+"Licensed under GPL v2. <br><hr><br>"
- +"Evernote is copyright 2001-2010 by Evernote Corporation<br>"
+ +"</center>Evernote is copyright 2001-2012 by Evernote Corporation<br>"
+"Jambi and QT are the licensed trademark of Nokia Corporation<br>"
+"PDFRenderer is licened under the LGPL<br>"
+"JTidy is copyrighted under the World Wide Web Consortium<br>"
listManager.setEnSearch(text.trim());
listManager.loadNotesIndex();
noteIndexUpdated(false);
+
refreshEvernoteNote(true);
searchPerformed = true;
+ waitCursor(false);
logger.log(logger.HIGH, "Leaving NeverNote.searchFieldChanged");
}
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);
// 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"));
- 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"));
+ toolBar.addSeparator();
+
upButton = toolBar.addAction(tr("Up"));
QIcon upIcon = new QIcon(iconPath+"up.png");
upButton.setIcon(upIcon);
attributeButton = toolBar.addAction(tr("Attributes"));
QIcon attributeIcon = new QIcon(iconPath+"attribute.png");
attributeButton.setIcon(attributeIcon);
- attributeButton.triggered.connect(this, "toggleNoteInformation()");
+ attributeButton.triggered.connect(this, "toggleNoteAttributes()");
toggleAttributeButton(Global.isToolbarButtonVisible("attribute"));
emailButton = toolBar.addAction(tr("Email"));
Global.showDeleted = false;
menuBar.noteRestoreAction.setEnabled(false);
menuBar.noteRestoreAction.setVisible(false);
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ rensoNoteListDock.setEnabled(true);
}
else {
+ trashNoteGuid = tempGuid;
currentNoteGuid = trashNoteGuid;
- trashNoteGuid = tempGuid;
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());
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();
listManager.loadNotesIndex();
noteIndexUpdated(false);
+
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ if (!rensoNoteListDock.isEnabled()) {
+ rensoNoteListDock.setEnabled(true);
+ }
}
}
// Show/Hide trash window
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();
}
// Do a manual connect/disconnect
private void remoteConnect() {
+
logger.log(logger.HIGH, "Entering NeverNote.remoteConnect");
+ // If we are already connected, we just disconnect
if (Global.isConnected) {
Global.isConnected = false;
syncRunner.enDisconnect();
return;
}
+ OAuthTokenizer tokenizer = new OAuthTokenizer();
AESEncrypter aes = new AESEncrypter();
try {
- aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("secure.txt")));
+ aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("oauth.txt")));
} catch (FileNotFoundException e) {
// File not found, so we'll just get empty strings anyway.
}
-
+
+
if (Global.getProxyValue("url").equals("")) {
System.setProperty("http.proxyHost","") ;
System.setProperty("http.proxyPort", "") ;
syncRunner.userStoreUrl = Global.userStoreUrl;
syncRunner.noteStoreUrl = Global.noteStoreUrl;
syncRunner.noteStoreUrlBase = Global.noteStoreUrlBase;
-
- String userid = aes.getUserid();
- String password = aes.getPassword();
- if (!userid.equals("") && !password.equals("")) {
- Global.username = userid;
- Global.password = password;
- syncRunner.username = Global.username;
- syncRunner.password = Global.password;
+
+
+
+ String authString = aes.getString();
+ if (!authString.equals("")) {
+ tokenizer.tokenize(authString);
+ syncRunner.authToken = tokenizer.oauth_token;
syncRunner.enConnect();
}
Global.isConnected = syncRunner.isConnected;
+ boolean autoLoginMessageFlag = false;
if (!Global.isConnected) {
- // Show the login dialog box
- if (!Global.automaticLogin() || userid.equals("")|| password.equals("")) {
- LoginDialog login = new LoginDialog();
- login.exec();
-
- if (!login.okPressed()) {
- return;
- }
-
- Global.username = login.getUserid();
- Global.password = login.getPassword();
+ OAuthWindow window = new OAuthWindow(logger);
+ if (window.error) {
+ setMessage(window.errorMessage);
+ return;
+ }
+ window.exec();
+ if (window.error) {
+ setMessage(window.errorMessage);
+ return;
+ }
+ tokenizer.tokenize(window.response);
+ if (tokenizer.oauth_token.equals("")) {
+ setMessage(tr("Invalid authorization token received."));
+ return;
+ }
+ aes.setString(window.response);
+ try {
+ aes.encrypt(new FileOutputStream(Global.getFileManager().getHomeDirFile("oauth.txt")));
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
- syncRunner.username = Global.username;
- syncRunner.password = Global.password;
+ syncRunner.authToken = tokenizer.oauth_token;
syncRunner.enConnect();
Global.isConnected = syncRunner.isConnected;
+ autoLoginMessageFlag = true;
}
-
+// Global.username = syncRunner.username;
+
if (!Global.isConnected)
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() {
// clearNotebookFilter();
clearTrashFilter();
// clearSavedSearchFilter();
+
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ if (!rensoNoteListDock.isEnabled()) {
+ rensoNoteListDock.setEnabled(true);
+ }
if (attributeTreeSelected == null || item.nativeId() != attributeTreeSelected.nativeId()) {
if (item.childCount() > 0) {
saveNote();
+ // 右クリックだったときの処理
+ if (QApplication.mouseButtons().isSet(MouseButton.RightButton)) {
+ // 選択されたノートのguidをselectedNoteGUIDsにセット
+ List<QModelIndex> 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<Integer, Object> 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<QModelIndex> selections = noteTableView.selectionModel().selectedRows();
if (selections.size() > 1)
// 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<selections.size(); i++) {
+ int row = selections.get(i).row();
+ QModelIndex index = noteTableView.proxyModel.index(row, Global.noteTableGuidPosition);
+ SortedMap<Integer, Object> 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"))
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);
}
downButton.setEnabled(false);
index = noteTableView.proxyModel.index(row, Global.noteTableGuidPosition);
SortedMap<Integer, Object> 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<String> 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<Integer> 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<String> 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");
String saveCurrentNoteGuid = new String();
String tempNoteGuid = new String();
-
- historyGuids.clear();
- historyPosition = 0;
+
+ int currentIndex = tabBrowser.currentIndex();
+ ArrayList<String> histGuids = historyGuids.get(currentIndex);
+ histGuids.clear();
+ historyPosition.put(currentIndex, 0);
+
prevButton.setEnabled(false);
nextButton.setEnabled(false);
currentNote = null;
browserWindow.clear();
browserWindow.setDisabled(true);
+ waitCursor(false);
}
+ if (Global.showDeleted && listManager.getNoteIndex().size() > 0 && saveCurrentNoteGuid.equals("")) {
+ currentNoteGuid = listManager.getNoteIndex().get(0).getGuid();
+ saveCurrentNoteGuid = currentNoteGuid;
+ refreshEvernoteNote(true);
+ }
+
if (!saveCurrentNoteGuid.equals("")) {
refreshEvernoteNote(false);
} else {
- currentNoteGuid = "";
+ currentNoteGuid = "";
}
reloadTagTree(false);
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<noteTableView.model().rowCount(); i++) {
- QModelIndex modelIndex = noteTableView.model().index(i, Global.noteTableGuidPosition);
- if (modelIndex != null) {
- SortedMap<Integer, Object> 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<String> 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<Integer, Object> 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<noteTableView.model().rowCount(); i++) {
- QModelIndex modelIndex = noteTableView.model().index(i, Global.noteTableGuidPosition);
- if (modelIndex != null) {
- SortedMap<Integer, Object> 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<String> 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<Integer, Object> 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")
noteTableView.setColumnHidden(Global.noteTableSynchronizedPosition, !Global.isColumnVisible("synchronized"));
noteTableView.setColumnHidden(Global.noteTableGuidPosition, !Global.isColumnVisible("guid"));
noteTableView.setColumnHidden(Global.noteTableThumbnailPosition, !Global.isColumnVisible("thumbnail"));
- noteTableView.setColumnHidden(Global.noteTableTitlePosition, !Global.isColumnVisible("title"));
+ noteTableView.setColumnHidden(Global.noteTableTitlePosition, !Global.isColumnVisible("title"));
+ noteTableView.setColumnHidden(Global.noteTablePinnedPosition, !Global.isColumnVisible("pinned"));
}
// Title color has changed
@SuppressWarnings("unused")
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() {
menuBar.narrowListView.blockSignals(false);
mainLeftRightSplitter.addWidget(noteTableView);
- mainLeftRightSplitter.addWidget(browserWindow);
+ mainLeftRightSplitter.addWidget(tabBrowser);
+
restoreWindowState(false);
noteTableView.repositionColumns();
noteTableView.resizeColumnWidths();
menuBar.narrowListView.blockSignals(false);
browserIndexSplitter.setVisible(true);
browserIndexSplitter.addWidget(noteTableView);
- browserIndexSplitter.addWidget(browserWindow);
+ browserIndexSplitter.addWidget(tabBrowser);
+
restoreWindowState(false);
noteTableView.repositionColumns();
noteTableView.resizeColumnWidths();
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());
loadNoteBrowserInformation(newBrowser.getBrowserWindow(), guid, note);
setupBrowserWindowListeners(newBrowser.getBrowserWindow(), false);
newBrowser.windowClosing.connect(this, "externalWindowClosing(String)");
- newBrowser.getBrowserWindow().noteSignal.titleChanged.connect(this, "externalWindowTitleEdited(String, String)");
+ //newBrowser.getBrowserWindow().noteSignal.titleChanged.connect(this, "externalWindowTitleEdited(String, String)");
newBrowser.getBrowserWindow().noteSignal.tagsChanged.connect(this, "externalWindowTagsEdited(String, List)");
newBrowser.contentsChanged.connect(this, "saveNoteExternalBrowser(String, String, Boolean, BrowserWindow)");
newBrowser.getBrowserWindow().blockApplication.connect(this, "blockApplication(BrowserWindow)");
newBrowser.show();
}
- @SuppressWarnings("unused")
- private void externalWindowTitleEdited(String guid, String text) {
- if (guid.equals(currentNoteGuid)) {
- browserWindow.setTitle(text);
- }
- }
@SuppressWarnings({ "rawtypes", "unused" })
private void externalWindowTagsEdited(String guid, List values) {
StringBuffer line = new StringBuffer(100);
private void externalWindowClosing(String guid) {
externalWindows.remove(guid);
}
-
-
- //***************************************************************
- //***************************************************************
- //** These functions deal with Note specific things
- //***************************************************************
- //***************************************************************
- private void setNoteDirty() {
- logger.log(logger.EXTREME, "Entering NeverNote.setNoteDirty()");
+ // ***************************************************************
+ // ***************************************************************
+ // ** タブウィンドウの機能
+ // ***************************************************************
+ // ***************************************************************
+ @SuppressWarnings("unused")
+ private void openNewTab() {
+ saveNote();
+
+ // selectedNoteGUIDsをディープコピー
+ List<String> copySelected = new ArrayList<String>(selectedNoteGUIDs);
- // Find if the note is being edited externally. If it is, update it.
- if (externalWindows.containsKey(currentNoteGuid)) {
- QTextCodec codec = QTextCodec.codecForName("UTF-8");
- QByteArray unicode = codec.fromUnicode(browserWindow.getContent());
- ExternalBrowse window = externalWindows.get(currentNoteGuid);
- window.getBrowserWindow().setContent(unicode);
+ 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()");
- // If the note is dirty, then it is unsynchronized by default.
- if (noteDirty)
+ setupBrowserWindowListeners(newBrowser.getBrowserWindow(), false);
+
+ // ExtendedInformationを必要があれば表示する
+ toggleNoteInformation();
+ // Sourceを必要があれば表示する
+ viewSource();
+ // EditorButtonsBarを必要があれば表示する
+ toggleEditorButtonBar();
+
+ // 履歴記録のハッシュマップを初期化
+ ArrayList<String> histGuids = new ArrayList<String>();
+ 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();
+ }
+ }
+ }
+
+ // タブが閉じられた
+ private void tabWindowClosing(int index) {
+ // タブが1つしかなかったら閉じない
+ if (tabBrowser.count() <= 1) {
return;
+ }
+
+ TabBrowse t = (TabBrowse) tabBrowser.widget(index);
+ String guid = t.getBrowserWindow().getNote().getGuid();
+ String content = t.getBrowserWindow().getContent();
+ BrowserWindow browser = t.getBrowserWindow();
+ // ノートが変更されていたら保存
+ if (t.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 tab = tabWindows.get(i + 1);
+ tabWindows.put(i, tab);
+ 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<String> 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();
+
+ // ノート追加前に開いていたノートとの関連性を記録するために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<String> histGuids = new ArrayList<String>();
+ 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(targetGuid)) {
+ QTextCodec codec = QTextCodec.codecForName("UTF-8");
+ QByteArray unicode = codec.fromUnicode(browserWindow.getContent());
+ ExternalBrowse window = externalWindows.get(targetGuid);
+ window.getBrowserWindow().setContent(unicode);
+ }
+
+ // 他のタブで同じノートを開いていないか探す。もしあったら、内容を更新する。
+ Collection<Integer> tabIndexes = tabWindows.keySet();
+ Iterator<Integer> 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.
+ 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<listManager.getNoteTableModel().rowCount(); i++) {
QModelIndex modelIndex = listManager.getNoteTableModel().index(i, Global.noteTableGuidPosition);
if (modelIndex != null) {
SortedMap<Integer, Object> ix = listManager.getNoteTableModel().itemData(modelIndex);
String tableGuid = (String)ix.values().toArray()[0];
- if (tableGuid.equals(currentNoteGuid)) {
+ if (tableGuid.equals(targetGuid)) {
listManager.getNoteTableModel().proxyModel.setData(i, Global.noteTableSynchronizedPosition, "false");
return;
}
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) {
}
}
+
+ 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<Integer> dirtyIndex = noteDirty.keySet();
+ Iterator<Integer> 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()");
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);
- return;
}
if (!reload)
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);
}
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 <HEAD></HEAD> or encoded characters are ugly
js.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
js.append("<style type=\"text/css\">.en-crypt-temp { border-collapse:collapse; border-style:solid; border-color:blue; padding:0.0mm 0.0mm 0.0mm 0.0mm; }</style>");
js.append("<style type=\"text/css\">en-hilight { background-color: rgb(255,255,0) }</style>");
- js.append("<style> img { max-width:100%; }</style>");
+ js.append("<style> img { height:auto; width:auto; max-height:auto; max-width:100%; }</style>");
if (Global.displayRightToLeft())
js.append("<style> body { direction:rtl; }</style>");
js.append("<style type=\"text/css\">en-spell { text-decoration: none; border-bottom: dotted 1px #cc0000; }</style>");
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)
+ 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 &&
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);
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() {
}
if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals(""))
selectedNoteGUIDs.add(currentNoteGuid);
+ closeTabs(selectedNoteGUIDs);
for (int i=0; i<selectedNoteGUIDs.size(); i++) {
listManager.deleteNote(selectedNoteGUIDs.get(i));
}
}
if (QMessageBox.question(this, "Confirmation", msg,
QMessageBox.StandardButton.Yes,
- QMessageBox.StandardButton.No)==StandardButton.No.value()) {
+ QMessageBox.StandardButton.No)==StandardButton.No.value()) {
return;
}
}
}
}
}
+ closeTabs(selectedNoteGUIDs);
listManager.expungeNote(selectedNoteGUIDs.get(i));
+
+ conn.getHistoryTable().expungeHistory(selectedNoteGUIDs.get(i));
+ conn.getExcludedTable().expungeExcludedNote(selectedNoteGUIDs.get(i));
+ conn.getStaredTable().expungeStaredNote(selectedNoteGUIDs.get(i));
+
}
}
currentNoteGuid = "";
+ closeExternalWindows(selectedNoteGUIDs);
+ 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<String> noteGUIDs) {
+ Collection<TabBrowse> tabBrowsers = tabWindows.values();
+ Iterator<TabBrowse> tabIterator = tabBrowsers.iterator();
+ Collection<Integer> tabIndexes = tabWindows.keySet();
+ Iterator<Integer> indexIterator = tabIndexes.iterator();
+ List<Integer> closeIndexes = new ArrayList<Integer>(); //イテレータ操作中に中身をいじっちゃダメなので
+
+ while (tabIterator.hasNext()) {
+ TabBrowse tab = tabIterator.next();
+ int index = indexIterator.next();
+ String guid = tab.getBrowserWindow().getNote().getGuid();
+
+ for(int i = 0; i < noteGUIDs.size(); i++){
+ if(guid.equals(noteGUIDs.get(i))){
+ closeIndexes.add(index);
+ }
+ }
+ }
+
+ for(int i = closeIndexes.size() - 1; i >= 0; i--){
+ tabWindowClosing(closeIndexes.get(i));
+ }
+ }
+
+ // 対象ノートを外部ウィンドウで開いていたら閉じる
+ private void closeExternalWindows(List<String> noteGUIDs) {
+ Collection<ExternalBrowse> windows = externalWindows.values();
+ Iterator<ExternalBrowse> windowIterator = windows.iterator();
+ Collection<String> guids = externalWindows.keySet();
+ Iterator<String> guidIterator = guids.iterator();
+ List<ExternalBrowse> closeWindows = new ArrayList<ExternalBrowse>(); // イテレータ操作中に中身をいじっちゃダメなので
+
+ while (windowIterator.hasNext()) {
+ ExternalBrowse browser = windowIterator.next();
+ String guid = guidIterator.next();
+
+ for (int i = 0; i < noteGUIDs.size(); i++) {
+ if (guid.equals(noteGUIDs.get(i))) {
+ closeWindows.add(browser);
+ }
+ }
+ }
+
+ for (int i = closeWindows.size() - 1; i >= 0; i--) {
+ closeWindows.get(i).close();
+ }
+ }
+
// Add a new note
- @SuppressWarnings("unused")
private void addNote() {
logger.log(logger.HIGH, "Inside NeverNote.addNote");
// browserWindow.setEnabled(true);
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();
@SuppressWarnings("unused")
private void updateNoteTitle(String guid, String title) {
listManager.setNoteSynchronized(guid, false);
+
+ // We do this manually because if we've edited the note in an
+ // external window we run into the possibility of signal recursion
+ // looping.
+ if (guid.equals(currentNoteGuid)) {
+ browserWindow.titleLabel.blockSignals(true);
+ browserWindow.titleLabel.setText(title);
+ browserWindow.titleLabel.blockSignals(false);
+ }
}
// Signal received that note content has changed. Normally we just need the guid to remove
// it from the cache.
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<listManager.getNoteIndex().size(); i++) {
if (listManager.getNoteIndex().get(i).getGuid().equals(newGuid)) {
}
}
+
// Toggle the note editor button bar
+ // すべてのタブに
private void toggleEditorButtonBar() {
- if (browserWindow.buttonsVisible) {
- browserWindow.hideButtons();
- menuBar.showEditorBar.setChecked(browserWindow.buttonsVisible);
-// Global.saveWindowVisible("editorButtonBar", browserWindow.buttonsVisible);
- } else {
- browserWindow.buttonsVisible = true;
- showEditorButtons(browserWindow);
+ boolean isChecked = menuBar.showEditorBar.isChecked();
+
+ for(int i = 0; i < tabBrowser.count(); i++){
+ BrowserWindow browser = ((TabBrowse) tabBrowser.widget(i)).getBrowserWindow();
+ boolean isVisible = browser.buttonsVisible;
+
+ if (isChecked && !isVisible) {
+ browser.buttonsVisible = true;
+ showEditorButtons(browser);
+ } else if(!isChecked && isVisible) {
+ browser.hideButtons();
+ }
}
+
Global.saveWindowVisible("editorButtonBar", browserWindow.buttonsVisible);
}
+
// Show editor buttons
private void showEditorButtons(BrowserWindow browser) {
browser.buttonLayout.setVisible(true);
}
newNote.setResources(resList);
+ // 操作履歴と除外ノートとスター付きノートも複製する
+ if(Global.getDuplicateRensoNote()) {
+ conn.getHistoryTable().duplicateHistory(newGuid, oldNote.getGuid());
+ conn.getExcludedTable().duplicateExcludedNotes(newGuid, oldNote.getGuid());
+ conn.getStaredTable().duplicateStaredNotes(newGuid, oldNote.getGuid());
+ }
+
// Add note to the database
conn.getNoteTable().addNote(newNote, true);
NoteMetadata metaData = new NoteMetadata();
refreshEvernoteNote(true);
listManager.countNotebookResults(listManager.getNoteIndex());
waitCursor(false);
+
}
// View all notes
@SuppressWarnings("unused")
}
notebookTreeSelection();
refreshEvernoteNote(true);
+
+ // ゴミ箱から元の画面に戻す。連想ノートリストをONに。
+ if (!rensoNoteListDock.isEnabled()) {
+ rensoNoteListDock.setEnabled(true);
+ }
}
// Merge notes
@SuppressWarnings("unused")
logger.log(logger.EXTREME, "Children count: "+sources.size());
mergeNoteContents(masterGuid, sources);
currentNoteGuid = masterGuid;
+
+ // 操作履歴と除外ノートとスター付きノートをマージ
+ if(Global.getMergeRensoNote()) {
+ for (int i = 0; i < sources.size(); i++) {
+ String childGuid = sources.get(i);
+ if(masterGuid != null && childGuid != null) {
+ if(!masterGuid.equals(childGuid)) {
+ conn.getHistoryTable().mergeHistoryGuid(masterGuid, childGuid);
+ conn.getExcludedTable().mergeHistoryGuid(masterGuid, childGuid);
+ conn.getStaredTable().mergeHistoryGuid(masterGuid, childGuid);
+ }
+ }
+ }
+ }
+
+ // マージしたノート(child)を外部ウィンドウで開いていたら、閉じる
+ Collection<ExternalBrowse> windows = externalWindows.values();
+ Iterator<ExternalBrowse> windowIterator = windows.iterator();
+ Collection<String> guids = externalWindows.keySet();
+ Iterator<String> guidIterator = guids.iterator();
+ List<ExternalBrowse> closeWindows = new ArrayList<ExternalBrowse>();
+
+ 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)をタブで開いていたら、閉じる
+ Collection<TabBrowse> tabBrowsers = tabWindows.values();
+ Iterator<TabBrowse> tabIterator = tabBrowsers.iterator();
+ Collection<Integer> tabIndexes = tabWindows.keySet();
+ Iterator<Integer> indexIterator = tabIndexes.iterator();
+ List<Integer> closeIndexes = new ArrayList<Integer>();
+
+ while (tabIterator.hasNext()) {
+ TabBrowse tab = tabIterator.next();
+ int tabIndex = indexIterator.next();
+ String guid = tab.getBrowserWindow().getNote().getGuid();
+
+ for(int i = 0; i < sources.size(); i++){
+ if(guid.equals(sources.get(i))){
+ closeIndexes.add(tabIndex);
+ }
+ }
+ }
+
+ for(int i = closeIndexes.size() - 1; i >= 0; i--){
+ tabWindowClosing(closeIndexes.get(i));
+ }
+
noteIndexUpdated(false);
+ // IFIXED
+ // マージ後の新しいノートコンテンツを表示するためキャッシュを削除
+ noteCache.remove(masterGuid);
+
refreshEvernoteNote(true);
waitCursor(false);
}
}
}
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.");
setMessage("EDAMUserException: " +e.getMessage());
return;
} catch (EDAMSystemException e) {
+ if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
+ QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));
+ }
setMessage("EDAMSystemException: " +e.getMessage());
return;
} catch (EDAMNotFoundException e) {
// 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()");
waitCursor(false);
return null;
} catch (EDAMSystemException e) {
+ if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
+ QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));
+ }
setMessage("EDAMSystemException: " +e.getMessage());
waitCursor(false);
return null;
setMessage("EDAMUserException: " +e.getMessage());
return;
} catch (EDAMSystemException e) {
+ if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
+ QMessageBox.warning(this, tr("Rate limit reached"), tr("Rate limit reached.\nRetry your request in " + e.getRateLimitDuration() + " seconds."));
+ }
setMessage("EDAMSystemException: " +e.getMessage());
return;
} catch (TException e) {
//**********************************************************
//**********************************************************
// 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."+
"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);
}
public void refreshLists() {
logger.log(logger.EXTREME, "Entering NeverNote.refreshLists");
updateQuotaBar();
- listManager.refreshLists(currentNote, noteDirty, browserWindow.getContent());
+ // すべてのタブのノートを調べて、Dirtyならばセーブする。その後refreshListsする。
+ Collection<Integer> tabIndex = noteDirty.keySet();
+ Iterator<Integer> indexIterator = tabIndex.iterator();
+ HashMap<Integer, Note> saveNotes = new HashMap<Integer, Note>();
+ HashMap<Integer, String> saveContents = new HashMap<Integer, String>();
+ 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();
thumbnailRunner.interrupt = true;
indexRunner.addWork("SCAN");
}
- logger.log(logger.EXTREME, "Leaving NixNote index timer");
+ logger.log(logger.EXTREME, "Leaving NeighborNote index timer");
}
@SuppressWarnings("unused")
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
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
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
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
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
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() {
else
noteReader.setNotebookGuid(listManager.getNotebookIndex().get(0).getGuid());
+ waitCursor(false);
+ if (QMessageBox.question(this, tr("Confirmation"),
+ tr("Create new tags from import?"),
+ QMessageBox.StandardButton.Yes,
+ QMessageBox.StandardButton.No) == StandardButton.Yes.value()) {
+ noteReader.createNewTags = true;
+ } else
+ noteReader.createNewTags = false;
+ waitCursor(true);
noteReader.importData(fileName);
if (noteReader.lastError != 0) {
// importKeepWatcher.addPath(records.get(i).folder.replace('\\', '/'));
for (int i=0; i<records.size(); i++) {
+ logger.log(logger.LOW, "Adding file monitor: " +records.get(i).folder);
if (records.get(i).keep)
importKeepWatcher.addPath(records.get(i).folder);
else
importDeleteWatcher.addPath(records.get(i).folder);
}
+ logger.log(logger.EXTREME, "List of directories being watched (kept)...");
+ List<String> monitorDelete = importKeepWatcher.directories();
+ for (int i=0; i<monitorDelete.size(); i++) {
+ logger.log(logger.EXTREME, monitorDelete.get(i));
+ }
+ logger.log(logger.EXTREME, "<end of list>");
+ logger.log(logger.EXTREME, "List of directories being watched (delete)...");
+ monitorDelete = importDeleteWatcher.directories();
+ for (int i=0; i<monitorDelete.size(); i++) {
+ logger.log(logger.EXTREME, monitorDelete.get(i));
+ }
+ logger.log(logger.EXTREME, "<end of list>");
+
importKeepWatcher.directoryChanged.connect(this, "folderImportKeep(String)");
importDeleteWatcher.directoryChanged.connect(this, "folderImportDelete(String)");
}
}
}
+
+ // Menu folderImport action triggered
public void folderImport() {
List<WatchFolderRecord> recs = conn.getWatchFolderTable().getAll();
WatchFolder dialog = new WatchFolder(recs, listManager.getNotebookIndex());
setupFolderImports();
}
+
public void folderImportKeep(String dirName) throws NoSuchAlgorithmException {
-
+ logger.log(logger.LOW, "Inside folderImportKeep");
String whichOS = System.getProperty("os.name");
if (whichOS.contains("Windows"))
dirName = dirName.replace('/','\\');
String notebook = conn.getWatchFolderTable().getNotebook(dirName);
for (int i=0; i<list.size(); i++){
-
+ logger.log(logger.LOW, "File found: " +list.get(i).fileName());
boolean redundant = false;
// Check if we've already imported this one or if it existed before
for (int j=0; j<importedFiles.size(); j++) {
+ logger.log(logger.LOW, "redundant file list: " +list.get(i).absoluteFilePath());
if (importedFiles.get(j).equals(list.get(i).absoluteFilePath()))
redundant = true;
}
+ logger.log(logger.LOW, "Checking if redundant: " +redundant);
if (!redundant) {
importer.setFileInfo(list.get(i));
importer.setFileName(list.get(i).absoluteFilePath());
+ logger.log(logger.LOW, "File importing is a file: " +list.get(i).isFile());
+ logger.log(logger.LOW, "File importing is a valid: " +importer.isValidType());
if (list.get(i).isFile() && importer.isValidType()) {
if (!importer.importFile()) {
// If we can't get to the file, it is probably locked. We'll try again later.
logger.log(logger.LOW, "Unable to save externally edited file. Saving for later.");
importFilesKeep.add(list.get(i).absoluteFilePath());
- return;
+ } else {
+
+ Note newNote = importer.getNote();
+ newNote.setNotebookGuid(notebook);
+ newNote.setTitle(dir.at(i));
+ NoteMetadata metadata = new NoteMetadata();
+ metadata.setDirty(true);
+ metadata.setGuid(newNote.getGuid());
+ listManager.addNote(newNote, metadata);
+ conn.getNoteTable().addNote(newNote, true);
+ noteTableView.insertRow(newNote, metadata, true, -1);
+ listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
+ listManager.countNotebookResults(listManager.getNoteIndex());
+ importedFiles.add(list.get(i).absoluteFilePath());
}
-
- Note newNote = importer.getNote();
- newNote.setNotebookGuid(notebook);
- newNote.setTitle(dir.at(i));
- NoteMetadata metadata = new NoteMetadata();
- metadata.setDirty(true);
- metadata.setGuid(newNote.getGuid());
- listManager.addNote(newNote, metadata);
- conn.getNoteTable().addNote(newNote, true);
- noteTableView.insertRow(newNote, metadata, true, -1);
- listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
- listManager.countNotebookResults(listManager.getNoteIndex());
- importedFiles.add(list.get(i).absoluteFilePath());
}
}
}
}
public void folderImportDelete(String dirName) {
-
+ logger.log(logger.LOW, "Inside folderImportDelete");
String whichOS = System.getProperty("os.name");
if (whichOS.contains("Windows"))
dirName = dirName.replace('/','\\');
String notebook = conn.getWatchFolderTable().getNotebook(dirName);
for (int i=0; i<list.size(); i++){
+ logger.log(logger.LOW, "File found: " +list.get(i).fileName());
importer.setFileInfo(list.get(i));
importer.setFileName(list.get(i).absoluteFilePath());
+ logger.log(logger.LOW, "File importing is a file: " +list.get(i).isFile());
+ logger.log(logger.LOW, "File importing is a valid: " +importer.isValidType());
if (list.get(i).isFile() && importer.isValidType()) {
if (!importer.importFile()) {
// If we can't get to the file, it is probably locked. We'll try again later.
logger.log(logger.LOW, "Unable to save externally edited file. Saving for later.");
importFilesKeep.add(list.get(i).absoluteFilePath());
- return;
- }
+ } else {
- Note newNote = importer.getNote();
- newNote.setNotebookGuid(notebook);
- newNote.setTitle(dir.at(i));
- NoteMetadata metadata = new NoteMetadata();
- metadata.setDirty(true);
- metadata.setGuid(newNote.getGuid());
- listManager.addNote(newNote, metadata);
- conn.getNoteTable().addNote(newNote, true);
- noteTableView.insertRow(newNote, metadata, true, -1);
- listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
- listManager.countNotebookResults(listManager.getNoteIndex());
- dir.remove(dir.at(i));
+ Note newNote = importer.getNote();
+ newNote.setNotebookGuid(notebook);
+ newNote.setTitle(dir.at(i));
+ NoteMetadata metadata = new NoteMetadata();
+ metadata.setDirty(true);
+ metadata.setGuid(newNote.getGuid());
+ listManager.addNote(newNote, metadata);
+ conn.getNoteTable().addNote(newNote, true);
+ noteTableView.insertRow(newNote, metadata, true, -1);
+ listManager.updateNoteContent(newNote.getGuid(), importer.getNoteContent());
+ listManager.countNotebookResults(listManager.getNoteIndex());
+ dir.remove(dir.at(i));
+ }
}
}
}
@Override
public void changeEvent(QEvent e) {
if (e.type() == QEvent.Type.WindowStateChange) {
- if (isMinimized() && Global.showTrayIcon()) {
- e.accept();
- QTimer.singleShot(10, this, "hide()");
- return;
+ if (QSystemTrayIcon.isSystemTrayAvailable()) {
+ if (isMinimized() && (Global.showTrayIcon() || Global.showTrayIcon())) {
+ e.accept();
+ QTimer.singleShot(10, this, "hide()");
+ return;
+ }
+ if (isMaximized())
+ windowMaximized = true;
+ else
+ windowMaximized = false;
}
- if (isMaximized())
- windowMaximized = true;
- else
- windowMaximized = false;
}
}
//* 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
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<String> 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<Integer, Object> 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<String> 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("Rate limit reached.\nRetry your request in " + rateLimitDuration + " seconds."));
+ }
}