summaryrefslogtreecommitdiffstats
path: root/qtjava/javalib/examples/qwerty/Editor.java
diff options
context:
space:
mode:
Diffstat (limited to 'qtjava/javalib/examples/qwerty/Editor.java')
-rw-r--r--qtjava/javalib/examples/qwerty/Editor.java351
1 files changed, 351 insertions, 0 deletions
diff --git a/qtjava/javalib/examples/qwerty/Editor.java b/qtjava/javalib/examples/qwerty/Editor.java
new file mode 100644
index 00000000..ba11c685
--- /dev/null
+++ b/qtjava/javalib/examples/qwerty/Editor.java
@@ -0,0 +1,351 @@
+/***************************************************************************
+* $Id$
+**
+* Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+* This file is part of an example program for Qt. This example
+* program may be used, distributed and modified without limitation.
+**
+****************************************************************************/
+
+import org.kde.qt.*;
+import java.util.ArrayList;
+
+class Editor extends QWidget
+{
+private QMenuBar m;
+private QMultiLineEdit e;
+private QPrinter printer = new QPrinter();
+private QPopupMenu save_as;
+private QPopupMenu open_as;
+private boolean changed;
+
+
+private boolean no_writing = false;
+
+static ArrayList codecList = null;
+
+static final int Uni = 0;
+static final int MBug = 1;
+static final int Lat1 = 2;
+static final int Local = 3;
+static final int Guess = 4;
+static final int Codec = 5;
+
+
+Editor( )
+{
+ this(null, null);
+}
+
+Editor( QWidget parent , String name )
+{
+ super( parent, name, WDestructiveClose );
+ m = new QMenuBar( this, "menu" );
+
+ QPopupMenu file = new QPopupMenu(this);
+ m.insertItem( "&File", file );
+
+ file.insertItem( "&New", this, SLOT("newDoc()"), new QKeySequence(ALT+Key_N) );
+ file.insertItem( "&Open...", this, SLOT("load()"), new QKeySequence(ALT+Key_O) );
+ file.insertItem( "&Save...", this, SLOT("save()"), new QKeySequence(ALT+Key_S) );
+ file.insertSeparator();
+ open_as = new QPopupMenu(file);
+ file.insertItem( "Open &As", open_as );
+ save_as = new QPopupMenu(file);
+ file.insertItem( "Sa&ve As", save_as );
+ file.insertItem( "Add &Encoding", this, SLOT("addEncoding()") );
+ file.insertSeparator();
+ file.insertItem( "&Print...", this, SLOT("print()"), new QKeySequence(ALT+Key_P) );
+ file.insertSeparator();
+ file.insertItem( "&Close", this, SLOT("close()"),new QKeySequence(ALT+Key_W) );
+ file.insertItem( "&Quit", qApp(), SLOT("closeAllWindows()"), new QKeySequence(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(m);
+ m.insertItem( "&Edit", edit );
+
+ edit.insertItem( "To &Uppercase", this, SLOT("toUpper()"), new QKeySequence(ALT+Key_U) );
+ edit.insertItem( "To &Lowercase", this, SLOT("toLower()"), new QKeySequence(ALT+Key_L) );
+ edit.insertSeparator();
+ edit.insertItem( "&Select Font" , this, SLOT("getFont()"), new QKeySequence(ALT+Key_F) );
+ 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 = new QFont("unifont",16,50); unifont.setPixelSize(16);
+ e.setFont( unifont );
+
+ e.setFocus();
+}
+
+
+public void getFont()
+{
+ boolean[] ok = { true };
+ QFont f = QFontDialog.getFont( ok, e.font() );
+ if ( ok[0] ) {
+ e.setFont( f );
+ }
+}
+
+
+
+void rebuildCodecList()
+{
+ codecList = new ArrayList();
+ QTextCodec codec = null;
+ int i;
+ for (i = 0; (codec = QTextCodec.codecForIndex(i)) != null; i++)
+ codecList.add( codec );
+ int n = codecList.size();
+ for (int pm=0; pm<2; pm++) {
+ QPopupMenu menu = pm != 0 ? open_as : save_as;
+ menu.clear();
+ String 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 != 0 )
+ menu.insertItem( "[guess]", Guess );
+ for ( i = 0; i < n; i++ )
+ menu.insertItem( ((QTextCodec) codecList.get(i)).name(), Codec + i );
+ }
+}
+
+void 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 load()
+{
+ String fn = QFileDialog.getOpenFileName( "", "", this );
+ if ( fn != null )
+ load( fn, -1 );
+}
+
+void load( String fileName )
+{
+ load(fileName, -1);
+}
+
+void load( String fileName, int code )
+{
+ QFile f = new QFile( fileName );
+ if ( !f.open( QIODevice.IO_ReadOnly ) )
+ return;
+
+ e.setAutoUpdate( false );
+
+ QTextStream t = new QTextStream(f);
+ if ( code >= Codec )
+ t.setCodec( (QTextCodec) codecList.get(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 ) {
+ f = new QFile(fileName);
+ f.open(QIODevice.IO_ReadOnly);
+ StringBuffer buffer = new StringBuffer();
+ int l = 256;
+ l=(int)f.readBlock(buffer,l);
+ QTextCodec codec = QTextCodec.codecForContent(buffer.toString(), l);
+ if ( codec != null ) {
+ QMessageBox.information(this,"Encoding","Codec: "+codec.name());
+ t.setCodec( codec );
+ }
+ }
+ e.setText( t.read() );
+ f.close();
+
+ e.setAutoUpdate( true );
+ e.repaint();
+ setCaption( fileName );
+
+ changed = false;
+}
+
+void openAsEncoding( int code )
+{
+ //storing filename (proper save) is left as an exercise...
+ String fn = QFileDialog.getOpenFileName( "", "", this );
+ if ( !fn.equals("") )
+ load( fn, code );
+}
+
+boolean save()
+{
+ //storing filename (proper save) is left as an exercise...
+ String fn = QFileDialog.getSaveFileName( "", "", this );
+ if ( !fn.equals("") )
+ return saveAs( fn );
+ return false;
+}
+
+void saveAsEncoding( int code )
+{
+ //storing filename (proper save) is left as an exercise...
+ String fn = QFileDialog.getSaveFileName( "", "", this );
+ if ( !fn.equals("") )
+ saveAs( fn, code );
+}
+
+void addEncoding()
+{
+ String fn = QFileDialog.getOpenFileName( "", "*.map", this );
+ if ( !fn.equals("") ) {
+ QFile f = new QFile(fn);
+ if (f.open(QIODevice.IO_ReadOnly)) {
+ if (QTextCodec.loadCharmap(f) != null) {
+ rebuildCodecList();
+ } else {
+ QMessageBox.warning(null,"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"
+ );
+ }
+ }
+ }
+}
+
+
+boolean saveAs( String fileName )
+{
+ return saveAs(fileName, -1);
+}
+
+boolean saveAs( String fileName, int code )
+{
+ QFile f = new QFile( fileName );
+ if ( no_writing || !f.open( QIODevice.IO_WriteOnly ) ) {
+ QMessageBox.warning(this,"I/O Error",
+ "The file could not be opened.\n\n"
+ +fileName);
+ return false;
+ }
+ QTextStream t = new QTextStream(f);
+ if ( code >= Codec )
+ t.setCodec( (QTextCodec) codecList.get(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.writeRawBytes(e.text(), e.text().length());
+ f.close();
+ setCaption( fileName );
+ changed = false;
+ return true;
+}
+
+void print()
+{
+ if ( printer.setup(this) ) { // opens printer dialog
+ printer.setFullPage(true); // we'll set our own margins
+ QPainter p = new QPainter();
+ p.begin( printer ); // paint on printer
+ p.setFont( e.font() );
+ QFontMetrics fm = p.fontMetrics();
+ QPaintDeviceMetrics metrics = new QPaintDeviceMetrics( printer ); // need width/height
+ // of printer surface
+ 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
+ }
+}
+
+protected void resizeEvent( QResizeEvent event )
+{
+ if ( e != null && m != null )
+ e.setGeometry( 0, m.height(), width(), height() - m.height() );
+}
+
+protected void 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 toUpper()
+{
+ e.setText(e.text().toUpperCase());
+}
+
+void toLower()
+{
+ e.setText(e.text().toLowerCase());
+}
+
+void textChanged()
+{
+ changed = true;
+}
+}