OSDN Git Service

Merge branch 'en_relatednotes' into develop
authoryuki <kimaira7@gmail.com>
Wed, 3 Jul 2013 04:18:31 +0000 (13:18 +0900)
committeryuki <kimaira7@gmail.com>
Wed, 3 Jul 2013 04:18:31 +0000 (13:18 +0900)
16 files changed:
.classpath
build.xml
lib/evernote-api-1.20.jar [deleted file]
lib/evernote-api-1.25.0.jar [new file with mode: 0644]
neighbornote-osx
neighbornote.bat
neighbornote.sh
src/cx/fbn/nevernote/Global.java
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/ConfigDialog.java
src/cx/fbn/nevernote/dialog/ConfigRensoNoteListPage.java
src/cx/fbn/nevernote/dialog/ShareNotebook.java
src/cx/fbn/nevernote/gui/RensoNoteList.java
src/cx/fbn/nevernote/signals/ENRelatedNotesSignal.java [new file with mode: 0644]
src/cx/fbn/nevernote/threads/ENRelatedNotesRunner.java [new file with mode: 0644]
src/cx/fbn/nevernote/threads/SyncRunner.java

index 77ad830..1fe293f 100644 (file)
@@ -2,7 +2,7 @@
 <classpath>
        <classpathentry kind="src" path="src"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-       <classpathentry kind="lib" path="lib/evernote-api-1.20.jar"/>
+       <classpathentry kind="lib" path="lib/evernote-api-1.25.0.jar"/>
        <classpathentry kind="lib" path="lib/h2-1.3.158.jar"/>
        <classpathentry kind="lib" path="lib/libthrift.jar"/>
        <classpathentry kind="lib" path="lib/log4j-1.2.14.jar"/>
@@ -25,8 +25,8 @@
        <classpathentry kind="lib" path="lib/httpcore-4.1.jar"/>
        <classpathentry kind="lib" path="lib/httpmime-4.1.1.jar"/>
        <classpathentry kind="lib" path="lib/pdfbox-app-1.6.0.jar"/>
-       <classpathentry kind="lib" path="/usr/local/Trolltech/qtjambi-linux32-lgpl-4.5.2_01/qtjambi-4.5.2_01.jar"/>
-       <classpathentry kind="lib" path="/usr/local/Trolltech/qtjambi-linux32-lgpl-4.5.2_01/qtjambi-linux32-gcc-4.5.2_01.jar"/>
-       <classpathentry kind="lib" path="/home/zigzag/workspace/NeighborNote/lib/scribe-1.3.0.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/scribe-1.3.0.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/qtjambi-win32-lgpl-4.5.2_01/qtjambi-4.5.2_01.jar"/>
+       <classpathentry kind="lib" path="C:/pleiades/qtjambi-win32-lgpl-4.5.2_01/qtjambi-win32-msvc2005-4.5.2_01.jar"/>
        <classpathentry kind="output" path="bin"/>
 </classpath>
index d9e0187..9cb182c 100644 (file)
--- a/build.xml
+++ b/build.xml
       <pathelement location="${lib.dir}/commons-compress-1.2.jar"/>
       <pathelement location="${lib.dir}/commons-lang3-3.0.jar"/>
       <pathelement location="${lib.dir}/commons-logging-1.1.1.jar"/>
-      <pathelement location="${lib.dir}/evernote-api-1.20.jar"/>
+      <pathelement location="${lib.dir}/evernote-api-1.25.0.jar"/>
       <pathelement location="${lib.dir}/libthrift.jar"/>
       <pathelement location="${lib.dir}/log4j-1.2.14.jar"/>
       <pathelement location="${lib.dir}/h2-1.3.158.jar"/>
diff --git a/lib/evernote-api-1.20.jar b/lib/evernote-api-1.20.jar
deleted file mode 100644 (file)
index be4409c..0000000
Binary files a/lib/evernote-api-1.20.jar and /dev/null differ
diff --git a/lib/evernote-api-1.25.0.jar b/lib/evernote-api-1.25.0.jar
new file mode 100644 (file)
index 0000000..c345e15
Binary files /dev/null and b/lib/evernote-api-1.25.0.jar differ
index 78fcadf..56475de 100644 (file)
@@ -91,7 +91,7 @@ NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-codec-1.5.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-compress-1.2.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-lang3-3.0.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-logging-1.1.1.jar
-NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.20.jar
+NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.25.0.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/h2-1.3.158.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpclient-4.1.1.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpcore-4.1.jar
index b6be03e..2f9ec91 100755 (executable)
@@ -84,7 +84,7 @@ set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-codec-1.5.jar
 set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-compress-1.2.jar\r
 set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-lang3-3.0.jar\r
 set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-logging-1.1.1.jar\r
