1 #include "mainwindow.h"
2 #include "preferences.h"
3 #include "simpletextview.h"
11 #include <QApplication>
13 ///////////////////////////////////////////////////////////////////////////////
14 /// \brief SimpleTextView::SimpleTextView
15 /// \param parent 親ウィジェット
19 SimpleTextView::SimpleTextView(QWidget *parent) :
20 QPlainTextEdit(parent),
25 setContextMenuPolicy(Qt::NoContextMenu);
28 ///////////////////////////////////////////////////////////////////////////////
29 /// \brief SimpleTextView::initialize
30 /// \param w メインウィンドウオブジェクト
34 void SimpleTextView::initialize(MainWindow *w)
36 qDebug() << "SimpleTextView::initialize()";
38 connect(this, SIGNAL(statusChanged(QString)), w, SLOT(view_statusChanged(QString)));
39 connect(this, SIGNAL(copyAvailable(bool)), w, SLOT(view_copyAvailable(bool)));
41 installEventFilter(w);
44 ///////////////////////////////////////////////////////////////////////////////
45 /// \brief SimpleTextView::setSource
46 /// \param source 表示するデータ
50 void SimpleTextView::setSource(const QByteArray &source)
52 qDebug() << "SimpleTextView::setSource()" << source.size();
55 if (m_source.size() == 0) {
57 emit statusChanged("");
61 std::string code = detectCode(m_source.left(1024));
62 QTextCodec *codec = QTextCodec::codecForName(code.c_str());
64 setPlainText(codec->toUnicode(m_source));
66 emit statusChanged(code.c_str());
69 void SimpleTextView::convertFromEUC()
71 QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
72 setPlainText(codec->toUnicode(m_source));
73 emit statusChanged("EUC-JP");
76 void SimpleTextView::convertFromJIS()
78 QTextCodec *codec = QTextCodec::codecForName("ISO 2022-JP");
79 setPlainText(codec->toUnicode(m_source));
80 emit statusChanged("ISO 2022-JP");
83 void SimpleTextView::convertFromSJIS()
85 QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
86 setPlainText(codec->toUnicode(m_source));
87 emit statusChanged("Shift-JIS");
90 void SimpleTextView::convertFromUTF8()
92 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
93 setPlainText(codec->toUnicode(m_source));
94 emit statusChanged("UTF-8");
97 void SimpleTextView::convertFromUTF16()
99 QTextCodec *codec = QTextCodec::codecForName("UTF-16");
100 setPlainText(codec->toUnicode(m_source));
101 emit statusChanged("UTF-16");
104 void SimpleTextView::convertFromUTF16BE()
106 QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
107 setPlainText(codec->toUnicode(m_source));
108 emit statusChanged("UTF-16BE");
111 void SimpleTextView::convertFromUTF16LE()
113 QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
114 setPlainText(codec->toUnicode(m_source));
115 emit statusChanged("UTF-16LE");
118 // http://dobon.net/vb/dotnet/string/detectcode.html より拝借
119 std::string SimpleTextView::detectCode(const QByteArray &bytes)
121 typedef unsigned char byte;
122 const byte bEscape = 0x1B;
123 const byte bAt = 0x40;
124 const byte bDollar = 0x24;
125 const byte bAnd = 0x26;
126 const byte bOpen = 0x28; //'('
127 const byte bB = 0x42;
128 const byte bD = 0x44;
129 const byte bJ = 0x4A;
130 const byte bI = 0x49;
132 int len = bytes.size();
135 bool isBinary = false;
136 for (int i = 0; i < len; i++) {
138 if (b1 <= 0x06 || b1 == 0x7F || b1 == 0xFF) {
141 if (b1 == 0x00 && i < len - 1 && static_cast<byte>(bytes[i + 1]) <= 0x7F) {
150 bool notJapanese = true;
151 for (int i = 0; i < len; i++) {
153 if (b1 == bEscape || 0x80 <= b1) {
162 for (int i = 0; i < len - 2; i++) {
168 if ((b2 == bDollar && b3 == bAt) ||
169 (b2 == bDollar && b3 == bB) ||
170 (b2 == bOpen && (b3 == bB || b3 == bJ)) ||
171 (b2 == bOpen && b3 == bI))
173 return "ISO 2022-JP";
177 if (b2 == bDollar && b3 == bOpen && b4 == bD) {
178 return "ISO 2022-JP";
181 b2 == bAnd && b3 == bAt && b4 == bEscape &&
182 bytes[i + 4] == bDollar && bytes[i + 5] == bB)
184 return "ISO 2022-JP";
193 for (int i = 0; i < len - 1; i++) {
196 if (((0x81 <= b1 && b1 <= 0x9F) || (0xE0 <= b1 && b1 <= 0xFC)) &&
197 ((0x40 <= b2 && b2 <= 0x7E) || (0x80 <= b2 && b2 <= 0xFC)))
203 for (int i = 0; i < len - 1; i++) {
206 if (((0xA1 <= b1 && b1 <= 0xFE) && (0xA1 <= b2 && b2 <= 0xFE)) ||
207 (b1 == 0x8E && (0xA1 <= b2 && b2 <= 0xDF)))
212 else if (i < len - 2) {
214 if (b1 == 0x8F && (0xA1 <= b2 && b2 <= 0xFE) &&
215 (0xA1 <= b3 && b3 <= 0xFE))
222 for (int i = 0; i < len - 1; i++) {
225 if ((0xC0 <= b1 && b1 <= 0xDF) && (0x80 <= b2 && b2 <= 0xBF)) {
229 else if (i < len - 2) {
231 if ((0xE0 <= b1 && b1 <= 0xEF) && (0x80 <= b2 && b2 <= 0xBF) &&
232 (0x80 <= b3 && b3 <= 0xBF))
240 if (euc > sjis && euc > utf8) {
243 else if (sjis > euc && sjis > utf8) {
246 else if (utf8 > euc && utf8 > sjis) {
258 void SimpleTextView::scaleUp()
260 qDebug() << "SimpleTextView::scaleUp()";
262 Preferences prefs(this);
263 QFont font = prefs.getTextViewFont();
264 font.setPointSize(font.pointSize() + 1);
265 prefs.setTextViewFont(font);
268 void SimpleTextView::scaleDown()
270 qDebug() << "SimpleTextView::scaleDown()";
272 Preferences prefs(this);
273 QFont font = prefs.getTextViewFont();
274 font.setPointSize(font.pointSize() - 1);
275 prefs.setTextViewFont(font);