/*
* 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.gui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import com.trolltech.qt.core.QSize;
import com.trolltech.qt.gui.QComboBox;
import com.trolltech.qt.gui.QDockWidget;
import com.trolltech.qt.gui.QIcon;
import com.trolltech.qt.gui.QLabel;
import com.trolltech.qt.gui.QMessageBox;
import com.trolltech.qt.gui.QPushButton;
import com.trolltech.qt.gui.QSizePolicy;
import com.trolltech.qt.gui.QToolBar;
import com.trolltech.qt.gui.QVBoxLayout;
import com.trolltech.qt.gui.QWidget;
import cx.fbn.nevernote.Global;
import cx.fbn.nevernote.NeverNote;
import cx.fbn.nevernote.sql.DatabaseConnection;
import cx.fbn.nevernote.threads.SyncRunner;
import cx.fbn.nevernote.utilities.ApplicationLogger;
public class RensoNoteListDock extends QDockWidget {
private final DatabaseConnection conn;
private final NeverNote parent;
private final SyncRunner syncRunner;
private final ApplicationLogger logger;
private final QPushButton haltLogButton; // 操作ログの取得を停止ボタン
private final QComboBox weightingModeSelect; // 連想ノートリストの重み付けプリセットモード
private final RensoNoteList rensoNoteList; // 連想ノートリスト
private final QToolBar rensoToolBar; // 連想ノートリストドックのツールバー
private enum PresetMode {Standard, ConcurrentBrowse, OperationToOrganize, ContentSimilarity, Custom}; // プリセットモード一覧
private final String iconPath;
public RensoNoteListDock(DatabaseConnection conn, NeverNote parent, SyncRunner syncRunner, String iconPath, String title) {
super(title);
this.logger = new ApplicationLogger("rensoNoteList.log");
this.logger.log(this.logger.HIGH, "Setting up rensoNoteListDock");
this.conn = conn;
this.parent = parent;
this.iconPath = iconPath;
this.syncRunner = syncRunner;
QVBoxLayout vLayout = new QVBoxLayout();
rensoToolBar = new QToolBar();
vLayout.addWidget(rensoToolBar);
QLabel modeLabel = new QLabel(tr("Mode: "));
modeLabel.setToolTip(tr("Preset Weighting Mode"));
rensoToolBar.addWidget(modeLabel);
weightingModeSelect = new QComboBox();
weightingModeSelect.setMaximumWidth(150);
weightingModeSelect.setToolTip(tr("Preset Weighting Mode"));
weightingModeSelect.insertItem(PresetMode.Standard.ordinal(), tr("Standard"));
weightingModeSelect.insertItem(PresetMode.ConcurrentBrowse.ordinal(), tr("Concurrent Browse"));
weightingModeSelect.insertItem(PresetMode.OperationToOrganize.ordinal(), tr("Operation to Organize"));
weightingModeSelect.insertItem(PresetMode.ContentSimilarity.ordinal(), tr("Content Similarity"));
weightingModeSelect.insertItem(PresetMode.Custom.ordinal(), tr("Custom"));
int savedModeIndex = 0;
try {
savedModeIndex = PresetMode.valueOf(Global.rensoWeightingSelect()).ordinal();
} catch (Exception e) {
this.logger.log(this.logger.EXTREME, "Exception in weightingModeSelect = " + e);
}
if (savedModeIndex >= 0) {
weightingModeSelect.setCurrentIndex(savedModeIndex);
} else {
weightingModeSelect.setCurrentIndex(0);
}
weightingModeSelect.currentIndexChanged.connect(this, "weightingModeChanged(int)");
rensoToolBar.addWidget(weightingModeSelect);
haltLogButton = new QPushButton();
QIcon haltLogIcon = new QIcon(this.iconPath + "haltLog.png");
haltLogButton.setIcon(haltLogIcon);
haltLogButton.setIconSize(new QSize(24, 24));
haltLogButton.setToolTip(tr("Halt Collectiong Operation Log"));
haltLogButton.setCheckable(true);
haltLogButton.setChecked(Global.isHaltLogButton());
haltLogButton.toggled.connect(this, "haltLogToggled(boolean)");
// ログ取得停止ボタンを右寄せするためのスペーサ
QWidget spacer = new QWidget();
spacer.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
rensoToolBar.addWidget(spacer);
rensoToolBar.addWidget(haltLogButton);
rensoNoteList = new RensoNoteList(this.conn, this.parent, this.syncRunner, this.logger);
getRensoNoteList().itemPressed.connect(this.parent, "rensoNoteItemPressed(QListWidgetItem)");
vLayout.addWidget(getRensoNoteList());
QWidget w = new QWidget();
w.setLayout(vLayout);
this.setWidget(w);
}
@SuppressWarnings("unused")
private void weightingModeChanged(int modeIndex) {
logger.log(logger.EXTREME, "RensoNoteListDock.weightingModeChanged modeIndex = " + modeIndex);
PresetMode mode = Global.fromOrdinal(PresetMode.class, modeIndex);
// プリセットの重み付けマップを用意
// 値は同時閲覧、コピペ、新規ノート追加、連想ノートクリック、同じタグ、同じノートブック、Evernote関連ノートの順
Map<PresetMode, List<Integer>> presetMap = new EnumMap<PresetMode, List<Integer>>(PresetMode.class);
presetMap.put(PresetMode.Standard, Arrays.asList(1, 3, 3, 10, 2, 2, 5));
presetMap.put(PresetMode.ConcurrentBrowse, Arrays.asList(5, 2, 3, 10, 1, 1, 2));
presetMap.put(PresetMode.OperationToOrganize, Arrays.asList(1, 2, 3, 10, 5, 5, 2));
presetMap.put(PresetMode.ContentSimilarity, Arrays.asList(1, 2, 2, 10, 1, 1, 10));
presetMap.put(PresetMode.Custom, Arrays.asList(Global.customBrowseWeight(), Global.customCopyPasteWeight(),
Global.customAddNewNoteWeight(), Global.customRensoItemClickWeight(), Global.customSameTagWeight(),
Global.customSameNotebookWeight(), Global.customENRelatedNotesWeight()));
List<Integer> weightList = new ArrayList<Integer>(presetMap.get(mode));
Global.setBrowseWeight(weightList.get(0));
Global.setCopyPasteWeight(weightList.get(1));
Global.setAddNewNoteWeight(weightList.get(2));
Global.setRensoItemClickWeight(weightList.get(3));
Global.setSameTagWeight(weightList.get(4));
Global.setSameNotebookWeight(weightList.get(5));
Global.setENRelatedNotesWeight(weightList.get(6));
Global.saveRensoWeightingSelect(mode.name());
// 連想ノートリストをリフレッシュ
if (rensoNoteList != null && rensoNoteList.getGuid() != null ) {
rensoNoteList.refreshRensoNoteList();
// カスタムモードかつアプリ起動時以外なら、メッセージ表示
if (mode == PresetMode.Custom) {
QMessageBox.information(this, tr("Information"), tr("Custom mode was selected.\nYou can customize weighting manually in the Edit/Preferences/Renso Note List."));
}
}
}
@SuppressWarnings("unused")
private void haltLogToggled(boolean checked) {
logger.log(logger.EXTREME, "RensoNoteListDock.haltLogToggled");
if (checked) {
QMessageBox.information(this, tr("Information"), tr("Collecting operation log halted.\nYou can resume, if you press this button again."));
}
Global.saveHaltLogButton(checked);
}
public RensoNoteList getRensoNoteList() {
return rensoNoteList;
}
}