OSDN Git Service

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