/*
- * 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 org.apache.log4j.Level;
import org.apache.log4j.Logger;
-import org.apache.thrift.TException;
import org.h2.tools.ChangeFileEncryption;
import com.evernote.edam.error.EDAMNotFoundException;
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 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
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();
tabWindows = new HashMap<Integer, TabBrowse>();
tabBrowser = new TabBrowserWidget(this);
tabBrowser.setStyleSheet("QTabBar::tab{width:150px;}");
+ tabBrowser.setMovable(true);
TabBrowse tab = new TabBrowse(conn, tabBrowser, cbObserver);
browserWindow = tab.getBrowserWindow();
int index = tabBrowser.addNewTab(tab, "");
// ICHANGED
// 連想ノートリストをセットアップ
- rensoNoteList = new RensoNoteList(conn, this);
+ rensoNoteList = new RensoNoteList(conn, this, syncRunner);
rensoNoteList.itemPressed.connect(this,
"rensoNoteItemPressed(QListWidgetItem)");
rensoNoteListDock = new QDockWidget(tr("Renso Note List"), this);
noteTableView.setVisible(Global.isWindowVisible("noteList"));
menuBar.hideNoteList.setChecked(Global.isWindowVisible("noteList"));
- if (!Global.isWindowVisible("editorButtonBar"))
+ // ICHANGED
+ if (!Global.isWindowVisible("editorButtonBar")) {
+ menuBar.showEditorBar.setChecked(false);
toggleEditorButtonBar();
+ }
if (!Global.isWindowVisible("leftPanel"))
menuBar.hideLeftSide.setChecked(true);
- if (Global.isWindowVisible("noteInformation"))
+
+ // ICHANGED
+ if (Global.isWindowVisible("noteInformation")) {
+ menuBar.noteAttributes.setChecked(true);
toggleNoteInformation();
+ }
+
quotaBar.setVisible(Global.isWindowVisible("quota"));
// IFIXED quotaBar.isVisible() → Global.isWindowVisible("quota")
// なぜかquotaBar.isVisible()が常にfalseを返すようなので修正
}
if (Global.checkVersionUpgrade()) {
- // ICHANGED TODO とりあえず封印
- // checkForUpdates();
+ checkForUpdates();
+ }
+
+ // ICHANGED
+ if (currentNoteGuid == null || currentNoteGuid.equals("")) {
+ menuBar.noteAddNewTab.setEnabled(false);
}
}
saveNote();
listManager.stop();
saveWindowState();
+
+ // 連想ノートリストのEvernote関連ノート取得スレッドを終了
+ rensoNoteList.stopThread();
if (tempFiles != null)
tempFiles.clear();
status.setTagCount(listManager.getTagIndex().size());
status.setResourceCount(conn.getNoteTable().noteResourceTable.getResourceCount());
status.setWordCount(conn.getWordsTable().getWordCount());
+ status.setHistoryCount(conn.getHistoryTable().getHistoryCount());
waitCursor(false);
status.exec();
}
if (!file.open(new QIODevice.OpenMode(QIODevice.OpenModeFlag.ReadOnly,
QIODevice.OpenModeFlag.Text)))
return;
- textBox.setText(file.readAll().toString());
+ // ICHANGED 日本語文字化け対策
+ 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);
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();
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();
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);
}
// ノート追加前に開いていたノートとの関連性を記録するためにguidをとっておく
TabBrowse prevTab = (TabBrowse)tabBrowser.currentWidget();
- String prevTabGuid = prevTab.getBrowserWindow().getNote().getGuid();
+ String prevTabGuid = null;
+ if (prevTab.getBrowserWindow() != null && prevTab.getBrowserWindow().getNote() != null) {
+ prevTabGuid = prevTab.getBrowserWindow().getNote().getGuid();
+ }
openEmptyTabEditor();
addNote();
// 追加されたノートのguidを取得し、ノート追加操作履歴としてデータベースに登録
- TabBrowse addedTab = (TabBrowse)tabBrowser.currentWidget();
- String addedTabGuid = addedTab.getBrowserWindow().getNote().getGuid();
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);
}
if (selectedNoteGUIDs.size() == 0 && !currentNoteGuid.equals(""))
selectedNoteGUIDs.add(currentNoteGuid);
+ closeTabs(selectedNoteGUIDs);
for (int i=0; i<selectedNoteGUIDs.size(); i++) {
listManager.deleteNote(selectedNoteGUIDs.get(i));
}
}
}
}
+ closeTabs(selectedNoteGUIDs);
listManager.expungeNote(selectedNoteGUIDs.get(i));
// ICHANGED
}
}
currentNoteGuid = "";
-
- // ICHANGED ↓↓↓ここから↓↓↓
- // 削除したノートを外部ウィンドウで開いていたら、閉じる
- 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 < selectedNoteGUIDs.size(); i++) {
- if (guid.equals(selectedNoteGUIDs.get(i))) {
- closeWindows.add(browser);
- }
- }
+ closeExternalWindows(selectedNoteGUIDs);
+ if (currentNoteGuid == null || currentNoteGuid.equals("")) {
+ menuBar.noteAddNewTab.setEnabled(false);
}
- for (int i = closeWindows.size() - 1; i >= 0; i--) {
- closeWindows.get(i).close();
- }
- // ICHANGED ↑↑↑ここまで↑↑↑
-
- // ICHANGED ↓↓↓ここから↓↓↓
- // 削除したノートをタブで開いていたら、閉じる
+ 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();
int index = indexIterator.next();
String guid = tab.getBrowserWindow().getNote().getGuid();
- for(int i = 0; i < selectedNoteGUIDs.size(); i++){
- if(guid.equals(selectedNoteGUIDs.get(i))){
+ 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));
}
- // ICHANGED ↑↑↑ここまで↑↑↑
-
- listManager.loadNotesIndex();
- noteIndexUpdated(false);
- refreshEvernoteNote(true);
- scrollToGuid(currentNoteGuid);
- logger.log(logger.HIGH, "Leaving NeverNote.deleteNote");
}
+
+ // 対象ノートを外部ウィンドウで開いていたら閉じる
+ 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
- // ICHANGED @SuppressWarnings("unused") を削除
private void addNote() {
logger.log(logger.HIGH, "Inside NeverNote.addNote");
// browserWindow.setEnabled(true);
// 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();
} else
indexThreadDeadCount=0;
-
+ if (!rensoNoteList.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() {
// 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) { // 生存ノートテーブルへ
String tableGuid = (String) ix.values().toArray()[0];
if (tableGuid.equals(rensoNotePressedItemGuid)) {
noteTableView.selectRow(i);
- return;
+ break;
}
}
}
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 rensoNoteList;
+ }
}