/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the either Technology Preview License Agreement or the ** Beta Release License Agreement. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://www.qtsoftware.com/contact. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "previewform.h" MainWindow::MainWindow() { textEdit = new QTextEdit; textEdit->setLineWrapMode(QTextEdit::NoWrap); setCentralWidget(textEdit); findCodecs(); previewForm = new PreviewForm(this); previewForm->setCodecList(codecs); createActions(); createMenus(); setWindowTitle(tr("Codecs")); resize(500, 400); } void MainWindow::open() { QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { QFile file(fileName); if (!file.open(QFile::ReadOnly)) { QMessageBox::warning(this, tr("Codecs"), tr("Cannot read file %1:\n%2") .arg(fileName) .arg(file.errorString())); return; } QByteArray data = file.readAll(); previewForm->setEncodedData(data); if (previewForm->exec()) textEdit->setPlainText(previewForm->decodedString()); } } void MainWindow::save() { QString fileName = QFileDialog::getSaveFileName(this); if (!fileName.isEmpty()) { QFile file(fileName); if (!file.open(QFile::WriteOnly | QFile::Text)) { QMessageBox::warning(this, tr("Codecs"), tr("Cannot write file %1:\n%2") .arg(fileName) .arg(file.errorString())); return; } QAction *action = qobject_cast(sender()); QByteArray codecName = action->data().toByteArray(); QTextStream out(&file); out.setCodec(codecName); out << textEdit->toPlainText(); } } void MainWindow::about() { QMessageBox::about(this, tr("About Codecs"), tr("The Codecs example demonstrates how to read and write " "files using various encodings.")); } void MainWindow::aboutToShowSaveAsMenu() { QString currentText = textEdit->toPlainText(); foreach (QAction *action, saveAsActs) { QByteArray codecName = action->data().toByteArray(); QTextCodec *codec = QTextCodec::codecForName(codecName); action->setVisible(codec && codec->canEncode(currentText)); } } void MainWindow::findCodecs() { QMap codecMap; QRegExp iso8859RegExp("ISO[- ]8859-([0-9]+).*"); foreach (int mib, QTextCodec::availableMibs()) { QTextCodec *codec = QTextCodec::codecForMib(mib); QString sortKey = codec->name().toUpper(); int rank; if (sortKey.startsWith("UTF-8")) { rank = 1; } else if (sortKey.startsWith("UTF-16")) { rank = 2; } else if (iso8859RegExp.exactMatch(sortKey)) { if (iso8859RegExp.cap(1).size() == 1) rank = 3; else rank = 4; } else { rank = 5; } sortKey.prepend(QChar('0' + rank)); codecMap.insert(sortKey, codec); } codecs = codecMap.values(); } void MainWindow::createActions() { openAct = new QAction(tr("&Open..."), this); openAct->setShortcuts(QKeySequence::Open); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); foreach (QTextCodec *codec, codecs) { QString text = tr("%1...").arg(QString(codec->name())); QAction *action = new QAction(text, this); action->setData(codec->name()); connect(action, SIGNAL(triggered()), this, SLOT(save())); saveAsActs.append(action); } exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcuts(QKeySequence::Quit); connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); aboutAct = new QAction(tr("&About"), this); connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); aboutQtAct = new QAction(tr("About &Qt"), this); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); } void MainWindow::createMenus() { saveAsMenu = new QMenu(tr("&Save As"), this); foreach (QAction *action, saveAsActs) saveAsMenu->addAction(action); connect(saveAsMenu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowSaveAsMenu())); fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(openAct); fileMenu->addMenu(saveAsMenu); fileMenu->addSeparator(); fileMenu->addAction(exitAct); helpMenu = new QMenu(tr("&Help"), this); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); menuBar()->addMenu(fileMenu); menuBar()->addSeparator(); menuBar()->addMenu(helpMenu); }