OSDN Git Service

ファイル読込の中止処理を修正
[gefu/Gefu.git] / simpletextview.cpp
index 67f8018..d78482b 100644 (file)
@@ -1,6 +1,6 @@
-#include "common.h"
-#include "simpletextview.h"
 #include "mainwindow.h"
+#include "preferences.h"
+#include "simpletextview.h"
 
 #include <QDebug>
 #include <QMenu>
 #include <QShortcut>
 #include <QTextCodec>
 #include <QStatusBar>
-
+#include <QApplication>
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleTextView::SimpleTextView
+/// \param parent   親ウィジェット
+///
+/// コンストラクタ
+///
 SimpleTextView::SimpleTextView(QWidget *parent) :
     QPlainTextEdit(parent),
-    m_convEUC(NULL),
-    m_convJIS(NULL),
-    m_convSJIS(NULL),
-    m_convUTF8(NULL),
-    m_convUTF16BE(NULL),
-    m_convUTF16LE(NULL),
-    m_back(NULL)
+    AbstractView(),
+    m_source()
 {
     setReadOnly(true);
+    setContextMenuPolicy(Qt::NoContextMenu);
+}
 
-    QSettings settings;
-    QPalette palette = this->palette();
-    palette.setColor(QPalette::Base,
-                     settings.value(IniKey_ViewColorBgNormal).value<QColor>());
-    palette.setColor(QPalette::Text,
-                     settings.value(IniKey_ViewColorFgNormal).value<QColor>());
-    setPalette(palette);
-
-    QFont font = this->font();
-#ifdef Q_OS_MAC
-    font.setFamily("Menlo");
-#else
-    font.setFamily("MS ゴシック");
-#endif
-    setFont(font);
-
-    setContextMenuPolicy(Qt::DefaultContextMenu);
-    m_convEUC = new QAction(tr("EUC-JPで再読込"), this);
-    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);
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleTextView::initialize
+/// \param w    メインウィンドウオブジェクト
+///
+/// 初期化処理を行います。
+///
+void SimpleTextView::initialize(MainWindow *w)
+{
+    qDebug() << "SimpleTextView::initialize()";
 
-    m_convEUC->setShortcut(QKeySequence("E"));
-    m_convJIS->setShortcut(QKeySequence("J"));
-    m_convSJIS->setShortcut(QKeySequence("S"));
-    m_convUTF8->setShortcut(QKeySequence("U"));
-    m_convUTF8->setShortcut(QKeySequence("I"));
-    m_convUTF16BE->setShortcut(QKeySequence("J"));
-    m_convUTF16LE->setShortcut(QKeySequence("N"));
-    m_back->setShortcut(QKeySequence("Return"));
+    connect(this, SIGNAL(statusChanged(QString)), w, SLOT(view_statusChanged(QString)));
+    connect(this, SIGNAL(copyAvailable(bool)), w, SLOT(view_copyAvailable(bool)));
 
-    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()));
+    installEventFilter(w);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+/// \brief SimpleTextView::setSource
+/// \param source   表示するデータ
+///
+/// データを表示します。
+///
 void SimpleTextView::setSource(const QByteArray &source)
 {
+    qDebug() << "SimpleTextView::setSource()" << source.size();
+
     m_source = source;
+    if (m_source.size() == 0) {
+        setPlainText("");
+        emit statusChanged("");
+        return;
+    }
 
-    // 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();
-    }
+    setPlainText(codec->toUnicode(m_source));
 
-    QByteArray first1KB = m_source.left(1024);
-    // 文字コードを示す文字列で判別する
+    emit statusChanged(code.c_str());
+}
+
+void SimpleTextView::convertFromEUC()
+{
+    QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
+    setPlainText(codec->toUnicode(m_source));
+    emit statusChanged("EUC-JP");
+}
+
+void SimpleTextView::convertFromJIS()
+{
+    QTextCodec *codec = QTextCodec::codecForName("ISO 2022-JP");
+    setPlainText(codec->toUnicode(m_source));
+    emit statusChanged("ISO 2022-JP");
+}
+
+void SimpleTextView::convertFromSJIS()
+{
+    QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
+    setPlainText(codec->toUnicode(m_source));
+    emit statusChanged("Shift-JIS");
+}
+
+void SimpleTextView::convertFromUTF8()
+{
     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;
-    }
+    setPlainText(codec->toUnicode(m_source));
+    emit statusChanged("UTF-8");
+}
+
+void SimpleTextView::convertFromUTF16()
+{
+    QTextCodec *codec = QTextCodec::codecForName("UTF-16");
+    setPlainText(codec->toUnicode(m_source));
+    emit statusChanged("UTF-16");
+}
 
