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;
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;
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>();
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;
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);
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");
}
// 操作回数に重み付けする
}
}
+ // 連想ノートリストを再描画
+ 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>();
return mergedHistory;
}
+ // 連想ノートリストにハッシュマップのデータを追加
private void addRensoNoteList(HashMap<String, Integer> History){
String currentNoteGuid = new String(parent.getCurrentNoteGuid());
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;
+ }
}