You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebindings/qtjava/javalib/examples/qwerty/Editor.java

352 lines
9.1 KiB

/***************************************************************************
* $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;
}
}