-set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\evernote-api-1.20.jar\r
+set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\evernote-api-1.25.0.jar\r
 set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\h2-1.3.158.jar\r
 set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\httpclient-4.1.1.jar\r
 set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\httpcore-4.1.jar\r
index 9dc77b6..a72d7d2 100644 (file)
@@ -86,7 +86,7 @@ NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-codec-1.5.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-compress-1.2.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-lang3-3.0.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-logging-1.1.1.jar
-NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.20.jar
+NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.25.0.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/h2-1.3.158.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpclient-4.1.1.jar
 NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpcore-4.1.jar
index de2bb02..1a731e2 100644 (file)
@@ -2223,6 +2223,29 @@ public class Global {
                settings.endGroup();
                return value;
        }
+       
+       // Evernote関連ノート機能統合に対する重み付け
+       public static void setENRelatedNotesWeight(int weight) {
+               settings.beginGroup("RensoNoteList");
+               settings.setValue("enRelatedNotesWeight", weight);
+               settings.endGroup();
+       }
+       public static int getENRelatedNotesWeight() {
+               settings.beginGroup("RensoNoteList");
+               Integer value;
+               try {
+                       String val = (String)settings.value("enRelatedNotesWeight", 10);
+                       value = new Integer(val.trim());
+               } catch (Exception e) {
+                       try {
+                               value = (Integer)settings.value("enRelatedNotesWeight", 10);
+                       } catch (Exception e1) {
+                               value = 10;
+                       }
+               }
+               settings.endGroup();
+               return value;
+       }
     
     //*******************
     // ノートのマージ・複製の関連ノートリストへの適用
index ae015b7..ff17b0d 100644 (file)
@@ -47,7 +47,6 @@ import java.util.Vector;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
-import org.apache.thrift.TException;
 import org.h2.tools.ChangeFileEncryption;
 
 import com.evernote.edam.error.EDAMNotFoundException;
@@ -66,6 +65,7 @@ import com.evernote.edam.type.Resource;
 import com.evernote.edam.type.SavedSearch;
 import com.evernote.edam.type.Tag;
 import com.evernote.edam.type.User;
+import com.evernote.thrift.TException;
 import com.trolltech.qt.QThread;
 import com.trolltech.qt.core.QByteArray;
 import com.trolltech.qt.core.QDateTime;
