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.gui.QCursor;
import com.trolltech.qt.gui.QDesktopServices;
import com.trolltech.qt.gui.QDialog;
-import com.trolltech.qt.gui.QDockWidget;
import com.trolltech.qt.gui.QFileDialog;
import com.trolltech.qt.gui.QFileDialog.AcceptMode;
import com.trolltech.qt.gui.QFileDialog.FileMode;
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.xml.ImportData;
import cx.fbn.nevernote.xml.ImportEnex;
import cx.fbn.nevernote.xml.NoteFormatter;
+//import org.apache.thrift.TException;
public class NeverNote extends QMainWindow{
int tagDeadCount=0; // number of consecutive dead times for the tag thread
int trashDeadCount=0; // number of consecutive dead times for the trash thread
int saveThreadDeadCount=0; // number of consecutive dead times for the save thread
+ int enRelatedNotesThreadDeadCount=0; // number of consecutive dead times for the EvernoteRelatedNotes Thread
boolean disableTagThreadCheck=false;
boolean disableNotebookThreadCheck=false;
boolean disableTrashThreadCheck=false;
boolean disableSaveThreadCheck=false;
boolean disableSyncThreadCheck=false;
boolean disableIndexThreadCheck=false;
+ boolean disableENRelatedNotesThreadCheck=false;
HashMap<String, String> noteCache; // Cash of note content
HashMap<String, Boolean> readOnlyCache; // List of cashe notes that are read-only
// ICHANGED
private final TabBrowserWidget tabBrowser; // ブラウザウィンドウをタブ化
private final HashMap<Integer, TabBrowse> tabWindows; // タブウィンドウ
- private final RensoNoteList rensoNoteList; // 連想ノートリスト
- private final QDockWidget rensoNoteListDock; // 連想ノートリストドックウィジェット
+ private final RensoNoteListDock rensoNoteListDock; // 連想ノートリストドックウィジェット
ClipBoardObserver cbObserver;
String rensoNotePressedItemGuid;
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();
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();
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;
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>();
+
+ // ICHANGED
+ // 履歴記録のハッシュマップを初期化
+ historyGuids.put(index, new ArrayList<String>());
+ historyPosition.put(index, 0);
+ fromHistory.put(index, false);
mainLeftRightSplitter.addWidget(leftSplitter1);
mainLeftRightSplitter.addWidget(browserIndexSplitter);
// ICHANGED
// 連想ノートリストをセットアップ
- rensoNoteList = new RensoNoteList(conn, this);
- rensoNoteList.itemPressed.connect(this,
- "rensoNoteItemPressed(QListWidgetItem)");
- rensoNoteListDock = new QDockWidget(tr("Renso Note List"), this);
- rensoNoteListDock.setWidget(rensoNoteList);
+ rensoNoteListDock = new RensoNoteListDock(conn, this, syncRunner, iconPath, tr("Renso Note List"));
addDockWidget(DockWidgetArea.RightDockWidgetArea, rensoNoteListDock);
if (Global.getListView() == Global.View_List_Wide) {
trayIcon.setToolTip(tr("NeighborNote"));
trayIcon.setContextMenu(trayMenu);
trayIcon.activated.connect(this, "trayActivated(com.trolltech.qt.gui.QSystemTrayIcon$ActivationReason)");
-
- // 前回のタブを復元
- noteTableView.load(true);
- HashMap<Integer, String> tabs = new HashMap<Integer, String>();
- if (Global.getLastViewedTabs() != null) {
- tabs.putAll(Global.getLastViewedTabs());
- }
-
- Collection<String> guids = tabs.values();
- Iterator<String> guidIterator = guids.iterator();
- Collection<Integer> indexes = tabs.keySet();
- Iterator<Integer> indexIterator = indexes.iterator();
- noteDirty = new HashMap<Integer, Boolean>();
-
- while (guidIterator.hasNext()) {
- String guid = guidIterator.next();
- int tabIndex = indexIterator.next();
-
- currentNoteGuid = guid;
- noteDirty.put(tabIndex, false);
- if (!currentNoteGuid.trim().equals("")) {
- currentNote = conn.getNoteTable().getNote(currentNoteGuid, true, true, false, false, true);
- if (currentNote != null) {
- openTabEditor(guid, tabIndex);
- }
- }
- }
-
- // タブが0個だったら作る
- if (tabBrowser.count() <= 0) {
- TabBrowse tab = new TabBrowse(conn, tabBrowser, cbObserver);
- browserWindow = tab.getBrowserWindow();
- tabBrowser.currentChanged.disconnect();
- int index = tabBrowser.addNewTab(tab, "");
- tabBrowser.currentChanged.connect(this, "tabWindowChanged(int)");
- tabWindows.put(index, tab);
- noteDirty.put(index, false);
-
- // 履歴記録のハッシュマップを初期化
- historyGuids.put(index, new ArrayList<String>());
- historyPosition.put(index, 0);
- fromHistory.put(index, false);
- }
-
+
+ currentNoteGuid="";
currentNoteGuid = Global.getLastViewedNoteGuid();
- if (currentNoteGuid.trim().equals("")) {
+ if (currentNoteGuid.equals(""))
currentNote = new Note();
- } else {
- currentNote = conn.getNoteTable().getNote(currentNoteGuid, true,true,false,false,true);
- }
- // タブのフォーカスをcurrentNoteGuidのノートに移す
- if (tabBrowser.count() >= 2) {
- Collection<TabBrowse> tabBrowsers = tabWindows.values();
- Iterator<TabBrowse> tabBrowserIterator = tabBrowsers.iterator();
- Collection<Integer> tabIndexes = tabWindows.keySet();
- Iterator<Integer> tabIndexIterator = tabIndexes.iterator();
-
- while (tabBrowserIterator.hasNext()) {
- TabBrowse tab = tabBrowserIterator.next();
- int i = tabIndexIterator.next();
- String guid = tab.getBrowserWindow().getNote().getGuid();
- if (currentNoteGuid.equals(guid)) {
- tabBrowser.setCurrentIndex(i);
- break;
- }
- }
+ // ICHANGED
+ /* 上に移動したので要らない
+ historyGuids = new ArrayList<String>();
+ historyPosition = 0;
+ fromHistory = false;
+ */
+
+ if (!currentNoteGuid.trim().equals("")) {
+ currentNote = conn.getNoteTable().getNote(currentNoteGuid, true,true,false,false,true);
}
noteIndexUpdated(true);
}
if (Global.checkVersionUpgrade()) {
- // ICHANGED TODO とりあえず封印
- // checkForUpdates();
+ checkForUpdates();
}
// ICHANGED
saveNote();
listManager.stop();
saveWindowState();
+
+ // 連想ノートリストのEvernote関連ノート取得スレッドを終了
+ rensoNoteListDock.getRensoNoteList().stopThread();
if (tempFiles != null)
tempFiles.clear();
Global.saveWindowMaximized(isMaximized());
Global.saveCurrentNoteGuid(currentNoteGuid);
-
- // 開いていたタブ群をsettingsに保存しておく
- Collection<TabBrowse> tabBrowsers = tabWindows.values();
- Iterator<TabBrowse> tabIterator = tabBrowsers.iterator();
- Collection<Integer> tabIndexes = tabWindows.keySet();
- Iterator<Integer> indexIterator = tabIndexes.iterator();
- HashMap<Integer, String> tabs = new HashMap<Integer, String>();
- while (tabIterator.hasNext()) {
- TabBrowse tab = tabIterator.next();
- int index = indexIterator.next();
- String guid = tab.getBrowserWindow().getNote().getGuid();
- tabs.put(index, guid);
- }
- Global.setLastViewedTabs(tabs);
int sortCol = noteTableView.proxyModel.sortColumn();
int sortOrder = noteTableView.proxyModel.sortOrder().value();
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() || Global.minimizeOnClose())
trayIcon.show();
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.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);
Global.isConnected = syncRunner.isConnected;
+ boolean autoLoginMessageFlag = false;
if (!Global.isConnected) {
OAuthWindow window = new OAuthWindow(logger);
if (window.error) {
syncRunner.authToken = tokenizer.oauth_token;
syncRunner.enConnect();
Global.isConnected = syncRunner.isConnected;
+ autoLoginMessageFlag = true;
}
// Global.username = syncRunner.username;
return;
setupOnlineMenu();
setupConnectMenuOptions();
+
+ // 初回ログイン時に自動ログインが無効だったら、有効化するか確認する
+ if (autoLoginMessageFlag && !Global.automaticLogin()) {
+ if (QMessageBox.question(this, tr("Confirmation"), tr("Are you sure you want to enable the auto-login feature?"),
+ QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) == StandardButton.Yes.value()) {
+ Global.setAutomaticLogin(true);
+ }
+ }
+
logger.log(logger.HIGH, "Leaving NeverNote.remoteConnect");
-
-
}
private void setupConnectMenuOptions() {
logger.log(logger.HIGH, "entering NeverNote.setupConnectMenuOptions");
// ICHANGED
// 連想ノートリストを更新
- rensoNoteList.refreshRensoNoteList(currentNoteGuid);
+ rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid);
waitCursor(false);
logger.log(logger.HIGH, "Leaving NeverNote.noteTableSelection");
conn.getHistoryTable().addHistory("rensoItemClick", prevCurrentNoteGuid, rensoNotePressedItemGuid);
}
}
-
- private void openTabEditor(String guid) {
- openTabEditor(guid, -1);
- }
- // オーバーロード insertIndex < 0 ならば普通に追加
- private void openTabEditor(String guid, int insertIndex) {
+ // ICHANGED
+ 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;
- // 最初のタブだけ、追加後に自動的にフォーカスが移ってしまうので、一度切断する
- if (tabBrowser.count() == 0) {
- tabBrowser.currentChanged.disconnect();
- if (insertIndex < 0) {
- index = tabBrowser.addNewTab(newBrowser, noteTitle);
- } else {
- index = tabBrowser.insertNewTab(insertIndex, newBrowser, noteTitle);
- }
- tabBrowser.currentChanged.connect(this, "tabWindowChanged(int)");
- } else {
- if (insertIndex < 0) {
- index = tabBrowser.addNewTab(newBrowser, noteTitle);
- } else {
- index = tabBrowser.insertNewTab(insertIndex, newBrowser, noteTitle);
- }
- }
+ int index = tabBrowser.addNewTab(newBrowser, noteTitle);
tabWindows.put(index, newBrowser);
noteDirty.put(index, false);
addBrowseHistory();
}
}
-
- rensoNoteList.refreshRensoNoteList(currentNoteGuid);
}
// ICHANGED タブが閉じられた
fromHistory.remove(i + 1);
}
+ // タブが残り1つになったら、閉じるボタンを消す
+ if (tabBrowser.count() == 1) {
+ tabBrowser.hideTabCloseButton(0);
+ }
+
// タブの閉じるボタンを押すと、tabWindowClosingより先にtabWindowChangedが呼ばれてしまうので、手動で呼びなおす
tabWindowChanged(tabBrowser.currentIndex());
}
// IFIXED こいつのせいで、ノート追加時にcurrentNoteGuidが更新されないので消す
// noteTableView.clearSelection();
- refreshEvernoteNote(true);
- listManager.countNotebookResults(listManager.getNoteIndex());
- browserWindow.titleLabel.setFocus();
- browserWindow.titleLabel.selectAll();
-// notebookTree.updateCounts(listManager.getNotebookIndex(), listManager.getNotebookCounter());
-
// ICHANGED 新規に作成したノートとそれまで開いていたノートの関連性を追加
if (prevCurrentNoteGuid != null && !prevCurrentNoteGuid.equals("")) {
if (currentNoteGuid != null && !currentNoteGuid.equals("")) {
}
}
+ refreshEvernoteNote(true);
+ listManager.countNotebookResults(listManager.getNoteIndex());
+ browserWindow.titleLabel.setFocus();
+ browserWindow.titleLabel.selectAll();
+// notebookTree.updateCounts(listManager.getNotebookIndex(), listManager.getNotebookCounter());
+
// If the window is hidden, then we want to popup this in an external window &
if (!isVisible())
listDoubleClick();
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) {
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) {
} 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() {
refreshEvernoteNote(true);
// 連想ノートリストを更新
- rensoNoteList.refreshRensoNoteList(currentNoteGuid);
+ rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid);
}
// ICHANGD
private void rensoNoteItemPressed(QListWidgetItem current) {
logger.log(logger.HIGH, "Nevernote.rensoNoteSelectionChangeに入った");
- rensoNotePressedItemGuid = rensoNoteList.getNoteGuid(current);
+ rensoNotePressedItemGuid = rensoNoteListDock.getRensoNoteList().getNoteGuid(current);
// 右クリックだったら終了
if (QApplication.mouseButtons().isSet(MouseButton.RightButton)) {
String tableGuid = (String) ix.values().toArray()[0];
if (tableGuid.equals(rensoNotePressedItemGuid)) {
noteTableView.selectRow(i);
- return;
+ break;
}
}
}
// 除外ノートテーブルに追加
conn.getExcludedTable().addExclusion(guid, currentNoteGuid);
- rensoNoteList.refreshRensoNoteList(currentNoteGuid);
+ rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid);
}
// ICHANGED
// スター付きノートテーブルに追加
conn.getStaredTable().addStaredItem(currentNoteGuid, guid);
- rensoNoteList.refreshRensoNoteList(currentNoteGuid);
+ rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid);
}
// ICHANGED
// スター付きノートテーブルから削除
conn.getStaredTable().removeStaredItem(currentNoteGuid, guid);
- rensoNoteList.refreshRensoNoteList(currentNoteGuid);
+ rensoNoteListDock.getRensoNoteList().refreshRensoNoteList(currentNoteGuid);
}
// ICHANGED
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."));
+ }
}