-    std::string code = detectCode(first1KB);
-    codec = QTextCodec::codecForName(code.c_str());
+void SimpleTextView::convertFromUTF16BE()
+{
+    QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
+    setPlainText(codec->toUnicode(m_source));
+    emit statusChanged("UTF-16BE");
+}
+
+void SimpleTextView::convertFromUTF16LE()
+{
+    QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
     setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage(code.c_str());
+    emit statusChanged("UTF-16LE");
 }
 
 // http://dobon.net/vb/dotnet/string/detectcode.html より拝借
@@ -140,7 +138,7 @@ std::string SimpleTextView::detectCode(const QByteArray &bytes)
         if (b1 <= 0x06 || b1 == 0x7F || b1 == 0xFF) {
             //'binary'
             isBinary = true;
-            if (b1 == 0x00 && i < len - 1 && bytes[i + 1] <= 0x7F) {
+            if (b1 == 0x00 && i < len - 1 && static_cast<byte>(bytes[i + 1]) <= 0x7F) {
                 return "UTF-16LE";
             }
         }
@@ -256,126 +254,23 @@ std::string SimpleTextView::detectCode(const QByteArray &bytes)
 #endif
 }
 
-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()
+void SimpleTextView::scaleUp()
 {
-    QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
-    setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("Shift-JIS");
+    qDebug() << "SimpleTextView::scaleUp()";
 
+    Preferences prefs(this);
+    QFont font = prefs.getTextViewFont();
+    font.setPointSize(font.pointSize() + 1);
+    prefs.setTextViewFont(font);
 }
 
-void SimpleTextView::convertFromUTF8()
+void SimpleTextView::scaleDown()
 {
-    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");
-}
+    qDebug() << "SimpleTextView::scaleDown()";
 
-void SimpleTextView::convertFromUTF16LE()
-{
-    QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
-    setPlainText(codec->toUnicode(m_source));
-    getMainWnd()->statusBar()->showMessage("UTF-16LE");
-}
-
-void SimpleTextView::back()
-{
-    emit viewFinished(this);
-}
-
-void SimpleTextView::keyPressEvent(QKeyEvent *event)
-{
-    QString modifier = QString::null;
-    if (event->modifiers() & Qt::ShiftModifier)     { modifier += "Shift+"; }
-    if (event->modifiers() & Qt::ControlModifier)   { modifier += "Ctrl+"; }
-    if (event->modifiers() & Qt::AltModifier)       { modifier += "Alt+"; }
-    if (event->modifiers() & Qt::MetaModifier)      { modifier += "Meta+"; }
-
-    QString key = QKeySequence(event->key()).toString();
-    QString ksq = QKeySequence(modifier + key).toString();
-
-    if (ksq == "Return" || ksq == "Backspace" || ksq == "W") {
-        emit viewFinished(this);
-        event->accept();
-        return;
-    }
-
-    if (!ksq.isEmpty()) {
-        foreach (QObject *obj, this->children()) {
-            QAction *action = qobject_cast<QAction*>(obj);
-            if (action && action->isEnabled()) {
-                foreach (const QKeySequence &keySeq, action->shortcuts()) {
-                    if (ksq == keySeq.toString()) {
-                        qDebug() << "emit " << ksq << " " << action->objectName();
-                        emit action->triggered();
-                        event->accept();
-                        return;
-                    }
-                }
-            }
-        }
-
-        foreach (QObject *obj, getMainWnd()->children()) {
-            QAction *action = qobject_cast<QAction*>(obj);
-            if (action && action->isEnabled()) {
-                foreach (const QKeySequence &keySeq, action->shortcuts()) {
-                    if (ksq == keySeq.toString()) {
-                        qDebug() << "emit " << ksq << " " << action->objectName();
-                        emit action->triggered();
-                        event->accept();
-                        return;
-                    }
-                }
-            }
-        }
-    }
-
-    if (ksq != "Down" && ksq != "Up") {
-        qDebug() << ksq;
-    }
-
-    QPlainTextEdit::keyPressEvent(event);
-}
-
-
-void SimpleTextView::contextMenuEvent(QContextMenuEvent *event)
-{
-    qDebug() << "contextMenuEvent();";
-    QMenu menu(this);
-    menu.addAction(m_convEUC);
-    menu.addAction(m_convJIS);
-    menu.addAction(m_convSJIS);
-    menu.addAction(m_convUTF8);
-    menu.addAction(m_convUTF16BE);
-    menu.addAction(m_convUTF16LE);
-    menu.addAction(m_back);
-    menu.exec(event->globalPos());
+    Preferences prefs(this);
+    QFont font = prefs.getTextViewFont();
+    font.setPointSize(font.pointSize() - 1);
+    prefs.setTextViewFont(font);
 }