OSDN Git Service

edd1eaaba46f7aad68644cbad3e961372d40b0dc
[gefu/Gefu.git] / mainwindow.cpp
1 #include "global.h"\r
2 #include "version.h"\r
3 #include "preferencedialog.h"\r
4 #include "foldermodel.h"\r
5 #include "folderpanel.h"\r
6 #include "copymoveworker.h"\r
7 #include "operationdialog.h"\r
8 #include "overwritedialog.h"\r
9 #include "deleteworker.h"\r
10 #include "renameworker.h"\r
11 #include "renamesingledialog.h"\r
12 #include "renamemultidialog.h"\r
13 #include "historydialog.h"\r
14 #include "sortdialog.h"\r
15 #include "simpletextview.h"\r
16 #include "simpleimageview.h"\r
17 #include "bookmarkdialog.h"\r
18 #include "preferences.h"\r
19 #include "mainwindow.h"\r
20 #include "ui_mainwindow.h"\r
21 \r
22 #include <QCheckBox>\r
23 #include <QCloseEvent>\r
24 #include <QDebug>\r
25 #include <QMessageBox>\r
26 #include <QMimeData>\r
27 #include <QNetworkAccessManager>\r
28 #include <QInputDialog>\r
29 #include <QProcess>\r
30 #include <QDesktopServices>\r
31 #include <QClipboard>\r
32 #include <QFileDialog>\r
33 \r
34 ///////////////////////////////////////////////////////////////////////////////\r
35 /// \brief MainWindow::MainWindow\r
36 /// \param parent   親ウィジェット\r
37 ///\r
38 /// コンストラクタ\r
39 ///\r
40 MainWindow::MainWindow(QWidget *parent) :\r
41     QMainWindow(parent),\r
42     ui(new Ui::MainWindow),\r
43     m_overwriteDialog(this),\r
44     m_viewMode(ModeBasic),\r
45     m_prevMode(ModeBasic),\r
46     m_actions()\r
47 {\r
48     ui->setupUi(this);\r
49     connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(app_focusChange(QWidget*,QWidget*)));\r
50 \r
51     // ステータスバーにウィジェットを設定する\r
52     QLabel *label = new QLabel(this);\r
53     label->setAlignment(Qt::AlignRight);\r
54     label->setObjectName("Right");\r
55     ui->statusBar->addPermanentWidget(label, 0);\r
56 \r
57     // アプリケーション情報を初期化する\r
58     qApp->setApplicationName("Gefu");\r
59     qApp->setApplicationVersion(QString("%1").arg(VERSION_VALUE));\r
60     qApp->setOrganizationDomain("sourceforge.jp");\r
61     qApp->setOrganizationName("gefu");\r
62     qApp->setWindowIcon(QIcon("://images/file-manager.png"));\r
63 \r
64     // 古い設定ファイルを削除する\r
65 #ifdef Q_OS_MAC\r
66     QSettings::setDefaultFormat(QSettings::IniFormat);\r
67     QSettings settings(this);\r
68     if (QFileInfo::exists(settings.fileName())) {\r
69         QFile(settings.fileName()).remove();\r
70         QDir().rmdir(QFileInfo(settings.fileName()).absolutePath());\r
71     }\r
72 #endif\r
73 \r
74     // パネルにモデルを割り当てる\r
75     ui->LPanel->setModel(new FolderModel(this));\r
76     ui->RPanel->setModel(new FolderModel(this));\r
77     setActiveModel(ui->LPanel->model());\r
78 \r
79     // パネルを初期化する\r
80     ui->LPanel->initialize(this);\r
81     ui->RPanel->initialize(this);\r
82     ui->FPanel->initialize(this);\r
83     ui->FPanel->setVisible(false);\r
84 \r
85     // モデルを初期化する\r
86     Preferences prefs(this);\r
87     prefs.restoreModel("Left", ui->LPanel->model());\r
88     prefs.restoreModel("Right", ui->RPanel->model());\r
89 \r
90     // アクションを初期化する\r
91     initActions();\r
92 \r
93     // ブックマークメニューを初期化する\r
94     initBookmarkMenu();\r
95 \r
96     // メインウィンドウを初期化する\r
97     setWindowTitle(tr("げふぅ Ver%1").arg(VERSION_VALUE));\r
98     setWindowIcon(QIcon("://images/file-manager.png"));\r
99     prefs.restoreWindow(this);\r
100 \r
101     // 最新バージョンをチェックする\r
102     if (prefs.isCheckUpdate()) {\r
103         onCheckUpdate(true);\r
104     }\r
105 \r
106     ui->LPanel->updateAppearance(prefs);\r
107     ui->LPanel->model()->updateAppearance(prefs);\r
108     ui->RPanel->updateAppearance(prefs);\r
109     ui->RPanel->model()->updateAppearance(prefs);\r
110 }\r
111 \r
112 ///////////////////////////////////////////////////////////////////////////////\r
113 /// \brief MainWindow::~MainWindow\r
114 ///\r
115 /// デストラクタ\r
116 ///\r
117 MainWindow::~MainWindow()\r
118 {\r
119     delete ui;\r
120 }\r
121 \r
122 ///////////////////////////////////////////////////////////////////////////////\r
123 /// \brief MainWindow::app_focusChange\r
124 /// \param old  フォーカスを失うウィジェット\r
125 /// \param now  フォーカスを得るウィジェット\r
126 ///\r
127 /// フォーカス変更時の処理\r
128 ///\r
129 void MainWindow::app_focusChange(QWidget *old, QWidget *now)\r
130 {\r
131     qDebug() << "MainWindow::app_focusChange()";\r
132     if (old) qDebug() << "  old is" << old->objectName();\r
133     if (now) qDebug() << "  now is" << now->objectName();\r
134 \r
135     // フォルダビューがフォーカスを得た場合\r
136     if (now && (now->objectName() == "folderView" ||\r
137                 now->objectName() == "thumbnailView"))\r
138     {\r
139         connect(focusItemView()->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),\r
140                 this, SLOT(view_currentChanged(QModelIndex,QModelIndex)));\r
141         FolderModel *m = static_cast<FolderModel*>(focusItemView()->model());\r
142         setActiveModel(m);\r
143         ui->statusBar->showMessage(m->filePath(focusItemView()->currentIndex()));\r
144     }\r
145 \r
146     // 検索ボックスがフォーカスを失った場合\r
147     if (old && old->objectName() == "searchBox") {\r
148         // 検索モード終了\r
149         ui->toggle_Search->setChecked(false);\r
150     }\r
151 \r
152     // アクションの有効/無効を設定する\r
153     if (now) {\r
154         updateActions();\r
155     }\r
156 }\r
157 \r
158 ///////////////////////////////////////////////////////////////////////////////\r
159 /// \brief MainWindow::model_PreReset\r
160 ///\r
161 /// FolderModelリセット前の処理\r
162 ///\r
163 void MainWindow::model_PreReset()\r
164 {\r
165     qDebug() << "MainWindow::model_PreReset()";\r
166 \r
167     ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));\r
168 }\r
169 \r
170 ///////////////////////////////////////////////////////////////////////////////\r
171 /// \brief MainWindow::model_PostReset\r
172 ///\r
173 /// FolderModelリセット後の処理\r
174 ///\r
175 void MainWindow::model_PostReset()\r
176 {\r
177     qDebug() << "MainWindow::model_PostReset()";\r
178 \r
179     FolderModel *m = static_cast<FolderModel*>(sender());\r
180     if (!m->error().isEmpty()) {\r
181         ui->statusBar->showMessage(m->error());\r
182     }\r
183     else {\r
184         ui->statusBar->showMessage(tr("レディ"));\r
185     }\r
186 }\r
187 \r
188 ///////////////////////////////////////////////////////////////////////////////\r
189 /// \brief MainWindow::onRunCommand\r
190 ///\r
191 /// 入力されたコマンドを実行します。\r
192 ///\r
193 void MainWindow::onRunCommand()\r
194 {\r
195     qDebug() << "MainWindow::onRunCommand";\r
196 \r
197     QFileInfoList list = selectedItems();\r
198     QString command = QString::null;\r
199     foreach (const QFileInfo &info, list) {\r
200 #ifdef Q_OS_MAC\r
201         QString path = info.absoluteFilePath();\r
202 #else\r
203         QString path = info.fileName();\r
204 #endif\r
205         if (info.isExecutable()) {\r
206             command = QQ(path) + " " + command;\r
207         }\r
208         else {\r
209             command += " " + QQ(path);\r
210         }\r
211     }\r
212 \r
213     QInputDialog dlg(this);\r
214     dlg.setInputMode(QInputDialog::TextInput);\r
215     dlg.setWindowTitle(tr("コマンドを実行"));\r
216     dlg.setLabelText(tr("コマンド:"));\r
217     dlg.setTextValue(command);\r
218     dlg.resize(width() * 0.8, dlg.height());\r
219 \r
220     int ret = dlg.exec();\r
221     command = dlg.textValue();\r
222     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
223         startProcess(command, tr("コマンドの実行に失敗しました。"));\r
224     }\r
225 }\r
226 \r
227 ///////////////////////////////////////////////////////////////////////////////\r
228 /// \brief MainWindow::onExpandLeft\r
229 ///\r
230 /// 左パネルを拡大します。\r
231 ///\r
232 void MainWindow::onExpandLeft()\r
233 {\r
234     qDebug() << "MainWindow::onExpandLeft()";\r
235 \r
236     QList<int> sizes = ui->splitter->sizes();\r
237     QList<int> newSizes;\r
238 \r
239     newSizes << sizes[0] + 30;\r
240     newSizes << sizes[1] - 30;\r
241 \r
242     ui->splitter->setSizes(newSizes);\r
243 }\r
244 \r
245 ///////////////////////////////////////////////////////////////////////////////\r
246 /// \brief MainWindow::onExpandRight\r
247 ///\r
248 /// 右パネルを拡大します。\r
249 ///\r
250 void MainWindow::onExpandRight()\r
251 {\r
252     qDebug() << "MainWindow::onExpandLeft()";\r
253 \r
254     QList<int> sizes = ui->splitter->sizes();\r
255     QList<int> newSizes;\r
256 \r
257     newSizes << sizes[0] - 30;\r
258     newSizes << sizes[1] + 30;\r
259 \r
260     ui->splitter->setSizes(newSizes);\r
261 }\r
262 \r
263 ///////////////////////////////////////////////////////////////////////////////\r
264 /// \brief MainWindow::onToggleMark\r
265 ///\r
266 /// マーク状態を反転します。\r
267 ///\r
268 void MainWindow::onToggleMark()\r
269 {\r
270     qDebug() << "MainWindow::onToggleMark()";\r
271 \r
272     QModelIndex index = focusItemView()->currentIndex();\r
273     if (activeModel()->isMarked(index)) {\r
274         activeModel()->setData(index, Qt::Unchecked, Qt::CheckStateRole);\r
275     }\r
276     else {\r
277         activeModel()->setData(index, Qt::Checked, Qt::CheckStateRole);\r
278     }\r
279 \r
280     if (index.row() < activeModel()->rowCount() - 1) {\r
281         index = activeModel()->index(index.row() + 1, 0);\r
282         focusItemView()->setCurrentIndex(index);\r
283     }\r
284 }\r
285 \r
286 ///////////////////////////////////////////////////////////////////////////////\r
287 /// \brief MainWindow::view_statusChanged\r
288 /// \param text ステータス文字列\r
289 ///\r
290 /// ビューから受け取った文字列をステータスバーに表示します。\r
291 ///\r
292 void MainWindow::view_statusChanged(const QString &text)\r
293 {\r
294     ui->statusBar->findChild<QLabel*>("Right")->setText(text);\r
295 }\r
296 \r
297 ///////////////////////////////////////////////////////////////////////////////\r
298 /// \brief MainWindow::view_currentChanged\r
299 /// \param current  新しいカレントインデックス\r
300 /// \param previous (使用しません)\r
301 ///\r
302 /// カレントインデックスが変更された場合の処理を行います。\r
303 ///\r
304 void MainWindow::view_currentChanged(const QModelIndex &current, const QModelIndex &previous)\r
305 {\r
306     qDebug() << "MainWindow::view_currentChanged()" << current;\r
307     Q_UNUSED(previous);\r
308 \r
309     if (focusItemView() != sender()->parent()) {\r
310         return;\r
311     }\r
312 \r
313     ui->statusBar->showMessage(activeModel()->filePath(current));\r
314 \r
315     if (m_viewMode == ModePreview) {\r
316         inactivePanel()->setViewItem(current);\r
317     }\r
318 \r
319     updateActions();\r
320 }\r
321 \r
322 ///////////////////////////////////////////////////////////////////////////////\r
323 /// \brief MainWindow::view_finished\r
324 ///\r
325 /// ビューアの終了\r
326 ///\r
327 void MainWindow::view_finished()\r
328 {\r
329     qDebug() << "MainWindow::view_finished()";\r
330 \r
331     ui->statusBar->findChild<QLabel*>("Right")->setText("");\r
332 \r
333     setViewMode(m_prevMode);\r
334 }\r
335 \r
336 ///////////////////////////////////////////////////////////////////////////////\r
337 /// \brief MainWindow::onMove\r
338 ///\r
339 /// 選択アイテムを隣のパネルに移動します。\r
340 ///\r
341 void MainWindow::onMove()\r
342 {\r
343     qDebug() << "MainWindow::onMove";\r
344 \r
345     QFileInfoList list = selectedItems();\r
346     if (list.isEmpty()) {\r
347         return;\r
348     }\r
349 \r
350     int row = focusItemView()->currentIndex().row();\r
351 \r
352     QString tgtPath = inactiveModel()->rootPath();\r
353     moveItems(list, tgtPath);\r
354 \r
355     if (row >= activeModel()->rowCount()) {\r
356         row = activeModel()->rowCount() - 1;\r
357     }\r
358     focusItemView()->setCurrentIndex(activeModel()->index(row, 1));\r
359 }\r
360 \r
361 ///////////////////////////////////////////////////////////////////////////////\r
362 /// \brief MainWindow::onKeyLeft\r
363 ///\r
364 /// ←キー押下時の処理を行います。\r
365 ///\r
366 void MainWindow::onKeyLeft()\r
367 {\r
368     qDebug() << "MainWindow::onKeyLeft()";\r
369 \r
370     QWidget *w = qApp->focusWidget();\r
371     if (w->objectName() == "folderView")\r
372     {\r
373         QWidget *panel = w->parentWidget()->parentWidget();\r
374         if (panel == ui->LPanel) {\r
375             activeModel()->onCdUp();\r
376         }\r
377         else if (ui->LPanel->folderPanel()->isVisible()){\r
378             ui->LPanel->folderPanel()->itemView()->setFocus();\r
379         }\r
380     }\r
381     else {\r
382         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);\r
383         qApp->sendEvent(w, &event);\r
384     }\r
385 }\r
386 \r
387 ///////////////////////////////////////////////////////////////////////////////\r
388 /// \brief MainWindow::onKeyRight\r
389 ///\r
390 /// →キー押下時の処理を行います。\r
391 ///\r
392 void MainWindow::onKeyRight()\r
393 {\r
394     qDebug() << "MainWindow::onKeyRight()";\r
395 \r
396     QWidget *w = qApp->focusWidget();\r
397     if (w->objectName() == "folderView")\r
398     {\r
399         QWidget *panel = w->parentWidget()->parentWidget();\r
400         if (panel == ui->RPanel) {\r
401             activeModel()->onCdUp();\r
402         }\r
403         else if (ui->RPanel->folderPanel()->isVisible()){\r
404             ui->RPanel->folderPanel()->itemView()->setFocus();\r
405         }\r
406     }\r
407     else {\r
408         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);\r
409         qApp->sendEvent(w, &event);\r
410     }\r
411 }\r
412 \r
413 ///////////////////////////////////////////////////////////////////////////////\r
414 /// \brief MainWindow::onChooseFolder\r
415 ///\r
416 /// 選択したフォルダに移動します。\r
417 ///\r
418 void MainWindow::onChooseFolder()\r
419 {\r
420     qDebug() << "MainWindow::onChooseFolder()";\r
421 \r
422     QString path = QFileDialog::getExistingDirectory(\r
423                 this, tr("フォルダを選択"), activeModel()->rootPath());\r
424     if (!path.isEmpty()) {\r
425         activeModel()->setRootPath(path);\r
426 //        updateActions();\r
427     }\r
428 }\r
429 \r
430 ///////////////////////////////////////////////////////////////////////////////\r
431 /// \brief MainWindow::onCopyFileName\r
432 ///\r
433 /// ファイル名をクリップボードにコピーします。\r
434 ///\r
435 void MainWindow::onCopyFileName()\r
436 {\r
437     qDebug() << "MainWindow::onCopyFileName()";\r
438 \r
439     QClipboard *clipboard = qApp->clipboard();\r
440     clipboard->setText(activeModel()->fileName(focusItemView()->currentIndex()));\r
441 }\r
442 \r
443 ///////////////////////////////////////////////////////////////////////////////\r
444 /// \brief MainWindow::onCopyFilePath\r
445 ///\r
446 /// フルパスをクリップボードにコピーします。\r
447 ///\r
448 void MainWindow::onCopyFilePath()\r
449 {\r
450     qDebug() << "MainWindow::onCopyFilePath()";\r
451 \r
452     QClipboard *clipboard = qApp->clipboard();\r
453     clipboard->setText(activeModel()->filePath(focusItemView()->currentIndex()));\r
454 }\r
455 \r
456 ///////////////////////////////////////////////////////////////////////////////\r
457 /// \brief MainWindow::askOverWrite\r
458 /// \param copyMethod   上書き方法\r
459 /// \param alias        別名\r
460 /// \param srcPath      コピー元パス\r
461 /// \param tgtPath      コピー先パス\r
462 ///\r
463 /// 上書きの処理方法を選択するダイアログを表示します。\r
464 ///\r
465 void MainWindow::askOverWrite(QString *copyMethod,\r
466                               QString *alias,\r
467                               const QString &srcPath,\r
468                               const QString &tgtPath)\r
469 {\r
470     qDebug() << "MainWindow::askOverWrite()";\r
471 \r
472     CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
473     if (!m_overwriteDialog.isKeepSetting() ||\r
474         m_overwriteDialog.copyMethod() == "rbRename")\r
475     {\r
476         m_overwriteDialog.setFileInfo(srcPath, tgtPath);\r
477         if (m_overwriteDialog.exec() == QDialog::Rejected) {\r
478             worker->requestStop();\r
479         }\r
480     }\r
481     *copyMethod = m_overwriteDialog.copyMethod();\r
482     *alias = m_overwriteDialog.alias();\r
483 \r
484     worker->endAsking();\r
485 }\r
486 \r
487 ///////////////////////////////////////////////////////////////////////////////\r
488 /// \brief MainWindow::onAddBookmark\r
489 ///\r
490 /// ブックマークを追加します。\r
491 ///\r
492 void MainWindow::onAddBookmark()\r
493 {\r
494     qDebug() << "MainWindow::onAddBookmark()";\r
495     qDebug() << sender()->objectName();\r
496 \r
497     FolderModel *m;\r
498     if (sender()->objectName() == "bookmarkBtn") {\r
499         FolderPanel *p = static_cast<FolderPanel*>(sender()->parent());\r
500         m = p->model();\r
501     }\r
502     else {\r
503         m = activeModel();\r
504     }\r
505 \r
506     QFileInfo fi(m->rootPath());\r
507     Preferences(this).addBookmark(fi.fileName(), fi.absoluteFilePath());\r
508     initBookmarkMenu();\r
509 \r
510     activePanel()->folderPanel()->itemView()->setFocus();\r
511     ui->statusBar->showMessage(tr("%1をブックマークに追加しました").arg(fi.absoluteFilePath()));\r
512 }\r
513 \r
514 ///////////////////////////////////////////////////////////////////////////////\r
515 /// \brief MainWindow::view_copyAvailable\r
516 /// \param yes  コピー可能ならtrue\r
517 ///\r
518 /// 選択範囲の有無をメニューに反映します。\r
519 ///\r
520 void MainWindow::view_copyAvailable(bool yes)\r
521 {\r
522     ui->text_Copy->setEnabled(yes);\r
523 }\r
524 \r
525 ///////////////////////////////////////////////////////////////////////////////\r
526 /// \brief MainWindow::copyItems\r
527 /// \param list     コピー元リスト\r
528 /// \param tgtDir   コピー先フォルダ\r
529 ///\r
530 /// アイテムをコピーします。\r
531 ///\r
532 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)\r
533 {\r
534     qDebug() << "MainWindow::copyItems()" << tgtDir;\r
535 \r
536     Preferences prefs(this);\r
537     if (prefs.isConfirmCopy() &&\r
538         QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
539             != QMessageBox::Yes)\r
540     {\r
541         return;\r
542     }\r
543 \r
544     // 上書き確認ダイアログを初期化する\r
545     m_overwriteDialog.reset();\r
546 \r
547     // ワーカースレッドを作成する\r
548     CopyMoveWorker *worker = new CopyMoveWorker();\r
549     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
550             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
551     worker->setCopyList(&list);\r
552     worker->setTargetDir(tgtDir);\r
553     worker->setMoveMode(false);\r
554 \r
555     // 進捗ダイアログを表示して、処理を開始する\r
556     OperationDialog opDlg(this);\r
557     opDlg.setWindowTitle(tr("コピー"));\r
558     opDlg.setWorker(worker);\r
559     opDlg.setAutoClose(prefs.isAutoCloseCopy());\r
560 \r
561     opDlg.exec();\r
562 \r
563     prefs.setAutoCloseCopy(opDlg.autoClose());\r
564 }\r
565 \r
566 ///////////////////////////////////////////////////////////////////////////////\r
567 /// \brief MainWindow::moveItems\r
568 /// \param list     移動元リスト\r
569 /// \param tgtDir   移動先フォルダ\r
570 ///\r
571 /// アイテムを移動します。\r
572 ///\r
573 void MainWindow::moveItems(const QFileInfoList &list, const QString &tgtDir)\r
574 {\r
575     qDebug() << "MainWindow::moveItems()" << tgtDir;\r
576 \r
577     Preferences prefs(this);\r
578     if (prefs.isConfirmMove() &&\r
579         QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
580             != QMessageBox::Yes)\r
581     {\r
582         return;\r
583     }\r
584 \r
585     // 上書き確認ダイアログを初期化する\r
586     m_overwriteDialog.reset();\r
587 \r
588     // ワーカースレッドを作成する\r
589     CopyMoveWorker *worker = new CopyMoveWorker();\r
590     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
591             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
592     worker->setCopyList(&list);\r
593     worker->setTargetDir(tgtDir);\r
594     worker->setMoveMode(true);\r
595 \r
596     // 進捗ダイアログを表示して、処理を開始する\r
597     OperationDialog opDlg(this);\r
598     opDlg.setWindowTitle(tr("移動"));\r
599     opDlg.setWorker(worker);\r
600     opDlg.setAutoClose(prefs.isAutoCloseMove());\r
601 \r
602     opDlg.exec();\r
603 \r
604     prefs.setAutoCloseMove(opDlg.autoClose());\r
605 }\r
606 \r
607 ///////////////////////////////////////////////////////////////////////////////\r
608 /// \brief MainWindow::onContextMenuEvent\r
609 /// \param obj  イベントが発生したオブジェクト\r
610 /// \param e    コンテキストメニューイベント\r
611 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
612 ///\r
613 bool MainWindow::onContextMenuEvent(QObject *obj, QContextMenuEvent *e)\r
614 {\r
615     QMenu menu(this);\r
616     if (obj->objectName() == "textView") {\r
617         menu.addAction(ui->text_ConvertFromEUC);\r
618         menu.addAction(ui->text_ConvertFromJIS);\r
619         menu.addAction(ui->text_ConvertFromSJIS);\r
620         menu.addAction(ui->text_ConvertFromUTF8);\r
621         menu.addAction(ui->text_ConvertFromUTF16);\r
622         menu.addAction(ui->text_ConvertFromUTF16BE);\r
623         menu.addAction(ui->text_ConvertFromUTF16LE);\r
624         menu.addSeparator();\r
625         menu.addAction(ui->text_Copy);\r
626         if (m_viewMode == ModeView) {\r
627             menu.addSeparator();\r
628             menu.addAction(ui->view_Back);\r
629         }\r
630     }\r
631     else if (obj->objectName() == "imageView") {\r
632         menu.addAction(ui->image_FitToWindow);\r
633         menu.addAction(ui->action_ScaleDown);\r
634         menu.addAction(ui->action_ScaleUp);\r
635         menu.addAction(ui->image_ScaleNormal);\r
636         menu.addSeparator();\r
637         menu.addAction(ui->image_Rotate90);\r
638         menu.addAction(ui->image_Rotate180);\r
639 \r
640         if (m_viewMode == ModeView) {\r
641             menu.addSeparator();\r
642             menu.addAction(ui->view_Back);\r
643         }\r
644     }\r
645     else if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView") {\r
646         QModelIndex index = focusItemView()->indexAt(e->pos());\r
647         if (index.isValid()) {\r
648             menu.addAction(ui->action_Open);\r
649             menu.addAction(ui->action_OpenWith);\r
650             menu.addAction(ui->action_OpenEditor);\r
651             menu.addAction(ui->action_OpenTerminal);\r
652             menu.addAction(ui->action_OpenArchiver);\r
653             menu.addSeparator();\r
654             menu.addAction(ui->action_Copy);\r
655             menu.addAction(ui->action_Move);\r
656             menu.addSeparator();\r
657             menu.addAction(ui->action_Delete);\r
658             menu.addSeparator();\r
659             menu.addAction(ui->action_CopyFileName);\r
660             menu.addAction(ui->action_CopyFilePath);\r
661             menu.addSeparator();\r
662             menu.addAction(ui->action_Rename);\r
663         }\r
664         else {\r
665             menu.addAction(ui->action_historyBack);\r
666             menu.addAction(ui->action_HistoryForward);\r
667             menu.addSeparator();\r
668             menu.addAction(ui->action_CdUp);\r
669             menu.addAction(ui->action_CdHome);\r
670             menu.addAction(ui->action_CdRoot);\r
671             menu.addAction(ui->action_Cd);\r
672             menu.addSeparator();\r
673             menu.addAction(ui->action_CreateFile);\r
674             menu.addAction(ui->action_CreateFolder);\r
675         }\r
676     }\r
677     else {\r
678         qDebug() << "No context menu" << obj->objectName();\r
679         return false;\r
680     }\r
681 \r
682     QAction *selected = menu.exec(e->globalPos());\r
683     if (selected == ui->action_ScaleDown ||\r
684         selected == ui->action_ScaleUp)\r
685     {\r
686         ui->image_FitToWindow->blockSignals(true);\r
687         ui->image_FitToWindow->setChecked(false);\r
688         ui->image_FitToWindow->blockSignals(false);\r
689     }\r
690 \r
691     return true;\r
692 }\r
693 \r
694 ///////////////////////////////////////////////////////////////////////////////\r
695 /// \brief MainWindow::onDropEvent\r
696 /// \param obj  イベントが発生したオブジェクト\r
697 /// \param e    ドロップイベントオブジェクト\r
698 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
699 ///\r
700 bool MainWindow::onDropEvent(QObject *obj, QDropEvent *e)\r
701 {\r
702     qDebug() << "MainWindow::onDropEvent()";\r
703 \r
704     if (obj->parent()->objectName() == "folderView" ||\r
705         obj->parent()->objectName() == "thumbnailView")\r
706     {\r
707         QAbstractItemView *v = static_cast<QAbstractItemView*>(obj->parent());\r
708         if (v->property("dragging").toBool()) {\r
709             // 自分自身へのドロップなら何もしない\r
710             return true;\r
711         }\r
712 \r
713         QFileInfoList list;\r
714         foreach (const QUrl &url, e->mimeData()->urls()) {\r
715             QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();\r
716             if (!path.isEmpty()) {\r
717                 list << path;\r
718             }\r
719             else {\r
720                 qDebug() << "drop path is empty." << url;\r
721             }\r
722         }\r
723 \r
724         if (list.isEmpty()) {\r
725             // ローカルファイルのドロップでなければ何もしない\r
726             return true;\r
727         }\r
728 \r
729         e->acceptProposedAction();\r
730 \r
731         QMenu menu(this);\r
732         QAction *actCopy = menu.addAction(tr("コピー"));\r
733         QAction *actMove = menu.addAction(tr("移動"));\r
734         menu.addSeparator();\r
735         menu.addAction(tr("キャンセル"));\r
736 \r
737         QAction *selected = menu.exec(v->mapToGlobal(e->pos()));\r
738         FolderModel *m = static_cast<FolderModel*>(v->model());\r
739         if (selected == actMove) {\r
740             moveItems(list, m->rootPath());\r
741         }\r
742         else if (selected == actCopy) {\r
743             copyItems(list, m->rootPath());\r
744         }\r
745         return true;\r
746     }\r
747     else {\r
748         qDebug() << obj->parent()->objectName();\r
749     }\r
750 \r
751     return true;\r
752 }\r
753 \r
754 ///////////////////////////////////////////////////////////////////////////////\r
755 /// \brief MainWindow::onKeyPressEvent\r
756 /// \param obj  イベントが発生したオブジェクト\r
757 /// \param e    キーイベントオブジェクト\r
758 /// \return 処理した場合はtrue, 処理しなかった場合はfalseを返します。\r
759 ///\r
760 bool MainWindow::onKeyPressEvent(QObject *obj, QKeyEvent *e)\r
761 {\r
762     qDebug() << "MainWindow::onKeyPressEvent()";\r
763 \r
764     QString modifier = QString::null;\r
765     if (e->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }\r
766     if (e->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }\r
767     if (e->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }\r
768     if (e->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }\r
769 \r
770     QString key = modifier + QKeySequence(e->key()).toString();\r
771 \r
772     foreach (QAction *action, findChildren<QAction*>()) {\r
773         if (action->isEnabled()) {\r
774             foreach (const QKeySequence &ks, action->shortcuts()) {\r
775                 if (ks.toString() == key) {\r
776                     qDebug() << "emit" << action->objectName();\r
777                     if (action->isCheckable()) {\r
778                         action->toggle();\r
779                     }\r
780                     else {\r
781                         action->trigger();\r
782                     }\r
783                     return true;\r
784                 }\r
785              }\r
786         }\r
787     }\r
788 \r
789     if (obj->objectName() == "folderView" || obj->objectName() == "thumbnailView")\r
790     {\r
791         // カーソル移動系のみ有効にする\r
792         switch (e->key()) {\r
793         case Qt::Key_Down:\r
794         case Qt::Key_Up:\r
795         case Qt::Key_Left:\r
796         case Qt::Key_Right:\r
797         case Qt::Key_Home:\r
798         case Qt::Key_End:\r
799         case Qt::Key_PageDown:\r
800         case Qt::Key_PageUp:\r
801         case Qt::Key_Tab:\r
802             return false;\r
803         }\r
804         return true;\r
805     }\r
806 \r
807 \r
808 \r
809 \r
810     return false;\r
811 }\r
812 \r
813 ///////////////////////////////////////////////////////////////////////////////\r
814 /// \brief MainWindow::onCopy\r
815 ///\r
816 /// 選択アイテムを隣のパネルにコピーします。\r
817 ///\r
818 void MainWindow::onCopy()\r
819 {\r
820     qDebug() << "MainWindow::onCopy";\r
821 \r
822     QFileInfoList list = selectedItems();\r
823     if (list.isEmpty()) {\r
824         return;\r
825     }\r
826 \r
827     QString tgtPath = inactiveModel()->rootPath();\r
828     copyItems(list, tgtPath);\r
829 }\r
830 \r
831 ///////////////////////////////////////////////////////////////////////////////\r
832 /// \brief MainWindow::onCreateFile\r
833 ///\r
834 /// ファイルを作成します。\r
835 ///\r
836 void MainWindow::onCreateFile()\r
837 {\r
838     qDebug() << "MainWindow::onCreateFile";\r
839 \r
840     bool bOk;\r
841     QString name = QInputDialog::getText(\r
842                 this, tr("ファイルを作成"), tr("ファイル名:"),\r
843                 QLineEdit::Normal, "", &bOk);\r
844     if (!bOk || name.isEmpty()) {\r
845         return;\r
846     }\r
847 \r
848     QModelIndex index = activeModel()->touch(name);\r
849     if (!index.isValid()) {\r
850         QMessageBox::critical(\r
851                     this, tr("エラー"),\r
852                     tr("ファイルの作成に失敗しました。"));\r
853         return;\r
854     }\r
855 \r
856     focusItemView()->setCurrentIndex(index);\r
857     if (Preferences(this).isOpenAfterCreation()) {\r
858         onOpenEditor(index);\r
859     }\r
860 }\r
861 \r
862 ///////////////////////////////////////////////////////////////////////////////\r
863 /// \brief MainWindow::onCreateFolder\r
864 ///\r
865 /// フォルダを作成します。\r
866 ///\r
867 void MainWindow::onCreateFolder()\r
868 {\r
869     qDebug() << "MainWindow::onCreateFolder";\r
870 \r
871     bool bOk;\r
872     QString name = QInputDialog::getText(\r
873                 this, tr("フォルダを作成"), tr("フォルダ名:"),\r
874                 QLineEdit::Normal, "", &bOk);\r
875     if (!bOk || name.isEmpty()) {\r
876         return;\r
877     }\r
878 \r
879     QModelIndex index = activeModel()->mkdir(name);\r
880     if (!index.isValid()) {\r
881         QMessageBox::critical(\r
882                     this, tr("エラー"),\r
883                     tr("フォルダの作成に失敗しました。"));\r
884         return;\r
885     }\r
886 \r
887     focusItemView()->setCurrentIndex(index);\r
888     if (Preferences(this).isMoveAfterCreation()) {\r
889         onOpen(index);\r
890     }\r
891 }\r
892 \r
893 ///////////////////////////////////////////////////////////////////////////////\r
894 /// \brief MainWindow::onDelete\r
895 ///\r
896 /// 選択アイテムを削除します。\r
897 ///\r
898 void MainWindow::onDelete()\r
899 {\r
900     qDebug() << "MainWindow::onDelete";\r
901 \r
902     QFileInfoList list = selectedItems();\r
903     if (list.isEmpty()) {\r
904         return;\r
905     }\r
906 \r
907     Preferences prefs(this);\r
908     if (prefs.isConfirmDelete()) {\r
909         QString msg;\r
910         if (list.size() == 1) {\r
911             msg = list[0].fileName();\r
912         }\r
913         else {\r
914             msg = tr("%1個のアイテム").arg(list.size());\r
915         }\r
916         int ret = QMessageBox::question(\r
917                     this, tr("確認"),\r
918                     msg + tr("を削除しますか?"));\r
919         if (ret != QMessageBox::Yes) {\r
920             return;\r
921         }\r
922     }\r
923 \r
924     DeleteWorker *worker = new DeleteWorker();\r
925     worker->setDeleteList(&list);\r
926 \r
927     OperationDialog opDlg(this);\r
928     opDlg.setWindowTitle(tr("削除"));\r
929     opDlg.setWorker(worker);\r
930     opDlg.setAutoClose(prefs.isAutoCloseDelete());\r
931 \r
932     int row = focusItemView()->currentIndex().row();\r
933 \r
934     opDlg.exec();\r
935 \r
936     if (row >= activeModel()->rowCount()) {\r
937         row = activeModel()->rowCount() - 1;\r
938     }\r
939     focusItemView()->setCurrentIndex(activeModel()->index(row, 1));\r
940 \r
941     prefs.setAutoCloseDelete(opDlg.autoClose());\r
942 }\r
943 \r
944 ///////////////////////////////////////////////////////////////////////////////\r
945 /// \brief MainWindow::onOpen\r
946 /// \param index    (使用しません)\r
947 ///\r
948 /// アイテムを開きます。\r
949 ///\r
950 void MainWindow::onOpen(const QModelIndex &index)\r
951 {\r
952     Q_UNUSED(index);\r
953     qDebug() << "MainWindow::onOpen()" << index;\r
954 \r
955     QModelIndex current = focusItemView()->currentIndex();\r
956     if (activeModel()->isDir(current)) {\r
957         activeModel()->setRootPath(activeModel()->filePath(current));\r
958         return;\r
959     }\r
960 \r
961     // 外部アプリを優先する場合\r
962     QString ext = activeModel()->fileInfo(current).suffix().toLower();\r
963     QStringList list = Preferences(this).getPreferExtensions().split(",", QString::SkipEmptyParts);\r
964     foreach (const QString& s, list) {\r
965         if (ext == s.trimmed().toLower()) {\r
966             QString path = QDir::toNativeSeparators(activeModel()->filePath(current));\r
967             QDesktopServices::openUrl(QUrl("file:///" + path));\r
968             return;\r
969         }\r
970     }\r
971 \r
972     // 内蔵ビューアで表示する\r
973     setViewMode(ModeView);\r
974 }\r
975 \r
976 ///////////////////////////////////////////////////////////////////////////////\r
977 /// \brief MainWindow::onOpenEditor\r
978 /// \param path\r
979 ///\r
980 /// 選択アイテムを外部エディタで開きます。\r
981 ///\r
982 void MainWindow::onOpenEditor(const QModelIndex &index)\r
983 {\r
984     qDebug() << "MainWindow::onOpenEditor";\r
985 \r
986     QString exe = Preferences(this).getEditorPath();\r
987     if (exe.isEmpty()) {\r
988         QMessageBox::critical(\r
989                     this, tr("エラー"),\r
990                     tr("外部エディタのパスが未定義です。"));\r
991         return;\r
992     }\r
993 \r
994     QFileInfoList list;\r
995     if (index.isValid()) {\r
996         list << activeModel()->fileInfo(index);\r
997     }\r
998     else {\r
999         list = selectedItems();\r
1000     }\r
1001 \r
1002     QString files;\r
1003     foreach (const QFileInfo &info, list) {\r
1004         files += " " + QQ(info.absoluteFilePath());\r
1005     }\r
1006 #ifdef Q_OS_MAC\r
1007     QString command = "open -a " + exe + files;\r
1008 #else\r
1009     QString command = exe + files;\r
1010 #endif\r
1011     if (!startProcess(command, tr("外部エディタの起動に失敗しました。"))) {\r
1012         qDebug() << command;\r
1013     }\r
1014 }\r
1015 \r
1016 ///////////////////////////////////////////////////////////////////////////////\r
1017 /// \brief MainWindow::onOpenTerminal\r
1018 ///\r
1019 /// 選択アイテムをターミナルで開きます。\r
1020 ///\r
1021 void MainWindow::onOpenTerminal()\r
1022 {\r
1023     qDebug() << "MainWindow::onOpenTerminal";\r
1024 \r
1025     QString exe = Preferences(this).getTerminalPath();\r
1026     if (exe.isEmpty()) {\r
1027         QMessageBox::critical(\r
1028                     this, tr("エラー"),\r
1029                     tr("ターミナルのパスが未定義です。"));\r
1030         return;\r
1031     }\r
1032 \r
1033     QSet<QString> dirs;\r
1034     foreach (const QFileInfo &info, selectedItems()) {\r
1035         if (info.isDir()) {\r
1036             dirs.insert(info.absoluteFilePath());\r
1037         }\r
1038         else {\r
1039             dirs.insert(info.absolutePath());\r
1040         }\r
1041     }\r
1042 \r
1043     foreach (const QString &dir, dirs) {\r
1044 #ifdef Q_OS_MAC\r
1045         QString command = "open -n -a " + exe + " " + QQ(dir);\r
1046 #else\r
1047         QString command = exe + " " + QQ(dir);\r
1048 #endif\r
1049         if (!startProcess(command, tr("ターミナルの起動に失敗しました。"))) {\r
1050             qDebug() << command;\r
1051             break;\r
1052         }\r
1053     }\r
1054 }\r
1055 \r
1056 ///////////////////////////////////////////////////////////////////////////////\r
1057 /// \brief MainWindow::onOpenArchiver\r
1058 ///\r
1059 /// 選択アイテムをアーカイバで開きます。\r
1060 ///\r
1061 void MainWindow::onOpenArchiver()\r
1062 {\r
1063     qDebug() << "MainWindow::onOpenArchiver";\r
1064 \r
1065     QString exe = Preferences(this).getArchiverPath();\r
1066     if (exe.isEmpty()) {\r
1067         QMessageBox::critical(\r
1068                     this, tr("エラー"),\r
1069                     tr("アーカイバのパスが未定義です。"));\r
1070         return;\r
1071     }\r
1072 \r
1073     QString files;\r
1074     foreach (const QFileInfo &info, selectedItems()) {\r
1075         files += " " + QQ(info.absoluteFilePath());\r
1076     }\r
1077 #ifdef Q_OS_MAC\r
1078     QString command = "open -a " + exe + files;\r
1079 #else\r
1080     QString command = exe + files;\r
1081 #endif\r
1082     if (!startProcess(command, tr("アーカイバの起動に失敗しました。"))) {\r
1083         qDebug() << command;\r
1084     }\r
1085 }\r
1086 \r
1087 ///////////////////////////////////////////////////////////////////////////////\r
1088 /// \brief MainWindow::onOpenBookmark\r
1089 ///\r
1090 /// ブックマークのメニュー項目をクリックしたときの処理を行います。\r
1091 ///\r
1092 void MainWindow::onOpenBookmark()\r
1093 {\r
1094     qDebug() << "MainWindow::onOpenBookmark()";\r
1095 \r
1096     QAction *action = qobject_cast<QAction*>(sender());\r
1097     Q_CHECK_PTR(action);\r
1098 \r
1099     int i = action->data().toInt();\r
1100     activeModel()->setRootPath(Preferences(this).getBookmarkPath(i));\r
1101 }\r
1102 \r
1103 ///////////////////////////////////////////////////////////////////////////////\r
1104 /// \brief MainWindow::onRename\r
1105 ///\r
1106 /// 選択アイテムの名前を変更します。\r
1107 ///\r
1108 void MainWindow::onRename()\r
1109 {\r
1110     qDebug() << "MainWindow::onRename";\r
1111 \r
1112     QFileInfoList list = selectedItems();\r
1113     if (list.isEmpty()) {\r
1114         return;\r
1115     }\r
1116 \r
1117     AbstractRenameDialog *dlg;\r
1118     if (list.size() == 1) {\r
1119         dlg = new RenameSingleDialog(this);\r
1120     }\r
1121     else {\r
1122         dlg = new RenameMultiDialog(this);\r
1123     }\r
1124     dlg->setWorkingDirectory(activeModel()->rootPath());\r
1125     dlg->setNames(list);\r
1126     int dlgResult = dlg->exec();\r
1127     if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {\r
1128         return;\r
1129     }\r
1130 \r
1131     Preferences prefs(this);\r
1132     if (prefs.isConfirmRename() &&\r
1133         QMessageBox::question(this, tr("確認"), tr("名前の変更を実行しますか?"))\r
1134             != QMessageBox::Yes)\r
1135     {\r
1136         return;\r
1137     }\r
1138 \r
1139     RenameWorker *worker = new RenameWorker();\r
1140     worker->setRenameMap(&dlg->renameMap());\r
1141 \r
1142     OperationDialog opDlg(this);\r
1143     opDlg.setWindowTitle(tr("名前を変更"));\r
1144     opDlg.setWorker(worker);\r
1145     opDlg.setAutoClose(prefs.isAutoCloseRename());\r
1146 \r
1147     opDlg.exec();\r
1148 \r
1149     QFileInfo fi(dlg->renameMap().first());\r
1150     focusItemView()->setCurrentIndex(activeModel()->search(fi.fileName()));\r
1151 \r
1152     prefs.setAutoCloseRename(opDlg.autoClose());\r
1153 }\r
1154 \r
1155 ///////////////////////////////////////////////////////////////////////////////\r
1156 /// \brief MainWindow::onOpenWith\r
1157 ///\r
1158 /// 関連付けられたアプリで開きます。\r
1159 ///\r
1160 void MainWindow::onOpenWith()\r
1161 {\r
1162     qDebug() << "MainWindow::onOpenWith";\r
1163 \r
1164     foreach (const QFileInfo &info, selectedItems()) {\r
1165         QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
1166         QDesktopServices::openUrl(QUrl("file:///" + path));\r
1167     }\r
1168 }\r
1169 \r
1170 ///////////////////////////////////////////////////////////////////////////////\r
1171 /// \brief MainWindow::showBookmarkDialog\r
1172 ///\r
1173 /// ブックマーク一覧ダイアログを表示します。\r
1174 ///\r
1175 void MainWindow::showBookmarkDialog()\r
1176 {\r
1177     qDebug() << "MainWindow::showBookmarkDialog()";\r
1178 \r
1179     BookmarkDialog dlg(this);\r
1180     dlg.setEditMode(false);\r
1181     if (dlg.exec() == QDialog::Accepted) {\r
1182         int n = dlg.selectedIndex();\r
1183         activeModel()->setRootPath(Preferences(this).getBookmarkPath(n + 1));\r
1184     }\r
1185 }\r
1186 \r
1187 ///////////////////////////////////////////////////////////////////////////////\r
1188 /// \brief MainWindow::onEditBookmark\r
1189 ///\r
1190 /// ブックマークの編集ダイアログを表示します。\r
1191 ///\r
1192 void MainWindow::onEditBookmark()\r
1193 {\r
1194     qDebug() << "MainWindow::onEditBookmark()";\r
1195 \r
1196     BookmarkDialog dlg(this);\r
1197     dlg.setEditMode(true);\r
1198 \r
1199     if (dlg.exec() == QDialog::Accepted) {\r
1200         initBookmarkMenu();\r
1201     }\r
1202 }\r
1203 \r
1204 ///////////////////////////////////////////////////////////////////////////////\r
1205 /// \brief MainWindow::showFilterDialog\r
1206 ///\r
1207 /// フィルタ設定ダイアログを表示します。\r
1208 ///\r
1209 void MainWindow::showFilterDialog()\r
1210 {\r
1211     qDebug() << "MainWindow::showFilterDialog()";\r
1212 \r
1213     QString filters = activeModel()->nameFilters().join(" ");\r
1214 \r
1215     QInputDialog dlg(this);\r
1216     dlg.setInputMode(QInputDialog::TextInput);\r
1217     dlg.setWindowTitle(tr("フィルタを設定"));\r
1218     dlg.setLabelText(tr("フィルタ:"));\r
1219     dlg.setTextValue(filters);\r
1220     dlg.resize(width() * 0.8, dlg.height());\r
1221 \r
1222     if (dlg.exec() == QDialog::Accepted) {\r
1223         filters = dlg.textValue();\r
1224         if (filters.isEmpty()) {\r
1225             filters = "*";\r
1226         }\r
1227 \r
1228         activeModel()->setNameFilters(filters.split(" ", QString::SkipEmptyParts));\r
1229         activeModel()->refresh();\r
1230     }\r
1231 }\r
1232 \r
1233 ///////////////////////////////////////////////////////////////////////////////\r
1234 /// \brief MainWindow::showHistoryDialog\r
1235 ///\r
1236 /// 履歴選択ダイアログを表示します。\r
1237 ///\r
1238 void MainWindow::showHistoryDialog()\r
1239 {\r
1240     qDebug() << "MainWindow::showHistoryDialog()";\r
1241 \r
1242     HistoryDialog dlg(this);\r
1243     dlg.setModel(ui->LPanel->model(), ui->RPanel->model(), activeModel());\r
1244     dlg.exec();\r
1245 }\r
1246 \r
1247 ///////////////////////////////////////////////////////////////////////////////\r
1248 /// \brief MainWindow::showSortDialog\r
1249 ///\r
1250 /// ソート方法選択ダイアログを表示します。\r
1251 ///\r
1252 void MainWindow::showSortDialog()\r
1253 {\r
1254     qDebug() << "MainWindow::showSortDialog()";\r
1255 \r
1256     SortDialog dlg(this);\r
1257     dlg.setModel(activeModel());\r
1258     dlg.exec();\r
1259 }\r
1260 \r
1261 ///////////////////////////////////////////////////////////////////////////////\r
1262 /// \brief MainWindow::onSplitCenter\r
1263 ///\r
1264 /// パネルを中央で分割します。\r
1265 ///\r
1266 void MainWindow::onSplitCenter()\r
1267 {\r
1268     qDebug() << "MainWindow::onSplitCenter()";\r
1269 \r
1270     QList<int> sizes = ui->splitter->sizes();\r
1271     int sizeTotal = sizes[0] + sizes[1];\r
1272     sizes[0] = sizeTotal / 2;\r
1273     sizes[1] = sizeTotal - sizes[0];\r
1274     ui->splitter->setSizes(sizes);\r
1275 }\r
1276 \r
1277 ///////////////////////////////////////////////////////////////////////////////\r
1278 /// \brief MainWindow::onSwap\r
1279 ///\r
1280 /// 左右のパネルでモデルを入れ替えます。\r
1281 ///\r
1282 void MainWindow::onSwap()\r
1283 {\r
1284     qDebug() << "MainWindow::onSwap()";\r
1285 \r
1286     FolderModel *tmp = ui->LPanel->model();\r
1287     ui->LPanel->setModel(ui->RPanel->model());\r
1288     ui->RPanel->setModel(tmp);\r
1289 \r
1290     // アクティブ状態も変更する\r
1291     if (ui->LPanel->model()->isActive()) {\r
1292         setActiveModel(ui->RPanel->model());\r
1293     }\r
1294     else {\r
1295         setActiveModel(ui->LPanel->model());\r
1296     }\r
1297 }\r
1298 \r
1299 ///////////////////////////////////////////////////////////////////////////////\r
1300 /// \brief MainWindow::onTogglePreviewMode\r
1301 /// \param checked  メニューのチェック状態\r
1302 ///\r
1303 /// 通常モード/プレビューモードを切り替えます。\r
1304 ///\r
1305 void MainWindow::onTogglePreviewMode(bool checked)\r
1306 {\r
1307     qDebug() << "MainWindow::onTogglePreviewMode()" << checked;\r
1308 \r
1309     if (checked) {\r
1310         setViewMode(ModePreview);\r
1311     }\r
1312     else {\r
1313         setViewMode(ModeBasic);\r
1314     }\r
1315 }\r
1316 \r
1317 ///////////////////////////////////////////////////////////////////////////////\r
1318 /// \brief MainWindow::onSearchNext\r
1319 ///\r
1320 /// 次のアイテムを検索します。\r
1321 ///\r
1322 void MainWindow::onSearchNext()\r
1323 {\r
1324     qDebug() << "MainWindow::onSearchNext";\r
1325 \r
1326     static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext();\r
1327 }\r
1328 \r
1329 ///////////////////////////////////////////////////////////////////////////////\r
1330 /// \brief MainWindow::onSearchPrev\r
1331 ///\r
1332 /// 前のアイテムを検索します。\r
1333 ///\r
1334 void MainWindow::onSearchPrev()\r
1335 {\r
1336     qDebug() << "MainWindow::onSearchPrev";\r
1337 \r
1338     static_cast<FolderPanel*>(qApp->focusWidget()->parentWidget())->searchNext(-1);\r
1339 }\r
1340 \r
1341 ///////////////////////////////////////////////////////////////////////////////\r
1342 /// \brief MainWindow::onKeyDown\r
1343 ///\r
1344 /// フォーカスウィジェットに↓キーイベントを送信します。\r
1345 ///\r
1346 void MainWindow::onKeyDown()\r
1347 {\r
1348     qDebug() << "MainWindow::onKeyDown()";\r
1349 \r
1350     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
1351     qApp->sendEvent(qApp->focusWidget(), &event);\r
1352 }\r
1353 \r
1354 ///////////////////////////////////////////////////////////////////////////////\r
1355 /// \brief MainWindow::onKeyEnd\r
1356 ///\r
1357 /// フォーカスウィジェットにEND, Ctrl+ENDキーイベントを送信します。\r
1358 ///\r
1359 void MainWindow::onKeyEnd()\r
1360 {\r
1361     qDebug() << "MainWindow::onKeyEnd()";\r
1362 \r
1363     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
1364     qApp->sendEvent(qApp->focusWidget(), &event1);\r
1365 \r
1366     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
1367     qApp->sendEvent(qApp->focusWidget(), &event2);\r
1368 }\r
1369 \r
1370 ///////////////////////////////////////////////////////////////////////////////\r
1371 /// \brief MainWindow::onKeyHome\r
1372 ///\r
1373 /// フォーカスウィジェットにHOME, Ctrl+HOMEキーイベントを送信します。\r
1374 ///\r
1375 void MainWindow::onKeyHome()\r
1376 {\r
1377     qDebug() << "MainWindow::onKeyHome()";\r
1378 \r
1379     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
1380     qApp->sendEvent(qApp->focusWidget(), &event1);\r
1381 \r
1382     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
1383     qApp->sendEvent(qApp->focusWidget(), &event2);\r
1384 }\r
1385 \r
1386 ///////////////////////////////////////////////////////////////////////////////\r
1387 /// \brief MainWindow::onKeyUp\r
1388 ///\r
1389 /// フォーカスウィジェットに↑キーイベントを送信します。\r
1390 ///\r
1391 void MainWindow::onKeyUp()\r
1392 {\r
1393     qDebug() << "MainWindow::onKeyUp()";\r
1394 \r
1395     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
1396     qApp->sendEvent(qApp->focusWidget(), &event);\r
1397 }\r
1398 \r
1399 ///////////////////////////////////////////////////////////////////////////////\r
1400 /// \brief MainWindow::onKeyHomeOther\r
1401 ///\r
1402 /// 非フォーカスビューにHOME, Ctrl+HOMEキーイベントを送信します。\r
1403 ///\r
1404 void MainWindow::onKeyHomeOther()\r
1405 {\r
1406     qDebug() << "MainWindow::onKeyHomeOther()";\r
1407 \r
1408     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
1409     sendEventOther(&event1);\r
1410 \r
1411     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
1412     sendEventOther(&event2);\r
1413 }\r
1414 \r
1415 ///////////////////////////////////////////////////////////////////////////////\r
1416 /// \brief MainWindow::onKeyDownOther\r
1417 ///\r
1418 /// 非フォーカスビューに↓キーイベントを送信します。\r
1419 ///\r
1420 void MainWindow::onKeyDownOther()\r
1421 {\r
1422     qDebug() << "MainWindow::onKeyDownOther()";\r
1423 \r
1424     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
1425     sendEventOther(&event);\r
1426 }\r
1427 \r
1428 ///////////////////////////////////////////////////////////////////////////////\r
1429 /// \brief MainWindow::onKeyUpOther\r
1430 ///\r
1431 /// 非フォーカスビューに↑キーイベントを送信します。\r
1432 ///\r
1433 void MainWindow::onKeyUpOther()\r
1434 {\r
1435     qDebug() << "MainWindow::onKeyUpOther()";\r
1436 \r
1437     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
1438     sendEventOther(&event);\r
1439 }\r
1440 \r
1441 ///////////////////////////////////////////////////////////////////////////////\r
1442 /// \brief MainWindow::onKeyEndOther\r
1443 ///\r
1444 /// 非フォーカスビューにEND, Ctrl+ENDキーイベントを送信します。\r
1445 ///\r
1446 void MainWindow::onKeyEndOther()\r
1447 {\r
1448     qDebug() << "MainWindow::onKeyEndOther()";\r
1449 \r
1450     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
1451     sendEventOther(&event1);\r
1452 \r
1453     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
1454     sendEventOther(&event2);\r
1455 }\r
1456 \r
1457 ///////////////////////////////////////////////////////////////////////////////\r
1458 /// \brief MainWindow::onScaleDown\r
1459 ///\r
1460 /// 表示を縮小します。\r
1461 ///\r
1462 void MainWindow::onScaleDown()\r
1463 {\r
1464     qDebug() << "MainWindow::onScaleDown()";\r
1465 \r
1466     AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());\r
1467     if (view) {\r
1468         view->scaleDown();\r
1469     }\r
1470 \r
1471     Preferences prefs(this);\r
1472     if (ui->LPanel->isVisible()) {\r
1473         ui->LPanel->updateAppearance(prefs);\r
1474         ui->LPanel->model()->updateAppearance(prefs);\r
1475     }\r
1476     if (ui->RPanel->isVisible()) {\r
1477         ui->RPanel->updateAppearance(prefs);\r
1478         ui->RPanel->model()->updateAppearance(prefs);\r
1479     }\r
1480     if (ui->FPanel->isVisible()) {\r
1481         ui->FPanel->updateAppearance(prefs);\r
1482         ui->FPanel->model()->updateAppearance(prefs);\r
1483     }\r
1484 }\r
1485 \r
1486 ///////////////////////////////////////////////////////////////////////////////\r
1487 /// \brief MainWindow::onScaleUp\r
1488 ///\r
1489 /// 表示を拡大します。\r
1490 ///\r
1491 void MainWindow::onScaleUp()\r
1492 {\r
1493     qDebug() << "MainWindow::onScaleUp()";\r
1494 \r
1495     AbstractView *view = dynamic_cast<AbstractView*>(qApp->focusWidget());\r
1496     if (view) {\r
1497         view->scaleUp();\r
1498     }\r
1499 \r
1500     Preferences prefs(this);\r
1501     if (ui->LPanel->isVisible()) {\r
1502         ui->LPanel->updateAppearance(prefs);\r
1503         ui->LPanel->model()->updateAppearance(prefs);\r
1504     }\r
1505     if (ui->RPanel->isVisible()) {\r
1506         ui->RPanel->updateAppearance(prefs);\r
1507         ui->RPanel->model()->updateAppearance(prefs);\r
1508     }\r
1509     if (ui->FPanel->isVisible()) {\r
1510         ui->FPanel->updateAppearance(prefs);\r
1511         ui->FPanel->model()->updateAppearance(prefs);\r
1512     }\r
1513 }\r
1514 \r
1515 ///////////////////////////////////////////////////////////////////////////////\r
1516 /// \brief MainWindow::initBookmarkMenu\r
1517 ///\r
1518 /// ブックマークメニューを初期化します。\r
1519 ///\r
1520 void MainWindow::initBookmarkMenu()\r
1521 {\r
1522     qDebug() << "MainWindow::initBookmarkMenu()";\r
1523 \r
1524     Preferences prefs(this);\r
1525     QFileIconProvider iconProvider;\r
1526 \r
1527     ui->menu_Bookmark->clear();\r
1528     ui->menu_Bookmark->addAction(ui->action_AddBookmark);\r
1529     ui->menu_Bookmark->addAction(ui->action_EditBookmark);\r
1530     ui->menu_Bookmark->addSeparator();\r
1531     for (int n = 1; ; n++) {\r
1532         QString name = prefs.getBookmarkEntry(n);\r
1533         if (name.isEmpty()) {\r
1534             break;\r
1535         }\r
1536         QString path = prefs.getBookmarkPath(n);\r
1537 \r
1538         QAction *action = ui->menu_Bookmark->addAction(\r
1539                     iconProvider.icon(QFileInfo(path)), name, this,\r
1540                     SLOT(onOpenBookmark()));\r
1541         action->setData(n);\r
1542     }\r
1543 \r
1544     m_actions = findChildren<QAction*>();\r
1545 }\r
1546 \r
1547 ///////////////////////////////////////////////////////////////////////////////\r
1548 /// \brief MainWindow::sendEventOther\r
1549 /// \param event    送信するイベント\r
1550 ///\r
1551 /// 非フォーカスのビューにイベントを送信します。\r
1552 ///\r
1553 void MainWindow::sendEventOther(QEvent *event)\r
1554 {\r
1555     qDebug() << "MainWindow::sendEventOther()";\r
1556 \r
1557     // フォーカスを持たない、可視状態のビューを検索する\r
1558     foreach (QWidget *w, findChildren<QWidget*>()) {\r
1559         AbstractView *view = dynamic_cast<AbstractView*>(w);\r
1560         if (view) {\r
1561             if (w->isVisible() && !w->hasFocus()) {\r
1562                 qDebug() << "Send event to" << w->objectName();\r
1563                 qApp->sendEvent(w, event);\r
1564             }\r
1565         }\r
1566     }\r
1567 }\r
1568 \r
1569 ///////////////////////////////////////////////////////////////////////////////\r
1570 /// \brief MainWindow::onSyncPanel\r
1571 ///\r
1572 /// 隣のパネルと同じフォルダを表示します。\r
1573 ///\r
1574 void MainWindow::onSyncPanel()\r
1575 {\r
1576     qDebug() << "MainWindow::onSyncPanel()";\r
1577 \r
1578     activeModel()->setRootPath(inactiveModel()->rootPath());\r
1579 }\r
1580 \r
1581 ///////////////////////////////////////////////////////////////////////////////\r
1582 /// \brief MainWindow::onSyncPanelTo\r
1583 ///\r
1584 /// 隣のパネルに同じフォルダを表示します。\r
1585 ///\r
1586 void MainWindow::onSyncPanelTo()\r
1587 {\r
1588     qDebug() << "MainWindow::onSyncPanelTo()";\r
1589 \r
1590     inactiveModel()->setRootPath(activeModel()->rootPath());\r
1591 }\r
1592 \r
1593 ///////////////////////////////////////////////////////////////////////////////\r
1594 /// \brief MainWindow::onToggleFullMode\r
1595 /// \param checked  メニューのチェック状態\r
1596 ///\r
1597 /// 単画面/二画面を切り替えます。\r
1598 ///\r
1599 void MainWindow::onToggleFullMode(bool checked)\r
1600 {\r
1601     qDebug() << "MainWindow::onToggleFullMode()" << checked;\r
1602 \r
1603     if (checked) {\r
1604         setViewMode(ModeFull);\r
1605     }\r
1606     else {\r
1607         setViewMode(ModeBasic);\r
1608     }\r
1609 }\r
1610 \r
1611 \r
1612 ///////////////////////////////////////////////////////////////////////////////\r
1613 /// \brief MainWindow::onToggleSearch\r
1614 /// \param checked  メニューのチェック状態\r
1615 ///\r
1616 /// 検索ボックスの表示/非表示を切り替えます。\r
1617 ///\r
1618 void MainWindow::onToggleSearch(bool checked)\r
1619 {\r
1620     qDebug() << "MainWindow::onToggleSearch" << checked;\r
1621 \r
1622     // 丸投げ\r
1623     ui->LPanel->folderPanel()->toggleSearch(checked);\r
1624     ui->RPanel->folderPanel()->toggleSearch(checked);\r
1625 }\r
1626 \r
1627 ///////////////////////////////////////////////////////////////////////////////\r
1628 /// \brief MainWindow::showPreferenceDialog\r
1629 ///\r
1630 /// 環境設定ダイアログを表示します。\r
1631 ///\r
1632 void MainWindow::showPreferenceDialog()\r
1633 {\r
1634     qDebug() << "MainWindow::showPreferenceDialog";\r
1635 \r
1636     PreferenceDialog dlg(this);\r
1637     if (dlg.exec() == QDialog::Accepted) {\r
1638         Preferences prefs(this);\r
1639         if (ui->LPanel->isVisible()) {\r
1640             ui->LPanel->updateAppearance(prefs);\r
1641             ui->LPanel->model()->updateAppearance(prefs);\r
1642         }\r
1643         if (ui->RPanel->isVisible()) {\r
1644             ui->RPanel->updateAppearance(prefs);\r
1645             ui->RPanel->model()->updateAppearance(prefs);\r
1646         }\r
1647         if (ui->FPanel->isVisible()) {\r
1648             ui->FPanel->updateAppearance(prefs);\r
1649             ui->FPanel->model()->updateAppearance(prefs);\r
1650         }\r
1651     }\r
1652 }\r
1653 \r
1654 ///////////////////////////////////////////////////////////////////////////////\r
1655 /// \brief MainWindow::onToggleHidden\r
1656 /// \param checked  メニューのチェック状態\r
1657 ///\r
1658 /// 隠しファイルの表示/非表示を切り替えます。\r
1659 ///\r
1660 void MainWindow::onToggleHidden(bool checked)\r
1661 {\r
1662     qDebug() << "MainWindow::onToggleHidden" << checked;\r
1663 \r
1664     if (checked) {\r
1665         activeModel()->setFilter(activeModel()->filter() | QDir::Hidden);\r
1666     }\r
1667     else {\r
1668         activeModel()->setFilter(activeModel()->filter() ^ QDir::Hidden);\r
1669     }\r
1670 \r
1671     activeModel()->refresh();\r
1672 }\r
1673 \r
1674 ///////////////////////////////////////////////////////////////////////////////\r
1675 /// \brief MainWindow::onToggleSystem\r
1676 /// \param checked  メニューのチェック状態\r
1677 ///\r
1678 /// システムファイルの表示/非表示を切り替えます。\r
1679 ///\r
1680 void MainWindow::onToggleSystem(bool checked)\r
1681 {\r
1682     qDebug() << "MainWindow::onToggleSystem" << checked;\r
1683 \r
1684     if (checked) {\r
1685         activeModel()->setFilter(activeModel()->filter() | QDir::System);\r
1686     }\r
1687     else {\r
1688         activeModel()->setFilter(activeModel()->filter() ^ QDir::System);\r
1689     }\r
1690 \r
1691     activeModel()->refresh();\r
1692 }\r
1693 \r
1694 ///////////////////////////////////////////////////////////////////////////////\r
1695 /// \brief MainWindow::onToggleThumbnailMode\r
1696 /// \param checked  メニューのチェック状態\r
1697 ///\r
1698 /// サムネイルモードの切り替えを行います。\r
1699 ///\r
1700 void MainWindow::onToggleThumbnailMode(bool checked)\r
1701 {\r
1702     qDebug() << "MainWindow::onToggleThumbnailMode()" << checked;\r
1703 \r
1704     activePanel()->folderPanel()->toggleView(checked);\r
1705 }\r
1706 \r
1707 ///////////////////////////////////////////////////////////////////////////////\r
1708 /// \brief MainWindow::onCheckUpdate\r
1709 /// \param silent   最新版を使用している場合に何も表示しないならtrue\r
1710 ///\r
1711 /// アップデートの有無を確認します。\r
1712 ///\r
1713 void MainWindow::onCheckUpdate(bool silent)\r
1714 {\r
1715     qDebug() << "MainWindow::onCheckUpdate()" << silent;\r
1716 \r
1717     QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
1718 \r
1719     if (silent) {\r
1720         connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
1721     }\r
1722     else {\r
1723         connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
1724     }\r
1725 #ifdef Q_OS_WIN\r
1726     manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));\r
1727 #elif defined(Q_OS_MAC)\r
1728     manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));\r
1729 #endif\r
1730 }\r
1731 \r
1732 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
1733 {\r
1734     qDebug() << "MainWindow::checkUpdateFinishedSilent";\r
1735 \r
1736     checkUpdateFinished(reply, true);\r
1737 }\r
1738 \r
1739 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
1740 {\r
1741     qDebug() << "MainWindow::checkUpdateFinished" << silent;\r
1742 \r
1743     if (reply->error() == QNetworkReply::NoError) {\r
1744         QString str = reply->readAll();\r
1745         str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
1746         QRegExp rx("Gefu([0-9]+)");\r
1747         rx.indexIn(str);\r
1748         QString version = rx.cap(1);\r
1749         if (version.toInt() > VERSION_VALUE * 100) {\r
1750             QMessageBox::information(\r
1751                         this, tr("情報"),\r
1752                         tr("最新のバージョンが存在します。<br/>") +\r
1753                         tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
1754         }\r
1755         else if (!silent) {\r
1756             QMessageBox::information(\r
1757                         this, tr("情報"),\r
1758                         tr("お使いのバージョンは最新です。"));\r
1759         }\r
1760     }\r
1761     else if (!silent){\r
1762         QMessageBox::critical(\r
1763                     this, tr("エラー"),\r
1764                     tr("最新バージョンのチェックに失敗しました。<br/>") +\r
1765                     reply->errorString());\r
1766     }\r
1767 }\r
1768 \r
1769 ///////////////////////////////////////////////////////////////////////////////\r
1770 /// \brief MainWindow::initActions\r
1771 ///\r
1772 /// アクションを初期化します。\r
1773 ///\r
1774 void MainWindow::initActions()\r
1775 {\r
1776     qDebug() << "MainWindow::initActions()";\r
1777 \r
1778     QList<QKeySequence> shortcuts;\r
1779 \r
1780     //>>>>> 追加のショートカットキーを設定する\r
1781     appendActionShortcut(ui->action_Open, "M");\r
1782     appendActionShortcut(ui->action_OpenWith, "Shift+M");\r
1783     appendActionShortcut(ui->view_Back, "Backspace");\r
1784     // MacだとShift+の形で認識されてしまうもの\r
1785     appendActionShortcut(ui->action_ScaleUp, "Shift++");\r
1786     appendActionShortcut(ui->action_Filter, "Shift+*");\r
1787     appendActionShortcut(ui->action_OpenTerminal, "Shift+>");\r
1788     appendActionShortcut(ui->action_About, "Shift+?");\r
1789     appendActionShortcut(ui->image_ScaleNormal, "Shift+=");\r
1790 \r
1791     // SIGNAL -> SLOT\r
1792     connect(ui->action_About, SIGNAL(triggered()), this, SLOT(onAbout()));\r
1793     connect(ui->action_AddBookmark, SIGNAL(triggered()), this, SLOT(onAddBookmark()));\r
1794     connect(ui->action_Cd, SIGNAL(triggered()), this, SLOT(onChooseFolder()));\r
1795     connect(ui->action_CheckUpdate, SIGNAL(triggered()), this, SLOT(onCheckUpdate()));\r
1796     connect(ui->action_Copy, SIGNAL(triggered()), this, SLOT(onCopy()));\r
1797     connect(ui->action_CopyFileName, SIGNAL(triggered()), this, SLOT(onCopyFileName()));\r
1798     connect(ui->action_CopyFilePath, SIGNAL(triggered()), this, SLOT(onCopyFilePath()));\r
1799     connect(ui->action_CreateFile, SIGNAL(triggered()), this, SLOT(onCreateFile()));\r
1800     connect(ui->action_CreateFolder, SIGNAL(triggered()), this, SLOT(onCreateFolder()));\r
1801     connect(ui->action_Delete, SIGNAL(triggered()), this, SLOT(onDelete()));\r
1802     connect(ui->action_EditBookmark, SIGNAL(triggered()), this, SLOT(onEditBookmark()));\r
1803     connect(ui->action_ExpandLeft, SIGNAL(triggered()), this, SLOT(onExpandLeft()));\r
1804     connect(ui->action_ExpandRight, SIGNAL(triggered()), this, SLOT(onExpandRight()));\r
1805     connect(ui->action_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
1806     connect(ui->action_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));\r
1807     connect(ui->action_KeyDown, SIGNAL(triggered()), this, SLOT(onKeyDown()));\r
1808     connect(ui->action_KeyDownOther, SIGNAL(triggered()), this, SLOT(onKeyDownOther()));\r
1809     connect(ui->action_KeyEnd, SIGNAL(triggered()), this, SLOT(onKeyEnd()));\r
1810     connect(ui->action_KeyEndOther, SIGNAL(triggered()), this, SLOT(onKeyEndOther()));\r
1811     connect(ui->action_KeyHome, SIGNAL(triggered()), this, SLOT(onKeyHome()));\r
1812     connect(ui->action_KeyHomeOther, SIGNAL(triggered()), this, SLOT(onKeyHomeOther()));\r
1813     connect(ui->action_KeyLeft, SIGNAL(triggered()), this, SLOT(onKeyLeft()));\r
1814     connect(ui->action_KeyUp, SIGNAL(triggered()), this, SLOT(onKeyUp()));\r
1815     connect(ui->action_KeyUpOther, SIGNAL(triggered()), this, SLOT(onKeyUpOther()));\r
1816     connect(ui->action_Move, SIGNAL(triggered()), this, SLOT(onMove()));\r
1817     connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(onOpen()));\r
1818     connect(ui->action_OpenArchiver, SIGNAL(triggered()), this, SLOT(onOpenArchiver()));\r
1819     connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(onOpenEditor()));\r
1820     connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(onOpenTerminal()));\r
1821     connect(ui->action_OpenWith, SIGNAL(triggered()), this, SLOT(onOpenWith()));\r
1822     connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
1823     connect(ui->action_Rename, SIGNAL(triggered()), this, SLOT(onRename()));\r
1824     connect(ui->action_KeyRight, SIGNAL(triggered()), this, SLOT(onKeyRight()));\r
1825     connect(ui->action_RunCommand, SIGNAL(triggered()), this, SLOT(onRunCommand()));\r
1826     connect(ui->action_ScaleDown, SIGNAL(triggered()), this, SLOT(onScaleDown()));\r
1827     connect(ui->action_ScaleUp, SIGNAL(triggered()), this, SLOT(onScaleUp()));\r
1828     connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(onSearchNext()));\r
1829     connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(onSearchPrev()));\r
1830     connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
1831     connect(ui->action_ShowBookmark, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));\r
1832     connect(ui->action_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));\r
1833     connect(ui->action_SplitCenter, SIGNAL(triggered()), this, SLOT(onSplitCenter()));\r
1834     connect(ui->action_Swap, SIGNAL(triggered()), this, SLOT(onSwap()));\r
1835     connect(ui->action_SyncPanel, SIGNAL(triggered()), this, SLOT(onSyncPanel()));\r
1836     connect(ui->action_SyncPanelTo, SIGNAL(triggered()), this, SLOT(onSyncPanelTo()));\r
1837 \r
1838     connect(ui->toggle_FullMode, SIGNAL(toggled(bool)), this, SLOT(onToggleFullMode(bool)));\r
1839     connect(ui->toggle_Hidden, SIGNAL(toggled(bool)), this, SLOT(onToggleHidden(bool)));\r
1840     connect(ui->toggle_Mark, SIGNAL(triggered()), this, SLOT(onToggleMark()));\r
1841     connect(ui->toggle_PreviewMode, SIGNAL(toggled(bool)), this, SLOT(onTogglePreviewMode(bool)));\r
1842     connect(ui->toggle_Search, SIGNAL(toggled(bool)), this, SLOT(onToggleSearch(bool)));\r
1843     connect(ui->toggle_System, SIGNAL(toggled(bool)), this, SLOT(onToggleSystem(bool)));\r
1844     connect(ui->toggle_ThumbnailMode, SIGNAL(toggled(bool)), this, SLOT(onToggleThumbnailMode(bool)));\r
1845 \r
1846     connect(ui->view_Back, SIGNAL(triggered()), this, SLOT(view_finished()));\r
1847 \r
1848 }\r
1849 \r
1850 ///////////////////////////////////////////////////////////////////////////////\r
1851 /// \brief MainWindow::setActiveModel\r
1852 /// \param m    新しいアクティブモデル\r
1853 ///\r
1854 /// アクティブモデルを変更します。\r
1855 ///\r
1856 void MainWindow::setActiveModel(FolderModel *m)\r
1857 {\r
1858     qDebug() << "MainWindow::setActiveModel()" << m;\r
1859 \r
1860     if (activeModel()) {\r
1861         activeModel()->disconnect(this);\r
1862         ui->action_CdHome->disconnect();\r
1863         ui->action_CdRoot->disconnect();\r
1864         ui->action_CdUp->disconnect();\r
1865         ui->action_historyBack->disconnect();\r
1866         ui->action_HistoryForward->disconnect();\r
1867         ui->action_MarkAll->disconnect();\r
1868         ui->action_MarkAllFiles->disconnect();\r
1869         ui->action_MarkAllOff->disconnect();\r
1870         ui->action_MarkInvert->disconnect();\r
1871         ui->action_Refresh->disconnect();\r
1872     }\r
1873 \r
1874     m->setActive();\r
1875 \r
1876     connect(activeModel(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));\r
1877     connect(activeModel(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));\r
1878     connect(ui->action_CdHome, SIGNAL(triggered()), activeModel(), SLOT(onCdHome()));\r
1879     connect(ui->action_CdRoot, SIGNAL(triggered()), activeModel(), SLOT(onCdRoot()));\r
1880     connect(ui->action_CdUp, SIGNAL(triggered()), activeModel(), SLOT(onCdUp()));\r
1881     connect(ui->action_historyBack, SIGNAL(triggered()), activeModel(), SLOT(onHistoryBack()));\r
1882     connect(ui->action_HistoryForward, SIGNAL(triggered()), activeModel(), SLOT(onHistoryForward()));\r
1883     connect(ui->action_MarkAll, SIGNAL(triggered()), activeModel(), SLOT(onMarkAll()));\r
1884     connect(ui->action_MarkAllFiles, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllFiles()));\r
1885     connect(ui->action_MarkAllOff, SIGNAL(triggered()), activeModel(), SLOT(onMarkAllOff()));\r
1886     connect(ui->action_MarkInvert, SIGNAL(triggered()), activeModel(), SLOT(onMarkInvert()));\r
1887     connect(ui->action_Refresh, SIGNAL(triggered()), activeModel(), SLOT(refresh()));\r
1888 \r
1889     Preferences prefs(this);\r
1890     if (ui->LPanel->isVisible()) {\r
1891         ui->LPanel->updateAppearance(prefs);\r
1892         ui->LPanel->model()->updateAppearance(prefs);\r
1893     }\r
1894     if (ui->RPanel->isVisible()) {\r
1895         ui->RPanel->updateAppearance(prefs);\r
1896         ui->RPanel->model()->updateAppearance(prefs);\r
1897     }\r
1898     if (ui->FPanel->isVisible()) {\r
1899         ui->FPanel->updateAppearance(prefs);\r
1900         ui->FPanel->model()->updateAppearance(prefs);\r
1901     }\r
1902 }\r
1903 \r
1904 ///////////////////////////////////////////////////////////////////////////////\r
1905 /// \brief MainWindow::activeModel\r
1906 /// \return アクティブなフォルダモデルを返します。\r
1907 ///\r
1908 FolderModel *MainWindow::activeModel() const\r
1909 {\r
1910     return FolderModel::activeModel();\r
1911 }\r
1912 \r
1913 ///////////////////////////////////////////////////////////////////////////////\r
1914 /// \brief MainWindow::activePanel\r
1915 /// \return アクティブモデルを所有している可視状態のパネルを返します。\r
1916 ///\r
1917 Panel *MainWindow::activePanel() const\r
1918 {\r
1919     if (ui->FPanel->model() == activeModel() && ui->FPanel->isVisible()) {\r
1920         return ui->FPanel;\r
1921     }\r
1922     if (ui->LPanel->model() == activeModel() && ui->LPanel->isVisible()) {\r
1923         return ui->LPanel;\r
1924     }\r
1925     if (ui->RPanel->model() == activeModel() && ui->RPanel->isVisible()) {\r
1926         return ui->RPanel;\r
1927     }\r
1928 \r
1929     qDebug() << ">>>>>>>>>> activePanel() Logic error <<<<<<<<<<";\r
1930     return NULL;\r
1931 }\r
1932 \r
1933 ///////////////////////////////////////////////////////////////////////////////\r
1934 /// \brief MainWindow::inactiveModel\r
1935 /// \return 非アクティブなフォルダモデルを返します。\r
1936 ///\r
1937 FolderModel *MainWindow::inactiveModel() const\r
1938 {\r
1939     if (ui->LPanel->model()->isActive()) {\r
1940         return ui->RPanel->model();\r
1941     }\r
1942     Q_ASSERT(ui->RPanel->model()->isActive());\r
1943     return ui->LPanel->model();\r
1944 }\r
1945 \r
1946 ///////////////////////////////////////////////////////////////////////////////\r
1947 /// \brief MainWindow::inactivePanel\r
1948 /// \return 非アクティブモデルを所有している可視状態のパネルを返します。\r
1949 ///\r
1950 Panel *MainWindow::inactivePanel() const\r
1951 {\r
1952     if (ui->LPanel->model() == inactiveModel() && ui->LPanel->isVisible()) {\r
1953         return ui->LPanel;\r
1954     }\r
1955     if (ui->RPanel->model() == inactiveModel() && ui->RPanel->isVisible()) {\r
1956         return ui->RPanel;\r
1957     }\r
1958     if (ui->FPanel->model() == inactiveModel() && ui->FPanel->isVisible()) {\r
1959         return ui->FPanel;\r
1960     }\r
1961 \r
1962     qDebug() << ">>>>>>>>>> inactivePanel() Logic error <<<<<<<<<<";\r
1963     return NULL;\r
1964 }\r
1965 \r
1966 ///////////////////////////////////////////////////////////////////////////////\r
1967 /// \brief MainWindow::selectedItems\r
1968 /// \return マークされているアイテムまたはカレントアイテムのリスト\r
1969 ///\r
1970 QFileInfoList MainWindow::selectedItems() const\r
1971 {\r
1972     QFileInfoList list = activeModel()->markedItems();\r
1973     if (list.isEmpty()) {\r
1974         qDebug() << focusItemView();\r
1975         qDebug() << focusItemView()->currentIndex();\r
1976         Q_ASSERT(focusItemView()->currentIndex().isValid());\r
1977         list << activeModel()->fileInfo(focusItemView()->currentIndex());\r
1978     }\r
1979 \r
1980     return list;\r
1981 }\r
1982 \r
1983 ///////////////////////////////////////////////////////////////////////////////\r
1984 /// \brief MainWindow::focusItemView\r
1985 /// \return フォーカスを持つアイテムビュー\r
1986 ///\r
1987 QAbstractItemView *MainWindow::focusItemView() const\r
1988 {\r
1989     return static_cast<QAbstractItemView*>(qApp->focusWidget());\r
1990 }\r
1991 \r
1992 ///////////////////////////////////////////////////////////////////////////////\r
1993 /// \brief MainWindow::setViewMode\r
1994 /// \param mode 新しいビューモード\r
1995 ///\r
1996 /// ビューモードを変更します。\r
1997 ///\r
1998 void MainWindow::setViewMode(Mode mode)\r
1999 {\r
2000     qDebug() << "MainWindow::setViewMode()" << mode;\r
2001 \r
2002     QWidget *newFocusWidget = NULL;\r
2003 \r
2004     switch (mode) {\r
2005     case ModeBasic:\r
2006         ui->FPanel->setVisible(false);\r
2007         ui->splitter->setVisible(true);\r
2008         ui->LPanel->setViewItem();\r
2009         ui->RPanel->setViewItem();\r
2010         if (m_viewMode == ModeFull) {\r
2011             activePanel()->folderPanel()->setItemView(focusItemView()->objectName());\r
2012             activePanel()->folderPanel()->itemView()->setCurrentIndex(\r
2013                         focusItemView()->currentIndex());\r
2014             ui->FPanel->setModel(NULL);\r
2015         }\r
2016         newFocusWidget = activePanel()->folderPanel()->itemView();\r
2017         break;\r
2018 \r
2019     case ModeFull:\r
2020         if (m_viewMode == ModeBasic) {\r
2021             ui->FPanel->setModel(activeModel());\r
2022             ui->splitter->setVisible(false);\r
2023             ui->FPanel->setVisible(true);\r
2024             ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName());\r
2025             ui->FPanel->folderPanel()->itemView()->setCurrentIndex(\r
2026                             focusItemView()->currentIndex());\r
2027         }\r
2028         ui->FPanel->setViewItem();\r
2029         newFocusWidget = activePanel()->folderPanel()->itemView();\r
2030         break;\r
2031 \r
2032     case ModeView:\r
2033         ui->FPanel->setViewItem(focusItemView()->currentIndex());\r
2034         ui->splitter->setVisible(false);\r
2035         ui->FPanel->setVisible(true);\r
2036         newFocusWidget = ui->FPanel->visibleView();\r
2037         break;\r
2038 \r
2039     case ModePreview:\r
2040         inactivePanel()->setViewItem(focusItemView()->currentIndex());\r
2041         break;\r
2042     }\r
2043 \r
2044     m_prevMode = m_viewMode;\r
2045     m_viewMode = mode;\r
2046 \r
2047     if (newFocusWidget)\r
2048         newFocusWidget->setFocus();\r
2049     else\r
2050         updateActions();\r
2051 }\r
2052 \r
2053 ///////////////////////////////////////////////////////////////////////////////\r
2054 /// \brief MainWindow::startProcess\r
2055 /// \param cmd      実行するコマンド\r
2056 /// \param errMsg   エラー時の表示メッセージ\r
2057 /// \return true:成功, false:失敗\r
2058 ///\r
2059 bool MainWindow::startProcess(const QString &cmd, const QString &errMsg)\r
2060 {\r
2061     qDebug() << "MainWindow::startProcess" << cmd << errMsg;\r
2062 \r
2063     QProcess process(this);\r
2064     process.setWorkingDirectory(activeModel()->rootPath());\r
2065     if (!process.startDetached(cmd)) {\r
2066         QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);\r
2067         return false;\r
2068     }\r
2069     return true;\r
2070 }\r
2071 \r
2072 ///////////////////////////////////////////////////////////////////////////////\r
2073 /// \brief MainWindow::updateActions\r
2074 ///\r
2075 /// アクションの有効/無効を設定します。\r
2076 ///\r
2077 void MainWindow::updateActions()\r
2078 {\r
2079     qDebug() << "MainWindow::updateActions";\r
2080 \r
2081     bool isView = true;\r
2082     bool isSearch = false;\r
2083     bool isImageView = false;\r
2084     bool toggleSearch = true;\r
2085 \r
2086 \r
2087     QWidget *w = qApp->focusWidget();\r
2088     if (w->objectName() == "folderView" || w->objectName() == "thumbnailView") {\r
2089         setEnabledAllActions(true);\r
2090 \r
2091         // 現在の選択アイテムが".."の場合、ファイル操作系アクションは無効にする\r
2092         QFileInfoList list = selectedItems();\r
2093         if (list.size() == 1 && list[0].fileName() == "..") {\r
2094             ui->action_Copy->setEnabled(false);\r
2095             ui->action_Delete->setEnabled(false);\r
2096             ui->action_Move->setEnabled(false);\r
2097             ui->action_Rename->setEnabled(false);\r
2098         }\r
2099 \r
2100         // 非二画面の場合、隣のパネルが必要な操作は無効にする\r
2101         if (!ui->LPanel->folderPanel()->isVisible() ||\r
2102             !ui->RPanel->folderPanel()->isVisible())\r
2103         {\r
2104             ui->action_Copy->setEnabled(false);\r
2105             ui->action_Move->setEnabled(false);\r
2106             ui->action_Swap->setEnabled(false);\r
2107             ui->action_SyncPanel->setEnabled(false);\r
2108             ui->action_SyncPanelTo->setEnabled(false);\r
2109         }\r
2110 \r
2111         // 単画面の場合、プレビューモードは無効にする\r
2112         if (m_viewMode == ModeFull) {\r
2113             ui->toggle_PreviewMode->setEnabled(false);\r
2114         }\r
2115 \r
2116         // サムネイル表示の場合、左右キーはカーソル移動\r
2117         if (w->objectName() == "thumbnailView") {\r
2118             ui->action_KeyLeft->setEnabled(false);\r
2119             ui->action_KeyRight->setEnabled(false);\r
2120             ui->toggle_ThumbnailMode->blockSignals(true);\r
2121             ui->toggle_ThumbnailMode->setChecked(true);\r
2122             ui->toggle_ThumbnailMode->blockSignals(false);\r
2123         }\r
2124         else {\r
2125             ui->toggle_ThumbnailMode->blockSignals(true);\r
2126             ui->toggle_ThumbnailMode->setChecked(false);\r
2127             ui->toggle_ThumbnailMode->blockSignals(false);\r
2128         }\r
2129     }\r
2130     else if (w->objectName() == "searchBox"){\r
2131         setEnabledAllActions(false);\r
2132         isView = false;\r
2133         isSearch = true;\r
2134     }\r
2135     else if (w->objectName() == "locationBox") {\r
2136         setEnabledAllActions(false);\r
2137         isView = false;\r
2138     }\r
2139     else if (w->objectName() == "textView") {\r
2140         SimpleTextView *v = static_cast<SimpleTextView*>(w);\r
2141         setEnabledAllActions(false);\r
2142         toggleSearch = false;\r
2143 \r
2144         ui->text_ConvertFromEUC->setEnabled(true);\r
2145         ui->text_ConvertFromEUC->disconnect();\r
2146         connect(ui->text_ConvertFromEUC, SIGNAL(triggered()), v, SLOT(convertFromEUC()));\r
2147 \r
2148         ui->text_ConvertFromJIS->setEnabled(true);\r
2149         ui->text_ConvertFromJIS->disconnect();\r
2150         connect(ui->text_ConvertFromJIS, SIGNAL(triggered()), v, SLOT(convertFromJIS()));\r
2151 \r
2152         ui->text_ConvertFromSJIS->setEnabled(true);\r
2153         ui->text_ConvertFromSJIS->disconnect();\r
2154         connect(ui->text_ConvertFromSJIS, SIGNAL(triggered()), v, SLOT(convertFromSJIS()));\r
2155 \r
2156         ui->text_ConvertFromUTF8->setEnabled(true);\r
2157         ui->text_ConvertFromUTF8->disconnect();\r
2158         connect(ui->text_ConvertFromUTF8, SIGNAL(triggered()), v, SLOT(convertFromUTF8()));\r
2159 \r
2160         ui->text_ConvertFromUTF16->setEnabled(true);\r
2161         ui->text_ConvertFromUTF16->disconnect();\r
2162         connect(ui->text_ConvertFromUTF16, SIGNAL(triggered()), v, SLOT(convertFromUTF16()));\r
2163 \r
2164         ui->text_ConvertFromUTF16BE->setEnabled(true);\r
2165         ui->text_ConvertFromUTF16BE->disconnect();\r
2166         connect(ui->text_ConvertFromUTF16BE, SIGNAL(triggered()), v, SLOT(convertFromUTF16BE()));\r
2167 \r
2168         ui->text_ConvertFromUTF16LE->setEnabled(true);\r
2169         ui->text_ConvertFromUTF16LE->disconnect();\r
2170         connect(ui->text_ConvertFromUTF16LE, SIGNAL(triggered()), v, SLOT(convertFromUTF16LE()));\r
2171 \r
2172         ui->text_Copy->disconnect();\r
2173         connect(ui->text_Copy, SIGNAL(triggered()), v, SLOT(copy()));\r
2174 \r
2175     }\r
2176     else if (w->objectName() == "imageView") {\r
2177         SimpleImageView *v = static_cast<SimpleImageView*>(w);\r
2178         setEnabledAllActions(false);\r
2179         toggleSearch = false;\r
2180         isImageView = true;\r
2181 \r
2182         ui->image_FitToWindow->setEnabled(true);\r
2183         ui->image_FitToWindow->disconnect();\r
2184         connect(ui->image_FitToWindow, SIGNAL(toggled(bool)), v, SLOT(fitToWindow(bool)));\r
2185 \r
2186         ui->image_ScaleNormal->setEnabled(true);\r
2187         ui->image_ScaleNormal->disconnect();\r
2188         connect(ui->image_ScaleNormal, SIGNAL(triggered()), v, SLOT(scaleNormal()));\r
2189 \r
2190         ui->image_Rotate90->setEnabled(true);\r
2191         ui->image_Rotate90->disconnect();\r
2192         connect(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));\r
2193 \r
2194         ui->image_Rotate180->setEnabled(true);\r
2195         ui->image_Rotate180->disconnect();\r
2196         connect(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));\r
2197     }\r
2198 \r
2199     ui->action_About->setEnabled(true);\r
2200     ui->action_CheckUpdate->setEnabled(true);\r
2201     ui->action_KeyDown->setEnabled(isView);\r
2202     ui->action_KeyEnd->setEnabled(isView);\r
2203     ui->action_KeyHome->setEnabled(isView);\r
2204     ui->action_KeyUp->setEnabled(isView);\r
2205     ui->action_Quit->setEnabled(true);\r
2206     ui->action_ScaleDown->setEnabled(isView);\r
2207     ui->action_ScaleUp->setEnabled(isView);\r
2208     ui->action_SearchNext->setEnabled(isSearch);\r
2209     ui->action_SearchPrev->setEnabled(isSearch);\r
2210     ui->action_Setting->setEnabled(true);\r
2211     ui->toggle_Search->setEnabled(toggleSearch);\r
2212     ui->view_Back->setEnabled(m_viewMode == ModeView);\r
2213 \r
2214     if (isImageView) {\r
2215         ui->action_ScaleDown->setText(tr("縮小"));\r
2216         ui->action_ScaleUp->setText(tr("拡大"));\r
2217     }\r
2218     else {\r
2219         ui->action_ScaleDown->setText(tr("文字を小さく"));\r
2220         ui->action_ScaleUp->setText(tr("文字を大きく"));\r
2221     }\r
2222 \r
2223     if (m_viewMode == ModeBasic || m_viewMode == ModeFull) {\r
2224         ui->toggle_FullMode->setEnabled(true);\r
2225     }\r
2226     else {\r
2227         ui->toggle_FullMode->setEnabled(false);\r
2228     }\r
2229 \r
2230     ui->action_historyBack->setEnabled(!activeModel()->isHistoryBegin());\r
2231     ui->action_HistoryForward->setEnabled(!activeModel()->isHistoryEnd());\r
2232 }\r
2233 \r
2234 ///////////////////////////////////////////////////////////////////////////////\r
2235 /// \brief MainWindow::setEnabledAllActions\r
2236 /// \param enable   有効にする場合はtrue\r
2237 ///\r
2238 /// 全てのアクションを有効または無効にします。\r
2239 ///\r
2240 void MainWindow::setEnabledAllActions(bool enable)\r
2241 {\r
2242     qDebug() << "MainWindow::setEnabledAllActions()" << enable;\r
2243     foreach (QAction *action, m_actions) {\r
2244         action->setEnabled(enable);\r
2245     }\r
2246 }\r
2247 \r
2248 ///////////////////////////////////////////////////////////////////////////////\r
2249 /// \brief MainWindow::onAbout\r
2250 ///\r
2251 /// Aboutダイアログを表示します。\r
2252 ///\r
2253 void MainWindow::onAbout()\r
2254 {\r
2255     QMessageBox::about(\r
2256                 this,\r
2257                 tr("げふぅ について"),\r
2258                 windowTitle() +\r
2259                 tr("<center>Gefu is an Experimental File Utility.<br/>"\r
2260                    "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
2261                    "<p>最新版の情報は<a href='http://gefu.sourceforge.jp/'>公式サイト</a>で公開しています。</p>"\r
2262                    "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
2263 }\r
2264 \r
2265 ///////////////////////////////////////////////////////////////////////////////\r
2266 /// \brief MainWindow::closeEvent\r
2267 /// \param event    クローズイベント\r
2268 ///\r
2269 /// 終了処理を行います。\r
2270 ///\r
2271 void MainWindow::closeEvent(QCloseEvent *event)\r
2272 {\r
2273     qDebug() << "MainWindow::closeEvent()";\r
2274     Preferences prefs(this);\r
2275 \r
2276     if (prefs.isConfirmQuit()) {\r
2277         QMessageBox msgBox;\r
2278         QCheckBox *checkBox = new QCheckBox();\r
2279         checkBox->setText(tr("次回以降は確認しない"));\r
2280         msgBox.setCheckBox(checkBox);\r
2281         msgBox.setText(tr("終了しますか?"));\r
2282         msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
2283         msgBox.setIcon(QMessageBox::Question);\r
2284 \r
2285         if (msgBox.exec() == QMessageBox::No) {\r
2286             qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";\r
2287             event->ignore();\r
2288             return;\r
2289         }\r
2290         prefs.setConfirmQuit(!checkBox->isChecked());\r
2291     }\r
2292 \r
2293     prefs.saveModel("Left", ui->LPanel->model());\r
2294     prefs.saveModel("Right", ui->RPanel->model());\r
2295     prefs.saveWindow(this);\r
2296     QMainWindow::closeEvent(event);\r
2297 }\r
2298 \r
2299 ///////////////////////////////////////////////////////////////////////////////\r
2300 /// \brief MainWindow::eventFilter\r
2301 /// \param watched  イベントの発生元オブジェクト\r
2302 /// \param e        発生したイベント\r
2303 /// \return イベントを処理した場合はtrueを返します。\r
2304 ///\r
2305 bool MainWindow::eventFilter(QObject *watched, QEvent *e)\r
2306 {\r
2307     switch (e->type()) {\r
2308     case QEvent::KeyPress:\r
2309         // キーイベントの処理\r
2310         return onKeyPressEvent(watched, static_cast<QKeyEvent*>(e));\r
2311 \r
2312     case QEvent::ContextMenu:\r
2313         // コンテキストメニューイベントの処理\r
2314         return onContextMenuEvent(watched, static_cast<QContextMenuEvent*>(e));\r
2315 \r
2316     case QEvent::Drop:\r
2317         qDebug() << "QEvent::Drop";\r
2318         // ドロップイベントの処理\r
2319         return onDropEvent(watched, static_cast<QDropEvent*>(e));\r
2320 \r
2321     default:\r
2322         break;\r
2323     }\r
2324 \r
2325     return false;\r
2326 }\r