OSDN Git Service

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