diff options
Diffstat (limited to 'examples/qwerty/qwerty.cpp')
-rw-r--r-- | examples/qwerty/qwerty.cpp | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/examples/qwerty/qwerty.cpp b/examples/qwerty/qwerty.cpp new file mode 100644 index 0000000..14bdd8b --- /dev/null +++ b/examples/qwerty/qwerty.cpp @@ -0,0 +1,354 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "qwerty.h" +#include <qapplication.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qpopupmenu.h> +#include <qtextstream.h> +#include <qpainter.h> +#include <qmessagebox.h> +#include <qpaintdevicemetrics.h> +#include <qptrlist.h> +#include <qfontdialog.h> + +#include <qtextcodec.h> + +const bool no_writing = FALSE; + +static QPtrList<QTextCodec> *codecList = 0; + +enum { Uni = 0, MBug = 1, Lat1 = 2, Local = 3, Guess = 4, Codec = 5 }; + + +Editor::Editor( QWidget * parent , const char * name ) + : QWidget( parent, name, WDestructiveClose ) +{ + m = new QMenuBar( this, "menu" ); + + QPopupMenu * file = new QPopupMenu(); + Q_CHECK_PTR( file ); + m->insertItem( "&File", file ); + + file->insertItem( "&New", this, SLOT(newDoc()), ALT+Key_N ); + file->insertItem( "&Open...", this, SLOT(load()), ALT+Key_O ); + file->insertItem( "&Save...", this, SLOT(save()), ALT+Key_S ); + file->insertSeparator(); + open_as = new QPopupMenu(); + file->insertItem( "Open &As", open_as ); + save_as = new QPopupMenu(); + file->insertItem( "Sa&ve As", save_as ); + file->insertItem( "Add &Encoding", this, SLOT(addEncoding()) ); +#ifndef QT_NO_PRINTER + file->insertSeparator(); + file->insertItem( "&Print...", this, SLOT(print()), ALT+Key_P ); +#endif + file->insertSeparator(); + file->insertItem( "&Close", this, SLOT(close()),ALT+Key_W ); + file->insertItem( "&Quit", qApp, SLOT(closeAllWindows()), ALT+Key_Q ); + + connect( save_as, SIGNAL(activated(int)), this, SLOT(saveAsEncoding(int)) ); + connect( open_as, SIGNAL(activated(int)), this, SLOT(openAsEncoding(int)) ); + rebuildCodecList(); + + QPopupMenu * edit = new QPopupMenu(); + Q_CHECK_PTR( edit ); + m->insertItem( "&Edit", edit ); + + edit->insertItem( "To &Uppercase", this, SLOT(toUpper()), ALT+Key_U ); + edit->insertItem( "To &Lowercase", this, SLOT(toLower()), ALT+Key_L ); +#ifndef QT_NO_FONTDIALOG + edit->insertSeparator(); + edit->insertItem( "&Select Font" , this, SLOT(font()), ALT+Key_T ); +#endif + changed = FALSE; + e = new QMultiLineEdit( this, "editor" ); + connect( e, SIGNAL( textChanged() ), this, SLOT( textChanged() ) ); + + // We use Unifont - if you have it installed you'll see all + // Unicode character glyphs. + // + // Unifont only comes in one pixel size, so we cannot let + // it change pixel size as the display DPI changes. + // + QFont unifont("unifont",16,50); unifont.setPixelSize(16); + e->setFont( unifont ); + + e->setFocus(); +} + +Editor::~Editor() +{ +} + +void Editor::font() +{ +#ifndef QT_NO_FONTDIALOG + bool ok; + QFont f = QFontDialog::getFont( &ok, e->font() ); + if ( ok ) { + e->setFont( f ); + } +#endif +} + + + +void Editor::rebuildCodecList() +{ + delete codecList; + codecList = new QPtrList<QTextCodec>; + QTextCodec *codec; + int i; + for (i = 0; (codec = QTextCodec::codecForIndex(i)); i++) + codecList->append( codec ); + int n = codecList->count(); + for (int pm=0; pm<2; pm++) { + QPopupMenu* menu = pm ? open_as : save_as; + menu->clear(); + QString local = "Local ("; + local += QTextCodec::codecForLocale()->name(); + local += ")"; + menu->insertItem( local, Local ); + menu->insertItem( "Unicode", Uni ); + menu->insertItem( "Latin1", Lat1 ); + menu->insertItem( "Microsoft Unicode", MBug ); + if ( pm ) + menu->insertItem( "[guess]", Guess ); + for ( i = 0; i < n; i++ ) + menu->insertItem( codecList->at(i)->name(), Codec + i ); + } +} + +void Editor::newDoc() +{ + Editor *ed = new Editor; + if ( qApp->desktop()->size().width() < 450 + || qApp->desktop()->size().height() < 450 ) { + ed->showMaximized(); + } else { + ed->resize( 400, 400 ); + ed->show(); + } +} + + +void Editor::load() +{ +#ifndef QT_NO_FILEDIALOG + QString fn = QFileDialog::getOpenFileName( QString::null, QString::null, this ); + if ( !fn.isEmpty() ) + load( fn, -1 ); +#endif +} + +void Editor::load( const QString& fileName, int code ) +{ + QFile f( fileName ); + if ( !f.open( IO_ReadOnly ) ) + return; + + e->setAutoUpdate( FALSE ); + + QTextStream t(&f); + if ( code >= Codec ) + t.setCodec( codecList->at(code-Codec) ); + else if ( code == Uni ) + t.setEncoding( QTextStream::Unicode ); + else if ( code == MBug ) + t.setEncoding( QTextStream::UnicodeReverse ); + else if ( code == Lat1 ) + t.setEncoding( QTextStream::Latin1 ); + else if ( code == Guess ) { + QFile f(fileName); + f.open(IO_ReadOnly); + char buffer[256]; + int l = 256; + l=f.readBlock(buffer,l); + QTextCodec* codec = QTextCodec::codecForContent(buffer, l); + if ( codec ) { + QMessageBox::information(this,"Encoding",QString("Codec: ")+codec->name()); + t.setCodec( codec ); + } + } + e->setText( t.read() ); + f.close(); + + e->setAutoUpdate( TRUE ); + e->repaint(); + setCaption( fileName ); + + changed = FALSE; +} + +void Editor::openAsEncoding( int code ) +{ +#ifndef QT_NO_FILEDIALOG + //storing filename (proper save) is left as an exercise... + QString fn = QFileDialog::getOpenFileName( QString::null, QString::null, this ); + if ( !fn.isEmpty() ) + (void) load( fn, code ); +#endif +} + +bool Editor::save() +{ +#ifndef QT_NO_FILEDIALOG + //storing filename (proper save) is left as an exercise... + QString fn = QFileDialog::getSaveFileName( QString::null, QString::null, this ); + if ( !fn.isEmpty() ) + return saveAs( fn ); + return FALSE; +#endif +} + +void Editor::saveAsEncoding( int code ) +{ +#ifndef QT_NO_FILEDIALOG + //storing filename (proper save) is left as an exercise... + QString fn = QFileDialog::getSaveFileName( QString::null, QString::null, this ); + if ( !fn.isEmpty() ) + (void) saveAs( fn, code ); +#endif +} + +void Editor::addEncoding() +{ +#ifndef QT_NO_FILEDIALOG + QString fn = QFileDialog::getOpenFileName( QString::null, "*.map", this ); + if ( !fn.isEmpty() ) { + QFile f(fn); + if (f.open(IO_ReadOnly)) { + if (QTextCodec::loadCharmap(&f)) { + rebuildCodecList(); + } else { + QMessageBox::warning(0,"Charmap error", + "The file did not contain a valid charmap.\n\n" + "A charmap file should look like this:\n" + " <code_set_name> thename\n" + " <escape_char> /\n" + " % alias thealias\n" + " CHARMAP\n" + " <tokenname> /x12 <U3456>\n" + " <tokenname> /xAB/x12 <U0023>\n" + " ...\n" + " END CHARMAP\n" + ); + } + } + } +#endif +} + + +bool Editor::saveAs( const QString& fileName, int code ) +{ + QFile f( fileName ); + if ( no_writing || !f.open( IO_WriteOnly ) ) { + QMessageBox::warning(this,"I/O Error", + QString("The file could not be opened.\n\n") + +fileName); + return FALSE; + } + QTextStream t(&f); + if ( code >= Codec ) + t.setCodec( codecList->at(code-Codec) ); + else if ( code == Uni ) + t.setEncoding( QTextStream::Unicode ); + else if ( code == MBug ) + t.setEncoding( QTextStream::UnicodeReverse ); + else if ( code == Lat1 ) + t.setEncoding( QTextStream::Latin1 ); + t << e->text(); + f.close(); + setCaption( fileName ); + changed = FALSE; + return TRUE; +} + +void Editor::print() +{ +#ifndef QT_NO_PRINTER + if ( printer.setup(this) ) { // opens printer dialog + printer.setFullPage(TRUE); // we'll set our own margins + QPainter p; + p.begin( &printer ); // paint on printer + p.setFont( e->font() ); + QFontMetrics fm = p.fontMetrics(); + QPaintDeviceMetrics metrics( &printer ); // need width/height + // of printer surface + const int MARGIN = metrics.logicalDpiX() / 2; // half-inch margin + int yPos = MARGIN; // y position for each line + + for( int i = 0 ; i < e->numLines() ; i++ ) { + if ( printer.aborted() ) + break; + if ( yPos + fm.lineSpacing() > metrics.height() - MARGIN ) { + // no more room on this page + if ( !printer.newPage() ) // start new page + break; // some error + yPos = MARGIN; // back to top of page + } + p.drawText( MARGIN, yPos, metrics.width() - 2*MARGIN, + fm.lineSpacing(), ExpandTabs, e->textLine( i ) ); + yPos += fm.lineSpacing(); + } + p.end(); // send job to printer + } +#endif +} + +void Editor::resizeEvent( QResizeEvent * ) +{ + if ( e && m ) + e->setGeometry( 0, m->height(), width(), height() - m->height() ); +} + +void Editor::closeEvent( QCloseEvent *event ) +{ + event->accept(); + + if ( changed ) { // the text has been changed + switch ( QMessageBox::warning( this, "Qwerty", + "Save changes to Document?", + tr("&Yes"), + tr("&No"), + tr("Cancel"), + 0, 2) ) { + case 0: // yes + if ( save() ) + event->accept(); + else + event->ignore(); + break; + case 1: // no + event->accept(); + break; + default: // cancel + event->ignore(); + break; + } + } +} + +void Editor::toUpper() +{ + e->setText(e->text().upper()); +} + +void Editor::toLower() +{ + e->setText(e->text().lower()); +} + +void Editor::textChanged() +{ + changed = TRUE; +} |