OSDN Git Service

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