@@ -208,6 +208,7 @@ import cx.fbn.nevernote.xml.ExportData;
 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{
@@ -625,7 +626,7 @@ public class NeverNote extends QMainWindow{
         
                // 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);
@@ -1250,6 +1251,9 @@ public class NeverNote extends QMainWindow{
                saveNote();
                listManager.stop();
                saveWindowState();
+               
+               // 連想ノートリストのEvernote関連ノート取得スレッドを終了
+               rensoNoteList.stopThread();
 
                if (tempFiles != null)
                        tempFiles.clear();
@@ -7756,4 +7760,9 @@ public class NeverNote extends QMainWindow{
                fromHistory.put(from,  fromHistory.get(to));
                fromHistory.put(to, fromHist);
        }
+       
+       // 連想ノートリストのgetter
+       public RensoNoteList getRensoNoteList() {
+               return rensoNoteList;
+       }
 }
index 1a4cabd..d313565 100644 (file)
@@ -41,9 +41,9 @@ import com.trolltech.qt.gui.QListWidgetItem;
 import com.trolltech.qt.gui.QPushButton;\r
 import com.trolltech.qt.gui.QStackedWidget;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
-import com.trolltech.qt.gui.QWidget;\r
 \r
 import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.NeverNote;\r
 public class ConfigDialog extends QDialog {\r
        private final QListWidget                               contentsWidget;\r
        private final ConfigFontPage                    fontPage;\r
@@ -53,12 +53,13 @@ public class ConfigDialog extends QDialog {
        private final ConfigAppearancePage              appearancePage;\r
        private final ConfigSpellPage                   spellPage;\r
        private final ConfigIndexPage                   indexPage;\r
-       // ICHANGED\r
-       private final ConfigRensoNoteListPage           rensoNoteListPage;\r
+       private final ConfigRensoNoteListPage   rensoNoteListPage;\r
+       private final NeverNote                                 parent;\r
        \r
     private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
        \r
-       public ConfigDialog(QWidget parent) {\r
+       public ConfigDialog(NeverNote parent) {\r
+               this.parent = parent;\r
                \r
                contentsWidget = new QListWidget(this);\r
                setWindowIcon(new QIcon(iconPath+"config.png"));\r
@@ -231,6 +232,7 @@ public class ConfigDialog extends QDialog {
                Global.setRensoItemClickWeight(rensoNoteListPage.getRensoItemClickWeight());
                Global.setSameTagWeight(rensoNoteListPage.getSameTagWeight());
                Global.setSameNotebookWeight(rensoNoteListPage.getSameNotebookWeight());\r
+               Global.setENRelatedNotesWeight(rensoNoteListPage.getENRelatedNotesWeight());\r
                \r
                // ICHANGED\r
                Global.setMergeRensoNote(rensoNoteListPage.getMergeChecked());\r
@@ -238,6 +240,9 @@ public class ConfigDialog extends QDialog {
                Global.setVerifyExclude(rensoNoteListPage.getVerifyExcludeChecked());\r
                Global.setRensoListItemMaximum(rensoNoteListPage.getRensoListItemMaximum());\r
                \r
+               // 連想ノートリストをリフレッシュ\r
+               parent.getRensoNoteList().refreshRensoNoteList(parent.getCurrentNoteGuid());\r
+               \r
                close();\r
        }\r
        \r
@@ -262,7 +267,6 @@ public class ConfigDialog extends QDialog {
        // Create icons used for navigating the page\r
        public void createIcons() {\r
                String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
-\r
                \r
                QListWidgetItem formatsButton = new QListWidgetItem(contentsWidget);\r
                formatsButton.setText(tr("Appearance"));\r
index f680b5f..646b571 100644 (file)
@@ -39,6 +39,7 @@ public class ConfigRensoNoteListPage extends QWidget {
        private final QSlider rensoItemClickSlider;
        private final QSlider sameTagSlider;
        private final QSlider sameNotebookSlider;
+       private final QSlider enRelatedNotesSlider;
        
        private final QSpinBox browseSpinner;
        private final QSpinBox copyPasteSpinner;
@@ -47,6 +48,7 @@ public class ConfigRensoNoteListPage extends QWidget {
        private final QSpinBox sameTagSpinner;
        private final QSpinBox sameNotebookSpinner;
        private final QSpinBox rensoListItemMaximumSpinner;
+       private final QSpinBox enRelatedNotesSpinner;
        
        private final QCheckBox mergeCheck;
        private final QCheckBox duplicateCheck;
@@ -182,8 +184,30 @@ public class ConfigRensoNoteListPage extends QWidget {
                
                QHBoxLayout sameNotebookLayout = new QHBoxLayout();
                sameNotebookLayout.addWidget(sameNotebookSlider);
-               sameNotebookLayout.addWidget(sameNotebookSpinner);      
+               sameNotebookLayout.addWidget(sameNotebookSpinner);
                
+               // enRelatedNotes
+               enRelatedNotesSlider = new QSlider();
+               enRelatedNotesSlider.setOrientation(Qt.Orientation.Horizontal);
+               enRelatedNotesSlider.setRange(0, 10);
+               enRelatedNotesSlider.setSingleStep(1);
+               enRelatedNotesSlider.setTickPosition(QSlider.TickPosition.TicksAbove);
+               enRelatedNotesSlider.setTickInterval(1);
+               enRelatedNotesSlider.setFocusPolicy(Qt.FocusPolicy.StrongFocus);
+               
+               enRelatedNotesSpinner = new QSpinBox();
+               enRelatedNotesSpinner.setRange(0, 10);
+               enRelatedNotesSpinner.setSingleStep(1);
+               
+               enRelatedNotesSlider.valueChanged.connect(enRelatedNotesSpinner, "setValue(int)");
+               enRelatedNotesSpinner.valueChanged.connect(enRelatedNotesSlider, "setValue(int)");
+               enRelatedNotesSpinner.setValue(Global.getENRelatedNotesWeight());
+               
+               QHBoxLayout enRelatedNotesLayout = new QHBoxLayout();
+               enRelatedNotesLayout.addWidget(enRelatedNotesSlider);
+               enRelatedNotesLayout.addWidget(enRelatedNotesSpinner);
+               
+               // 重み付け設定部分のレイアウト
                QFormLayout styleLayout = new QFormLayout();
                styleLayout.setHorizontalSpacing(10);
                styleLayout.setVerticalSpacing(30);
@@ -193,6 +217,7 @@ public class ConfigRensoNoteListPage extends QWidget {
                styleLayout.addRow(tr("Renso Item Click Weight"), rensoItemClickLayout);
                styleLayout.addRow(tr("Same Tag Weight"), sameTagLayout);
                styleLayout.addRow(tr("Same Notebook Weight"), sameNotebookLayout);
+               styleLayout.addRow(tr("Evernote Related Notes Integration"), enRelatedNotesLayout);
 
                QGroupBox weightingGroup = new QGroupBox(tr("Weighting"));
                weightingGroup.setLayout(styleLayout);
@@ -273,6 +298,13 @@ public class ConfigRensoNoteListPage extends QWidget {
        public int getSameNotebookWeight() {
                return sameNotebookSpinner.value();
        }
+       
+       //*****************************************
+       //* Evernote Related Notes Integration Weight
+       //*****************************************
+       public int getENRelatedNotesWeight() {
+               return enRelatedNotesSpinner.value();
+       }
 
        //*****************************************
        //* Merge Check
index 5bfe630..560c23e 100644 (file)
@@ -28,13 +28,12 @@ package cx.fbn.nevernote.dialog;
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
-import org.apache.thrift.TException;\r
-\r
 import com.evernote.edam.error.EDAMNotFoundException;\r
 import com.evernote.edam.error.EDAMSystemException;\r
 import com.evernote.edam.error.EDAMUserException;\r
 import com.evernote.edam.type.Notebook;\r
 import com.evernote.edam.type.SharedNotebook;\r
+import com.evernote.thrift.TException;\r
 import com.trolltech.qt.core.QModelIndex;\r
 import com.trolltech.qt.core.Qt.ItemFlag;\r
 import com.trolltech.qt.core.Qt.ItemFlags;\r
@@ -53,6 +52,7 @@ import com.trolltech.qt.gui.QVBoxLayout;
 \r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
 import cx.fbn.nevernote.threads.SyncRunner;\r
+//import org.apache.thrift.TException;\r
 \r
 public class ShareNotebook extends QDialog {\r
        private final QPushButton                               okButton;\r
index c5d97a6..9355541 100644 (file)
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Set;
 
 import com.evernote.edam.type.Note;
+import com.trolltech.qt.QThread;
 import com.trolltech.qt.core.QSize;
 import com.trolltech.qt.core.Qt.MouseButton;
 import com.trolltech.qt.gui.QAction;
@@ -39,7 +40,10 @@ import com.trolltech.qt.gui.QMenu;
 import cx.fbn.nevernote.Global;
 import cx.fbn.nevernote.NeverNote;
 import cx.fbn.nevernote.sql.DatabaseConnection;
+import cx.fbn.nevernote.threads.ENRelatedNotesRunner;
+import cx.fbn.nevernote.threads.SyncRunner;
 import cx.fbn.nevernote.utilities.ApplicationLogger;
+import cx.fbn.nevernote.utilities.Pair;
 
 public class RensoNoteList extends QListWidget {
        private final DatabaseConnection conn;
@@ -47,22 +51,37 @@ public class RensoNoteList extends QListWidget {
        private final HashMap<QListWidgetItem, String> rensoNoteListItems;
        private final List<RensoNoteListItem> rensoNoteListTrueItems;
        private String rensoNotePressedItemGuid;
-       
        private final QAction openNewTabAction;
        private final QAction starAction;
        private final QAction unstarAction;
        private final QAction excludeNoteAction;
        private final NeverNote parent;
        private final QMenu menu;
+       private HashMap<String, Integer> mergedHistory;                         // マージされた操作履歴
+       private final SyncRunner syncRunner;
+       private final ENRelatedNotesRunner enRelatedNotesRunner;
+       private final QThread enRelatedNotesThread;
+       private final HashMap<String, List<String>> enRelatedNotesCache;        // Evernote関連ノートのキャッシュ<guid, 関連ノートリスト>
+       private String guid;
        private int allPointSum;
 
-       public RensoNoteList(DatabaseConnection c, NeverNote p) {
+       public RensoNoteList(DatabaseConnection c, NeverNote p, SyncRunner syncRunner) {
                logger = new ApplicationLogger("rensoNoteList.log");
                logger.log(logger.HIGH, "Setting up rensoNoteList");
                allPointSum = 0;
 
-               conn = c;
+               this.conn = c;
                this.parent = p;
+               this.syncRunner = syncRunner;
+               
+               this.guid = new String();
+               mergedHistory = new HashMap<String, Integer>();
+               enRelatedNotesCache = new HashMap<String, List<String>>();
+               this.enRelatedNotesRunner = new ENRelatedNotesRunner(this.syncRunner, logger);
+               this.enRelatedNotesRunner.enRelatedNotesSignal.getENRelatedNotesFinished.connect(this, "enRelatedNotesComplete()");
+               this.enRelatedNotesThread = new QThread(enRelatedNotesRunner, "ENRelatedNotes Thread");
+               this.enRelatedNotesThread.start();
+               
                rensoNoteListItems = new HashMap<QListWidgetItem, String>();
                rensoNoteListTrueItems = new ArrayList<RensoNoteListItem>();
                
@@ -94,12 +113,14 @@ public class RensoNoteList extends QListWidget {
                logger.log(logger.HIGH, "rensoNoteList setup complete");
        }
 
+       // 連想ノートリストをリフレッシュ
        public void refreshRensoNoteList(String guid) {
                logger.log(logger.HIGH, "Entering RensoNoteList.refreshRensoNoteList");
 
                this.clear();
                rensoNoteListItems.clear();
                rensoNoteListTrueItems.clear();
+               mergedHistory = new HashMap<String, Integer>();
 
                if (!this.isEnabled()) {
                        return;
@@ -107,13 +128,31 @@ public class RensoNoteList extends QListWidget {
                if (guid == null || guid.equals("")) {
                        return;
                }
-
-               HashMap<String, Integer> mergedHistory = new HashMap<String, Integer>();
                
+               this.guid = guid;
+               // すでにEvernote関連ノートがキャッシュされているか確認
+               boolean isCached;
+               isCached = enRelatedNotesCache.containsKey(guid);
+               if (!isCached) {        // キャッシュ無し
+                       // Evernoteの関連ノートを別スレッドで取得させる
+                       enRelatedNotesRunner.addGuid(guid);
+               } else {                        // キャッシュ有り
+                       List<String> relatedNoteGuids = enRelatedNotesCache.get(guid);
+                       addENRelatedNotes(relatedNoteGuids);
+               }
+               
+               calculateHistory(guid);
+               repaintRensoNoteList(false);
+
+               logger.log(logger.HIGH, "Leaving RensoNoteList.refreshRensoNoteList");
+       }
+       
+       // 操作履歴をデータベースから取得してノートごとの関連度を算出、その後mergedHistoryに追加
+       private void calculateHistory(String guid) {
                // browseHistory<guid, 回数(ポイント)>
                HashMap<String, Integer> browseHistory = conn.getHistoryTable().getBehaviorHistory("browse", guid);
                addWeight(browseHistory, Global.getBrowseWeight());
-               mergedHistory = mergeHistory(browseHistory, new HashMap<String, Integer>());
+               mergedHistory = mergeHistory(browseHistory, mergedHistory);
                
                // copy&pasteHistory<guid, 回数(ポイント)>
                HashMap<String, Integer> copyAndPasteHistory = conn.getHistoryTable().getBehaviorHistory("copy & paste", guid);
@@ -139,16 +178,6 @@ public class RensoNoteList extends QListWidget {
                HashMap<String, Integer> sameNotebookHistory = conn.getHistoryTable().getBehaviorHistory("sameNotebook", guid);
                addWeight(sameNotebookHistory, Global.getSameNotebookWeight());
                mergedHistory = mergeHistory(sameNotebookHistory, mergedHistory);
-               
-               // すべての関連ポイントの合計を取得(関連度のパーセント算出に利用)
-               allPointSum = 0;
-               for (int p : mergedHistory.values()) {
-                       allPointSum += p;
-               }
-               
-               addRensoNoteList(mergedHistory);
-
-               logger.log(logger.HIGH, "Leaving RensoNoteList.refreshRensoNoteList");
        }
        
        // 操作回数に重み付けする
@@ -161,6 +190,27 @@ public class RensoNoteList extends QListWidget {
                }
        }
        
+       // 連想ノートリストを再描画
+       private void repaintRensoNoteList(boolean needClear) {
+               if (needClear) {
+                       this.clear();
+                       rensoNoteListItems.clear();
+                       rensoNoteListTrueItems.clear();
+               }
+               
+               if (!this.isEnabled()) {
+                       return;
+               }
+               
+               // すべての関連ポイントの合計を取得(関連度のパーセント算出に利用)
+               allPointSum = 0;
+               for (int p : mergedHistory.values()) {
+                       allPointSum += p;
+               }
+               
+               addRensoNoteList(mergedHistory);
+       }
+       
        // 引数1と引数2をマージしたハッシュマップを返す
        private HashMap<String, Integer> mergeHistory(HashMap<String, Integer> History1, HashMap<String, Integer> History2){
                HashMap<String, Integer> mergedHistory = new HashMap<String, Integer>();
@@ -181,6 +231,7 @@ public class RensoNoteList extends QListWidget {
                return mergedHistory;
        }
        
+       // 連想ノートリストにハッシュマップのデータを追加
        private void addRensoNoteList(HashMap<String, Integer> History){
                String currentNoteGuid = new String(parent.getCurrentNoteGuid());
                
@@ -311,4 +362,51 @@ public class RensoNoteList extends QListWidget {
                        rensoNotePressedItemGuid = getNoteGuid(current);
                }
        }
+       
+       // Evernoteの関連ノートの取得が完了
+       @SuppressWarnings("unused")
+       private void enRelatedNotesComplete() {
+               Pair<String, List<String>> enRelatedNoteGuidPair = enRelatedNotesRunner.getENRelatedNoteGuids();        // <元ノートguid, 関連ノートguidリスト>
+               
+               if (enRelatedNoteGuidPair == null) {
+                       return;
+               }
+               
+               String sourceGuid = enRelatedNoteGuidPair.getFirst();
+               List<String> enRelatedNoteGuids = enRelatedNoteGuidPair.getSecond();
+               
+               
+               if (sourceGuid != null && !sourceGuid.equals("") && enRelatedNoteGuids != null) {       // Evernote関連ノートがnullでなければ
+                       // まずキャッシュに追加
+                       enRelatedNotesCache.put(sourceGuid, enRelatedNoteGuids);
+                       
+                       if (!enRelatedNoteGuids.isEmpty()) {    // Evernote関連ノートが存在していて
+                               if (sourceGuid.equals(this.guid)) {     // 取得したデータが今開いているノートの関連ノートなら
+                                       // mergedHistoryにEvernote関連ノートを追加してから再描画
+                                       addENRelatedNotes(enRelatedNoteGuids);
+                                       repaintRensoNoteList(true);
+                               }
+                       }
+               }
+       }
+       
+       // Evernote関連ノートの関連度情報をmergedHistoryに追加
+       private void addENRelatedNotes(List<String> relatedNoteGuids) {
+               // Evernote関連ノート<guid, 関連ポイント>
+               HashMap<String, Integer> enRelatedNotes = new HashMap<String, Integer>();
+               
+               for (String relatedGuid : relatedNoteGuids) {
+                       enRelatedNotes.put(relatedGuid, Global.getENRelatedNotesWeight());
+               }
+               
+               mergedHistory = mergeHistory(enRelatedNotes, mergedHistory);
+       }
+       
+       // Evernoteの関連ノート取得スレッドを終了させる
+       public boolean stopThread() {
+               if (enRelatedNotesRunner.addStop()) {
+                       return true;
+               }
+               return false;
+       }
 }
diff --git a/src/cx/fbn/nevernote/signals/ENRelatedNotesSignal.java b/src/cx/fbn/nevernote/signals/ENRelatedNotesSignal.java
new file mode 100644 (file)
index 0000000..89d0bab
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * This file is part of NeighborNote
+ * Copyright 2013 Yuki Takahashi
+ * 
+ * This file may be licensed under the terms of of the
+ * GNU General Public License Version 2 (the ``GPL'').
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the GPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the GPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+package cx.fbn.nevernote.signals;
+
+import com.trolltech.qt.QSignalEmitter;
+
+public class ENRelatedNotesSignal extends QSignalEmitter {
+       public Signal0 getENRelatedNotesFinished = new Signal0();
+}
diff --git a/src/cx/fbn/nevernote/threads/ENRelatedNotesRunner.java b/src/cx/fbn/nevernote/threads/ENRelatedNotesRunner.java
new file mode 100644 (file)
index 0000000..296faea
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * This file is part of NeighborNote
+ * Copyright 2013 Yuki Takahashi
+ * 
+ * This file may be licensed under the terms of of the
+ * GNU General Public License Version 2 (the ``GPL'').
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the GPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the GPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+package cx.fbn.nevernote.threads;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import com.evernote.edam.error.EDAMNotFoundException;
+import com.evernote.edam.error.EDAMSystemException;
+import com.evernote.edam.error.EDAMUserException;
+import com.evernote.edam.limits.Constants;
+import com.evernote.edam.notestore.RelatedQuery;
+import com.evernote.edam.notestore.RelatedResult;
+import com.evernote.edam.notestore.RelatedResultSpec;
+import com.evernote.edam.type.Note;
+import com.evernote.thrift.TException;
+import com.trolltech.qt.core.QMutex;
+import com.trolltech.qt.core.QObject;
+
+import cx.fbn.nevernote.Global;
+import cx.fbn.nevernote.signals.ENRelatedNotesSignal;
+import cx.fbn.nevernote.utilities.ApplicationLogger;
+import cx.fbn.nevernote.utilities.Pair;
+
+public class ENRelatedNotesRunner extends QObject implements Runnable{
+       
+       private final ApplicationLogger logger;
+       private final SyncRunner syncRunner;
+       public volatile ENRelatedNotesSignal enRelatedNotesSignal;
+       public QMutex mutex;
+       private volatile boolean keepRunning;
+       private volatile LinkedBlockingQueue<String> workQueue;
+       private volatile LinkedBlockingQueue<Pair<String, List<String>>> resultQueue;   // ペア<元ノートguid, 関連ノートguidリスト>を溜めておくキュー
+       
+       public ENRelatedNotesRunner(SyncRunner syncRunner, ApplicationLogger logger) {
+               this.logger = logger;
+               this.syncRunner = syncRunner;
+               this.enRelatedNotesSignal = new ENRelatedNotesSignal();
+               this.mutex = new QMutex();
+               this.keepRunning = true;
+               this.workQueue = new LinkedBlockingQueue<String>();
+               this.resultQueue = new LinkedBlockingQueue<Pair<String, List<String>>>();
+       }
+
+       @Override
+       public void run() {
+               thread().setPriority(Thread.MIN_PRIORITY);
+               
+               logger.log(logger.MEDIUM, "ENRelatedNotesスレッド開始");
+               while (keepRunning) {
+                       try {
+                               String work = workQueue.take();
+                               mutex.lock();
+                               if (work.startsWith("GET")) {
+                                       String guid = work.replace("GET ", "");
+                                       logger.log(logger.EXTREME, "Evernote関連ノート取得開始 guid = " + guid);
+                                       
+                                       List<Note> relatedNotes = getENRelatedNotes(guid);
+                                       
+                                       Pair<String, List<String>> resultPair = new Pair<String, List<String>>();
+                                       resultPair.setFirst(guid);
+                                       if (relatedNotes == null) {                             // 取得に失敗
+                                               logger.log(logger.EXTREME, "Evernote関連ノートの取得に失敗");
+                                       } else if (relatedNotes.isEmpty()) {    // このノートにEvernote関連ノートは存在しない
+                                               logger.log(logger.EXTREME, "Evernote関連ノートの取得に成功 関連ノートは存在しなかった");
+                                               resultPair.setSecond(new ArrayList<String>());
+                                       } else {                                                                // Evernote関連ノートが存在する
+                                               logger.log(logger.EXTREME, "Evernote関連ノートの取得に成功 関連ノートは存在した");
+                                               List<String> relatedNoteGuids = new ArrayList<String>();
+                                               for (Note relatedNote : relatedNotes) {
+                                                       relatedNoteGuids.add(relatedNote.getGuid());
+                                               }
+                                               resultPair.setSecond(relatedNoteGuids);
+                                       }
+                                       
+                                       resultQueue.offer(resultPair);
+                                       enRelatedNotesSignal.getENRelatedNotesFinished.emit();
+                                       logger.log(logger.EXTREME, "Evernote関連ノート取得完了 guid = " + guid);
+                               } else if (work.startsWith("STOP")) {
+                                       logger.log(logger.MEDIUM, "ENRelatedNotesスレッド停止");
+                                       keepRunning = false;
+                               }
+                               mutex.unlock();
+                       } catch (InterruptedException e) {
+                               // TODO 自動生成された catch ブロック
+                               e.printStackTrace();
+                       }
+               }
+       }
+       
+       private List<Note> getENRelatedNotes(String guid) {
+               RelatedResult result = getENRelatedResult(guid);
+               List<Note> relatedNotes = new ArrayList<Note>();
+               
+               if (result != null) {
+                       relatedNotes = result.getNotes();
+                       return relatedNotes;
+               }
+               
+               return null;
+       }
+       
+       private RelatedResult getENRelatedResult(String guid) {
+               if (!Global.isConnected) {
+                       return null;
+               }
+               
+               RelatedQuery rquery = new RelatedQuery();
+               rquery.setNoteGuid(guid);
+               RelatedResultSpec resultSpec = new RelatedResultSpec();
+               resultSpec.setMaxNotes(Constants.EDAM_RELATED_MAX_NOTES);
+               if (syncRunner != null && syncRunner.localNoteStore != null) {
+                       try {
+                               RelatedResult result = syncRunner.localNoteStore.findRelated(syncRunner.authToken, rquery, resultSpec);
+                               return result;
+                       } catch (EDAMUserException e) {
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMUserException");
+                       } catch (EDAMSystemException e) {
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMSystemException");
+                       } catch (EDAMNotFoundException e) {
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMnotFoundException guid = " + guid);
+                       } catch (TException e) {
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:TException");
+                       }
+               }
+               return null;
+       }
+
+       public boolean isKeepRunning() {
+               return keepRunning;
+       }
+
+       public void setKeepRunning(boolean keepRunning) {
+               this.keepRunning = keepRunning;
+       }
+       
+       public synchronized boolean addGuid(String guid) {
+               if (workQueue.offer("GET " + guid)) {
+                       return true;
+               }
+               
+               return false;
+       }
+       
+       public synchronized boolean addStop() {
+               if (workQueue.offer("STOP")) {
+                       return true;
+               }
+               return false;
+       }
+       
+       public synchronized Pair<String, List<String>> getENRelatedNoteGuids() {
+               try {
+                       return resultQueue.take();
+               } catch (InterruptedException e) {
+                       // TODO 自動生成された catch ブロック
+                       e.printStackTrace();
+               }
+               
+               return null;
+       }
+}
index 19fc684..4ecda4c 100644 (file)
@@ -45,10 +45,6 @@ import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.protocol.HTTP;
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.transport.THttpClient;
-import org.apache.thrift.transport.TTransportException;
 
 import com.evernote.edam.error.EDAMNotFoundException;
 import com.evernote.edam.error.EDAMSystemException;
@@ -68,6 +64,10 @@ import com.evernote.edam.type.Tag;
 import com.evernote.edam.type.User;
 import com.evernote.edam.userstore.AuthenticationResult;
 import com.evernote.edam.userstore.UserStore;
+import com.evernote.thrift.TException;
+import com.evernote.thrift.protocol.TBinaryProtocol;
+import com.evernote.thrift.transport.THttpClient;
+import com.evernote.thrift.transport.TTransportException;
 import com.trolltech.qt.core.QByteArray;
 import com.trolltech.qt.core.QFile;
 import com.trolltech.qt.core.QIODevice.OpenModeFlag;
@@ -86,6 +86,10 @@ import cx.fbn.nevernote.signals.TagSignal;
 import cx.fbn.nevernote.sql.DatabaseConnection;
 import cx.fbn.nevernote.sql.DeletedItemRecord;
 import cx.fbn.nevernote.utilities.ApplicationLogger;
+//import org.apache.thrift.transport.THttpClient;
+//import org.apache.thrift.transport.TTransportException;
+//import org.apache.thrift.protocol.TBinaryProtocol;
+//import org.apache.thrift.TException;
 
 public class SyncRunner extends QObject implements Runnable {
        
@@ -123,8 +127,6 @@ public class SyncRunner extends QObject implements Runnable {
     public volatile String username = ""; 
     public volatile String password = ""; 
        public volatile String userStoreUrl;
-//         private final static String consumerKey = "baumgarte"; 
-//         private final static String consumerSecret = "eb8b5740e17cb55f";
     public String noteStoreUrlBase;
     private THttpClient userStoreTrans;
     private TBinaryProtocol userStoreProt;
@@ -1554,6 +1556,7 @@ public class SyncRunner extends QObject implements Runnable {
                }
                userStoreProt = new TBinaryProtocol(userStoreTrans);
            userStore = new UserStore.Client(userStoreProt, userStoreProt);
+           
            syncSignal.saveUserStore.emit(userStore);
            try {
                        //authResult = userStore.authenticate(username, password, consumerKey, consumerSecret);