OSDN Git Service

Ver0.10pre
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Sun, 24 Aug 2014 05:22:10 +0000 (14:22 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Sun, 24 Aug 2014 05:22:10 +0000 (14:22 +0900)
README.md
colorsamplemodel.cpp
common.h
filetableview.cpp
main.cpp
mainwindow.cpp
preferencedialog.cpp
preferencedialog.h
preferencedialog.ui
simpletextview.cpp
simpletextview.h

index 35f50a8..dab55e0 100644 (file)
--- a/README.md
+++ b/README.md
@@ -14,6 +14,17 @@ Gefu is an Experimental File Utility.
 - 簡易FTPクライアント
 - SNS連携(タイムライン表示とか) ← ファイラーの機能か?
 
+#### 2014/08/24 Ver0.10
+- 環境設定ダイアログの変更
+    - コントロールの活性・非活性切り替えを修正。
+    - フォント選択をダイアログ使用に変更。
+    - ファイルビューのサンプル表示を実際の形に変更。
+    - テキストビューアの設定を追加。
+- 安直な文字コード判別を実装
+    - BOMがあれば、それに従う。
+    - 先頭1KB中に文字コードを示す文字列("shift_jis"等)があれば、その文字コードに変換する。
+    - バイト単位で調べて推測(http://dobon.net/vb/dotnet/string/detectcode.html よりコードを拝借)
+
 #### 2014/08/24 Ver0.09 公開
 - 左右矢印キーに機能割り当て
     - 左ペインで左矢印/右ペインで右矢印 → 親フォルダに移動
index 7a0fb40..7590448 100644 (file)
@@ -15,13 +15,13 @@ void ColorSampleModel::setFont(const QFont &font)
 int ColorSampleModel::rowCount(const QModelIndex &parent) const
 {
     Q_UNUSED(parent);
-    return 3;
+    return 5;
 }
 
 int ColorSampleModel::columnCount(const QModelIndex &parent) const
 {
     Q_UNUSED(parent);
-    return 2;
+    return 3;
 }
 
 QVariant ColorSampleModel::data(const QModelIndex &index, int role) const
@@ -30,10 +30,12 @@ QVariant ColorSampleModel::data(const QModelIndex &index, int role) const
         return QVariant();
     }
 
-    const QString strText[3][2] = {
-        { tr("通常"), tr("システム") },
-        { tr("マーク"), tr("隠し属性") },
-        { tr(""), tr("読取専用") }
+    const QString strText[5][3] = {
+        { tr("通常"), tr("<DIR>"), tr("12/34/56 78:90") },
+        { tr("マーク"), tr("123B"), tr("12/34/56 78:90") },
+        { tr("システム"), tr("456KB"), tr("12/34/56 78:90") },
+        { tr("隠し属性"), tr("789MB"), tr("12/34/56 78:90") },
+        { tr("読取専用"), tr("10.2GB"), tr("12/34/56 78:90") }
     };
 
     switch (role) {
@@ -45,43 +47,23 @@ QVariant ColorSampleModel::data(const QModelIndex &index, int role) const
         break;
 
     case Qt::BackgroundRole:
-        switch (index.column()) {
-        case 0:
-            switch (index.row()) {
-            case 0: return QBrush(m_colorMap->value("clrBgNormal"));
-            case 1: return QBrush(m_colorMap->value("clrBgMark"));
-            }
-            break;
-
-        case 1:
-            switch (index.row()) {
-            case 0:
-            case 1:
-            case 2:
-                return QBrush(m_colorMap->value("clrBgNormal"));
-            }
-            break;
+        if (index.row() == 1) {
+            return QBrush(m_colorMap->value("clrBgMark"));
+        }
+        else {
+            return QBrush(m_colorMap->value("clrBgNormal"));
         }
         break;
 
     case Qt::ForegroundRole:
-        switch (index.column()) {
-        case 0:
-            switch (index.row()) {
-            case 0: return QBrush(m_colorMap->value("clrFgNormal"));
-            case 1: return QBrush(m_colorMap->value("clrFgMark"));
-            }
-            break;
-
-        case 1:
-            switch (index.row()) {
-            case 0: return QBrush(m_colorMap->value("clrFgSystem"));
-            case 1: return QBrush(m_colorMap->value("clrFgHidden"));
-            case 2: return QBrush(m_colorMap->value("clrFgReadonly"));
-            }
-            break;
-        }
+        switch (index.row()) {
+        case 0: return QBrush(m_colorMap->value("clrFgNormal"));
+        case 1: return QBrush(m_colorMap->value("clrFgMark"));
+        case 2: return QBrush(m_colorMap->value("clrFgSystem"));
+        case 3: return QBrush(m_colorMap->value("clrFgHidden"));
+        case 4: return QBrush(m_colorMap->value("clrFgReadonly"));
         break;
+        }
     }
 
     return QVariant();
index 51f1c12..7543459 100644 (file)
--- a/common.h
+++ b/common.h
@@ -7,8 +7,9 @@ typedef QMap<QString, QString> StringMap;
 class MainWindow;\r
 extern MainWindow* getMainWnd();\r
 extern QString FilesizeToString(quint64 size);\r
+extern QString ViewerIgnoreExt();\r
 \r
-#define VERSION_VALUE   0.09\r
+#define VERSION_VALUE   0.10\r
 \r
 #define slash   QString("/")\r
 #define QQ(x)   ("\"" + QString(x) + "\"")\r
@@ -50,6 +51,12 @@ extern QString FilesizeToString(quint64 size);
 #define IniKey_EditorOption             "Editor/Option"\r
 #define IniKey_TerminalPath             "Terminal/Path"\r
 #define IniKey_TerminalOption           "Terminal/Option"\r
+#define IniKey_ViewerFont               "Viewer/Font"\r
+#define IniKey_ViewerColorBg            "Viewer/ColorBg"\r
+#define IniKey_ViewerColorFg            "Viewer/ColorFg"\r
+#define IniKey_ViewerInherit            "Viewer/Inherit"\r
+#define IniKey_ViewerForceOpen          "Viewer/ForceOpen"\r
+#define IniKey_ViewerIgnoreExt          "Viewer/IgnoreExt"\r
 #define IniKey_WindowGeometry           "Window/Geometry"\r
 #define iniKey_WindowState              "Window/State"\r
 // 以下は[Left/Right]セクションのキー\r
index f9f08e1..2b88e16 100644 (file)
@@ -195,6 +195,16 @@ void FileTableView::openItem()
         setRootIndex(index);\r
     }\r
     else {\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() == m->fileInfo(index).suffix().toLower()) {\r
+                    openUrl(index);\r
+                    return;\r
+                }\r
+            }\r
+        }\r
         emit openRequested(m->fileInfo(index));\r
     }\r
 }\r
