OSDN Git Service

Ver0.15
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Thu, 28 Aug 2014 00:51:30 +0000 (09:51 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Thu, 28 Aug 2014 00:51:30 +0000 (09:51 +0900)
21 files changed:
README.md
ReadMe.txt
anyview.cpp
anyview.h
common.h
filetablemodel.cpp
folderpanel.cpp
folderpanel.h
folderview.cpp
folderview.h
historydialog.cpp
main.cpp
mainwindow.cpp
mainwindow.h
operationdialog.cpp
preferencedialog.ui
simpleimageview.cpp
simpleimageview.h
simpletextview.cpp
simpletextview.h
version.h

index 34e8375..bd53413 100644 (file)
--- a/README.md
+++ b/README.md
@@ -7,17 +7,21 @@ Gefu is an Experimental File Utility.
   * オプション
     * ファンクションキー
     * キーバインドカスタマイズ
-  * 簡易画像ビューア
   * 簡易アーカイバ
   * 簡易FTPクライアント
   * SNS連携(タイムライン表示とか) ← ファイラーの機能か?
 
+#### 2014/08/28 Ver0.15
+  * 簡易画像ビューアを実装。
+  * 外部アプリを優先する拡張子のデフォルトから、対応画像フォーマットの拡張子を削除。
+  * メニュー項目制御を見直し。
+
 #### 2014/08/27 Ver0.14
   * テキストビューアで、左右矢印キーをPageUp/Downに割り当てた。
   * 「片面ビューアモード」を追加した。
     * 隣のペインがビューアモードになり、カーソル位置のアイテム内容を表示する。
 
-#### 2014/08/26 Ver0.13 公開
+#### 2014/08/26 Ver0.13
   * 拡張子・サイズ・更新日時の列幅をフォントサイズに応じて調整するようにした。
   * 「最新バージョンをチェック」を「アップデートの確認」に文言変更。
     合わせて、ショートカットキーを「V」から「Shift+Z」に変更。
@@ -28,21 +32,21 @@ Gefu is an Experimental File Utility.
     * 環境設定ダイアログで、「起動時のアップデート確認」の設定表示・変更ができていなかったのを修正。
     * アイテム移動時の確認・完了表示に関するオプションが無視されていたのを修正。
 
-#### 2014/08/26 Ver0.12 公開
+#### 2014/08/26 Ver0.12
   * コンテキストメニューを実装。
   * 拡張子を分離して表示するようにした。
   * ファイルビューの状態で文字の大きさを変更できるようにした。
   * GUIまわり(メニュー、ツールバー、ダイアログ)を調整。
   * テキストビューアの外観設定が反映されていなかったのを修正。
 
-#### 2014/08/25 Ver0.11 公開
+#### 2014/08/25 Ver0.11
   * ファイル検索機能を実装。
   * 内部構造を大幅に変更。
     各ビューで処理していたアクションを、メインウィンドウで処理するように変更。
   * 起動時の位置とサイズが常にデフォルト値になっていたのを修正。
   * バージョン情報ダイアログのリンク先をSourceForgeに変更。
 
-#### 2014/08/24 Ver0.10 公開
+#### 2014/08/24 Ver0.10
   * 環境設定ダイアログの変更
     * コントロールの活性・非活性切り替えを修正。
     * フォント選択をダイアログ使用に変更。
@@ -53,7 +57,7 @@ Gefu is an Experimental File Utility.
     * 先頭1KB中に文字コードを示す文字列("shift_jis"等)があれば、その文字コードに変換する。
     * バイト単位で調べて推測(http://dobon.net/vb/dotnet/string/detectcode.html よりコードを拝借)
 
-#### 2014/08/24 Ver0.09 公開
+#### 2014/08/24 Ver0.09
   * 左右矢印キーに機能割り当て
     * 左ペインで左矢印/右ペインで右矢印 → 親フォルダに移動
     * 左ペインで右矢印/右ペインで左矢印 → 反対側のペインにフォーカス
@@ -63,7 +67,7 @@ Gefu is an Experimental File Utility.
   * 不具合修正
     * Windows版で初回起動時、タイトルバーが画面外に出ていた。→ デフォルト位置・サイズ変更。
 
-#### 2014/08/23 Ver0.08 公開
+#### 2014/08/23 Ver0.08
   * 「ターミナルで開く」を実装。
   * Shift+ダブルクリックで、ファイルを外部エディタで開くようにした。
   * Ctrl+ダブルクリックで、フォルダをターミナルで開くようにした。
@@ -73,23 +77,23 @@ Gefu is an Experimental File Utility.
   * 不具合修正
     * Windows版でドライブ直下のフォルダを開くと落ちるのを修正。
 
-#### 2014/08/23 Ver0.07 公開
+#### 2014/08/23 Ver0.07
   * ダブルクリック時、ファイルは標準の関連付けで実行するようにした。
   * 設定項目追加。
   * 「外部エディタで開く」を実装。
   * 不具合修正
     * 初期表示時にカーソルがハイライトされない問題を修正。
 
-#### 2014/08/22 Ver0.06 公開
+#### 2014/08/22 Ver0.06
   * 外部および内部のドラッグ&ドロップ処理を実装。
   * 一部ダイアログのレイアウト、初期サイズを調整。
   * 不具合修正
     * 同一ファイルに対する強制上書きが考慮されていなかった。⇛ 先・元が同一の場合はスキップするようにした。
 
-#### 2014/08/22 Ver0.05 公開
+#### 2014/08/22 Ver0.05
   * 外部アプリケーションからのドロップ処理を実装。
 
-#### 2014/08/22 Ver0.04 公開
+#### 2014/08/22 Ver0.04
   * 不具合修正
     * ソート順でフォルダ位置が先頭以外の場合、".."もソートされていたのを修正。(ソート方法によらず、".."は必ず先頭にした)
     * 各ダイアログのフォーカス周りを修正。
@@ -98,21 +102,21 @@ Gefu is an Experimental File Utility.
     * フォルダ内容変更による再読込時、カーソル位置が初期化されていたのを修正。
   * 「最新の情報に更新」を追加。
 
-#### 2014/08/21 Ver0.03 公開
+#### 2014/08/21 Ver0.03
   * 環境設定ダイアログおよびオプションを実装。
     * 終了時の確認ダイアログ。
     * 起動時のウィンドウ位置・サイズ。
     * 起動時に設定をリセット。
     * 色とフォントの設定。
 
-#### 2014/08/20 Ver0.02 公開
+#### 2014/08/20 Ver0.02
   * QTableWidget -> QTableView + Modelへ変更し高速化。
   * フォルダ履歴機能を実装。
   * 行の高さを調整。
   * マーク時の背景色、前景色を変更。
   * ウィンドウの位置・サイズを保存するようにした。
 
-#### 2014/08/18 Ver0.01 公開
+#### 2014/08/18 Ver0.01
   * 名前変更ダイアログ(単一)のレイアウトを修正。
   * すべて選択等で、カーソル位置が変わらないようにした。
   * マークしているフォルダ数、ファイル数、合計ファイルサイズの表示を追加。
@@ -121,5 +125,5 @@ Gefu is an Experimental File Utility.
   * 名前ソートで大文字小文字を区別しないようにした。
   * ソート方法の選択機能を追加。
 
-#### 2014/08/18 Ver0.00 公開
+#### 2014/08/18 Ver0.00
   * 新規。
index f06cb2b..e7a0bca 100644 (file)
@@ -1,8 +1,8 @@
 ===============================================================================
     Gefu(げふぅ) - Gefu is an Experimental File Utility - 
-    Version 0.14
+    Version 0.15
 ===============================================================================
-                                                       2014/08/27 @miyabi_satoh
+                                                       2014/08/28 @miyabi_satoh
 
 ◇ 概要 ◇
 
  ファイルをダブルクリックすれば、ファイルを開きます。
  ドラッグ&ドロップすれば、コピーします。
 
+◇ 関連リソース ◇
+ Webページ ... http://gefu.sourceforge.jp/
+   導入方法などを解説しています。
+ Wiki ... http://sourceforge.jp/projects/gefu/wiki/FrontPage
+   各種ドキュメントを閲覧できます。
+
 ◇ 免責事項 ◇
  - Gefu(げふぅ)はオープンソース・フリーソフトウェアです。
    個人・法人に限らず、どなたでも自由にご使用ください。
  Twitter: https://twitter.com/miyabi_satoh
 
 ◇ 履歴 ◇
+#### 2014/08/28 Ver0.15
+  * 簡易画像ビューアを実装。
+  * 外部アプリを優先する拡張子のデフォルトから、対応画像フォーマットの拡張子を削除。
+  * メニュー項目制御を見直し。
+
 #### 2014/08/27 Ver0.14
   * 外部アプリを優先する拡張子のデフォルトに「dmg」を追加。
   * テキストビューアで、左右矢印キーをPageUp/Downに割り当てた。
index 0eff910..f2d003a 100644 (file)
@@ -44,45 +44,46 @@ void AnyView::changeView(int viewType)
     w->setVisible(true);
 }
 
-void AnyView::setViewItem(const QFileInfo &info)
+bool AnyView::setViewItem(const QFileInfo &info)
 {
-    setUpdatesEnabled(false);
-
+    // フォルダ
     if (info.isDir()) {
         changeView(ViewFolder);
         ui->folderPanel->folderView()->setPath(info.absoluteFilePath(), true);
+        return true;
     }
-    else {
-        QSettings settings;
-        bool isBinary = false;
-        if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
-            QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
-            foreach (const QString &ext, list) {
-                if (ext.toLower() == info.suffix().toLower()) {
-                    isBinary = true;
-                    break;
-                }
-            }
-        }
 
-        // TODO:画像ビューアで表示できるか?
+    // 画像ファイル
+    if (ui->graphicsView->setSource(info.absoluteFilePath())) {
+        changeView(ViewImage);
+        return true;
+    }
 
-        if (!isBinary) {
-            changeView(ViewText);
-            QFile file(info.absoluteFilePath());
-            if (file.open(QIODevice::ReadOnly)) {
-                ui->textView->setSource(file.readAll());
-                file.close();
+    QSettings settings;
+    bool isBinary = false;
+    if (!settings.value(IniKey_ViewerForceOpen).toBool()) {
+        QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");
+        foreach (const QString &ext, list) {
+            if (ext.toLower() == info.suffix().toLower()) {
+                isBinary = true;
+                break;
             }
         }
-        else {
-            changeView(ViewText);
-            ui->textView->setSource("");
-        }
+    }
 
+    if (!isBinary) {
+        changeView(ViewText);
+        QFile file(info.absoluteFilePath());
+        if (file.open(QIODevice::ReadOnly)) {
+            ui->textView->setSource(file.readAll());
+            file.close();
+            return true;
+        }
     }
 
-    setUpdatesEnabled(true);
+    changeView(ViewText);
+    ui->textView->setSource("");
+    return false;
 }
 
 FolderPanel *AnyView::folderPanel() const
index da36753..653fc94 100644 (file)
--- a/anyview.h
+++ b/anyview.h
@@ -27,7 +27,7 @@ public:
 
     // action
     void changeView(int viewType);
-    void setViewItem(const QFileInfo &info);
+    bool setViewItem(const QFileInfo &info);
 
     // getter
     FolderPanel* folderPanel() const;
index 5bc1e0e..9829d8f 100644 (file)
--- a/common.h
+++ b/common.h
@@ -6,12 +6,13 @@ typedef QMap<QString, QString> StringMap;
 \r
 class QObject;\r
 class QKeyEvent;\r
-class MainWindow;\r
-extern MainWindow* getMainWnd();\r
+//class MainWindow;\r
+//extern MainWindow* getMainWnd();\r
 extern QString FilesizeToString(quint64 size);\r
 extern QString ViewerIgnoreExt();\r
 extern QString KeyEventToSequence(const QKeyEvent *event);\r
 extern bool ProcessShortcut(const QString &ksq, const QObject *object);\r
+extern void Sleep(int msec);\r
 \r
 #define slash   QString("/")\r
 #define QQ(x)   ("\"" + QString(x) + "\"")\r
index 6676531..ef5cfc9 100644 (file)
@@ -32,6 +32,8 @@ FileTableModel::FileTableModel(QObject *parent) :
 \r
 bool FileTableModel::setPath(const QString &path)\r
 {\r
+    qDebug() << "FileTableModel::setPath" << path;\r
+\r
     if (!QFileInfo::exists(path)) {\r
         qDebug() << "パスが存在しません";\r
         qDebug() << path;\r
@@ -108,6 +110,7 @@ bool FileTableModel::setPath(const QString &path)
     endResetModel();\r
 \r
     emit dataChanged(QModelIndex(), QModelIndex());\r
+\r
     return !m_fileInfoList.isEmpty();\r
 }\r
 \r
@@ -118,6 +121,8 @@ Qt::CheckState FileTableModel::checkState(const QModelIndex &index) const
 \r
 void FileTableModel::setCheckState(const QModelIndex &index, Qt::CheckState state)\r
 {\r
+    qDebug() << "FileTableModel::setCheckState();";\r
+\r
     beginResetModel();\r
     m_checkStates[index.row()] = state;\r
     if (state == Qt::Checked && index.row() == 0 &&\r
@@ -131,6 +136,8 @@ void FileTableModel::setCheckState(const QModelIndex &index, Qt::CheckState stat
 \r
 void FileTableModel::setCheckStateAll(Qt::CheckState state)\r
 {\r
+    qDebug() << "FileTableModel::setCheckStateAll();";\r
+\r
     beginResetModel();\r
     m_checkStates.fill(state);\r
     if (state == Qt::Checked && m_fileInfoList.size() > 1 &&\r
@@ -347,6 +354,8 @@ Qt::ItemFlags FileTableModel::flags(const QModelIndex &index) const
 \r
 bool FileTableModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
 {\r
+    qDebug() << "FileTableModel::setData()";\r
+\r
     if (!index.isValid()) {\r
         return false;\r
     }\r
index 1420f80..18841de 100644 (file)
@@ -1,13 +1,17 @@
+#include "common.h"
+#include "mainwindow.h"
+#include "searchbox.h"
+#include "locationbox.h"
 #include "folderpanel.h"
 #include "ui_folderpanel.h"
 
+#include <QDebug>
+
 FolderPanel::FolderPanel(QWidget *parent) :
     QWidget(parent),
     ui(new Ui::FolderPanel)
 {
     ui->setupUi(this);
-    // 初期状態では検索ボックスは非表示
-    ui->searchBox->setVisible(false);
 }
 
 FolderPanel::~FolderPanel()
@@ -15,6 +19,34 @@ FolderPanel::~FolderPanel()
     delete ui;
 }
 
+void FolderPanel::initialize(MainWindow *mainWnd)
+{
+    qDebug() << "FolderPanel::initialize();";
+
+    // シグナル&スロット
+    connect(ui->folderView, SIGNAL(dataChanged()), this, SLOT(dataChange()));
+    connect(ui->folderView, SIGNAL(doubleClicked(QModelIndex)), mainWnd, SLOT(open(QModelIndex)));
+    connect(ui->folderView, SIGNAL(dropAccepted(QFileInfoList)), mainWnd, SLOT(dropAccept(QFileInfoList)));
+    connect(ui->folderView, SIGNAL(currentChanged(QFileInfo)), mainWnd, SLOT(currentChange(QFileInfo)));
+    connect(ui->folderView, SIGNAL(itemFound()), mainWnd, SLOT(itemFound()));
+    connect(ui->folderView, SIGNAL(itemNotFound()), mainWnd, SLOT(itemNotFound()));
+    connect(ui->folderView, SIGNAL(retrieveFinished()), mainWnd, SLOT(retrieveFinish()));
+    connect(ui->folderView, SIGNAL(requestContextMenu(QContextMenuEvent*)), mainWnd, SLOT(showContextMenu(QContextMenuEvent*)));
+    connect(ui->folderView, SIGNAL(retrieveStarted(QString)), mainWnd, SLOT(retrieveStart(QString)));
+    connect(ui->folderView, SIGNAL(retrieveStarted(QString)), ui->locationBox, SLOT(setText(QString)));
+    connect(ui->searchBox, SIGNAL(textEdited(QString)), mainWnd, SLOT(searchItem(QString)));
+    connect(ui->searchBox, SIGNAL(returnPressed()), mainWnd, SLOT(returnPressInSearchBox()));
+
+    // 初期状態では検索ボックスは非表示
+    ui->searchBox->setVisible(false);
+
+    // ロケーションボックスを初期化する
+    ui->locationBox->initialize();
+
+    // フォルダビューを初期化する
+    ui->folderView->initialize();
+}
+
 LocationBox *FolderPanel::locationBox() const
 {
     return ui->locationBox;
@@ -25,7 +57,7 @@ FolderView *FolderPanel::folderView() const
     return ui->folderView;
 }
 
-SearchBox *FolderPanel::serachBox() const
+SearchBox *FolderPanel::searchBox() const
 {
     return ui->searchBox;
 }
@@ -35,8 +67,65 @@ QLabel *FolderPanel::filterLabel() const
     return ui->filterLabel;
 }
 
+void FolderPanel::setNameFilters(const QString &filters)
+{
+    QStringList list = filters.split(" ", QString::SkipEmptyParts);
+    if (list.isEmpty()) {
+        list << "*";
+    }
+    ui->folderView->setNameFilters(list);
+    showNameFilters();
+}
+
+void FolderPanel::showNameFilters()
+{
+    ui->filterLabel->setText(tr("フィルタ:") + ui->folderView->nameFilters().join(" "));
+}
+
+void FolderPanel::dataChange()
+{
+    qDebug() << "FolderPanel::dataChange();";
+
+    FolderView *view = static_cast<FolderView*>(sender());
+    Q_CHECK_PTR(view);
+
+    QFileInfoList list = view->checkedItems();
+    if (list.isEmpty()) {
+        showNameFilters();
+    }
+    else {
+        int numFolders = 0;
+        int numFiles = 0;
+        quint64 size = 0;
+        foreach (const QFileInfo &info, list) {
+            if (info.isDir()) {
+                numFolders++;
+            }
+            else {
+                numFiles++;
+                size += info.size();
+            }
+        }
+
+        QString msg = QString::null;
+        if (numFolders > 0) {
+            msg += tr("%1個のフォルダ ").arg(numFolders);
+        }
+        if (numFiles > 0) {
+            msg += tr("%1個のファイル ").arg(numFiles);
+        }
+
+        if (!msg.isEmpty()) {
+            msg += tr("を選択 合計%1").arg(FilesizeToString(size));
+        }
+
+        ui->filterLabel->setText(msg);
+    }
+}
 
 void FolderPanel::focusInEvent(QFocusEvent *)
 {
+    qDebug() << "FolderPanel::focusInEvent();";
+
     ui->folderView->setFocus();
 }
index 129fc60..d094b3d 100644 (file)
@@ -6,6 +6,7 @@ class QLabel;
 class LocationBox;
 class FolderView;
 class SearchBox;
+class MainWindow;
 
 namespace Ui {
 class FolderPanel;
@@ -19,15 +20,25 @@ public:
     explicit FolderPanel(QWidget *parent = 0);
     ~FolderPanel();
 
+    void initialize(MainWindow *mainWnd);
+
     // getter
     LocationBox* locationBox() const;
     FolderView* folderView() const;
-    SearchBox* serachBox() const;
+    SearchBox* searchBox() const;
     QLabel* filterLabel() const;
 
+    // setter
+    void setNameFilters(const QString &filters = QString());
+
 private:
     Ui::FolderPanel *ui;
 
+    void showNameFilters();
+
+public slots:
+    void dataChange();
+
     // QWidget interface
 protected:
     void focusInEvent(QFocusEvent *);
index 7282776..3584e74 100644 (file)
@@ -58,6 +58,12 @@ void FolderView::initialize()
 
     setColumnWidth(0, 30);
 
+    // ソート順を初期化する
+    setSorting();
+
+    // ネームフィルタを初期化する
+    setNameFilters(QStringList() << "*");
+
     // 前回終了時のパスを開く
     QSettings settings;
     setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
@@ -120,7 +126,7 @@ void FolderView::refresh()
 
 void FolderView::searchItem(const QString &text)
 {
-    qDebug() << "FolderView::searchItem" << text;
+    qDebug() << side() << "searchItem" << text;
 
     for (int row = 0; row < m_model.rowCount(); row++) {
         QModelIndex index = m_model.index(row, 0);
@@ -137,7 +143,7 @@ void FolderView::searchItem(const QString &text)
 
 void FolderView::searchNext(const QString &text)
 {
-    qDebug() << "FolderView::searchNext" << text;
+    qDebug() << side() << "searchNext" << text;
 
     for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
         QModelIndex index = m_model.index(row, 0);
@@ -265,9 +271,7 @@ bool FolderView::historyForward()
 
 QFileInfo FolderView::currentItem() const
 {
-    qDebug() << "FolderView::currentItem";
-
-    Q_ASSERT(currentIndex().isValid());
+    qDebug() << side() << "currentItem";
 
     return m_model.fileInfo(currentIndex());
 }
@@ -335,38 +339,57 @@ void FolderView::setHistoryIndexAt(int index)
 void FolderView::setNameFilters(const QStringList &list)
 {
     m_model.setNameFilters(list);
-    refresh();
 }
 
-void FolderView::setSorting(QDir::SortFlags flags)
+void FolderView::setSorting()
 {
+    qDebug() << side() << "setSorting();";
+
+    QSettings settings;
+    QDir::SortFlags flags;
+
+    int sortBy = settings.value(side() + slash + IniKey_SortBy).toInt();
+    switch (sortBy) {
+    case SortByDate:    flags |= QDir::Time; break;
+    case SortBySize:    flags |= QDir::Size; break;
+    case SortByType:    flags |= QDir::Type; break;
+    default:            flags |= QDir::Name; break;
+    }
+
+    // デフォルトだと文字列は昇順で、数値は降順…orz
+    int orderBy = settings.value(side() + slash + IniKey_OrderBy).toInt();
+    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
+        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
+    {
+        flags |= QDir::Reversed;
+    }
+
+    switch (settings.value(side() + slash + IniKey_PutDirs).toInt()) {
+    case PutDirsFirst:  flags |= QDir::DirsFirst; break;
+    case PutDirsLast:   flags |= QDir::DirsLast; break;
+    }
+
+    if (settings.value(side() + slash + IniKey_IgnoreCase).toBool()) {
+        flags |= QDir::IgnoreCase;
+    }
+
     m_model.setSorting(flags);
-    refresh();
 }
 
 void FolderView::keyPressEvent(QKeyEvent *event)
 {
     qDebug() << side() << "keyPressEvent";
 
-//    emit keyPressed(event);
-
-//    if (!event->isAccepted()) {
-//        QTableView::keyPressEvent(event);
-//    }
-//    else {
-//        qDebug() << "KeyEvent accepted.";
-//    }
-    QString ksq = KeyEventToSequence(event);
-    if (ProcessShortcut(ksq, getMainWnd())) {
-        event->accept();
-        return;
-    }
-
     QTableView::keyPressEvent(event);
+
+    // MainWindowへ
+    event->ignore();
 }
 
 void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
 {
+    qDebug() << side() << "dataChanged();";
+
     emit dataChanged();
 
     QTableView::dataChanged(topLeft, bottomRight, roles);
@@ -374,6 +397,8 @@ void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bott
 
 void FolderView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
 {
+    qDebug() << side() << "currentChanged();";
+
     emit currentChanged(m_model.fileInfo(current));
 
     QTableView::currentChanged(current, previous);
index e25e503..5775739 100644 (file)
@@ -45,7 +45,7 @@ public:
     void setFilter(QDir::Filters filter, bool enable);
     void setHistoryIndexAt(int index);
     void setNameFilters(const QStringList &list);
-    void setSorting(QDir::SortFlags flags);
+    void setSorting();
 
 private:
     FileTableModel m_model;
index 83c87d1..ff3f1aa 100644 (file)
@@ -11,7 +11,7 @@ HistoryDialog::HistoryDialog(QWidget *parent) :
     m_displaying(NULL)
 {
     ui->setupUi(this);
-    resize(getMainWnd()->width() * 0.8, height());
+    resize(parent->width() * 0.8, height());
 }
 
 HistoryDialog::~HistoryDialog()
index af7b1f4..055606e 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -6,36 +6,7 @@
 #include <QSettings>\r
 #include <QDir>\r
 #include <QAction>\r
-\r
-bool ProcessShortcut(const QString &ksq, const QObject *object)\r
-{\r
-    qDebug() << "ProcessShortcut()";\r
-\r
-    if (ksq.isEmpty()) {\r
-        return false;\r
-    }\r
-\r
-    foreach (QObject *obj, object->children()) {\r
-        QAction *action = qobject_cast<QAction*>(obj);\r
-        if (!action || !action->isEnabled()) {\r
-            continue;\r
-        }\r
-\r
-        foreach (const QKeySequence &k, action->shortcuts()) {\r
-            if (ksq == k.toString()) {\r
-                if (action->isCheckable()) {\r
-                    action->setChecked(!action->isChecked());\r
-                }\r
-                else {\r
-                    emit action->triggered();\r
-                }\r
-                qDebug() << "emit" << action->objectName();\r
-                return true;\r
-            }\r
-        }\r
-    }\r
-    return false;\r
-}\r
+#include <QTimer>\r
 \r
 int main(int argc, char *argv[])\r
 {\r
@@ -178,8 +149,7 @@ QString ViewerIgnoreExt()
 {\r
     QStringList list;\r
     // 画像系\r
-    list << "gif" << "jpg" << "jpeg" << "png" << "bmp" << "ico" << "ai";\r
-    list << "psd" << "xcf" << "tif" << "tiff" << "wmf";\r
+    list << "ico" << "ai" << "psd" << "xcf" << "tif" << "tiff" << "wmf";\r
     // 音・動画系\r
     list << "wav" << "mp3" << "ogg" << "midi" << "mid" << "aif" << "aiff";\r
     list << "mov" << "mpg" << "mpeg" << "wma" << "wmv" << "asf" << "avi";\r
@@ -199,3 +169,40 @@ QString ViewerIgnoreExt()
 \r
     return list.join(",");\r
 }\r
+\r
+bool ProcessShortcut(const QString &ksq, const QObject *object)\r
+{\r
+    qDebug() << "ProcessShortcut()";\r
+\r
+    if (ksq.isEmpty()) {\r
+        return false;\r
+    }\r
+\r
+    foreach (QObject *obj, object->children()) {\r
+        QAction *action = qobject_cast<QAction*>(obj);\r
+        if (!action || !action->isEnabled()) {\r
+            continue;\r
+        }\r
+\r
+        foreach (const QKeySequence &k, action->shortcuts()) {\r
+            if (ksq == k.toString()) {\r
+                if (action->isCheckable()) {\r
+                    action->setChecked(!action->isChecked());\r
+                }\r
+                else {\r
+                    emit action->triggered();\r
+                }\r
+                qDebug() << "emit" << action->objectName();\r
+                return true;\r
+            }\r
+        }\r
+    }\r
+    return false;\r
+}\r
+\r
+void Sleep(int msec)\r
+{\r
+    QEventLoop loop;\r
+    QTimer::singleShot(msec, &loop, SLOT(quit()));\r
+    loop.exec();\r
+}\r
index 3ab7d30..3581494 100644 (file)
@@ -1,11 +1,9 @@
 #include "common.h"\r
 #include "version.h"\r
-#include "mainwindow.h"\r
 #include "preferencedialog.h"\r
 #include "folderview.h"\r
 #include "searchbox.h"\r
 #include "locationbox.h"\r
-#include "ui_mainwindow.h"\r
 #include "copymoveworker.h"\r
 #include "operationdialog.h"\r
 #include "overwritedialog.h"\r
@@ -16,6 +14,9 @@
 #include "historydialog.h"\r
 #include "sortdialog.h"\r
 #include "simpletextview.h"\r
+#include "simpleimageview.h"\r
+#include "mainwindow.h"\r
+#include "ui_mainwindow.h"\r
 \r
 #include <QCheckBox>\r
 #include <QCloseEvent>\r
 #include <QFileDialog>\r
 #include <folderpanel.h>\r
 \r
-MainWindow* getMainWnd()\r
-{\r
-    foreach (QWidget *w, qApp->topLevelWidgets()) {\r
-        if (w->objectName() == "MainWindow") {\r
-            return static_cast<MainWindow*>(w);\r
-        }\r
-    }\r
-    qDebug() << "MainWindow not found !?";\r
-    return NULL;\r
-}\r
-\r
 MainWindow::MainWindow(QWidget *parent) :\r
     QMainWindow(parent),\r
     ui(new Ui::MainWindow),\r
     m_focusedView(NULL),\r
-    m_overwriteDialog(NULL)\r
+    m_overwriteDialog(NULL),\r
+    m_viewMode(ModeBasic)\r
 {\r
+    qDebug() << ">>>>>>>>>> MainWindowの構築開始 <<<<<";\r
     ui->setupUi(this);\r
 \r
     m_overwriteDialog = new OverWriteDialog(this);\r
 \r
     initActionConnections();\r
     connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), this, SLOT(focusChange(QWidget*,QWidget*)));\r
-    connect(ui->pane3->textView(), SIGNAL(viewFinished(QWidget*)), this, SLOT(viewFinish(QWidget*)));\r
+    connect(ui->pane3->textView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));\r
+    connect(ui->pane3->imageView(), SIGNAL(viewFinished()), this, SLOT(viewFinish()));\r
+    connect(ui->pane1->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
+    connect(ui->pane2->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
+    connect(ui->pane3->textView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
+    connect(ui->pane1->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
+    connect(ui->pane2->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
+    connect(ui->pane3->imageView(), SIGNAL(fileInfo(QString)), this, SLOT(showFileInfo(QString)));\r
 \r
     // ビューアは初期状態で非表示\r
     ui->pane3->setVisible(false);\r
 \r
+    // ステータスバーにウィジェットを設定する\r
+    QLabel *label = new QLabel("", this);\r
+    label->setAlignment(Qt::AlignRight);\r
+    label->setObjectName("Right");\r
+    ui->statusBar->addPermanentWidget(label, 0);\r
+\r
     for (int i = 1; i <= 2; i++) {\r
+        // pane1 or pane2\r
         AnyView *anyView = findChild<AnyView*>(QString("pane%1").arg(i));\r
         Q_CHECK_PTR(anyView);\r
 \r
         FolderPanel *fp = anyView->findChild<FolderPanel*>("folderPanel");\r
         Q_CHECK_PTR(fp);\r
-        fp->setObjectName(QString("folderPanel%1").arg(i));\r
 \r
-        LocationBox *locationBox = fp->locationBox();\r
-        FolderView *folderView = fp->folderView();\r
-        SearchBox *searchBox = fp->serachBox();\r
-\r
-        if (i == 1) {\r
-            folderView->setObjectName("folderView1");\r
-        }\r
-        else {\r
-            folderView->setObjectName("folderView2");\r
-        }\r
-\r
-        // シグナル&スロット\r
-        connect(folderView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(open(QModelIndex)));\r
-        connect(folderView, SIGNAL(dataChanged()), this, SLOT(dataChange()));\r
-        connect(folderView, SIGNAL(dropAccepted(QFileInfoList)), this, SLOT(dropAccept(QFileInfoList)));\r
-        connect(folderView, SIGNAL(currentChanged(QFileInfo)), this, SLOT(currentChange(QFileInfo)));\r
-        connect(folderView, SIGNAL(itemFound()), this, SLOT(itemFound()));\r
-        connect(folderView, SIGNAL(itemNotFound()), this, SLOT(itemNotFound()));\r
-//        connect(folderView, SIGNAL(keyPressed(QKeyEvent*)), this, SLOT(keyPress(QKeyEvent*)));\r
-        connect(folderView, SIGNAL(retrieveFinished()), this, SLOT(retrieveFinish()));\r
-        connect(folderView, SIGNAL(retrieveStarted(QString)), this, SLOT(retrieveStart(QString)));\r
-        connect(folderView, SIGNAL(requestContextMenu(QContextMenuEvent*)), this, SLOT(showContextMenu(QContextMenuEvent*)));\r
-        connect(searchBox, SIGNAL(textEdited(QString)), this, SLOT(searchItem(QString)));\r
-        connect(searchBox, SIGNAL(returnPressed()), this, SLOT(returnPressInSearchBox()));\r
-\r
-        // 検索ボックスは初期状態で非表示\r
-        searchBox->setVisible(false);\r
-\r
-        // ロケーションボックスを初期化する\r
-        locationBox->initialize();\r
-\r
-        // フィルタを初期化する\r
-        setNameFilters(folderView);\r
-\r
-        // ソートを初期化する\r
-        setSorting(folderView);\r
+        // FolderPanelとFolderViewの名前を変更する\r
+        fp->setObjectName(QString("folderPanel%1").arg(i));\r
+        fp->folderView()->setObjectName(QString("folderView%1").arg(i));\r
 \r
-        // フォルダビューを初期化する\r
-        folderView->initialize();\r
+        fp->initialize(this);\r
     }\r
 \r
     QSettings settings;\r
@@ -201,10 +172,12 @@ MainWindow::MainWindow(QWidget *parent) :
     }\r
 \r
     ui->pane2->changeView(AnyView::ViewFolder);\r
-    ui->pane2->folderPanel()->folderView()->repaint();\r
+    ui->pane2->repaint();\r
 \r
     ui->pane1->changeView(AnyView::ViewFolder);\r
-    ui->pane1->folderPanel()->folderView()->repaint();\r
+    ui->pane1->repaint();\r
+\r
+    qDebug() << ">>>>>>>>>> MainWindowの構築終了 <<<<<";\r
 }\r
 \r
 MainWindow::~MainWindow()\r
@@ -212,51 +185,40 @@ MainWindow::~MainWindow()
     delete ui;\r
 }\r
 \r
-FolderView* MainWindow::otherSideView(const FolderView *view) const\r
-{\r
-    qDebug() << "MainWindow::otherSideView()" << view->objectName();\r
-\r
-    if (view == ui->pane1->folderPanel()->folderView()) {\r
-        return ui->pane2->folderPanel()->folderView();\r
-    }\r
-\r
-    Q_ASSERT(view == ui->pane2->folderPanel()->folderView());\r
-    return ui->pane1->folderPanel()->folderView();\r
-}\r
-\r
 void MainWindow::focusChange(QWidget *old, QWidget *now)\r
 {\r
-    Q_UNUSED(old);\r
-    qDebug() << "MainWindow::focusChange";\r
-    if (now != NULL) {\r
-        qDebug() << "Now Focus" << now->objectName();\r
-    }\r
+    qDebug() << ">>>>> フォーカス変更";\r
+    if (old) qDebug() << "old is" << old->objectName();\r
+    if (now) qDebug() << "now is" << now->objectName();\r
 \r
-    if (now &&\r
-        (now == ui->pane1->folderPanel()->folderView() ||\r
-         now == ui->pane2->folderPanel()->folderView()))\r
+    // 検索ボックスがフォーカスを失ったら、非表示にする\r
+    if (old == ui->pane1->folderPanel()->searchBox() ||\r
+        old == ui->pane2->folderPanel()->searchBox())\r
     {\r
-        ui->statusBar->showMessage(folderView()->currentItem().absoluteFilePath());\r
+        ui->action_Search->setChecked(false);\r
     }\r
 \r
-    if (old &&\r
-        (old == ui->pane1->folderPanel()->serachBox() ||\r
-         old == ui->pane2->folderPanel()->serachBox()))\r
+    // フォルダビューにフォーカスが移ったら、ステータスバーの表示を更新する\r
+    if (now == ui->pane1->folderPanel()->folderView() ||\r
+        now == ui->pane2->folderPanel()->folderView())\r
     {\r
-        old->setVisible(false);\r
+        FolderView *view = static_cast<FolderView*>(now);\r
+        ui->statusBar->showMessage(view->currentItem().absoluteFilePath());\r
     }\r
 \r
-    updateActions();\r
+    if (now) {\r
+        updateActions();\r
+    }\r
 }\r
 \r
 void MainWindow::executeCommand()\r
 {\r
     qDebug() << "MainWindow::executeCommand";\r
 \r
-    FolderView *v = folderView();\r
-    Q_ASSERT(v);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
 \r
-    QFileInfoList list = v->selectedItems();\r
+    QFileInfoList list = view->selectedItems();\r
     QString command = QString::null;\r
     foreach (const QFileInfo &info, list) {\r
 #ifdef Q_OS_MAC\r
@@ -282,7 +244,7 @@ void MainWindow::executeCommand()
     int ret = dlg.exec();\r
     command = dlg.textValue();\r
     if (ret == QDialog::Accepted && !command.isEmpty()) {\r
-        startProcess(command, v->dir(), tr("コマンドの実行に失敗しました。"));\r
+        startProcess(command, view->dir(), tr("コマンドの実行に失敗しました。"));\r
     }\r
 }\r
 \r
@@ -290,7 +252,10 @@ void MainWindow::historyBack()
 {\r
     qDebug() << "MainWindow::historyBack();";\r
 \r
-    if (folderView()->historyBack()) {\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    if (view->historyBack()) {\r
         updateActions();\r
     }\r
 }\r
@@ -299,7 +264,10 @@ void MainWindow::historyForward()
 {\r
     qDebug() << "MainWindow::historyForward();";\r
 \r
-    if (folderView()->historyForward()) {\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    if (view->historyForward()) {\r
         updateActions();\r
     }\r
 }\r
@@ -308,7 +276,9 @@ void MainWindow::itemFound()
 {\r
     qDebug() << "MainWindow::itemFound";\r
 \r
-    SearchBox *box = searchBox(static_cast<FolderView*>(sender()));\r
+    SearchBox *box = sender()->parent()->findChild<SearchBox*>("searchBox");\r
+    Q_CHECK_PTR(box);\r
+\r
     QPalette pal = box->palette();\r
     pal.setColor(QPalette::Text, QPalette().text().color());\r
     box->setPalette(pal);\r
@@ -318,7 +288,9 @@ void MainWindow::itemNotFound()
 {\r
     qDebug() << "MainWindow::itemNotFound";\r
 \r
-    SearchBox *box = searchBox(static_cast<FolderView*>(sender()));\r
+    SearchBox *box = sender()->parent()->findChild<SearchBox*>("searchBox");\r
+    Q_CHECK_PTR(box);\r
+\r
     QPalette pal = box->palette();\r
     pal.setColor(QPalette::Text, Qt::red);\r
     box->setPalette(pal);\r
@@ -328,43 +300,60 @@ void MainWindow::markAll()
 {\r
     qDebug() << "MainWindow::markAll();";\r
 \r
-    folderView()->setCheckStateAll(true);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->setCheckStateAll(true);\r
 }\r
 \r
 void MainWindow::markAllFiles()\r
 {\r
     qDebug() << "MainWindow::markAllFiles();";\r
 \r
-    folderView()->setCheckStateAllFiles();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->setCheckStateAllFiles();\r
 }\r
 \r
 void MainWindow::markAllOff()\r
 {\r
     qDebug() << "MainWindow::markAllOff();";\r
 \r
-    folderView()->setCheckStateAll(false);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->setCheckStateAll(false);\r
 }\r
 \r
 void MainWindow::markInvert()\r
 {\r
     qDebug() << "MainWindow::markInvert();";\r
 \r
-    folderView()->invertCheckState();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->invertCheckState();\r
 }\r
 \r
 void MainWindow::markToggle()\r
 {\r
     qDebug() << "MainWindow::markToggle();";\r
 \r
-    folderView()->toggleCheckState(folderView()->currentIndex());\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->toggleCheckState(view->currentIndex());\r
 }\r
 \r
 void MainWindow::moveItems()\r
 {\r
     qDebug() << "MainWindow::moveItems";\r
 \r
-    FolderView *v = folderView();\r
-    QFileInfoList list = v->selectedItems();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    QFileInfoList list = view->selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
@@ -382,7 +371,7 @@ void MainWindow::moveItems()
     m_overwriteDialog->reset();\r
 \r
     // ワーカースレッドを作成する\r
-    FolderView *other = otherSideView(v);\r
+    FolderView *other = otherSideFolderView(view);\r
     CopyMoveWorker *worker = new CopyMoveWorker();\r
     connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
             this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
@@ -405,24 +394,6 @@ void MainWindow::moveItems()
 //    ui->folderView2->refresh();\r
 }\r
 \r
-//void MainWindow::keyPress(QKeyEvent *event)\r
-//{\r
-//    QString ksq = KeyEventToSequence(event);\r
-//    if (ksq == "") {\r
-//        event->ignore();\r
-//        return;\r
-//    }\r
-\r
-//    qDebug() << "MainWindow::keyPress" << ksq;\r
-\r
-//    if (ProcessShortcut(ksq, this)) {\r
-//        event->accept();\r
-//        return;\r
-//    }\r
-\r
-//    event->ignore();\r
-//}\r
-\r
 void MainWindow::leftKeyPress()\r
 {\r
     qDebug() << "MainWindow::leftKeyPress();";\r
@@ -435,8 +406,7 @@ void MainWindow::leftKeyPress()
         setPathToParent();\r
     }\r
     else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {\r
-//        ui->folderView1->setFocus();\r
-        ui->pane1->setFocus();\r
+        ui->pane1->folderPanel()->folderView()->setFocus();\r
     }\r
 }\r
 \r
@@ -449,8 +419,7 @@ void MainWindow::rightKeyPress()
         QApplication::sendEvent(ui->pane3->textView(), &event);\r
     }\r
     else if (ui->pane1->folderPanel()->folderView()->hasFocus()) {\r
-        //        ui->folderView2->setFocus();\r
-                ui->pane2->setFocus();\r
+        ui->pane2->folderPanel()->folderView()->setFocus();\r
     }\r
     else if (ui->pane2->folderPanel()->folderView()->hasFocus()) {\r
         setPathToParent();\r
@@ -469,14 +438,28 @@ void MainWindow::returnPressInSearchBox()
     }\r
 }\r
 \r
+void MainWindow::showFileInfo(const QString &str)\r
+{\r
+    qDebug() << "MainWindow::showFileInfo();" << str;\r
+    QLabel *label = ui->statusBar->findChild<QLabel*>("Right");\r
+    Q_CHECK_PTR(label);\r
+\r
+//    label->resize(QFontMetrics(label->font()).boundingRect(str).width(),\r
+//                  label->height());\r
+    label->setText(str);\r
+}\r
+\r
 void MainWindow::chooseFolder()\r
 {\r
     qDebug() << "MainWindow::chooseFolder();";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     QString path = QFileDialog::getExistingDirectory(\r
-                this, tr("フォルダを選択"), folderView()->dir());\r
+                this, tr("フォルダを選択"), view->dir());\r
     if (!path.isEmpty()) {\r
-        folderView()->setPath(path, true);\r
+        view->setPath(path, true);\r
         updateActions();\r
     }\r
 }\r
@@ -485,16 +468,22 @@ void MainWindow::copyFilenameToClipboard()
 {\r
     qDebug() << "MainWindow::copyFilenameToClipboard();";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     QClipboard *clipboard = QApplication::clipboard();\r
-    clipboard->setText(folderView()->currentItem().fileName());\r
+    clipboard->setText(view->currentItem().fileName());\r
 }\r
 \r
 void MainWindow::copyFullpathTpClipboard()\r
 {\r
     qDebug() << "MainWindow::copyFullpathTpClipboard();";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     QClipboard *clipboard = QApplication::clipboard();\r
-    clipboard->setText(folderView()->currentItem().absoluteFilePath());\r
+    clipboard->setText(view->currentItem().absoluteFilePath());\r
 }\r
 \r
 void MainWindow::askOverWrite(QString *copyMethod,\r
@@ -521,95 +510,46 @@ void MainWindow::askOverWrite(QString *copyMethod,
 \r
 void MainWindow::currentChange(const QFileInfo &info)\r
 {\r
-    qDebug() << "MainWindow::currentChange();";\r
+    qDebug() << ">>>>> カーソル変更 <<<<<";\r
 \r
-    ui->statusBar->showMessage(info.absoluteFilePath());\r
-    if (info.isDir()) {\r
-        ui->action_Open->setIcon(QIcon(":/images/Open.png"));\r
-        ui->action_Open->setText(tr("開く"));\r
-        ui->action_Open->setToolTip(tr("開く"));\r
-    }\r
-    else {\r
-        ui->action_Open->setIcon(QIcon(":/images/Search text.png"));\r
-        ui->action_Open->setText(tr("テキストビューアで開く"));\r
-        ui->action_Open->setToolTip(tr("テキストビューアで開く"));\r
-        ui->action_Open->setEnabled(true);\r
+    FolderView *view = static_cast<FolderView*>(sender());\r
+    Q_CHECK_PTR(view);\r
 \r
-        QSettings settings;\r
-        if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
-            QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
-            foreach (const QString &ext, list) {\r
-                if (ext.toLower() == info.suffix().toLower()) {\r
-                    ui->action_Open->setEnabled(false);\r
-                    break;\r
-                }\r
-            }\r
-        }\r
+    if (!view->hasFocus()) {\r
+        return;\r
     }\r
 \r
-    if (ui->view_HalfMode->isChecked()) {\r
-        FolderView *view = static_cast<FolderView*>(sender());\r
-        if (!view->hasFocus()) {\r
-            return;\r
-        }\r
+    // ステータスバーにカーソルのフルパスを表示する\r
+    ui->statusBar->showMessage(info.absoluteFilePath());\r
 \r
-        if (ui->pane1->folderPanel()->folderView()->hasFocus()) {\r
-            ui->pane2->setViewItem(folderView()->currentItem());\r
-        }\r
-        else {\r
-            Q_ASSERT(ui->pane2->folderPanel()->folderView()->hasFocus());\r
-            ui->pane1->setViewItem(folderView()->currentItem());\r
+    // ハーフモードで変更された場合\r
+    if (m_viewMode & ModeHalfView) {\r
+        AnyView *otherSide = static_cast<AnyView*>(\r
+                    otherSideFolderView(view)->parent()->parent());\r
+        Q_CHECK_PTR(otherSide);\r
+\r
+        if (!otherSide->setViewItem(view->currentItem())) {\r
+            showFileInfo("");\r
         }\r
-        updateActions();\r
     }\r
+\r
+    updateActions();\r
 }\r
 \r
-void MainWindow::dataChange()\r
+void MainWindow::dropAccept(const QFileInfoList &list)\r
 {\r
-    qDebug() << "MainWindow::dataChange();";\r
+    qDebug() << "MainWindow::dropAccept();";\r
 \r
     FolderView *view = static_cast<FolderView*>(sender());\r
-    QFileInfoList list = view->checkedItems();\r
-    if (list.isEmpty()) {\r
-        showNameFilters(view);\r
-    }\r
-    else {\r
-        int numFolders = 0;\r
-        int numFiles = 0;\r
-        quint64 size = 0;\r
-        foreach (const QFileInfo &info, list) {\r
-            if (info.isDir()) {\r
-                numFolders++;\r
-            }\r
-            else {\r
-                numFiles++;\r
-                size += info.size();\r
-            }\r
-        }\r
-\r
-        QString msg = QString::null;\r
-        if (numFolders > 0) {\r
-            msg += tr("%1個のフォルダ ").arg(numFolders);\r
-        }\r
-        if (numFiles > 0) {\r
-            msg += tr("%1個のファイル ").arg(numFiles);\r
-        }\r
-\r
-        if (!msg.isEmpty()) {\r
-            msg += tr("を選択 合計%1").arg(FilesizeToString(size));\r
-        }\r
+    Q_CHECK_PTR(view);\r
 \r
-        filterLabel(view)->setText(msg);\r
-    }\r
-}\r
-\r
-void MainWindow::dropAccept(const QFileInfoList &list)\r
-{\r
-    copyItems(list, static_cast<FolderView*>(sender())->dir());\r
+    copyItems(list, view->dir());\r
 }\r
 \r
 void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)\r
 {\r
+    qDebug() << "MainWindow::copyItems();";\r
+\r
     QSettings settings;\r
     if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
         if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
@@ -649,56 +589,25 @@ void MainWindow::copyItems()
 {\r
     qDebug() << "MainWindow::copyItems";\r
 \r
-    FolderView *v = folderView();\r
-    QFileInfoList list = v->selectedItems();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    QFileInfoList list = view->selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
 \r
-    FolderView *other = otherSideView(v);\r
-    copyItems(list, other->dir());\r
-#if 0\r
-    QSettings settings;\r
-    if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
-        if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
-            != QMessageBox::Yes)\r
-        {\r
-            return;\r
-        }\r
-    }\r
-\r
-    // 上書き確認ダイアログを初期化する\r
-    m_overwriteDialog->reset();\r
-\r
-    // ワーカースレッドを作成する\r
-    FolderView *other = otherSideView(v);\r
-    CopyMoveWorker *worker = new CopyMoveWorker();\r
-    connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
-            this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
-    worker->setCopyList(&list);\r
-    worker->setTargetDir(other->dir());\r
-    worker->setMoveMode(false);\r
-\r
-    // 進捗ダイアログを表示して、処理を開始する\r
-    OperationDialog opDlg(this);\r
-    opDlg.setWindowTitle(tr("コピー"));\r
-    opDlg.setWorker(worker);\r
-    opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
-\r
-    opDlg.exec();\r
-\r
-    settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
-\r
-    // 念のため、リフレッシュ\r
-    ui->folderView1->refresh();\r
-    ui->folderView2->refresh();\r
-#endif\r
+    QString tgtPath = otherSideFolderView(view)->dir();\r
+    copyItems(list, tgtPath);\r
 }\r
 \r
 void MainWindow::createFile()\r
 {\r
     qDebug() << "MainWindow::createFile";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     bool bOk;\r
     QString name = QInputDialog::getText(\r
                 this, tr("ファイルを作成"), tr("ファイル名:"),\r
@@ -707,7 +616,7 @@ void MainWindow::createFile()
         return;\r
     }\r
 \r
-    QDir dir(folderView()->dir());\r
+    QDir dir(view->dir());\r
     QFile file(dir.absoluteFilePath(name));\r
     if (!file.open(QIODevice::WriteOnly)) {\r
         QMessageBox::critical(\r
@@ -728,6 +637,9 @@ void MainWindow::createFolder()
 {\r
     qDebug() << "MainWindow::createFolder";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     bool bOk;\r
     QString name = QInputDialog::getText(\r
                 this, tr("フォルダを作成"), tr("フォルダ名:"),\r
@@ -736,7 +648,7 @@ void MainWindow::createFolder()
         return;\r
     }\r
 \r
-    QDir dir(folderView()->dir());\r
+    QDir dir(view->dir());\r
     if (!dir.mkpath(name)) {\r
         QMessageBox::critical(\r
                     this, tr("エラー"),\r
@@ -745,8 +657,7 @@ void MainWindow::createFolder()
     else {\r
         QSettings settings;\r
         if (settings.value(IniKey_MoveAfterCreateFolder).toBool()) {\r
-            folderView()->setPath(dir.absoluteFilePath(name), true);\r
-            updateActions();\r
+            view->setPath(dir.absoluteFilePath(name), true);\r
         }\r
     }\r
 }\r
@@ -755,8 +666,10 @@ void MainWindow::deleteItems()
 {\r
     qDebug() << "MainWindow::deleteItems";\r
 \r
-    FolderView *v = folderView();\r
-    QFileInfoList list = v->selectedItems();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    QFileInfoList list = view->selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
@@ -800,52 +713,41 @@ void MainWindow::open(const QModelIndex &index)
     Q_UNUSED(index);\r
     qDebug() << "MainWindow::open";\r
 \r
-    FolderView *v = folderView();\r
-    Q_ASSERT(v);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
 \r
-    QFileInfo info = v->currentItem();\r
+    QFileInfo info = view->currentItem();\r
     if (info.isDir()) {\r
-        v->setPath(info.absoluteFilePath(), true);\r
+        view->setPath(info.absoluteFilePath(), true);\r
         updateActions();\r
         return;\r
     }\r
 \r
-    QSettings settings;\r
-    if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
-        QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
-        foreach (const QString &ext, list) {\r
-            if (ext.toLower() == info.suffix().toLower()) {\r
-                shellExecute();\r
-                return;\r
-            }\r
-        }\r
-    }\r
+    setUpdatesEnabled(false);\r
 \r
-    foreach (QObject *obj, this->children()) {\r
-        QAction *action = qobject_cast<QAction*>(obj);\r
-        if (action) {\r
-            if (action->objectName() == "help_About" ||\r
-                action->objectName() == "check_Update" ||\r
-                action->objectName() == "copy_Fullpath" ||\r
-                action->objectName() == "copy_Filename" ||\r
-                action->objectName() == "action_Quit" ||\r
-                action->objectName() == "action_Setting")\r
-            {\r
-                continue;\r
-            }\r
-            action->setEnabled(false);\r
-        }\r
+    m_focusedView = view;\r
+    if (ui->pane3->setViewItem(info)) {\r
+        ui->pane3->setVisible(true);\r
+        ui->splitter->setVisible(false);\r
+\r
+        setViewMode(ModeFullView);\r
+        // focusChangeでupdateActionsされるので不要\r
+//        updateActions();\r
+    }\r
+    else {\r
+        ui->pane3->setVisible(false);\r
     }\r
 \r
-    m_focusedView = folderView();\r
-    ui->pane3->setViewItem(info);\r
-    ui->splitter->setVisible(false);\r
+    setUpdatesEnabled(true);\r
 }\r
 \r
 void MainWindow::openEditor(const QString &path)\r
 {\r
     qDebug() << "MainWindow::openEditor";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     QSettings settings;\r
     QString exe = settings.value(IniKey_EditorPath).toString();\r
     if (exe.isEmpty()) {\r
@@ -855,12 +757,9 @@ void MainWindow::openEditor(const QString &path)
         return;\r
     }\r
 \r
-    FolderView *v = folderView();\r
-    Q_ASSERT(v);\r
-\r
     QFileInfoList list;\r
     if (path.isEmpty()) {\r
-        list = v->selectedItems();\r
+        list = view->selectedItems();\r
     }\r
     else {\r
         list << path;\r
@@ -878,6 +777,7 @@ void MainWindow::openEditor(const QString &path)
         if (!startProcess(command, info.absolutePath(), tr("外部エディタの起動に失敗しました。"))) {\r
             break;\r
         }\r
+        Sleep(100);\r
     }\r
 }\r
 \r
@@ -885,6 +785,9 @@ void MainWindow::openTerminal()
 {\r
     qDebug() << "MainWindow::openTerminal";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     QSettings settings;\r
     QString exe = settings.value(IniKey_TerminalPath).toString();\r
     if (exe.isEmpty()) {\r
@@ -894,10 +797,7 @@ void MainWindow::openTerminal()
         return;\r
     }\r
 \r
-    FolderView *v = folderView();\r
-    Q_ASSERT(v);\r
-\r
-    foreach (const QFileInfo &info, v->selectedItems()) {\r
+    foreach (const QFileInfo &info, view->selectedItems()) {\r
         QString opt = settings.value(IniKey_TerminalOption).toString();\r
         replaceVars(opt, info);\r
 \r
@@ -909,6 +809,7 @@ void MainWindow::openTerminal()
         if (!startProcess(command, info.absolutePath(), tr("ターミナルの起動に失敗しました。"))) {\r
             break;\r
         }\r
+        Sleep(100);\r
     }\r
 }\r
 \r
@@ -916,17 +817,20 @@ void MainWindow::refresh()
 {\r
     qDebug() << "MainWindow::refresh();";\r
 \r
-    folderView()->refresh();\r
-    updateActions();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->refresh();\r
 }\r
 \r
 void MainWindow::renameItems()\r
 {\r
     qDebug() << "MainWindow::renameItems";\r
 \r
-    FolderView *v = folderView();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
 \r
-    QFileInfoList list = v->selectedItems();\r
+    QFileInfoList list = view->selectedItems();\r
     if (list.isEmpty()) {\r
         return;\r
     }\r
@@ -938,7 +842,7 @@ void MainWindow::renameItems()
     else {\r
         dlg = new RenameMultiDialog(this);\r
     }\r
-    dlg->setWorkingDirectory(v->dir());\r
+    dlg->setWorkingDirectory(view->dir());\r
     dlg->setNames(list);\r
     int dlgResult = dlg->exec();\r
     if (dlgResult != QDialog::Accepted || dlg->renameMap().isEmpty()) {\r
@@ -979,24 +883,16 @@ void MainWindow::retrieveStart(const QString &path)
     qDebug() << "MainWindow::retrieveStart();" << path;\r
 \r
     ui->statusBar->showMessage(tr("ファイルリストを取得しています..."));\r
-    if (sender() == ui->pane1->folderPanel()->folderView()) {\r
-        ui->pane1->folderPanel()->locationBox()->setText(path);\r
-    }\r
-    else {\r
-        Q_ASSERT(sender() == ui->pane2->folderPanel()->folderView());\r
-        ui->pane2->folderPanel()->locationBox()->setText(path);\r
-    }\r
 }\r
 \r
 void MainWindow::shellExecute()\r
 {\r
     qDebug() << "MainWindow::shellExecute";\r
 \r
-    FolderView *v = folderView();\r
-    Q_ASSERT(v);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
 \r
-    QFileInfoList list = v->selectedItems();\r
-    foreach (const QFileInfo &info, list) {\r
+    foreach (const QFileInfo &info, view->selectedItems()) {\r
         QString path = QDir::toNativeSeparators(info.absoluteFilePath());\r
         QDesktopServices::openUrl(QUrl("file:///" + path));\r
     }\r
@@ -1006,7 +902,10 @@ void MainWindow::showFilterDialog()
 {\r
     qDebug() << "MainWindow::showFilterDialog();";\r
 \r
-    QString filters = folderView()->nameFilters().join(" ");\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    QString filters = view->nameFilters().join(" ");\r
 \r
     QInputDialog dlg(this);\r
     dlg.setInputMode(QInputDialog::TextInput);\r
@@ -1016,7 +915,8 @@ void MainWindow::showFilterDialog()
     dlg.resize(width() * 0.8, dlg.height());\r
 \r
     if (dlg.exec() == QDialog::Accepted) {\r
-        setNameFilters(folderView(), dlg.textValue());\r
+        static_cast<FolderPanel*>(view->parent())->setNameFilters(dlg.textValue());\r
+        view->refresh();\r
     }\r
 }\r
 \r
@@ -1024,27 +924,28 @@ void MainWindow::showHistoryDialog()
 {\r
     qDebug() << "MainWindow::showHistoryDialog();";\r
 \r
-    FolderView *v = folderView();\r
-    FolderView *vOther = otherSideView(v);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    FolderView *vOther = otherSideFolderView(view);\r
 \r
     HistoryDialog dlg(this);\r
-    if (v->side() == "Left") {\r
+    if (view->side() == "Left") {\r
         dlg.setDefaultLeft(true);\r
-        dlg.setHistory(v->history(), vOther->history());\r
+        dlg.setHistory(view->history(), vOther->history());\r
     }\r
     else {\r
         dlg.setDefaultLeft(false);\r
-        dlg.setHistory(vOther->history(), v->history());\r
+        dlg.setHistory(vOther->history(), view->history());\r
     }\r
 \r
     if (dlg.exec() == QDialog::Accepted) {\r
-        if (v->side() == dlg.selectedSide()) {\r
-            v->setHistoryIndexAt(dlg.selectedIndex());\r
+        if (view->side() == dlg.selectedSide()) {\r
+            view->setHistoryIndexAt(dlg.selectedIndex());\r
         }\r
         else {\r
-            v->setPath(vOther->history()->at(dlg.selectedIndex()), true);\r
+            view->setPath(vOther->history()->at(dlg.selectedIndex()), true);\r
         }\r
-        updateActions();\r
     }\r
 }\r
 \r
@@ -1052,14 +953,16 @@ void MainWindow::showSortDialog()
 {\r
     qDebug() << "MainWindow::showSortDialog();";\r
 \r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
     SortDialog dlg(this);\r
-    dlg.setRightOrLeft(folderView()->side());\r
+    dlg.setRightOrLeft(view->side());\r
 \r
-    if (dlg.exec() != QDialog::Accepted) {\r
-        return;\r
+    if (dlg.exec() == QDialog::Accepted) {\r
+        view->setSorting();\r
+        view->refresh();\r
     }\r
-\r
-    setSorting(folderView());\r
 }\r
 \r
 void MainWindow::swapView()\r
@@ -1079,122 +982,113 @@ void MainWindow::switchHalfMode(bool checked)
 {\r
     qDebug() << "MainWindow::switchHalfMode();" << checked;\r
 \r
-    FolderView *view;\r
-    if (checked) {\r
-        view = ui->pane1->folderPanel()->folderView();\r
-        if (view->hasFocus()) {\r
-            ui->pane2->setViewItem(view->currentItem());\r
-            updateActions();\r
-//            view->setFocus();\r
-            return;\r
-        }\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
 \r
-        view = ui->pane2->folderPanel()->folderView();\r
-        if (view->hasFocus()) {\r
-            ui->pane1->setViewItem(view->currentItem());\r
-            updateActions();\r
-//            view->setFocus();\r
-            return;\r
-        }\r
+    AnyView *pane = static_cast<AnyView*>(\r
+                otherSideFolderView(view)->parent()->parent());\r
+    Q_CHECK_PTR(pane);\r
+\r
+    if (checked) {\r
+        // ハーフモードへ移行する\r
+        setViewMode(ModeHalfView);\r
+        pane->setViewItem(view->currentItem());\r
     }\r
     else {\r
-        view = ui->pane1->folderPanel()->folderView();\r
-        if (view->isVisible()) {\r
-            ui->pane2->changeView(AnyView::ViewFolder);\r
-            updateActions();\r
-            return;\r
-        }\r
-\r
-        view = ui->pane2->folderPanel()->folderView();\r
-        if (view->isVisible()) {\r
-            ui->pane1->changeView(AnyView::ViewFolder);\r
-            updateActions();\r
-            return;\r
-        }\r
+        // ハーフモードを解除する\r
+        setViewMode(ModeBasic);\r
+        pane->changeView(AnyView::ViewFolder);\r
     }\r
+    updateActions();\r
 }\r
 \r
-void MainWindow::setSorting(FolderView *view)\r
-{\r
-    qDebug() << "MainWindow::setSorting();" << view->objectName();\r
+//void MainWindow::setSorting(FolderView *view)\r
+//{\r
+//    qDebug() << "MainWindow::setSorting();" << view->objectName();\r
 \r
-    QSettings settings;\r
-    QDir::SortFlags flags;\r
+//    QSettings settings;\r
+//    QDir::SortFlags flags;\r
 \r
-    int sortBy = settings.value(view->side() + slash + IniKey_SortBy).toInt();\r
-    switch (sortBy) {\r
-    case SortByDate:    flags |= QDir::Time; break;\r
-    case SortBySize:    flags |= QDir::Size; break;\r
-    case SortByType:    flags |= QDir::Type; break;\r
-    default:            flags |= QDir::Name; break;\r
-    }\r
+//    int sortBy = settings.value(view->side() + slash + IniKey_SortBy).toInt();\r
+//    switch (sortBy) {\r
+//    case SortByDate:    flags |= QDir::Time; break;\r
+//    case SortBySize:    flags |= QDir::Size; break;\r
+//    case SortByType:    flags |= QDir::Type; break;\r
+//    default:            flags |= QDir::Name; break;\r
+//    }\r
 \r
-    // デフォルトだと文字列は昇順で、数値は降順…orz\r
-    int orderBy = settings.value(view->side() + slash + IniKey_OrderBy).toInt();\r
-    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
-        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
-    {\r
-        flags |= QDir::Reversed;\r
-    }\r
+//    // デフォルトだと文字列は昇順で、数値は降順…orz\r
+//    int orderBy = settings.value(view->side() + slash + IniKey_OrderBy).toInt();\r
+//    if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||\r
+//        ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))\r
+//    {\r
+//        flags |= QDir::Reversed;\r
+//    }\r
 \r
-    switch (settings.value(view->side() + slash + IniKey_PutDirs).toInt()) {\r
-    case PutDirsFirst:  flags |= QDir::DirsFirst; break;\r
-    case PutDirsLast:   flags |= QDir::DirsLast; break;\r
-    }\r
+//    switch (settings.value(view->side() + slash + IniKey_PutDirs).toInt()) {\r
+//    case PutDirsFirst:  flags |= QDir::DirsFirst; break;\r
+//    case PutDirsLast:   flags |= QDir::DirsLast; break;\r
+//    }\r
 \r
-    if (settings.value(view->side() + slash + IniKey_IgnoreCase).toBool()) {\r
-        flags |= QDir::IgnoreCase;\r
-    }\r
+//    if (settings.value(view->side() + slash + IniKey_IgnoreCase).toBool()) {\r
+//        flags |= QDir::IgnoreCase;\r
+//    }\r
 \r
-    view->setSorting(flags);\r
-}\r
+//    view->setSorting(flags);\r
+//}\r
 \r
-void MainWindow::showNameFilters(FolderView *view)\r
-{\r
-    filterLabel(view)->setText(tr("フィルタ:") + view->nameFilters().join(" "));\r
-}\r
+//void MainWindow::showNameFilters(FolderView *view)\r
+//{\r
+//    QLabel *label = view->parent()->findChild<QLabel*>("filterLabel");\r
+//    Q_CHECK_PTR(label);\r
+\r
+//    label->setText(tr("フィルタ:") + view->nameFilters().join(" "));\r
+//}\r
 \r
 void MainWindow::searchItem(const QString &text)\r
 {\r
     qDebug() << "MainWindow::searchItem" << text;\r
 \r
-    FolderView *v;\r
-    SearchBox *box;\r
-    if (ui->pane1->folderPanel()->serachBox()->hasFocus()) {\r
-        v = ui->pane1->folderPanel()->folderView();\r
-        box = ui->pane1->folderPanel()->serachBox();\r
-    }\r
-    else {\r
-        Q_ASSERT(ui->pane2->folderPanel()->serachBox()->hasFocus());\r
-        v = ui->pane2->folderPanel()->folderView();\r
-        box = ui->pane2->folderPanel()->serachBox();\r
-    }\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    SearchBox *box = view->parent()->findChild<SearchBox*>("searchBox");\r
+    Q_CHECK_PTR(box);\r
 \r
     if (text.right(1) == "/") {\r
+        // '/'が入力されたら、検索終了\r
         box->setText(text.left(text.length() - 1));\r
         ui->action_Search->setChecked(false);\r
-        return;\r
     }\r
-\r
-    v->searchItem(box->text());\r
+    else {\r
+        view->searchItem(box->text());\r
+    }\r
 }\r
 \r
 void MainWindow::searchNext()\r
 {\r
     qDebug() << "MainWindow::searchNext";\r
 \r
-    FolderView *v = folderView();\r
-    SearchBox *box = searchBox(v);\r
-    v->searchNext(box->text());\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    SearchBox *box = view->parent()->findChild<SearchBox*>("searchBox");\r
+    Q_CHECK_PTR(box);\r
+\r
+    view->searchNext(box->text());\r
 }\r
 \r
 void MainWindow::searchPrev()\r
 {\r
     qDebug() << "MainWindow::searchPrev";\r
 \r
-    FolderView *v = folderView();\r
-    SearchBox *box = searchBox(v);\r
-    v->searchPrev(box->text());\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    SearchBox *box = view->parent()->findChild<SearchBox*>("searchBox");\r
+    Q_CHECK_PTR(box);\r
+\r
+    view->searchPrev(box->text());\r
 }\r
 \r
 void MainWindow::setCursorToBegin()\r
@@ -1203,37 +1097,14 @@ void MainWindow::setCursorToBegin()
 \r
     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier);\r
     QApplication::sendEvent(QApplication::focusWidget(), &event);\r
-//    if (ui->textView->hasFocus()) {\r
-//        QTextCursor cursor = ui->textView->textCursor();\r
-//        cursor.movePosition(QTextCursor::Start);\r
-//        ui->textView->setTextCursor(cursor);\r
-//    }\r
-//    else {\r
-//        FolderView *v = folderView();\r
-//        int row = 0;\r
-//        v->setCurrentIndex(v->model()->index(row, 0));\r
-//    }\r
 }\r
 \r
 void MainWindow::cursorDown()\r
 {\r
     qDebug() << "MainWindow::cursorDown();";\r
 \r
-    QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::DownArrow, Qt::NoModifier);\r
+    QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);\r
     QApplication::sendEvent(QApplication::focusWidget(), &event);\r
-\r
-//    if (ui->textView->hasFocus()) {\r
-//        QTextCursor cursor = ui->textView->textCursor();\r
-//        cursor.movePosition(QTextCursor::Down);\r
-//        ui->textView->setTextCursor(cursor);\r
-//    }\r
-//    else {\r
-//        FolderView *v = folderView();\r
-//        int row = v->currentIndex().row() + 1;\r
-//        if (row < v->model()->rowCount()) {\r
-//            v->setCurrentIndex(v->model()->index(row, 0));\r
-//        }\r
-//    }\r
 }\r
 \r
 void MainWindow::cursorUp()\r
@@ -1242,19 +1113,6 @@ void MainWindow::cursorUp()
 \r
     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);\r
     QApplication::sendEvent(QApplication::focusWidget(), &event);\r
-\r
-//    if (ui->textView->hasFocus()) {\r
-//        QTextCursor cursor = ui->textView->textCursor();\r
-//        cursor.movePosition(QTextCursor::Up);\r
-//        ui->textView->setTextCursor(cursor);\r
-//    }\r
-//    else {\r
-//        FolderView *v = folderView();\r
-//        int row = v->currentIndex().row() - 1;\r
-//        if (row >= 0) {\r
-//            v->setCurrentIndex(v->model()->index(row, 0));\r
-//        }\r
-//    }\r
 }\r
 \r
 void MainWindow::setCursorToEnd()\r
@@ -1263,17 +1121,6 @@ void MainWindow::setCursorToEnd()
 \r
     QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier);\r
     QApplication::sendEvent(QApplication::focusWidget(), &event);\r
-\r
-//    if (ui->textView->hasFocus()) {\r
-//        QTextCursor cursor = ui->textView->textCursor();\r
-//        cursor.movePosition(QTextCursor::End);\r
-//        ui->textView->setTextCursor(cursor);\r
-//    }\r
-//    else {\r
-//        FolderView *v = folderView();\r
-//        int row = v->model()->rowCount() - 1;\r
-//        v->setCurrentIndex(v->model()->index(row, 0));\r
-//    }\r
 }\r
 \r
 void MainWindow::setFontSizeDown()\r
@@ -1286,6 +1133,7 @@ void MainWindow::setFontSizeDown()
 void MainWindow::setFontSizeUp()\r
 {\r
     qDebug() << "MainWindow::setFontSizeUp();";\r
+\r
     changeFontSize(1);\r
 }\r
 \r
@@ -1293,6 +1141,8 @@ void MainWindow::changeFontSize(int diff)
 {\r
     QSettings settings;\r
     QFont font;\r
+\r
+    // フォルダビューのフォントサイズ変更\r
     if (ui->pane1->folderPanel()->folderView()->hasFocus() ||\r
         ui->pane2->folderPanel()->folderView()->hasFocus())\r
     {\r
@@ -1303,11 +1153,18 @@ void MainWindow::changeFontSize(int diff)
         ui->pane1->folderPanel()->folderView()->updateAppearance();\r
         ui->pane2->folderPanel()->folderView()->updateAppearance();\r
     }\r
-    if (ui->pane3->textView()->hasFocus()) {\r
+\r
+    // テキストビューのフォントサイズ変更\r
+    if (ui->pane1->textView()->hasFocus() ||\r
+        ui->pane2->textView()->hasFocus() ||\r
+        ui->pane3->textView()->hasFocus())\r
+    {\r
         font = settings.value(IniKey_ViewerFont).value<QFont>();\r
         font.setPointSize(font.pointSize() + diff);\r
         settings.setValue(IniKey_ViewerFont, font);\r
 \r
+        ui->pane1->textView()->updateAppearance();\r
+        ui->pane2->textView()->updateAppearance();\r
         ui->pane3->textView()->updateAppearance();\r
     }\r
 }\r
@@ -1316,41 +1173,47 @@ void MainWindow::setPathFromOther()
 {\r
     qDebug() << "MainWindow::setPathFromOther();";\r
 \r
-    FolderView *view = folderView();\r
-    FolderView *other = otherSideView(view);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    FolderView *other = otherSideFolderView(view);\r
 \r
     view->setPath(other->dir(), true);\r
-    updateActions();\r
 }\r
 \r
 void MainWindow::setPathToHome()\r
 {\r
     qDebug() << "MainWindow::setPathToHome();";\r
 \r
-    folderView()->setPath(QDir::homePath(), true);\r
-    updateActions();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->setPath(QDir::homePath(), true);\r
 }\r
 \r
 void MainWindow::setPathToOther()\r
 {\r
     qDebug() << "MainWindow::setPathToOther();";\r
 \r
-    FolderView *view = folderView();\r
-    FolderView *other = otherSideView(view);\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    FolderView *other = otherSideFolderView(view);\r
 \r
     other->setPath(view->dir(), true);\r
-    updateActions();\r
 }\r
 \r
 void MainWindow::setPathToParent()\r
 {\r
     qDebug() << "MainWindow::setPathToParent();";\r
 \r
-    QDir dir(folderView()->dir());\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    QDir dir(view->dir());\r
     if (!dir.isRoot()) {\r
         dir.cdUp();\r
-        folderView()->setPath(dir.absolutePath(), true);\r
-        updateActions();\r
+        view->setPath(dir.absolutePath(), true);\r
     }\r
 }\r
 \r
@@ -1358,67 +1221,68 @@ void MainWindow::setPathToRoot()
 {\r
     qDebug() << "MainWindow::setPathToRoot();";\r
 \r
-    folderView()->setPath(QDir::rootPath(), true);\r
-    updateActions();\r
+    FolderView *view = static_cast<FolderView*>(qApp->focusWidget());\r
+    Q_CHECK_PTR(view);\r
+\r
+    view->setPath(QDir::rootPath(), true);\r
 }\r
 \r
 void MainWindow::toggleSearchBox(bool checked)\r
 {\r
     qDebug() << "MainWindow::toggleSearchBox" << checked;\r
 \r
-    FolderView *v;\r
+    FolderView *view;\r
     SearchBox *box;\r
 \r
     if (checked) {\r
-        v = folderView();\r
-        if (v == ui->pane1->folderPanel()->folderView()) {\r
-            box = ui->pane1->folderPanel()->serachBox();\r
-        }\r
-        else {\r
-            Q_ASSERT(v == ui->pane2->folderPanel()->folderView());\r
-            box = ui->pane2->folderPanel()->serachBox();\r
-        }\r
+        setViewMode(m_viewMode | ModeSearch);\r
+        view = static_cast<FolderView*>(qApp->focusWidget());\r
+        Q_CHECK_PTR(view);\r
+\r
+        box = view->parent()->findChild<SearchBox*>("searchBox");\r
+        Q_CHECK_PTR(box);\r
 \r
         box->setVisible(true);\r
         box->setFocus();\r
         box->selectAll();\r
     }\r
     else {\r
-        if (ui->pane1->folderPanel()->serachBox()->isVisible()) {\r
-            box = ui->pane1->folderPanel()->serachBox();\r
-            v = ui->pane1->folderPanel()->folderView();\r
+        setViewMode(m_viewMode ^ ModeSearch);\r
+        if (ui->pane1->folderPanel()->searchBox()->isVisible()) {\r
+            box = ui->pane1->folderPanel()->searchBox();\r
+            view = ui->pane1->folderPanel()->folderView();\r
         }\r
         else {\r
-            Q_ASSERT(ui->pane2->folderPanel()->serachBox()->isVisible());\r
-            box = ui->pane2->folderPanel()->serachBox();\r
-            v = ui->pane2->folderPanel()->folderView();\r
+            Q_ASSERT(ui->pane2->folderPanel()->searchBox()->isVisible());\r
+            box = ui->pane2->folderPanel()->searchBox();\r
+            view = ui->pane2->folderPanel()->folderView();\r
         }\r
 \r
         if (box->hasFocus()) {\r
-            v->setFocus();\r
+            view->setFocus();\r
         }\r
         box->setVisible(false);\r
     }\r
 }\r
 \r
-void MainWindow::openRequest(const QFileInfo &info)\r
-{\r
-    m_focusedView = QApplication::focusWidget();\r
+//void MainWindow::openRequest(const QFileInfo &info)\r
+//{\r
+//    m_focusedView = QApplication::focusWidget();\r
 \r
-    QFile file(info.absoluteFilePath());\r
-    if (file.open(QIODevice::ReadOnly)) {\r
-        ui->splitter->setVisible(false);\r
+//    QFile file(info.absoluteFilePath());\r
+//    if (file.open(QIODevice::ReadOnly)) {\r
+//        ui->splitter->setVisible(false);\r
 //        ui->textView->setVisible(true);\r
 //        ui->textView->setFocus();\r
 //        ui->textView->setSource(file.readAll());\r
-        file.close();\r
-    }\r
-    else {\r
-        QMessageBox::critical(\r
-                    this, tr("エラー"),\r
-                    tr("ファイルの読み込みに失敗しました。"));\r
-    }\r
-}\r
+//        file.close();\r
+//    }\r
+//    else {\r
+//        QMessageBox::critical(\r
+//                    this, tr("エラー"),\r
+//                    tr("ファイルの読み込みに失敗しました。"));\r
+//    }\r
+//}\r
 \r
 void MainWindow::showPreferenceDialog()\r
 {\r
@@ -1465,6 +1329,8 @@ void MainWindow::showContextMenu(QContextMenuEvent *event)
     qDebug() << "MainWindow::showContextMenu();";\r
 \r
     FolderView *view = static_cast<FolderView*>(sender());\r
+    Q_CHECK_PTR(view);\r
+\r
     QModelIndex index = view->indexAt(event->pos());\r
 \r
     QMenu menu(this);\r
@@ -1488,7 +1354,6 @@ void MainWindow::showContextMenu(QContextMenuEvent *event)
     }\r
 \r
     menu.exec(event->globalPos());\r
-\r
 }\r
 \r
 void MainWindow::checkUpdate(bool silent)\r
@@ -1547,17 +1412,16 @@ void MainWindow::checkUpdateFinished(QNetworkReply *reply, bool silent)
     }\r
 }\r
 \r
-void MainWindow::viewFinish(QWidget *sender)\r
+void MainWindow::viewFinish()\r
 {\r
-    qDebug() << "MainWindow::viewFinish();" << sender->objectName();\r
+    qDebug() << "MainWindow::viewFinish();" << sender()->objectName();\r
 \r
-//    sender->setVisible(false);\r
+    ui->statusBar->findChild<QLabel*>("Right")->setText("");\r
     ui->pane3->setVisible(false);\r
     ui->splitter->setVisible(true);\r
     m_focusedView->setFocus();\r
 }\r
 \r
-\r
 void MainWindow::initActionConnections()\r
 {\r
     qDebug() << "MainWindow::initActionConnections";\r
@@ -1614,29 +1478,6 @@ void MainWindow::initActionConnections()
     connect(ui->view_ToOther, SIGNAL(triggered()), this, SLOT(setPathToOther()));\r
 }\r
 \r
-FolderView *MainWindow::folderView() const\r
-{\r
-    qDebug() << "MainWindow::folderView";\r
-\r
-    QWidget *w = qApp->focusWidget();\r
-    if (w == ui->pane1->folderPanel()->folderView() ||\r
-        w == ui->pane1->folderPanel()->serachBox() ||\r
-        w == ui->pane1->folderPanel()->locationBox())\r
-    {\r
-        return ui->pane1->folderPanel()->folderView();\r
-    }\r
-\r
-    if (w == ui->pane2->folderPanel()->folderView() ||\r
-        w == ui->pane2->folderPanel()->serachBox() ||\r
-        w == ui->pane2->folderPanel()->locationBox())\r
-    {\r
-        return ui->pane2->folderPanel()->folderView();\r
-    }\r
-\r
-    qDebug() << w->objectName();\r
-    return NULL;\r
-}\r
-\r
 void MainWindow::replaceVars(QString &str, const QFileInfo info)\r
 {\r
     qDebug() << "MainWindow::replaceVars" << str;\r
@@ -1653,19 +1494,25 @@ void MainWindow::replaceVars(QString &str, const QFileInfo info)
     str.replace("$P", info.absoluteFilePath());\r
 }\r
 \r
-SearchBox *MainWindow::searchBox(FolderView *view) const\r
+FolderView* MainWindow::otherSideFolderView(const FolderView *view) const\r
 {\r
-    qDebug() << "MainWindow::searchBox()" << view->objectName();\r
+    qDebug() << "MainWindow::otherSideFolderView()";\r
 \r
     if (view == ui->pane1->folderPanel()->folderView()) {\r
-        return ui->pane1->folderPanel()->serachBox();\r
+        return ui->pane2->folderPanel()->folderView();\r
     }\r
     else {\r
-        Q_ASSERT(view == ui->pane1->folderPanel()->folderView());\r
-        return ui->pane2->folderPanel()->serachBox();\r
+        Q_ASSERT(view == ui->pane2->folderPanel()->folderView());\r
+        return ui->pane1->folderPanel()->folderView();\r
     }\r
 }\r
 \r
+void MainWindow::setViewMode(ModeFlags flags)\r
+{\r
+    qDebug() << "MainWindow::setViewMode();" << flags;\r
+    m_viewMode = flags;\r
+}\r
+\r
 bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const QString &errMsg)\r
 {\r
     qDebug() << "MainWindow::startProcess" << cmd << workDir << errMsg;\r
@@ -1681,14 +1528,72 @@ bool MainWindow::startProcess(const QString &cmd, const QString &workDir, const
 \r
 void MainWindow::updateActions()\r
 {\r
-    qDebug() << "MainWindow::updateActions";\r
+    qDebug() << "MainWindow::updateActions" << m_viewMode;\r
+\r
+    QWidget *w = qApp->focusWidget();\r
+    FolderView *view;\r
+    if ((view = qobject_cast<FolderView*>(w))) {\r
+        setEnabledAllActions(true);\r
+        ui->action_SearchNext->setEnabled(false);\r
+        ui->action_SearchPrev->setEnabled(false);\r
 \r
-    QWidget *w = QApplication::focusWidget();\r
-    if (qobject_cast<SimpleTextView*>(w) != NULL ||\r
-        ui->pane1->textView()->isVisible() ||\r
-        ui->pane2->textView()->isVisible())\r
+        // 「開く」アクションを変更する\r
+        QFileInfo info(view->currentItem());\r
+        if (info.isDir()) {\r
+            ui->action_Open->setIcon(QIcon(":/images/Open.png"));\r
+            ui->action_Open->setText(tr("開く"));\r
+            ui->action_Open->setToolTip(tr("開く"));\r
+        }\r
+        else {\r
+            ui->action_Open->setIcon(QIcon(":/images/Search text.png"));\r
+            ui->action_Open->setText(tr("内蔵ビューアで開く"));\r
+            ui->action_Open->setToolTip(tr("内蔵ビューアで開く"));\r
+\r
+            QSettings settings;\r
+            if (!settings.value(IniKey_ViewerForceOpen).toBool()) {\r
+                QStringList list = settings.value(IniKey_ViewerIgnoreExt).toString().split(",");\r
+                foreach (const QString &ext, list) {\r
+                    if (ext.toLower() == info.suffix().toLower()) {\r
+                        ui->action_Open->setEnabled(false);\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        if (m_viewMode & ModeBasic) {\r
+            qDebug() << ">>>>> 通常モードのメニュー設定 <<<<<";\r
+            ui->action_SearchNext->setEnabled(false);\r
+            ui->action_SearchPrev->setEnabled(false);\r
+\r
+            ui->move_Back->setEnabled(!view->history()->isBegin());\r
+            ui->move_Forward->setEnabled(!view->history()->isEnd());\r
+\r
+            QSettings settings;\r
+            ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
+            ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
+\r
+        }\r
+        else if (!otherSideFolderView(view)->isVisible()) {\r
+            qDebug() << ">>>>> ハーフモードのメニュー設定 <<<<<";\r
+            ui->view_FromOther->setEnabled(false);\r
+            ui->view_ToOther->setEnabled(false);\r
+            ui->cmd_Copy->setEnabled(false);\r
+            ui->cmd_Move->setEnabled(false);\r
+        }\r
+    }\r
+    else if (qobject_cast<SearchBox*>(w)) {\r
+        qDebug() << ">>>>> 検索モードのメニュー設定 <<<<<";\r
+        setEnabledAllActions(false);\r
+        ui->action_Search->setEnabled(true);\r
+        ui->action_SearchNext->setEnabled(true);\r
+        ui->action_SearchPrev->setEnabled(true);\r
+        ui->help_About->setEnabled(true);\r
+    }\r
+    else if (qobject_cast<SimpleImageView*>(w) ||\r
+             qobject_cast<SimpleTextView*>(w))\r
     {\r
-        // テキストビューア時\r
+        qDebug() << ">>>>> ビューアモードのメニュー設定 <<<<<";\r
         setEnabledAllActions(false);\r
         ui->action_Quit->setEnabled(true);\r
         ui->action_Setting->setEnabled(true);\r
@@ -1702,37 +1607,10 @@ void MainWindow::updateActions()
         ui->help_About->setEnabled(true);\r
         ui->key_Left->setEnabled(true);\r
         ui->key_Right->setEnabled(true);\r
-        // 片面ビューアモード時\r
-        if (ui->pane1->textView()->isVisible() ||\r
-            ui->pane2->textView()->isVisible())\r
-        {\r
+        if (m_viewMode & ModeHalfView) {\r
             ui->view_HalfMode->setEnabled(true);\r
         }\r
     }\r
-    else if (qobject_cast<SearchBox*>(w) != NULL) {\r
-        // ファイル検索時\r
-        setEnabledAllActions(false);\r
-        ui->action_Search->setEnabled(true);\r
-        ui->action_SearchNext->setEnabled(true);\r
-        ui->action_SearchPrev->setEnabled(true);\r
-        ui->help_About->setEnabled(true);\r
-    }\r
-    else if (qobject_cast<FolderView*>(w) != NULL) {\r
-        // 通常時\r
-        setEnabledAllActions(true);\r
-        ui->action_SearchNext->setEnabled(false);\r
-        ui->action_SearchPrev->setEnabled(false);\r
-\r
-        ui->move_Back->setEnabled(!folderView()->history()->isBegin());\r
-        ui->move_Forward->setEnabled(!folderView()->history()->isEnd());\r
-\r
-        QSettings settings;\r
-        ui->action_OpenEditor->setEnabled(!settings.value(IniKey_EditorPath).toString().isEmpty());\r
-        ui->action_OpenTerminal->setEnabled(!settings.value(IniKey_TerminalPath).toString().isEmpty());\r
-    }\r
-    else if (w){\r
-        qDebug() << w->objectName() << "has focus.";\r
-    }\r
 }\r
 \r
 void MainWindow::setEnabledAllActions(bool enable)\r
@@ -1746,32 +1624,10 @@ void MainWindow::setEnabledAllActions(bool enable)
     }\r
 }\r
 \r
-void MainWindow::setNameFilters(FolderView *view, const QString &filters)\r
-{\r
-    qDebug() << "MainWindow::setNameFilters();" << view->objectName() << filters;\r
-\r
-    QStringList list = filters.split(" ", QString::SkipEmptyParts);\r
-    if (list.isEmpty()) {\r
-        list << "*";\r
-    }\r
-    view->setNameFilters(list);\r
-    showNameFilters(view);\r
-}\r
-\r
-QLabel *MainWindow::filterLabel(const FolderView *view) const\r
-{\r
-    qDebug() << "MainWindow::filterLabel()" << view->objectName();\r
-    if (view == ui->pane1->folderPanel()->folderView()) {\r
-        return ui->pane1->folderPanel()->filterLabel();\r
-    }\r
-    else {\r
-        Q_ASSERT(view == ui->pane2->folderPanel()->folderView());\r
-        return ui->pane2->folderPanel()->filterLabel();\r
-    }\r
-}\r
-\r
 void MainWindow::about()\r
 {\r
+    qDebug() << ">>>>> about <<<<<";\r
+\r
     QMessageBox::about(\r
                 this,\r
                 tr("げふぅ について"),\r
@@ -1784,6 +1640,8 @@ void MainWindow::about()
 \r
 void MainWindow::closeEvent(QCloseEvent *event)\r
 {\r
+    qDebug() << "MainWindow::closeEvent();";\r
+    qDebug() << ">>>>> アプリケーションの終了要求 <<<<<";\r
     QSettings settings;\r
 \r
     if (settings.value(IniKey_ConfirmExit).toBool()) {\r
@@ -1796,6 +1654,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
         msgBox.setIcon(QMessageBox::Question);\r
 \r
         if (msgBox.exec() == QMessageBox::No) {\r
+            qDebug() << ">>>>> ユーザによりキャンセルされました <<<<<";\r
             event->ignore();\r
             return;\r
         }\r
@@ -1815,7 +1674,13 @@ void MainWindow::closeEvent(QCloseEvent *event)
 void MainWindow::keyPressEvent(QKeyEvent *event)\r
 {\r
     QString ksq = KeyEventToSequence(event);\r
-    qDebug() << ksq << " @MainWindow";\r
+\r
+    qDebug() << ">>>>> キーイベントを受信" << ksq << "<<<<<";\r
+\r
+    if (ProcessShortcut(ksq, this)) {\r
+        event->accept();\r
+        return;\r
+    }\r
 \r
     QMainWindow::keyPressEvent(event);\r
 }\r
index 7bbbef8..28a4ae1 100644 (file)
@@ -5,10 +5,11 @@
 #include <QModelIndex>\r
 #include <QMainWindow>\r
 class QNetworkReply;\r
-class FolderView;\r
-class SearchBox;\r
 class OverWriteDialog;\r
 class QLabel;\r
+class FolderView;\r
+class SearchBox;\r
+class AnyView;\r
 \r
 namespace Ui {\r
 class MainWindow;\r
@@ -25,8 +26,6 @@ public:
     explicit MainWindow(QWidget *parent = 0);\r
     ~MainWindow();\r
 \r
-    FolderView *otherSideView(const FolderView *view) const;\r
-\r
 signals:\r
     void showHiddenFiles(bool show);\r
     void showSystemFiles(bool show);\r
@@ -36,13 +35,12 @@ public slots:
                       const QString &srcPath, const QString &tgtPath);\r
 \r
     void currentChange(const QFileInfo &info);\r
-    void dataChange();\r
     void dropAccept(const QFileInfoList &list);\r
     void focusChange(QWidget * old, QWidget * now);\r
-//    void keyPress(QKeyEvent *event);\r
     void leftKeyPress();\r
     void rightKeyPress();\r
     void returnPressInSearchBox();\r
+    void showFileInfo(const QString &str);\r
 \r
     void about();\r
     void checkUpdate(bool silent = false);\r
@@ -100,13 +98,21 @@ public slots:
 \r
     void showContextMenu(QContextMenuEvent *event);\r
 \r
-    void openRequest(const QFileInfo &info);\r
-    void viewFinish(QWidget *sender);\r
+    void viewFinish();\r
 \r
 private:\r
+    enum Mode {\r
+        ModeBasic = 0x00,\r
+        ModeSearch = 0x01,\r
+        ModeFullView = 0x02,\r
+        ModeHalfView = 0x04,\r
+    };\r
+    typedef QFlags<Mode> ModeFlags;\r
+\r
     Ui::MainWindow *ui;\r
     QWidget *m_focusedView;\r
     OverWriteDialog *m_overwriteDialog;\r
+    ModeFlags m_viewMode;\r
 \r
     // action\r
     void initActionConnections();\r
@@ -114,16 +120,15 @@ private:
     bool startProcess(const QString &cmd, const QString &workDir, const QString &errMsg);\r
     void updateActions();\r
     void setEnabledAllActions(bool enable);\r
-    void setNameFilters(FolderView *view, const QString& filters = QString());\r
-    void setSorting(FolderView *view);\r
     void showNameFilters(FolderView *view);\r
     void copyItems(const QFileInfoList &list, const QString &tgtDir);\r
     void changeFontSize(int diff);\r
 \r
     // getter\r
-    QLabel* filterLabel(const FolderView *view) const;\r
-    FolderView* folderView() const;\r
-    SearchBox* searchBox(FolderView *view) const;\r
+    FolderView* otherSideFolderView(const FolderView *view) const;\r
+\r
+    // setter\r
+    void setViewMode(ModeFlags flags);\r
 \r
     // QWidget interface\r
 protected:\r
index 6c2d60b..839952a 100644 (file)
@@ -12,7 +12,7 @@ OperationDialog::OperationDialog(QWidget *parent) :
     m_Error(false)\r
 {\r
     ui->setupUi(this);\r
-    resize(getMainWnd()->width() * 0.8, height());\r
+    resize(parent->width() * 0.8, height());\r
 }\r
 \r
 OperationDialog::~OperationDialog()\r
index 5c0a88e..b3d9f68 100644 (file)
   <property name="windowTitle">
    <string>環境設定</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_7">
+  <layout class="QVBoxLayout" name="verticalLayout_3">
    <item>
     <widget class="QTabWidget" name="tabWidget">
      <property name="focusPolicy">
       <enum>Qt::StrongFocus</enum>
      </property>
      <property name="currentIndex">
-      <number>0</number>
+      <number>3</number>
      </property>
      <widget class="QWidget" name="tabBoot_Exit">
       <attribute name="title">
@@ -1525,19 +1525,19 @@ $P ... フルパス</string>
          <property name="sizeHint" stdset="0">
           <size>
            <width>20</width>
-           <height>121</height>
+           <height>40</height>
           </size>
          </property>
         </spacer>
        </item>
       </layout>
-      <zorder>verticalSpacer_4</zorder>
       <zorder></zorder>
       <zorder>optExplain</zorder>
+      <zorder>verticalSpacer_4</zorder>
      </widget>
      <widget class="QWidget" name="tabTextViewer">
       <attribute name="title">
-       <string>テキストビューア</string>
+       <string>内蔵ビューア</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_13">
        <property name="spacing">
@@ -1558,7 +1558,7 @@ $P ... フルパス</string>
        <item>
         <widget class="QGroupBox" name="groupBox_8">
          <property name="title">
-          <string>外観</string>
+          <string>テキストビューアの外観</string>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_12">
           <property name="spacing">
@@ -1769,7 +1769,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
            <item>
             <widget class="QCheckBox" name="enableViewerIgnoreExt">
              <property name="text">
-              <string>以下の拡張子は外部アプリを優先する</string>
+              <string>以下の拡張子は外部アプリを優先する</string>
              </property>
             </widget>
            </item>
@@ -1996,8 +1996,8 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ
   </connection>
  </connections>
  <buttongroups>
-  <buttongroup name="sizeOptions"/>
   <buttongroup name="overwriteOptions"/>
+  <buttongroup name="sizeOptions"/>
   <buttongroup name="posOptions"/>
  </buttongroups>
 </ui>
index 474cacf..317d3d8 100644 (file)
@@ -1,6 +1,93 @@
+#include "common.h"
 #include "simpleimageview.h"
 
+#include <QDebug>
+#include <QKeyEvent>
+#include <QAction>
+#include <QMenu>
+
 SimpleImageView::SimpleImageView(QWidget *parent) :
-    QGraphicsView(parent)
+    QGraphicsView(parent),
+    m_img(),
+    m_back(NULL)
+{
+    setContextMenuPolicy(Qt::DefaultContextMenu);
+    m_back = new QAction(tr("戻る"), this);
+    m_back->setObjectName("back");
+
+    QList<QKeySequence> shortcuts;
+    shortcuts << QKeySequence("Return");
+    shortcuts << QKeySequence("Backspace");
+    m_back->setShortcuts(shortcuts);
+
+    connect(m_back, SIGNAL(triggered()), this, SLOT(back()));
+}
+
+bool SimpleImageView::setSource(const QString &path)
+{
+    qDebug() << "SimpleImageView::setSource()";
+
+    m_img = QImage(path);
+
+    emit fileInfo(QString("%1x%2x%3bpp")
+                  .arg(m_img.width())
+                  .arg(m_img.height())
+                  .arg(m_img.depth()));
+
+    return !m_img.isNull();
+}
+
+void SimpleImageView::back()
+{
+    emit viewFinished();
+}
+
+void SimpleImageView::paintEvent(QPaintEvent *)
 {
+    qDebug() << "SimpleImageView::paintEvent();";
+
+    QPainter painter(viewport());
+    QImage scaledImg;
+
+    if (m_img.width() < viewport()->width() &&
+        m_img.height() < viewport()->height())
+    {
+        scaledImg = m_img;
+    }
+    else {
+        scaledImg = m_img.scaled(viewport()->size(),
+                                 Qt::KeepAspectRatio,
+                                 Qt::SmoothTransformation);
+    }
+
+    painter.drawImage(
+                (viewport()->width() - scaledImg.width()) / 2,
+                (viewport()->height() - scaledImg.height()) / 2,
+                scaledImg);
+}
+
+void SimpleImageView::keyPressEvent(QKeyEvent *event)
+{
+    qDebug() << "SimpleImageView::keyPressEvent();";
+
+    QString ksq = KeyEventToSequence(event);
+
+    if (ProcessShortcut(ksq, this)) {
+        event->accept();
+        return;
+    }
+
+    QGraphicsView::keyReleaseEvent(event);
+
+    // MainWindowへ
+    event->ignore();
+}
+
+void SimpleImageView::contextMenuEvent(QContextMenuEvent *event)
+{
+    qDebug() << "SimpleImageView::contextMenuEvent();";
+
+    QMenu menu(this);
+    menu.addAction(m_back);
+    menu.exec(event->globalPos());
 }
index 434afdf..62c5483 100644 (file)
@@ -9,10 +9,25 @@ class SimpleImageView : public QGraphicsView
 public:
     explicit SimpleImageView(QWidget *parent = 0);
 
+    bool setSource(const QString &path);
+
+private:
+    QImage m_img;
+    QAction *m_back;
+
 signals:
+    void viewFinished();
+    void fileInfo(const QString &info);
 
 public slots:
+    void back();
+
 
+    // QWidget interface
+protected:
+    void paintEvent(QPaintEvent *);
+    void keyPressEvent(QKeyEvent *event);
+    void contextMenuEvent(QContextMenuEvent *event);
 };
 
 #endif // SIMPLEIMAGEVIEW_H
index 30c1c68..712a4d5 100644 (file)
@@ -64,11 +64,10 @@ SimpleTextView::SimpleTextView(QWidget *parent) :
     m_convUTF16BE->setShortcut(QKeySequence("Shift+O"));
     m_convUTF16LE->setShortcut(QKeySequence("Shift+P"));
     m_copy->setShortcut(QKeySequence::Copy);
-    m_back->setShortcut(QKeySequence("Return"));
 
     QList<QKeySequence> shortcuts;
-    shortcuts = m_back->shortcuts();
-    shortcuts.append(QKeySequence("Backspace"));
+    shortcuts << QKeySequence("Return");
+    shortcuts << QKeySequence("Backspace");
     m_back->setShortcuts(shortcuts);
 
     connect(m_convEUC, SIGNAL(triggered()), this, SLOT(convertFromEUC()));
@@ -90,51 +89,12 @@ void SimpleTextView::setSource(const QByteArray &source)
 {
     m_source = source;
 
-    // BOMで文字コードを判別する
-    const char UTF8_BOM[] = { 0xEF, 0xBB, 0xBF };
-    const char UTF16BE_BOM[] = { 0xFE, 0xFF };
-    const char UTF16LE_BOM[] = { 0xFF, 0xFE };
+    std::string code = detectCode(m_source.left(1024));
+    QTextCodec *codec = QTextCodec::codecForName(code.c_str());
 
-    if (m_source.indexOf(QByteArray(UTF8_BOM)) == 0) {
-        qDebug() << "Detect UTF-8 BOM";
-        convertFromUTF8();
-    }
-    else if (m_source.indexOf(QByteArray(UTF16BE_BOM)) == 0 ||
-             m_source.indexOf(QByteArray(UTF16LE_BOM)) == 0)
-    {
-        qDebug() << "Detect UTF-16 BOM";
-        convertFromUTF16();
-    }
-
-    QByteArray first1KB = m_source.left(1024);
-    // 文字コードを示す文字列で判別する
-    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
-    QString text = codec->toUnicode(first1KB).toLower();
-    if (text.indexOf("utf8") != -1 || text.indexOf("utf-8") != -1) {
-        convertFromUTF8();
-        return;
-    }
-    if (text.indexOf("sjis") != -1 || text.indexOf("shift-jis") != -1 ||
-        text.indexOf("shift_jis") != -1)
-    {
-        convertFromSJIS();
-        return;
-    }
-    if (text.indexOf("euc") != -1 || text.indexOf("euc-jp") != -1 ||
-        text.indexOf("euc_jp") != -1)
-    {
-        convertFromEUC();
-        return;
-    }
-    if (text.indexOf("jis") != -1 || text.indexOf("iso 2022-jp") != -1) {
-        convertFromJIS();
-        return;
-    }
-
-    std::string code = detectCode(first1KB);
-    codec = QTextCodec::codecForName(code.c_str());
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage(code.c_str());
+
+    emit fileInfo(code.c_str());
 }
 
 void SimpleTextView::updateAppearance()
@@ -162,50 +122,49 @@ void SimpleTextView::convertFromEUC()
 {
     QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("EUC-JP");
+    emit fileInfo("EUC-JP");
 }
 
 void SimpleTextView::convertFromJIS()
 {
     QTextCodec *codec = QTextCodec::codecForName("ISO 2022-JP");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("ISO 2022-JP");
+    emit fileInfo("ISO 2022-JP");
 }
 
 void SimpleTextView::convertFromSJIS()
 {
     QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("Shift-JIS");
-
+    emit fileInfo("Shift-JIS");
 }
 
 void SimpleTextView::convertFromUTF8()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-8");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("UTF-8");
+    emit fileInfo("UTF-8");
 }
 
 void SimpleTextView::convertFromUTF16()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("UTF-16");
+    emit fileInfo("UTF-16");
 }
 
 void SimpleTextView::convertFromUTF16BE()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("UTF-16BE");
+    emit fileInfo("UTF-16BE");
 }
 
 void SimpleTextView::convertFromUTF16LE()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("UTF-16LE");
+    emit fileInfo("UTF-16LE");
 }
 
 void SimpleTextView::onCopyAvailable(bool yes)
@@ -215,7 +174,7 @@ void SimpleTextView::onCopyAvailable(bool yes)
 
 void SimpleTextView::back()
 {
-    emit viewFinished(this);
+    emit viewFinished();
 }
 
 void SimpleTextView::keyPressEvent(QKeyEvent *event)
@@ -227,18 +186,17 @@ void SimpleTextView::keyPressEvent(QKeyEvent *event)
         return;
     }
 
-    if (ProcessShortcut(ksq, getMainWnd())) {
-        event->accept();
-        return;
-    }
-
     QPlainTextEdit::keyPressEvent(event);
+
+    // MainWindowへ
+    event->ignore();
 }
 
 
 void SimpleTextView::contextMenuEvent(QContextMenuEvent *event)
 {
-    qDebug() << "contextMenuEvent();";
+    qDebug() << "SimpleTextView::contextMenuEvent();";
+
     QMenu menu(this);
     menu.addAction(m_convEUC);
     menu.addAction(m_convJIS);
index 44cd562..5e4626f 100644 (file)
@@ -27,7 +27,8 @@ private:
     std::string detectCode(const QByteArray &bytes);
 
 signals:
-    void viewFinished(QWidget *sender);
+    void viewFinished();
+    void fileInfo(const QString &info);
 
 public slots:
 
index 4e0344f..5f2a2ca 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
 #ifndef VERSION_H
 #define VERSION_H
 
-#define VERSION_VALUE   0.14
+#define VERSION_VALUE   0.15
 
 #endif // VERSION_H