OSDN Git Service

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