index c3282c7..e8d9796 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -16,6 +16,7 @@ int main(int argc, char *argv[])
 #else\r
     a.setWindowIcon(QIcon(":/images/Gefu.png"));\r
 #endif\r
+\r
     QSettings::setDefaultFormat(QSettings::IniFormat);\r
     QSettings settings;\r
     if (settings.value(IniKey_ResetOnBoot, false).toBool()) {\r
@@ -33,12 +34,12 @@ int main(int argc, char *argv[])
     //>>>>> 起動と終了\r
     if (settings.value(IniKey_ConfirmExit, "").toString().isEmpty())\r
         settings.setValue(IniKey_ConfirmExit, true);\r
-    if (settings.value(IniKey_BootSizeSpec, "").toString().isEmpty()) {\r
+    if (settings.value(IniKey_BootSizeAbs, "").toString().isEmpty()) {\r
         settings.setValue(IniKey_BootSizeSpec, "sizeRelative");\r
         settings.setValue(IniKey_BootSizeAbs, QSize(800,600));\r
         settings.setValue(IniKey_BootSizeRel, QSize(75,75));\r
     }\r
-    if (settings.value(IniKey_BootPosSpec, "").toString().isEmpty()) {\r
+    if (settings.value(IniKey_BootPosAbs, "").toString().isEmpty()) {\r
         settings.setValue(IniKey_BootPosSpec, "posCenter");\r
         settings.setValue(IniKey_BootPosAbs, QPoint(0, 0));\r
         settings.setValue(IniKey_BootPosRel, QPoint(0, 0));\r
@@ -101,6 +102,16 @@ int main(int argc, char *argv[])
         settings.setValue(IniKey_TerminalOption, "-c cd " + QQ("$D"));\r
 #endif\r
     }\r
+    //>>>>> テキストビューア\r
+    if (settings.value(IniKey_ViewerFont, "").toString().isEmpty()) {\r
+        settings.setValue(IniKey_ViewerColorBg, QPalette().base().color());\r
+        settings.setValue(IniKey_ViewerColorFg, QPalette().text().color());\r
+        settings.setValue(IniKey_ViewerFont, a.font());\r
+        settings.setValue(IniKey_ViewerForceOpen, false);\r
+        settings.setValue(IniKey_ViewerInherit, true);\r
+        settings.setValue(IniKey_ViewerIgnoreExt, ViewerIgnoreExt());\r
+    }\r
+\r
     //>>>>> 隠しファイルの表示\r
     if (settings.value(IniKey_ShowHidden, "").toString().isEmpty())\r
         settings.setValue(IniKey_ShowHidden, false);\r
@@ -133,3 +144,29 @@ int main(int argc, char *argv[])
 \r
     return a.exec();\r
 }\r
+\r
+QString ViewerIgnoreExt()\r
+{\r
+    QStringList list;\r
+    // 画像系\r
+    list << "gif" << "jpg" << "jpeg" << "png" << "bmp" << "ico" << "ai";\r
+    list << "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
+    list << "flac" << "mkv";\r
+    // 実行ファイル系\r
+    list << "exe" << "com" << "lib" << "dll" << "msi" << "scr" << "sys";\r
+    list << "o" << "obj" << "ocx" << "a" << "so" << "app";\r
+    // アーカイブ系\r
+    list << "lzh" << "zip" << "cab" << "tar" << "rar" << "gz" << "tgz";\r
+    list << "bz2" << "xz" << "jar" << "7z";\r
+    // ドキュメント系\r
+    list << "pdf" << "doc" << "docx" << "xls" << "xlsx" << "ppt" << "pptx";\r
+    // フォント\r
+    list << "ttf" << "ttc";\r
+\r
+    list.sort();\r
+\r
+    return list.join(",");\r
+}\r
index f4ff2eb..8febeeb 100644 (file)
@@ -338,6 +338,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
         msgBox.setCheckBox(checkBox);\r
         msgBox.setText(tr("終了しますか?"));\r
         msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);\r
+        msgBox.setIcon(QMessageBox::Question);\r
 \r
         if (msgBox.exec() == QMessageBox::No) {\r
             event->ignore();\r
index e6307d4..b0e2fc6 100644 (file)
@@ -10,6 +10,7 @@
 #include <QDir>
 #include <QFileDialog>
 #include <QStandardPaths>
+#include <QFontDialog>
 
 PreferenceDialog::PreferenceDialog(QWidget *parent) :
     QDialog(parent),
@@ -21,11 +22,20 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
 
     ui->setupUi(this);
     ui->tabWidget->setCurrentIndex(0);
+    // アドレスボックスの外観サンプル
     ui->sampleEdit->setText(QDir::homePath());
+    // ファイルビューの外観サンプル
     ui->sampleTable->setModel(&m_model);
-    ui->sampleTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
-    ui->sampleTable->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
 
+    QHeaderView *header;
+    header = ui->sampleTable->horizontalHeader();
+    header->setSectionResizeMode(0, QHeaderView::Stretch);
+    header->setSectionResizeMode(1, QHeaderView::ResizeToContents);
+    header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
+    header = ui->sampleTable->verticalHeader();
+    header->setDefaultSectionSize(header->defaultSectionSize() * 0.75);
+
+    // シグナル&スロット
     connect(ui->bootSize, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
     connect(ui->sizeAbsolute, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
     connect(ui->sizeRelative, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
@@ -44,19 +54,22 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     connect(ui->clrFgReadonly, SIGNAL(clicked()), this, SLOT(selectViewColor()));
     connect(ui->clrFgSystem, SIGNAL(clicked()), this, SLOT(selectViewColor()));
 
-    connect(ui->boxFont, SIGNAL(currentFontChanged(QFont)), this, SLOT(changeFont()));
-    connect(ui->boxFontBold, SIGNAL(clicked()), this, SLOT(changeFont()));
-    connect(ui->boxFontSize, SIGNAL(valueChanged(int)), this, SLOT(changeFont()));
-
-    connect(ui->viewFont, SIGNAL(currentFontChanged(QFont)), this, SLOT(changeFont()));
-    connect(ui->viewFontBold, SIGNAL(clicked()), this, SLOT(changeFont()));
-    connect(ui->viewFontSize, SIGNAL(valueChanged(int)), this, SLOT(changeFont()));
+    connect(ui->chooseBoxFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    connect(ui->chooseViewFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
 
     connect(ui->importAppearance, SIGNAL(clicked()), this, SLOT(importAppearance()));
     connect(ui->exportAppearance, SIGNAL(clicked()), this, SLOT(exportAppearance()));
     connect(ui->termBrowse, SIGNAL(clicked()), this, SLOT(browseApp()));
     connect(ui->editorBrowse, SIGNAL(clicked()), this, SLOT(browseApp()));
 
+    connect(ui->chooseViewerFont, SIGNAL(clicked()), this, SLOT(chooseFont()));
+    connect(ui->viewerClrBg, SIGNAL(clicked()), this, SLOT(selectViewerColor()));
+    connect(ui->viewerClrFg, SIGNAL(clicked()), this, SLOT(selectViewerColor()));
+    connect(ui->viewerInherit, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
+    connect(ui->enableViewerIgnoreExt, SIGNAL(toggled(bool)), this, SLOT(setControlsEnabled(bool)));
+    connect(ui->defaultIgnoreExt, SIGNAL(clicked()), this, SLOT(setIgnoreExtDefault()));
+
+    // 現在の設定で各コントロールを初期化する
     QSettings settings;
     QString strValue;
     QSize size;
@@ -67,18 +80,16 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     // 終了時の確認ダイアログ
     ui->confirmExit->setChecked(settings.value(IniKey_ConfirmExit).toBool());
     // 起動時のサイズ
+    ui->bootSize->setChecked(true);
     strValue = settings.value(IniKey_BootSizeSpec).toString();
+    radioBtn = findChild<QRadioButton*>(strValue);
+    if (radioBtn == NULL) {
+        radioBtn = ui->sizeRelative;
+    }
+    radioBtn->setChecked(true);
     if (strValue.isEmpty()) {
         ui->bootSize->setChecked(false);
     }
-    else {
-        ui->bootSize->setChecked(true);
-        radioBtn = findChild<QRadioButton*>(strValue);
-        if (radioBtn == NULL) {
-            radioBtn = ui->sizeLast;
-        }
-        radioBtn->setChecked(true);
-    }
     size = settings.value(IniKey_BootSizeAbs).toSize();
     ui->absoluteWidth->setValue(size.width());
     ui->absoluteHeight->setValue(size.height());
@@ -86,18 +97,16 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     ui->relativeWidth->setValue(size.width());
     ui->relativeHeight->setValue(size.height());
     // 起動時の位置
+    ui->bootPos->setChecked(true);
     strValue = settings.value(IniKey_BootPosSpec).toString();
+    radioBtn = findChild<QRadioButton*>(strValue);
+    if (radioBtn == NULL) {
+        radioBtn = ui->posCenter;
+    }
+    radioBtn->setChecked(true);
     if (strValue.isEmpty()) {
         ui->bootPos->setChecked(false);
     }
-    else {
-        ui->bootPos->setChecked(true);
-        radioBtn = findChild<QRadioButton*>(strValue);
-        if (radioBtn == NULL) {
-            radioBtn = ui->posLast;
-        }
-        radioBtn->setChecked(true);
-    }
     point = settings.value(IniKey_BootPosAbs).toPoint();
     ui->absoluteLeft->setValue(point.x());
     ui->absoluteTop->setValue(point.y());
@@ -107,8 +116,8 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     // 起動時の設定削除
     ui->resetOnBoot->setChecked(settings.value(IniKey_ResetOnBoot).toBool());
 
-    //>>>>> 色とフォント
-    loadAppearance(settings);
+    //>>>>> 色とフォント、テキストビューア
+    loadAppearance(settings, false);
 
     //>>>>> ファイル操作
     // 確認ダイアログの表示
@@ -141,6 +150,11 @@ PreferenceDialog::PreferenceDialog(QWidget *parent) :
     // ターミナル
     ui->termOpt->setText(settings.value(IniKey_TerminalOption).toString());
     ui->termPath->setText(settings.value(IniKey_TerminalPath).toString());
+
+    //>>>>> テキストビューア
+    ui->enableViewerIgnoreExt->setChecked(true);
+    ui->enableViewerIgnoreExt->setChecked(!settings.value(IniKey_ViewerForceOpen).toBool());
+    ui->viewerIgnoreExt->setPlainText(settings.value(IniKey_ViewerIgnoreExt).toString());
 }
 
 PreferenceDialog::~PreferenceDialog()
@@ -166,7 +180,7 @@ void PreferenceDialog::saveAppearance(QSettings &settings)
     settings.setValue(IniKey_ViewFont, m_model.font());
 }
 
-void PreferenceDialog::loadAppearance(QSettings &settings)
+void PreferenceDialog::loadAppearance(QSettings &settings, bool import)
 {
     QPalette palette;
     QColor color;
@@ -182,12 +196,11 @@ void PreferenceDialog::loadAppearance(QSettings &settings)
     palette.setColor(QPalette::Text, color);
     // フォント
     font = settings.value(IniKey_BoxFont).value<QFont>();
-    ui->boxFont->setCurrentText(font.family());
-    ui->boxFontBold->setChecked(font.bold());
-    ui->boxFontSize->setValue(font.pointSize());
+    ui->boxFont->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
     // サンプル表示
     ui->sampleEdit->setPalette(palette);
     ui->sampleEdit->setFont(font);
+
     //>>>> ファイルビュー
     // 背景色
     color = settings.value(IniKey_ViewColorBgMark).value<QColor>();
@@ -207,35 +220,69 @@ void PreferenceDialog::loadAppearance(QSettings &settings)
     m_colorMap["clrFgSystem"] = color;
     // フォント
     font = settings.value(IniKey_ViewFont).value<QFont>();
-    ui->viewFont->setCurrentText(font.family());
-    ui->viewFontBold->setChecked(font.bold());
-    ui->viewFontSize->setValue(font.pointSize());
+    ui->viewFont->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
     // サンプル表示
     m_model.setFont(font);
     m_model.update();
 
+    //>>>> テキストビューア
+    // 文字色と背景色
+    if (settings.value(IniKey_ViewerInherit).toBool()) {
+        ui->viewerInherit->setChecked(true);
+        color = settings.value(IniKey_ViewColorBgNormal).value<QColor>();
+        palette.setColor(QPalette::Base, color);
+        color = settings.value(IniKey_ViewColorFgNormal).value<QColor>();
+        palette.setColor(QPalette::Text, color);
+    }
+    else if (!import){
+        ui->viewerInherit->setChecked(false);
+        color = settings.value(IniKey_ViewerColorBg).value<QColor>();
+        palette.setColor(QPalette::Base, color);
+        color = settings.value(IniKey_ViewerColorFg).value<QColor>();
+        palette.setColor(QPalette::Text, color);
+    }
+    ui->viewerSample->setPalette(palette);
+    // フォント
+    if (!import) {
+        font = settings.value(IniKey_ViewerFont).value<QFont>();
+        ui->viewerFont->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
+        ui->viewerSample->setFont(font);
+    }
 }
 
-void PreferenceDialog::changeFont()
+void PreferenceDialog::chooseFont()
 {
+    bool ok;
     QFont font;
+    QLabel *label = NULL;
+
+    if (sender() == ui->chooseViewerFont) {
+        font = ui->viewerSample->font();
+    }
+    else if (sender() == ui->chooseBoxFont) {
+        font = ui->sampleEdit->font();
+    }
+    else if (sender() == ui->chooseViewFont) {
+        font = m_model.font();
+    }
+
+    font = QFontDialog::getFont(&ok, font, this);
 
-    if (sender() == ui->boxFont ||
-        sender() == ui->boxFontBold ||
-        sender() == ui->boxFontSize)
-    {
-        font.setBold(ui->boxFontBold->isChecked());
-        font.setPointSize(ui->boxFontSize->value());
-        font.setFamily(ui->boxFont->currentText());
+    if (sender() == ui->chooseViewerFont) {
+        ui->viewerSample->setFont(font);
+        label = ui->viewerFont;
+    }
+    else if (sender() == ui->chooseBoxFont) {
         ui->sampleEdit->setFont(font);
+        label = ui->boxFont;
     }
-    else {
-        font.setBold(ui->viewFontBold->isChecked());
-        font.setPointSize(ui->viewFontSize->value());
-        font.setFamily(ui->viewFont->currentText());
+    else if (sender() == ui->chooseViewFont) {
         m_model.setFont(font);
         m_model.update();
+        label = ui->viewFont;
     }
+    label->setText(tr("%1, %2pt").arg(font.family()).arg(font.pointSize()));
+
 }
 
 void PreferenceDialog::setControlsEnabled(bool enabled)
@@ -283,6 +330,18 @@ void PreferenceDialog::setControlsEnabled(bool enabled)
         ui->relativeLeft->setEnabled(enabled);
         ui->relativeTop->setEnabled(enabled);
     }
+    else if (sender() == ui->viewerInherit) {
+        ui->viewerClrBg->setEnabled(!enabled);
+        ui->viewerClrFg->setEnabled(!enabled);
+    }
+    else if (sender() == ui->enableViewerIgnoreExt) {
+        ui->viewerIgnoreExt->setEnabled(enabled);
+    }
+}
+
+void PreferenceDialog::setIgnoreExtDefault()
+{
+    ui->viewerIgnoreExt->setPlainText(ViewerIgnoreExt());
 }
 
 void PreferenceDialog::selectBoxColor()
@@ -303,12 +362,11 @@ void PreferenceDialog::selectBoxColor()
 
     if (sender() == ui->boxClrBg) {
         palette.setColor(QPalette::Base, color);
-        ui->sampleEdit->setPalette(palette);
     }
     else if (sender() == ui->boxClrFg) {
         palette.setColor(QPalette::Text, color);
-        ui->sampleEdit->setPalette(palette);
     }
+    ui->sampleEdit->setPalette(palette);
 }
 
 void PreferenceDialog::selectViewColor()
@@ -325,6 +383,31 @@ void PreferenceDialog::selectViewColor()
     m_model.update();
 }
 
+void PreferenceDialog::selectViewerColor()
+{
+    QColor color;
+    QPalette palette = ui->viewerSample->palette();
+    if (sender() == ui->viewerClrBg) {
+        color = palette.background().color();
+    }
+    else if (sender() == ui->viewerClrFg) {
+        color = palette.text().color();
+    }
+
+    color = QColorDialog::getColor(color, this, tr("色選択"));
+    if (!color.isValid()) {
+        return;
+    }
+
+    if (sender() == ui->viewerClrBg) {
+        palette.setColor(QPalette::Base, color);
+    }
+    else if (sender() == ui->viewerClrFg) {
+        palette.setColor(QPalette::Text, color);
+    }
+    ui->viewerSample->setPalette(palette);
+}
+
 void PreferenceDialog::browseApp()
 {
     QStringList list = QStandardPaths::standardLocations(
@@ -364,7 +447,7 @@ void PreferenceDialog::importAppearance()
     }
 
     QSettings settings(path, QSettings::IniFormat);
-    loadAppearance(settings);
+    loadAppearance(settings, true);
 }
 
 void PreferenceDialog::exportAppearance()
@@ -450,5 +533,18 @@ void PreferenceDialog::accept()
     settings.setValue(IniKey_TerminalOption, ui->termOpt->text().trimmed());
     settings.setValue(IniKey_TerminalPath, ui->termPath->text().trimmed());
 
+    //>>>>> テキストビューア
+    settings.setValue(IniKey_ViewerFont, ui->viewerSample->font());
+    settings.setValue(IniKey_ViewerColorBg, ui->viewerSample->palette().base().color());
+    settings.setValue(IniKey_ViewerColorFg, ui->viewerSample->palette().text().color());
+    settings.setValue(IniKey_ViewerInherit, ui->viewerInherit->isChecked());
+    settings.setValue(IniKey_ViewerForceOpen, !ui->enableViewerIgnoreExt->isChecked());
+    QStringList list = ui->viewerIgnoreExt->toPlainText().split(",", QString::SkipEmptyParts);
+    QStringList::iterator it;
+    for (it = list.begin(); it != list.end(); it++) {
+        *it = it->trimmed();
+    }
+    settings.setValue(IniKey_ViewerIgnoreExt, list.join(","));
+
     QDialog::accept();
 }
index b4a0ac5..9385208 100644 (file)
@@ -25,13 +25,15 @@ private:
     ColorMap m_colorMap;
 
     void saveAppearance(QSettings &settings);
-    void loadAppearance(QSettings &settings);
+    void loadAppearance(QSettings &settings, bool import);
 
 private slots:
-    void changeFont();
+    void chooseFont();
     void setControlsEnabled(bool enabled);
+    void setIgnoreExtDefault();
     void selectBoxColor();
     void selectViewColor();
+    void selectViewerColor();
     void browseApp();
     void importAppearance();
     void exportAppearance();
index e8e4e90..3c45e8e 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>631</width>
-    <height>569</height>
+    <width>549</width>
+    <height>478</height>
    </rect>
   </property>
   <property name="sizePolicy">
       <enum>Qt::StrongFocus</enum>
      </property>
      <property name="currentIndex">
-      <number>0</number>
+      <number>4</number>
      </property>
      <widget class="QWidget" name="tabBoot_Exit">
       <attribute name="title">
        <string>起動と終了</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
        <item>
         <widget class="QCheckBox" name="bootSize">
          <property name="focusPolicy">
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_3">
          <property name="spacing">
-          <number>6</number>
+          <number>4</number>
          </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetFixedSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer">
            <property name="orientation">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_2">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_3">
              <property name="text">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_4">
              <property name="text">
        </item>
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_6">
+         <property name="spacing">
+          <number>4</number>
+         </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetMinimumSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer_2">
            <property name="orientation">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_5">
              <property name="text">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_5">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_7">
              <property name="text">
        </item>
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_7">
+         <property name="spacing">
+          <number>4</number>
+         </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetMinimumSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer_3">
            <property name="orientation">
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_12">
          <property name="spacing">
-          <number>6</number>
+          <number>4</number>
          </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetFixedSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer_6">
            <property name="orientation">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_13">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_13">
              <property name="text">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_14">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_15">
              <property name="text">
        </item>
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_9">
+         <property name="spacing">
+          <number>4</number>
+         </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetMinimumSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer_5">
            <property name="orientation">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_10">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_9">
              <property name="text">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_11">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <widget class="QLabel" name="label_11">
              <property name="text">
        </item>
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_15">
+         <property name="spacing">
+          <number>4</number>
+         </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetMinimumSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer_7">
            <property name="orientation">
        </item>
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_8">
+         <property name="spacing">
+          <number>4</number>
+         </property>
          <property name="sizeConstraint">
           <enum>QLayout::SetMinimumSize</enum>
          </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <spacer name="horizontalSpacer_4">
            <property name="orientation">
        <string>色とフォント</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_6">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
        <item>
         <widget class="QGroupBox" name="groupBox">
          <property name="title">
           <string>アドレスボックス</string>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_2">
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_16">
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
             <item>
              <widget class="QLabel" name="label_17">
               <property name="text">
-               <string>フォント</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QFontComboBox" name="boxFont">
-              <property name="editable">
-               <bool>true</bool>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="boxFontSize">
-              <property name="minimum">
-               <number>1</number>
+               <string>フォント:</string>
               </property>
              </widget>
             </item>
             <item>
-             <widget class="QLabel" name="label_18">
+             <widget class="QLabel" name="boxFont">
               <property name="text">
-               <string>pt</string>
+               <string>font family, point</string>
               </property>
              </widget>
             </item>
             <item>
-             <widget class="QCheckBox" name="boxFontBold">
+             <widget class="QPushButton" name="chooseBoxFont">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>太字</string>
+               <string>選択</string>
               </property>
              </widget>
             </item>
               </property>
              </spacer>
             </item>
-           </layout>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_17">
             <item>
              <widget class="QPushButton" name="boxClrFg">
               <property name="sizePolicy">
               </property>
              </widget>
             </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_17">
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
             <item>
              <widget class="QLineEdit" name="sampleEdit">
               <property name="text">
           <string>ファイルビュー</string>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_5">
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_21">
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
             <item>
              <widget class="QLabel" name="label_23">
               <property name="text">
-               <string>フォント</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QFontComboBox" name="viewFont"/>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="viewFontSize">
-              <property name="minimum">
-               <number>1</number>
+               <string>フォント:</string>
               </property>
              </widget>
             </item>
             <item>
-             <widget class="QLabel" name="label_24">
+             <widget class="QLabel" name="viewFont">
               <property name="text">
-               <string>pt</string>
+               <string>font family, point</string>
               </property>
              </widget>
             </item>
             <item>
-             <widget class="QCheckBox" name="viewFontBold">
+             <widget class="QPushButton" name="chooseViewFont">
               <property name="focusPolicy">
                <enum>Qt::StrongFocus</enum>
               </property>
               <property name="text">
-               <string>太字</string>
+               <string>選択</string>
               </property>
              </widget>
             </item>
               </property>
              </spacer>
             </item>
+            <item>
+             <widget class="QPushButton" name="clrFgNormal">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>文字色</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="clrBgNormal">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>背景色</string>
+              </property>
+             </widget>
+            </item>
            </layout>
           </item>
           <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_23">
+           <layout class="QHBoxLayout" name="horizontalLayout_18">
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
             <item>
-             <layout class="QHBoxLayout" name="horizontalLayout_22">
-              <item>
-               <layout class="QVBoxLayout" name="verticalLayout_4">
-                <item>
-                 <widget class="QGroupBox" name="groupBox_3">
-                  <property name="title">
-                   <string>文字色</string>
-                  </property>
-                  <layout class="QVBoxLayout" name="verticalLayout_3">
-                   <item>
-                    <layout class="QHBoxLayout" name="horizontalLayout_19">
-                     <item>
-                      <widget class="QPushButton" name="clrFgNormal">
-                       <property name="focusPolicy">
-                        <enum>Qt::StrongFocus</enum>
-                       </property>
-                       <property name="text">
-                        <string>通常</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="clrFgMark">
-                       <property name="focusPolicy">
-                        <enum>Qt::StrongFocus</enum>
-                       </property>
-                       <property name="text">
-                        <string>マーク</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </item>
-                   <item>
-                    <layout class="QHBoxLayout" name="horizontalLayout_20">
-                     <item>
-                      <widget class="QPushButton" name="clrFgSystem">
-                       <property name="focusPolicy">
-                        <enum>Qt::StrongFocus</enum>
-                       </property>
-                       <property name="text">
-                        <string>システム</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="clrFgHidden">
-                       <property name="focusPolicy">
-                        <enum>Qt::StrongFocus</enum>
-                       </property>
-                       <property name="text">
-                        <string>隠し属性</string>
-                       </property>
-                      </widget>
-                     </item>
-                     <item>
-                      <widget class="QPushButton" name="clrFgReadonly">
-                       <property name="focusPolicy">
-                        <enum>Qt::StrongFocus</enum>
-                       </property>
-                       <property name="text">
-                        <string>読取専用</string>
-                       </property>
-                      </widget>
-                     </item>
-                    </layout>
-                   </item>
-                  </layout>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QGroupBox" name="groupBox_4">
-                  <property name="title">
-                   <string>背景色</string>
-                  </property>
-                  <layout class="QHBoxLayout" name="horizontalLayout_18">
-                   <item>
-                    <widget class="QPushButton" name="clrBgNormal">
-                     <property name="focusPolicy">
-                      <enum>Qt::StrongFocus</enum>
-                     </property>
-                     <property name="text">
-                      <string>通常</string>
-                     </property>
-                    </widget>
-                   </item>
-                   <item>
-                    <widget class="QPushButton" name="clrBgMark">
-                     <property name="focusPolicy">
-                      <enum>Qt::StrongFocus</enum>
-                     </property>
-                     <property name="text">
-                      <string>マーク</string>
-                     </property>
-                    </widget>
-                   </item>
-                  </layout>
-                 </widget>
-                </item>
-               </layout>
-              </item>
-             </layout>
+             <widget class="QGroupBox" name="groupBox_3">
+              <property name="title">
+               <string>文字色</string>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_19">
+               <item>
+                <widget class="QPushButton" name="clrFgSystem">
+                 <property name="focusPolicy">
+                  <enum>Qt::StrongFocus</enum>
+                 </property>
+                 <property name="text">
+                  <string>システム</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QPushButton" name="clrFgMark">
+                 <property name="focusPolicy">
+                  <enum>Qt::StrongFocus</enum>
+                 </property>
+                 <property name="text">
+                  <string>マーク</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QPushButton" name="clrFgHidden">
+                 <property name="focusPolicy">
+                  <enum>Qt::StrongFocus</enum>
+                 </property>
+                 <property name="text">
+                  <string>隠し属性</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QPushButton" name="clrFgReadonly">
+                 <property name="focusPolicy">
+                  <enum>Qt::StrongFocus</enum>
+                 </property>
+                 <property name="text">
+                  <string>読取専用</string>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </widget>
             </item>
             <item>
-             <widget class="QTableView" name="sampleTable">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="minimumSize">
-               <size>
-                <width>200</width>
-                <height>0</height>
-               </size>
-              </property>
-              <property name="focusPolicy">
-               <enum>Qt::NoFocus</enum>
+             <widget class="QGroupBox" name="groupBox_4">
+              <property name="title">
+               <string>背景色</string>
               </property>
-              <attribute name="horizontalHeaderVisible">
-               <bool>false</bool>
-              </attribute>
-              <attribute name="verticalHeaderVisible">
-               <bool>false</bool>
-              </attribute>
+              <layout class="QHBoxLayout" name="horizontalLayout_20">
+               <item>
+                <widget class="QPushButton" name="clrBgMark">
+                 <property name="focusPolicy">
+                  <enum>Qt::StrongFocus</enum>
+                 </property>
+                 <property name="text">
+                  <string>マーク</string>
+                 </property>
+                </widget>
+               </item>
+              </layout>
              </widget>
             </item>
            </layout>
           </item>
+          <item>
+           <widget class="QTableView" name="sampleTable">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>0</width>
+              <height>110</height>
+             </size>
+            </property>
+            <property name="focusPolicy">
+             <enum>Qt::NoFocus</enum>
+            </property>
+            <property name="selectionMode">
+             <enum>QAbstractItemView::SingleSelection</enum>
+            </property>
+            <property name="selectionBehavior">
+             <enum>QAbstractItemView::SelectRows</enum>
+            </property>
+            <property name="textElideMode">
+             <enum>Qt::ElideMiddle</enum>
+            </property>
+            <property name="showGrid">
+             <bool>false</bool>
+            </property>
+            <property name="wordWrap">
+             <bool>false</bool>
+            </property>
+            <attribute name="horizontalHeaderVisible">
+             <bool>false</bool>
+            </attribute>
+            <attribute name="verticalHeaderVisible">
+             <bool>false</bool>
+            </attribute>
+           </widget>
+          </item>
          </layout>
         </widget>
        </item>
        <item>
         <layout class="QHBoxLayout" name="horizontalLayout_28">
+         <property name="spacing">
+          <number>4</number>
+         </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
          <item>
           <widget class="QPushButton" name="importAppearance">
            <property name="focusPolicy">
        <string>ファイル操作</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_8">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
        <item>
         <widget class="QGroupBox" name="groupBox_5">
          <property name="title">
           <string>操作の開始時、確認ダイアログを表示する</string>
          </property>
          <layout class="QHBoxLayout" name="horizontalLayout_24">
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
           <item>
            <widget class="QCheckBox" name="confirmCopy">
             <property name="focusPolicy">
           <string>操作の成功時、進捗ダイアログを自動で閉じる</string>
          </property>
          <layout class="QHBoxLayout" name="horizontalLayout_25">
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
           <item>
            <widget class="QCheckBox" name="autoCloseCopy">
             <property name="focusPolicy">
           <string>同名ファイル存在時の既定の動作</string>
          </property>
          <layout class="QGridLayout" name="gridLayout">
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
+          <property name="spacing">
+           <number>4</number>
+          </property>
           <item row="0" column="0">
            <widget class="QRadioButton" name="owDefOverWrite">
             <property name="focusPolicy">
        <string>パス設定</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_20">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
        <item>
         <layout class="QVBoxLayout" name="verticalLayout_9">
          <property name="spacing">
-          <number>0</number>
+          <number>4</number>
+         </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
          </property>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_27">
            <property name="spacing">
-            <number>-1</number>
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
            </property>
            <item>
             <widget class="QLabel" name="label_19">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_26">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <spacer name="horizontalSpacer_16">
              <property name="orientation">
        <item>
         <layout class="QVBoxLayout" name="verticalLayout_10">
          <property name="spacing">
-          <number>0</number>
+          <number>4</number>
+         </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
          </property>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_55">
            <property name="spacing">
-            <number>-1</number>
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
            </property>
            <item>
             <widget class="QLabel" name="label_45">
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout_56">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
            <item>
             <spacer name="horizontalSpacer_33">
              <property name="orientation">
@@ -1353,6 +1835,316 @@ $P ... フルパス($D/$Fと同じ)</string>
       <zorder></zorder>
       <zorder>optExplain</zorder>
      </widget>
+     <widget class="QWidget" name="tab_3">
+      <attribute name="title">
+       <string>テキストビューア</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_13">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
+       <item>
+        <widget class="QGroupBox" name="groupBox_8">
+         <property name="title">
+          <string>外観</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_12">
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_29">
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
+            <item>
+             <widget class="QLabel" name="label_21">
+              <property name="text">
+               <string>フォント:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="viewerFont">
+              <property name="text">
+               <string>font family, point</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="chooseViewerFont">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>選択</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_18">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QPushButton" name="viewerClrFg">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>文字色</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="viewerClrBg">
+              <property name="focusPolicy">
+               <enum>Qt::StrongFocus</enum>
+              </property>
+              <property name="text">
+               <string>背景色</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_30">
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
+            <item>
+             <spacer name="horizontalSpacer_19">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="viewerInherit">
+              <property name="text">
+               <string>文字色と背景色はファイルビューを継承</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <widget class="QPlainTextEdit" name="viewerSample">
+            <property name="readOnly">
+             <bool>true</bool>
+            </property>
+            <property name="plainText">
+             <string>01234567890
+abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+!&quot;#$%&amp;'()+-*=^~¥|@`[]{}&lt;&gt;;:,./?_
+あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_11">
+         <property name="spacing">
+          <number>4</number>
+         </property>
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_31">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
+           <item>
+            <widget class="QCheckBox" name="enableViewerIgnoreExt">
+             <property name="text">
+              <string>以下の拡張子は、外部アプリを優先する</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_21">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QPushButton" name="defaultIgnoreExt">
+             <property name="text">
+              <string>デフォルトに戻す</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_32">
+           <property name="spacing">
+            <number>4</number>
+           </property>
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
+           <item>
+            <spacer name="horizontalSpacer_20">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeType">
+              <enum>QSizePolicy::Fixed</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>13</width>
+               <height>17</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QPlainTextEdit" name="viewerIgnoreExt">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="minimumSize">
+              <size>
+               <width>0</width>
+               <height>100</height>
+              </size>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_5">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>3</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
     </widget>
    </item>
    <item>
@@ -1371,6 +2163,7 @@ $P ... フルパス($D/$Fと同じ)</string>
   </layout>
  </widget>
  <tabstops>
+  <tabstop>tabWidget</tabstop>
   <tabstop>bootSize</tabstop>
   <tabstop>sizeAbsolute</tabstop>
   <tabstop>absoluteWidth</tabstop>
@@ -1389,22 +2182,53 @@ $P ... フルパス($D/$Fと同じ)</string>
   <tabstop>posCenter</tabstop>
   <tabstop>posLast</tabstop>
   <tabstop>resetOnBoot</tabstop>
-  <tabstop>boxFont</tabstop>
-  <tabstop>boxFontSize</tabstop>
-  <tabstop>boxFontBold</tabstop>
+  <tabstop>confirmExit</tabstop>
+  <tabstop>chooseBoxFont</tabstop>
   <tabstop>boxClrFg</tabstop>
   <tabstop>boxClrBg</tabstop>
   <tabstop>sampleEdit</tabstop>
-  <tabstop>viewFont</tabstop>
-  <tabstop>viewFontSize</tabstop>
-  <tabstop>viewFontBold</tabstop>
+  <tabstop>chooseViewFont</tabstop>
   <tabstop>clrFgNormal</tabstop>
-  <tabstop>clrFgMark</tabstop>
+  <tabstop>clrBgNormal</tabstop>
   <tabstop>clrFgSystem</tabstop>
+  <tabstop>clrFgMark</tabstop>
   <tabstop>clrFgHidden</tabstop>
   <tabstop>clrFgReadonly</tabstop>
-  <tabstop>clrBgNormal</tabstop>
   <tabstop>clrBgMark</tabstop>
+  <tabstop>importAppearance</tabstop>
+  <tabstop>exportAppearance</tabstop>
+  <tabstop>confirmCopy</tabstop>
+  <tabstop>confirmMove</tabstop>
+  <tabstop>confirmDelete</tabstop>
+  <tabstop>confirmRename</tabstop>
+  <tabstop>autoCloseCopy</tabstop>
+  <tabstop>autoCloseMove</tabstop>
+  <tabstop>autoCloseDelete</tabstop>
+  <tabstop>autoCloseRename</tabstop>
+  <tabstop>owDefOverWrite</tabstop>
+  <tabstop>owDefIfNew</tabstop>
+  <tabstop>owDefSkip</tabstop>
+  <tabstop>owDefAppendNumber</tabstop>
+  <tabstop>owDefRename</tabstop>
+  <tabstop>moveAfterCreate</tabstop>
+  <tabstop>openAfterCreate</tabstop>
+  <tabstop>editorPath</tabstop>
+  <tabstop>editorBrowse</tabstop>
+  <tabstop>editorOpt</tabstop>
+  <tabstop>termPath</tabstop>
+  <tabstop>termBrowse</tabstop>
+  <tabstop>termOpt</tabstop>
+  <tabstop>optExplain</tabstop>
+  <tabstop>chooseViewerFont</tabstop>
+  <tabstop>viewerClrFg</tabstop>
+  <tabstop>viewerClrBg</tabstop>
+  <tabstop>viewerInherit</tabstop>
+  <tabstop>viewerSample</tabstop>
+  <tabstop>enableViewerIgnoreExt</tabstop>
+  <tabstop>defaultIgnoreExt</tabstop>
+  <tabstop>viewerIgnoreExt</tabstop>
+  <tabstop>buttonBox</tabstop>
+  <tabstop>checkUpdates</tabstop>
  </tabstops>
  <resources/>
  <connections>
@@ -1442,8 +2266,8 @@ $P ... フルパス($D/$Fと同じ)</string>
   </connection>
  </connections>
  <buttongroups>
-  <buttongroup name="sizeOptions"/>
   <buttongroup name="overwriteOptions"/>
   <buttongroup name="posOptions"/>
+  <buttongroup name="sizeOptions"/>
  </buttongroups>
 </ui>
index e303f58..67f8018 100644 (file)
@@ -7,6 +7,7 @@
 #include <QSettings>
 #include <QShortcut>
 #include <QTextCodec>
+#include <QStatusBar>
 
 SimpleTextView::SimpleTextView(QWidget *parent) :
     QPlainTextEdit(parent),
@@ -41,6 +42,7 @@ SimpleTextView::SimpleTextView(QWidget *parent) :
     m_convJIS = new QAction(tr("ISO 2022-JP(JIS)で再読込"), this);
     m_convSJIS = new QAction(tr("Shift-JISで再読込"), this);
     m_convUTF8 = new QAction(tr("UTF-8で再読込"), this);
+    m_convUTF16 = new QAction(tr("UTF-16で再読込"), this);
     m_convUTF16BE = new QAction(tr("UTF-16BEで再読込"), this);
     m_convUTF16LE = new QAction(tr("UTF-16LEで再読込"), this);
     m_back = new QAction(tr("戻る"), this);
@@ -49,14 +51,16 @@ SimpleTextView::SimpleTextView(QWidget *parent) :
     m_convJIS->setShortcut(QKeySequence("J"));
     m_convSJIS->setShortcut(QKeySequence("S"));
     m_convUTF8->setShortcut(QKeySequence("U"));
-    m_convUTF16BE->setShortcut(QKeySequence("B"));
-    m_convUTF16LE->setShortcut(QKeySequence("L"));
+    m_convUTF8->setShortcut(QKeySequence("I"));
+    m_convUTF16BE->setShortcut(QKeySequence("J"));
+    m_convUTF16LE->setShortcut(QKeySequence("N"));
     m_back->setShortcut(QKeySequence("Return"));
 
     connect(m_convEUC, SIGNAL(triggered()), this, SLOT(convertFromEUC()));
     connect(m_convJIS, SIGNAL(triggered()), this, SLOT(convertFromJIS()));
     connect(m_convSJIS, SIGNAL(triggered()), this, SLOT(convertFromSJIS()));
     connect(m_convUTF8, SIGNAL(triggered()), this, SLOT(convertFromUTF8()));
+    connect(m_convUTF16, SIGNAL(triggered()), this, SLOT(convertFromUTF16()));
     connect(m_convUTF16BE, SIGNAL(triggered()), this, SLOT(convertFromUTF16BE()));
     connect(m_convUTF16LE, SIGNAL(triggered()), this, SLOT(convertFromUTF16LE()));
     connect(m_back, SIGNAL(triggered()), this, SLOT(back()));
@@ -65,10 +69,190 @@ SimpleTextView::SimpleTextView(QWidget *parent) :
 void SimpleTextView::setSource(const QByteArray &source)
 {
     m_source = source;
-#ifdef Q_OS_MAC
-    convertFromUTF8();
+
+    // BOMで文字コードを判別する
+    const char UTF8_BOM[] = { 0xEF, 0xBB, 0xBF };
+    const char UTF16BE_BOM[] = { 0xFE, 0xFF };
+    const char UTF16LE_BOM[] = { 0xFF, 0xFE };
+
+    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());
+}
+
+// http://dobon.net/vb/dotnet/string/detectcode.html より拝借
+std::string SimpleTextView::detectCode(const QByteArray &bytes)
+{
+    typedef unsigned char byte;
+    const byte bEscape = 0x1B;
+    const byte bAt = 0x40;
+    const byte bDollar = 0x24;
+    const byte bAnd = 0x26;
+    const byte bOpen = 0x28;    //'('
+    const byte bB = 0x42;
+    const byte bD = 0x44;
+    const byte bJ = 0x4A;
+    const byte bI = 0x49;
+
+    int len = bytes.size();
+    byte b1, b2, b3, b4;
+
+    bool isBinary = false;
+    for (int i = 0; i < len; i++) {
+        b1 = bytes[i];
+        if (b1 <= 0x06 || b1 == 0x7F || b1 == 0xFF) {
+            //'binary'
+            isBinary = true;
+            if (b1 == 0x00 && i < len - 1 && bytes[i + 1] <= 0x7F) {
+                return "UTF-16LE";
+            }
+        }
+    }
+    if (isBinary) {
+        return "UTF-8";
+    }
+
+    bool notJapanese = true;
+    for (int i = 0; i < len; i++) {
+        b1 = bytes[i];
+        if (b1 == bEscape || 0x80 <= b1) {
+            notJapanese = false;
+            break;
+        }
+    }
+    if (notJapanese) {
+        return "UTF-8";
+    }
+
+    for (int i = 0; i < len - 2; i++) {
+        b1 = bytes[i];
+        b2 = bytes[i + 1];
+        b3 = bytes[i + 2];
+
+        if (b1 == bEscape){
+            if ((b2 == bDollar && b3 == bAt) ||
+                (b2 == bDollar && b3 == bB) ||
+                (b2 == bOpen && (b3 == bB || b3 == bJ)) ||
+                (b2 == bOpen && b3 == bI))
+            {
+                return "ISO 2022-JP";
+            }
+            if (i < len - 3) {
+                b4 = bytes[i + 3];
+                if (b2 == bDollar && b3 == bOpen && b4 == bD) {
+                    return "ISO 2022-JP";
+                }
+                if (i < len - 5 &&
+                    b2 == bAnd && b3 == bAt && b4 == bEscape &&
+                    bytes[i + 4] == bDollar && bytes[i + 5] == bB)
+                {
+                    return "ISO 2022-JP";
+                }
+            }
+        }
+    }
+
+    int sjis = 0;
+    int euc = 0;
+    int utf8 = 0;
+    for (int i = 0; i < len - 1; i++) {
+        b1 = bytes[i];
+        b2 = bytes[i + 1];
+        if (((0x81 <= b1 && b1 <= 0x9F) || (0xE0 <= b1 && b1 <= 0xFC)) &&
+            ((0x40 <= b2 && b2 <= 0x7E) || (0x80 <= b2 && b2 <= 0xFC)))
+        {
+            sjis += 2;
+            i++;
+        }
+    }
+    for (int i = 0; i < len - 1; i++) {
+        b1 = bytes[i];
+        b2 = bytes[i + 1];
+        if (((0xA1 <= b1 && b1 <= 0xFE) && (0xA1 <= b2 && b2 <= 0xFE)) ||
+            (b1 == 0x8E && (0xA1 <= b2 && b2 <= 0xDF)))
+        {
+            euc += 2;
+            i++;
+        }
+        else if (i < len - 2) {
+            b3 = bytes[i + 2];
+            if (b1 == 0x8F && (0xA1 <= b2 && b2 <= 0xFE) &&
+                (0xA1 <= b3 && b3 <= 0xFE))
+            {
+                euc += 3;
+                i += 2;
+            }
+        }
+    }
+    for (int i = 0; i < len - 1; i++) {
+        b1 = bytes[i];
+        b2 = bytes[i + 1];
+        if ((0xC0 <= b1 && b1 <= 0xDF) && (0x80 <= b2 && b2 <= 0xBF)) {
+            utf8 += 2;
+            i++;
+        }
+        else if (i < len - 2) {
+            b3 = bytes[i + 2];
+            if ((0xE0 <= b1 && b1 <= 0xEF) && (0x80 <= b2 && b2 <= 0xBF) &&
+                (0x80 <= b3 && b3 <= 0xBF))
+            {
+                utf8 += 3;
+                i += 2;
+            }
+        }
+    }
+
+    if (euc > sjis && euc > utf8) {
+        return "EUC-JP";
+    }
+    else if (sjis > euc && sjis > utf8) {
+        return "Shift-JIS";
+    }
+    else if (utf8 > euc && utf8 > sjis) {
+        return "UTF-8";
+    }
+
+#ifdef Q_OS_WIN
+    return "Shift-JIS";
 #else
-    convertFromSJIS();
+    return "UTF-8";
 #endif
 }
 
@@ -76,36 +260,50 @@ void SimpleTextView::convertFromEUC()
 {
     QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
     setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("EUC-JP");
 }
 
 void SimpleTextView::convertFromJIS()
 {
     QTextCodec *codec = QTextCodec::codecForName("ISO 2022-JP");
     setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("ISO 2022-JP");
 }
 
 void SimpleTextView::convertFromSJIS()
 {
     QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
     setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("Shift-JIS");
+
 }
 
 void SimpleTextView::convertFromUTF8()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-8");
     setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("UTF-8");
+}
+
+void SimpleTextView::convertFromUTF16()
+{
+    QTextCodec *codec = QTextCodec::codecForName("UTF-16");
+    setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("UTF-16");
 }
 
 void SimpleTextView::convertFromUTF16BE()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
     setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("UTF-16BE");
 }
 
 void SimpleTextView::convertFromUTF16LE()
 {
     QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
     setPlainText(codec->toUnicode(m_source));
+    getMainWnd()->statusBar()->showMessage("UTF-16LE");
 }
 
 void SimpleTextView::back()
index 6361e80..5eecd3b 100644 (file)
@@ -16,11 +16,14 @@ private:
     QAction *m_convJIS;
     QAction *m_convSJIS;
     QAction *m_convUTF8;
+    QAction *m_convUTF16;
     QAction *m_convUTF16BE;
     QAction *m_convUTF16LE;
     QAction *m_back;
     QByteArray m_source;
 
+    std::string detectCode(const QByteArray &bytes);
+
 signals:
     void viewFinished(QWidget *sender);
 
@@ -31,6 +34,7 @@ private slots:
     void convertFromJIS();
     void convertFromSJIS();
     void convertFromUTF8();
+    void convertFromUTF16();
     void convertFromUTF16BE();
     void convertFromUTF16LE();
     void back();