OSDN Git Service

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