OSDN Git Service

Ver0.19
[gefu/Gefu.git] / mainwindow.cpp
1 #include "common.h"\r
2 #include "version.h"\r
3 #include "preferencedialog.h"\r
4 #include "folderview.h"\r
5 #include "searchbox.h"\r
6 #include "locationbox.h"\r
7 #include "copymoveworker.h"\r
8 #include "operationdialog.h"\r
9 #include "overwritedialog.h"\r
10 #include "deleteworker.h"\r
11 #include "renameworker.h"\r
12 #include "renamesingledialog.h"\r
13 #include "renamemultidialog.h"\r
14 #include "historydialog.h"\r
15 #include "sortdialog.h"\r
16 #include "simpletextview.h"\r
17 #include "simpleimageview.h"\r
18 #include "mainwindow.h"\r
19 #include "ui_mainwindow.h"\r
20 #include "bookmarkdialog.h"\r
21 \r
22 #include <QCheckBox>\r
23 #include <QCloseEvent>\r
24 #include <QDebug>\r
25 #include <QDesktopWidget>\r
26 #include <QMessageBox>\r
27 #include <QSettings>\r
28 #include <QNetworkAccessManager>\r
29 #include <QNetworkReply>\r
30 #include <QInputDialog>\r
31 #include <QProcess>\r
32 #include <QDesktopServices>\r
33 #include <QClipboard>\r
34 #include <QFileDialog>\r
35 #include <folderpanel.h>\r
36 \r
37 MainWindow::MainWindow(QWidget *parent) :\r
38     QMainWindow(parent),\r
39     ui(new Ui::MainWindow),\r
40     m_focusedView(NULL),\r
41     m_overwriteDialog(NULL),\r
42     m_viewMode(ModeBasic)\r
43 {\r
44     qDebug() << ">>>>>>>>>> MainWindowの構築開始 <<<<<";\r
45     ui->setupUi(this);\r
46 \r
47     m_overwriteDialog = new OverWriteDialog(this);\r
48 \r
49     initActionConnections();\r
50     connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));\r
51     connect(ui->pane3->textView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));\r
52     connect(ui->pane3->imageView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));\r
53     connect(ui->pane1->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
54     connect(ui->pane2->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
55     connect(ui->pane3->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
56     connect(ui->pane1->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
57     connect(ui->pane2->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
58     connect(ui->pane3->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
59 \r
60     // ビューアは初期状態で非表示\r
61     ui->pane3->setVisible(false);\r
62 \r
63     // ステータスバーにウィジェットを設定する\r
64     QLabel *label = new QLabel("", this);\r
65     label->setAlignment(Qt::AlignRight);\r
66     label->setObjectName("Right");\r
67     ui->statusBar->addPermanentWidget(label, 0);\r
68 \r
69     for (int i = 1; i <= 2; i++) {\r
70         // pane1 or pane2\r
71         AnyView *anyView = findChild<AnyView*>(QString("pane%1").arg(i));\r
72         Q_CHECK_PTR(anyView);\r
73 \r
74         FolderPanel *fp = anyView->findChild<FolderPanel*>("folderPanel");\r
75         Q_CHECK_PTR(fp);\r
76 \r
77         // FolderPanelとFolderViewの名前を変更する\r
78         fp->setObjectName(QString("folderPanel%1").arg(i));\r
79         fp->folderView()->setObjectName(QString("folderView%1").arg(i));\r
80 \r
81         fp->initialize(this);\r
82     }\r
83 \r
84     QSettings settings;\r
85     // ブックマークメニューを初期化する\r
86     initBookmark();\r
87 \r
88     // メニュー項目の状態を初期化する\r
89     ui->view_Hidden->setChecked(settings.value(IniKey_ShowHidden).toBool());\r
90     ui->view_System->setChecked(settings.value(IniKey_ShowSystem).toBool());\r
91     ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
92     ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
93 \r
94     // 追加のショートカットキーを設定する\r
95     QList<QKeySequence> shortcuts;\r
96     shortcuts = ui->action_Open->shortcuts();\r
97     shortcuts.append(QKeySequence("M"));\r
98     ui->action_Open->setShortcuts(shortcuts);\r
99 \r
100     shortcuts = ui->action_Exec->shortcuts();\r
101     shortcuts.append(QKeySequence("Shift+M"));\r
102     ui->action_Exec->setShortcuts(shortcuts);\r
103 \r
104     // MacだとShift+の形で認識されてしまうもの\r
105     shortcuts = ui->view_FontSizeUp->shortcuts();\r
106     shortcuts.append(QKeySequence("Shift++"));\r
107     ui->view_FontSizeUp->setShortcuts(shortcuts);\r
108 \r
109     shortcuts = ui->view_Filter->shortcuts();\r
110     shortcuts.append(QKeySequence("Shift+*"));\r
111     ui->view_Filter->setShortcuts(shortcuts);\r
112 \r
113     shortcuts = ui->action_OpenTerminal->shortcuts();\r
114     shortcuts.append(QKeySequence("Shift+>"));\r
115     ui->action_OpenTerminal->setShortcuts(shortcuts);\r
116 \r
117     shortcuts = ui->help_About->shortcuts();\r
118     shortcuts.append(QKeySequence("Shift+?"));\r
119     ui->help_About->setShortcuts(shortcuts);\r
120 \r
121     // ウィンドウタイトルを設定する\r
122     setWindowTitle(tr("げふぅ v%1").arg(VERSION_VALUE));\r
123 \r
124     // ウィンドウアイコンを設定する\r
125 #if defined(Q_OS_MAC)\r
126     setWindowIcon(QIcon(":/images/Gefu.icns"));\r
127 #else\r
128     setWindowIcon(QIcon(":/images/Gefu.png"));\r
129 #endif\r
130 \r
131     //>>>>> ウィンドウサイズと位置を設定する\r
132     QString strValue;\r
133     QPoint point = this->geometry().topLeft();\r
134     QSize size = this->geometry().size();\r
135     //>>>> 前回の位置・サイズ・状態を復元する\r
136     if (!settings.value(IniKey_WindowGeometry, "").toString().isEmpty()) {\r
137         restoreGeometry(settings.value(IniKey_WindowGeometry).toByteArray());\r
138         restoreState(settings.value(iniKey_WindowState).toByteArray());\r
139     }\r
140     //>>>> INIファイルの設定から復元する\r
141     //>>> サイズ\r
142     strValue = settings.value(IniKey_BootSizeSpec).toString();\r
143     if (strValue == "sizeAbsolute") {\r
144         size = settings.value(IniKey_BootSizeAbs).toSize();\r
145     }\r
146     else if (strValue == "sizeRelative") {\r
147         size = settings.value(IniKey_BootSizeRel).toSize();\r
148         size.setWidth(size.width() * QApplication::desktop()->width() / 100.0);\r
149         size.setHeight(size.height() * QApplication::desktop()->height() / 100.0);\r
150     }\r
151     else if (strValue == "sizeLast") {\r
152         size = this->geometry().size();\r
153     }\r
154     //>>> 位置\r
155     strValue = settings.value(IniKey_BootPosSpec).toString();\r
156     if (strValue == "posAbsolute") {\r
157         point = settings.value(IniKey_BootPosAbs).toPoint();\r
158     }\r
159     else if (strValue == "posRelative") {\r
160         point = settings.value(IniKey_BootPosRel).toPoint();\r
161         point.setX(point.x() * QApplication::desktop()->width() / 100.0);\r
162         point.setY(point.y() * QApplication::desktop()->height() / 100.0);\r
163     }\r
164     else if (strValue == "posLast") {\r
165         point = this->geometry().topLeft();\r
166     }\r
167     else {\r
168         point.setX((QApplication::desktop()->width() - size.width()) / 2);\r
169         point.setY((QApplication::desktop()->height() - size.height()) / 2);\r
170     }\r
171     this->setGeometry(QRect(point, size));\r
172 \r
173     // 最新バージョンをチェックする\r
174     if (settings.value(IniKey_CheckUpdates).toBool()) {\r
175         checkUpdate(true);\r
176     }\r
177 \r
178     ui->pane2->changeView(AnyView::ViewFolder);\r
179     ui->pane2->repaint();\r
180 \r
181     ui->pane1->changeView(AnyView::ViewFolder);\r
182     ui->pane1->repaint();\r
183 \r
184     qDebug() << ">>>>>>>>>> MainWindowの構築終了 <<<<<";\r
185 }\r
186 \r
187 MainWindow::~MainWindow()\r
188 {\r
189     delete ui;\r
190 }\r
191 \r
192 void MainWindow::focusChange(QWidget *old, QWidget *now)\r
193 {\r
194     qDebug() << ">>>>> フォーカス変更";\r
195     if (old) qDebug() << "old is" << old->objectName();\r
196     if (now) qDebug() << "now is" << now->objectName();\r
197 \r
198     // 検索ボックスがフォーカスを失ったら、非表示にする\r
199     if (old == ui->pane1->folderPanel()->searchBox() ||\r
200         old == ui->pane2->folderPanel()->searchBox())\r
201     {\r
202         ui->action_Search->setChecked(false);\r
203     }\r
204 \r
205     // フォルダビューにフォーカスが移ったら、ステータスバーの表示を更新する\r
206     if (now == ui->pane1->folderPanel()->folderView() ||\r
207         now == ui->pane2->folderPanel()->folderView())\r
208     {\r
209         FolderView *view = static_cast<FolderView*>(now);\r
210         ui->statusBar->showMessage(view->currentItem().absoluteFilePath());\r
211     }\r
212 \r
213     if (now) {\r
214         updateActions();\r
215     }\r
216 }\r
217 \r
218 void MainWindow::executeCommand()\r
219 {\r
220     qDebug() << "MainWindow::executeCommand";\r
221 \r
222     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
223     Q_CHECK_PTR(view);\r
224 \r
225     QFileInfoList list = view->selectedItems();\r
226     QString command = QString::null;\r
227     foreach (const QFileInfo &info, list) {\r
228 #ifdef Q_OS_MAC\r
229         QString path = info.absoluteFilePath();\r
230 #else\r
231         QString path = info.fileName();\r
232 #endif\r
233         if (info.isExecutable()) {\r
234             command = QQ(path) + " " + command;\r
235         }\r
236         else {\r
237             command += " " + QQ(path);\r
238         }\r
239     }\r
240 \r
241     QInputDialog dlg(this);\r
242     dlg.setInputMode(QInputDialog::TextInput);\r
243     dlg.setWindowTitle(tr("コマンドを実行"));\r
244     dlg.setLabelText(tr("コマンド:"));\r
245     dlg.setTextValue(command);\r
246     dlg.resize(width() * 0.8, dlg.height());\r
247 \r
248     int ret = dlg.exec();\r
249     command = dlg.textValue();\r
250     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
251         startProcess(command, view->dir(), tr("コマンドの実行に失敗しました。"));\r
252     }\r
253 }\r
254 \r
255 void MainWindow::historyBack()\r
256 {\r
257     qDebug() << "MainWindow::historyBack();";\r
258 \r
259     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
260     Q_CHECK_PTR(view);\r
261 \r
262     if (view->historyBack()) {\r
263         updateActions();\r
264     }\r
265 }\r
266 \r
267 void MainWindow::historyForward()\r
268 {\r
269     qDebug() << "MainWindow::historyForward();";\r
270 \r
271     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
272     Q_CHECK_PTR(view);\r
273 \r
274     if (view->historyForward()) {\r
275         updateActions();\r
276     }\r
277 }\r
278 \r
279 void MainWindow::markAll()\r
280 {\r
281     qDebug() << "MainWindow::markAll();";\r
282 \r
283     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
284     Q_CHECK_PTR(view);\r
285 \r
286     view->setCheckStateAll(true);\r
287 }\r
288 \r
289 void MainWindow::markAllFiles()\r
290 {\r
291     qDebug() << "MainWindow::markAllFiles();";\r
292 \r
293     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
294     Q_CHECK_PTR(view);\r
295 \r
296     view->setCheckStateAllFiles();\r
297 }\r
298 \r
299 void MainWindow::markAllOff()\r
300 {\r
301     qDebug() << "MainWindow::markAllOff();";\r
302 \r
303     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
304     Q_CHECK_PTR(view);\r
305 \r
306     view->setCheckStateAll(false);\r
307 }\r
308 \r
309 void MainWindow::markInvert()\r
310 {\r
311     qDebug() << "MainWindow::markInvert();";\r
312 \r
313     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
314     Q_CHECK_PTR(view);\r
315 \r
316     view->invertCheckState();\r
317 }\r
318 \r
319 void MainWindow::markToggle()\r
320 {\r
321     qDebug() << "MainWindow::markToggle();";\r
322 \r
323     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
324     Q_CHECK_PTR(view);\r
325 \r
326     view->toggleCheckState(view->currentIndex());\r
327 }\r
328 \r
329 void MainWindow::moveItems()\r
330 {\r
331     qDebug() << "MainWindow::moveItems";\r
332 \r
333     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
334     Q_CHECK_PTR(view);\r
335 \r
336     QFileInfoList list = view->selectedItems();\r
337     if (list.isEmpty()) {\r
338         return;\r
339     }\r
340 \r
341     QSettings settings;\r
342     if (settings.value(IniKey_ConfirmMove).toBool()) {\r
343         if (QMessageBox::question(this, tr("確認"), tr("移動を実行しますか?"))\r
344             != QMessageBox::Yes)\r
345         {\r
346             return;\r
347         }\r
348     }\r
349 \r
350     // 上書き確認ダイアログを初期化する\r
351     m_overwriteDialog->reset();\r
352 \r
353     // ワーカースレッドを作成する\r
354     FolderView *other = otherSideFolderView(view);\r
355     CopyMoveWorker *worker = new CopyMoveWorker();\r
356     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
357             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
358     worker->setCopyList(&list);\r
359     worker->setTargetDir(other->dir());\r
360     worker->setMoveMode(true);\r
361 \r
362     // 進捗ダイアログを表示して、処理を開始する\r
363     OperationDialog opDlg(this);\r
364     opDlg.setWindowTitle(tr("移動"));\r
365     opDlg.setWorker(worker);\r
366     opDlg.setAutoClose(settings.value(IniKey_AutoCloseMove).toBool());\r
367 \r
368     int row = view->currentIndex().row();\r
369 \r
370     opDlg.exec();\r
371 \r
372     if (row >= view->model()->rowCount()) {\r
373         row = view->model()->rowCount() - 1;\r
374     }\r
375     //view->selectRow(row);\r
376     view->setCurrentIndex(view->model()->index(row, 1));\r
377 \r
378     settings.setValue(IniKey_AutoCloseMove, opDlg.autoClose());\r
379 }\r
380 \r
381 void MainWindow::leftKeyPress()\r
382 {\r
383     qDebug() << "MainWindow::leftKeyPress();";\r
384 \r
385     if (ui->pane3->textView()->hasFocus()) {\r
386         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier);\r
387         QApplication::sendEvent(ui->pane3->textView(), &event);\r
388     }\r
389     else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {\r
390         setPathToParent();\r
391     }\r
392     else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {\r
393         ui->pane1->folderPanel()->folderView()->setFocus();\r
394     }\r
395 }\r
396 \r
397 void MainWindow::rightKeyPress()\r
398 {\r
399     qDebug() << "MainWindow::rightKeyPress();";\r
400 \r
401     if (ui->pane3->textView()->hasFocus()) {\r
402         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier);\r
403         QApplication::sendEvent(ui->pane3->textView(), &event);\r
404     }\r
405     else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {\r
406         ui->pane2->folderPanel()->folderView()->setFocus();\r
407     }\r
408     else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {\r
409         setPathToParent();\r
410     }\r
411 }\r
412 \r
413 void MainWindow::showFileInfo(const QString &str)\r
414 {\r
415     qDebug() << "MainWindow::showFileInfo();" << str;\r
416     QLabel *label = ui->statusBar->findChild<QLabel*>("Right");\r
417     Q_CHECK_PTR(label);\r
418 \r
419     label->setText(str);\r
420 }\r
421 \r
422 void MainWindow::chooseFolder()\r
423 {\r
424     qDebug() << "MainWindow::chooseFolder();";\r
425 \r
426     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
427     Q_CHECK_PTR(view);\r
428 \r
429     QString path = QFileDialog::getExistingDirectory(\r
430                 this, tr("フォルダを選択"), view->dir());\r
431     if (!path.isEmpty()) {\r
432         view->setPath(path, true);\r
433         updateActions();\r
434     }\r
435 }\r
436 \r
437 void MainWindow::copyFilenameToClipboard()\r
438 {\r
439     qDebug() << "MainWindow::copyFilenameToClipboard();";\r
440 \r
441     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
442     Q_CHECK_PTR(view);\r
443 \r
444     QClipboard *clipboard = QApplication::clipboard();\r
445     clipboard->setText(view->currentItem().fileName());\r
446 }\r
447 \r
448 void MainWindow::copyFullpathTpClipboard()\r
449 {\r
450     qDebug() << "MainWindow::copyFullpathTpClipboard();";\r
451 \r
452     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
453     Q_CHECK_PTR(view);\r
454 \r
455     QClipboard *clipboard = QApplication::clipboard();\r
456     clipboard->setText(view->currentItem().absoluteFilePath());\r
457 }\r
458 \r
459 void MainWindow::askOverWrite(QString *copyMethod,\r
460                               QString *alias,\r
461                               const QString &srcPath,\r
462                               const QString &tgtPath)\r
463 {\r
464     qDebug() << "MainWindow::askOverWrite();";\r
465 \r
466     CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
467     if (!m_overwriteDialog->isKeepSetting() ||\r
468         m_overwriteDialog->copyMethod() == "rbRename")\r
469     {\r
470         m_overwriteDialog->setFileInfo(srcPath, tgtPath);\r
471         if (m_overwriteDialog->exec() == QDialog::Rejected) {\r
472             worker->requestStop();\r
473         }\r
474     }\r
475     *copyMethod = m_overwriteDialog->copyMethod();\r
476     *alias = m_overwriteDialog->alias();\r
477 \r
478     worker->endAsking();\r
479 }\r
480 \r
481 void MainWindow::currentChange(const QFileInfo &info)\r
482 {\r
483     qDebug() << ">>>>> カーソル変更 <<<<<";\r
484 \r
485     FolderView *view = static_cast<FolderView*>(sender());\r
486     Q_CHECK_PTR(view);\r
487 \r
488     if (!view->hasFocus()) {\r
489         return;\r
490     }\r
491 \r
492     // ステータスバーにカーソルのフルパスを表示する\r
493     ui->statusBar->showMessage(info.absoluteFilePath());\r
494 \r
495     // ハーフモードで変更された場合\r
496     if (m_viewMode & ModeHalfView) {\r
497         AnyView *otherSide = static_cast<AnyView*>(\r
498                     otherSideFolderView(view)->parent()->parent());\r
499         Q_CHECK_PTR(otherSide);\r
500 \r
501         if (!otherSide->setViewItem(view->currentItem())) {\r
502             showFileInfo("");\r
503         }\r
504     }\r
505 \r
506     updateActions();\r
507 }\r
508 \r
509 void MainWindow::dropAccept(const QFileInfoList &list)\r
510 {\r
511     qDebug() << "MainWindow::dropAccept();";\r
512 \r
513     FolderView *view = static_cast<FolderView*>(sender());\r
514     Q_CHECK_PTR(view);\r
515 \r
516     copyItems(list, view->dir());\r
517 }\r
518 \r
519 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)\r
520 {\r
521     qDebug() << "MainWindow::copyItems();";\r
522 \r
523     QSettings settings;\r
524     if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
525         if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
526             != QMessageBox::Yes)\r
527         {\r
528             return;\r
529         }\r
530     }\r
531 \r
532     // 上書き確認ダイアログを初期化する\r
533     m_overwriteDialog->reset();\r
534 \r
535     // ワーカースレッドを作成する\r
536     CopyMoveWorker *worker = new CopyMoveWorker();\r
537     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
538             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
539     worker->setCopyList(&list);\r
540     worker->setTargetDir(tgtDir);\r
541     worker->setMoveMode(false);\r
542 \r
543     // 進捗ダイアログを表示して、処理を開始する\r
544     OperationDialog opDlg(this);\r
545     opDlg.setWindowTitle(tr("コピー"));\r
546     opDlg.setWorker(worker);\r
547     opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
548 \r
549     opDlg.exec();\r
550 \r
551     settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
552 }\r
553 \r
554 void MainWindow::copyItems()\r
555 {\r
556     qDebug() << "MainWindow::copyItems";\r
557 \r
558     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
559     Q_CHECK_PTR(view);\r
560 \r
561     QFileInfoList list = view->selectedItems();\r
562     if (list.isEmpty()) {\r
563         return;\r
564     }\r
565 \r
566     QString tgtPath = otherSideFolderView(view)->dir();\r
567     copyItems(list, tgtPath);\r
568 }\r
569 \r
570 void MainWindow::createFile()\r
571 {\r
572     qDebug() << "MainWindow::createFile";\r
573 \r
574     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
575     Q_CHECK_PTR(view);\r
576 \r
577     bool bOk;\r
578     QString name = QInputDialog::getText(\r
579                 this, tr("ファイルを作成"), tr("ファイル名:"),\r
580                 QLineEdit::Normal, "", &bOk);\r
581     if (!bOk || name.isEmpty()) {\r
582         return;\r
583     }\r
584 \r
585     QDir dir(view->dir());\r
586     QFile file(dir.absoluteFilePath(name));\r
587     if (!file.open(QIODevice::WriteOnly)) {\r
588         QMessageBox::critical(\r
589                     this, tr("エラー"),\r
590                     tr("ファイルの作成に失敗しました。"));\r
591     }\r
592     else {\r
593         file.close();\r
594 \r
595         QSettings settings;\r
596         if (settings.value(IniKey_OpenAfterCreateFile).toBool()) {\r
597             openEditor(dir.absoluteFilePath(name));\r
598         }\r
599 \r
600         view->refresh();\r
601         view->searchItem(name);\r
602     }\r
603 }\r
604 \r
605 void MainWindow::createFolder()\r
606 {\r
607     qDebug() << "MainWindow::createFolder";\r
608 \r
609     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
610     Q_CHECK_PTR(view);\r
611 \r
612     bool bOk;\r
613     QString name = QInputDialog::getText(\r
614                 this, tr("フォルダを作成"), tr("フォルダ名:"),\r
615                 QLineEdit::Normal, "", &bOk);\r
616     if (!bOk || name.isEmpty()) {\r
617         return;\r
618     }\r
619 \r
620     QDir dir(view->dir());\r
621     if (!dir.mkpath(name)) {\r
622         QMessageBox::critical(\r
623                     this, tr("エラー"),\r
624                     tr("フォルダの作成に失敗しました。"));\r
625     }\r
626     else {\r
627         QSettings settings;\r
628         if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {\r
629             view->setPath(dir.absoluteFilePath(name), true);\r
630         }\r
631 \r
632         view->refresh();\r
633         view->searchItem(name);\r
634     }\r
635 }\r
636 \r
637 void MainWindow::deleteItems()\r
638 {\r
639     qDebug() << "MainWindow::deleteItems";\r
640 \r
641     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
642     Q_CHECK_PTR(view);\r
643 \r
644     QFileInfoList list = view->selectedItems();\r
645     if (list.isEmpty()) {\r
646         return;\r
647     }\r
648 \r
649     QSettings settings;\r
650     if (settings.value(IniKey_ConfirmDelete).toBool()) {\r
651         QString msg;\r
652         if (list.size() == 1) {\r
653             msg = list[0].fileName();\r
654         }\r
655         else {\r
656             msg = tr("%1個のアイテム").arg(list.size());\r
657         }\r
658         int ret = QMessageBox::question(\r
659                     this, tr("確認"),\r
660                     msg + tr("を削除しますか?"));\r
661         if (ret != QMessageBox::Yes) {\r
662             return;\r
663         }\r
664     }\r
665 \r
666     DeleteWorker *worker = new DeleteWorker();\r
667     worker->setDeleteList(&list);\r
668 \r
669     OperationDialog opDlg(this);\r
670     opDlg.setWindowTitle(tr("削除"));\r
671     opDlg.setWorker(worker);\r
672     opDlg.setAutoClose(settings.value(IniKey_AutoCloseDelete).toBool());\r
673 \r
674     int row = view->currentIndex().row();\r
675 \r
676     opDlg.exec();\r
677     view->refresh();\r
678 \r
679     if (row >= view->model()->rowCount()) {\r
680         row = view->model()->rowCount() - 1;\r
681     }\r
682 //    view->selectRow(row);\r
683     view->setCurrentIndex(view->model()->index(row, 1));\r
684 \r
685     settings.setValue(IniKey_AutoCloseDelete, opDlg.autoClose());\r
686 }\r
687 \r
688 void MainWindow::open(const QModelIndex &index)\r
689 {\r
690     Q_UNUSED(index);\r
691     qDebug() << "MainWindow::open";\r
692 \r
693     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
694     Q_CHECK_PTR(view);\r
695 \r
696     QFileInfo info = view->currentItem();\r
697     if (info.isDir()) {\r
698         view->setPath(info.absoluteFilePath(), true);\r
699         updateActions();\r
700         return;\r
701     }\r
702 \r
703     setUpdatesEnabled(false);\r
704 \r
705     m_focusedView = view;\r
706     if (ui->pane3->setViewItem(info)) {\r
707         ui->pane3->setVisible(true);\r
708         ui->splitter->setVisible(false);\r
709 \r
710         setViewMode(ModeFullView);\r
711     }\r
712     else {\r
713         ui->pane3->setVisible(false);\r
714     }\r
715 \r
716     setUpdatesEnabled(true);\r
717 }\r
718 \r
719 void MainWindow::openEditor(const QString &path)\r
720 {\r
721     qDebug() << "MainWindow::openEditor";\r
722 \r
723     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
724     Q_CHECK_PTR(view);\r
725 \r
726     QSettings settings;\r
727     QString exe = settings.value(IniKey_EditorPath).toString();\r
728     if (exe.isEmpty()) {\r
729         QMessageBox::critical(\r
730                     this, tr("エラー"),\r
731                     tr("外部エディタのパスが未定義です。"));\r
732         return;\r
733     }\r
734 \r
735     QFileInfoList list;\r
736     if (path.isEmpty()) {\r
737         list = view->selectedItems();\r
738     }\r
739     else {\r
740         list << path;\r
741     }\r
742 \r
743     foreach (const QFileInfo &info, list) {\r
744         QString opt = settings.value(IniKey_EditorOption).toString();\r
745         replaceVars(opt, info);\r
746 \r
747 #ifdef Q_OS_MAC\r
748         QString command = "open -a " + exe + " " + opt;\r
749 #else\r
750         QString command = QQ(exe) + " " + opt;\r
751 #endif\r
752         if (!startProcess(command, info.absolutePath(), tr("外部エディタの起動に失敗しました。"))) {\r
753             break;\r
754         }\r
755     }\r
756 }\r
757 \r
758 void MainWindow::openTerminal()\r
759 {\r
760     qDebug() << "MainWindow::openTerminal";\r
761 \r
762     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
763     Q_CHECK_PTR(view);\r
764 \r
765     QSettings settings;\r
766     QString exe = settings.value(IniKey_TerminalPath).toString();\r
767     if (exe.isEmpty()) {\r
768         QMessageBox::critical(\r
769                     this, tr("エラー"),\r
770                     tr("ターミナルのパスが未定義です。"));\r
771         return;\r
772     }\r
773 \r
774     foreach (const QFileInfo &info, view->selectedItems()) {\r
775         QString opt = settings.value(IniKey_TerminalOption).toString();\r
776         replaceVars(opt, info);\r
777 \r
778 #ifdef Q_OS_MAC\r
779         QString command = "open -a " + QQ(exe) + " --args " + opt;\r
780 #else\r
781         QString command = QQ(exe) + " " + opt;\r
782 #endif\r
783         if (!startProcess(command, info.absolutePath(), tr("ターミナルの起動に失敗しました。"))) {\r
784             break;\r
785         }\r
786         Sleep(1000);\r
787     }\r
788 }\r
789 \r
790 void MainWindow::openBookmark()\r
791 {\r
792     qDebug() << "MainWindow::openBookmark();";\r
793 \r
794     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
795     Q_CHECK_PTR(view);\r
796 \r
797     QAction *action = qobject_cast<QAction*>(sender());\r
798     Q_CHECK_PTR(action);\r
799 \r
800     QSettings settings;\r
801     int i = action->data().toInt();\r
802     view->setPath(settings.value(IniKey_BookmarkEntryPath(i)).toString(), true);\r
803 }\r
804 \r
805 void MainWindow::refresh()\r
806 {\r
807     qDebug() << "MainWindow::refresh();";\r
808 \r
809     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
810     Q_CHECK_PTR(view);\r
811 \r
812     view->refresh();\r
813 }\r
814 \r
815 void MainWindow::renameItems()\r
816 {\r
817     qDebug() << "MainWindow::renameItems";\r
818 \r
819     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
820     Q_CHECK_PTR(view);\r
821 \r
822     QFileInfoList list = view->selectedItems();\r
823     if (list.isEmpty()) {\r
824         return;\r
825     }\r
826 \r
827     IRenameDialog *dlg;\r
828     if (list.size() == 1) {\r
829         dlg = new RenameSingleDialog(this);\r
830     }\r
831     else {\r
832         dlg = new RenameMultiDialog(this);\r
833     }\r
834     dlg->setWorkingDirectory(view->dir());\r
835     dlg->setNames(list);\r
836     int dlgResult = dlg->exec();\r
837     if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {\r
838         return;\r
839     }\r
840 \r
841     QSettings settings;\r
842     if (settings.value(IniKey_ConfirmRename).toBool()) {\r
843         int ret = QMessageBox::question(this, tr("確認"),\r
844                                         tr("名前の変更を実行しますか?"));\r
845         if (ret != QMessageBox::Yes) {\r
846             return;\r
847         }\r
848     }\r
849 \r
850     RenameWorker *worker = new RenameWorker();\r
851     worker->setRenameMap(&dlg->renameMap());\r
852 \r
853     OperationDialog opDlg(this);\r
854     opDlg.setWindowTitle(tr("名前を変更"));\r
855     opDlg.setWorker(worker);\r
856     opDlg.setAutoClose(settings.value(IniKey_AutoCloseRename).toBool());\r
857 \r
858     opDlg.exec();\r
859     view->refresh();\r
860 \r
861     QFileInfo info(dlg->renameMap().first());\r
862     view->searchItem(info.fileName());\r
863 \r
864     settings.setValue(IniKey_AutoCloseRename, opDlg.autoClose());\r
865 }\r
866 \r
867 void MainWindow::shellExecute()\r
868 {\r
869     qDebug() << "MainWindow::shellExecute";\r
870 \r
871     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
872     Q_CHECK_PTR(view);\r
873 \r
874     foreach (const QFileInfo &info, view->selectedItems()) {\r
875         QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
876         QDesktopServices::openUrl(QUrl("file:///" + path));\r
877     }\r
878 }\r
879 \r
880 void MainWindow::showBookmarkDialog()\r
881 {\r
882     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
883     Q_CHECK_PTR(view);\r
884 \r
885     BookmarkDialog dlg(this);\r
886     dlg.setEditMode(false);\r
887     if (dlg.exec() == QDialog::Accepted) {\r
888         int n = dlg.selectedIndex();\r
889 \r
890         QSettings settings;\r
891         view->setPath(settings.value(IniKey_BookmarkEntryPath(n)).toString(), true);\r
892     }\r
893 }\r
894 \r
895 void MainWindow::editBookmark()\r
896 {\r
897     qDebug() << "MainWindow::showBookmarkDialog();";\r
898 \r
899     BookmarkDialog dlg(this);\r
900     dlg.setEditMode(true);\r
901 \r
902     if (dlg.exec() == QDialog::Accepted) {\r
903         initBookmark();\r
904     }\r
905 }\r
906 \r
907 void MainWindow::showFilterDialog()\r
908 {\r
909     qDebug() << "MainWindow::showFilterDialog();";\r
910 \r
911     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
912     Q_CHECK_PTR(view);\r
913 \r
914     QString filters = view->nameFilters().join(" ");\r
915 \r
916     QInputDialog dlg(this);\r
917     dlg.setInputMode(QInputDialog::TextInput);\r
918     dlg.setWindowTitle(tr("フィルタを設定"));\r
919     dlg.setLabelText(tr("フィルタ:"));\r
920     dlg.setTextValue(filters);\r
921     dlg.resize(width() * 0.8, dlg.height());\r
922 \r
923     if (dlg.exec() == QDialog::Accepted) {\r
924         static_cast<FolderPanel*>(view->parent())->setNameFilters(dlg.textValue());\r
925         int row = view->currentIndex().row();\r
926 \r
927         view->refresh();\r
928 \r
929         if (row >= view->model()->rowCount()) {\r
930             row = view->model()->rowCount() - 1;\r
931         }\r
932 //        view->selectRow(row);\r
933         view->setCurrentIndex(view->model()->index(row, 1));\r
934 \r
935     }\r
936 }\r
937 \r
938 void MainWindow::showHistoryDialog()\r
939 {\r
940     qDebug() << "MainWindow::showHistoryDialog();";\r
941 \r
942     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
943     Q_CHECK_PTR(view);\r
944 \r
945     FolderView *vOther = otherSideFolderView(view);\r
946 \r
947     HistoryDialog dlg(this);\r
948     if (view->side() == "Left") {\r
949         dlg.setDefaultLeft(true);\r
950         dlg.setHistory(view->history(), vOther->history());\r
951     }\r
952     else {\r
953         dlg.setDefaultLeft(false);\r
954         dlg.setHistory(vOther->history(), view->history());\r
955     }\r
956 \r
957     if (dlg.exec() == QDialog::Accepted) {\r
958         if (view->side() == dlg.selectedSide()) {\r
959             view->setHistoryIndexAt(dlg.selectedIndex());\r
960         }\r
961         else {\r
962             view->setPath(vOther->history()->at(dlg.selectedIndex()), true);\r
963         }\r
964     }\r
965 }\r
966 \r
967 void MainWindow::showSortDialog()\r
968 {\r
969     qDebug() << "MainWindow::showSortDialog();";\r
970 \r
971     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
972     Q_CHECK_PTR(view);\r
973 \r
974     SortDialog dlg(this);\r
975     dlg.setRightOrLeft(view->side());\r
976 \r
977     if (dlg.exec() == QDialog::Accepted) {\r
978         view->setSorting();\r
979         view->refresh();\r
980     }\r
981 }\r
982 \r
983 void MainWindow::swapView()\r
984 {\r
985     qDebug() << "MainWindow::swapView();";\r
986 \r
987     QString dir1 = ui->pane1->folderPanel()->folderView()->dir();\r
988     QString dir2 = ui->pane2->folderPanel()->folderView()->dir();\r
989 \r
990     ui->pane1->folderPanel()->folderView()->setPath(dir2, true);\r
991     ui->pane2->folderPanel()->folderView()->setPath(dir1, true);\r
992 \r
993     updateActions();\r
994 }\r
995 \r
996 void MainWindow::switchHalfMode(bool checked)\r
997 {\r
998     qDebug() << "MainWindow::switchHalfMode();" << checked;\r
999 \r
1000     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
1001     Q_CHECK_PTR(view);\r
1002 \r
1003     AnyView *pane = static_cast<AnyView*>(\r
1004                 otherSideFolderView(view)->parent()->parent());\r
1005     Q_CHECK_PTR(pane);\r
1006 \r
1007     if (checked) {\r
1008         // ハーフモードへ移行する\r
1009         setViewMode(ModeHalfView);\r
1010         pane->setViewItem(view->currentItem());\r
1011     }\r
1012     else {\r
1013         // ハーフモードを解除する\r
1014         setViewMode(ModeBasic);\r
1015         pane->changeView(AnyView::ViewFolder);\r
1016     }\r
1017     updateActions();\r
1018 }\r
1019 \r
1020 //void MainWindow::searchItem(const QString &text)\r
1021 //{\r
1022 //    qDebug() << "MainWindow::searchItem" << text;\r
1023 \r
1024 //    SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());\r
1025 //    Q_CHECK_PTR(box);\r
1026 \r
1027 //    if (text.right(1) == "/") {\r
1028 //        // '/'が入力されたら、検索終了\r
1029 //        box->setText(text.left(text.length() - 1));\r
1030 //        ui->action_Search->setChecked(false);\r
1031 //    }\r
1032 //    else {\r
1033 //        FolderPanel *fp = qobject_cast<FolderPanel*>(box->parent());\r
1034 //        Q_CHECK_PTR(fp);\r
1035 \r
1036 //        fp->folderView()->searchItem(box->text());\r
1037 //    }\r
1038 //}\r
1039 \r
1040 void MainWindow::searchNext()\r
1041 {\r
1042     qDebug() << "MainWindow::searchNext";\r
1043 \r
1044     SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());\r
1045     Q_CHECK_PTR(box);\r
1046 \r
1047     FolderPanel *fp = qobject_cast<FolderPanel*>(box->parent());\r
1048     Q_CHECK_PTR(fp);\r
1049 \r
1050     fp->folderView()->searchNext(box->text());\r
1051 }\r
1052 \r
1053 void MainWindow::searchPrev()\r
1054 {\r
1055     qDebug() << "MainWindow::searchPrev";\r
1056 \r
1057     SearchBox *box = qobject_cast<SearchBox*>(qApp->focusWidget());\r
1058     Q_CHECK_PTR(box);\r
1059 \r
1060     FolderPanel *fp = qobject_cast<FolderPanel*>(box->parent());\r
1061     Q_CHECK_PTR(fp);\r
1062 \r
1063     fp->folderView()->searchPrev(box->text());\r
1064 }\r
1065 \r
1066 void MainWindow::setCursorToBegin()\r
1067 {\r
1068     qDebug() << "MainWindow::setCursorToBegin();";\r
1069 \r
1070     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::NoModifier);\r
1071     QApplication::sendEvent(QApplication::focusWidget(), &event1);\r
1072 \r
1073     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
1074     QApplication::sendEvent(QApplication::focusWidget(), &event2);\r
1075 }\r
1076 \r
1077 void MainWindow::cursorDown()\r
1078 {\r
1079     qDebug() << "MainWindow::cursorDown();";\r
1080 \r
1081     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
1082     QApplication::sendEvent(QApplication::focusWidget(), &event);\r
1083 }\r
1084 \r
1085 void MainWindow::cursorUp()\r
1086 {\r
1087     qDebug() << "MainWindow::cursorUp();";\r
1088 \r
1089     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
1090     QApplication::sendEvent(QApplication::focusWidget(), &event);\r
1091 }\r
1092 \r
1093 void MainWindow::setCursorToEnd()\r
1094 {\r
1095     qDebug() << "MainWindow::setCursorToEnd();";\r
1096 \r
1097     QKeyEvent event1 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier);\r
1098     QApplication::sendEvent(QApplication::focusWidget(), &event1);\r
1099 \r
1100     QKeyEvent event2 = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
1101     QApplication::sendEvent(QApplication::focusWidget(), &event2);\r
1102 }\r
1103 \r
1104 void MainWindow::setFontSizeDown()\r
1105 {\r
1106     qDebug() << "MainWindow::setFontSizeDown();";\r
1107 \r
1108     changeFontSize(-1);\r
1109 }\r
1110 \r
1111 void MainWindow::setFontSizeUp()\r
1112 {\r
1113     qDebug() << "MainWindow::setFontSizeUp();";\r
1114 \r
1115     changeFontSize(1);\r
1116 }\r
1117 \r
1118 void MainWindow::changeFontSize(int diff)\r
1119 {\r
1120     qDebug() << "MainWindow::changeFontSize(;";\r
1121 \r
1122     QSettings settings;\r
1123     QFont font;\r
1124 \r
1125     // フォルダビューのフォントサイズ変更\r
1126     if (ui->pane1->folderPanel()->folderView()->hasFocus() ||\r
1127         ui->pane2->folderPanel()->folderView()->hasFocus())\r
1128     {\r
1129         font = settings.value(IniKey_ViewFont).value<QFont>();\r
1130         font.setPointSize(font.pointSize() + diff);\r
1131         settings.setValue(IniKey_ViewFont, font);\r
1132 \r
1133         ui->pane1->folderPanel()->folderView()->updateAppearance();\r
1134         ui->pane2->folderPanel()->folderView()->updateAppearance();\r
1135     }\r
1136 \r
1137     // テキストビューのフォントサイズ変更\r
1138     if (ui->pane1->textView()->hasFocus() ||\r
1139         ui->pane2->textView()->hasFocus() ||\r
1140         ui->pane3->textView()->hasFocus())\r
1141     {\r
1142         font = settings.value(IniKey_ViewerFont).value<QFont>();\r
1143         font.setPointSize(font.pointSize() + diff);\r
1144         settings.setValue(IniKey_ViewerFont, font);\r
1145 \r
1146         ui->pane1->textView()->updateAppearance();\r
1147         ui->pane2->textView()->updateAppearance();\r
1148         ui->pane3->textView()->updateAppearance();\r
1149     }\r
1150 \r
1151     if (ui->pane1->imageView()->hasFocus() ||\r
1152         ui->pane2->imageView()->hasFocus() ||\r
1153         ui->pane3->imageView()->hasFocus())\r
1154     {\r
1155         ui->pane1->imageView()->changeScale(diff > 0);\r
1156         ui->pane2->imageView()->changeScale(diff > 0);\r
1157         ui->pane3->imageView()->changeScale(diff > 0);\r
1158     }\r
1159 }\r
1160 \r
1161 void MainWindow::initBookmark()\r
1162 {\r
1163     QSettings settings;\r
1164     QFileIconProvider iconProvider;\r
1165 \r
1166     ui->menu_Bookmark->clear();\r
1167     ui->menu_Bookmark->addAction(ui->bookmark_Edit);\r
1168     ui->menu_Bookmark->addSeparator();\r
1169     int i = 0;\r
1170     while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {\r
1171         QString path = settings.value(IniKey_BookmarkEntryPath(i)).toString();\r
1172         QAction *action = new QAction(this);\r
1173         action->setText(settings.value(IniKey_BookmarkEntryName(i)).toString());\r
1174         action->setData(i);\r
1175         action->setIcon(iconProvider.icon(QFileInfo(path)));\r
1176         ui->menu_Bookmark->addAction(action);\r
1177         connect(action, SIGNAL(triggered()), this, SLOT(openBookmark()));\r
1178         i++;\r
1179     }\r
1180 }\r
1181 \r
1182 void MainWindow::setPathFromOther()\r
1183 {\r
1184     qDebug() << "MainWindow::setPathFromOther();";\r
1185 \r
1186     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
1187     Q_CHECK_PTR(view);\r
1188 \r
1189     FolderView *other = otherSideFolderView(view);\r
1190 \r
1191     view->setPath(other->dir(), true);\r
1192 }\r
1193 \r
1194 void MainWindow::setPathToHome()\r
1195 {\r
1196     qDebug() << "MainWindow::setPathToHome();";\r
1197 \r
1198     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
1199     Q_CHECK_PTR(view);\r
1200 \r
1201     view->setPath(QDir::homePath(), true);\r
1202 }\r
1203 \r
1204 void MainWindow::setPathToOther()\r
1205 {\r
1206     qDebug() << "MainWindow::setPathToOther();";\r
1207 \r
1208     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
1209     Q_CHECK_PTR(view);\r
1210 \r
1211     FolderView *other = otherSideFolderView(view);\r
1212 \r
1213     other->setPath(view->dir(), true);\r
1214 }\r
1215 \r
1216 void MainWindow::setPathToParent()\r
1217 {\r
1218     qDebug() << "MainWindow::setPathToParent();";\r
1219 \r
1220     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
1221     Q_CHECK_PTR(view);\r
1222 \r
1223     QDir dir(view->dir());\r
1224     if (!dir.isRoot()) {\r
1225         dir.cdUp();\r
1226         view->setPath(dir.absolutePath(), true);\r
1227     }\r
1228 }\r
1229 \r
1230 void MainWindow::setPathToRoot()\r
1231 {\r
1232     qDebug() << "MainWindow::setPathToRoot();";\r
1233 \r
1234     FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
1235     Q_CHECK_PTR(view);\r
1236 \r
1237     view->setPath(QDir::rootPath(), true);\r
1238 }\r
1239 \r
1240 void MainWindow::toggleSearchBox(bool checked)\r
1241 {\r
1242     qDebug() << "MainWindow::toggleSearchBox" << checked;\r
1243 \r
1244     FolderView *view;\r
1245     SearchBox *box;\r
1246 \r
1247     if (checked) {\r
1248         setViewMode(m_viewMode | ModeSearch);\r
1249         view = static_cast<FolderView*>(qApp->focusWidget());\r
1250         Q_CHECK_PTR(view);\r
1251 \r
1252         box = view->parent()->findChild<SearchBox*>("searchBox");\r
1253         Q_CHECK_PTR(box);\r
1254 \r
1255         box->setVisible(true);\r
1256         box->setFocus();\r
1257         box->selectAll();\r
1258     }\r
1259     else {\r
1260         setViewMode(m_viewMode ^ ModeSearch);\r
1261         if (ui->pane1->folderPanel()->searchBox()->isVisible()) {\r
1262             box = ui->pane1->folderPanel()->searchBox();\r
1263             view = ui->pane1->folderPanel()->folderView();\r
1264         }\r
1265         else {\r
1266             Q_ASSERT(ui->pane2->folderPanel()->searchBox()->isVisible());\r
1267             box = ui->pane2->folderPanel()->searchBox();\r
1268             view = ui->pane2->folderPanel()->folderView();\r
1269         }\r
1270 \r
1271         if (box->hasFocus()) {\r
1272             view->setFocus();\r
1273         }\r
1274         box->setVisible(false);\r
1275     }\r
1276 }\r
1277 \r
1278 void MainWindow::showPreferenceDialog()\r
1279 {\r
1280     qDebug() << "MainWindow::showPreferenceDialog";\r
1281 \r
1282     PreferenceDialog dlg(this);\r
1283     if (dlg.exec() == QDialog::Accepted) {\r
1284         ui->pane1->folderPanel()->locationBox()->updateAppearance();\r
1285         ui->pane2->folderPanel()->locationBox()->updateAppearance();\r
1286         ui->pane1->folderPanel()->folderView()->updateAppearance();\r
1287         ui->pane2->folderPanel()->folderView()->updateAppearance();\r
1288         ui->pane1->textView()->updateAppearance();\r
1289         ui->pane2->textView()->updateAppearance();\r
1290         ui->pane3->textView()->updateAppearance();\r
1291 \r
1292         updateActions();\r
1293     }\r
1294 }\r
1295 \r
1296 void MainWindow::toggleShowHiddenFiles(bool checked)\r
1297 {\r
1298     qDebug() << "MainWindow::toggleShowHiddenFiles" << checked;\r
1299 \r
1300     ui->pane1->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);\r
1301     ui->pane1->folderPanel()->folderView()->refresh();\r
1302 \r
1303     ui->pane2->folderPanel()->folderView()->setFilter(QDir::Hidden, checked);\r
1304     ui->pane2->folderPanel()->folderView()->refresh();\r
1305 }\r
1306 \r
1307 void MainWindow::toggleShowSystemFiles(bool checked)\r
1308 {\r
1309     qDebug() << "MainWindow::toggleShowSystemFiles" << checked;\r
1310 \r
1311     ui->pane1->folderPanel()->folderView()->setFilter(QDir::System, checked);\r
1312     ui->pane1->folderPanel()->folderView()->refresh();\r
1313 \r
1314     ui->pane2->folderPanel()->folderView()->setFilter(QDir::System, checked);\r
1315     ui->pane2->folderPanel()->folderView()->refresh();\r
1316 }\r
1317 \r
1318 void MainWindow::showContextMenu(QContextMenuEvent *event)\r
1319 {\r
1320     qDebug() << "MainWindow::showContextMenu();";\r
1321 \r
1322     FolderView *view = static_cast<FolderView*>(sender());\r
1323     Q_CHECK_PTR(view);\r
1324 \r
1325     QModelIndex index = view->indexAt(event->pos());\r
1326 \r
1327     QMenu menu(this);\r
1328     if (index.isValid()) {\r
1329         menu.addAction(ui->action_Open);\r
1330         menu.addAction(ui->action_Exec);\r
1331         menu.addAction(ui->action_OpenEditor);\r
1332         menu.addAction(ui->action_OpenTerminal);\r
1333         menu.addSeparator();\r
1334         menu.addAction(ui->cmd_Copy);\r
1335         menu.addAction(ui->cmd_Move);\r
1336         menu.addSeparator();\r
1337         menu.addAction(ui->cmd_Delete);\r
1338         menu.addSeparator();\r
1339         menu.addAction(ui->copy_Filename);\r
1340         menu.addAction(ui->copy_Fullpath);\r
1341         menu.addSeparator();\r
1342         menu.addAction(ui->cmd_Rename);\r
1343     }\r
1344     else {\r
1345         menu.addAction(ui->move_Back);\r
1346         menu.addAction(ui->move_Forward);\r
1347         menu.addSeparator();\r
1348         menu.addAction(ui->move_Parent);\r
1349         menu.addAction(ui->move_Home);\r
1350         menu.addAction(ui->move_Root);\r
1351         menu.addAction(ui->move_Jump);\r
1352         menu.addSeparator();\r
1353         menu.addAction(ui->cmd_NewFile);\r
1354         menu.addAction(ui->cmd_NewFolder);\r
1355     }\r
1356 \r
1357     menu.exec(event->globalPos());\r
1358 }\r
1359 \r
1360 void MainWindow::checkUpdate(bool silent)\r
1361 {\r
1362     qDebug() << "MainWindow::checkUpdate()" << silent;\r
1363 \r
1364     QNetworkAccessManager *manager = new QNetworkAccessManager(this);\r
1365 \r
1366     if (silent) {\r
1367         connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinishedSilent(QNetworkReply*)));\r
1368     }\r
1369     else {\r
1370         connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkUpdateFinished(QNetworkReply*)));\r
1371     }\r
1372 #ifdef Q_OS_WIN\r
1373     manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_win.html")));\r
1374 #elif defined(Q_OS_MAC)\r
1375     manager->get(QNetworkRequest(QUrl("http://gefu.sourceforge.jp/gefu_latest_mac.html")));\r
1376 #endif\r
1377 }\r
1378 \r
1379 void MainWindow::checkUpdateFinishedSilent(QNetworkReply *reply)\r
1380 {\r
1381     qDebug() << "MainWindow::checkUpdateFinishedSilent";\r
1382 \r
1383     checkUpdateFinished(reply, true);\r
1384 }\r
1385 \r
1386 void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)\r
1387 {\r
1388     qDebug() << "MainWindow::checkUpdateFinished" << silent;\r
1389 \r
1390     if (reply->error() == QNetworkReply::NoError) {\r
1391         QString str = reply->readAll();\r
1392         str = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts).at(0);\r
1393         QRegExp rx("Gefu([0-9]+)");\r
1394         rx.indexIn(str);\r
1395         QString version = rx.cap(1);\r
1396         if (version.toInt() > VERSION_VALUE * 100) {\r
1397             QMessageBox::information(\r
1398                         this, tr("情報"),\r
1399                         tr("最新のバージョンが存在します。<br/>") +\r
1400                         tr("<a href='%1'>こちらからダウンロードしてください。</a>").arg(str));\r
1401         }\r
1402         else if (!silent) {\r
1403             QMessageBox::information(\r
1404                         this, tr("情報"),\r
1405                         tr("お使いのバージョンは最新です。"));\r
1406         }\r
1407     }\r
1408     else if (!silent){\r
1409         QMessageBox::critical(\r
1410                     this, tr("エラー"),\r
1411                     tr("最新バージョンのチェックに失敗しました。<br/>") +\r
1412                     reply->errorString());\r
1413     }\r
1414 }\r
1415 \r
1416 void MainWindow::viewFinish()\r
1417 {\r
1418     qDebug() << "MainWindow::viewFinish();" << sender()->objectName();\r
1419 \r
1420     ui->statusBar->findChild<QLabel*>("Right")->setText("");\r
1421     ui->pane3->setVisible(false);\r
1422     ui->splitter->setVisible(true);\r
1423     m_focusedView->setFocus();\r
1424 }\r
1425 \r
1426 void MainWindow::initActionConnections()\r
1427 {\r
1428     qDebug() << "MainWindow::initActionConnections";\r
1429 \r
1430     connect(ui->key_Left, SIGNAL(triggered()), this, SLOT(leftKeyPress()));\r
1431     connect(ui->key_Right, SIGNAL(triggered()), this, SLOT(rightKeyPress()));\r
1432 \r
1433     connect(ui->action_Command, SIGNAL(triggered()), this, SLOT(executeCommand()));\r
1434     connect(ui->action_Exec, SIGNAL(triggered()), this, SLOT(shellExecute()));\r
1435     connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(open()));\r
1436     connect(ui->action_OpenEditor, SIGNAL(triggered()), this, SLOT(openEditor()));\r
1437     connect(ui->action_OpenTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));\r
1438     connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close()));\r
1439     connect(ui->action_Search, SIGNAL(toggled(bool)), this, SLOT(toggleSearchBox(bool)));\r
1440     connect(ui->action_SearchNext, SIGNAL(triggered()), this, SLOT(searchNext()));\r
1441     connect(ui->action_SearchPrev, SIGNAL(triggered()), this, SLOT(searchPrev()));\r
1442     connect(ui->action_Setting, SIGNAL(triggered()), this, SLOT(showPreferenceDialog()));\r
1443     connect(ui->check_Update, SIGNAL(triggered()), this, SLOT(checkUpdate()));\r
1444     connect(ui->cmd_Copy, SIGNAL(triggered()), this, SLOT(copyItems()));\r
1445     connect(ui->cmd_Delete, SIGNAL(triggered()), this, SLOT(deleteItems()));\r
1446     connect(ui->cmd_Move, SIGNAL(triggered()), this, SLOT(moveItems()));\r
1447     connect(ui->cmd_NewFile, SIGNAL(triggered()), this, SLOT(createFile()));\r
1448     connect(ui->cmd_NewFolder, SIGNAL(triggered()), this, SLOT(createFolder()));\r
1449     connect(ui->cmd_Rename, SIGNAL(triggered()), this, SLOT(renameItems()));\r
1450     connect(ui->copy_Filename, SIGNAL(triggered()), this, SLOT(copyFilenameToClipboard()));\r
1451     connect(ui->copy_Fullpath, SIGNAL(triggered()), this, SLOT(copyFullpathTpClipboard()));\r
1452     connect(ui->help_About, SIGNAL(triggered()), this, SLOT(about()));\r
1453     connect(ui->mark_All, SIGNAL(triggered()), this, SLOT(markAll()));\r
1454     connect(ui->mark_AllFiles, SIGNAL(triggered()), this, SLOT(markAllFiles()));\r
1455     connect(ui->mark_AllOff, SIGNAL(triggered()), this, SLOT(markAllOff()));\r
1456     connect(ui->mark_Invert, SIGNAL(triggered()), this, SLOT(markInvert()));\r
1457     connect(ui->mark_Toggle, SIGNAL(triggered()), this, SLOT(markToggle()));\r
1458     connect(ui->move_Back, SIGNAL(triggered()), this, SLOT(historyBack()));\r
1459     connect(ui->move_Begin, SIGNAL(triggered()), this, SLOT(setCursorToBegin()));\r
1460     connect(ui->move_Down, SIGNAL(triggered()), this, SLOT(cursorDown()));\r
1461     connect(ui->move_End, SIGNAL(triggered()), this, SLOT(setCursorToEnd()));\r
1462     connect(ui->move_Forward, SIGNAL(triggered()), this, SLOT(historyForward()));\r
1463     connect(ui->move_History, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));\r
1464     connect(ui->move_Home, SIGNAL(triggered()), this, SLOT(setPathToHome()));\r
1465     connect(ui->move_Jump, SIGNAL(triggered()), this, SLOT(chooseFolder()));\r
1466     connect(ui->move_Parent, SIGNAL(triggered()), this, SLOT(setPathToParent()));\r
1467     connect(ui->move_Root, SIGNAL(triggered()), this, SLOT(setPathToRoot()));\r
1468     connect(ui->move_Up, SIGNAL(triggered()), this, SLOT(cursorUp()));\r
1469     connect(ui->view_Filter, SIGNAL(triggered()), this, SLOT(showFilterDialog()));\r
1470     connect(ui->view_FontSizeDown, SIGNAL(triggered()), this, SLOT(setFontSizeDown()));\r
1471     connect(ui->view_FontSizeUp, SIGNAL(triggered()), this, SLOT(setFontSizeUp()));\r
1472     connect(ui->view_FromOther, SIGNAL(triggered()), this, SLOT(setPathFromOther()));\r
1473     connect(ui->view_HalfMode, SIGNAL(toggled(bool)), this, SLOT(switchHalfMode(bool)));\r
1474     connect(ui->view_Hidden, SIGNAL(toggled(bool)), this, SLOT(toggleShowHiddenFiles(bool)));\r
1475     connect(ui->view_Refresh, SIGNAL(triggered()), this, SLOT(refresh()));\r
1476     connect(ui->view_Sort, SIGNAL(triggered()), this, SLOT(showSortDialog()));\r
1477     connect(ui->view_Swap, SIGNAL(triggered()), this, SLOT(swapView()));\r
1478     connect(ui->view_System, SIGNAL(toggled(bool)), this, SLOT(toggleShowSystemFiles(bool)));\r
1479     connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(setPathToOther()));\r
1480     connect(ui->bookmark_Edit, SIGNAL(triggered()), this, SLOT(editBookmark()));\r
1481     connect(ui->bookmark_Show, SIGNAL(triggered()), this, SLOT(showBookmarkDialog()));\r
1482 }\r
1483 \r
1484 void MainWindow::replaceVars(QString &str, const QFileInfo info)\r
1485 {\r
1486     qDebug() << "MainWindow::replaceVars" << str;\r
1487 \r
1488     str.replace("$B", info.completeBaseName());\r
1489     str.replace("$E", info.suffix());\r
1490     str.replace("$F", info.fileName());\r
1491     if (info.isDir()) {\r
1492         str.replace("$D", info.absoluteFilePath());\r
1493     }\r
1494     else {\r
1495         str.replace("$D", info.absolutePath());\r
1496     }\r
1497     str.replace("$P", info.absoluteFilePath());\r
1498 }\r
1499 \r
1500 FolderView* MainWindow::otherSideFolderView(const FolderView *view) const\r
1501 {\r
1502     qDebug() << "MainWindow::otherSideFolderView()";\r
1503 \r
1504     if (view == ui->pane1->folderPanel()->folderView()) {\r
1505         return ui->pane2->folderPanel()->folderView();\r
1506     }\r
1507     else {\r
1508         Q_ASSERT(view == ui->pane2->folderPanel()->folderView());\r
1509         return ui->pane1->folderPanel()->folderView();\r
1510     }\r
1511 }\r
1512 \r
1513 void MainWindow::setViewMode(ModeFlags flags)\r
1514 {\r
1515     qDebug() << "MainWindow::setViewMode();" << flags;\r
1516     m_viewMode = flags;\r
1517 }\r
1518 \r
1519 bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)\r
1520 {\r
1521     qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;\r
1522 \r
1523     QProcess process(this);\r
1524     process.setWorkingDirectory(workDir);\r
1525     if (!process.startDetached(cmd)) {\r
1526         QMessageBox::critical(this, tr("エラー"), errMsg + "<br/>" + cmd);\r
1527         return false;\r
1528     }\r
1529     return true;\r
1530 }\r
1531 \r
1532 void MainWindow::updateActions()\r
1533 {\r
1534     qDebug() << "MainWindow::updateActions" << m_viewMode;\r
1535 \r
1536     QWidget *w = qApp->focusWidget();\r
1537     FolderView *view;\r
1538     if ((view = qobject_cast<FolderView*>(w))) {\r
1539         setEnabledAllActions(true);\r
1540         qDebug() << ">>>>> フォルダビューの共通メニュー設定 <<<<<";\r
1541         ui->action_SearchNext->setEnabled(false);\r
1542         ui->action_SearchPrev->setEnabled(false);\r
1543 \r
1544         // 「開く」アクションを変更する\r
1545         QFileInfo info(view->currentItem());\r
1546         if (info.isDir()) {\r
1547             ui->action_Open->setIcon(QIcon(":/images/Open.png"));\r
1548             ui->action_Open->setText(tr("開く"));\r
1549             ui->action_Open->setToolTip(tr("開く"));\r
1550         }\r
1551         else {\r
1552             ui->action_Open->setIcon(QIcon(":/images/Search text.png"));\r
1553             ui->action_Open->setText(tr("内蔵ビューアで開く"));\r
1554             ui->action_Open->setToolTip(tr("内蔵ビューアで開く"));\r
1555 \r
1556             QSettings settings;\r
1557             if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
1558                 QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
1559                 foreach (const QString &ext, list) {\r
1560                     if (ext.toLower() == info.suffix().toLower()) {\r
1561                         ui->action_Open->setEnabled(false);\r
1562                         break;\r
1563                     }\r
1564                 }\r
1565             }\r
1566         }\r
1567 \r
1568         if (info.fileName() == "..") {\r
1569             // ファイル操作を抑止\r
1570             ui->cmd_Copy->setEnabled(false);\r
1571             ui->cmd_Delete->setEnabled(false);\r
1572             ui->cmd_Move->setEnabled(false);\r
1573             ui->cmd_Rename->setEnabled(false);\r
1574         }\r
1575 \r
1576         if (m_viewMode & ModeBasic) {\r
1577             qDebug() << ">>>>> 通常モードのメニュー設定 <<<<<";\r
1578             ui->action_SearchNext->setEnabled(false);\r
1579             ui->action_SearchPrev->setEnabled(false);\r
1580 \r
1581             ui->move_Back->setEnabled(!view->history()->isBegin());\r
1582             ui->move_Forward->setEnabled(!view->history()->isEnd());\r
1583 \r
1584             QSettings settings;\r
1585             ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
1586             ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
1587 \r
1588         }\r
1589         else if (!otherSideFolderView(view)->isVisible()) {\r
1590             qDebug() << ">>>>> ハーフモードのメニュー設定 <<<<<";\r
1591             ui->view_FromOther->setEnabled(false);\r
1592             ui->view_ToOther->setEnabled(false);\r
1593             ui->cmd_Copy->setEnabled(false);\r
1594             ui->cmd_Move->setEnabled(false);\r
1595         }\r
1596     }\r
1597     else if (qobject_cast<SearchBox*>(w)) {\r
1598         qDebug() << ">>>>> 検索モードのメニュー設定 <<<<<";\r
1599         setEnabledAllActions(false);\r
1600         ui->action_Search->setEnabled(true);\r
1601         ui->action_SearchNext->setEnabled(true);\r
1602         ui->action_SearchPrev->setEnabled(true);\r
1603         ui->help_About->setEnabled(true);\r
1604     }\r
1605     else if (qobject_cast<SimpleImageView*>(w) ||\r
1606              qobject_cast<SimpleTextView*>(w))\r
1607     {\r
1608         qDebug() << ">>>>> ビューアモードのメニュー設定 <<<<<";\r
1609         setEnabledAllActions(false);\r
1610         ui->action_Quit->setEnabled(true);\r
1611         ui->action_Setting->setEnabled(true);\r
1612         ui->check_Update->setEnabled(true);\r
1613         ui->view_FontSizeDown->setEnabled(true);\r
1614         ui->view_FontSizeUp->setEnabled(true);\r
1615         ui->move_Begin->setEnabled(true);\r
1616         ui->move_Down->setEnabled(true);\r
1617         ui->move_End->setEnabled(true);\r
1618         ui->move_Up->setEnabled(true);\r
1619         ui->help_About->setEnabled(true);\r
1620         ui->key_Left->setEnabled(true);\r
1621         ui->key_Right->setEnabled(true);\r
1622         if (m_viewMode & ModeHalfView) {\r
1623             ui->view_HalfMode->setEnabled(true);\r
1624         }\r
1625     }\r
1626 }\r
1627 \r
1628 void MainWindow::setEnabledAllActions(bool enable)\r
1629 {\r
1630     qDebug() << "MainWindow::setEnabledAllActions();" << enable;\r
1631     foreach (QObject *obj, children()) {\r
1632         QAction *action = qobject_cast<QAction*>(obj);\r
1633         if (action) {\r
1634             action->setEnabled(enable);\r
1635         }\r
1636     }\r
1637 }\r
1638 \r
1639 void MainWindow::about()\r
1640 {\r
1641     qDebug() << ">>>>> about <<<<<";\r
1642 \r
1643     QMessageBox::about(\r
1644                 this,\r
1645                 tr("げふぅ について"),\r
1646                 tr("<h3>Gefu Ver%1</h3>").arg(VERSION_VALUE) +\r
1647                 tr("<center>Gefu is an Experimental File Utility.<br/>"\r
1648                    "<small>(げふぅは実験的なファイルユーティリティです)</small></center>"\r
1649                    "<p>最新版の情報は<a href='https://sourceforge.jp/projects/gefu/'>プロジェクトサイト</a>で公開しています。</p>"\r
1650                    "<p><small>Copyright 2014 @miyabi_satoh All rights reserved.</small></p>"));\r
1651 }\r
1652 \r
1653 void MainWindow::closeEvent(QCloseEvent *event)\r
1654 {\r
1655     qDebug() << "MainWindow::closeEvent();";\r
1656     qDebug() << ">>>>> アプリケーションの終了要求 <<<<<";\r
1657     QSettings settings;\r
1658 \r
1659     if (settings.value(IniKey_ConfirmExit).toBool()) {\r
1660         QMessageBox msgBox;\r
1661         QCheckBox *checkBox = new QCheckBox();\r
1662         checkBox->setText(tr("次回以降は確認しない"));\r
1663         msgBox.setCheckBox(checkBox);\r
1664         msgBox.setText(tr("終了しますか?"));\r
1665         msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
1666         msgBox.setIcon(QMessageBox::Question);\r
1667 \r
1668         if (msgBox.exec() == QMessageBox::No) {\r
1669             qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";\r
1670             event->ignore();\r
1671             return;\r
1672         }\r
1673         settings.setValue(IniKey_ConfirmExit, !checkBox->isChecked());\r
1674     }\r
1675 \r
1676     settings.setValue(QString("Left/") + IniKey_Dir, ui->pane1->folderPanel()->folderView()->dir());\r
1677     settings.setValue(QString("Right/") + IniKey_Dir, ui->pane2->folderPanel()->folderView()->dir());\r
1678     settings.setValue(IniKey_ShowHidden, ui->view_Hidden->isChecked());\r
1679     settings.setValue(IniKey_ShowSystem, ui->view_System->isChecked());\r
1680     settings.setValue(IniKey_WindowGeometry, saveGeometry());\r
1681     settings.setValue(iniKey_WindowState, saveState());\r
1682     QMainWindow::closeEvent(event);\r
1683 }\r
1684 \r
1685 \r
1686 void MainWindow::keyPressEvent(QKeyEvent *event)\r
1687 {\r
1688     QString ksq = KeyEventToSequence(event);\r
1689 \r
1690     qDebug() << ">>>>> キーイベントを受信(MainWindow)" << ksq << "<<<<<";\r
1691 \r
1692     if (ProcessShortcut(ksq, this)) {\r
1693         event->accept();\r
1694         return;\r
1695     }\r
1696 \r
1697     QMainWindow::keyPressEvent(event);\r
1698 }\r