OSDN Git Service

レイアウト修正。
[gefu/Gefu.git] / filetableview.cpp
1 #include "common.h"\r
2 #include "copymoveworker.h"\r
3 #include "deleteworker.h"\r
4 #include "filetablemodel.h"\r
5 #include "filetableview.h"\r
6 #include "historydialog.h"\r
7 #include "mainwindow.h"\r
8 #include "operationdialog.h"\r
9 #include "overwritedialog.h"\r
10 #include "renamemultidialog.h"\r
11 #include "renamesingledialog.h"\r
12 #include "renameworker.h"\r
13 #include "sortdialog.h"\r
14 \r
15 #include <QDebug>\r
16 #include <QDesktopServices>\r
17 #include <QInputDialog>\r
18 #include <QMessageBox>\r
19 #include <QProcess>\r
20 #include <QUrl>\r
21 #include <QAction>\r
22 #include <QSettings>\r
23 #include <QFileDialog>\r
24 #include <QKeyEvent>\r
25 #include <QStatusBar>\r
26 \r
27 #define CHECK_FOCUS {                   \\r
28         if (!hasFocus()) { return; }    \\r
29     }\r
30 \r
31 #define MENU_TRRIGGERED(x) \\r
32     getMainWnd()->findChild<QAction*>(#x), SIGNAL(triggered())\r
33 #define MENU_TOGGLED(x) \\r
34     getMainWnd()->findChild<QAction*>(#x), SIGNAL(toggled(bool))\r
35 \r
36 FileTableView::FileTableView(QWidget *parent) :\r
37     QTableView(parent),\r
38     m_side(),\r
39     m_history()\r
40 {\r
41     // シグナル/スロットを設定する\r
42     connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));\r
43     connect(MENU_TRRIGGERED(action_Exec), this, SLOT(openUrl()));\r
44     connect(MENU_TRRIGGERED(action_OpenEditor), this, SLOT(XXX()));\r
45     connect(MENU_TRRIGGERED(action_Command), this, SLOT(kickProcess()));\r
46 \r
47     connect(MENU_TRRIGGERED(mark_Toggle), this, SLOT(toggleChecked()));\r
48     connect(MENU_TRRIGGERED(mark_All), this, SLOT(checkAllItems()));\r
49     connect(MENU_TRRIGGERED(mark_AllFiles), this, SLOT(checkAllFiles()));\r
50     connect(MENU_TRRIGGERED(mark_AllOff), this, SLOT(uncheckAllItems()));\r
51     connect(MENU_TRRIGGERED(mark_Invert), this, SLOT(invertAllChecked()));\r
52 \r
53     connect(MENU_TRRIGGERED(view_FromOther), this, SLOT(setPathFromOther()));\r
54     connect(MENU_TRRIGGERED(view_ToOther), this, SLOT(setPathToOther()));\r
55     connect(MENU_TRRIGGERED(view_Swap), this, SLOT(swapPath()));\r
56     connect(MENU_TRRIGGERED(view_Sort), this, SLOT(setSort()));\r
57 \r
58     connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));\r
59     connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));\r
60     connect(MENU_TRRIGGERED(move_History), this, SLOT(showHidtory()));\r
61     connect(MENU_TRRIGGERED(move_Home), this, SLOT(jumpToHome()));\r
62     connect(MENU_TRRIGGERED(move_Parent), this, SLOT(jumpToParent()));\r
63     connect(MENU_TRRIGGERED(move_Root), this, SLOT(jumpToRoot()));\r
64     connect(MENU_TRRIGGERED(move_Jump), this, SLOT(jumpTo()));\r
65     connect(MENU_TRRIGGERED(move_Down), this, SLOT(cursorDown()));\r
66     connect(MENU_TRRIGGERED(move_Up), this, SLOT(cursorUp()));\r
67     connect(MENU_TRRIGGERED(move_Begin), this, SLOT(cursorToBegin()));\r
68     connect(MENU_TRRIGGERED(move_End), this, SLOT(cursorToEnd()));\r
69 \r
70     connect(MENU_TRRIGGERED(cmd_Copy), this, SLOT(cmdCopy()));\r
71     connect(MENU_TRRIGGERED(cmd_Move), this, SLOT(cmdMove()));\r
72     connect(MENU_TRRIGGERED(cmd_Delete), this, SLOT(cmdDelete()));\r
73     connect(MENU_TRRIGGERED(cmd_Rename), this, SLOT(cmdRename()));\r
74     connect(MENU_TRRIGGERED(cmd_NewFile), this, SLOT(newFile()));\r
75     connect(MENU_TRRIGGERED(cmd_NewFolder), this, SLOT(newFolder()));\r
76 \r
77     connect(getMainWnd(), SIGNAL(showHiddenFiles(bool)),\r
78             this, SLOT(showHiddenFiles(bool)));\r
79     connect(getMainWnd(), SIGNAL(showSystemFiles(bool)),\r
80             this, SLOT(showSystemFiles(bool)));\r
81 \r
82     connect(this, SIGNAL(doubleClicked(QModelIndex)),\r
83             this, SLOT(setRootIndex(QModelIndex)));\r
84 }\r
85 \r
86 FileTableView::~FileTableView()\r
87 {\r
88     QSettings settings;\r
89     FileTableModel *m = static_cast<FileTableModel*>(model());\r
90 \r
91     settings.setValue(side() + slash + IniKey_Dir, m->absolutePath());\r
92 }\r
93 \r
94 QString FileTableView::side() const\r
95 {\r
96     return m_side;\r
97 }\r
98 \r
99 void FileTableView::setSide(const QString &side)\r
100 {\r
101     m_side = side;\r
102 \r
103     // コンストラクタではステータスバーが生成されていないため\r
104     // このタイミングでconnectする\r
105     connect(this, SIGNAL(indexChanged(QString)),\r
106             getMainWnd()->statusBar(), SLOT(showMessage(QString)));\r
107 }\r
108 \r
109 void FileTableView::setRootPath(const QString &path, bool addHistory)\r
110 {\r
111     FileTableModel *m = static_cast<FileTableModel*>(model());\r
112     QFileInfo info(path);\r
113     if (info.isDir()) {\r
114         setUpdatesEnabled(false);\r
115         m->setPath(info.absoluteFilePath());\r
116         setUpdatesEnabled(true);\r
117 \r
118         if (addHistory) {\r
119             m_history.add(info.absoluteFilePath());\r
120         }\r
121         updateMenu();\r
122 \r
123         setCurrentIndex(m->index(0, 0));\r
124     }\r
125 }\r
126 \r
127 QFileInfoList FileTableView::selectedItems() const\r
128 {\r
129     FileTableModel *m = static_cast<FileTableModel*>(model());\r
130     QFileInfoList list = m->checkedItems();\r
131     if (list.isEmpty()) {\r
132         QFileInfo info = m->fileInfo(currentIndex());\r
133         if (info.fileName() != "..") {\r
134             list.append(info);\r
135         }\r
136     }\r
137 \r
138     return list;\r
139 }\r
140 \r
141 void FileTableView::updateMenu()\r
142 {\r
143     if (m_history.isEmpty()) {\r
144         getMainWnd()->findChild<QAction*>("move_Back")->setEnabled(false);\r
145         getMainWnd()->findChild<QAction*>("move_Forward")->setEnabled(false);\r
146 \r
147     }\r
148     else {\r
149         getMainWnd()->findChild<QAction*>("move_Back")\r
150                 ->setEnabled(!m_history.isBegin());\r
151         getMainWnd()->findChild<QAction*>("move_Forward")\r
152                 ->setEnabled(!m_history.isEnd());\r
153     }\r
154 }\r
155 \r
156 void FileTableView::setPath()\r
157 {\r
158     CHECK_FOCUS;\r
159 \r
160     setRootIndex(currentIndex());\r
161 }\r
162 \r
163 void FileTableView::openUrl()\r
164 {\r
165     CHECK_FOCUS;\r
166 \r
167     QFileInfoList list = selectedItems();\r
168     foreach (const QFileInfo &info, list) {\r
169         QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
170         QDesktopServices::openUrl(QUrl("file:///" + path));\r
171     }\r
172 }\r
173 \r
174 void FileTableView::kickProcess()\r
175 {\r
176     CHECK_FOCUS;\r
177 \r
178     QFileInfoList list = selectedItems();\r
179     QString command = QString::null;\r
180     foreach (const QFileInfo &info, list) {\r
181         if (info.isExecutable()) {\r
182             command = QQ(info.fileName()) + " " + command;\r
183         }\r
184         else {\r
185             command += " " + QQ(info.fileName());\r
186         }\r
187     }\r
188 \r
189     QInputDialog dlg(this);\r
190     dlg.setInputMode(QInputDialog::TextInput);\r
191     dlg.setWindowTitle(tr("コマンドを実行"));\r
192     dlg.setLabelText(tr("コマンド:"));\r
193     dlg.setTextValue(command);\r
194 \r
195     QSize szMainWnd = getMainWnd()->size();\r
196     QSize szDialog = dlg.size();\r
197     szDialog.setWidth(szMainWnd.width() * 0.8);\r
198     dlg.resize(szDialog);\r
199 \r
200     int ret = dlg.exec();\r
201     command = dlg.textValue();\r
202     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
203         FileTableModel *m = static_cast<FileTableModel*>(model());\r
204         QProcess process(this);\r
205         process.setWorkingDirectory(m->absolutePath());\r
206         if (!process.startDetached(command)) {\r
207             QMessageBox::critical(\r
208                         this, tr("エラー"),\r
209                         tr("コマンドの実行に失敗しました。<br/>") + command);\r
210         }\r
211     }\r
212 }\r
213 \r
214 void FileTableView::toggleChecked()\r
215 {\r
216     CHECK_FOCUS;\r
217 \r
218     FileTableModel *m = static_cast<FileTableModel*>(model());\r
219 \r
220     QModelIndex index = currentIndex();\r
221 \r
222     QFileInfo info = m->fileInfo(index);\r
223     if (info.fileName() != "..") {\r
224         if (m->checkState(index) == Qt::Checked) {\r
225             m->setCheckState(index, Qt::Unchecked);\r
226         }\r
227         else {\r
228             m->setCheckState(index, Qt::Checked);\r
229         }\r
230     }\r
231     // 最終行でなければ、次のアイテムに移動する\r
232     if (index.row() == m->rowCount() - 1) {\r
233         setCurrentIndex(index);\r
234     }\r
235     else if (index.row() < m->rowCount() - 1) {\r
236         qDebug() << "set = " << index.row() + 1;\r
237         setCurrentIndex(m->index(index.row() + 1, 1));\r
238     }\r
239 }\r
240 \r
241 void FileTableView::checkAllItems()\r
242 {\r
243     CHECK_FOCUS;\r
244 \r
245     QModelIndex index = currentIndex();\r
246     FileTableModel *m = static_cast<FileTableModel*>(model());\r
247     setUpdatesEnabled(false);\r
248     m->setCheckStateAll(Qt::Checked);\r
249     setUpdatesEnabled(true);\r
250     setCurrentIndex(index);\r
251 }\r
252 \r
253 void FileTableView::checkAllFiles()\r
254 {\r
255     CHECK_FOCUS;\r
256 \r
257     QModelIndex index = currentIndex();\r
258     FileTableModel *m = static_cast<FileTableModel*>(model());\r
259     setUpdatesEnabled(false);\r
260     for (int n = 0; n < m->rowCount(); n++) {\r
261         QModelIndex index = m->index(n, 0);\r
262         QFileInfo info = m->fileInfo(index);\r
263         if (info.isDir()) {\r
264             m->setCheckState(index, Qt::Unchecked);\r
265         }\r
266         else {\r
267             m->setCheckState(index, Qt::Checked);\r
268         }\r
269         update(index);\r
270     }\r
271     setUpdatesEnabled(true);\r
272     setCurrentIndex(index);\r
273 }\r
274 \r
275 void FileTableView::uncheckAllItems()\r
276 {\r
277     CHECK_FOCUS;\r
278 \r
279     QModelIndex index = currentIndex();\r
280     FileTableModel *m = static_cast<FileTableModel*>(model());\r
281     setUpdatesEnabled(false);\r
282     m->setCheckStateAll(Qt::Unchecked);\r
283     setUpdatesEnabled(true);\r
284     setCurrentIndex(index);\r
285 }\r
286 \r
287 void FileTableView::invertAllChecked()\r
288 {\r
289     CHECK_FOCUS;\r
290 \r
291     QModelIndex index = currentIndex();\r
292     FileTableModel *m = static_cast<FileTableModel*>(model());\r
293     setUpdatesEnabled(false);\r
294     for (int n = 0; n < m->rowCount(); n++) {\r
295         QModelIndex index = m->index(n, 0);\r
296         if (m->checkState(index) == Qt::Checked) {\r
297             m->setCheckState(index, Qt::Unchecked);\r
298         }\r
299         else {\r
300             m->setCheckState(index, Qt::Checked);\r
301         }\r
302         update(index);\r
303     }\r
304     setUpdatesEnabled(true);\r
305     setCurrentIndex(index);\r
306 }\r
307 \r
308 void FileTableView::setPathFromOther()\r
309 {\r
310     CHECK_FOCUS;\r
311 \r
312     FileTableView *other = getMainWnd()->otherSideView(this);\r
313     if (other == NULL) {\r
314         return;\r
315     }\r
316 \r
317     FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
318 \r
319     setRootPath(mOther->absolutePath(), true);\r
320 }\r
321 \r
322 void FileTableView::setPathToOther()\r
323 {\r
324     CHECK_FOCUS;\r
325 \r
326     FileTableView *other = getMainWnd()->otherSideView(this);\r
327     if (other == NULL) {\r
328         return;\r
329     }\r
330 \r
331     FileTableModel *m = static_cast<FileTableModel*>(model());\r
332 \r
333     other->setRootPath(m->absolutePath(), true);\r
334 }\r
335 \r
336 void FileTableView::swapPath()\r
337 {\r
338     CHECK_FOCUS;\r
339 \r
340     FileTableView *other = getMainWnd()->otherSideView(this);\r
341     if (other == NULL) {\r
342         return;\r
343     }\r
344 \r
345     FileTableModel *m = static_cast<FileTableModel*>(model());\r
346     FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
347 \r
348     QString path = m->absolutePath();\r
349     QString pathOther = mOther->absolutePath();\r
350 \r
351     setRootPath(pathOther, true);\r
352     other->setRootPath(path, true);\r
353 }\r
354 \r
355 void FileTableView::showHiddenFiles(bool show)\r
356 {\r
357     FileTableModel *m = static_cast<FileTableModel*>(model());\r
358     if (show) {\r
359         m->setFilter(m->filter() | QDir::Hidden);\r
360     }\r
361     else {\r
362         m->setFilter(m->filter() ^ QDir::Hidden);\r
363     }\r
364 \r
365     setUpdatesEnabled(false);\r
366     m->refresh();\r
367     setUpdatesEnabled(true);\r
368 }\r
369 \r
370 void FileTableView::showSystemFiles(bool show)\r
371 {\r
372     FileTableModel *m = static_cast<FileTableModel*>(model());\r
373     if (show) {\r
374         m->setFilter(m->filter() | QDir::System);\r
375     }\r
376     else {\r
377         m->setFilter(m->filter() ^ QDir::System);\r
378     }\r
379 \r
380     setUpdatesEnabled(false);\r
381     m->refresh();\r
382     setUpdatesEnabled(true);\r
383 }\r
384 \r
385 void FileTableView::setSort()\r
386 {\r
387     CHECK_FOCUS;\r
388 \r
389     SortDialog dlg(this);\r
390     dlg.setRightOrLeft(side());\r
391     if (dlg.exec() == QDialog::Accepted) {\r
392         QSettings settings;\r
393         FileTableModel *m = static_cast<FileTableModel*>(model());\r
394         m->setSorting(QDir::Name);  // 0\r
395 \r
396         int sortBy = settings.value(side() + slash + IniKey_SortBy, 0).toInt();\r
397         switch (sortBy) {\r
398         case SortByDate:    m->setSorting(m->sorting() | QDir::Time); break;\r
399         case SortBySize:    m->setSorting(m->sorting() | QDir::Size); break;\r
400         case SortByType:    m->setSorting(m->sorting() | QDir::Type); break;\r
401         default:            m->setSorting(m->sorting() | QDir::Name); break;\r
402         }\r
403 \r
404         // デフォルトだと文字列は昇順で、数値は降順…orz\r
405         int orderBy = settings.value(side() + slash + IniKey_OrderBy, 0).toInt();\r
406         if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
407             ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
408         {\r
409             m->setSorting(m->sorting() | QDir::Reversed);\r
410         }\r
411 \r
412         switch (settings.value(side() + slash + IniKey_PutDirs, 0).toInt()) {\r
413         case PutDirsFirst:  m->setSorting(m->sorting() | QDir::DirsFirst); break;\r
414         case PutDirsLast:   m->setSorting(m->sorting() | QDir::DirsLast); break;\r
415         }\r
416 \r
417         if (settings.value(side() + slash + IniKey_IgnoreCase, true).toBool()) {\r
418             m->setSorting(m->sorting() | QDir::IgnoreCase);\r
419         }\r
420 \r
421         setUpdatesEnabled(false);\r
422         m->refresh();\r
423         setUpdatesEnabled(true);\r
424     }\r
425 }\r
426 \r
427 void FileTableView::back()\r
428 {\r
429     CHECK_FOCUS;\r
430 \r
431     if (!m_history.isBegin()) {\r
432         const QString &path = m_history.back();\r
433         setRootPath(path, false);\r
434 \r
435         updateMenu();\r
436     }\r
437 }\r
438 \r
439 void FileTableView::forward()\r
440 {\r
441     CHECK_FOCUS;\r
442 \r
443     if (!m_history.isEnd()) {\r
444         const QString &path = m_history.forward();\r
445         setRootPath(path, false);\r
446 \r
447         updateMenu();\r
448     }\r
449 }\r
450 \r
451 void FileTableView::showHidtory()\r
452 {\r
453     CHECK_FOCUS;\r
454 \r
455     FileTableView *other = getMainWnd()->otherSideView(this);\r
456 \r
457     HistoryDialog dlg(this);\r
458     if (side() == "Left") {\r
459         dlg.setDefaultLeft(true);\r
460         dlg.setHistory(&m_history, other->history());\r
461     }\r
462     else {\r
463         dlg.setDefaultLeft(false);\r
464         dlg.setHistory(other->history(), &m_history);\r
465     }\r
466 \r
467     QSize szMainWnd = getMainWnd()->size();\r
468     QSize szDialog = dlg.size();\r
469     szDialog.setWidth(szMainWnd.width() * 0.8);\r
470     dlg.resize(szDialog);\r
471     if (dlg.exec() == QDialog::Accepted) {\r
472         if (side() == dlg.selectedSide()) {\r
473             m_history.setAt(dlg.selectedIndex());\r
474             setRootPath(m_history.current(), false);\r
475         }\r
476         else {\r
477             setRootPath(other->history()->at(dlg.selectedIndex()), true);\r
478         }\r
479         updateMenu();\r
480         qDebug() << dlg.selectedIndex();\r
481     }\r
482 }\r
483 \r
484 void FileTableView::jumpToHome()\r
485 {\r
486     CHECK_FOCUS;\r
487 \r
488     setRootPath(QDir::homePath(), true);\r
489 }\r
490 \r
491 void FileTableView::jumpToParent()\r
492 {\r
493     CHECK_FOCUS;\r
494 \r
495     FileTableModel *m = static_cast<FileTableModel*>(model());\r
496     QDir dir(m->absolutePath());\r
497     dir.cdUp();\r
498 \r
499     setRootPath(dir.absolutePath(), true);\r
500 }\r
501 \r
502 void FileTableView::jumpToRoot()\r
503 {\r
504     CHECK_FOCUS;\r
505 \r
506     setRootPath(QDir::rootPath(), true);\r
507 }\r
508 \r
509 void FileTableView::jumpTo()\r
510 {\r
511     CHECK_FOCUS;\r
512 \r
513     FileTableModel *m = static_cast<FileTableModel*>(model());\r
514     QString path = QFileDialog::getExistingDirectory(\r
515                 this, tr("フォルダを選択"), m->absolutePath());\r
516     if (!path.isEmpty()) {\r
517         setRootPath(path, true);\r
518     }\r
519 }\r
520 \r
521 void FileTableView::cursorDown()\r
522 {\r
523     CHECK_FOCUS;\r
524 \r
525     int row = currentIndex().row();\r
526     if (row < model()->rowCount() - 1) {\r
527         setCurrentIndex(model()->index(row + 1, 1));\r
528     }\r
529 }\r
530 \r
531 void FileTableView::cursorUp()\r
532 {\r
533     CHECK_FOCUS;\r
534 \r
535     int row = currentIndex().row();\r
536     if (row > 0) {\r
537         setCurrentIndex(model()->index(row - 1, 1));\r
538     }\r
539 }\r
540 \r
541 void FileTableView::cursorToBegin()\r
542 {\r
543     CHECK_FOCUS;\r
544 \r
545     setCurrentIndex(model()->index(0, 1));\r
546 }\r
547 \r
548 void FileTableView::cursorToEnd()\r
549 {\r
550     CHECK_FOCUS;\r
551 \r
552     setCurrentIndex(model()->index(model()->rowCount() - 1, 1));\r
553 }\r
554 \r
555 void FileTableView::cmdCopy()\r
556 {\r
557     CHECK_FOCUS;\r
558 \r
559     QFileInfoList list = selectedItems();\r
560     if (list.isEmpty()) {\r
561         return;\r
562     }\r
563 \r
564     FileTableView *other = getMainWnd()->otherSideView(this);\r
565     FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
566     CopyMoveWorker *worker = new CopyMoveWorker();\r
567     connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
568             this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
569     worker->setCopyList(&list);\r
570     worker->setTargetDir(mOther->absolutePath());\r
571     worker->setMoveMode(false);\r
572 \r
573     OperationDialog opDlg(this);\r
574     opDlg.setWindowTitle(tr("コピー"));\r
575     opDlg.setWorker(worker);\r
576 \r
577     opDlg.exec();\r
578 }\r
579 \r
580 void FileTableView::cmdMove()\r
581 {\r
582     CHECK_FOCUS;\r
583 \r
584     QFileInfoList list = selectedItems();\r
585     if (list.isEmpty()) {\r
586         return;\r
587     }\r
588 \r
589     FileTableView *other = getMainWnd()->otherSideView(this);\r
590     FileTableModel *mOther = static_cast<FileTableModel*>(other->model());\r
591     CopyMoveWorker *worker = new CopyMoveWorker();\r
592     connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),\r
593             this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));\r
594     worker->setCopyList(&list);\r
595     worker->setTargetDir(mOther->absolutePath());\r
596     worker->setMoveMode(true);\r
597 \r
598     OperationDialog opDlg(this);\r
599     opDlg.setWindowTitle(tr("移動"));\r
600     opDlg.setWorker(worker);\r
601 \r
602     opDlg.exec();\r
603 }\r
604 \r
605 void FileTableView::cmdDelete()\r
606 {\r
607     CHECK_FOCUS;\r
608 \r
609     QFileInfoList list = selectedItems();\r
610     if (list.isEmpty()) {\r
611         return;\r
612     }\r
613 \r
614     QString msg;\r
615     if (list.size() == 1) {\r
616         msg = list[0].fileName();\r
617     }\r
618     else {\r
619         msg = tr("%1個のアイテム").arg(list.size());\r
620     }\r
621     int ret = QMessageBox::question(\r
622                 this, tr("確認"),\r
623                 msg + tr("を削除します<br/>よろしいですか?"));\r
624     if (ret == QMessageBox::Yes) {\r
625         DeleteWorker *worker = new DeleteWorker();\r
626         worker->setDeleteList(&list);\r
627 \r
628         OperationDialog opDlg(this);\r
629         opDlg.setWindowTitle(tr("削除"));\r
630         opDlg.setWorker(worker);\r
631         opDlg.exec();\r
632     }\r
633 }\r
634 \r
635 void FileTableView::cmdRename()\r
636 {\r
637     CHECK_FOCUS;\r
638 \r
639     QFileInfoList list = selectedItems();\r
640     if (list.isEmpty()) {\r
641         return;\r
642     }\r
643 \r
644     IRenameDialog *dlg;\r
645     if (list.size() == 1) {\r
646         dlg = new RenameSingleDialog(this);\r
647     }\r
648     else {\r
649         dlg = new RenameMultiDialog(this);\r
650     }\r
651     FileTableModel *m = static_cast<FileTableModel*>(model());\r
652     dlg->setWorkingDirectory(m->absolutePath());\r
653     dlg->setNames(list);\r
654     int dlgResult = dlg->exec();\r
655     if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {\r
656         RenameWorker *worker = new RenameWorker();\r
657         worker->setRenameMap(&dlg->renameMap());\r
658 \r
659         OperationDialog opDlg(this);\r
660         opDlg.setWindowTitle(tr("名前を変更"));\r
661         opDlg.setWorker(worker);\r
662         opDlg.exec();\r
663     }\r
664 }\r
665 \r
666 void FileTableView::newFile()\r
667 {\r
668     CHECK_FOCUS;\r
669 \r
670     bool bOk;\r
671     QString name = QInputDialog::getText(\r
672                 this, tr("ファイルを作成"), tr("ファイル名:"),\r
673                 QLineEdit::Normal, "", &bOk);\r
674     if (bOk && !name.isEmpty()) {\r
675         FileTableModel *m = static_cast<FileTableModel*>(model());\r
676         QDir dir(m->absolutePath());\r
677         QFile file(dir.absoluteFilePath(name));\r
678         if (!file.open(QIODevice::WriteOnly)) {\r
679             QMessageBox::critical(\r
680                         this, tr("エラー"),\r
681                         tr("ファイルの作成に失敗しました。"));\r
682         }\r
683         else {\r
684             file.close();\r
685         }\r
686     }\r
687 }\r
688 \r
689 void FileTableView::newFolder()\r
690 {\r
691     CHECK_FOCUS;\r
692 \r
693     bool bOk;\r
694     QString name = QInputDialog::getText(\r
695                 this, tr("フォルダを作成"), tr("フォルダ名:"),\r
696                 QLineEdit::Normal, "", &bOk);\r
697     if (bOk && !name.isEmpty()) {\r
698         FileTableModel *m = static_cast<FileTableModel*>(model());\r
699         QDir dir(m->absolutePath());\r
700         if (!dir.mkpath(name)) {\r
701             QMessageBox::critical(\r
702                         this, tr("エラー"),\r
703                         tr("フォルダの作成に失敗しました。"));\r
704         }\r
705     }\r
706 }\r
707 \r
708 void FileTableView::XXX()\r
709 {\r
710     CHECK_FOCUS;\r
711 \r
712     qDebug() << sender()->objectName() << "に対するスロットは未実装です。";\r
713 }\r
714 \r
715 void FileTableView::askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,\r
716                                  QString *alias, const QString &srcPath,\r
717                                  const QString &tgtPath)\r
718  {\r
719      OverWriteDialog dlg;\r
720      dlg.setCopyMethod(*prevCopyMethod);\r
721      dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);\r
722      dlg.setFileInfo(srcPath, tgtPath);\r
723      if (dlg.exec() == QDialog::Rejected) {\r
724          *bOk = false;\r
725      }\r
726      else {\r
727          *prevCopyMethod = dlg.copyMethod();\r
728          if (dlg.isSameMethodChecked()) {\r
729              *copyMethod = *prevCopyMethod;\r
730          }\r
731          *alias = dlg.alias();\r
732          *bOk = true;\r
733      }\r
734      CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());\r
735      worker->endAsking();\r
736  }\r
737 \r
738 void FileTableView::setRootIndex(const QModelIndex &index)\r
739 {\r
740     if (!index.isValid()) {\r
741         return;\r
742     }\r
743 \r
744     FileTableModel *m = static_cast<FileTableModel*>(model());\r
745 \r
746     if (m->isDir(index)) {\r
747         setRootPath(m->absoluteFilePath(index), true);\r
748     }\r
749 }\r
750 \r
751 void FileTableView::keyPressEvent(QKeyEvent *event)\r
752 {\r
753     // Macでアクションが処理されないケースがあるため、\r
754     // キーイベントを拾ってアクションシグナルを起動する\r
755     QString modifier = QString::null;\r
756     if (event->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }\r
757     if (event->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }\r
758     if (event->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }\r
759     if (event->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }\r
760 \r
761     QString key = QKeySequence(event->key()).toString();\r
762     QString ksq = QKeySequence(modifier + key).toString();\r
763 \r
764     if (!ksq.isEmpty()) {\r
765         foreach (QObject *obj, getMainWnd()->children()) {\r
766             QAction *action = qobject_cast<QAction*>(obj);\r
767             if (action) {\r
768                 foreach (const QKeySequence &keySeq, action->shortcuts()) {\r
769                     if (ksq == keySeq.toString()) {\r
770                         qDebug() << "emit " << ksq << " " << action->objectName();\r
771                         emit action->triggered();\r
772                         event->accept();\r
773                         return;\r
774                     }\r
775                 }\r
776             }\r
777         }\r
778     }\r
779 \r
780     if (!ksq.isEmpty()) {\r
781         qDebug() << ksq;\r
782     }\r
783     QTableView::keyPressEvent(event);\r
784 }\r
785 \r
786 void FileTableView::focusInEvent(QFocusEvent *event)\r
787 {\r
788     updateMenu();\r
789 \r
790     QTableView::focusInEvent(event);\r
791 }\r
792 \r
793 void FileTableView::currentChanged(const QModelIndex &current, const QModelIndex &previous)\r
794 {\r
795     Q_UNUSED(previous);\r
796 //    qDebug() << "CurrentChanged";\r
797 //    qDebug() << " row = " << current.row();\r
798 \r
799     FileTableModel *m = static_cast<FileTableModel*>(model());\r
800 //    qDebug() << m->absoluteFilePath(current);\r
801     emit indexChanged(m->absoluteFilePath(current));\r
802 \r
803     QTableView::currentChanged(current, previous);\r
804 }\r