OSDN Git Service

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