diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-11-08 12:31:36 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-11-08 12:31:36 -0600 |
commit | d796c9dd933ab96ec83b9a634feedd5d32e1ba3f (patch) | |
tree | 6e3dcca4f77e20ec8966c666aac7c35bd4704053 /examples | |
download | tqt-d796c9dd933ab96ec83b9a634feedd5d32e1ba3f.tar.gz tqt-d796c9dd933ab96ec83b9a634feedd5d32e1ba3f.zip |
Test conversion to TQt3 from Qt3 8c6fc1f8e35fd264dd01c582ca5e7549b32ab731
Diffstat (limited to 'examples')
1063 files changed, 79334 insertions, 0 deletions
diff --git a/examples/README b/examples/README new file mode 100644 index 000000000..eaf566bf5 --- /dev/null +++ b/examples/README @@ -0,0 +1,416 @@ +This examples directory contains lots of Qt examples. And there are +additional examples in ../tools/designer/examples/ and in the +extensions subdirectories. The documentation contains two detailed Qt +tutorials and additional tutorials for Qt Designer. The examples here +are useful for learning particular Qt classes and techniques, but to +learn Qt itself we recommend starting with the documentation's short +"How to Learn Qt" document. + +It is best to run each example from its own directory since some of +them assume they are run from there. + + +aclock + This example displays an analog clock widget. + It shows how to create a custom widget (QWidget subclass) and how + to create a timer using QTimer. + +action + A single document interface application example with a menu bar, + tool bar and status bar that provides simple text editing. + It shows how to implement a typical modern application, how to + create a QMainWindow subclass, and how to create actions that can + be assigned to menus (QPopupMenu) and toolbars (QToolBar) using + QAction. It also shows how to print using QSimpleRichText. + +addressbook [obsolete] + +application [obsolete; see the action example instead] + +biff [Unix-specific] + Biff is a simple graphical program to indicate whether there is + new mail; it looks like xbiff but is much shorter. + +buttongroups + This examples shows different types of group boxes (QButtonGroup, + and QGroupBox), and different kinds of buttons (QCheckBox, + QRadioButton, and QPushButton). It also shows how to add a + QPopupMenu to a button. + +canvas + This examples demonstrates many of QCanvasView's facilities, but + by no means all of them. It uses QCanvasItem, QCanvasLine, + QCanvasRectangle, QCanvasEllipse, QCanvasSprite, and of course + QCanvas. + +chart + An application for maintaining simple numeric data and visualising + the data using pie and bar charts. + Tutorial #2 explains this application in detail. + +checklists + Shows two list views with check box and radio button items. (These + kinds of lists are often used with setup programs.) + Shows the use of QListView, QListViewItem, QCheckListItem, + QListViewItemIterator, and QValueList. + +cursor + This example shows how to set the mouse cursor for a widget. Shows + Qt's cursors and a custom cursor using QLabel and QCursor. + +customlayout + This examples demonstrates how to write a customized layout + (geometry) manager, like a Card-Layout, Border-Layout and + Flow-Layout. + +dclock + This example displays a digital LCD clock and can switch between + time and date. + It uses the QLCDNumber widget and a couple of QTimers. + +demo + Run this to see almost all of Qt's widgets in action, including + drag and drop, 2D graphics, etc. + +desktop + The desktop demo contains three routines, each of which draws + something on the desktop. It does some nice stuff with QPainter, + and also demonstrates how one can treat the desktop as a widget + like any other. + +directpainter [Qt/Embedded-specific] + Shows the use of QDirectPainter. + +dirview + This example program demonstrates how to use a QListView and + QListViewItems to build a multi-column hierarchical, memory- and + CPU-efficient directory browser. It also demonstrates how to use + Drag'n'Drop in a QListview. (See also the fileiconview example.) + +distributor + This is a utility program that can be used to modify the paths + used in the Qt library binary to make the binary suitable for + distribution. For experts only. + +dragdrop + Demonstrates image and text drag and drop. + +drawdemo + Draws a color wheel, text and shapes. This example demonstrates + several drawing functions and printer output using QPainter, + QWMatrix, QFont, QFontMetrics, QColor, QBrush, and QPrinter. You + can easily add you own drawing functions. See "ourDrawFunctions". + +drawlines + This example shows very simple mouse-based user interaction and + painting without any world transform matrix or other advanced + features. Run the program, click the button, move the mouse, + release the button, and watch the lines get drawn. + +extension + An extension dialog with simple and advanced appearances + controlled by a toggle button. + +fileiconview + This example partially implements a very basic file manager using + a widget derived from QIconView to display the current directory. + It uses the DirectoryView widget from the dirview example to + display the directory tree. + It also shows how to add a QComboBox to a QToolBar and how to + implement a context menu using QPopupMenu. + +fonts [obsolete; see the qfd example instead] + +forever + WARNING: this program has a strobe effect. + See how fast Qt can draw colored rectangles. This example + continuously draws rectangles in a window and has another widget + that counts the number of rectangles that are drawn per second. + +gridview + A QGridView with 100x100 cells. + +hello + Hello world with colored animated wavy text. + +helpdemo + Shows how to use Qt Assistant as an application's online help + tool. (See also the helpsystem example.) + +helpsystem + This example shows how to implement context-sensitive help in + various ways in a Qt application using QToolTip, QWhatsThis, and + QAssistantClient to control Qt Assistant. + +helpviewer + The HelpViewer example implements a simple HTML help browser using + Qt's richtext capabilities. + +i18n + This example shows how to internationalize applications. Start it with + ./i18n en + to run the application in English, and with + ./i18n de + to run it in German. Other languages are also available including, + Arabic (ar), French (fr), Italian (it), Japanese (jp), Korean + (ko), Norwegian (no), and Russian (ru). Some languages depend on + the availability of suitable fonts. + +iconview + This example implements a flexible icon view which can store lots + of icon items. It supports Drag'n'Drop and different selection + modes using QIconView. + +kiosk [Qt/Embedded-specific] + An MPEG player. + +launcher [Qt/Embedded-specific] + A program launcher. + +layout [obsolete] + This example shows simple and intermediate use of Qt's layout + classes, QGridLaout, QBoxLayout etc. + +life + An implementation of the life game with a Unix-flavor GUI. + +lineedits + This example shows how to use various properties of QLineEdit + including echo modes, input masks, and validators. + +listbox + Shows QListBox options. + +listboxcombo + This example shows how to use QListBox (with single selection and + multi selection) and QComboBox (editable and non-editable). + +listviews + This examples shows how to work with QListView (a tree view + widget) + +mdi + Similar to the action example, but this time using MDI (Multiple + Document Interface). It subclasses QMainWindow and uses the + QWorkspace class to provide MDI and shows how to implement an MDI + Window menu. + +menu + This example demonstrates the simple use of menus (a menu bar and + pull-down menus), and a context menu. (See also the popup + example.) + +movies + The Movies example displays animated GIF files using the QMovie + and QLabel classes. + +network/archivesearch + Shows how to use QHttp to request and receive data from a web + site. + +network/clientserver + Provides a client application and a server application that + communicate using QSocket and QServerSocket. + +network/ftpclient + A simple FTP client that uses QFtp to retrieve directory listings + and to download and upload files. + +network/httpd + An extremely simple HTTP daemon built using QServerSocket. + +network/infoprotocol + A more complex client/server example. + +network/mail + A simple mail client that can send email using the QSocket class. + +network/networkprotocol + A simple implementation of a subset of the NNTP protocol. This + shows how to implement your own network protocols by subclassing + QNetworkProtocol. + +network/remotecontrol + Controlling one application from another using QSocket-based IPC. + +opengl/box + Shows how to use OpenGL in Qt using QGLWidget. + +opengl/gear + Shows how to build OpenGL display lists. + +opengl/glpixmap + This is based on the box example. It shows how to render an OpenGL + scene into a QPixmap. + +opengl/overlay + Demonstrates the use of OpenGL overlays (where supported). + +opengl/sharedbox + Demonstrates how to share OpenGL display lists with QGLWidgets. + +opengl/texture + Shows how to use OpenGL textures. + +picture + This example shows how to make, store to file, and read back, a + picture as a set of vector drawing commands. + +popup + This examples shows how to implement popup widgets. + +process + Shows how to execute a non-GUI application in a separate process + with I/O redirection. + +progress + WARNING: this program has a strobe effect. + This example presents a long-running process (drawing lots of + rectangles) and a QProgressDialog. Two types of progress dialog + are offered, one that simply shows text, and a custom one that + shows an animation using a QLabel and a QTimer. + +progressbar + Shows how to use a QProgressBar. + +qdir + Shows how to use and customize QFileDialog. Run + qdir --help + for details. Also shows QFileInfo. + +qfd + This example program displays all the characters of a selected + font. It shows the use of QFontDialog, QFontMetrics and QFontInfo, + and a QTable subclass. + +qmag + This is a simple magnifier-type program. It shows how one can do + some tquite low-level operations portably using Qt. + +qwerty + Simple text editor for testing different character encodings. + +rangecontrols + This examples shows how to use QSpinBox and QSlider. + +regexptester + This little application is useful for testing regular expressions. + +richtext + This example shows the use of QTextView (a read/only QTextEdit + subclass). + +rot13 + A simple implementation of the rot13 algorithm. + +scribble + An implementation of the well known scribble program. You can draw + with different pen colors and widths and save the result as a + pixmap in various formats. It shows how to do drawing using a + QWidget subclass (rather than a QCanvas for example). It also + shows how to add a QSpinBox to a QToolBar and how to implement a + button that pops up a menu (using QPushButton and QPopupMenu), and + also how to use the QColorDialog. + +scrollview + This example shows one way of using a QScrollview. This widget is + highly optimized for showing very large contents including child + widgets. + +showimg + This example reads and displays an image in any supported image + format (GIF, BMP, PPM, XMP, etc.) + +sound + Shows how to play sounds from a Qt application (and how to see if + sound is supported) using QSound. + +splitter + This example shows how to use QSplitter to give the user control + over how much vertical or horizontal space is given to child + widgets. + +sql/blob + Shows how to connect to a database and how to write to and read + BLOB fields (for those databases that support BLOBs). + +sql/overview [to be withdrawn] + This is just a series of tiny examples used by the SQL module + overview (sql.html). + +sql/sqltable + A very simple example that shows how to relate a database table to + a QDataTable. + +tabdialog + This example shows how to use a dialog with multiple tabs (pages). + It shows the use of QTabDialog and QFileInfo. + +table/bigtable + This shows how to create a sparse very large (1M x 1M cells) + QTable by avoiding the use of table items. + +table/small-table-demo + A small, simple QTable example that uses QTableItems to show text + and pixmaps, and QComboTableItems and QCheckTableItems to show how + they work. + +table/statistics + A QTable example that shows how to subclass QTableItem. + +tablet + This shows how to interact with a tablet device. It will only run + if a compatible tablet is installed. + +tetrix + This is the Qt implementation of the well known game Tetris, but + with an unusual twist, not to mention a comment that's almost a + work of art. + +textedit + A simple text editor based on QTextEdit. + +themes + This examples demonstrates how to draw widgets in different styles + (themes). Example themes looking like wood and metal are + implemented. You can switch between the different styles at + runtime using the menu. Shows how to create a QStyle subclass. Not + for the faint-hearted. + +tictac + This is an implementation of the Tic-Tac-Toe game. + +tooltip + This example widget demonstrates how to use tool tips for static + and dynamic regions within a widget using a QToolTip subclass. + +toplevel + This program allows you to set all the flags for a widget and then + displays the widget using the flags. + +trayicon [work in progress] + +tux + Shows how to create a non-rectangular window. + +widgets + Shows many Qt widgets (See also the demo example). + +wizard + This example shows how to use QWizard. + +xform + Demonstrates how to arbitrarily rotate, shear and scale text and + graphics using QWMatrix. + +xml/outliner + Shows how to read in an XML file using Qt's DOM classes and + display the data in a list view. + +xml/tagreader + Shows how to read an XML file using Qt's SAX classes. + +xml/tagreader-with-features + Shows how to read an XML file using Qt's SAX classes, and displays + the data showing the effects of different feature settings. + diff --git a/examples/aclock/README b/examples/aclock/README new file mode 100644 index 000000000..82857aedb --- /dev/null +++ b/examples/aclock/README @@ -0,0 +1,5 @@ +The aclock program displays an analog clock widget. + +See also the dclock sample that displays a digital LCD clock and can +switch between time and date. + diff --git a/examples/aclock/aclock.cpp b/examples/aclock/aclock.cpp new file mode 100644 index 000000000..5c6a88882 --- /dev/null +++ b/examples/aclock/aclock.cpp @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "aclock.h" +#include <qtimer.h> +#include <qpainter.h> +#include <qbitmap.h> + +// +// Constructs an analog clock widget that uses an internal TQTimer. +// + +AnalogClock::AnalogClock( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + time = TQTime::currentTime(); // get current time + internalTimer = new TQTimer( this ); // create internal timer + connect( internalTimer, SIGNAL(timeout()), SLOT(timeout()) ); + internalTimer->start( 5000 ); // emit signal every 5 seconds +} + +void AnalogClock::mousePressEvent( TQMouseEvent *e ) +{ + if(isTopLevel()) + clickPos = e->pos() + TQPoint(geometry().topLeft() - frameGeometry().topLeft()); +} + +void AnalogClock::mouseMoveEvent( TQMouseEvent *e ) +{ + if(isTopLevel()) + move( e->globalPos() - clickPos ); +} + +// +// The TQTimer::timeout() signal is received by this slot. +// + +// +// When we set an explicit time we don't want the timeout() slot to be +// called anymore as this relies on currentTime() +// +void AnalogClock::setTime( const TQTime & t ) +{ + time = t; + disconnect( internalTimer, SIGNAL(timeout()), this, SLOT(timeout()) ); + if (autoMask()) + updateMask(); + else + update(); +} + + +void AnalogClock::timeout() +{ + TQTime old_time = time; + time = TQTime::currentTime(); + if ( old_time.minute() != time.minute() + || old_time.hour() != time.hour() ) { // minute or hour has changed + if (autoMask()) + updateMask(); + else + update(); + } +} + + +void AnalogClock::paintEvent( TQPaintEvent * ) +{ + if ( autoMask() ) + return; + TQPainter paint( this ); + paint.setBrush( colorGroup().foreground() ); + drawClock( &paint ); +} + +// If the clock is transparent, we use updateMask() +// instead of paintEvent() + +void AnalogClock::updateMask() // paint clock mask +{ + TQBitmap bm( size() ); + bm.fill( color0 ); //transparent + + TQPainter paint; + paint.begin( &bm, this ); + paint.setBrush( color1 ); // use non-transparent color + paint.setPen( color1 ); + + drawClock( &paint ); + + paint.end(); + setMask( bm ); +} + +// +// The clock is painted using a 1000x1000 square coordinate system, in +// the a centered square, as big as possible. The painter's pen and +// brush colors are used. +// +void AnalogClock::drawClock( TQPainter *paint ) +{ + paint->save(); + + paint->setWindow( -500,-500, 1000,1000 ); + + TQRect v = paint->viewport(); + int d = TQMIN( v.width(), v.height() ); + paint->setViewport( v.left() + (v.width()-d)/2, + v.top() + (v.height()-d)/2, d, d ); + + TQPointArray pts; + + paint->save(); + paint->rotate( 30*(time.hour()%12-3) + time.minute()/2 ); + pts.setPoints( 4, -20,0, 0,-20, 300,0, 0,20 ); + paint->drawConvexPolygon( pts ); + paint->restore(); + + paint->save(); + paint->rotate( (time.minute()-15)*6 ); + pts.setPoints( 4, -10,0, 0,-10, 400,0, 0,10 ); + paint->drawConvexPolygon( pts ); + paint->restore(); + + for ( int i=0; i<12; i++ ) { + paint->drawLine( 440,0, 460,0 ); + paint->rotate( 30 ); + } + + paint->restore(); +} + + +void AnalogClock::setAutoMask(bool b) +{ + if (b) + setBackgroundMode( PaletteForeground ); + else + setBackgroundMode( PaletteBackground ); + TQWidget::setAutoMask(b); +} diff --git a/examples/aclock/aclock.doc b/examples/aclock/aclock.doc new file mode 100644 index 000000000..c45fd242b --- /dev/null +++ b/examples/aclock/aclock.doc @@ -0,0 +1,28 @@ +/* +*/ +/*! \page aclock-example.html + + \ingroup examples + \title Analog Clock + + This example displays an analog clock widget. + + <hr> + + Header file: + + \include aclock/aclock.h + + <hr> + + Implementation: + + \include aclock/aclock.cpp + + <hr> + + Main: + + \include aclock/main.cpp +*/ + diff --git a/examples/aclock/aclock.h b/examples/aclock/aclock.h new file mode 100644 index 000000000..dcd5728d2 --- /dev/null +++ b/examples/aclock/aclock.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef ACLOCK_H +#define ACLOCK_H + +#include <qwidget.h> +#include <qdatetime.h> + +class TQTimer; +class AnalogClock : public TQWidget // analog clock widget +{ + Q_OBJECT +public: + AnalogClock( TQWidget *parent=0, const char *name=0 ); + void setAutoMask(bool b); + +protected: + void updateMask(); + void paintEvent( TQPaintEvent *); + void mousePressEvent( TQMouseEvent *); + void mouseMoveEvent( TQMouseEvent *); + void drawClock( TQPainter* ); + +private slots: + void timeout(); + +public slots: + void setTime( const TQTime & t ); + +private: + TQPoint clickPos; + TQTime time; + TQTimer *internalTimer; +}; + + +#endif // ACLOCK_H diff --git a/examples/aclock/aclock.pro b/examples/aclock/aclock.pro new file mode 100644 index 000000000..0b3b0123a --- /dev/null +++ b/examples/aclock/aclock.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = aclock + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = aclock.h +SOURCES = aclock.cpp \ + main.cpp diff --git a/examples/aclock/main.cpp b/examples/aclock/main.cpp new file mode 100644 index 000000000..374e468bf --- /dev/null +++ b/examples/aclock/main.cpp @@ -0,0 +1,27 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "aclock.h" +#include <qapplication.h> + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + AnalogClock *clock = new AnalogClock; + if ( argc == 2 && strcmp( argv[1], "-transparent" ) == 0 ) + clock->setAutoMask( TRUE ); + clock->resize( 100, 100 ); + a.setMainWidget( clock ); + clock->setCaption("TQt Example - Analog Clock"); + clock->show(); + int result = a.exec(); + delete clock; + return result; +} diff --git a/examples/action/action.pro b/examples/action/action.pro new file mode 100644 index 000000000..e780f7451 --- /dev/null +++ b/examples/action/action.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = action + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = application.h +SOURCES = application.cpp \ + main.cpp diff --git a/examples/action/application.cpp b/examples/action/application.cpp new file mode 100644 index 000000000..23a3a8755 --- /dev/null +++ b/examples/action/application.cpp @@ -0,0 +1,306 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "application.h" + +#include <qimage.h> +#include <qpixmap.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtextedit.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qprinter.h> +#include <qapplication.h> +#include <qaccel.h> +#include <qtextstream.h> +#include <qpainter.h> +#include <qpaintdevicemetrics.h> +#include <qwhatsthis.h> +#include <qaction.h> +#include <qsimplerichtext.h> + +#include "filesave.xpm" +#include "fileopen.xpm" +#include "fileprint.xpm" + + +ApplicationWindow::ApplicationWindow() + : TQMainWindow( 0, "example application main window", WDestructiveClose ) +{ + printer = new TQPrinter( TQPrinter::HighResolution ); + + TQAction * fileNewAction; + TQAction * fileOpenAction; + TQAction * fileSaveAction, * fileSaveAsAction, * filePrintAction; + TQAction * fileCloseAction, * fileQuitAction; + + fileNewAction = new TQAction( "&New", CTRL+Key_N, this, "new" ); + connect( fileNewAction, SIGNAL( activated() ) , this, + SLOT( newDoc() ) ); + + fileOpenAction = new TQAction( TQPixmap( fileopen ), "&Open...", + CTRL+Key_O, this, "open" ); + connect( fileOpenAction, SIGNAL( activated() ) , this, SLOT( choose() ) ); + + const char * fileOpenText = "<p><img source=\"fileopen\"> " + "Click this button to open a <em>new file</em>. <br>" + "You can also select the <b>Open</b> command " + "from the <b>File</b> menu.</p>"; + TQMimeSourceFactory::defaultFactory()->setPixmap( "fileopen", + fileOpenAction->iconSet().pixmap() ); + fileOpenAction->setWhatsThis( fileOpenText ); + + fileSaveAction = new TQAction( TQPixmap( filesave ), + "&Save", CTRL+Key_S, this, "save" ); + connect( fileSaveAction, SIGNAL( activated() ) , this, SLOT( save() ) ); + + const char * fileSaveText = "<p>Click this button to save the file you " + "are editing. You will be prompted for a file name.\n" + "You can also select the <b>Save</b> command " + "from the <b>File</b> menu.</p>"; + fileSaveAction->setWhatsThis( fileSaveText ); + + fileSaveAsAction = new TQAction( "Save File As", "Save &As...", 0, this, + "save as" ); + connect( fileSaveAsAction, SIGNAL( activated() ) , this, + SLOT( saveAs() ) ); + fileSaveAsAction->setWhatsThis( fileSaveText ); + + filePrintAction = new TQAction( "Print File", TQPixmap( fileprint ), + "&Print...", CTRL+Key_P, this, "print" ); + connect( filePrintAction, SIGNAL( activated() ) , this, + SLOT( print() ) ); + + const char * filePrintText = "Click this button to print the file you " + "are editing.\n You can also select the Print " + "command from the File menu."; + filePrintAction->setWhatsThis( filePrintText ); + + fileCloseAction = new TQAction( "Close", "&Close", CTRL+Key_W, this, + "close" ); + connect( fileCloseAction, SIGNAL( activated() ) , this, + SLOT( close() ) ); + + fileQuitAction = new TQAction( "Quit", "&Quit", CTRL+Key_Q, this, + "tquit" ); + connect( fileQuitAction, SIGNAL( activated() ) , qApp, + SLOT( closeAllWindows() ) ); + + // populate a tool bar with some actions + + TQToolBar * fileTools = new TQToolBar( this, "file operations" ); + fileTools->setLabel( "File Operations" ); + fileOpenAction->addTo( fileTools ); + fileSaveAction->addTo( fileTools ); + filePrintAction->addTo( fileTools ); + (void)TQWhatsThis::whatsThisButton( fileTools ); + + + // populate a menu with all actions + + TQPopupMenu * file = new TQPopupMenu( this ); + menuBar()->insertItem( "&File", file ); + fileNewAction->addTo( file ); + fileOpenAction->addTo( file ); + fileSaveAction->addTo( file ); + fileSaveAsAction->addTo( file ); + file->insertSeparator(); + filePrintAction->addTo( file ); + file->insertSeparator(); + fileCloseAction->addTo( file ); + fileQuitAction->addTo( file ); + + + menuBar()->insertSeparator(); + + // add a help menu + + TQPopupMenu * help = new TQPopupMenu( this ); + menuBar()->insertItem( "&Help", help ); + help->insertItem( "&About", this, SLOT(about()), Key_F1 ); + help->insertItem( "About &TQt", this, SLOT(aboutTQt()) ); + help->insertSeparator(); + help->insertItem( "What's &This", this, SLOT(whatsThis()), + SHIFT+Key_F1 ); + + + // create and define the central widget + + e = new TQTextEdit( this, "editor" ); + e->setFocus(); + setCentralWidget( e ); + statusBar()->message( "Ready", 2000 ); + + resize( 450, 600 ); +} + + +ApplicationWindow::~ApplicationWindow() +{ + delete printer; +} + + + +void ApplicationWindow::newDoc() +{ + ApplicationWindow *ed = new ApplicationWindow; + ed->show(); +} + +void ApplicationWindow::choose() +{ + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, + this); + if ( !fn.isEmpty() ) + load( fn ); + else + statusBar()->message( "Loading aborted", 2000 ); +} + + +void ApplicationWindow::load( const TQString &fileName ) +{ + TQFile f( fileName ); + if ( !f.open( IO_ReadOnly ) ) + return; + + TQTextStream ts( &f ); + e->setText( ts.read() ); + e->setModified( FALSE ); + setCaption( fileName ); + statusBar()->message( "Loaded document " + fileName, 2000 ); +} + + +void ApplicationWindow::save() +{ + if ( filename.isEmpty() ) { + saveAs(); + return; + } + + TQString text = e->text(); + TQFile f( filename ); + if ( !f.open( IO_WriteOnly ) ) { + statusBar()->message( TQString("Could not write to %1").arg(filename), + 2000 ); + return; + } + + TQTextStream t( &f ); + t << text; + f.close(); + + e->setModified( FALSE ); + + setCaption( filename ); + + statusBar()->message( TQString( "File %1 saved" ).arg( filename ), 2000 ); +} + + +void ApplicationWindow::saveAs() +{ + TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, + this ); + if ( !fn.isEmpty() ) { + filename = fn; + save(); + } else { + statusBar()->message( "Saving aborted", 2000 ); + } +} + + +void ApplicationWindow::print() +{ + printer->setFullPage( TRUE ); + if ( printer->setup(this) ) { // printer dialog + statusBar()->message( "Printing..." ); + TQPainter p; + if( !p.begin( printer ) ) { // paint on printer + statusBar()->message( "Printing aborted", 2000 ); + return; + } + + TQPaintDeviceMetrics metrics( p.device() ); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + TQSimpleRichText richText( TQStyleSheet::convertFromPlainText(e->text()), + TQFont(), + e->context(), + e->styleSheet(), + e->mimeSourceFactory(), + view.height() ); + richText.setWidth( &p, view.width() ); + int page = 1; + do { + richText.draw( &p, margin, margin, view, colorGroup() ); + view.moveBy( 0, view.height() ); + p.translate( 0 , -view.height() ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) ); + if ( view.top() - margin >= richText.height() ) + break; + printer->newPage(); + page++; + } while (TRUE); + + statusBar()->message( "Printing completed", 2000 ); + } else { + statusBar()->message( "Printing aborted", 2000 ); + } +} + +void ApplicationWindow::closeEvent( TQCloseEvent* ce ) +{ + if ( !e->isModified() ) { + ce->accept(); + return; + } + + switch( TQMessageBox::information( this, "TQt Application Example", + "The document has been changed since " + "the last save.", + "Save Now", "Cancel", "Leave Anyway", + 0, 1 ) ) { + case 0: + save(); + ce->accept(); + break; + case 1: + default: // just for sanity + ce->ignore(); + break; + case 2: + ce->accept(); + break; + } +} + + +void ApplicationWindow::about() +{ + TQMessageBox::about( this, "TQt Application Example", + "This example demonstrates simple use of " + "TQMainWindow,\nTQMenuBar and TQToolBar."); +} + + +void ApplicationWindow::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQt Application Example" ); +} diff --git a/examples/action/application.doc b/examples/action/application.doc new file mode 100644 index 000000000..f4eaaae44 --- /dev/null +++ b/examples/action/application.doc @@ -0,0 +1,36 @@ +/* +*/ + +/*! \page qaction-application-example.html + + \ingroup qaction-examples + + + \title A Complete Application Window with Actions + + The QAction class provides a way of associating user input from different + user interface elements with abstract high level actions. This approach makes + it easy to customize applications for different types of users. + + This example program is just like the + <a href="simple-application-example.html">application example</a>, + but uses QAction to build the menu and the toolbar. + + <hr> + + Header file: + + \include action/application.h + + <hr> + + Implementation: + + \include action/application.cpp + + <hr> + + Main: + + \include action/main.cpp +*/ diff --git a/examples/action/application.h b/examples/action/application.h new file mode 100644 index 000000000..7b772728e --- /dev/null +++ b/examples/action/application.h @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef APPLICATION_H +#define APPLICATION_H + +#include <qmainwindow.h> + +class TQTextEdit; + +class ApplicationWindow: public TQMainWindow +{ + Q_OBJECT + +public: + ApplicationWindow(); + ~ApplicationWindow(); + +protected: + void closeEvent( TQCloseEvent* ); + +private slots: + void newDoc(); + void choose(); + void load( const TQString &fileName ); + void save(); + void saveAs(); + void print(); + + void about(); + void aboutTQt(); + +private: + TQPrinter *printer; + TQTextEdit *e; + TQString filename; +}; + + +#endif diff --git a/examples/action/fileopen.xpm b/examples/action/fileopen.xpm new file mode 100644 index 000000000..880417eee --- /dev/null +++ b/examples/action/fileopen.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *fileopen[] = { +" 16 13 5 1", +". c #040404", +"# c #808304", +"a c None", +"b c #f3f704", +"c c #f3f7f3", +"aaaaaaaaa...aaaa", +"aaaaaaaa.aaa.a.a", +"aaaaaaaaaaaaa..a", +"a...aaaaaaaa...a", +".bcb.......aaaaa", +".cbcbcbcbc.aaaaa", +".bcbcbcbcb.aaaaa", +".cbcb...........", +".bcb.#########.a", +".cb.#########.aa", +".b.#########.aaa", +"..#########.aaaa", +"...........aaaaa" +}; diff --git a/examples/action/fileprint.xpm b/examples/action/fileprint.xpm new file mode 100644 index 000000000..6ada912fa --- /dev/null +++ b/examples/action/fileprint.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static const char *fileprint[] = { +" 16 14 6 1", +". c #000000", +"# c #848284", +"a c #c6c3c6", +"b c #ffff00", +"c c #ffffff", +"d c None", +"ddddd.........dd", +"dddd.cccccccc.dd", +"dddd.c.....c.ddd", +"ddd.cccccccc.ddd", +"ddd.c.....c....d", +"dd.cccccccc.a.a.", +"d..........a.a..", +".aaaaaaaaaa.a.a.", +".............aa.", +".aaaaaa###aa.a.d", +".aaaaaabbbaa...d", +".............a.d", +"d.aaaaaaaaa.a.dd", +"dd...........ddd" +}; diff --git a/examples/action/filesave.xpm b/examples/action/filesave.xpm new file mode 100644 index 000000000..bd6870f47 --- /dev/null +++ b/examples/action/filesave.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *filesave[] = { +" 14 14 4 1", +". c #040404", +"# c #808304", +"a c #bfc2bf", +"b c None", +"..............", +".#.aaaaaaaa.a.", +".#.aaaaaaaa...", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".##........##.", +".############.", +".##.........#.", +".##......aa.#.", +".##......aa.#.", +".##......aa.#.", +"b............." +}; diff --git a/examples/action/main.cpp b/examples/action/main.cpp new file mode 100644 index 000000000..215211630 --- /dev/null +++ b/examples/action/main.cpp @@ -0,0 +1,20 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "application.h" + +int main( int argc, char ** argv ) { + TQApplication a( argc, argv ); + ApplicationWindow * mw = new ApplicationWindow(); + mw->setCaption( "Document 1" ); + mw->show(); + a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) ); + return a.exec(); +} diff --git a/examples/action/toggleaction/labelonoff.xpm b/examples/action/toggleaction/labelonoff.xpm new file mode 100644 index 000000000..87696d158 --- /dev/null +++ b/examples/action/toggleaction/labelonoff.xpm @@ -0,0 +1,169 @@ +/* XPM */ +static const char * labelonoff_xpm[] = { +"32 32 134 2", +" c None", +". c #FFFFFF", +"+ c #DEDEDE", +"@ c #E7E7DE", +"# c #E7E7E7", +"$ c #EFEFDE", +"% c #EFEFE7", +"& c #F7F7DE", +"* c #F7F7E7", +"= c #DEDEE7", +"- c #C6CEEF", +"; c #B5B5E7", +"> c #A5ADF7", +", c #9CA5F7", +"' c #8C94F7", +") c #9C9CEF", +"! c #BDBDE7", +"~ c #8C8CEF", +"{ c #7B7BEF", +"] c #6B6BF7", +"^ c #7373F7", +"/ c #9494EF", +"( c #DEDEEF", +"_ c #A5ADFF", +": c #6B7BFF", +"< c #4A5AFF", +"[ c #394AFF", +"} c #424AF7", +"| c #3142F7", +"1 c #4252FF", +"2 c #5A63F7", +"3 c #3939F7", +"4 c #0000FF", +"5 c #E7E7EF", +"6 c #9CA5FF", +"7 c #3139E7", +"8 c #424AD6", +"9 c #7373D6", +"0 c #8C8CCE", +"a c #8C94CE", +"b c #9494CE", +"c c #8C8CD6", +"d c #8484D6", +"e c #6B6BD6", +"f c #2121F7", +"g c #4A52EF", +"h c #5252EF", +"i c #1818F7", +"j c #C6CEFF", +"k c #5A5AEF", +"l c #0810FF", +"m c #EFE7E7", +"n c #7B84E7", +"o c #3131F7", +"p c #5263FF", +"q c #7B84F7", +"r c #1818FF", +"s c #DEDED6", +"t c #A5B5FF", +"u c #848CF7", +"v c #3939FF", +"w c #3139EF", +"x c #8C94EF", +"y c #A5A5EF", +"z c #D6D6D6", +"A c #ADB5F7", +"B c #7384FF", +"C c #D6D6E7", +"D c #2931FF", +"E c #BDBDEF", +"F c #C6CEE7", +"G c #C6C6E7", +"H c #525AF7", +"I c #6B73EF", +"J c #5A6BFF", +"K c #949CF7", +"L c #7B84FF", +"M c #2129F7", +"N c #0000EF", +"O c #0808FF", +"P c #1010FF", +"Q c #6B6BEF", +"R c #CECECE", +"S c #BDBDDE", +"T c #6B6BDE", +"U c #4A52E7", +"V c #2931EF", +"W c #3942DE", +"X c #8484EF", +"Y c #A5A5E7", +"Z c #CECEDE", +"` c #A5A5D6", +" . c #BDBDBD", +".. c #EFEFEF", +"+. c #F7F7EF", +"@. c #8C8C94", +"#. c #080821", +"$. c #000008", +"%. c #181818", +"&. c #212129", +"*. c #313131", +"=. c #393939", +"-. c #393942", +";. c #424242", +">. c #4A4A4A", +",. c #4A4A52", +"'. c #42424A", +"). c #313139", +"!. c #292931", +"~. c #000000", +"{. c #848484", +"]. c #A5A5AD", +"^. c #8C8C8C", +"/. c #ADADAD", +"(. c #B5B5BD", +"_. c #7B7B7B", +":. c #5A5A63", +"<. c #292929", +"[. c #6B6B6B", +"}. c #949494", +"|. c #F7F7F7", +"1. c #A5A5A5", +"2. c #5A5A5A", +"3. c #636363", +"4. c #7B7B84", +"5. c #737373", +"6. c #101010", +"7. c #212121", +"8. c #525252", +"9. c #080808", +"0. c #BDBDC6", +"a. c #C6C6C6", +"b. c #9C9C9C", +"c. c #B5B5B5", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . + @ # # @ @ $ # # # % $ # @ # @ % $ & $ $ * % % # # . . . ", +". . . + = @ = - ; > , ' ' ' ) ! @ # ! ) ~ { ] ^ { / ! # @ . . . ", +". . . + @ ( _ : < [ } } | | [ 1 2 3 4 4 4 4 4 4 4 4 4 3 ! . . . ", +". . . + 5 6 7 8 9 0 a b c d e 7 4 4 4 f 3 g h g 3 f 4 4 i . . . ", +". . . @ j g 0 @ $ % % % % $ & k 4 l { @ @ # $ m @ = ; h 4 . . . ", +". . . + 6 n @ # + # + # # # # o f p q * # # # # # @ * % r . . . ", +". . . s t u @ @ # @ # # # @ # v w ] x & @ # # @ # & % y 4 . . . ", +". . . z A B / C = # # @ # # % ^ < D k E F = C C G ) H 4 4 . . . ", +". . . s G I J : ' ' K , ' u L < M N N 4 4 O P O 4 4 4 4 Q . . . ", +". . . R $ S T U } } } } | V V W 0 X 3 P 4 4 4 4 P f h Y % . . . ", +". . . R # # @ Z ` a d d a ` S @ % % # = F ! ; G = = % % # . . . ", +". . . ...# # # % * % * +.* % # # % # % % % * % % # % # # . . . ", +". . . @.. . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . #.$.%.&.*.=.-.-.;.;.;.>.>.>.,.>.>.>.>.'.;.;.;.-.-.).!.&.$.. ", +". . ~.{.R R z z z z + + + + + + + + + + + + + + + s z z s z ].. ", +". . ).z ^./.# # # # # + + + + # + + + # + + + @ + = # % (._.... ", +". . :.^.~.^...+ + + + # # # + + # + # + # # @ = # @ # + *.<.... ", +". . [.^.~.}.. # # # ....# ....+ # + ..|.# + = # ....# ..<.*.. . ", +". . -.;.~.=._.+ # # 1.2.;.3./.# # # _.[.R # # + 4.5.R [.6.6.[.. ", +". . <.%.~.%.;.+ # 2.~.7.>.%.~.{...# 5.~.8...+._.~.2.+ ;.~.9.=.. ", +". . 5.}.~.^.|...{.~.[.....+ 8.~. ...# 8.~./.0.~.;.# % + 7.=.|.. ", +". . 5.}.~.{.|.# =.9.+ ..# ..a.~.5.....z %.7.<.%.R ..# = %.=.|.. ", +". . 5.}.~.{...+ 7.~.*.*.*.*.*.~.>.# # ../.~.~.1...# # @ %.=.|.. ", +". . 5.b.~.{.|.+ %.6.8.8.8.8.8.2.^.+ # ..b.~.~.^...# # + %.=.|.. ", +". . 5.b.~._.|.+ *.%...|.......a.+ # ..a.6.=.>.~.c...# + 6.;.. . ", +". . 5./.~.5.. ..[.~.{.|...|.^.~.{...+ *.9.a.z 6.<.z ..+ 7.=.. . ", +". . [.a.~.%.2.z + 7.~.2.}.3.~.7.z ..[.~._...|.{.~.8...# =.~.>.. ", +". . 3.# {.<.%.c...z [.7.9.%.3.R ..R ;.2.+ # # # 3.;.a.../.;.<.. ", +". . 3.= ..+ + # # # ..# s + ..# # + # # # + # # # # + # ....|.. ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; diff --git a/examples/action/toggleaction/toggleaction.cpp b/examples/action/toggleaction/toggleaction.cpp new file mode 100644 index 000000000..e9fcc5c49 --- /dev/null +++ b/examples/action/toggleaction/toggleaction.cpp @@ -0,0 +1,31 @@ +#include <qapplication.h> +#include <qmainwindow.h> +#include <qtoolbar.h> +#include <qaction.h> + +#include "labelonoff.xpm" + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + TQMainWindow * window = new TQMainWindow; + window->setCaption("TQt Example - Toggleaction"); + TQToolBar * toolbar = new TQToolBar( window ); + + TQAction * labelonoffaction = new TQAction( window, "labelonoff" ); + labelonoffaction->setToggleAction( TRUE ); + + labelonoffaction->setText( "labels on/off" ); + labelonoffaction->setAccel( TQt::ALT+TQt::Key_L ); + labelonoffaction->setIconSet( (TQPixmap) labelonoff_xpm ); + + TQObject::connect( labelonoffaction, SIGNAL( toggled( bool ) ), + window, SLOT( setUsesTextLabel( bool ) ) ); + + labelonoffaction->addTo( toolbar ); + + app.setMainWidget( window ); + window->show(); + return app.exec(); +} + diff --git a/examples/action/toggleaction/toggleaction.doc b/examples/action/toggleaction/toggleaction.doc new file mode 100644 index 000000000..7924a2631 --- /dev/null +++ b/examples/action/toggleaction/toggleaction.doc @@ -0,0 +1,15 @@ +/*! \page toggleaction-example.html + + \ingroup qaction-examples + + \title A Tiny Example Featuring a Toggle Action + + This example program demonstrates the use of QAction + in its incarnation as a toggle action. + + <hr> + + Main: + + \include action/toggleaction/toggleaction.cpp +*/ diff --git a/examples/action/toggleaction/toggleaction.pro b/examples/action/toggleaction/toggleaction.pro new file mode 100644 index 000000000..697d7cd76 --- /dev/null +++ b/examples/action/toggleaction/toggleaction.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = toggleaction + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = toggleaction.cpp diff --git a/examples/addressbook/addressbook.doc b/examples/addressbook/addressbook.doc new file mode 100644 index 000000000..3abc3c9ca --- /dev/null +++ b/examples/addressbook/addressbook.doc @@ -0,0 +1,41 @@ +/* +*/ +/*! \page addressbook-example.html + + \ingroup examples + \title Simple Addressbook + + This examples shows how to write a very simple, but complete application + using an addressbook as the example. + + <hr> + + Header file of the mainwindow: + + \include addressbook/mainwindow.h + + <hr> + + Implementation of the mainwindow: + + \include addressbook/mainwindow.cpp + + <hr> + + Header file of the centralwidget: + + \include addressbook/centralwidget.h + + <hr> + + Implementation of the centralwidget: + + \include addressbook/centralwidget.cpp + + <hr> + + Main: + + \include addressbook/main.cpp +*/ + diff --git a/examples/addressbook/addressbook.pro b/examples/addressbook/addressbook.pro new file mode 100644 index 000000000..f15ad9a1c --- /dev/null +++ b/examples/addressbook/addressbook.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = addressbook + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = centralwidget.h \ + mainwindow.h +SOURCES = centralwidget.cpp \ + main.cpp \ + mainwindow.cpp diff --git a/examples/addressbook/centralwidget.cpp b/examples/addressbook/centralwidget.cpp new file mode 100644 index 000000000..86edc9c52 --- /dev/null +++ b/examples/addressbook/centralwidget.cpp @@ -0,0 +1,351 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "centralwidget.h" + +#include <qtabwidget.h> +#include <qlistview.h> +#include <qlayout.h> +#include <qwidget.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qlabel.h> +#include <qcheckbox.h> +#include <qfile.h> +#include <qtextstream.h> + +ABCentralWidget::ABCentralWidget( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + mainGrid = new TQGridLayout( this, 2, 1, 5, 5 ); + + setupTabWidget(); + setupListView(); + + mainGrid->setRowStretch( 0, 0 ); + mainGrid->setRowStretch( 1, 1 ); +} + +void ABCentralWidget::save( const TQString &filename ) +{ + if ( !listView->firstChild() ) + return; + + TQFile f( filename ); + if ( !f.open( IO_WriteOnly ) ) + return; + + TQTextStream t( &f ); + t.setEncoding(TQTextStream::UnicodeUTF8); + + TQListViewItemIterator it( listView ); + + for ( ; it.current(); ++it ) + for ( unsigned int i = 0; i < 4; i++ ) + t << it.current()->text( i ) << "\n"; + + f.close(); +} + +void ABCentralWidget::load( const TQString &filename ) +{ + listView->clear(); + + TQFile f( filename ); + if ( !f.open( IO_ReadOnly ) ) + return; + + TQTextStream t( &f ); + t.setEncoding(TQTextStream::UnicodeUTF8); + + while ( !t.atEnd() ) { + TQListViewItem *item = new TQListViewItem( listView ); + for ( unsigned int i = 0; i < 4; i++ ) + item->setText( i, t.readLine() ); + } + + f.close(); +} + +void ABCentralWidget::setupTabWidget() +{ + tabWidget = new TQTabWidget( this ); + + TQWidget *input = new TQWidget( tabWidget ); + TQGridLayout *grid1 = new TQGridLayout( input, 2, 5, 5, 5 ); + + TQLabel *liFirstName = new TQLabel( "First &Name", input ); + liFirstName->resize( liFirstName->sizeHint() ); + grid1->addWidget( liFirstName, 0, 0 ); + + TQLabel *liLastName = new TQLabel( "&Last Name", input ); + liLastName->resize( liLastName->sizeHint() ); + grid1->addWidget( liLastName, 0, 1 ); + + TQLabel *liAddress = new TQLabel( "Add&ress", input ); + liAddress->resize( liAddress->sizeHint() ); + grid1->addWidget( liAddress, 0, 2 ); + + TQLabel *liEMail = new TQLabel( "&E-Mail", input ); + liEMail->resize( liEMail->sizeHint() ); + grid1->addWidget( liEMail, 0, 3 ); + + add = new TQPushButton( "A&dd", input ); + add->resize( add->sizeHint() ); + grid1->addWidget( add, 0, 4 ); + connect( add, SIGNAL( clicked() ), this, SLOT( addEntry() ) ); + + iFirstName = new TQLineEdit( input ); + iFirstName->resize( iFirstName->sizeHint() ); + grid1->addWidget( iFirstName, 1, 0 ); + liFirstName->setBuddy( iFirstName ); + + iLastName = new TQLineEdit( input ); + iLastName->resize( iLastName->sizeHint() ); + grid1->addWidget( iLastName, 1, 1 ); + liLastName->setBuddy( iLastName ); + + iAddress = new TQLineEdit( input ); + iAddress->resize( iAddress->sizeHint() ); + grid1->addWidget( iAddress, 1, 2 ); + liAddress->setBuddy( iAddress ); + + iEMail = new TQLineEdit( input ); + iEMail->resize( iEMail->sizeHint() ); + grid1->addWidget( iEMail, 1, 3 ); + liEMail->setBuddy( iEMail ); + + change = new TQPushButton( "&Change", input ); + change->resize( change->sizeHint() ); + grid1->addWidget( change, 1, 4 ); + connect( change, SIGNAL( clicked() ), this, SLOT( changeEntry() ) ); + + tabWidget->addTab( input, "&Add/Change Entry" ); + + // -------------------------------------- + + TQWidget *search = new TQWidget( this ); + TQGridLayout *grid2 = new TQGridLayout( search, 2, 5, 5, 5 ); + + cFirstName = new TQCheckBox( "First &Name", search ); + cFirstName->resize( cFirstName->sizeHint() ); + grid2->addWidget( cFirstName, 0, 0 ); + connect( cFirstName, SIGNAL( clicked() ), this, SLOT( toggleFirstName() ) ); + + cLastName = new TQCheckBox( "&Last Name", search ); + cLastName->resize( cLastName->sizeHint() ); + grid2->addWidget( cLastName, 0, 1 ); + connect( cLastName, SIGNAL( clicked() ), this, SLOT( toggleLastName() ) ); + + cAddress = new TQCheckBox( "Add&ress", search ); + cAddress->resize( cAddress->sizeHint() ); + grid2->addWidget( cAddress, 0, 2 ); + connect( cAddress, SIGNAL( clicked() ), this, SLOT( toggleAddress() ) ); + + cEMail = new TQCheckBox( "&E-Mail", search ); + cEMail->resize( cEMail->sizeHint() ); + grid2->addWidget( cEMail, 0, 3 ); + connect( cEMail, SIGNAL( clicked() ), this, SLOT( toggleEMail() ) ); + + sFirstName = new TQLineEdit( search ); + sFirstName->resize( sFirstName->sizeHint() ); + grid2->addWidget( sFirstName, 1, 0 ); + + sLastName = new TQLineEdit( search ); + sLastName->resize( sLastName->sizeHint() ); + grid2->addWidget( sLastName, 1, 1 ); + + sAddress = new TQLineEdit( search ); + sAddress->resize( sAddress->sizeHint() ); + grid2->addWidget( sAddress, 1, 2 ); + + sEMail = new TQLineEdit( search ); + sEMail->resize( sEMail->sizeHint() ); + grid2->addWidget( sEMail, 1, 3 ); + + find = new TQPushButton( "F&ind", search ); + find->resize( find->sizeHint() ); + grid2->addWidget( find, 1, 4 ); + connect( find, SIGNAL( clicked() ), this, SLOT( findEntries() ) ); + + cFirstName->setChecked( TRUE ); + sFirstName->setEnabled( TRUE ); + sLastName->setEnabled( FALSE ); + sAddress->setEnabled( FALSE ); + sEMail->setEnabled( FALSE ); + + tabWidget->addTab( search, "&Search" ); + + mainGrid->addWidget( tabWidget, 0, 0 ); +} + +void ABCentralWidget::setupListView() +{ + listView = new TQListView( this ); + listView->addColumn( "First Name" ); + listView->addColumn( "Last Name" ); + listView->addColumn( "Address" ); + listView->addColumn( "E-Mail" ); + + listView->setSelectionMode( TQListView::Single ); + + connect( listView, SIGNAL( clicked( TQListViewItem* ) ), this, SLOT( itemSelected( TQListViewItem* ) ) ); + + mainGrid->addWidget( listView, 1, 0 ); + listView->setAllColumnsShowFocus( TRUE ); +} + +void ABCentralWidget::addEntry() +{ + if ( !iFirstName->text().isEmpty() || !iLastName->text().isEmpty() || + !iAddress->text().isEmpty() || !iEMail->text().isEmpty() ) { + TQListViewItem *item = new TQListViewItem( listView ); + item->setText( 0, iFirstName->text() ); + item->setText( 1, iLastName->text() ); + item->setText( 2, iAddress->text() ); + item->setText( 3, iEMail->text() ); + } + + iFirstName->setText( "" ); + iLastName->setText( "" ); + iAddress->setText( "" ); + iEMail->setText( "" ); +} + +void ABCentralWidget::changeEntry() +{ + TQListViewItem *item = listView->currentItem(); + + if ( item && + ( !iFirstName->text().isEmpty() || !iLastName->text().isEmpty() || + !iAddress->text().isEmpty() || !iEMail->text().isEmpty() ) ) { + item->setText( 0, iFirstName->text() ); + item->setText( 1, iLastName->text() ); + item->setText( 2, iAddress->text() ); + item->setText( 3, iEMail->text() ); + } +} + +void ABCentralWidget::selectionChanged() +{ + iFirstName->setText( "" ); + iLastName->setText( "" ); + iAddress->setText( "" ); + iEMail->setText( "" ); +} + +void ABCentralWidget::itemSelected( TQListViewItem *item ) +{ + if ( !item ) + return; + item->setSelected( TRUE ); + item->repaint(); + + iFirstName->setText( item->text( 0 ) ); + iLastName->setText( item->text( 1 ) ); + iAddress->setText( item->text( 2 ) ); + iEMail->setText( item->text( 3 ) ); +} + +void ABCentralWidget::toggleFirstName() +{ + sFirstName->setText( "" ); + + if ( cFirstName->isChecked() ) { + sFirstName->setEnabled( TRUE ); + sFirstName->setFocus(); + } + else + sFirstName->setEnabled( FALSE ); +} + +void ABCentralWidget::toggleLastName() +{ + sLastName->setText( "" ); + + if ( cLastName->isChecked() ) { + sLastName->setEnabled( TRUE ); + sLastName->setFocus(); + } + else + sLastName->setEnabled( FALSE ); +} + +void ABCentralWidget::toggleAddress() +{ + sAddress->setText( "" ); + + if ( cAddress->isChecked() ) { + sAddress->setEnabled( TRUE ); + sAddress->setFocus(); + } + else + sAddress->setEnabled( FALSE ); +} + +void ABCentralWidget::toggleEMail() +{ + sEMail->setText( "" ); + + if ( cEMail->isChecked() ) { + sEMail->setEnabled( TRUE ); + sEMail->setFocus(); + } + else + sEMail->setEnabled( FALSE ); +} + +void ABCentralWidget::findEntries() +{ + if ( !cFirstName->isChecked() && + !cLastName->isChecked() && + !cAddress->isChecked() && + !cEMail->isChecked() ) { + listView->clearSelection(); + return; + } + + TQListViewItemIterator it( listView ); + + for ( ; it.current(); ++it ) { + bool select = TRUE; + + if ( cFirstName->isChecked() ) { + if ( select && it.current()->text( 0 ).contains( sFirstName->text() ) ) + select = TRUE; + else + select = FALSE; + } + if ( cLastName->isChecked() ) { + if ( select && it.current()->text( 1 ).contains( sLastName->text() ) ) + select = TRUE; + else + select = FALSE; + } + if ( cAddress->isChecked() ) { + if ( select && it.current()->text( 2 ).contains( sAddress->text() ) ) + select = TRUE; + else + select = FALSE; + } + if ( cEMail->isChecked() ) { + if ( select && it.current()->text( 3 ).contains( sEMail->text() ) ) + select = TRUE; + else + select = FALSE; + } + + if ( select ) + it.current()->setSelected( TRUE ); + else + it.current()->setSelected( FALSE ); + it.current()->repaint(); + } +} diff --git a/examples/addressbook/centralwidget.h b/examples/addressbook/centralwidget.h new file mode 100644 index 000000000..66e44a332 --- /dev/null +++ b/examples/addressbook/centralwidget.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef AB_CENTRALWIDGET_H +#define AB_CENTRALWIDGET_H + +#include <qwidget.h> +#include <qstring.h> + +class TQTabWidget; +class TQListView; +class TQGridLayout; +class TQLineEdit; +class TQPushButton; +class TQListViewItem; +class TQCheckBox; + +class ABCentralWidget : public TQWidget +{ + Q_OBJECT + +public: + ABCentralWidget( TQWidget *parent, const char *name = 0 ); + + void save( const TQString &filename ); + void load( const TQString &filename ); + +protected slots: + void addEntry(); + void changeEntry(); + void itemSelected( TQListViewItem* ); + void selectionChanged(); + void toggleFirstName(); + void toggleLastName(); + void toggleAddress(); + void toggleEMail(); + void findEntries(); + +protected: + void setupTabWidget(); + void setupListView(); + + TQGridLayout *mainGrid; + TQTabWidget *tabWidget; + TQListView *listView; + TQPushButton *add, *change, *find; + TQLineEdit *iFirstName, *iLastName, *iAddress, *iEMail, + *sFirstName, *sLastName, *sAddress, *sEMail; + TQCheckBox *cFirstName, *cLastName, *cAddress, *cEMail; + +}; + +#endif diff --git a/examples/addressbook/fileopen.xpm b/examples/addressbook/fileopen.xpm new file mode 100644 index 000000000..880417eee --- /dev/null +++ b/examples/addressbook/fileopen.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *fileopen[] = { +" 16 13 5 1", +". c #040404", +"# c #808304", +"a c None", +"b c #f3f704", +"c c #f3f7f3", +"aaaaaaaaa...aaaa", +"aaaaaaaa.aaa.a.a", +"aaaaaaaaaaaaa..a", +"a...aaaaaaaa...a", +".bcb.......aaaaa", +".cbcbcbcbc.aaaaa", +".bcbcbcbcb.aaaaa", +".cbcb...........", +".bcb.#########.a", +".cb.#########.aa", +".b.#########.aaa", +"..#########.aaaa", +"...........aaaaa" +}; diff --git a/examples/addressbook/fileprint.xpm b/examples/addressbook/fileprint.xpm new file mode 100644 index 000000000..6ada912fa --- /dev/null +++ b/examples/addressbook/fileprint.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static const char *fileprint[] = { +" 16 14 6 1", +". c #000000", +"# c #848284", +"a c #c6c3c6", +"b c #ffff00", +"c c #ffffff", +"d c None", +"ddddd.........dd", +"dddd.cccccccc.dd", +"dddd.c.....c.ddd", +"ddd.cccccccc.ddd", +"ddd.c.....c....d", +"dd.cccccccc.a.a.", +"d..........a.a..", +".aaaaaaaaaa.a.a.", +".............aa.", +".aaaaaa###aa.a.d", +".aaaaaabbbaa...d", +".............a.d", +"d.aaaaaaaaa.a.dd", +"dd...........ddd" +}; diff --git a/examples/addressbook/filesave.xpm b/examples/addressbook/filesave.xpm new file mode 100644 index 000000000..bd6870f47 --- /dev/null +++ b/examples/addressbook/filesave.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *filesave[] = { +" 14 14 4 1", +". c #040404", +"# c #808304", +"a c #bfc2bf", +"b c None", +"..............", +".#.aaaaaaaa.a.", +".#.aaaaaaaa...", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".##........##.", +".############.", +".##.........#.", +".##......aa.#.", +".##......aa.#.", +".##......aa.#.", +"b............." +}; diff --git a/examples/addressbook/main.cpp b/examples/addressbook/main.cpp new file mode 100644 index 000000000..33b69833e --- /dev/null +++ b/examples/addressbook/main.cpp @@ -0,0 +1,27 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> + +#include "mainwindow.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + + ABMainWindow *mw = new ABMainWindow(); + mw->setCaption( "TQt Example - Addressbook" ); + a.setMainWidget( mw ); + mw->show(); + + a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) ); + int result = a.exec(); + delete mw; + return result; +} diff --git a/examples/addressbook/mainwindow.cpp b/examples/addressbook/mainwindow.cpp new file mode 100644 index 000000000..e6f705b57 --- /dev/null +++ b/examples/addressbook/mainwindow.cpp @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "mainwindow.h" +#include "centralwidget.h" + +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qstatusbar.h> +#include <qapplication.h> +#include <qfiledialog.h> + +ABMainWindow::ABMainWindow() + : TQMainWindow( 0, "example addressbook application" ), + filename( TQString::null ) +{ + setupMenuBar(); + setupFileTools(); + setupStatusBar(); + setupCentralWidget(); +} + + +ABMainWindow::~ABMainWindow() +{ +} + +void ABMainWindow::setupMenuBar() +{ + TQPopupMenu *file = new TQPopupMenu( this ); + menuBar()->insertItem( "&File", file ); + + file->insertItem( "New", this, SLOT( fileNew() ), CTRL + Key_N ); + file->insertItem( TQPixmap( "fileopen.xpm" ), "Open", this, SLOT( fileOpen() ), CTRL + Key_O ); + file->insertSeparator(); + file->insertItem( TQPixmap( "filesave.xpm" ), "Save", this, SLOT( fileSave() ), CTRL + Key_S ); + file->insertItem( "Save As...", this, SLOT( fileSaveAs() ) ); + file->insertSeparator(); + file->insertItem( TQPixmap( "fileprint.xpm" ), "Print...", this, SLOT( filePrint() ), CTRL + Key_P ); + file->insertSeparator(); + file->insertItem( "Close", this, SLOT( closeWindow() ), CTRL + Key_W ); + file->insertItem( "Quit", qApp, SLOT( tquit() ), CTRL + Key_Q ); +} + +void ABMainWindow::setupFileTools() +{ + //fileTools = new TQToolBar( this, "file operations" ); +} + +void ABMainWindow::setupStatusBar() +{ + //statusBar()->message( "Ready", 2000 ); +} + +void ABMainWindow::setupCentralWidget() +{ + view = new ABCentralWidget( this ); + setCentralWidget( view ); +} + +void ABMainWindow::closeWindow() +{ + close(); +} + +void ABMainWindow::fileNew() +{ +} + +void ABMainWindow::fileOpen() +{ + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) { + filename = fn; + view->load( filename ); + } +} + +void ABMainWindow::fileSave() +{ + if ( filename.isEmpty() ) { + fileSaveAs(); + return; + } + + view->save( filename ); +} + +void ABMainWindow::fileSaveAs() +{ + TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) { + filename = fn; + fileSave(); + } +} + +void ABMainWindow::filePrint() +{ +} diff --git a/examples/addressbook/mainwindow.h b/examples/addressbook/mainwindow.h new file mode 100644 index 000000000..e7ae62d8d --- /dev/null +++ b/examples/addressbook/mainwindow.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef AB_MAINWINDOW_H +#define AB_MAINWINDOW_H + +#include <qmainwindow.h> +#include <qstring.h> + +class TQToolBar; +class TQPopupMenu; +class ABCentralWidget; + +class ABMainWindow: public TQMainWindow +{ + Q_OBJECT + +public: + ABMainWindow(); + ~ABMainWindow(); + +protected slots: + void fileNew(); + void fileOpen(); + void fileSave(); + void fileSaveAs(); + void filePrint(); + void closeWindow(); + +protected: + void setupMenuBar(); + void setupFileTools(); + void setupStatusBar(); + void setupCentralWidget(); + + TQToolBar *fileTools; + TQString filename; + ABCentralWidget *view; + +}; + + +#endif diff --git a/examples/application/application.cpp b/examples/application/application.cpp new file mode 100644 index 000000000..e2a690e30 --- /dev/null +++ b/examples/application/application.cpp @@ -0,0 +1,294 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "application.h" + +#include <qimage.h> +#include <qpixmap.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtextedit.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qprinter.h> +#include <qapplication.h> +#include <qaccel.h> +#include <qtextstream.h> +#include <qpainter.h> +#include <qpaintdevicemetrics.h> +#include <qwhatsthis.h> +#include <qsimplerichtext.h> + +#include "filesave.xpm" +#include "fileopen.xpm" +#include "fileprint.xpm" + +ApplicationWindow::ApplicationWindow() + : TQMainWindow( 0, "example application main window", WDestructiveClose | WGroupLeader ) +{ + printer = new TQPrinter( TQPrinter::HighResolution ); + TQPixmap openIcon, saveIcon, printIcon; + + TQToolBar * fileTools = new TQToolBar( this, "file operations" ); + fileTools->setLabel( "File Operations" ); + + openIcon = TQPixmap( fileopen ); + TQToolButton * fileOpen + = new TQToolButton( openIcon, "Open File", TQString::null, + this, SLOT(choose()), fileTools, "open file" ); + + saveIcon = TQPixmap( filesave ); + TQToolButton * fileSave + = new TQToolButton( saveIcon, "Save File", TQString::null, + this, SLOT(save()), fileTools, "save file" ); + + printIcon = TQPixmap( fileprint ); + TQToolButton * filePrint + = new TQToolButton( printIcon, "Print File", TQString::null, + this, SLOT(print()), fileTools, "print file" ); + + + (void)TQWhatsThis::whatsThisButton( fileTools ); + + const char * fileOpenText = "<p><img source=\"fileopen\"> " + "Click this button to open a <em>new file</em>.<br>" + "You can also select the <b>Open</b> command " + "from the <b>File</b> menu.</p>"; + + TQWhatsThis::add( fileOpen, fileOpenText ); + + TQMimeSourceFactory::defaultFactory()->setPixmap( "fileopen", openIcon ); + + const char * fileSaveText = "<p>Click this button to save the file you " + "are editing. You will be prompted for a file name.\n" + "You can also select the <b>Save</b> command " + "from the <b>File</b> menu.</p>"; + + TQWhatsThis::add( fileSave, fileSaveText ); + + const char * filePrintText = "Click this button to print the file you " + "are editing.\n" + "You can also select the Print command " + "from the File menu."; + + TQWhatsThis::add( filePrint, filePrintText ); + + + TQPopupMenu * file = new TQPopupMenu( this ); + menuBar()->insertItem( "&File", file ); + + + file->insertItem( "&New", this, SLOT(newDoc()), CTRL+Key_N ); + + int id; + id = file->insertItem( openIcon, "&Open...", + this, SLOT(choose()), CTRL+Key_O ); + file->setWhatsThis( id, fileOpenText ); + + id = file->insertItem( saveIcon, "&Save", + this, SLOT(save()), CTRL+Key_S ); + file->setWhatsThis( id, fileSaveText ); + + id = file->insertItem( "Save &As...", this, SLOT(saveAs()) ); + file->setWhatsThis( id, fileSaveText ); + + file->insertSeparator(); + + id = file->insertItem( printIcon, "&Print...", + this, SLOT(print()), CTRL+Key_P ); + file->setWhatsThis( id, filePrintText ); + + file->insertSeparator(); + + file->insertItem( "&Close", this, SLOT(close()), CTRL+Key_W ); + + file->insertItem( "&Quit", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q ); + + menuBar()->insertSeparator(); + + TQPopupMenu * help = new TQPopupMenu( this ); + menuBar()->insertItem( "&Help", help ); + + help->insertItem( "&About", this, SLOT(about()), Key_F1 ); + help->insertItem( "About &TQt", this, SLOT(aboutTQt()) ); + help->insertSeparator(); + help->insertItem( "What's &This", this, SLOT(whatsThis()), SHIFT+Key_F1 ); + + e = new TQTextEdit( this, "editor" ); + e->setFocus(); + setCentralWidget( e ); + statusBar()->message( "Ready", 2000 ); + + resize( 450, 600 ); +} + + +ApplicationWindow::~ApplicationWindow() +{ + delete printer; +} + + + +void ApplicationWindow::newDoc() +{ + ApplicationWindow *ed = new ApplicationWindow; + ed->setCaption("TQt Example - Application"); + ed->show(); +} + +void ApplicationWindow::choose() +{ + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, + this); + if ( !fn.isEmpty() ) + load( fn ); + else + statusBar()->message( "Loading aborted", 2000 ); +} + + +void ApplicationWindow::load( const TQString &fileName ) +{ + TQFile f( fileName ); + if ( !f.open( IO_ReadOnly ) ) + return; + + TQTextStream ts( &f ); + e->setText( ts.read() ); + e->setModified( FALSE ); + setCaption( fileName ); + statusBar()->message( "Loaded document " + fileName, 2000 ); +} + + +void ApplicationWindow::save() +{ + if ( filename.isEmpty() ) { + saveAs(); + return; + } + + TQString text = e->text(); + TQFile f( filename ); + if ( !f.open( IO_WriteOnly ) ) { + statusBar()->message( TQString("Could not write to %1").arg(filename), + 2000 ); + return; + } + + TQTextStream t( &f ); + t << text; + f.close(); + + e->setModified( FALSE ); + + setCaption( filename ); + + statusBar()->message( TQString( "File %1 saved" ).arg( filename ), 2000 ); +} + + +void ApplicationWindow::saveAs() +{ + TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, + this ); + if ( !fn.isEmpty() ) { + filename = fn; + save(); + } else { + statusBar()->message( "Saving aborted", 2000 ); + } +} + + +void ApplicationWindow::print() +{ + printer->setFullPage( TRUE ); + if ( printer->setup(this) ) { // printer dialog + statusBar()->message( "Printing..." ); + TQPainter p; + if( !p.begin( printer ) ) { // paint on printer + statusBar()->message( "Printing aborted", 2000 ); + return; + } + + TQPaintDeviceMetrics metrics( p.device() ); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + TQSimpleRichText richText( TQStyleSheet::convertFromPlainText(e->text()), + TQFont(), + e->context(), + e->styleSheet(), + e->mimeSourceFactory(), + view.height() ); + richText.setWidth( &p, view.width() ); + int page = 1; + do { + richText.draw( &p, margin, margin, view, colorGroup() ); + view.moveBy( 0, view.height() ); + p.translate( 0 , -view.height() ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) ); + if ( view.top() - margin >= richText.height() ) + break; + printer->newPage(); + page++; + } while (TRUE); + + statusBar()->message( "Printing completed", 2000 ); + } else { + statusBar()->message( "Printing aborted", 2000 ); + } +} + +void ApplicationWindow::closeEvent( TQCloseEvent* ce ) +{ + if ( !e->isModified() ) { + ce->accept(); + return; + } + + switch( TQMessageBox::information( this, "TQt Application Example", + "Do you want to save the changes" + " to the document?", + "Yes", "No", "Cancel", + 0, 1 ) ) { + case 0: + save(); + ce->accept(); + break; + case 1: + ce->accept(); + break; + case 2: + default: // just for sanity + ce->ignore(); + break; + } +} + + +void ApplicationWindow::about() +{ + TQMessageBox::about( this, "TQt Application Example", + "This example demonstrates simple use of " + "TQMainWindow,\nTQMenuBar and TQToolBar."); +} + + +void ApplicationWindow::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQt Application Example" ); +} diff --git a/examples/application/application.doc b/examples/application/application.doc new file mode 100644 index 000000000..731bda020 --- /dev/null +++ b/examples/application/application.doc @@ -0,0 +1,34 @@ +/* +*/ + +/*! \page simple-application-example.html + + \ingroup examples + + \title A Complete Application Window + + This example program looks like a complete modern application. It + has a menu bar, it has a tool bar, it has a status bar and works + like a simple text editor. + + There is a <a href="simple-application.html">walkthrough</a> of + this example. + + <hr> + + Header file: + + \include application/application.h + + <hr> + + Implementation: + + \include application/application.cpp + + <hr> + + Main: + + \include application/main.cpp +*/ diff --git a/examples/application/application.h b/examples/application/application.h new file mode 100644 index 000000000..7b772728e --- /dev/null +++ b/examples/application/application.h @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef APPLICATION_H +#define APPLICATION_H + +#include <qmainwindow.h> + +class TQTextEdit; + +class ApplicationWindow: public TQMainWindow +{ + Q_OBJECT + +public: + ApplicationWindow(); + ~ApplicationWindow(); + +protected: + void closeEvent( TQCloseEvent* ); + +private slots: + void newDoc(); + void choose(); + void load( const TQString &fileName ); + void save(); + void saveAs(); + void print(); + + void about(); + void aboutTQt(); + +private: + TQPrinter *printer; + TQTextEdit *e; + TQString filename; +}; + + +#endif diff --git a/examples/application/application.pro b/examples/application/application.pro new file mode 100644 index 000000000..7f109124a --- /dev/null +++ b/examples/application/application.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = application + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = application.h +SOURCES = application.cpp \ + main.cpp diff --git a/examples/application/fileopen.xpm b/examples/application/fileopen.xpm new file mode 100644 index 000000000..880417eee --- /dev/null +++ b/examples/application/fileopen.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *fileopen[] = { +" 16 13 5 1", +". c #040404", +"# c #808304", +"a c None", +"b c #f3f704", +"c c #f3f7f3", +"aaaaaaaaa...aaaa", +"aaaaaaaa.aaa.a.a", +"aaaaaaaaaaaaa..a", +"a...aaaaaaaa...a", +".bcb.......aaaaa", +".cbcbcbcbc.aaaaa", +".bcbcbcbcb.aaaaa", +".cbcb...........", +".bcb.#########.a", +".cb.#########.aa", +".b.#########.aaa", +"..#########.aaaa", +"...........aaaaa" +}; diff --git a/examples/application/fileprint.xpm b/examples/application/fileprint.xpm new file mode 100644 index 000000000..6ada912fa --- /dev/null +++ b/examples/application/fileprint.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static const char *fileprint[] = { +" 16 14 6 1", +". c #000000", +"# c #848284", +"a c #c6c3c6", +"b c #ffff00", +"c c #ffffff", +"d c None", +"ddddd.........dd", +"dddd.cccccccc.dd", +"dddd.c.....c.ddd", +"ddd.cccccccc.ddd", +"ddd.c.....c....d", +"dd.cccccccc.a.a.", +"d..........a.a..", +".aaaaaaaaaa.a.a.", +".............aa.", +".aaaaaa###aa.a.d", +".aaaaaabbbaa...d", +".............a.d", +"d.aaaaaaaaa.a.dd", +"dd...........ddd" +}; diff --git a/examples/application/filesave.xpm b/examples/application/filesave.xpm new file mode 100644 index 000000000..bd6870f47 --- /dev/null +++ b/examples/application/filesave.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *filesave[] = { +" 14 14 4 1", +". c #040404", +"# c #808304", +"a c #bfc2bf", +"b c None", +"..............", +".#.aaaaaaaa.a.", +".#.aaaaaaaa...", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".##........##.", +".############.", +".##.........#.", +".##......aa.#.", +".##......aa.#.", +".##......aa.#.", +"b............." +}; diff --git a/examples/application/main.cpp b/examples/application/main.cpp new file mode 100644 index 000000000..f6a4ae3fb --- /dev/null +++ b/examples/application/main.cpp @@ -0,0 +1,20 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "application.h" + +int main( int argc, char ** argv ) { + TQApplication a( argc, argv ); + ApplicationWindow *mw = new ApplicationWindow(); + mw->setCaption( "TQt Example - Application" ); + mw->show(); + a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) ); + return a.exec(); +} diff --git a/examples/biff/biff.cpp b/examples/biff/biff.cpp new file mode 100644 index 000000000..34382403a --- /dev/null +++ b/examples/biff/biff.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "biff.h" +#include <qstring.h> +#include <qfileinfo.h> +#include <qpainter.h> + +#include <unistd.h> +#include <stdlib.h> + +#include "bmp.cpp" + + +Biff::Biff( TQWidget *parent, const char *name ) + : TQWidget( parent, name, WShowModal | WType_Dialog ) +{ + TQFileInfo fi = TQString(getenv( "MAIL" )); + if ( !fi.exists() ) { + TQString s( "/var/spool/mail/" ); + s += getlogin(); + fi.setFile( s ); + } + + if ( fi.exists() ) { + mailbox = fi.absFilePath(); + startTimer( 1000 ); + } + + setMinimumSize( 48, 48 ); + setMaximumSize( 48, 48 ); + resize( 48, 48 ); + + hasNewMail.loadFromData( hasmail_bmp_data, hasmail_bmp_len ); + noNewMail.loadFromData( nomail_bmp_data, nomail_bmp_len ); + + gotMail = FALSE; + lastModified = fi.lastModified(); +} + + +void Biff::timerEvent( TQTimerEvent * ) +{ + TQFileInfo fi( mailbox ); + bool newState = ( fi.lastModified() != lastModified && + fi.lastModified() > fi.lastRead() ); + if ( newState != gotMail ) { + if ( gotMail ) + lastModified = fi.lastModified(); + gotMail = newState; + repaint( FALSE ); + } +} + + +void Biff::paintEvent( TQPaintEvent * ) +{ + if ( gotMail ) + bitBlt( this, 0, 0, &hasNewMail ); + else + bitBlt( this, 0, 0, &noNewMail ); +} + + +void Biff::mousePressEvent( TQMouseEvent * ) +{ + TQFileInfo fi( mailbox ); + lastModified = fi.lastModified(); +} diff --git a/examples/biff/biff.doc b/examples/biff/biff.doc new file mode 100644 index 000000000..d16216825 --- /dev/null +++ b/examples/biff/biff.doc @@ -0,0 +1,31 @@ +/* +*/ +/*! \page biff-example.html + + \ingroup examples + \title Biff (UNIX only) + + Biff is a simple graphical program to indicate whether there is new + mail; it looks exactly like xbiff but is much shorter. + + <hr> + + Header file: + + \include biff/biff.h + + <hr> + + \e biff.cpp implements this custom widget. Note in particular + how two images (\e hasmail_bmp_data and \e nomail_bmp_data, both from + \e bmp.cpp) are included into the executable. + + \include biff/biff.cpp + + <hr> + + Main: + + \include biff/main.cpp +*/ + diff --git a/examples/biff/biff.h b/examples/biff/biff.h new file mode 100644 index 000000000..e35114ad3 --- /dev/null +++ b/examples/biff/biff.h @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef BIFF_H +#define BIFF_H + +#include <qwidget.h> +#include <qdatetime.h> +#include <qpixmap.h> + + +class Biff : public TQWidget +{ + Q_OBJECT +public: + Biff( TQWidget *parent=0, const char *name=0 ); + +protected: + void timerEvent( TQTimerEvent * ); + void paintEvent( TQPaintEvent * ); + void mousePressEvent( TQMouseEvent * ); + +private: + TQDateTime lastModified; + TQPixmap hasNewMail; + TQPixmap noNewMail; + TQString mailbox; + bool gotMail; +}; + + +#endif // BIFF_H diff --git a/examples/biff/biff.pro b/examples/biff/biff.pro new file mode 100644 index 000000000..45f16f246 --- /dev/null +++ b/examples/biff/biff.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = biff + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = biff.h +SOURCES = biff.cpp \ + main.cpp diff --git a/examples/biff/bmp.cpp b/examples/biff/bmp.cpp new file mode 100644 index 000000000..60eff58ea --- /dev/null +++ b/examples/biff/bmp.cpp @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +static const unsigned int hasmail_bmp_len = 1218; +static const unsigned char hasmail_bmp_data[] = { + 0x42,0x4d,0xc2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00, + 0x28,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00, + 0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x6d,0x0b,0x00,0x00, + 0x6d,0x0b,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xff,0xff,0xff,0x00,0x51,0x61,0x30,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x00,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11, + 0x00,0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x00, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x11,0x00,0x01,0x00,0x00,0x01,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x00,0x01,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x00,0x01, + 0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x00,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x00, + 0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, + 0x00,0x10,0x10,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01, + 0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,0x01,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x10,0x11,0x00,0x10,0x10,0x10,0x10,0x10,0x10, + 0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x10,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10, + 0x10,0x10,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x11, + 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x01,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x01,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10, + 0x10,0x11,0x01,0x10,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x10, + 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x01,0x10,0x00,0x00,0x00,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x11,0x10, + 0x10,0x10,0x10,0x10,0x01,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x11,0x11,0x11,0x10,0x01,0x10,0x10,0x10,0x01,0x00,0x10,0x10, + 0x01,0x10,0x00,0x00,0x00,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x00,0x00, + 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x01,0x10, + 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x01,0x11,0x00,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x10,0x01,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10, + 0x01,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x10,0x00,0x01,0x11,0x11,0x10,0x00,0x01,0x11,0x01,0x11,0x00,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00, + 0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x11,0x00,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x11,0x01,0x11,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x11,0x11, + 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x11,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x01,0x11,0x00,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00, + 0x01,0x11,0x00,0x00,0x01,0x11,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10,0x00,0x00, + 0x01,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x11,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x01,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x01,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x01,0x11, + 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x10,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x01,0x10,0x10,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x01,0x01, + 0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x11,0x11,0x01,0x11,0x10,0x10,0x10,0x11,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x11,0x11,0x01,0x11,0x01,0x01,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11, + 0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + +static const unsigned int nomail_bmp_len = 1222; +static const unsigned char nomail_bmp_data[] = { + 0x42,0x4d,0xc6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00, + 0x28,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00, + 0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x6d,0x0b,0x00,0x00, + 0x6d,0x0b,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xff,0xff,0xff,0x00,0x38,0x30,0x61,0x00,0xa6,0x8a,0xff,0x00, + 0x01,0x01,0x01,0x01,0x11,0x01,0x11,0x10,0x11,0x10,0x11,0x01,0x01,0x11, + 0x01,0x11,0x11,0x01,0x11,0x10,0x01,0x10,0x01,0x11,0x10,0x01,0x11,0x01, + 0x11,0x11,0x00,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x01,0x11, + 0x10,0x00,0x00,0x01,0x11,0x01,0x01,0x00,0x01,0x10,0x00,0x10,0x10,0x00, + 0x00,0x10,0x01,0x10,0x10,0x01,0x00,0x01,0x10,0x11,0x01,0x00,0x10,0x10, + 0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x11,0x10, + 0x11,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x11,0x10,0x00,0x00,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10, + 0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11, + 0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10, + 0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00, + 0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x00,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x01,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11, + 0x10,0x01,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x10, + 0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01, + 0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x00,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11, + 0x11,0x11,0x10,0x01,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01, + 0x11,0x11,0x11,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x01, + 0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x10,0x01,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x01,0x10,0x00,0x00,0x00, + 0x00,0x00,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11, + 0x10,0x01,0x11,0x11,0x11,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x00, + 0x11,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01, + 0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x00,0x01,0x01,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x10,0x01, + 0x11,0x11,0x10,0x01,0x11,0x00,0x01,0x01,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x10,0x00,0x00,0x01,0x11,0x10,0x00, + 0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x01,0x11,0x00,0x00, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x11,0x11, + 0x11,0x11,0x11,0x11,0x00,0x10,0x00,0x11,0x10,0x00,0x01,0x11,0x00,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x10, + 0x01,0x11,0x00,0x01,0x11,0x00,0x00,0x11,0x00,0x01,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x10,0x00,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x10,0x00, + 0x11,0x01,0x00,0x01,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x00,0x01,0x11,0x11,0x10,0x00,0x11,0x11,0x11,0x00,0x01,0x01,0x10,0x00, + 0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00, + 0x00,0x01,0x11,0x11,0x11,0x10,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x11,0x11, + 0x11,0x11,0x00,0x01,0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01, + 0x11,0x11,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x10,0x01, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x01,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11, + 0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x00,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x00,0x01,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x01,0x11, + 0x10,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11 +}; diff --git a/examples/biff/main.cpp b/examples/biff/main.cpp new file mode 100644 index 000000000..33faa7b9d --- /dev/null +++ b/examples/biff/main.cpp @@ -0,0 +1,21 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "biff.h" + + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + Biff b; + a.setMainWidget( &b ); + b.show(); + return a.exec(); +} diff --git a/examples/buttongroups/README b/examples/buttongroups/README new file mode 100644 index 000000000..f97539602 --- /dev/null +++ b/examples/buttongroups/README @@ -0,0 +1,13 @@ +This example program shows how to use + + - different types of buttons + - different types of groupboxes + +The buttons which are used are radiobuttons, checkboxes (also tristate +checkboxes), normal pusbuttons and toggleable pushbuttons. These +buttons are seperated in four groups using groupboxes. The example +shows how to make a buttongroup totally exclusive (only one button can +be checked), exclusive for radiobuttons only or non-exclusive. It +also demonstrates how buttons (and other widgets) can be laid out +in rows and columns using a groupbox. + diff --git a/examples/buttongroups/buttongroups.cpp b/examples/buttongroups/buttongroups.cpp new file mode 100644 index 000000000..f9859d3e2 --- /dev/null +++ b/examples/buttongroups/buttongroups.cpp @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "buttongroups.h" + +#include <qpopupmenu.h> +#include <qbuttongroup.h> +#include <qlayout.h> +#include <qradiobutton.h> +#include <qcheckbox.h> +#include <qgroupbox.h> +#include <qpushbutton.h> + +/* + * Constructor + * + * Creates all child widgets of the ButtonGroups window + */ + +ButtonsGroups::ButtonsGroups( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + // Create Widgets which allow easy layouting + TQVBoxLayout *vbox = new TQVBoxLayout( this, 11, 6 ); + TQHBoxLayout *box1 = new TQHBoxLayout( vbox ); + TQHBoxLayout *box2 = new TQHBoxLayout( vbox ); + + // ------- first group + + // Create an exclusive button group + TQButtonGroup *bgrp1 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Button Group 1 (exclusive)", this); + box1->addWidget( bgrp1 ); + bgrp1->setExclusive( TRUE ); + + // insert 3 radiobuttons + TQRadioButton *rb11 = new TQRadioButton( "&Radiobutton 1", bgrp1 ); + rb11->setChecked( TRUE ); + (void)new TQRadioButton( "R&adiobutton 2", bgrp1 ); + (void)new TQRadioButton( "Ra&diobutton 3", bgrp1 ); + + // ------- second group + + // Create a non-exclusive buttongroup + TQButtonGroup *bgrp2 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Button Group 2 (non-exclusive)", this ); + box1->addWidget( bgrp2 ); + bgrp2->setExclusive( FALSE ); + + // insert 3 checkboxes + (void)new TQCheckBox( "&Checkbox 1", bgrp2 ); + TQCheckBox *cb12 = new TQCheckBox( "C&heckbox 2", bgrp2 ); + cb12->setChecked( TRUE ); + TQCheckBox *cb13 = new TQCheckBox( "Triple &State Button", bgrp2 ); + cb13->setTristate( TRUE ); + cb13->setChecked( TRUE ); + + // ------------ third group + + // create a buttongroup which is exclusive for radiobuttons and non-exclusive for all other buttons + TQButtonGroup *bgrp3 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Button Group 3 (Radiobutton-exclusive)", this ); + box2->addWidget( bgrp3 ); + bgrp3->setRadioButtonExclusive( TRUE ); + + // insert three radiobuttons + rb21 = new TQRadioButton( "Rad&iobutton 1", bgrp3 ); + rb22 = new TQRadioButton( "Radi&obutton 2", bgrp3 ); + rb23 = new TQRadioButton( "Radio&button 3", bgrp3 ); + rb23->setChecked( TRUE ); + + // insert a checkbox... + state = new TQCheckBox( "E&nable Radiobuttons", bgrp3 ); + state->setChecked( TRUE ); + // ...and connect its SIGNAL clicked() with the SLOT slotChangeGrp3State() + connect( state, SIGNAL( clicked() ), this, SLOT( slotChangeGrp3State() ) ); + + // ------------ fourth group + + // create a groupbox which layouts its childs in a columns + TQGroupBox *bgrp4 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Groupbox with normal buttons", this ); + box2->addWidget( bgrp4 ); + + // insert four pushbuttons... + (void)new TQPushButton( "&Push Button", bgrp4, "push" ); + + // now make the second one a toggle button + TQPushButton *tb2 = new TQPushButton( "&Toggle Button", bgrp4, "toggle" ); + tb2->setToggleButton( TRUE ); + tb2->setOn( TRUE ); + + // ... and make the third one a flat button + TQPushButton *tb3 = new TQPushButton( "&Flat Button", bgrp4, "flat" ); + tb3->setFlat(TRUE); + + // .. and the fourth a button with a menu + TQPushButton *tb4 = new TQPushButton( "Popup Button", bgrp4, "popup" ); + TQPopupMenu *menu = new TQPopupMenu(tb4); + menu->insertItem("Item1", 0); + menu->insertItem("Item2", 1); + menu->insertItem("Item3", 2); + menu->insertItem("Item4", 3); + tb4->setPopup(menu); +} + +/* + * SLOT slotChangeGrp3State() + * + * enables/disables the radiobuttons of the third buttongroup + */ + +void ButtonsGroups::slotChangeGrp3State() +{ + rb21->setEnabled( state->isChecked() ); + rb22->setEnabled( state->isChecked() ); + rb23->setEnabled( state->isChecked() ); +} diff --git a/examples/buttongroups/buttongroups.doc b/examples/buttongroups/buttongroups.doc new file mode 100644 index 000000000..439cce7b1 --- /dev/null +++ b/examples/buttongroups/buttongroups.doc @@ -0,0 +1,27 @@ +/* +*/ +/*! \page buttongroups-example.html + + \ingroup examples + \title Buttons and Groupboxes + + This example shows different types of groupboxes (buttongroups, etc.) and + different kinds of buttons (checkboxes, radiobuttons, pushbuttons, etc.). + + <hr> + + Header file: + + \include buttongroups/buttongroups.h + + <hr> + + Implementation: + + \include buttongroups/buttongroups.cpp + + <hr> + + Main: + \include buttongroups/main.cpp +*/ diff --git a/examples/buttongroups/buttongroups.h b/examples/buttongroups/buttongroups.h new file mode 100644 index 000000000..3c498a3ce --- /dev/null +++ b/examples/buttongroups/buttongroups.h @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef BUTTONS_GROUPS_H +#define BUTTONS_GROUPS_H + +#include <qwidget.h> + +class TQCheckBox; +class TQRadioButton; + +class ButtonsGroups : public TQWidget +{ + Q_OBJECT + +public: + ButtonsGroups( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQCheckBox *state; + TQRadioButton *rb21, *rb22, *rb23; + +protected slots: + void slotChangeGrp3State(); + +}; + +#endif diff --git a/examples/buttongroups/buttongroups.pro b/examples/buttongroups/buttongroups.pro new file mode 100644 index 000000000..cfad62e15 --- /dev/null +++ b/examples/buttongroups/buttongroups.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = buttongroups + +CONFIG += qt warn_on release + +REQUIRES = small-config + +HEADERS = buttongroups.h +SOURCES = buttongroups.cpp \ + main.cpp diff --git a/examples/buttongroups/main.cpp b/examples/buttongroups/main.cpp new file mode 100644 index 000000000..771dd35b8 --- /dev/null +++ b/examples/buttongroups/main.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "buttongroups.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + ButtonsGroups buttonsgroups; + buttonsgroups.resize( 500, 250 ); + buttonsgroups.setCaption( "TQt Example - Buttongroups" ); + a.setMainWidget( &buttonsgroups ); + buttonsgroups.show(); + + return a.exec(); +} diff --git a/examples/canvas/blendshadow.cpp b/examples/canvas/blendshadow.cpp new file mode 100644 index 000000000..deb18a4a1 --- /dev/null +++ b/examples/canvas/blendshadow.cpp @@ -0,0 +1,53 @@ +#include <qimage.h> +#include <qcolor.h> + +static inline int blendComponent( int v, int av, int s, int as ) +{ + return as*s + av*v -(av*as*s)/255; +} + +static inline TQRgb blendShade( TQRgb v, TQRgb s ) +{ + //shadow image is already reduced and blurred + int as = qAlpha(s); + int av = qAlpha(v); + if ( as == 0 || av == 255 ) + return v; + + int a = as + av -(as*av)/255; + + int r = blendComponent( qRed(v),av, qRed(s), as)/a; + int g = blendComponent( qGreen(v),av, qGreen(s), as)/a; + int b = blendComponent( qBlue(v),av, qBlue(s), as)/a; + + return qRgba(r,g,b,a); +} + + + +int main( int*, char**) +{ + TQImage image( "out.png" ); + image.convertDepth( 32 ); + TQImage shade( "outshade.png" ); + shade.convertDepth( 32 ); + int dx = 10; + int dy = 5; + + int w = image.width(); + int h = image.height(); + + TQImage img( w+dx, h+dy, 32 ); + img.setAlphaBuffer( TRUE ); + + for ( int y = 0; y < h+dy; y++ ) { + for ( int x = 0; x < w+dx; x++ ) { + TQRgb sh = (x<dx||y<dy) ? 0 : shade.pixel( x-dx, y-dy ); + TQRgb pixel = (x<w&y<h) ? image.pixel( x, y ) : 0; + img.setPixel( x, y, blendShade( pixel, sh ) ); + } + } + img.save("blend.png", "PNG" ); +} + + diff --git a/examples/canvas/butterfly.png b/examples/canvas/butterfly.png Binary files differnew file mode 100644 index 000000000..619f25306 --- /dev/null +++ b/examples/canvas/butterfly.png diff --git a/examples/canvas/canvas.cpp b/examples/canvas/canvas.cpp new file mode 100644 index 000000000..0be872859 --- /dev/null +++ b/examples/canvas/canvas.cpp @@ -0,0 +1,747 @@ +#include <qdatetime.h> +#include <qmainwindow.h> +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qmenubar.h> +#include <qapplication.h> +#include <qpainter.h> +#include <qprinter.h> +#include <qlabel.h> +#include <qimage.h> +#include <qprogressdialog.h> +#include "canvas.h" + +#include <stdlib.h> + +// We use a global variable to save memory - all the brushes and pens in +// the mesh are shared. +static TQBrush *tb = 0; +static TQPen *tp = 0; + +class EdgeItem; +class NodeItem; + +class EdgeItem: public TQCanvasLine +{ +public: + EdgeItem( NodeItem*, NodeItem*, TQCanvas *canvas ); + void setFromPoint( int x, int y ) ; + void setToPoint( int x, int y ); + static int count() { return c; } + void moveBy(double dx, double dy); +private: + static int c; +}; + +static const int imageRTTI = 984376; + + +class ImageItem: public TQCanvasRectangle +{ +public: + ImageItem( TQImage img, TQCanvas *canvas ); + int rtti () const { return imageRTTI; } + bool hit( const TQPoint&) const; +protected: + void drawShape( TQPainter & ); +private: + TQImage image; + TQPixmap pixmap; +}; + + +ImageItem::ImageItem( TQImage img, TQCanvas *canvas ) + : TQCanvasRectangle( canvas ), image(img) +{ + setSize( image.width(), image.height() ); + +#if !defined(Q_WS_QWS) + pixmap.convertFromImage(image, OrderedAlphaDither); +#endif +} + + +void ImageItem::drawShape( TQPainter &p ) +{ +// On TQt/Embedded, we can paint a TQImage as fast as a TQPixmap, +// but on other platforms, we need to use a TQPixmap. +#if defined(Q_WS_QWS) + p.drawImage( int(x()), int(y()), image, 0, 0, -1, -1, OrderedAlphaDither ); +#else + p.drawPixmap( int(x()), int(y()), pixmap ); +#endif +} + +bool ImageItem::hit( const TQPoint &p ) const +{ + int ix = p.x()-int(x()); + int iy = p.y()-int(y()); + if ( !image.valid( ix , iy ) ) + return FALSE; + TQRgb pixel = image.pixel( ix, iy ); + return qAlpha( pixel ) != 0; +} + +class NodeItem: public TQCanvasEllipse +{ +public: + NodeItem( TQCanvas *canvas ); + ~NodeItem() {} + + void addInEdge( EdgeItem *edge ) { inList.append( edge ); } + void addOutEdge( EdgeItem *edge ) { outList.append( edge ); } + + void moveBy(double dx, double dy); + + // TQPoint center() { return boundingRect().center(); } +private: + TQPtrList<EdgeItem> inList; + TQPtrList<EdgeItem> outList; +}; + + +int EdgeItem::c = 0; + + +void EdgeItem::moveBy(double, double) +{ + //nothing +} + +EdgeItem::EdgeItem( NodeItem *from, NodeItem *to, TQCanvas *canvas ) + : TQCanvasLine( canvas ) +{ + c++; + setPen( *tp ); + setBrush( *tb ); + from->addOutEdge( this ); + to->addInEdge( this ); + setPoints( int(from->x()), int(from->y()), int(to->x()), int(to->y()) ); + setZ( 127 ); +} + +void EdgeItem::setFromPoint( int x, int y ) +{ + setPoints( x,y, endPoint().x(), endPoint().y() ); +} + +void EdgeItem::setToPoint( int x, int y ) +{ + setPoints( startPoint().x(), startPoint().y(), x, y ); +} + + + +void NodeItem::moveBy(double dx, double dy) +{ + TQCanvasEllipse::moveBy( dx, dy ); + + TQPtrListIterator<EdgeItem> it1( inList ); + EdgeItem *edge; + while (( edge = it1.current() )) { + ++it1; + edge->setToPoint( int(x()), int(y()) ); + } + TQPtrListIterator<EdgeItem> it2( outList ); + while (( edge = it2.current() )) { + ++it2; + edge->setFromPoint( int(x()), int(y()) ); + } +} + +NodeItem::NodeItem( TQCanvas *canvas ) + : TQCanvasEllipse( 6, 6, canvas ) +{ + setPen( *tp ); + setBrush( *tb ); + setZ( 128 ); +} + +FigureEditor::FigureEditor( + TQCanvas& c, TQWidget* parent, + const char* name, WFlags f) : + TQCanvasView(&c,parent,name,f) +{ +} + +void FigureEditor::contentsMousePressEvent(TQMouseEvent* e) +{ + TQPoint p = inverseWorldMatrix().map(e->pos()); + TQCanvasItemList l=canvas()->collisions(p); + for (TQCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) { + if ( (*it)->rtti() == imageRTTI ) { + ImageItem *item= (ImageItem*)(*it); + if ( !item->hit( p ) ) + continue; + } + moving = *it; + moving_start = p; + return; + } + moving = 0; +} + +void FigureEditor::clear() +{ + TQCanvasItemList list = canvas()->allItems(); + TQCanvasItemList::Iterator it = list.begin(); + for (; it != list.end(); ++it) { + if ( *it ) + delete *it; + } +} + +void FigureEditor::contentsMouseMoveEvent(TQMouseEvent* e) +{ + if ( moving ) { + TQPoint p = inverseWorldMatrix().map(e->pos()); + moving->moveBy(p.x() - moving_start.x(), + p.y() - moving_start.y()); + moving_start = p; + canvas()->update(); + } +} + + + +BouncyLogo::BouncyLogo(TQCanvas* canvas) : + TQCanvasSprite(0,canvas) +{ + static TQCanvasPixmapArray logo("qt-trans.xpm"); + setSequence(&logo); + setAnimated(TRUE); + initPos(); +} + + +const int logo_rtti = 1234; + +int BouncyLogo::rtti() const +{ + return logo_rtti; +} + +void BouncyLogo::initPos() +{ + initSpeed(); + int trial=1000; + do { + move(rand()%canvas()->width(),rand()%canvas()->height()); + advance(0); + } while (trial-- && xVelocity()==0.0 && yVelocity()==0.0); +} + +void BouncyLogo::initSpeed() +{ + const double speed = 4.0; + double d = (double)(rand()%1024) / 1024.0; + setVelocity( d*speed*2-speed, (1-d)*speed*2-speed ); +} + +void BouncyLogo::advance(int stage) +{ + switch ( stage ) { + case 0: { + double vx = xVelocity(); + double vy = yVelocity(); + + if ( vx == 0.0 && vy == 0.0 ) { + // stopped last turn + initSpeed(); + vx = xVelocity(); + vy = yVelocity(); + } + + double nx = x() + vx; + double ny = y() + vy; + + if ( nx < 0 || nx >= canvas()->width() ) + vx = -vx; + if ( ny < 0 || ny >= canvas()->height() ) + vy = -vy; + + for (int bounce=0; bounce<4; bounce++) { + TQCanvasItemList l=collisions(FALSE); + for (TQCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) { + TQCanvasItem *hit = *it; + if ( hit->rtti()==logo_rtti && hit->collidesWith(this) ) { + switch ( bounce ) { + case 0: + vx = -vx; + break; + case 1: + vy = -vy; + vx = -vx; + break; + case 2: + vx = -vx; + break; + case 3: + // Stop for this turn + vx = 0; + vy = 0; + break; + } + setVelocity(vx,vy); + break; + } + } + } + + if ( x()+vx < 0 || x()+vx >= canvas()->width() ) + vx = 0; + if ( y()+vy < 0 || y()+vy >= canvas()->height() ) + vy = 0; + + setVelocity(vx,vy); + } break; + case 1: + TQCanvasItem::advance(stage); + break; + } +} + +static uint mainCount = 0; +static TQImage *butterflyimg; +static TQImage *logoimg; + +Main::Main(TQCanvas& c, TQWidget* parent, const char* name, WFlags f) : + TQMainWindow(parent,name,f), + canvas(c) +{ + editor = new FigureEditor(canvas,this); + TQMenuBar* menu = menuBar(); + + TQPopupMenu* file = new TQPopupMenu( menu ); + file->insertItem("&Fill canvas", this, SLOT(init()), CTRL+Key_F); + file->insertItem("&Erase canvas", this, SLOT(clear()), CTRL+Key_E); + file->insertItem("&New view", this, SLOT(newView()), CTRL+Key_N); + file->insertSeparator(); + file->insertItem("&Print...", this, SLOT(print()), CTRL+Key_P); + file->insertSeparator(); + file->insertItem("E&xit", qApp, SLOT(tquit()), CTRL+Key_Q); + menu->insertItem("&File", file); + + TQPopupMenu* edit = new TQPopupMenu( menu ); + edit->insertItem("Add &Circle", this, SLOT(addCircle()), ALT+Key_C); + edit->insertItem("Add &Hexagon", this, SLOT(addHexagon()), ALT+Key_H); + edit->insertItem("Add &Polygon", this, SLOT(addPolygon()), ALT+Key_P); + edit->insertItem("Add Spl&ine", this, SLOT(addSpline()), ALT+Key_I); + edit->insertItem("Add &Text", this, SLOT(addText()), ALT+Key_T); + edit->insertItem("Add &Line", this, SLOT(addLine()), ALT+Key_L); + edit->insertItem("Add &Rectangle", this, SLOT(addRectangle()), ALT+Key_R); + edit->insertItem("Add &Sprite", this, SLOT(addSprite()), ALT+Key_S); + edit->insertItem("Create &Mesh", this, SLOT(addMesh()), ALT+Key_M ); + edit->insertItem("Add &Alpha-blended image", this, SLOT(addButterfly()), ALT+Key_A); + menu->insertItem("&Edit", edit); + + TQPopupMenu* view = new TQPopupMenu( menu ); + view->insertItem("&Enlarge", this, SLOT(enlarge()), SHIFT+CTRL+Key_Plus); + view->insertItem("Shr&ink", this, SLOT(shrink()), SHIFT+CTRL+Key_Minus); + view->insertSeparator(); + view->insertItem("&Rotate clockwise", this, SLOT(rotateClockwise()), CTRL+Key_PageDown); + view->insertItem("Rotate &counterclockwise", this, SLOT(rotateCounterClockwise()), CTRL+Key_PageUp); + view->insertItem("&Zoom in", this, SLOT(zoomIn()), CTRL+Key_Plus); + view->insertItem("Zoom &out", this, SLOT(zoomOut()), CTRL+Key_Minus); + view->insertItem("Translate left", this, SLOT(moveL()), CTRL+Key_Left); + view->insertItem("Translate right", this, SLOT(moveR()), CTRL+Key_Right); + view->insertItem("Translate up", this, SLOT(moveU()), CTRL+Key_Up); + view->insertItem("Translate down", this, SLOT(moveD()), CTRL+Key_Down); + view->insertItem("&Mirror", this, SLOT(mirror()), CTRL+Key_Home); + menu->insertItem("&View", view); + + options = new TQPopupMenu( menu ); + dbf_id = options->insertItem("Double buffer", this, SLOT(toggleDoubleBuffer())); + options->setItemChecked(dbf_id, TRUE); + menu->insertItem("&Options",options); + + menu->insertSeparator(); + + TQPopupMenu* help = new TQPopupMenu( menu ); + help->insertItem("&About", this, SLOT(help()), Key_F1); + help->setItemChecked(dbf_id, TRUE); + menu->insertItem("&Help",help); + + statusBar(); + + setCentralWidget(editor); + + printer = 0; + + init(); +} + +void Main::init() +{ + clear(); + + static int r=24; + srand(++r); + + mainCount++; + butterflyimg = 0; + logoimg = 0; + + int i; + for ( i=0; i<canvas.width() / 56; i++) { + addButterfly(); + } + for ( i=0; i<canvas.width() / 85; i++) { + addHexagon(); + } + for ( i=0; i<canvas.width() / 128; i++) { + addLogo(); + } +} + +Main::~Main() +{ + delete printer; + if ( !--mainCount ) { + delete[] butterflyimg; + butterflyimg = 0; + delete[] logoimg; + logoimg = 0; + } +} + +void Main::newView() +{ + // Open a new view... have it delete when closed. + Main *m = new Main(canvas, 0, 0, WDestructiveClose); + qApp->setMainWidget(m); + m->show(); + qApp->setMainWidget(0); +} + +void Main::clear() +{ + editor->clear(); +} + +void Main::help() +{ + static TQMessageBox* about = new TQMessageBox( "TQt Canvas Example", + "<h3>The TQCanvas classes example</h3>" + "<ul>" + "<li> Press ALT-S for some sprites." + "<li> Press ALT-C for some circles." + "<li> Press ALT-L for some lines." + "<li> Drag the objects around." + "<li> Read the code!" + "</ul>", TQMessageBox::Information, 1, 0, 0, this, 0, FALSE ); + about->setButtonText( 1, "Dismiss" ); + about->show(); +} + +void Main::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQt Canvas Example" ); +} + +void Main::toggleDoubleBuffer() +{ + bool s = !options->isItemChecked(dbf_id); + options->setItemChecked(dbf_id,s); + canvas.setDoubleBuffering(s); +} + +void Main::enlarge() +{ + canvas.resize(canvas.width()*4/3, canvas.height()*4/3); +} + +void Main::shrink() +{ + canvas.resize(canvas.width()*3/4, canvas.height()*3/4); +} + +void Main::rotateClockwise() +{ + TQWMatrix m = editor->worldMatrix(); + m.rotate( 22.5 ); + editor->setWorldMatrix( m ); +} + +void Main::rotateCounterClockwise() +{ + TQWMatrix m = editor->worldMatrix(); + m.rotate( -22.5 ); + editor->setWorldMatrix( m ); +} + +void Main::zoomIn() +{ + TQWMatrix m = editor->worldMatrix(); + m.scale( 2.0, 2.0 ); + editor->setWorldMatrix( m ); +} + +void Main::zoomOut() +{ + TQWMatrix m = editor->worldMatrix(); + m.scale( 0.5, 0.5 ); + editor->setWorldMatrix( m ); +} + +void Main::mirror() +{ + TQWMatrix m = editor->worldMatrix(); + m.scale( -1, 1 ); + editor->setWorldMatrix( m ); +} + +void Main::moveL() +{ + TQWMatrix m = editor->worldMatrix(); + m.translate( -16, 0 ); + editor->setWorldMatrix( m ); +} + +void Main::moveR() +{ + TQWMatrix m = editor->worldMatrix(); + m.translate( +16, 0 ); + editor->setWorldMatrix( m ); +} + +void Main::moveU() +{ + TQWMatrix m = editor->worldMatrix(); + m.translate( 0, -16 ); + editor->setWorldMatrix( m ); +} + +void Main::moveD() +{ + TQWMatrix m = editor->worldMatrix(); + m.translate( 0, +16 ); + editor->setWorldMatrix( m ); +} + +void Main::print() +{ + if ( !printer ) printer = new TQPrinter; + if ( printer->setup(this) ) { + TQPainter pp(printer); + canvas.drawArea(TQRect(0,0,canvas.width(),canvas.height()),&pp,FALSE); + } +} + + +void Main::addSprite() +{ + TQCanvasItem* i = new BouncyLogo(&canvas); + i->setZ(rand()%256); + i->show(); +} + +TQString butterfly_fn; +TQString logo_fn; + + +void Main::addButterfly() +{ + if ( butterfly_fn.isEmpty() ) + return; + if ( !butterflyimg ) { + butterflyimg = new TQImage[4]; + butterflyimg[0].load( butterfly_fn ); + butterflyimg[1] = butterflyimg[0].smoothScale( int(butterflyimg[0].width()*0.75), + int(butterflyimg[0].height()*0.75) ); + butterflyimg[2] = butterflyimg[0].smoothScale( int(butterflyimg[0].width()*0.5), + int(butterflyimg[0].height()*0.5) ); + butterflyimg[3] = butterflyimg[0].smoothScale( int(butterflyimg[0].width()*0.25), + int(butterflyimg[0].height()*0.25) ); + } + TQCanvasPolygonalItem* i = new ImageItem(butterflyimg[rand()%4],&canvas); + i->move(rand()%(canvas.width()-butterflyimg->width()), + rand()%(canvas.height()-butterflyimg->height())); + i->setZ(rand()%256+250); + i->show(); +} + +void Main::addLogo() +{ + if ( logo_fn.isEmpty() ) + return; + if ( !logoimg ) { + logoimg = new TQImage[4]; + logoimg[0].load( logo_fn ); + logoimg[1] = logoimg[0].smoothScale( int(logoimg[0].width()*0.75), + int(logoimg[0].height()*0.75) ); + logoimg[2] = logoimg[0].smoothScale( int(logoimg[0].width()*0.5), + int(logoimg[0].height()*0.5) ); + logoimg[3] = logoimg[0].smoothScale( int(logoimg[0].width()*0.25), + int(logoimg[0].height()*0.25) ); + } + TQCanvasPolygonalItem* i = new ImageItem(logoimg[rand()%4],&canvas); + i->move(rand()%(canvas.width()-logoimg->width()), + rand()%(canvas.height()-logoimg->width())); + i->setZ(rand()%256+256); + i->show(); +} + + + +void Main::addCircle() +{ + TQCanvasPolygonalItem* i = new TQCanvasEllipse(50,50,&canvas); + i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) ); + i->move(rand()%canvas.width(),rand()%canvas.height()); + i->setZ(rand()%256); + i->show(); +} + +void Main::addHexagon() +{ + TQCanvasPolygon* i = new TQCanvasPolygon(&canvas); + const int size = canvas.width() / 25; + TQPointArray pa(6); + pa[0] = TQPoint(2*size,0); + pa[1] = TQPoint(size,-size*173/100); + pa[2] = TQPoint(-size,-size*173/100); + pa[3] = TQPoint(-2*size,0); + pa[4] = TQPoint(-size,size*173/100); + pa[5] = TQPoint(size,size*173/100); + i->setPoints(pa); + i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) ); + i->move(rand()%canvas.width(),rand()%canvas.height()); + i->setZ(rand()%256); + i->show(); +} + +void Main::addPolygon() +{ + TQCanvasPolygon* i = new TQCanvasPolygon(&canvas); + const int size = canvas.width()/2; + TQPointArray pa(6); + pa[0] = TQPoint(0,0); + pa[1] = TQPoint(size,size/5); + pa[2] = TQPoint(size*4/5,size); + pa[3] = TQPoint(size/6,size*5/4); + pa[4] = TQPoint(size*3/4,size*3/4); + pa[5] = TQPoint(size*3/4,size/4); + i->setPoints(pa); + i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) ); + i->move(rand()%canvas.width(),rand()%canvas.height()); + i->setZ(rand()%256); + i->show(); +} + +void Main::addSpline() +{ + TQCanvasSpline* i = new TQCanvasSpline(&canvas); + const int size = canvas.width()/6; + TQPointArray pa(12); + pa[0] = TQPoint(0,0); + pa[1] = TQPoint(size/2,0); + pa[2] = TQPoint(size,size/2); + pa[3] = TQPoint(size,size); + pa[4] = TQPoint(size,size*3/2); + pa[5] = TQPoint(size/2,size*2); + pa[6] = TQPoint(0,size*2); + pa[7] = TQPoint(-size/2,size*2); + pa[8] = TQPoint(size/4,size*3/2); + pa[9] = TQPoint(0,size); + pa[10]= TQPoint(-size/4,size/2); + pa[11]= TQPoint(-size/2,0); + i->setControlPoints(pa); + i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) ); + i->move(rand()%canvas.width(),rand()%canvas.height()); + i->setZ(rand()%256); + i->show(); +} + +void Main::addText() +{ + TQCanvasText* i = new TQCanvasText(&canvas); + i->setText("TQCanvasText"); + i->move(rand()%canvas.width(),rand()%canvas.height()); + i->setZ(rand()%256); + i->show(); +} + +void Main::addLine() +{ + TQCanvasLine* i = new TQCanvasLine(&canvas); + i->setPoints( rand()%canvas.width(), rand()%canvas.height(), + rand()%canvas.width(), rand()%canvas.height() ); + i->setPen( TQPen(TQColor(rand()%32*8,rand()%32*8,rand()%32*8), 6) ); + i->setZ(rand()%256); + i->show(); +} + +void Main::addMesh() +{ + int x0 = 0; + int y0 = 0; + + if ( !tb ) tb = new TQBrush( TQt::red ); + if ( !tp ) tp = new TQPen( TQt::black ); + + int nodecount = 0; + + int w = canvas.width(); + int h = canvas.height(); + + const int dist = 30; + int rows = h / dist; + int cols = w / dist; + +#ifndef QT_NO_PROGRESSDIALOG + TQProgressDialog progress( "Creating mesh...", "Abort", rows, + this, "progress", TRUE ); +#endif + + TQMemArray<NodeItem*> lastRow(cols); + for ( int j = 0; j < rows; j++ ) { + int n = j%2 ? cols-1 : cols; + NodeItem *prev = 0; + for ( int i = 0; i < n; i++ ) { + NodeItem *el = new NodeItem( &canvas ); + nodecount++; + int r = rand(); + int xrand = r %20; + int yrand = (r/20) %20; + el->move( xrand + x0 + i*dist + (j%2 ? dist/2 : 0 ), + yrand + y0 + j*dist ); + + if ( j > 0 ) { + if ( i < cols-1 ) + (new EdgeItem( lastRow[i], el, &canvas ))->show(); + if ( j%2 ) + (new EdgeItem( lastRow[i+1], el, &canvas ))->show(); + else if ( i > 0 ) + (new EdgeItem( lastRow[i-1], el, &canvas ))->show(); + } + if ( prev ) { + (new EdgeItem( prev, el, &canvas ))->show(); + } + if ( i > 0 ) lastRow[i-1] = prev; + prev = el; + el->show(); + } + lastRow[n-1]=prev; +#ifndef QT_NO_PROGRESSDIALOG + progress.setProgress( j ); + if ( progress.wasCancelled() ) + break; +#endif + } +#ifndef QT_NO_PROGRESSDIALOG + progress.setProgress( rows ); +#endif + // qDebug( "%d nodes, %d edges", nodecount, EdgeItem::count() ); +} + +void Main::addRectangle() +{ + TQCanvasPolygonalItem *i = new TQCanvasRectangle( rand()%canvas.width(),rand()%canvas.height(), + canvas.width()/5,canvas.width()/5,&canvas); + int z = rand()%256; + i->setBrush( TQColor(z,z,z) ); + i->setPen( TQPen(TQColor(rand()%32*8,rand()%32*8,rand()%32*8), 6) ); + i->setZ(z); + i->show(); +} diff --git a/examples/canvas/canvas.doc b/examples/canvas/canvas.doc new file mode 100644 index 000000000..f6d77ad68 --- /dev/null +++ b/examples/canvas/canvas.doc @@ -0,0 +1,29 @@ +/*! \page canvas-example.html + + \ingroup examples + \title Canvas Example + + This example shows a QCanvas and some \l{QCanvasItem}s in action. + You can do a lot more with QCanvas than we show here, but the + example provides a taste of what can be done. + + <hr> + + Header file: + + \include canvas/canvas.h + + <hr> + + Implementation: + + \include canvas/canvas.cpp + + <hr> + + Main: + + \include canvas/main.cpp +*/ + + diff --git a/examples/canvas/canvas.h b/examples/canvas/canvas.h new file mode 100644 index 000000000..178e5c0c3 --- /dev/null +++ b/examples/canvas/canvas.h @@ -0,0 +1,91 @@ +#ifndef EXAMPLE_H +#define EXAMPLE_H + +#include <qpopupmenu.h> +#include <qmainwindow.h> +#include <qintdict.h> +#include <qcanvas.h> + +class BouncyLogo : public TQCanvasSprite { + void initPos(); + void initSpeed(); +public: + BouncyLogo(TQCanvas*); + void advance(int); + int rtti() const; +}; + + +class FigureEditor : public TQCanvasView { + Q_OBJECT + +public: + FigureEditor(TQCanvas&, TQWidget* parent=0, const char* name=0, WFlags f=0); + void clear(); + +protected: + void contentsMousePressEvent(TQMouseEvent*); + void contentsMouseMoveEvent(TQMouseEvent*); + +signals: + void status(const TQString&); + +private: + TQCanvasItem* moving; + TQPoint moving_start; +}; + +class Main : public TQMainWindow { + Q_OBJECT + +public: + Main(TQCanvas&, TQWidget* parent=0, const char* name=0, WFlags f=0); + ~Main(); + +public slots: + void help(); + +private slots: + void aboutTQt(); + void newView(); + void clear(); + void init(); + + void addSprite(); + void addCircle(); + void addHexagon(); + void addPolygon(); + void addSpline(); + void addText(); + void addLine(); + void addRectangle(); + void addMesh(); + void addLogo(); + void addButterfly(); + + void enlarge(); + void shrink(); + void rotateClockwise(); + void rotateCounterClockwise(); + void zoomIn(); + void zoomOut(); + void mirror(); + void moveL(); + void moveR(); + void moveU(); + void moveD(); + + void print(); + + void toggleDoubleBuffer(); + +private: + TQCanvas& canvas; + FigureEditor *editor; + + TQPopupMenu* options; + TQPrinter* printer; + int dbf_id; +}; + +#endif diff --git a/examples/canvas/canvas.pro b/examples/canvas/canvas.pro new file mode 100644 index 000000000..68c368da1 --- /dev/null +++ b/examples/canvas/canvas.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = canvas + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = canvas full-config + +HEADERS = canvas.h +SOURCES = canvas.cpp main.cpp diff --git a/examples/canvas/main.cpp b/examples/canvas/main.cpp new file mode 100644 index 000000000..3666ae95a --- /dev/null +++ b/examples/canvas/main.cpp @@ -0,0 +1,43 @@ +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qmenubar.h> +#include <qapplication.h> +#include <qimage.h> + +#include "canvas.h" + +#include <stdlib.h> + +extern TQString butterfly_fn; +extern TQString logo_fn; + +int main(int argc, char** argv) +{ + TQApplication app(argc,argv); + + if ( argc > 1 ) + butterfly_fn = argv[1]; + else + butterfly_fn = "butterfly.png"; + + if ( argc > 2 ) + logo_fn = argv[2]; + else + logo_fn = "qtlogo.png"; + + TQCanvas canvas(800,600); + canvas.setAdvancePeriod(30); + Main m(canvas); + m.resize(m.sizeHint()); + m.setCaption("TQt Example - Canvas"); + if ( TQApplication::desktop()->width() > m.width() + 10 + && TQApplication::desktop()->height() > m.height() +30 ) + m.show(); + else + m.showMaximized(); + + TQObject::connect( qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit()) ); + + return app.exec(); +} + diff --git a/examples/canvas/makeimg.cpp b/examples/canvas/makeimg.cpp new file mode 100644 index 000000000..23f3c6acc --- /dev/null +++ b/examples/canvas/makeimg.cpp @@ -0,0 +1,92 @@ +#include <qimage.h> +#include <qcolor.h> + +static inline int blendComponent( int v, int av, int s, int as ) +{ + //shadow gets a color inversely proportional to the + //alpha value + s = (s*(255-as))/255; + //then do standard blending + return as*s + av*v -(av*as*s)/255; +} + +static inline TQRgb blendShade( TQRgb v, TQRgb s ) +{ + //pick a number: shadow is 1/3 of object + int as = qAlpha(s)/3; + int av = qAlpha(v); + if ( as == 0 || av == 255 ) + return v; + + int a = as + av -(as*av)/255; + + + int r = blendComponent( qRed(v),av, qRed(s), as)/a; + int g = blendComponent( qGreen(v),av, qGreen(s), as)/a; + int b = blendComponent( qBlue(v),av, qBlue(s), as)/a; + + return qRgba(r,g,b,a); +} + +int main( int*, char**) +{ + TQImage *img; + + img = new TQImage( "in.png" ); + int w,h; + int y; + img->setAlphaBuffer( TRUE ); + *img = img->convertDepth( 32 ); + w = img->width(); + h = img->height(); +#if 0 + for ( y = 0; y < h; y ++ ) { + uint *line = (uint*)img->scanLine( y ); + for ( int x = 0; x < w; x++ ) { + uint pixel = line[x]; + int r = qRed(pixel); + int g = qGreen(pixel); + int b = qBlue(pixel); + int min = TQMIN( r, TQMIN( g, b ) ); + int max = TQMAX( r, TQMAX( g, b ) ); + r -= min; + g -= min; + b -= min; + if ( max !=min ) { + r = (r*255)/(max-min); + g = (g*255)/(max-min); + b = (b*255)/(max-min); + } + int a = 255-min; + a -= (max-min)/3; //hack more transparency for colors. + line[x] = qRgba( r, g, b, a ); + } + } +#endif + *img = img->smoothScale( w/2, h/2 ); + + qDebug( "saving out.png"); + img->save( "out.png", "PNG" ); + + w = img->width(); + h = img->height(); + + TQImage *img2 = new TQImage( w, h, 32 ); + img2->setAlphaBuffer( TRUE ); + for ( y = 0; y < h; y++ ) { + for ( int x = 0; x < w; x++ ) { + TQRgb shader = img->pixel( x, y ); + + int as = qAlpha(shader)/3; + + int r = (qRed(shader)*(255-as))/255; + int g = (qGreen(shader)*(255-as))/255; + int b = (qBlue(shader)*(255-as))/255; + + img2->setPixel( x, y, qRgba(r,g,b,as) ); + } + } + + img2->save( "outshade.png", "PNG" ); + +} diff --git a/examples/canvas/qt-trans.xpm b/examples/canvas/qt-trans.xpm new file mode 100644 index 000000000..225f684fd --- /dev/null +++ b/examples/canvas/qt-trans.xpm @@ -0,0 +1,54 @@ +/* XPM */ +static char *qtlogo_xpm[] = { +/* width height ncolors chars_per_pixel */ +"54 34 13 1", +/* colors */ +" c #000000", +". c #999999", +"X c #333366", +"o c #6666CC", +"O c #333333", +"@ c #666699", +"# c #000066", +"$ c #666666", +"% c #3333CC", +"& c #000033", +"* c #9999CC", +"= c #333399", +"+ c None", +/* pixels */ +"+++++++++++++++++++.$OOO$.++++++++++++++++++++++++++++", +"+++++++++++++++++$ O.+++++++++++++++++++++++++", +"+++++++++++++++.O $++++++++++++++++++++++++", +"++++++++++++++. $.++.$ O+++++++++++++++++++++++", +"+++++++++++++. O.+++++++$ O++++++++++++++++++++++", +"+++++++++++++O ++++++++++$ $+++++++++++++++++++++", +"++++++++++++$ .+++++++++++O .++++++++++++++++++++", +"+++++++++++. O+++++++++++++ O++++++.+++++++++++++", +"+++++++++++$ .+++++++++++++$ .+++.O +++++++++++++", +"+++++++++++ +++++++++++++++ O+++. +++++++++++++", +"++++++++++. &Xoooo*++++++++++$ +++. +++++++++++++", +"++++++++++@=%%%%%%%%%%*+++++++. .++. +++++++++++++", +"+++++++**oooooo**++*o%%%%o+++++ $++O +++++++++++++", +"+++++*****$OOX@oooo*++*%%%%%*++O $+. OOO$++++++++*", +"++..+.++....$O$+*ooooo*+*o%%%%%O O+$ $$O.++++++**+", +"***+*+++++$$....+++*oooo**+*o%%# O++O ++++++***o*++", +"*+++++++++O $.....++**oooo**+*X &o*O ++++*ooo*++++", +"++++++++++$ O++.....++**oooo*X &%%& ..*o%%*++++++", +"++++++++++$ ++++.....+++**ooO $*o& @oo*+++++++++", +"++++++++++. .++++++.....+++*O Xo*O .++++++++++++", +"+++++++++++ O+++++++++...... .++O +++++++++++++", +"+++++++++++O +++.$$$.++++++. O+++O +++++++++++++", +"+++++++++++. $$OO O.++++O .+++O +++++++++++++", +"++++++++++++O .+++.O $++. O++++O +++++++++++++", +"++++++++++++. O+++++O $+O +++++O +++++++++++++", +"+++++++++++++. O+++++O O .+++++O .++++++++++++", +"++++++++++++++$ .++++O .++++.+$ O+.$.++++++++", +"+++++++++++++++. O$$O .+++++... +++++++++", +"+++++++++++++++++$ O+++++$$+.O O$.+++++++++", +"+++++++++++++++++++$OO O$.O O.++. .++++++++++++++++", +"+++++++++++++++++++++++++++. OO .++++++++++++++++", +"++++++++++++++++++++++++++++. O+++++++++++++++++", +"+++++++++++++++++++++++++++++. .+++++++++++++++++", +"++++++++++++++++++++++++++++++.O O.++++++++++++++++++" +}; diff --git a/examples/canvas/qtlogo.png b/examples/canvas/qtlogo.png Binary files differnew file mode 100644 index 000000000..68cb8bfd1 --- /dev/null +++ b/examples/canvas/qtlogo.png diff --git a/examples/chart/canvastext.h b/examples/chart/canvastext.h new file mode 100644 index 000000000..095aa15f4 --- /dev/null +++ b/examples/chart/canvastext.h @@ -0,0 +1,31 @@ +#ifndef CANVASTEXT_H +#define CANVASTEXT_H + +#include <qcanvas.h> + +class TQFont; + + +class CanvasText : public TQCanvasText +{ +public: + enum { CANVAS_TEXT = 1100 }; + + CanvasText( int index, TQCanvas *canvas ) + : TQCanvasText( canvas ), m_index( index ) {} + CanvasText( int index, const TQString& text, TQCanvas *canvas ) + : TQCanvasText( text, canvas ), m_index( index ) {} + CanvasText( int index, const TQString& text, TQFont font, TQCanvas *canvas ) + : TQCanvasText( text, font, canvas ), m_index( index ) {} + + int index() const { return m_index; } + void setIndex( int index ) { m_index = index; } + + int rtti() const { return CANVAS_TEXT; } + +private: + int m_index; +}; + +#endif + diff --git a/examples/chart/canvasview.cpp b/examples/chart/canvasview.cpp new file mode 100644 index 000000000..17acfe883 --- /dev/null +++ b/examples/chart/canvasview.cpp @@ -0,0 +1,55 @@ +#include "canvasview.h" +#include "chartform.h" + +#include <qcursor.h> +#include <qpoint.h> +#include <qpopupmenu.h> +#include <qstatusbar.h> + + +void CanvasView::contentsContextMenuEvent( TQContextMenuEvent * ) +{ + ((ChartForm*)parent())->optionsMenu->exec( TQCursor::pos() ); +} + + +void CanvasView::viewportResizeEvent( TQResizeEvent *e ) +{ + canvas()->resize( e->size().width(), e->size().height() ); + ((ChartForm*)parent())->drawElements(); +} + + +void CanvasView::contentsMousePressEvent( TQMouseEvent *e ) +{ + TQCanvasItemList list = canvas()->collisions( e->pos() ); + for ( TQCanvasItemList::iterator it = list.begin(); it != list.end(); ++it ) + if ( (*it)->rtti() == CanvasText::CANVAS_TEXT ) { + m_movingItem = *it; + m_pos = e->pos(); + return; + } + m_movingItem = 0; +} + + +void CanvasView::contentsMouseMoveEvent( TQMouseEvent *e ) +{ + if ( m_movingItem ) { + TQPoint offset = e->pos() - m_pos; + m_movingItem->moveBy( offset.x(), offset.y() ); + m_pos = e->pos(); + ChartForm *form = (ChartForm*)parent(); + form->setChanged( TRUE ); + int chartType = form->chartType(); + CanvasText *item = (CanvasText*)m_movingItem; + int i = item->index(); + + (*m_elements)[i].setProX( chartType, item->x() / canvas()->width() ); + (*m_elements)[i].setProY( chartType, item->y() / canvas()->height() ); + + canvas()->update(); + } +} + + diff --git a/examples/chart/canvasview.h b/examples/chart/canvasview.h new file mode 100644 index 000000000..55b5d25c0 --- /dev/null +++ b/examples/chart/canvasview.h @@ -0,0 +1,36 @@ +#ifndef CANVASVIEW_H +#define CANVASVIEW_H + +#include "element.h" +#include "canvastext.h" + +#include <qcanvas.h> + + +class TQPoint; + + +class CanvasView : public TQCanvasView +{ + Q_OBJECT +public: + CanvasView( TQCanvas *canvas, ElementVector *elements, + TQWidget* parent = 0, const char* name = "canvas view", + WFlags f = 0 ) + : TQCanvasView( canvas, parent, name, f ), m_movingItem(0), + m_elements( elements ) {} + +protected: + void viewportResizeEvent( TQResizeEvent *e ); + void contentsMousePressEvent( TQMouseEvent *e ); + void contentsMouseMoveEvent( TQMouseEvent *e ); + void contentsContextMenuEvent( TQContextMenuEvent *e ); + +private: + TQCanvasItem *m_movingItem; + TQPoint m_pos; + ElementVector *m_elements; +}; + + +#endif diff --git a/examples/chart/chart.doc b/examples/chart/chart.doc new file mode 100644 index 000000000..c6c99f267 --- /dev/null +++ b/examples/chart/chart.doc @@ -0,0 +1,41 @@ +/*! + \page canvas-chart-example.html + + \ingroup step-by-step-examples + + \title A Complete Canvas Application + + This is a complete example program with a main window, menus and + toolbars. The main widget is a QCanvas, and this example + demonstrates basic canvas usage. + \omit + This example is the subject of \link tutorial2.html Tutorial + #2\endlink. + \endomit + + <hr> + + Project file: + + \include chart/chart.pro + + <hr> + + Header files: + + \include chart/element.h + \include chart/chartform.h + + <hr> + + Implementation: + + \include chart/chartform.cpp + + <hr> + + Main: + + \include chart/main.cpp + +*/ diff --git a/examples/chart/chart.pro b/examples/chart/chart.pro new file mode 100644 index 000000000..8c791e9ae --- /dev/null +++ b/examples/chart/chart.pro @@ -0,0 +1,20 @@ +TEMPLATE = app + +CONFIG += warn_on + +REQUIRES = full-config + +HEADERS += element.h \ + canvastext.h \ + canvasview.h \ + chartform.h \ + optionsform.h \ + setdataform.h +SOURCES += element.cpp \ + canvasview.cpp \ + chartform.cpp \ + chartform_canvas.cpp \ + chartform_files.cpp \ + optionsform.cpp \ + setdataform.cpp \ + main.cpp diff --git a/examples/chart/chartform.cpp b/examples/chart/chartform.cpp new file mode 100644 index 000000000..4317b8f0b --- /dev/null +++ b/examples/chart/chartform.cpp @@ -0,0 +1,531 @@ +#include "canvasview.h" +#include "chartform.h" +#include "optionsform.h" +#include "setdataform.h" + +#include <qaction.h> +#include <qapplication.h> +#include <qcombobox.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qfont.h> +#include <qfontdialog.h> +#include <qmenubar.h> +#include <qmessagebox.h> +#include <qpixmap.h> +#include <qpopupmenu.h> +#include <qprinter.h> +#include <qradiobutton.h> +#include <qsettings.h> +#include <qspinbox.h> +#include <qstatusbar.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> + +#include "images/file_new.xpm" +#include "images/file_open.xpm" +#include "images/file_save.xpm" +#include "images/file_print.xpm" +#include "images/options_setdata.xpm" +#include "images/options_setfont.xpm" +#include "images/options_setoptions.xpm" +#include "images/options_horizontalbarchart.xpm" +#include "images/options_piechart.xpm" +#include "images/options_verticalbarchart.xpm" + + +const TQString WINDOWS_REGISTRY = "/Trolltech/TQtExamples"; +const TQString APP_KEY = "/Chart/"; + + +ChartForm::ChartForm( const TQString& filename ) + : TQMainWindow( 0, 0, WDestructiveClose ) +{ + setIcon( TQPixmap( options_piechart ) ); + + TQAction *fileNewAction; + TQAction *fileOpenAction; + TQAction *fileSaveAction; + TQAction *fileSaveAsAction; + TQAction *fileSaveAsPixmapAction; + TQAction *filePrintAction; + TQAction *fileQuitAction; + TQAction *optionsSetDataAction; + TQAction *optionsSetFontAction; + TQAction *optionsSetOptionsAction; + + fileNewAction = new TQAction( + "New Chart", TQPixmap( file_new ), + "&New", CTRL+Key_N, this, "new" ); + connect( fileNewAction, SIGNAL( activated() ), this, SLOT( fileNew() ) ); + + fileOpenAction = new TQAction( + "Open Chart", TQPixmap( file_open ), + "&Open...", CTRL+Key_O, this, "open" ); + connect( fileOpenAction, SIGNAL( activated() ), this, SLOT( fileOpen() ) ); + + fileSaveAction = new TQAction( + "Save Chart", TQPixmap( file_save ), + "&Save", CTRL+Key_S, this, "save" ); + connect( fileSaveAction, SIGNAL( activated() ), this, SLOT( fileSave() ) ); + + fileSaveAsAction = new TQAction( + "Save Chart As", TQPixmap( file_save ), + "Save &As...", 0, this, "save as" ); + connect( fileSaveAsAction, SIGNAL( activated() ), + this, SLOT( fileSaveAs() ) ); + + fileSaveAsPixmapAction = new TQAction( + "Save Chart As Bitmap", TQPixmap( file_save ), + "Save As &Bitmap...", CTRL+Key_B, this, "save as bitmap" ); + connect( fileSaveAsPixmapAction, SIGNAL( activated() ), + this, SLOT( fileSaveAsPixmap() ) ); + + filePrintAction = new TQAction( + "Print Chart", TQPixmap( file_print ), + "&Print Chart...", CTRL+Key_P, this, "print chart" ); + connect( filePrintAction, SIGNAL( activated() ), + this, SLOT( filePrint() ) ); + + optionsSetDataAction = new TQAction( + "Set Data", TQPixmap( options_setdata ), + "Set &Data...", CTRL+Key_D, this, "set data" ); + connect( optionsSetDataAction, SIGNAL( activated() ), + this, SLOT( optionsSetData() ) ); + + + TQActionGroup *chartGroup = new TQActionGroup( this ); // Connected later + chartGroup->setExclusive( TRUE ); + + optionsPieChartAction = new TQAction( + "Pie Chart", TQPixmap( options_piechart ), + "&Pie Chart", CTRL+Key_I, chartGroup, "pie chart" ); + optionsPieChartAction->setToggleAction( TRUE ); + + optionsHorizontalBarChartAction = new TQAction( + "Horizontal Bar Chart", TQPixmap( options_horizontalbarchart ), + "&Horizontal Bar Chart", CTRL+Key_H, chartGroup, + "horizontal bar chart" ); + optionsHorizontalBarChartAction->setToggleAction( TRUE ); + + optionsVerticalBarChartAction = new TQAction( + "Vertical Bar Chart", TQPixmap( options_verticalbarchart ), + "&Vertical Bar Chart", CTRL+Key_V, chartGroup, "Vertical bar chart" ); + optionsVerticalBarChartAction->setToggleAction( TRUE ); + + + optionsSetFontAction = new TQAction( + "Set Font", TQPixmap( options_setfont ), + "Set &Font...", CTRL+Key_F, this, "set font" ); + connect( optionsSetFontAction, SIGNAL( activated() ), + this, SLOT( optionsSetFont() ) ); + + optionsSetOptionsAction = new TQAction( + "Set Options", TQPixmap( options_setoptions ), + "Set &Options...", 0, this, "set options" ); + connect( optionsSetOptionsAction, SIGNAL( activated() ), + this, SLOT( optionsSetOptions() ) ); + + fileQuitAction = new TQAction( "Quit", "&Quit", CTRL+Key_Q, this, "tquit" ); + connect( fileQuitAction, SIGNAL( activated() ), this, SLOT( fileQuit() ) ); + + + TQToolBar* fileTools = new TQToolBar( this, "file operations" ); + fileTools->setLabel( "File Operations" ); + fileNewAction->addTo( fileTools ); + fileOpenAction->addTo( fileTools ); + fileSaveAction->addTo( fileTools ); + fileTools->addSeparator(); + filePrintAction->addTo( fileTools ); + + TQToolBar *optionsTools = new TQToolBar( this, "options operations" ); + optionsTools->setLabel( "Options Operations" ); + optionsSetDataAction->addTo( optionsTools ); + optionsTools->addSeparator(); + optionsPieChartAction->addTo( optionsTools ); + optionsHorizontalBarChartAction->addTo( optionsTools ); + optionsVerticalBarChartAction->addTo( optionsTools ); + optionsTools->addSeparator(); + optionsSetFontAction->addTo( optionsTools ); + optionsTools->addSeparator(); + optionsSetOptionsAction->addTo( optionsTools ); + + fileMenu = new TQPopupMenu( this ); + menuBar()->insertItem( "&File", fileMenu ); + fileNewAction->addTo( fileMenu ); + fileOpenAction->addTo( fileMenu ); + fileSaveAction->addTo( fileMenu ); + fileSaveAsAction->addTo( fileMenu ); + fileMenu->insertSeparator(); + fileSaveAsPixmapAction->addTo( fileMenu ); + fileMenu->insertSeparator(); + filePrintAction->addTo( fileMenu ); + fileMenu->insertSeparator(); + fileQuitAction->addTo( fileMenu ); + + optionsMenu = new TQPopupMenu( this ); + menuBar()->insertItem( "&Options", optionsMenu ); + optionsSetDataAction->addTo( optionsMenu ); + optionsMenu->insertSeparator(); + optionsPieChartAction->addTo( optionsMenu ); + optionsHorizontalBarChartAction->addTo( optionsMenu ); + optionsVerticalBarChartAction->addTo( optionsMenu ); + optionsMenu->insertSeparator(); + optionsSetFontAction->addTo( optionsMenu ); + optionsMenu->insertSeparator(); + optionsSetOptionsAction->addTo( optionsMenu ); + + menuBar()->insertSeparator(); + + TQPopupMenu *helpMenu = new TQPopupMenu( this ); + menuBar()->insertItem( "&Help", helpMenu ); + helpMenu->insertItem( "&Help", this, SLOT(helpHelp()), Key_F1 ); + helpMenu->insertItem( "&About", this, SLOT(helpAbout()) ); + helpMenu->insertItem( "About &TQt", this, SLOT(helpAboutTQt()) ); + + + m_printer = 0; + m_elements.resize( MAX_ELEMENTS ); + + TQSettings settings; + settings.insertSearchPath( TQSettings::Windows, WINDOWS_REGISTRY ); + int windowWidth = settings.readNumEntry( APP_KEY + "WindowWidth", 460 ); + int windowHeight = settings.readNumEntry( APP_KEY + "WindowHeight", 530 ); + int windowX = settings.readNumEntry( APP_KEY + "WindowX", -1 ); + int windowY = settings.readNumEntry( APP_KEY + "WindowY", -1 ); + setChartType( ChartType( + settings.readNumEntry( APP_KEY + "ChartType", int(PIE) ) ) ); + m_addValues = AddValuesType( + settings.readNumEntry( APP_KEY + "AddValues", int(NO) )); + m_decimalPlaces = settings.readNumEntry( APP_KEY + "Decimals", 2 ); + m_font = TQFont( "Helvetica", 18, TQFont::Bold ); + m_font.fromString( + settings.readEntry( APP_KEY + "Font", m_font.toString() ) ); + for ( int i = 0; i < MAX_RECENTFILES; ++i ) { + TQString filename = settings.readEntry( APP_KEY + "File" + + TQString::number( i + 1 ) ); + if ( !filename.isEmpty() ) + m_recentFiles.push_back( filename ); + } + if ( m_recentFiles.count() ) + updateRecentFilesMenu(); + + + // Connect *after* we've set the chart type on so we don't call + // drawElements() prematurely. + connect( chartGroup, SIGNAL( selected(TQAction*) ), + this, SLOT( updateChartType(TQAction*) ) ); + + resize( windowWidth, windowHeight ); + if ( windowX != -1 || windowY != -1 ) + move( windowX, windowY ); + + m_canvas = new TQCanvas( this ); + m_canvas->resize( width(), height() ); + m_canvasView = new CanvasView( m_canvas, &m_elements, this ); + setCentralWidget( m_canvasView ); + m_canvasView->show(); + + if ( !filename.isEmpty() ) + load( filename ); + else { + init(); + m_elements[0].set( 20, red, 14, "Red" ); + m_elements[1].set( 70, cyan, 2, "Cyan", darkGreen ); + m_elements[2].set( 35, blue, 11, "Blue" ); + m_elements[3].set( 55, yellow, 1, "Yellow", darkBlue ); + m_elements[4].set( 80, magenta, 1, "Magenta" ); + drawElements(); + } + + statusBar()->message( "Ready", 2000 ); +} + + +ChartForm::~ChartForm() +{ + delete m_printer; +} + + +void ChartForm::init() +{ + setCaption( "Chart" ); + m_filename = TQString::null; + m_changed = FALSE; + + m_elements[0] = Element( Element::INVALID, red ); + m_elements[1] = Element( Element::INVALID, cyan ); + m_elements[2] = Element( Element::INVALID, blue ); + m_elements[3] = Element( Element::INVALID, yellow ); + m_elements[4] = Element( Element::INVALID, green ); + m_elements[5] = Element( Element::INVALID, magenta ); + m_elements[6] = Element( Element::INVALID, darkYellow ); + m_elements[7] = Element( Element::INVALID, darkRed ); + m_elements[8] = Element( Element::INVALID, darkCyan ); + m_elements[9] = Element( Element::INVALID, darkGreen ); + m_elements[10] = Element( Element::INVALID, darkMagenta ); + m_elements[11] = Element( Element::INVALID, darkBlue ); + for ( int i = 12; i < MAX_ELEMENTS; ++i ) { + double x = (double(i) / MAX_ELEMENTS) * 360; + int y = (int(x * 256) % 105) + 151; + int z = ((i * 17) % 105) + 151; + m_elements[i] = Element( Element::INVALID, TQColor( int(x), y, z, TQColor::Hsv ) ); + } +} + +void ChartForm::closeEvent( TQCloseEvent * ) +{ + fileQuit(); +} + + +void ChartForm::fileNew() +{ + if ( okToClear() ) { + init(); + drawElements(); + } +} + + +void ChartForm::fileOpen() +{ + if ( !okToClear() ) + return; + + TQString filename = TQFileDialog::getOpenFileName( + TQString::null, "Charts (*.cht)", this, + "file open", "Chart -- File Open" ); + if ( !filename.isEmpty() ) + load( filename ); + else + statusBar()->message( "File Open abandoned", 2000 ); +} + + +void ChartForm::fileSaveAs() +{ + TQString filename = TQFileDialog::getSaveFileName( + TQString::null, "Charts (*.cht)", this, + "file save as", "Chart -- File Save As" ); + if ( !filename.isEmpty() ) { + int answer = 0; + if ( TQFile::exists( filename ) ) + answer = TQMessageBox::warning( + this, "Chart -- Overwrite File", + TQString( "Overwrite\n\'%1\'?" ). + arg( filename ), + "&Yes", "&No", TQString::null, 1, 1 ); + if ( answer == 0 ) { + m_filename = filename; + updateRecentFiles( filename ); + fileSave(); + return; + } + } + statusBar()->message( "Saving abandoned", 2000 ); +} + + +void ChartForm::fileOpenRecent( int index ) +{ + if ( !okToClear() ) + return; + + load( m_recentFiles[index] ); +} + + +void ChartForm::updateRecentFiles( const TQString& filename ) +{ + if ( m_recentFiles.find( filename ) != m_recentFiles.end() ) + return; + + m_recentFiles.push_back( filename ); + if ( m_recentFiles.count() > MAX_RECENTFILES ) + m_recentFiles.pop_front(); + + updateRecentFilesMenu(); +} + + +void ChartForm::updateRecentFilesMenu() +{ + for ( int i = 0; i < MAX_RECENTFILES; ++i ) { + if ( fileMenu->findItem( i ) ) + fileMenu->removeItem( i ); + if ( i < int(m_recentFiles.count()) ) + fileMenu->insertItem( TQString( "&%1 %2" ). + arg( i + 1 ).arg( m_recentFiles[i] ), + this, SLOT( fileOpenRecent(int) ), + 0, i ); + } +} + + +void ChartForm::fileQuit() +{ + if ( okToClear() ) { + saveOptions(); + qApp->exit( 0 ); + } +} + + +bool ChartForm::okToClear() +{ + if ( m_changed ) { + TQString msg; + if ( m_filename.isEmpty() ) + msg = "Unnamed chart "; + else + msg = TQString( "Chart '%1'\n" ).arg( m_filename ); + msg += "has been changed."; + + int x = TQMessageBox::information( this, "Chart -- Unsaved Changes", + msg, "&Save", "Cancel", "&Abandon", + 0, 1 ); + switch( x ) { + case 0: // Save + fileSave(); + break; + case 1: // Cancel + default: + return FALSE; + case 2: // Abandon + break; + } + } + + return TRUE; +} + + +void ChartForm::saveOptions() +{ + TQSettings settings; + settings.insertSearchPath( TQSettings::Windows, WINDOWS_REGISTRY ); + settings.writeEntry( APP_KEY + "WindowWidth", width() ); + settings.writeEntry( APP_KEY + "WindowHeight", height() ); + settings.writeEntry( APP_KEY + "WindowX", x() ); + settings.writeEntry( APP_KEY + "WindowY", y() ); + settings.writeEntry( APP_KEY + "ChartType", int(m_chartType) ); + settings.writeEntry( APP_KEY + "AddValues", int(m_addValues) ); + settings.writeEntry( APP_KEY + "Decimals", m_decimalPlaces ); + settings.writeEntry( APP_KEY + "Font", m_font.toString() ); + for ( int i = 0; i < int(m_recentFiles.count()); ++i ) + settings.writeEntry( APP_KEY + "File" + TQString::number( i + 1 ), + m_recentFiles[i] ); +} + + +void ChartForm::optionsSetData() +{ + SetDataForm *setDataForm = new SetDataForm( &m_elements, m_decimalPlaces, this ); + if ( setDataForm->exec() ) { + m_changed = TRUE; + drawElements(); + } + delete setDataForm; +} + + +void ChartForm::setChartType( ChartType chartType ) +{ + m_chartType = chartType; + switch ( m_chartType ) { + case PIE: + optionsPieChartAction->setOn( TRUE ); + break; + case VERTICAL_BAR: + optionsVerticalBarChartAction->setOn( TRUE ); + break; + case HORIZONTAL_BAR: + optionsHorizontalBarChartAction->setOn( TRUE ); + break; + } +} + + +void ChartForm::updateChartType( TQAction *action ) +{ + if ( action == optionsPieChartAction ) { + m_chartType = PIE; + } + else if ( action == optionsHorizontalBarChartAction ) { + m_chartType = HORIZONTAL_BAR; + } + else if ( action == optionsVerticalBarChartAction ) { + m_chartType = VERTICAL_BAR; + } + + drawElements(); +} + + +void ChartForm::optionsSetFont() +{ + bool ok; + TQFont font = TQFontDialog::getFont( &ok, m_font, this ); + if ( ok ) { + m_font = font; + drawElements(); + } +} + + +void ChartForm::optionsSetOptions() +{ + OptionsForm *optionsForm = new OptionsForm( this ); + optionsForm->chartTypeComboBox->setCurrentItem( m_chartType ); + optionsForm->setFont( m_font ); + switch ( m_addValues ) { + case NO: + optionsForm->noRadioButton->setChecked( TRUE ); + break; + case YES: + optionsForm->yesRadioButton->setChecked( TRUE ); + break; + case AS_PERCENTAGE: + optionsForm->asPercentageRadioButton->setChecked( TRUE ); + break; + } + optionsForm->decimalPlacesSpinBox->setValue( m_decimalPlaces ); + if ( optionsForm->exec() ) { + setChartType( ChartType( + optionsForm->chartTypeComboBox->currentItem()) ); + m_font = optionsForm->font(); + if ( optionsForm->noRadioButton->isChecked() ) + m_addValues = NO; + else if ( optionsForm->yesRadioButton->isChecked() ) + m_addValues = YES; + else if ( optionsForm->asPercentageRadioButton->isChecked() ) + m_addValues = AS_PERCENTAGE; + m_decimalPlaces = optionsForm->decimalPlacesSpinBox->value(); + drawElements(); + } + delete optionsForm; +} + + +void ChartForm::helpHelp() +{ + statusBar()->message( "Help is not implemented yet", 2000 ); +} + + +void ChartForm::helpAbout() +{ + TQMessageBox::about( this, "Chart -- About", + "<center><h1><font color=blue>Chart<font></h1></center>" + "<p>Chart your data with <i>chart</i>.</p>" + ); +} + + +void ChartForm::helpAboutTQt() +{ + TQMessageBox::aboutTQt( this, "Chart -- About TQt" ); +} + diff --git a/examples/chart/chartform.h b/examples/chart/chartform.h new file mode 100644 index 000000000..7fdeea641 --- /dev/null +++ b/examples/chart/chartform.h @@ -0,0 +1,90 @@ +#ifndef CHARTFORM_H +#define CHARTFORM_H + +#include "element.h" + +#include <qmainwindow.h> +#include <qstringlist.h> + + +class CanvasView; + +class TQAction; +class TQCanvas; +class TQFont; +class TQPrinter; +class TQString; + + +class ChartForm: public TQMainWindow +{ + Q_OBJECT +public: + enum { MAX_ELEMENTS = 100 }; + enum { MAX_RECENTFILES = 9 }; // Must not exceed 9 + enum ChartType { PIE, VERTICAL_BAR, HORIZONTAL_BAR }; + enum AddValuesType { NO, YES, AS_PERCENTAGE }; + + ChartForm( const TQString& filename ); + ~ChartForm(); + + int chartType() { return m_chartType; } + void setChanged( bool changed = TRUE ) { m_changed = changed; } + void drawElements(); + + TQPopupMenu *optionsMenu; // Why public? See canvasview.cpp + +protected: + virtual void closeEvent( TQCloseEvent * ); + +private slots: + void fileNew(); + void fileOpen(); + void fileOpenRecent( int index ); + void fileSave(); + void fileSaveAs(); + void fileSaveAsPixmap(); + void filePrint(); + void fileQuit(); + void optionsSetData(); + void updateChartType( TQAction *action ); + void optionsSetFont(); + void optionsSetOptions(); + void helpHelp(); + void helpAbout(); + void helpAboutTQt(); + void saveOptions(); + +private: + void init(); + void load( const TQString& filename ); + bool okToClear(); + void drawPieChart( const double scales[], double total, int count ); + void drawVerticalBarChart( const double scales[], double total, int count ); + void drawHorizontalBarChart( const double scales[], double total, int count ); + + TQString valueLabel( const TQString& label, double value, double total ); + void updateRecentFiles( const TQString& filename ); + void updateRecentFilesMenu(); + void setChartType( ChartType chartType ); + + TQPopupMenu *fileMenu; + TQAction *optionsPieChartAction; + TQAction *optionsHorizontalBarChartAction; + TQAction *optionsVerticalBarChartAction; + + + TQString m_filename; + TQStringList m_recentFiles; + TQCanvas *m_canvas; + CanvasView *m_canvasView; + bool m_changed; + ElementVector m_elements; + TQPrinter *m_printer; + ChartType m_chartType; + AddValuesType m_addValues; + int m_decimalPlaces; + TQFont m_font; +}; + +#endif diff --git a/examples/chart/chartform_canvas.cpp b/examples/chart/chartform_canvas.cpp new file mode 100644 index 000000000..842c04e6f --- /dev/null +++ b/examples/chart/chartform_canvas.cpp @@ -0,0 +1,226 @@ +#include "canvastext.h" +#include "chartform.h" + +#include <qbrush.h> +#include <qcanvas.h> + +#include <math.h> // sin, cos + +#ifndef M_PI +#define M_PI 3.1415 +#endif + +void ChartForm::drawElements() +{ + TQCanvasItemList list = m_canvas->allItems(); + for ( TQCanvasItemList::iterator it = list.begin(); it != list.end(); ++it ) + delete *it; + + // 360 * 16 for pies; TQt works with 16ths of degrees + int scaleFactor = m_chartType == PIE ? 5760 : + m_chartType == VERTICAL_BAR ? m_canvas->height() : + m_canvas->width(); + double biggest = 0.0; + int count = 0; + double total = 0.0; + static double scales[MAX_ELEMENTS]; + + for ( int i = 0; i < MAX_ELEMENTS; ++i ) { + if ( m_elements[i].isValid() ) { + double value = m_elements[i].value(); + count++; + total += value; + if ( value > biggest ) + biggest = value; + scales[i] = m_elements[i].value() * scaleFactor; + } + } + + if ( count ) { + // 2nd loop because of total and biggest + for ( int i = 0; i < MAX_ELEMENTS; ++i ) + if ( m_elements[i].isValid() ) + if ( m_chartType == PIE ) + scales[i] = (m_elements[i].value() * scaleFactor) / total; + else + scales[i] = (m_elements[i].value() * scaleFactor) / biggest; + + switch ( m_chartType ) { + case PIE: + drawPieChart( scales, total, count ); + break; + case VERTICAL_BAR: + drawVerticalBarChart( scales, total, count ); + break; + case HORIZONTAL_BAR: + drawHorizontalBarChart( scales, total, count ); + break; + } + } + + m_canvas->update(); +} + + +void ChartForm::drawPieChart( const double scales[], double total, int ) +{ + double width = m_canvas->width(); + double height = m_canvas->height(); + int size = int(width > height ? height : width); + int x = int(width / 2); + int y = int(height / 2); + int angle = 0; + + for ( int i = 0; i < MAX_ELEMENTS; ++i ) { + if ( m_elements[i].isValid() ) { + int extent = int(scales[i]); + TQCanvasEllipse *arc = new TQCanvasEllipse( + size, size, angle, extent, m_canvas ); + arc->setX( x ); + arc->setY( y ); + arc->setZ( 0 ); + arc->setBrush( TQBrush( m_elements[i].valueColor(), + BrushStyle(m_elements[i].valuePattern()) ) ); + arc->show(); + angle += extent; + TQString label = m_elements[i].label(); + if ( !label.isEmpty() || m_addValues != NO ) { + label = valueLabel( label, m_elements[i].value(), total ); + CanvasText *text = new CanvasText( i, label, m_font, m_canvas ); + double proX = m_elements[i].proX( PIE ); + double proY = m_elements[i].proY( PIE ); + if ( proX < 0 || proY < 0 ) { + // Find the centre of the pie segment + TQRect rect = arc->boundingRect(); + proX = ( rect.width() / 2 ) + rect.x(); + proY = ( rect.height() / 2 ) + rect.y(); + // Centre text over the centre of the pie segment + rect = text->boundingRect(); + proX -= ( rect.width() / 2 ); + proY -= ( rect.height() / 2 ); + // Make proportional + proX /= width; + proY /= height; + } + text->setColor( m_elements[i].labelColor() ); + text->setX( proX * width ); + text->setY( proY * height ); + text->setZ( 1 ); + text->show(); + m_elements[i].setProX( PIE, proX ); + m_elements[i].setProY( PIE, proY ); + } + } + } +} + + +void ChartForm::drawVerticalBarChart( + const double scales[], double total, int count ) +{ + double width = m_canvas->width(); + double height = m_canvas->height(); + int prowidth = int(width / count); + int x = 0; + TQPen pen; + pen.setStyle( NoPen ); + + for ( int i = 0; i < MAX_ELEMENTS; ++i ) { + if ( m_elements[i].isValid() ) { + int extent = int(scales[i]); + int y = int(height - extent); + TQCanvasRectangle *rect = new TQCanvasRectangle( + x, y, prowidth, extent, m_canvas ); + rect->setBrush( TQBrush( m_elements[i].valueColor(), + BrushStyle(m_elements[i].valuePattern()) ) ); + rect->setPen( pen ); + rect->setZ( 0 ); + rect->show(); + TQString label = m_elements[i].label(); + if ( !label.isEmpty() || m_addValues != NO ) { + double proX = m_elements[i].proX( VERTICAL_BAR ); + double proY = m_elements[i].proY( VERTICAL_BAR ); + if ( proX < 0 || proY < 0 ) { + proX = x / width; + proY = y / height; + } + label = valueLabel( label, m_elements[i].value(), total ); + CanvasText *text = new CanvasText( i, label, m_font, m_canvas ); + text->setColor( m_elements[i].labelColor() ); + text->setX( proX * width ); + text->setY( proY * height ); + text->setZ( 1 ); + text->show(); + m_elements[i].setProX( VERTICAL_BAR, proX ); + m_elements[i].setProY( VERTICAL_BAR, proY ); + } + x += prowidth; + } + } +} + + +void ChartForm::drawHorizontalBarChart( + const double scales[], double total, int count ) +{ + double width = m_canvas->width(); + double height = m_canvas->height(); + int proheight = int(height / count); + int y = 0; + TQPen pen; + pen.setStyle( NoPen ); + + for ( int i = 0; i < MAX_ELEMENTS; ++i ) { + if ( m_elements[i].isValid() ) { + int extent = int(scales[i]); + TQCanvasRectangle *rect = new TQCanvasRectangle( + 0, y, extent, proheight, m_canvas ); + rect->setBrush( TQBrush( m_elements[i].valueColor(), + BrushStyle(m_elements[i].valuePattern()) ) ); + rect->setPen( pen ); + rect->setZ( 0 ); + rect->show(); + TQString label = m_elements[i].label(); + if ( !label.isEmpty() || m_addValues != NO ) { + double proX = m_elements[i].proX( HORIZONTAL_BAR ); + double proY = m_elements[i].proY( HORIZONTAL_BAR ); + if ( proX < 0 || proY < 0 ) { + proX = 0; + proY = y / height; + } + label = valueLabel( label, m_elements[i].value(), total ); + CanvasText *text = new CanvasText( i, label, m_font, m_canvas ); + text->setColor( m_elements[i].labelColor() ); + text->setX( proX * width ); + text->setY( proY * height ); + text->setZ( 1 ); + text->show(); + m_elements[i].setProX( HORIZONTAL_BAR, proX ); + m_elements[i].setProY( HORIZONTAL_BAR, proY ); + } + y += proheight; + } + } +} + + +TQString ChartForm::valueLabel( + const TQString& label, double value, double total ) +{ + if ( m_addValues == NO ) + return label; + + TQString newLabel = label; + if ( !label.isEmpty() ) + if ( m_chartType == VERTICAL_BAR ) + newLabel += '\n'; + else + newLabel += ' '; + if ( m_addValues == YES ) + newLabel += TQString::number( value, 'f', m_decimalPlaces ); + else if ( m_addValues == AS_PERCENTAGE ) + newLabel += TQString::number( (value / total) * 100, 'f', m_decimalPlaces ) + + '%'; + return newLabel; +} + diff --git a/examples/chart/chartform_files.cpp b/examples/chart/chartform_files.cpp new file mode 100644 index 000000000..742dbeaa1 --- /dev/null +++ b/examples/chart/chartform_files.cpp @@ -0,0 +1,113 @@ +#include "canvasview.h" +#include "chartform.h" + +#include <qfile.h> +#include <qfiledialog.h> +#include <qpainter.h> +#include <qprinter.h> +#include <qstatusbar.h> + + +void ChartForm::load( const TQString& filename ) +{ + TQFile file( filename ); + if ( !file.open( IO_ReadOnly ) ) { + statusBar()->message( TQString( "Failed to load \'%1\'" ). + arg( filename ), 2000 ); + return; + } + + init(); // Make sure we have colours + m_filename = filename; + TQTextStream ts( &file ); + Element element; + int errors = 0; + int i = 0; + while ( !ts.eof() ) { + ts >> element; + if ( element.isValid() ) + m_elements[i++] = element; + else + errors++; + if ( i == MAX_ELEMENTS ) { + statusBar()->message( + TQString( "Read maximum number of elements (%1)" + " discarding others" ).arg( i ), 2000 ); + break; + } + } + + file.close(); + + TQString bad = ""; + if ( errors ) { + bad = TQString( "; skipped " ) + TQString::number( errors ) + " bad record"; + if ( errors > 1 ) + bad += "s"; + } + statusBar()->message( TQString( "Read %1 values from \'%2\'%3" ). + arg( i ).arg( filename ).arg( bad ), 3000 ); + + setCaption( TQString( "Chart -- %1" ).arg( filename ) ); + updateRecentFiles( filename ); + + drawElements(); + m_changed = FALSE; +} + + +void ChartForm::fileSave() +{ + if ( m_filename.isEmpty() ) { + fileSaveAs(); + return; + } + + TQFile file( m_filename ); + if ( !file.open( IO_WriteOnly ) ) { + statusBar()->message( TQString( "Failed to save \'%1\'" ). + arg( m_filename ), 2000 ); + return; + } + TQTextStream ts( &file ); + for ( int i = 0; i < MAX_ELEMENTS; ++i ) + if ( m_elements[i].isValid() ) + ts << m_elements[i]; + + file.close(); + + setCaption( TQString( "Chart -- %1" ).arg( m_filename ) ); + statusBar()->message( TQString( "Saved \'%1\'" ).arg( m_filename ), 2000 ); + m_changed = FALSE; +} + + +void ChartForm::fileSaveAsPixmap() +{ + TQString filename = TQFileDialog::getSaveFileName( + TQString::null, "Images (*.png *.xpm *.jpg)", + this, "file save as bitmap", + "Chart -- File Save As Bitmap" ); + if ( TQPixmap::grabWidget( m_canvasView ). + save( filename, + filename.mid( filename.findRev( '.' ) + 1 ).upper() ) ) + statusBar()->message( TQString( "Wrote \'%1\'" ).arg( filename ), 2000 ); + else + statusBar()->message( TQString( "Failed to write \'%1\'" ). + arg( filename ), 2000 ); +} + +void ChartForm::filePrint() +{ + if ( !m_printer ) + m_printer = new TQPrinter; + if ( m_printer->setup() ) { + TQPainter painter( m_printer ); + m_canvas->drawArea( TQRect( 0, 0, m_canvas->width(), m_canvas->height() ), + &painter, FALSE ); + if ( !m_printer->outputFileName().isEmpty() ) + statusBar()->message( TQString( "Printed \'%1\'" ). + arg( m_printer->outputFileName() ), 2000 ); + } +} + diff --git a/examples/chart/element.cpp b/examples/chart/element.cpp new file mode 100644 index 000000000..570fccce8 --- /dev/null +++ b/examples/chart/element.cpp @@ -0,0 +1,127 @@ +#include "element.h" + +#include <qstringlist.h> +#include <qtextstream.h> + +const char FIELD_SEP = ':'; +const char PROPOINT_SEP = ';'; +const char XY_SEP = ','; + + +void Element::init( double value, TQColor valueColor, int valuePattern, + const TQString& label, TQColor labelColor ) +{ + m_value = value; + m_valueColor = valueColor; + if ( valuePattern < TQt::SolidPattern || valuePattern > TQt::DiagCrossPattern ) + valuePattern = TQt::SolidPattern; + m_valuePattern = valuePattern; + m_label = label; + m_labelColor = labelColor; +} + + +void Element::setValuePattern( int valuePattern ) +{ + if ( valuePattern < TQt::SolidPattern || valuePattern > TQt::DiagCrossPattern ) + valuePattern = TQt::SolidPattern; + m_valuePattern = valuePattern; +} + + +double Element::proX( int index ) const +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + return m_propoints[2 * index]; +} + + +double Element::proY( int index ) const +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + return m_propoints[(2 * index) + 1]; +} + + +void Element::setProX( int index, double value ) +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + m_propoints[2 * index] = value; +} + + +void Element::setProY( int index, double value ) +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + m_propoints[(2 * index) + 1] = value; +} + + +TQTextStream &operator<<( TQTextStream &s, const Element &element ) +{ + s << element.value() << FIELD_SEP + << element.valueColor().name() << FIELD_SEP + << element.valuePattern() << FIELD_SEP + << element.labelColor().name() << FIELD_SEP; + + for ( int i = 0; i < Element::MAX_PROPOINTS; ++i ) { + s << element.proX( i ) << XY_SEP << element.proY( i ); + s << ( i == Element::MAX_PROPOINTS - 1 ? FIELD_SEP : PROPOINT_SEP ); + } + + s << element.label() << '\n'; + + return s; +} + + +TQTextStream &operator>>( TQTextStream &s, Element &element ) +{ + TQString data = s.readLine(); + element.setValue( Element::INVALID ); + + int errors = 0; + bool ok; + + TQStringList fields = TQStringList::split( FIELD_SEP, data ); + if ( fields.count() >= 4 ) { + double value = fields[0].toDouble( &ok ); + if ( !ok ) + errors++; + TQColor valueColor = TQColor( fields[1] ); + if ( !valueColor.isValid() ) + errors++; + int valuePattern = fields[2].toInt( &ok ); + if ( !ok ) + errors++; + TQColor labelColor = TQColor( fields[3] ); + if ( !labelColor.isValid() ) + errors++; + TQStringList propoints = TQStringList::split( PROPOINT_SEP, fields[4] ); + TQString label = data.section( FIELD_SEP, 5 ); + + if ( !errors ) { + element.set( value, valueColor, valuePattern, label, labelColor ); + int i = 0; + for ( TQStringList::iterator point = propoints.begin(); + i < Element::MAX_PROPOINTS && point != propoints.end(); + ++i, ++point ) { + errors = 0; + TQStringList xy = TQStringList::split( XY_SEP, *point ); + double x = xy[0].toDouble( &ok ); + if ( !ok || x <= 0.0 || x >= 1.0 ) + errors++; + double y = xy[1].toDouble( &ok ); + if ( !ok || y <= 0.0 || y >= 1.0 ) + errors++; + if ( errors ) + x = y = Element::NO_PROPORTION; + element.setProX( i, x ); + element.setProY( i, y ); + } + } + } + + return s; +} + diff --git a/examples/chart/element.h b/examples/chart/element.h new file mode 100644 index 000000000..a166d207a --- /dev/null +++ b/examples/chart/element.h @@ -0,0 +1,84 @@ +#ifndef ELEMENT_H +#define ELEMENT_H + +#include <qcolor.h> +#include <qnamespace.h> +#include <qstring.h> +#include <qvaluevector.h> + +class Element; + +typedef TQValueVector<Element> ElementVector; + +/* + Elements are valid if they have a value which is > EPSILON. +*/ +const double EPSILON = 0.0000001; // Must be > INVALID. + + +class Element +{ +public: + enum { INVALID = -1 }; + enum { NO_PROPORTION = -1 }; + enum { MAX_PROPOINTS = 3 }; // One proportional point per chart type + + Element( double value = INVALID, TQColor valueColor = TQt::gray, + int valuePattern = TQt::SolidPattern, + const TQString& label = TQString::null, + TQColor labelColor = TQt::black ) { + init( value, valueColor, valuePattern, label, labelColor ); + for ( int i = 0; i < MAX_PROPOINTS * 2; ++i ) + m_propoints[i] = NO_PROPORTION; + } + ~Element() {} + + bool isValid() const { return m_value > EPSILON; } + + double value() const { return m_value; } + TQColor valueColor() const { return m_valueColor; } + int valuePattern() const { return m_valuePattern; } + TQString label() const { return m_label; } + TQColor labelColor() const { return m_labelColor; } + double proX( int index ) const; + double proY( int index ) const; + + void set( double value = INVALID, TQColor valueColor = TQt::gray, + int valuePattern = TQt::SolidPattern, + const TQString& label = TQString::null, + TQColor labelColor = TQt::black ) { + init( value, valueColor, valuePattern, label, labelColor ); + } + void setValue( double value ) { m_value = value; } + void setValueColor( TQColor valueColor ) { m_valueColor = valueColor; } + void setValuePattern( int valuePattern ); + void setLabel( const TQString& label ) { m_label = label; } + void setLabelColor( TQColor labelColor ) { m_labelColor = labelColor; } + void setProX( int index, double value ); + void setProY( int index, double value ); + +#ifdef Q_FULL_TEMPLATE_INSTANTIATION + // xlC 3.x workaround + Q_DUMMY_COMPARISON_OPERATOR(Element) + bool operator!=( const Element& e) const { + return ( !(e == *this) ); + } +#endif + +private: + void init( double value, TQColor valueColor, int valuePattern, + const TQString& label, TQColor labelColor ); + + double m_value; + TQColor m_valueColor; + int m_valuePattern; + TQString m_label; + TQColor m_labelColor; + double m_propoints[2 * MAX_PROPOINTS]; +}; + + +TQTextStream &operator<<( TQTextStream&, const Element& ); +TQTextStream &operator>>( TQTextStream&, Element& ); + +#endif diff --git a/examples/chart/images/chart-forms.sk b/examples/chart/images/chart-forms.sk new file mode 100644 index 000000000..d9087b48d --- /dev/null +++ b/examples/chart/images/chart-forms.sk @@ -0,0 +1,256 @@ +##Sketch 1 2 +document() +layout('A4',0) +layer('Layer 1',1,1,0,0,(0,0,0)) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(188.034,0,0,-149.201,526.688,-521.707) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(128.762,0,0,-92.995,341.407,-572.49) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(128.762,0,0,-92.995,768.68,-572.934) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +e(31.6796,0,0,31.6796,635.564,-722.4) +fp((0.8,0.8,0.8)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(188.034,0,0,-149.201,518.884,-513.603) +fp((1,1,1)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(158.398,0,0,-106.28,533.702,-545.185) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('ChartForm',(575.182,-535.064)) +fp((0.8,0.8,0.8)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(128.762,0,0,-92.995,335.96,-566.743) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('OptionsForm',(354.009,-589.226)) +fp((0.8,0.8,0.8)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(128.762,0,0,-92.995,763.221,-566.743) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('SetDataForm',(781.675,-587.279)) +fp((1,0,1)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +e(31.6796,0,0,31.6796,631.296,-719.01) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-BoldOblique') +Fs(18) +txt('chart',(613.251,-723.609)) +G() +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('CanvasView',(569.827,-575.941)) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('depicting a',(573.94,-595.357)) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('QCanvas',(580.906,-614.774)) +G_() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(662.975,-716.966,0) +bc(669.107,-712.686,671.463,-709.765,672.485,-707.625,2) +bc(673.507,-705.485,677.438,-697.225,677.438,-696.155,2) +bc(677.438,-695.085,679.326,-682.725,679.326,-682.725,2) +bc(679.326,-682.725,679.326,-670.955,679.326,-670.955,2) +bc(679.326,-670.955,679.326,-665.605,679.326,-664.535,2) +lw(1.41732) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(710.729,-618.861,0) +bs(759.036,-618.861,0) +lw(1.41732) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(515.603,-617.742,0) +bs(467.885,-617.742,0) +G() +fp((0,0.392,0)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +e(29.7517,0,0,-7.65884,468.929,-768.389) +fp((0,0.392,0)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(58.9143,0,0,-44.1857,439.032,-724.349) +fp((0,0.392,0)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +e(29.7517,0,0,-7.65884,468.929,-722.581) +G_() +lw(1.41732) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(499.125,-739.077,0) +bc(507.548,-735.049,508.671,-732.747,512.04,-728.144,2) +bc(515.409,-723.54,519.901,-717.21,520.463,-716.059,2) +bc(521.024,-714.909,531.132,-689.589,531.132,-689.589,2) +bc(531.132,-689.589,533.378,-679.231,533.378,-679.231,2) +bc(533.378,-679.231,535.062,-671.175,535.062,-671.175,2) +bc(535.062,-671.175,535.062,-664.845,535.062,-664.845,2) +fp((1,1,1)) +le() +lw(1) +Fn('Helvetica-Narrow-Bold') +Fs(18) +txt('disk',(453.761,-753.806)) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('run',(681.17,-700.783)) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('save',(524.007,-725.891)) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('load',(494.295,-706.489)) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(143.737,0,0,-67.586,525.422,-405.581) +fp((0.596,0.984,0.596)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(143.737,0,0,-67.586,519.327,-401.081) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('getOpenFileName()',(526.396,-420.297)) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(143.737,0,0,-67.586,704.655,-405.581) +fp((0.596,0.984,0.596)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(143.737,0,0,-67.586,698.561,-401.081) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('getSaveFileName()',(706.863,-420.39)) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(100.503,0,0,-67.586,375.286,-429.722) +fp((0.529,0.808,0.98)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(100.503,0,0,-67.586,371.024,-425.223) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('getFont()',(391.333,-444.571)) +fp((0.9,0.9,0.9)) +le() +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(100.503,0,0,-67.586,935.176,-580.856) +fp((1,0.753,0.796)) +lw(1.41732) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +r(100.503,0,0,-67.586,930.915,-576.357) +fp((0,0,0)) +le() +lw(1) +Fn('Helvetica-Narrow') +Fs(18) +txt('getColor()',(948.361,-598.303)) +lw(1.41732) +ld((1, 1)) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(591.836,-511.466,0) +bs(591.836,-471.702,0) +lw(1.41732) +ld((1, 1)) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(674.96,-513.083,0) +bs(749.29,-470.169,0) +lw(1.41732) +ld((1, 1)) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(538.877,-513.083,0) +bs(472.859,-474.968,0) +lw(1.41732) +ld((1, 1)) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(410.746,-562.437,0) +bs(410.746,-494.504,0) +lw(1.41732) +ld((1, 1)) +la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1)) +b() +bs(895.423,-617.315,0) +bs(928.721,-617.315,0) +guidelayer('Guide Lines',1,0,0,1,(0,0,1)) +grid((0,0,20,20),0,(0,0,1),'Grid') diff --git a/examples/chart/images/file_new.xpm b/examples/chart/images/file_new.xpm new file mode 100644 index 000000000..8537176cd --- /dev/null +++ b/examples/chart/images/file_new.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static const char *file_new[] = { +"20 20 12 1", +" c white", +"! c None", +"# c #000", +"$ c #2e2e2e2e2e2e", +"% c #ffffffffffff", +"& c #5c5c5c5c5c5c", +"( c #878787878787", +") c #c2c2c2c2c2c2", +"* c black", +"+ c #00C900", +", c #ffff00", +"- c red", +"!!!!!!!!!!!!!!!!!!!!", +"!!##########$!!!!!!!", +"!!#%%%%%%%%#&$!!!!!!", +"!!#%%%%%%%%#(&$!!!!!", +"!!#%%%%%%%%#)(&$!!!!", +"!!#%%%%%%%%#%)(&$!!!", +"!!#%%%%*****#####!!!", +"!!#%%%*+++++*%%%#!!!", +"!!#%%*,++++++*%%#!!!", +"!!#%*,,,++++++*%#!!!", +"!!#%*,,,,+++++*%#!!!", +"!!#%*,,,,-++++*%#!!!", +"!!#%*,,,---+++*%#!!!", +"!!#%*,,-----++*%#!!!", +"!!#%%*-------*%%#!!!", +"!!#%%%*-----*%%%#!!!", +"!!#%%%%*****%%%%#!!!", +"!!#%%%%%%%%%%%%%#!!!", +"!!###############!!!", +"!!!!!!!!!!!!!!!!!!!!" +}; diff --git a/examples/chart/images/file_open.xpm b/examples/chart/images/file_open.xpm new file mode 100644 index 000000000..7a7b681d7 --- /dev/null +++ b/examples/chart/images/file_open.xpm @@ -0,0 +1,33 @@ +/* XPM */ +static const char *file_open[] = { +"20 20 9 1", +" c white", +"! c None", +"# c #002EFF", +"$ c #000", +"% c #ffffffff0", +"& c #ffffffffffff", +"( c #00C900", +") c #ffff00", +"* c #A500FF", +"!!!!!!!!!!####!!!!#!", +"!!!!!!!!!#!!!!##!##!", +"!!!!!!!!!!!!!!!!###!", +"!!!!!!!!!!!!!!!####!", +"!!!!!!!!!!!!!!#####!", +"!$$$$!!!!!!!!!!!!!!!", +"$%&%&$$$$$$$$!!!!!!!", +"$&%&%&%&%&%&$!!!!!!!", +"$%&&&$$$$$&&$!!!!!!!", +"$&&&$((((($&$!!!!!!!", +"$%&$)(($$$$$$$$$$$$$", +"$&$)))$***********$$", +"$%$))$***********$$!", +"$&$)$***********$$!!", +"$%$$***********$$!!!", +"$&$***********$$!!!!", +"$$***********$$!!!!!", +"$$***********$!!!!!!", +"$$$$$$$$$$$$$!!!!!!!", +"!!!!!!!!!!!!!!!!!!!!" +}; diff --git a/examples/chart/images/file_print.xpm b/examples/chart/images/file_print.xpm new file mode 100644 index 000000000..915f65bab --- /dev/null +++ b/examples/chart/images/file_print.xpm @@ -0,0 +1,115 @@ +/* XPM */ +static const char *file_print[] = { +/* columns rows colors chars-per-pixel */ +"20 20 89 1", +" c Gray0", +". c #101008081010", +"X c #101010101010", +"o c #101010101818", +"O c #181810101818", +"+ c #181818181818", +"@ c #181818182121", +"# c #212118182121", +"$ c Gray13", +"% c #212121212929", +"& c #292921212929", +"* c Gray16", +"= c #292929293131", +"- c #313129293131", +"; c #313131313131", +": c #313131313939", +"> c #393931313939", +", c #393939393939", +"< c #393939394242", +"1 c #424239394242", +"2 c Gray26", +"3 c #4a4a4a4a5252", +"4 c #5a5a52525a5a", +"5 c #5a5a5a5a6363", +"6 c #6b6b63636b6b", +"7 c Gray42", +"8 c #6b6b6b6b7373", +"9 c #73736b6b7373", +"0 c #7b7b73737b7b", +"q c #7b7b73738484", +"w c #0808ffff0808", +"e c #2929ffff2929", +"r c #3131ffff3131", +"t c #5a5acece5a5a", +"y c #6b6bffff6363", +"u c #7b7bffff7b7b", +"i c #84847b7b8484", +"p c #84847b7b8c8c", +"a c #8c8c7b7b9494", +"s c #848484848c8c", +"d c #8c8c84848c8c", +"f c Gray55", +"g c #8c8c84849494", +"h c #8c8c8c8c9494", +"j c #94948c8c9494", +"k c #94948c8c9c9c", +"l c Gray58", +"z c #949494949c9c", +"x c #9c9c94949c9c", +"c c Gray61", +"v c #9c9c9494a5a5", +"b c #9c9c9c9ca5a5", +"n c #a5a59c9ca5a5", +"m c #a5a59c9cadad", +"M c #adad9c9cadad", +"N c #a5a5a5a5a5a5", +"B c #a5a5a5a5adad", +"V c #adada5a5adad", +"C c Gray68", +"Z c #adadadadb5b5", +"A c #b5b5adadb5b5", +"S c Gray71", +"D c Gray74", +"F c #9494c6c69494", +"G c #9c9ccecea5a5", +"H c #bdbdd6d6bdbd", +"J c #c0c0c0c0c0c0", +"K c #c6c6c6c6c6c6", +"L c #cecec6c6cece", +"P c #cececececece", +"I c #cecececed6d6", +"U c #d6d6ceced6d6", +"Y c #d6d6cecedede", +"T c Gray84", +"R c #d6d6d6d6dede", +"E c #deded6d6dede", +"W c Gray87", +"Q c #deded6d6e7e7", +"! c #dedededee7e7", +"~ c #d6d6ffffd6d6", +"^ c #e7e7dedee7e7", +"/ c #e7e7e7e7e7e7", +"( c #e7e7e7e7efef", +") c #efefe7e7efef", +"_ c #efefefefefef", +"` c #e7e7ffffe7e7", +"' c Gray97", +"] c Gray100", +"[ c None", +/* pixels */ +"[[[[[[SDPPKKDDCD[[[[", +"[[[[[[D_///___WD[[[[", +"[[[[[[DKKPKKKKDK[[[[", +"[[[[[[SDDSDDSSCD[[[[", +"[[[[[KCKDKDDDKS[[[[[", +"[[[[[KDDDDDDDDS[[[[[", +"[[[[[CP/WWWWTWNNZ[[[", +"[[[Dc9STPTPTWWj427S[", +"[[Dziq00000pag8<%@2N", +"[DcE(!ERRUYGtFn2##O<", +"Db)]]]]]]]~ewePa;@X#", +"V']]]]]]]]`yru]Q0@ #", +"BRILITRRWE!RHUILhO @", +"jAZVBmBnmmnmMvzh6o #", +"jZZmBnnnbbbbvxxg6o +", +"lmmnbnbbbvxxxvjs6O 3", +"jBnnvcvxvxvxzjhd8o+C", +"lsdgfgdhghjhjkhg6+l[", +"S9%@$%&&&-::>>:-:l[[", +"[[C511,:;**%++.2c[[[" +}; diff --git a/examples/chart/images/file_save.xpm b/examples/chart/images/file_save.xpm new file mode 100644 index 000000000..616389921 --- /dev/null +++ b/examples/chart/images/file_save.xpm @@ -0,0 +1,33 @@ +/* XPM */ +static const char *file_save[] = { +"20 20 9 1", +" c white", +"! c #000", +"# c #002EFF", +"$ c #999999999999", +"% c None", +"& c #00C900", +"( c #ffff00", +") c red1", +"* c black", +"!!!!!!!!!!!!!!!!!!!!", +"!##!$$$!!!!!!$$$!%%!", +"!##!$$!&&&&&&!$$!%%!", +"!##!$!(&&&&&&&!$!!!!", +"!##!!(((&&&&&&&!!##!", +"!##!!((((&&&&&&!!##!", +"!##!!((((()&&&&!!##!", +"!##!!((())))&&&!!##!", +"!##!!(())))))&&!!##!", +"!##!$!))))))))!$!##!", +"!###!$!))))))!$*###!", +"!####***!!!!!***###!", +"!##################!", +"!###!!!!!!!!!!!!!##!", +"!###!!!!!!!!!$$$!##!", +"!###!!!!!!!!!$$$!##!", +"!###!!!!!!!!!$$$!##!", +"!###!!!!!!!!!$$$!##!", +"!###!!!!!!!!!$$$!##!", +"%!!!!!!!!!!!!!!!!!!%" +}; diff --git a/examples/chart/images/file_saveaspostscript.xpm b/examples/chart/images/file_saveaspostscript.xpm new file mode 100644 index 000000000..7dd75fcf7 --- /dev/null +++ b/examples/chart/images/file_saveaspostscript.xpm @@ -0,0 +1,34 @@ +/* XPM */ +static const char *file_saveaspostscript[] = { +"20 20 10 1", +" c white", +"! c #000", +"# c #002EFF", +"$ c #999999999999", +"% c None", +"& c #00C900", +"( c #ffff00", +") c red1", +"* c black", +"+ c grey100", +"!!!!!!!!!!!!!!!!!!!!", +"!##!$$$!!!!!!$$$!%%!", +"!##!$$!&&&&&&!$$!%%!", +"!##!$!(&&&&&&&!$!!!!", +"!##!!(((&&&&&&&!!##!", +"!##!!((((&&&&&&!!##!", +"!##!!((((()&&&&!!##!", +"!##!!((())))&&&!!##!", +"!##!!(())))))&&!!##!", +"!##!$!))))))))!$!##!", +"!###!$!))))))!$*###!", +"!####***!!!!!***###!", +"!##################!", +"!###!!!!!!!!!!!!!##!", +"!###!+++!+++!$$$!##!", +"!###!+!+!+!!!$$$!##!", +"!###!+++!+++!$$$!##!", +"!###!+!!!!!+!$$$!##!", +"!###!+!!!+++!$$$!##!", +"%!!!!!!!!!!!!!!!!!!%" +}; diff --git a/examples/chart/images/options_horizontalbarchart.xpm b/examples/chart/images/options_horizontalbarchart.xpm new file mode 100644 index 000000000..afb06ffa9 --- /dev/null +++ b/examples/chart/images/options_horizontalbarchart.xpm @@ -0,0 +1,31 @@ +/* XPM */ +static const char *options_horizontalbarchart[] = { +"20 20 7 1", +"( c #A500FF", +" c white", +"! c red1", +"# c None", +"$ c #E9FF00", +"% c #00C900", +"& c #002EFF", +"!!!!!!!!!!!!!!######", +"!!!!!!!!!!!!!!######", +"!!!!!!!!!!!!!!######", +"!!!!!!!!!!!!!!######", +"$$$$$$$$$$$$$$$$$###", +"$$$$$$$$$$$$$$$$$###", +"$$$$$$$$$$$$$$$$$###", +"$$$$$$$$$$$$$$$$$###", +"%%%%%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%%%%%", +"&&&&&&&&&&&&&&######", +"&&&&&&&&&&&&&&######", +"&&&&&&&&&&&&&&######", +"&&&&&&&&&&&&&&######", +"(((((((((((#########", +"(((((((((((#########", +"(((((((((((#########", +"(((((((((((#########" +}; diff --git a/examples/chart/images/options_piechart.xpm b/examples/chart/images/options_piechart.xpm new file mode 100644 index 000000000..221c78de1 --- /dev/null +++ b/examples/chart/images/options_piechart.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static const char *options_piechart[] = { +"20 20 6 1", +" c white", +"! c None", +"# c black", +"$ c #00C900", +"% c #E9FF00", +"& c red1", +"!!!!!!#######!!!!!!!", +"!!!!##$$$$$$$##!!!!!", +"!!!#%$$$$$$$$$$#!!!!", +"!!#%%%$$$$$$$$$$#!!!", +"!#%%%%%$$$$$$$$$$#!!", +"!#%%%%%$$$$$$$$$$#!!", +"#%%%%%%%$$$$$$$$$$#!", +"#%%%%%%%%$$$$$$$$$#!", +"#%%%%%%%%$$$$$$$$$#!", +"#%%%%%%%%%$$$$$$$$#!", +"#%%%%%%%%&&$$$$$$$#!", +"#%%%%%%%&&&&$$$$$$#!", +"#%%%%%%&&&&&&&$$$$#!", +"#%%%%%&&&&&&&&&$$$#!", +"!#%%%&&&&&&&&&&&&#!!", +"!#%%&&&&&&&&&&&&&#!!", +"!!#&&&&&&&&&&&&&#!!!", +"!!!#&&&&&&&&&&&#!!!!", +"!!!!##&&&&&&&##!!!!!", +"!!!!!!#######!!!!!!!" +}; diff --git a/examples/chart/images/options_setdata.xpm b/examples/chart/images/options_setdata.xpm new file mode 100644 index 000000000..4ff70a54b --- /dev/null +++ b/examples/chart/images/options_setdata.xpm @@ -0,0 +1,34 @@ +/* XPM */ +static const char *options_setdata[] = { +"20 20 10 1", +" c white", +"! c None", +"# c grey40", +"$ c #002EFF", +"% c black", +"& c red1", +"( c #00C900", +") c #A500FF", +"* c #E9FF00", +"+ c cyan1", +"!!!!!!!!!!!!!!!!!!!!", +"!#####!$$!!#####!%%!", +"!#####!$$!!#####!%%!", +"!!!!!!!!!!!!!!!!!!!!", +"!#####!&&!!#####!%%!", +"!#####!&&!!#####!%%!", +"!!!!!!!!!!!!!!!!!!!!", +"!#####!((!!#####!%%!", +"!#####!((!!#####!%%!", +"!!!!!!!!!!!!!!!!!!!!", +"!#####!))!!#####!%%!", +"!#####!))!!#####!%%!", +"!!!!!!!!!!!!!!!!!!!!", +"!#####!**!!#####!%%!", +"!#####!**!!#####!%%!", +"!!!!!!!!!!!!!!!!!!!!", +"!#####!++!!#####!%%!", +"!#####!++!!#####!%%!", +"!!!!!!!!!!!!!!!!!!!!", +"!!!!!!!!!!!!!!!!!!!!" +}; diff --git a/examples/chart/images/options_setfont.xpm b/examples/chart/images/options_setfont.xpm new file mode 100644 index 000000000..ab5522480 --- /dev/null +++ b/examples/chart/images/options_setfont.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *options_setfont[] = { +"20 20 3 1", +" c white", +"! c None", +"# c #002EFF", +"!!!!!!!!!!!!!!!!!!!!", +"!!!!!!!!!!!!#####!!!", +"!!!!!!!!!!!#######!!", +"!!!!!!!!!!!##!!!!##!", +"!!!!!!!!!!##!!!!###!", +"!!!!!!!!!!##!!!!###!", +"!!!!!!!!!###!!!!!!!!", +"!!!!!!!!!##!!!!!!!!!", +"!!!!!#############!!", +"!!!!###!!########!!!", +"!!!##!!!!##!!!!!!!!!", +"!!!##!!!!#!!!!!!!!!!", +"!!!!!!!!##!!!!!!!!!!", +"!!!!!!!!##!!!!!!!!!!", +"!!!!!!!###!!!!!!!!!!", +"!!!!!!!##!!!!!!!!!!!", +"!!!!!!##!!!!!!!!!!!!", +"!#!!!###!!!!!!!!!!!!", +"!######!!!!!!!!!!!!!", +"!!####!!!!!!!!!!!!!!" +}; diff --git a/examples/chart/images/options_setoptions.xpm b/examples/chart/images/options_setoptions.xpm new file mode 100644 index 000000000..029cf47d1 --- /dev/null +++ b/examples/chart/images/options_setoptions.xpm @@ -0,0 +1,32 @@ +/* XPM */ +static const char *options_setoptions[] = { +"20 20 8 1", +"( c #A500FF", +" c white", +") c grey30", +"! c None", +"# c #000", +"$ c grey60", +"% c grey100", +"& c black", +"!!!!!!!!!!!!!!!!!!!!", +"!#############$$$$$!", +"!#%%%%%%%%%%%%&$$$$!", +"!#%%%%%%%%%%%%%&$$$!", +"!#%%%%%%%%%%%%%%&$$!", +"!#%%%%%%%%%%%%%%%&$!", +"!#%%((%%%%%%%%%%%%#!", +"!#%%((%%%%%%%%%%%%#!", +"!#%%((%%%%%%%%%%%%#!", +"!#(((((((%%%%%%%%%#!", +"!#(((((((%%%%%%%%%#!", +"!#%%((%%%%%)%))))%#!", +"!#%%((%%%%%%%%%%%%#!", +"!#%%((%)))%)))%))%#!", +"!#%%%%%%%%%%%%%%%%#!", +"!#%%))%)%))))%))%%#!", +"!#%%%%%%%%%%%%%%%%#!", +"!#%%%%%%%%%%%%%%%%#!", +"!##################!", +"!!!!!!!!!!!!!!!!!!!!" +}; diff --git a/examples/chart/images/options_verticalbarchart.xpm b/examples/chart/images/options_verticalbarchart.xpm new file mode 100644 index 000000000..e812f0f9e --- /dev/null +++ b/examples/chart/images/options_verticalbarchart.xpm @@ -0,0 +1,31 @@ +/* XPM */ +static const char *options_verticalbarchart[] = { +"20 20 7 1", +"( c #A500FF", +" c white", +"! c None", +"# c #00C900", +"$ c #E9FF00", +"% c red1", +"& c #002EFF", +"!!!!!!!!####!!!!!!!!", +"!!!!!!!!####!!!!!!!!", +"!!!!!!!!####!!!!!!!!", +"!!!!$$$$####!!!!!!!!", +"!!!!$$$$####!!!!!!!!", +"!!!!$$$$####!!!!!!!!", +"%%%%$$$$####&&&&!!!!", +"%%%%$$$$####&&&&!!!!", +"%%%%$$$$####&&&&!!!!", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((", +"%%%%$$$$####&&&&((((" +}; diff --git a/examples/chart/images/pattern01.xpm b/examples/chart/images/pattern01.xpm new file mode 100644 index 000000000..26a70cbd8 --- /dev/null +++ b/examples/chart/images/pattern01.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *pattern01[] = { +/* columns rows colors chars-per-pixel */ +"40 20 1 1", +" c black", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/examples/chart/images/pattern02.xpm b/examples/chart/images/pattern02.xpm new file mode 100644 index 000000000..cc5b7948c --- /dev/null +++ b/examples/chart/images/pattern02.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern02[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +". . . . . . . . . . ", +" ", +" ", +" ", +". . . . . . . . . . ", +" ", +" ", +" ", +". . . . . . . . . . ", +" ", +" ", +" ", +". . . . . . . . . . ", +" ", +" ", +" ", +". . . . . . . . . . ", +" ", +" ", +" " +}; diff --git a/examples/chart/images/pattern03.xpm b/examples/chart/images/pattern03.xpm new file mode 100644 index 000000000..d9fc57a94 --- /dev/null +++ b/examples/chart/images/pattern03.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern03[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +" . . . . . . . . . . ", +" ", +". . . . . . . . . . ", +" ", +" . . . . . . . . . . ", +" ", +". . . . . . . . . . ", +" ", +" . . . . . . . . . . ", +" ", +". . . . . . . . . . ", +" ", +" . . . . . . . . . . ", +" ", +". . . . . . . . . . ", +" ", +" . . . . . . . . . . ", +" ", +". . . . . . . . . . ", +" " +}; diff --git a/examples/chart/images/pattern04.xpm b/examples/chart/images/pattern04.xpm new file mode 100644 index 000000000..85b9223b6 --- /dev/null +++ b/examples/chart/images/pattern04.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern04[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +". . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +" . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +" . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +" . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +" . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +" . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . ." +}; diff --git a/examples/chart/images/pattern05.xpm b/examples/chart/images/pattern05.xpm new file mode 100644 index 000000000..cc7beee90 --- /dev/null +++ b/examples/chart/images/pattern05.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern05[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . " +}; diff --git a/examples/chart/images/pattern06.xpm b/examples/chart/images/pattern06.xpm new file mode 100644 index 000000000..ad8b05545 --- /dev/null +++ b/examples/chart/images/pattern06.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern06[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +".. ... ... ... ... ... ... ... ... ... .", +". . . . . . . . . . . . . . . . . . . . ", +" ... ... ... ... ... ... ... ... ... ...", +". . . . . . . . . . . . . . . . . . . . ", +".. ... ... ... ... ... ... ... ... ... .", +". . . . . . . . . . . . . . . . . . . . ", +" ... ... ... ... ... ... ... ... ... ...", +". . . . . . . . . . . . . . . . . . . . ", +".. ... ... ... ... ... ... ... ... ... .", +". . . . . . . . . . . . . . . . . . . . ", +" ... ... ... ... ... ... ... ... ... ...", +". . . . . . . . . . . . . . . . . . . . ", +".. ... ... ... ... ... ... ... ... ... .", +". . . . . . . . . . . . . . . . . . . . ", +" ... ... ... ... ... ... ... ... ... ...", +". . . . . . . . . . . . . . . . . . . . ", +".. ... ... ... ... ... ... ... ... ... .", +". . . . . . . . . . . . . . . . . . . . ", +" ... ... ... ... ... ... ... ... ... ...", +". . . . . . . . . . . . . . . . . . . . " +}; diff --git a/examples/chart/images/pattern07.xpm b/examples/chart/images/pattern07.xpm new file mode 100644 index 000000000..d01c55f9f --- /dev/null +++ b/examples/chart/images/pattern07.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern07[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +" ... ... ... ... ... ... ... ... ... ...", +"........................................", +".. ... ... ... ... ... ... ... ... ... .", +"........................................", +" ... ... ... ... ... ... ... ... ... ...", +"........................................", +".. ... ... ... ... ... ... ... ... ... .", +"........................................", +" ... ... ... ... ... ... ... ... ... ...", +"........................................", +".. ... ... ... ... ... ... ... ... ... .", +"........................................", +" ... ... ... ... ... ... ... ... ... ...", +"........................................", +".. ... ... ... ... ... ... ... ... ... .", +"........................................", +" ... ... ... ... ... ... ... ... ... ...", +"........................................", +".. ... ... ... ... ... ... ... ... ... .", +"........................................" +}; diff --git a/examples/chart/images/pattern08.xpm b/examples/chart/images/pattern08.xpm new file mode 100644 index 000000000..b0ce09fec --- /dev/null +++ b/examples/chart/images/pattern08.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern08[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +"........................................", +"........................................", +"... ... ... ... ... ... ... ... ... ... ", +"........................................", +"........................................", +"........................................", +"... ... ... ... ... ... ... ... ... ... ", +"........................................", +"........................................", +"........................................", +"... ... ... ... ... ... ... ... ... ... ", +"........................................", +"........................................", +"........................................", +"... ... ... ... ... ... ... ... ... ... ", +"........................................", +"........................................", +"........................................", +"... ... ... ... ... ... ... ... ... ... ", +"........................................" +}; diff --git a/examples/chart/images/pattern09.xpm b/examples/chart/images/pattern09.xpm new file mode 100644 index 000000000..7d34bc428 --- /dev/null +++ b/examples/chart/images/pattern09.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern09[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +"........................................", +" ", +"........................................", +"........................................", +"........................................", +"........................................", +"........................................", +" ", +"........................................", +"........................................", +"........................................", +"........................................", +"........................................", +" ", +"........................................", +"........................................", +"........................................", +"........................................", +"........................................", +" " +}; diff --git a/examples/chart/images/pattern10.xpm b/examples/chart/images/pattern10.xpm new file mode 100644 index 000000000..c908016d6 --- /dev/null +++ b/examples/chart/images/pattern10.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern10[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... .", +".. ..... ..... ..... ..... ..... ..... ." +}; diff --git a/examples/chart/images/pattern11.xpm b/examples/chart/images/pattern11.xpm new file mode 100644 index 000000000..8feda9a4f --- /dev/null +++ b/examples/chart/images/pattern11.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern11[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +" ", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +" ", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +" ", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... ..", +". ..... ..... ..... ..... ..... ..... .." +}; diff --git a/examples/chart/images/pattern12.xpm b/examples/chart/images/pattern12.xpm new file mode 100644 index 000000000..a57233f25 --- /dev/null +++ b/examples/chart/images/pattern12.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern12[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +"..... ....... ....... ....... ....... ..", +".... ....... ....... ....... ....... ...", +"... ....... ....... ....... ....... ....", +".. ....... ....... ....... ....... .....", +". ....... ....... ....... ....... ......", +" ....... ....... ....... ....... .......", +"....... ....... ....... ....... ....... ", +"...... ....... ....... ....... ....... .", +"..... ....... ....... ....... ....... ..", +".... ....... ....... ....... ....... ...", +"... ....... ....... ....... ....... ....", +".. ....... ....... ....... ....... .....", +". ....... ....... ....... ....... ......", +" ....... ....... ....... ....... .......", +"....... ....... ....... ....... ....... ", +"...... ....... ....... ....... ....... .", +"..... ....... ....... ....... ....... ..", +".... ....... ....... ....... ....... ...", +"... ....... ....... ....... ....... ....", +".. ....... ....... ....... ....... ....." +}; diff --git a/examples/chart/images/pattern13.xpm b/examples/chart/images/pattern13.xpm new file mode 100644 index 000000000..97f874fef --- /dev/null +++ b/examples/chart/images/pattern13.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern13[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +" ....... ....... ....... ....... .......", +". ....... ....... ....... ....... ......", +".. ....... ....... ....... ....... .....", +"... ....... ....... ....... ....... ....", +".... ....... ....... ....... ....... ...", +"..... ....... ....... ....... ....... ..", +"...... ....... ....... ....... ....... .", +"....... ....... ....... ....... ....... ", +" ....... ....... ....... ....... .......", +". ....... ....... ....... ....... ......", +".. ....... ....... ....... ....... .....", +"... ....... ....... ....... ....... ....", +".... ....... ....... ....... ....... ...", +"..... ....... ....... ....... ....... ..", +"...... ....... ....... ....... ....... .", +"....... ....... ....... ....... ....... ", +" ....... ....... ....... ....... .......", +". ....... ....... ....... ....... ......", +".. ....... ....... ....... ....... .....", +"... ....... ....... ....... ....... ...." +}; diff --git a/examples/chart/images/pattern14.xpm b/examples/chart/images/pattern14.xpm new file mode 100644 index 000000000..e9e68845c --- /dev/null +++ b/examples/chart/images/pattern14.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *pattern14[] = { +/* columns rows colors chars-per-pixel */ +"40 20 2 1", +" c black", +". c white", +/* pixels */ +"... . ..... . ..... . ..... . ..... . ..", +".. ... ... ... ... ... ... ... ... ... .", +". ..... . ..... . ..... . ..... . ..... ", +" ....... ....... ....... ....... .......", +". ..... . ..... . ..... . ..... . ..... ", +".. ... ... ... ... ... ... ... ... ... .", +"... . ..... . ..... . ..... . ..... . ..", +".... ....... ....... ....... ....... ...", +"... . ..... . ..... . ..... . ..... . ..", +".. ... ... ... ... ... ... ... ... ... .", +". ..... . ..... . ..... . ..... . ..... ", +" ....... ....... ....... ....... .......", +". ..... . ..... . ..... . ..... . ..... ", +".. ... ... ... ... ... ... ... ... ... .", +"... . ..... . ..... . ..... . ..... . ..", +".... ....... ....... ....... ....... ...", +"... . ..... . ..... . ..... . ..... . ..", +".. ... ... ... ... ... ... ... ... ... .", +". ..... . ..... . ..... . ..... . ..... ", +" ....... ....... ....... ....... ......." +}; diff --git a/examples/chart/main.cpp b/examples/chart/main.cpp new file mode 100644 index 000000000..328e7fe54 --- /dev/null +++ b/examples/chart/main.cpp @@ -0,0 +1,21 @@ +#include <qapplication.h> +#include "chartform.h" + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + TQString filename; + if ( app.argc() > 1 ) { + filename = app.argv()[1]; + if ( !filename.endsWith( ".cht" ) ) + filename = TQString::null; + } + + ChartForm *cf = new ChartForm( filename ); + app.setMainWidget( cf ); + cf->show(); + + return app.exec(); +} diff --git a/examples/chart/optionsform.cpp b/examples/chart/optionsform.cpp new file mode 100644 index 000000000..c6e16af5d --- /dev/null +++ b/examples/chart/optionsform.cpp @@ -0,0 +1,135 @@ +#include "optionsform.h" + +#include <qbuttongroup.h> +#include <qcombobox.h> +#include <qfontdialog.h> +#include <qframe.h> +#include <qimage.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpushbutton.h> +#include <qradiobutton.h> +#include <qspinbox.h> + +#include "images/options_horizontalbarchart.xpm" +#include "images/options_piechart.xpm" +#include "images/options_verticalbarchart.xpm" + + +OptionsForm::OptionsForm( TQWidget* parent, const char* name, + bool modal, WFlags f ) + : TQDialog( parent, name, modal, f ) +{ + setCaption( "Chart -- Options" ); + resize( 320, 290 ); + + optionsFormLayout = new TQVBoxLayout( this, 11, 6 ); + + chartTypeLayout = new TQHBoxLayout( 0, 0, 6 ); + + chartTypeTextLabel = new TQLabel( "&Chart Type", this ); + chartTypeLayout->addWidget( chartTypeTextLabel ); + + chartTypeComboBox = new TQComboBox( FALSE, this ); + chartTypeComboBox->insertItem( TQPixmap( options_piechart ), "Pie Chart" ); + chartTypeComboBox->insertItem( TQPixmap( options_verticalbarchart ), + "Vertical Bar Chart" ); + chartTypeComboBox->insertItem( TQPixmap( options_horizontalbarchart ), + "Horizontal Bar Chart" ); + chartTypeLayout->addWidget( chartTypeComboBox ); + optionsFormLayout->addLayout( chartTypeLayout ); + + fontLayout = new TQHBoxLayout( 0, 0, 6 ); + + fontPushButton = new TQPushButton( "&Font...", this ); + fontLayout->addWidget( fontPushButton ); + TQSpacerItem* spacer = new TQSpacerItem( 0, 0, + TQSizePolicy::Expanding, + TQSizePolicy::Minimum ); + fontLayout->addItem( spacer ); + + fontTextLabel = new TQLabel( this ); // Must be set by caller via setFont() + fontLayout->addWidget( fontTextLabel ); + optionsFormLayout->addLayout( fontLayout ); + + addValuesFrame = new TQFrame( this ); + addValuesFrame->setFrameShape( TQFrame::StyledPanel ); + addValuesFrame->setFrameShadow( TQFrame::Sunken ); + addValuesFrameLayout = new TQVBoxLayout( addValuesFrame, 11, 6 ); + + addValuesButtonGroup = new TQButtonGroup( "Show Values", addValuesFrame ); + addValuesButtonGroup->setColumnLayout(0, TQt::Vertical ); + addValuesButtonGroup->layout()->setSpacing( 6 ); + addValuesButtonGroup->layout()->setMargin( 11 ); + addValuesButtonGroupLayout = new TQVBoxLayout( + addValuesButtonGroup->layout() ); + addValuesButtonGroupLayout->setAlignment( TQt::AlignTop ); + + noRadioButton = new TQRadioButton( "&No", addValuesButtonGroup ); + noRadioButton->setChecked( TRUE ); + addValuesButtonGroupLayout->addWidget( noRadioButton ); + + yesRadioButton = new TQRadioButton( "&Yes", addValuesButtonGroup ); + addValuesButtonGroupLayout->addWidget( yesRadioButton ); + + asPercentageRadioButton = new TQRadioButton( "As &Percentage", + addValuesButtonGroup ); + addValuesButtonGroupLayout->addWidget( asPercentageRadioButton ); + addValuesFrameLayout->addWidget( addValuesButtonGroup ); + + decimalPlacesLayout = new TQHBoxLayout( 0, 0, 6 ); + + decimalPlacesTextLabel = new TQLabel( "&Decimal Places", addValuesFrame ); + decimalPlacesLayout->addWidget( decimalPlacesTextLabel ); + + decimalPlacesSpinBox = new TQSpinBox( addValuesFrame ); + decimalPlacesSpinBox->setMinValue( 0 ); + decimalPlacesSpinBox->setMaxValue( 9 ); + decimalPlacesLayout->addWidget( decimalPlacesSpinBox ); + + addValuesFrameLayout->addLayout( decimalPlacesLayout ); + + optionsFormLayout->addWidget( addValuesFrame ); + + buttonsLayout = new TQHBoxLayout( 0, 0, 6 ); + spacer = new TQSpacerItem( 0, 0, + TQSizePolicy::Expanding, TQSizePolicy::Minimum ); + buttonsLayout->addItem( spacer ); + + okPushButton = new TQPushButton( "OK", this ); + okPushButton->setDefault( TRUE ); + buttonsLayout->addWidget( okPushButton ); + + cancelPushButton = new TQPushButton( "Cancel", this ); + buttonsLayout->addWidget( cancelPushButton ); + optionsFormLayout->addLayout( buttonsLayout ); + + connect( fontPushButton, SIGNAL( clicked() ), this, SLOT( chooseFont() ) ); + connect( okPushButton, SIGNAL( clicked() ), this, SLOT( accept() ) ); + connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); + + chartTypeTextLabel->setBuddy( chartTypeComboBox ); + decimalPlacesTextLabel->setBuddy( decimalPlacesSpinBox ); +} + + +void OptionsForm::chooseFont() +{ + bool ok; + TQFont font = TQFontDialog::getFont( &ok, m_font, this ); + if ( ok ) + setFont( font ); +} + + +void OptionsForm::setFont( TQFont font ) +{ + TQString label = font.family() + " " + + TQString::number( font.pointSize() ) + "pt"; + if ( font.bold() ) + label += " Bold"; + if ( font.italic() ) + label += " Italic"; + fontTextLabel->setText( label ); + m_font = font; +} diff --git a/examples/chart/optionsform.h b/examples/chart/optionsform.h new file mode 100644 index 000000000..e9d07ad91 --- /dev/null +++ b/examples/chart/optionsform.h @@ -0,0 +1,60 @@ +#ifndef OPTIONSFORM_H +#define OPTIONSFORM_H + +#include <qdialog.h> + +class TQButtonGroup; +class TQComboBox; +class TQFrame; +class TQGridLayout; +class TQHBoxLayout; +class TQLabel; +class TQPushButton; +class TQRadioButton; +class TQSpinBox; +class TQVBoxLayout; + + +class OptionsForm : public TQDialog +{ + Q_OBJECT +public: + OptionsForm( TQWidget* parent = 0, const char* name = "options form", + bool modal = FALSE, WFlags f = 0 ); + ~OptionsForm() {} + + TQFont font() const { return m_font; } + void setFont( TQFont font ); + + TQLabel *chartTypeTextLabel; + TQComboBox *chartTypeComboBox; + TQPushButton *fontPushButton; + TQLabel *fontTextLabel; + TQFrame *addValuesFrame; + TQButtonGroup *addValuesButtonGroup; + TQRadioButton *noRadioButton; + TQRadioButton *yesRadioButton; + TQRadioButton *asPercentageRadioButton; + TQLabel *decimalPlacesTextLabel; + TQSpinBox *decimalPlacesSpinBox; + TQPushButton *okPushButton; + TQPushButton *cancelPushButton; + +protected slots: + void chooseFont(); + +protected: + TQVBoxLayout *optionsFormLayout; + TQHBoxLayout *chartTypeLayout; + TQHBoxLayout *fontLayout; + TQVBoxLayout *addValuesFrameLayout; + TQVBoxLayout *addValuesButtonGroupLayout; + TQHBoxLayout *decimalPlacesLayout; + TQHBoxLayout *buttonsLayout; + +private: + TQFont m_font; +}; + +#endif + diff --git a/examples/chart/setdataform.cpp b/examples/chart/setdataform.cpp new file mode 100644 index 000000000..d6c57e370 --- /dev/null +++ b/examples/chart/setdataform.cpp @@ -0,0 +1,208 @@ +#include "setdataform.h" +#include "chartform.h" + +#include <qcolordialog.h> +#include <qcombobox.h> +#include <qlayout.h> +#include <qpixmap.h> +#include <qpushbutton.h> +#include <qtable.h> + +#include "images/pattern01.xpm" +#include "images/pattern02.xpm" +#include "images/pattern03.xpm" +#include "images/pattern04.xpm" +#include "images/pattern05.xpm" +#include "images/pattern06.xpm" +#include "images/pattern07.xpm" +#include "images/pattern08.xpm" +#include "images/pattern09.xpm" +#include "images/pattern10.xpm" +#include "images/pattern11.xpm" +#include "images/pattern12.xpm" +#include "images/pattern13.xpm" +#include "images/pattern14.xpm" + +const int MAX_PATTERNS = 14; + + +SetDataForm::SetDataForm( ElementVector *elements, int decimalPlaces, + TQWidget* parent, const char* name, + bool modal, WFlags f ) + : TQDialog( parent, name, modal, f ) + +{ + m_elements = elements; + m_decimalPlaces = decimalPlaces; + + setCaption( "Chart -- Set Data" ); + resize( 540, 440 ); + + tableButtonBox = new TQVBoxLayout( this, 11, 6, "table button box layout" ); + + table = new TQTable( this, "data table" ); + table->setNumCols( 5 ); + table->setNumRows( ChartForm::MAX_ELEMENTS ); + table->setColumnReadOnly( 1, TRUE ); + table->setColumnReadOnly( 2, TRUE ); + table->setColumnReadOnly( 4, TRUE ); + table->setColumnWidth( 0, 80 ); + table->setColumnWidth( 1, 60 ); // Columns 1 and 4 must be equal + table->setColumnWidth( 2, 60 ); + table->setColumnWidth( 3, 200 ); + table->setColumnWidth( 4, 60 ); + TQHeader *th = table->horizontalHeader(); + th->setLabel( 0, "Value" ); + th->setLabel( 1, "Color" ); + th->setLabel( 2, "Pattern" ); + th->setLabel( 3, "Label" ); + th->setLabel( 4, "Color" ); + tableButtonBox->addWidget( table ); + + buttonBox = new TQHBoxLayout( 0, 0, 6, "button box layout" ); + + colorPushButton = new TQPushButton( this, "color button" ); + colorPushButton->setText( "&Color..." ); + colorPushButton->setEnabled( FALSE ); + buttonBox->addWidget( colorPushButton ); + + TQSpacerItem *spacer = new TQSpacerItem( 0, 0, TQSizePolicy::Expanding, + TQSizePolicy::Minimum ); + buttonBox->addItem( spacer ); + + okPushButton = new TQPushButton( this, "ok button" ); + okPushButton->setText( "OK" ); + okPushButton->setDefault( TRUE ); + buttonBox->addWidget( okPushButton ); + + cancelPushButton = new TQPushButton( this, "cancel button" ); + cancelPushButton->setText( "Cancel" ); + cancelPushButton->setAccel( Key_Escape ); + buttonBox->addWidget( cancelPushButton ); + + tableButtonBox->addLayout( buttonBox ); + + connect( table, SIGNAL( clicked(int,int,int,const TQPoint&) ), + this, SLOT( setColor(int,int) ) ); + connect( table, SIGNAL( currentChanged(int,int) ), + this, SLOT( currentChanged(int,int) ) ); + connect( table, SIGNAL( valueChanged(int,int) ), + this, SLOT( valueChanged(int,int) ) ); + connect( colorPushButton, SIGNAL( clicked() ), this, SLOT( setColor() ) ); + connect( okPushButton, SIGNAL( clicked() ), this, SLOT( accept() ) ); + connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); + + TQPixmap patterns[MAX_PATTERNS]; + patterns[0] = TQPixmap( pattern01 ); + patterns[1] = TQPixmap( pattern02 ); + patterns[2] = TQPixmap( pattern03 ); + patterns[3] = TQPixmap( pattern04 ); + patterns[4] = TQPixmap( pattern05 ); + patterns[5] = TQPixmap( pattern06 ); + patterns[6] = TQPixmap( pattern07 ); + patterns[7] = TQPixmap( pattern08 ); + patterns[8] = TQPixmap( pattern09 ); + patterns[9] = TQPixmap( pattern10 ); + patterns[10] = TQPixmap( pattern11 ); + patterns[11] = TQPixmap( pattern12 ); + patterns[12] = TQPixmap( pattern13 ); + patterns[13] = TQPixmap( pattern14 ); + + TQRect rect = table->cellRect( 0, 1 ); + TQPixmap pix( rect.width(), rect.height() ); + + for ( int i = 0; i < ChartForm::MAX_ELEMENTS; ++i ) { + Element element = (*m_elements)[i]; + + if ( element.isValid() ) + table->setText( + i, 0, + TQString( "%1" ).arg( element.value(), 0, 'f', + m_decimalPlaces ) ); + + TQColor color = element.valueColor(); + pix.fill( color ); + table->setPixmap( i, 1, pix ); + table->setText( i, 1, color.name() ); + + TQComboBox *combobox = new TQComboBox; + for ( int j = 0; j < MAX_PATTERNS; ++j ) + combobox->insertItem( patterns[j] ); + combobox->setCurrentItem( element.valuePattern() - 1 ); + table->setCellWidget( i, 2, combobox ); + + table->setText( i, 3, element.label() ); + + color = element.labelColor(); + pix.fill( color ); + table->setPixmap( i, 4, pix ); + table->setText( i, 4, color.name() ); + } + +} + + +void SetDataForm::currentChanged( int, int col ) +{ + colorPushButton->setEnabled( col == 1 || col == 4 ); +} + + +void SetDataForm::valueChanged( int row, int col ) +{ + if ( col == 0 ) { + bool ok; + double d = table->text( row, col ).toDouble( &ok ); + if ( ok && d > EPSILON ) + table->setText( + row, col, TQString( "%1" ).arg( + d, 0, 'f', m_decimalPlaces ) ); + else if ( !table->text( row, col ).isEmpty() ) + table->setText( row, col, table->text( row, col ) + "?" ); + } +} + + +void SetDataForm::setColor() +{ + setColor( table->currentRow(), table->currentColumn() ); + table->setFocus(); +} + + +void SetDataForm::setColor( int row, int col ) +{ + if ( !( col == 1 || col == 4 ) ) + return; + + TQColor color = TQColorDialog::getColor( + TQColor( table->text( row, col ) ), + this, "color dialog" ); + if ( color.isValid() ) { + TQPixmap pix = table->pixmap( row, col ); + pix.fill( color ); + table->setPixmap( row, col, pix ); + table->setText( row, col, color.name() ); + } +} + + +void SetDataForm::accept() +{ + bool ok; + for ( int i = 0; i < ChartForm::MAX_ELEMENTS; ++i ) { + Element &element = (*m_elements)[i]; + double d = table->text( i, 0 ).toDouble( &ok ); + if ( ok ) + element.setValue( d ); + else + element.setValue( Element::INVALID ); + element.setValueColor( TQColor( table->text( i, 1 ) ) ); + element.setValuePattern( + ((TQComboBox*)table->cellWidget( i, 2 ))->currentItem() + 1 ); + element.setLabel( table->text( i, 3 ) ); + element.setLabelColor( TQColor( table->text( i, 4 ) ) ); + } + + TQDialog::accept(); +} diff --git a/examples/chart/setdataform.h b/examples/chart/setdataform.h new file mode 100644 index 000000000..e16dd784e --- /dev/null +++ b/examples/chart/setdataform.h @@ -0,0 +1,47 @@ +#ifndef SETDATAFORM_H +#define SETDATAFORM_H + +#include "element.h" + +#include <qdialog.h> + +class TQHBoxLayout; +class TQPushButton; +class TQTable; +class TQVBoxLayout; + + +class SetDataForm: public TQDialog +{ + Q_OBJECT +public: + SetDataForm( ElementVector *elements, int decimalPlaces, + TQWidget *parent = 0, const char *name = "set data form", + bool modal = TRUE, WFlags f = 0 ); + ~SetDataForm() {} + +public slots: + void setColor(); + void setColor( int row, int col ); + void currentChanged( int row, int col ); + void valueChanged( int row, int col ); + +protected slots: + void accept(); + +private: + TQTable *table; + TQPushButton *colorPushButton; + TQPushButton *okPushButton; + TQPushButton *cancelPushButton; + +protected: + TQVBoxLayout *tableButtonBox; + TQHBoxLayout *buttonBox; + +private: + ElementVector *m_elements; + int m_decimalPlaces; +}; + +#endif diff --git a/examples/checklists/checklists.cpp b/examples/checklists/checklists.cpp new file mode 100644 index 000000000..b4f1e2353 --- /dev/null +++ b/examples/checklists/checklists.cpp @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "checklists.h" + +#include <qlistview.h> +#include <qvbox.h> +#include <qlabel.h> +#include <qvaluelist.h> +#include <qstring.h> +#include <qpushbutton.h> +#include <qlayout.h> + +/* + * Constructor + * + * Create all child widgets of the CheckList Widget + */ + +CheckLists::CheckLists( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + TQHBoxLayout *lay = new TQHBoxLayout( this ); + lay->setMargin( 5 ); + + // create a widget which layouts its childs in a column + TQVBoxLayout *vbox1 = new TQVBoxLayout( lay ); + vbox1->setMargin( 5 ); + + // First child: a Label + vbox1->addWidget( new TQLabel( "Check some items!", this ) ); + + // Second child: the ListView + lv1 = new TQListView( this ); + vbox1->addWidget( lv1 ); + lv1->addColumn( "Items" ); + lv1->setRootIsDecorated( TRUE ); + + // create a list with 4 ListViewItems which will be parent items of other ListViewItems + TQValueList<TQListViewItem *> parentList; + + parentList.append( new TQCheckListItem( lv1, "Parent Item 1", TQCheckListItem::CheckBoxController ) ); + parentList.append( new TQCheckListItem( lv1, "Parent Item 2", TQCheckListItem::CheckBoxController ) ); + parentList.append( new TQCheckListItem( lv1, "Parent Item 3", TQCheckListItem::CheckBoxController ) ); + parentList.append( new TQCheckListItem( lv1, "Parent Item 4", TQCheckListItem::CheckBoxController ) ); + + TQListViewItem *item = 0; + unsigned int num = 1; + // go through the list of parent items... + for ( TQValueList<TQListViewItem*>::Iterator it = parentList.begin(); it != parentList.end(); + ( *it )->setOpen( TRUE ), ++it, num++ ) { + item = *it; + // ...and create 5 checkable child ListViewItems for each parent item + for ( unsigned int i = 1; i <= 5; i++ ) + (void)new TQCheckListItem( item, TQString( "%1. Child of Parent %2" ).arg( i ).arg( num ), TQCheckListItem::CheckBox ); + } + + // Create another widget for layouting + TQVBoxLayout *tmp = new TQVBoxLayout( lay ); + tmp->setMargin( 5 ); + + // create a pushbutton + TQPushButton *copy1 = new TQPushButton( " -> ", this ); + tmp->addWidget( copy1 ); + copy1->setMaximumWidth( copy1->sizeHint().width() ); + // connect the SIGNAL clicked() of the pushbutton with the SLOT copy1to2() + connect( copy1, SIGNAL( clicked() ), this, SLOT( copy1to2() ) ); + + // another widget for layouting + TQVBoxLayout *vbox2 = new TQVBoxLayout( lay ); + vbox2->setMargin( 5 ); + + // and another label + vbox2->addWidget( new TQLabel( "Check one item!", this ) ); + + // create the second listview + lv2 = new TQListView( this ); + vbox2->addWidget( lv2 ); + lv2->addColumn( "Items" ); + lv2->setRootIsDecorated( TRUE ); + + // another widget needed for layouting only + tmp = new TQVBoxLayout( lay ); + tmp->setMargin( 5 ); + + // create another pushbutton... + TQPushButton *copy2 = new TQPushButton( " -> ", this ); + lay->addWidget( copy2 ); + copy2->setMaximumWidth( copy2->sizeHint().width() ); + // ...and connect its clicked() SIGNAL to the copy2to3() SLOT + connect( copy2, SIGNAL( clicked() ), this, SLOT( copy2to3() ) ); + + tmp = new TQVBoxLayout( lay ); + tmp->setMargin( 5 ); + + // and create a label which will be at the right of the window + label = new TQLabel( "No Item yet...", this ); + tmp->addWidget( label ); +} + +/* + * SLOT copy1to2() + * + * Copies all checked ListViewItems from the first ListView to + * the second one, and inserts them as Radio-ListViewItem. + */ + +void CheckLists::copy1to2() +{ + // create an iterator which operates on the first ListView + TQListViewItemIterator it( lv1 ); + + lv2->clear(); + + // Insert first a controller Item into the second ListView. Always if Radio-ListViewItems + // are inserted into a Listview, the parent item of these MUST be a controller Item! + TQCheckListItem *item = new TQCheckListItem( lv2, "Controller", TQCheckListItem::Controller ); + item->setOpen( TRUE ); + + // iterate through the first ListView... + for ( ; it.current(); ++it ) + // ...check state of childs, and... + if ( it.current()->parent() ) + // ...if the item is checked... + if ( ( (TQCheckListItem*)it.current() )->isOn() ) + // ...insert a Radio-ListViewItem with the same text into the second ListView + (void)new TQCheckListItem( item, it.current()->text( 0 ), TQCheckListItem::RadioButton ); + + if ( item->firstChild() ) + ( ( TQCheckListItem* )item->firstChild() )->setOn( TRUE ); +} + +/* + * SLOT copy2to3() + * + * Copies the checked item of the second ListView into the + * Label at the right. + */ + +void CheckLists::copy2to3() +{ + // create an iterator which operates on the second ListView + TQListViewItemIterator it( lv2 ); + + label->setText( "No Item checked" ); + + // iterate through the second ListView... + for ( ; it.current(); ++it ) + // ...check state of childs, and... + if ( it.current()->parent() ) + // ...if the item is checked... + if ( ( (TQCheckListItem*)it.current() )->isOn() ) + // ...set the text of the item to the label + label->setText( it.current()->text( 0 ) ); +} + diff --git a/examples/checklists/checklists.doc b/examples/checklists/checklists.doc new file mode 100644 index 000000000..417afe6b7 --- /dev/null +++ b/examples/checklists/checklists.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page checklists-example.html + + \ingroup examples + \title Listviews with Checkable Items + + This example program shows how to use listviews with different types of + checkable items. + + <hr> + + Header file: + + \include checklists/checklists.h + + <hr> + + Implementation: + + \include checklists/checklists.cpp + + <hr> + + Main: + + \include checklists/main.cpp +*/ + diff --git a/examples/checklists/checklists.h b/examples/checklists/checklists.h new file mode 100644 index 000000000..2de89bb2b --- /dev/null +++ b/examples/checklists/checklists.h @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef CHECKLISTS_H +#define CHECKLISTS_H + +#include <qwidget.h> + +class TQListView; +class TQLabel; + +class CheckLists : public TQWidget +{ + Q_OBJECT + +public: + CheckLists( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQListView *lv1, *lv2; + TQLabel *label; + +protected slots: + void copy1to2(); + void copy2to3(); + +}; + +#endif diff --git a/examples/checklists/checklists.pro b/examples/checklists/checklists.pro new file mode 100644 index 000000000..a1a6f12d8 --- /dev/null +++ b/examples/checklists/checklists.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = checklists + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = checklists.h +SOURCES = checklists.cpp \ + main.cpp diff --git a/examples/checklists/main.cpp b/examples/checklists/main.cpp new file mode 100644 index 000000000..9da7ae1bd --- /dev/null +++ b/examples/checklists/main.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "checklists.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + CheckLists checklists; + checklists.resize( 650, 350 ); + checklists.setCaption( "TQt Example - CheckLists" ); + a.setMainWidget( &checklists ); + checklists.show(); + + return a.exec(); +} diff --git a/examples/cursor/README b/examples/cursor/README new file mode 100644 index 000000000..c2040e5f0 --- /dev/null +++ b/examples/cursor/README @@ -0,0 +1,2 @@ +The cursor sample program displays the predefined cursors and +creates a custom bitmap cursor. diff --git a/examples/cursor/cursor.cpp b/examples/cursor/cursor.cpp new file mode 100644 index 000000000..4252dc346 --- /dev/null +++ b/examples/cursor/cursor.cpp @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qlabel.h> +#include <qbitmap.h> +#include <qapplication.h> +#include <qlayout.h> +#include <qcursor.h> + +// cb_bits and cm_bits were generated by X bitmap program. + +#define cb_width 32 +#define cb_height 32 + +static unsigned char cb_bits[] = { // cursor bitmap + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, + 0x00, 0x06, 0x30, 0x00, 0x80, 0x01, 0xc0, 0x00, 0x40, 0x00, 0x00, 0x01, + 0x20, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x04, 0x08, 0x3e, 0x3e, 0x08, + 0x08, 0x03, 0xe0, 0x08, 0xc4, 0x00, 0x00, 0x11, 0x04, 0x1e, 0x78, 0x10, + 0x02, 0x0c, 0x30, 0x20, 0x02, 0x40, 0x00, 0x20, 0x02, 0x40, 0x00, 0x20, + 0x02, 0x40, 0x00, 0x20, 0x02, 0x20, 0x04, 0x20, 0x02, 0x20, 0x04, 0x20, + 0x02, 0x10, 0x08, 0x20, 0x02, 0x08, 0x08, 0x20, 0x02, 0xf0, 0x07, 0x20, + 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x08, 0x00, 0xc0, 0x08, + 0x08, 0x3c, 0x30, 0x08, 0x10, 0xe6, 0x19, 0x04, 0x20, 0x00, 0x0f, 0x02, + 0x40, 0x00, 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x00, 0x06, 0x30, 0x00, + 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#define cm_width 32 +#define cm_height 32 + +static unsigned char cm_bits[] = { // cursor bitmap mask + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xfe, 0x3f, 0x00, + 0x80, 0x07, 0xf0, 0x00, 0xc0, 0x01, 0xc0, 0x01, 0x60, 0x00, 0x00, 0x03, + 0x30, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x0c, 0x0c, 0x3e, 0x3e, 0x18, + 0x0e, 0x03, 0xe0, 0x18, 0xc6, 0x00, 0x00, 0x31, 0x07, 0x1e, 0x78, 0x30, + 0x03, 0x0c, 0x30, 0x60, 0x03, 0x40, 0x00, 0x60, 0x03, 0x40, 0x00, 0x60, + 0x03, 0x40, 0x00, 0x60, 0x03, 0x20, 0x04, 0x60, 0x03, 0x20, 0x04, 0x60, + 0x03, 0x10, 0x08, 0x60, 0x03, 0x08, 0x08, 0x60, 0x03, 0xf0, 0x07, 0x60, + 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x30, 0x0c, 0x00, 0xc0, 0x18, + 0x0c, 0x3c, 0x30, 0x18, 0x18, 0xe6, 0x19, 0x0c, 0x30, 0x00, 0x0f, 0x06, + 0x60, 0x00, 0x00, 0x03, 0xc0, 0x01, 0xc0, 0x01, 0x80, 0x07, 0xf0, 0x00, + 0x00, 0xfe, 0x3f, 0x00, 0x00, 0xf8, 0x0f, 0x00}; + + +// +// The CursorView contains many labels with different cursors. +// + +class CursorView : public TQWidget // cursor view +{ +public: + CursorView(); +}; + +// +// Constructs a cursor view. +// + +CursorView::CursorView() // construct view +{ + struct List { + CursorShape shape; + const char* name; // cursor name + }; + static List list[] = { + { ArrowCursor, "arrowCursor" }, + { UpArrowCursor, "upArrowCursor" }, + { CrossCursor, "crossCursor" }, + { WaitCursor, "waitCursor" }, + { IbeamCursor, "ibeamCursor" }, + { SizeVerCursor, "sizeVerCursor" }, + { SizeHorCursor, "sizeHorCursor" }, + { SizeBDiagCursor, "sizeBDiagCursor" }, + { SizeFDiagCursor, "sizeFDiagCursor" }, + { SizeAllCursor, "sizeAllCursor" }, + { BlankCursor, "blankCursor" }, + { SplitVCursor, "splitVCursor" }, + { SplitHCursor, "splitHCursor" }, + { PointingHandCursor, "pointingHandCursor" }, + { ForbiddenCursor, "forbiddenCursor" }, + { WhatsThisCursor, "whatsThisCursor" }, + { BusyCursor, "busyCursor" } + }; + + setCaption( "CursorView" ); // set window caption + + TQGridLayout* grid = new TQGridLayout( this, 5, 4, 20 ); + TQLabel *label; + + int i=0; + for ( int y=0; y<4; y++ ) { // create the small labels + for ( int x=0; x<4; x++ ) { + label = new TQLabel( this ); + label->setCursor( TQCursor( list[i].shape ) ); + label->setText( list[i].name ); + label->setAlignment( AlignCenter ); + label->setMargin( 10 ); + label->setFrameStyle( TQFrame::Box | TQFrame::Raised ); + grid->addWidget( label, x, y ); + i++; + } + } + + + label = new TQLabel( this ); + label->setCursor( TQCursor( list[i].shape ) ); + label->setText( list[i].name ); + label->setAlignment( AlignCenter ); + label->setMargin( 10 ); + label->setFrameStyle( TQFrame::Box | TQFrame::Raised ); + grid->addWidget( label, 4, 0 ); + + + + TQBitmap cb( cb_width, cb_height, cb_bits, TRUE ); + TQBitmap cm( cm_width, cm_height, cm_bits, TRUE ); + TQCursor custom( cb, cm ); // create bitmap cursor + + label = new TQLabel( this ); // create the big label + label->setCursor( custom ); + label->setText( "Custom bitmap cursor" ); + label->setAlignment( AlignCenter ); + label->setMargin( 10 ); + label->setFrameStyle( TQFrame::Box | TQFrame::Sunken ); + grid->addMultiCellWidget( label, 4, 4, 1, 3 ); + +} + + +// +// Create and display a CursorView. +// + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); // application object + CursorView v; // cursor view + a.setMainWidget( &v ); + v.setCaption("TQt Example - Cursors"); + v.show(); + return a.exec(); +} diff --git a/examples/cursor/cursor.doc b/examples/cursor/cursor.doc new file mode 100644 index 000000000..4bee6d87d --- /dev/null +++ b/examples/cursor/cursor.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page cursor-example.html + + \ingroup examples + \title Cursors + + This example shows how to set a mouse cursor for a widget. + + <hr> + + Implementation: + + \include cursor/cursor.cpp + +*/ + diff --git a/examples/cursor/cursor.pro b/examples/cursor/cursor.pro new file mode 100644 index 000000000..23f659356 --- /dev/null +++ b/examples/cursor/cursor.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = cursor + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = small-config + +HEADERS = +SOURCES = cursor.cpp diff --git a/examples/customlayout/border.cpp b/examples/customlayout/border.cpp new file mode 100644 index 000000000..533b3b635 --- /dev/null +++ b/examples/customlayout/border.cpp @@ -0,0 +1,226 @@ +/**************************************************************************** +** +** Implementing your own layout: flow example +** +** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "border.h" + +class BorderLayoutIterator : public TQGLayoutIterator +{ +public: + BorderLayoutIterator( const TQPtrList<BorderLayout::BorderLayoutStruct> *l ) + : idx( 0 ) , list( (TQPtrList<BorderLayout::BorderLayoutStruct>*)l ) + {} + + uint count() const; + TQLayoutItem *current(); + BorderLayout::BorderLayoutStruct *currentStruct(); + void toFirst(); + TQLayoutItem *next(); + TQLayoutItem *takeCurrent(); + BorderLayoutIterator &operator++(); + +private: + int idx; + TQPtrList<BorderLayout::BorderLayoutStruct> *list; + +}; + +uint BorderLayoutIterator::count() const +{ + return list->count(); +} + +TQLayoutItem *BorderLayoutIterator::current() +{ + return idx < (int)count() ? list->at( idx )->item : 0; +} + +BorderLayout::BorderLayoutStruct *BorderLayoutIterator::currentStruct() +{ + return idx < (int)count() ? list->at( idx ) : 0; +} + +void BorderLayoutIterator::toFirst() +{ + idx = 0; +} + +TQLayoutItem *BorderLayoutIterator::next() +{ + idx++; + return current(); +} + +TQLayoutItem *BorderLayoutIterator::takeCurrent() +{ + BorderLayout::BorderLayoutStruct *b + = idx < int( list->count() ) ? list->take( idx ) : 0; + TQLayoutItem *item = b ? b->item : 0; + delete b; + return item; +} + +BorderLayoutIterator &BorderLayoutIterator::operator++() +{ + next(); + return *this; +} + +BorderLayout::~BorderLayout() +{ + deleteAllItems(); +} + + +void BorderLayout::addItem( TQLayoutItem *item ) +{ + add( item, West ); +} + +void BorderLayout::addWidget( TQWidget *widget, Position pos ) +{ + add( new BorderWidgetItem( widget ), pos ); +} + +void BorderLayout::add( TQLayoutItem *item, Position pos ) +{ + list.append( new BorderLayoutStruct( item, pos ) ); + sizeDirty = TRUE; msizeDirty = TRUE; + calcSize( SizeHint ); calcSize( Minimum ); +} + +bool BorderLayout::hasHeightForWidth() const +{ + return FALSE; +} + +TQSize BorderLayout::sizeHint() const +{ + return cached; +} + +TQSize BorderLayout::minimumSize() const +{ + return cached; +} + +TQSizePolicy::ExpandData BorderLayout::expanding() const + +{ + return TQSizePolicy::BothDirections; +} + +TQLayoutIterator BorderLayout::iterator() +{ + return TQLayoutIterator( new BorderLayoutIterator( &list ) ); +} + +void BorderLayout::setGeometry( const TQRect &rct ) +{ + TQLayout::setGeometry( rct ); + doLayout( rct ); +} + +void BorderLayout::doLayout( const TQRect &rct, bool /*testonly*/ ) +{ + int ew = 0, ww = 0, nh = 0, sh = 0; + int h = 0; + + BorderLayoutIterator it( &list ); + BorderLayoutStruct *o; + BorderLayoutStruct *center = 0; + while ( ( o = it.currentStruct() ) != 0 ) { + ++it; + + if ( o->pos == North ) { + o->item->setGeometry( TQRect( rct.x(), nh, rct.width(), o->item->sizeHint().height() ) ); + nh += o->item->geometry().height() + spacing(); + } + if ( o->pos == South ) { + o->item->setGeometry( TQRect( o->item->geometry().x(), o->item->geometry().y(), + rct.width(), o->item->sizeHint().height() ) ); + sh += o->item->geometry().height() + spacing(); + o->item->setGeometry( TQRect( rct.x(), rct.y() + rct.height() - sh + spacing(), + o->item->geometry().width(), o->item->geometry().height() ) ); + } + if ( o->pos == Center ) + center = o; + } + + h = rct.height() - nh - sh; + + it.toFirst(); + while ( ( o = it.currentStruct() ) != 0 ) { + ++it; + + if ( o->pos == West ) { + o->item->setGeometry( TQRect( rct.x() + ww, nh, o->item->sizeHint().width(), h ) ); + ww += o->item->geometry().width() + spacing(); + } + if ( o->pos == East ) { + o->item->setGeometry( TQRect( o->item->geometry().x(), o->item->geometry().y(), + o->item->sizeHint().width(), h ) ); + ew += o->item->geometry().width() + spacing(); + o->item->setGeometry( TQRect( rct.x() + rct.width() - ew + spacing(), nh, + o->item->geometry().width(), o->item->geometry().height() ) ); + } + } + + if ( center ) + center->item->setGeometry( TQRect( ww, nh, rct.width() - ew - ww, h ) ); +} + +void BorderLayout::calcSize( SizeType st ) +{ + if ( ( st == Minimum && !msizeDirty ) || + ( st == SizeHint && !sizeDirty ) ) + return; + + int w = 0, h = 0; + + BorderLayoutIterator it( &list ); + BorderLayoutStruct *o; + while ( ( o = it.currentStruct() ) != 0 ) { + ++it; + if ( o->pos == North || + o->pos == South ) { + if ( st == Minimum ) + h += o->item->minimumSize().height(); + else + h += o->item->sizeHint().height(); + } + else if ( o->pos == West || + o->pos == East ) { + if ( st == Minimum ) + w += o->item->minimumSize().width(); + else + w += o->item->sizeHint().width(); + } else { + if ( st == Minimum ) { + h += o->item->minimumSize().height(); + w += o->item->minimumSize().width(); + } + else { + h += o->item->sizeHint().height(); + w += o->item->sizeHint().width(); + } + } + } + + if ( st == Minimum ) { + msizeDirty = FALSE; + mcached = TQSize( w, h ); + } else { + sizeDirty = FALSE; + cached = TQSize( w, h ); + } + + return; +} diff --git a/examples/customlayout/border.h b/examples/customlayout/border.h new file mode 100644 index 000000000..fcab38acd --- /dev/null +++ b/examples/customlayout/border.h @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Definition of simple flow layout for custom layout example +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef BORDER_H +#define BORDER_H + +#include <qlayout.h> +#include <qptrlist.h> + +class BorderWidgetItem : public TQWidgetItem +{ +public: + BorderWidgetItem( TQWidget *w ) + : TQWidgetItem( w ) + {} + + void setGeometry( const TQRect &r ) + { widget()->setGeometry( r ); } + +}; + +class BorderLayout : public TQLayout +{ +public: + enum Position { + West = 0, + North, + South, + East, + Center + }; + + struct BorderLayoutStruct + { + BorderLayoutStruct( TQLayoutItem *i, Position p ) { + item = i; + pos = p; + } + + TQLayoutItem *item; + Position pos; + }; + + enum SizeType { + Minimum = 0, + SizeHint + }; + + BorderLayout( TQWidget *parent, int border = 0, int autoBorder = -1, + const char *name = 0 ) + : TQLayout( parent, border, autoBorder, name ), cached( 0, 0 ), mcached( 0, 0 ), + sizeDirty( TRUE ), msizeDirty( TRUE ) + {} + + BorderLayout( TQLayout* parent, int autoBorder = -1, const char *name = 0 ) + : TQLayout( parent, autoBorder, name ), cached( 0, 0 ), mcached( 0, 0 ), + sizeDirty( TRUE ), msizeDirty( TRUE ) + {} + + BorderLayout( int autoBorder = -1, const char *name = 0 ) + : TQLayout( autoBorder, name ), cached( 0, 0 ), mcached( 0, 0 ), + sizeDirty( TRUE ), msizeDirty( TRUE ) + {} + + ~BorderLayout(); + + void addItem( TQLayoutItem *item ); + + void addWidget( TQWidget *widget, Position pos ); + void add( TQLayoutItem *item, Position pos ); + + bool hasHeightForWidth() const; + + TQSize sizeHint() const; + TQSize minimumSize() const; + + TQLayoutIterator iterator(); + + TQSizePolicy::ExpandData expanding() const; + +protected: + void setGeometry( const TQRect &rect ); + +private: + void doLayout( const TQRect &rect, bool testonly = FALSE ); + void calcSize( SizeType st ); + + TQPtrList<BorderLayoutStruct> list; + TQSize cached, mcached; + bool sizeDirty, msizeDirty; + +}; + +#endif diff --git a/examples/customlayout/card.cpp b/examples/customlayout/card.cpp new file mode 100644 index 000000000..dc3964e82 --- /dev/null +++ b/examples/customlayout/card.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Implementing your own layout: flow example +** +** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "card.h" + +class CardLayoutIterator :public TQGLayoutIterator +{ +public: + CardLayoutIterator( TQPtrList<TQLayoutItem> *l ) + : idx( 0 ), list( l ) {} + + TQLayoutItem *current(); + TQLayoutItem *next(); + TQLayoutItem *takeCurrent(); + +private: + int idx; + TQPtrList<TQLayoutItem> *list; +}; + +TQLayoutItem *CardLayoutIterator::current() +{ + return idx < int( list->count() ) ? list->at( idx ) : 0; +} + +TQLayoutItem *CardLayoutIterator::next() +{ + idx++; return current(); +} + +TQLayoutItem *CardLayoutIterator::takeCurrent() +{ + return idx < int( list->count() ) ?list->take( idx ) : 0; +} + + + +TQLayoutIterator CardLayout::iterator() +{ + return TQLayoutIterator( new CardLayoutIterator( &list ) ); +} + +CardLayout::~CardLayout() +{ + deleteAllItems(); +} + +void CardLayout::addItem( TQLayoutItem *item ) +{ + list.append( item ); +} + +void CardLayout::setGeometry( const TQRect &rct ) +{ + TQLayout::setGeometry( rct ); + + TQPtrListIterator<TQLayoutItem> it( list ); + if ( it.count() == 0 ) + return; + + TQLayoutItem *o; + + int i = 0; + + int w = rct.width() - ( list.count() - 1 ) * spacing(); + int h = rct.height() - ( list.count() - 1 ) * spacing(); + + while ( ( o=it.current() ) != 0 ) { + ++it; + TQRect geom( rct.x() + i * spacing(), rct.y() + i * spacing(), + w, h ); + o->setGeometry( geom ); + ++i; + } +} + +TQSize CardLayout::sizeHint() const +{ + TQSize s(0,0); + int n = list.count(); + if ( n > 0 ) + s = TQSize(100,70); //start with a nice default size + TQPtrListIterator<TQLayoutItem> it(list); + TQLayoutItem *o; + while ( (o=it.current()) != 0 ) { + ++it; + s = s.expandedTo( o->minimumSize() ); + } + return s + n*TQSize(spacing(),spacing()); +} + +TQSize CardLayout::minimumSize() const +{ + TQSize s(0,0); + int n = list.count(); + TQPtrListIterator<TQLayoutItem> it(list); + TQLayoutItem *o; + while ( (o=it.current()) != 0 ) { + ++it; + s = s.expandedTo( o->minimumSize() ); + } + return s + n*TQSize(spacing(),spacing()); +} diff --git a/examples/customlayout/card.h b/examples/customlayout/card.h new file mode 100644 index 000000000..846bde9f4 --- /dev/null +++ b/examples/customlayout/card.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Definition of simple flow layout for custom layout example +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef CARD_H +#define CARD_H + +#include <qlayout.h> +#include <qptrlist.h> + +class CardLayout : public TQLayout +{ +public: + CardLayout( TQWidget *parent, int dist ) + : TQLayout( parent, 0, dist ) {} + CardLayout( TQLayout* parent, int dist) + : TQLayout( parent, dist ) {} + CardLayout( int dist ) + : TQLayout( dist ) {} + ~CardLayout(); + + void addItem( TQLayoutItem *item ); + TQSize sizeHint() const; + TQSize minimumSize() const; + TQLayoutIterator iterator(); + void setGeometry( const TQRect &rect ); + +private: + TQPtrList<TQLayoutItem> list; + +}; + +#endif diff --git a/examples/customlayout/customlayout.doc b/examples/customlayout/customlayout.doc new file mode 100644 index 000000000..6cbc56df9 --- /dev/null +++ b/examples/customlayout/customlayout.doc @@ -0,0 +1,55 @@ +/* +*/ +/*! \page customlayout-example.html + + \ingroup examples + \title Customized Layoutmanager + + This examples demonstrates how to write customized layout (geometry) managers + like card layouts, border layout and flow layouts. + + See also: <a href="layout.html">Documentation of Geometry Management</a>. + + <hr> + + Header file of the flow layout: + + \include customlayout/flow.h + + <hr> + + Implementation of the flow layout: + + \include customlayout/flow.cpp + + <hr> + + Header file of the border layout: + + \include customlayout/border.h + + <hr> + + Implementation of the border layout: + + \include customlayout/border.cpp + + <hr> + + Header file of the card layout: + + \include customlayout/card.h + + <hr> + + Implementation of the card layout: + + \include customlayout/card.cpp + + <hr> + + Main: + + \include customlayout/main.cpp +*/ + diff --git a/examples/customlayout/customlayout.pro b/examples/customlayout/customlayout.pro new file mode 100644 index 000000000..f377f13be --- /dev/null +++ b/examples/customlayout/customlayout.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +TARGET = customlayout + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = border.h \ + card.h \ + flow.h +SOURCES = border.cpp \ + card.cpp \ + flow.cpp \ + main.cpp diff --git a/examples/customlayout/flow.cpp b/examples/customlayout/flow.cpp new file mode 100644 index 000000000..af1fdf5fe --- /dev/null +++ b/examples/customlayout/flow.cpp @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Implementing your own layout: flow example +** +** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "flow.h" + +class SimpleFlowIterator :public TQGLayoutIterator +{ +public: + SimpleFlowIterator( TQPtrList<TQLayoutItem> *l ) :idx(0), list(l) {} + uint count() const; + TQLayoutItem *current(); + TQLayoutItem *next(); + TQLayoutItem *takeCurrent(); + +private: + int idx; + TQPtrList<TQLayoutItem> *list; + +}; + +uint SimpleFlowIterator::count() const +{ + return list->count(); +} + +TQLayoutItem *SimpleFlowIterator::current() +{ + return idx < int(count()) ? list->at(idx) : 0; +} + +TQLayoutItem *SimpleFlowIterator::next() +{ + idx++; return current(); +} + +TQLayoutItem *SimpleFlowIterator::takeCurrent() +{ + return idx < int(count()) ? list->take( idx ) : 0; +} + +SimpleFlow::~SimpleFlow() +{ + deleteAllItems(); +} + + +int SimpleFlow::heightForWidth( int w ) const +{ + if ( cached_width != w ) { + //Not all C++ compilers support "mutable" yet: + SimpleFlow * mthis = (SimpleFlow*)this; + int h = mthis->doLayout( TQRect(0,0,w,0), TRUE ); + mthis->cached_hfw = h; + mthis->cached_width = w; + return h; + } + return cached_hfw; +} + +void SimpleFlow::addItem( TQLayoutItem *item) +{ + list.append( item ); +} + +bool SimpleFlow::hasHeightForWidth() const +{ + return TRUE; +} + +TQSize SimpleFlow::sizeHint() const +{ + return minimumSize(); +} + +TQSizePolicy::ExpandData SimpleFlow::expanding() const +{ + return TQSizePolicy::NoDirection; +} + +TQLayoutIterator SimpleFlow::iterator() +{ + return TQLayoutIterator( new SimpleFlowIterator( &list ) ); +} + +void SimpleFlow::setGeometry( const TQRect &r ) +{ + TQLayout::setGeometry( r ); + doLayout( r ); +} + +int SimpleFlow::doLayout( const TQRect &r, bool testonly ) +{ + int x = r.x(); + int y = r.y(); + int h = 0; //height of this line so far. + TQPtrListIterator<TQLayoutItem> it(list); + TQLayoutItem *o; + while ( (o=it.current()) != 0 ) { + ++it; + int nextX = x + o->sizeHint().width() + spacing(); + if ( nextX - spacing() > r.right() && h > 0 ) { + x = r.x(); + y = y + h + spacing(); + nextX = x + o->sizeHint().width() + spacing(); + h = 0; + } + if ( !testonly ) + o->setGeometry( TQRect( TQPoint( x, y ), o->sizeHint() ) ); + x = nextX; + h = TQMAX( h, o->sizeHint().height() ); + } + return y + h - r.y(); +} + +TQSize SimpleFlow::minimumSize() const +{ + TQSize s(0,0); + TQPtrListIterator<TQLayoutItem> it(list); + TQLayoutItem *o; + while ( (o=it.current()) != 0 ) { + ++it; + s = s.expandedTo( o->minimumSize() ); + } + return s; +} diff --git a/examples/customlayout/flow.h b/examples/customlayout/flow.h new file mode 100644 index 000000000..9429a4ffb --- /dev/null +++ b/examples/customlayout/flow.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Definition of simple flow layout for custom layout example +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef FLOW_H +#define FLOW_H + +#include <qlayout.h> +#include <qptrlist.h> + +class SimpleFlow : public TQLayout +{ +public: + SimpleFlow( TQWidget *parent, int border=0, int space=-1, + const char *name=0 ) + : TQLayout( parent, border, space, name ), + cached_width(0) {} + SimpleFlow( TQLayout* parent, int space=-1, const char *name=0 ) + : TQLayout( parent, space, name ), + cached_width(0) {} + SimpleFlow( int space=-1, const char *name=0 ) + : TQLayout( space, name ), + cached_width(0) {} + + ~SimpleFlow(); + + void addItem( TQLayoutItem *item); + bool hasHeightForWidth() const; + int heightForWidth( int ) const; + TQSize sizeHint() const; + TQSize minimumSize() const; + TQLayoutIterator iterator(); + TQSizePolicy::ExpandData expanding() const; + +protected: + void setGeometry( const TQRect& ); + +private: + int doLayout( const TQRect&, bool testonly = FALSE ); + TQPtrList<TQLayoutItem> list; + int cached_width; + int cached_hfw; + +}; + +#endif diff --git a/examples/customlayout/main.cpp b/examples/customlayout/main.cpp new file mode 100644 index 000000000..694fcf8fb --- /dev/null +++ b/examples/customlayout/main.cpp @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Main for custom layout example +** +** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "flow.h" +#include "border.h" +#include "card.h" + +#include <qapplication.h> +#include <qlabel.h> +#include <qcolor.h> +#include <qgroupbox.h> +#include <qpushbutton.h> +#include <qmultilineedit.h> +#include <qcolor.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + TQWidget *f = new TQWidget; + TQBoxLayout *gm = new TQVBoxLayout( f, 5 ); + + SimpleFlow *b1 = new SimpleFlow( gm ); + + b1->add( new TQPushButton( "Short", f ) ); + b1->add( new TQPushButton( "Longer", f ) ); + b1->add( new TQPushButton( "Different text", f ) ); + b1->add( new TQPushButton( "More text", f ) ); + b1->add( new TQPushButton( "Even longer button text", f ) ); + TQPushButton* qb = new TQPushButton( "Quit", f ); + a.connect( qb, SIGNAL( clicked() ), SLOT( tquit() ) ); + b1->add( qb ); + + TQWidget *wid = new TQWidget( f ); + + BorderLayout *large = new BorderLayout( wid ); + large->setSpacing( 5 ); + large->addWidget( new TQPushButton( "North", wid ), BorderLayout::North ); + large->addWidget( new TQPushButton( "West", wid ), BorderLayout::West ); + TQMultiLineEdit* m = new TQMultiLineEdit( wid ); + m->setText( "Central\nWidget" ); + large->addWidget( m, BorderLayout::Center ); + TQWidget *east1 = new TQPushButton( "East", wid ); + large->addWidget( east1, BorderLayout::East ); + TQWidget *east2 = new TQPushButton( "East 2", wid ); + large->addWidget( east2 , BorderLayout::East ); + large->addWidget( new TQPushButton( "South", wid ), BorderLayout::South ); + //Left-to-right tab order looks better: + TQWidget::setTabOrder( east2, east1 ); + gm->addWidget( wid ); + + + wid = new TQWidget( f ); + CardLayout *card = new CardLayout( wid, 10 ); + + TQWidget *crd = new TQWidget( wid ); + crd->setBackgroundColor( TQt::red ); + card->add( crd ); + crd = new TQWidget( wid ); + crd->setBackgroundColor( TQt::green ); + card->add( crd ); + crd = new TQWidget( wid ); + crd->setBackgroundColor( TQt::blue ); + card->add( crd ); + crd = new TQWidget( wid ); + crd->setBackgroundColor( TQt::white ); + card->add( crd ); + crd = new TQWidget( wid ); + crd->setBackgroundColor( TQt::black ); + card->add( crd ); + crd = new TQWidget( wid ); + crd->setBackgroundColor( TQt::yellow ); + card->add( crd ); + + gm->addWidget( wid ); + + TQLabel* s = new TQLabel( f ); + s->setText( "outermost box" ); + s->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + s->setAlignment( TQt::AlignVCenter | TQt::AlignHCenter ); + gm->addWidget( s ); + a.setMainWidget( f ); + f->setCaption("TQt Example - Custom Layout"); + f->show(); + + int result = a.exec(); + delete f; + return result; +} diff --git a/examples/dclock/README b/examples/dclock/README new file mode 100644 index 000000000..dfa58402f --- /dev/null +++ b/examples/dclock/README @@ -0,0 +1,5 @@ +The dclock program displays a digital LCD clock and can switch +between time and date. + +See also the aclock sample that displays an analog clock. + diff --git a/examples/dclock/dclock.cpp b/examples/dclock/dclock.cpp new file mode 100644 index 000000000..be7cc8539 --- /dev/null +++ b/examples/dclock/dclock.cpp @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "dclock.h" +#include <qdatetime.h> + + +// +// Constructs a DigitalClock widget with a parent and a name. +// + +DigitalClock::DigitalClock( TQWidget *parent, const char *name ) + : TQLCDNumber( parent, name ) +{ + showingColon = FALSE; + setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + setLineWidth( 2 ); // set frame line width + showTime(); // display the current time + normalTimer = startTimer( 500 ); // 1/2 second timer events + showDateTimer = -1; // not showing date +} + + +// +// Handles timer events for the digital clock widget. +// There are two different timers; one timer for updating the clock +// and another one for switching back from date mode to time mode. +// + +void DigitalClock::timerEvent( TQTimerEvent *e ) +{ + if ( e->timerId() == showDateTimer ) // stop showing date + stopDate(); + else { // normal timer + if ( showDateTimer == -1 ) // not showing date + showTime(); + } +} + +// +// Enters date mode when the left mouse button is pressed. +// + +void DigitalClock::mousePressEvent( TQMouseEvent *e ) +{ + if ( e->button() == TQMouseEvent::LeftButton ) // left button pressed + showDate(); +} + + +// +// Shows the current date in the internal lcd widget. +// Fires a timer to stop showing the date. +// + +void DigitalClock::showDate() +{ + if ( showDateTimer != -1 ) // already showing date + return; + TQDate date = TQDate::currentDate(); + TQString s; + s.sprintf( "%2d %2d", date.month(), date.day() ); + display( s ); // sets the LCD number/text + showDateTimer = startTimer( 2000 ); // keep this state for 2 secs +} + +// +// Stops showing the date. +// + +void DigitalClock::stopDate() +{ + killTimer( showDateTimer ); + showDateTimer = -1; + showTime(); +} + +// +// Shows the current time in the internal lcd widget. +// + +void DigitalClock::showTime() +{ + showingColon = !showingColon; // toggle/blink colon + TQString s = TQTime::currentTime().toString().left(5); + if ( !showingColon ) + s[2] = ' '; + if ( s[0] == '0' ) + s[0] = ' '; + display( s ); // set LCD number/text +} diff --git a/examples/dclock/dclock.doc b/examples/dclock/dclock.doc new file mode 100644 index 000000000..b341b6638 --- /dev/null +++ b/examples/dclock/dclock.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page dclock-example.html + + \ingroup examples + \title Digital Clock + + This example displays a digital LCD clock that can switch between time + and date. + + <hr> + + Header file: + + \include dclock/dclock.h + + <hr> + + Implementation: + + \include dclock/dclock.cpp + + <hr> + + Main: + + \include dclock/main.cpp +*/ + diff --git a/examples/dclock/dclock.h b/examples/dclock/dclock.h new file mode 100644 index 000000000..315c54221 --- /dev/null +++ b/examples/dclock/dclock.h @@ -0,0 +1,39 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef DCLOCK_H +#define DCLOCK_H + +#include <qlcdnumber.h> + + +class DigitalClock : public TQLCDNumber // digital clock widget +{ + Q_OBJECT +public: + DigitalClock( TQWidget *parent=0, const char *name=0 ); + +protected: // event handlers + void timerEvent( TQTimerEvent * ); + void mousePressEvent( TQMouseEvent * ); + +private slots: // internal slots + void stopDate(); + void showTime(); + +private: // internal data + void showDate(); + + bool showingColon; + int normalTimer; + int showDateTimer; +}; + + +#endif // DCLOCK_H diff --git a/examples/dclock/dclock.pro b/examples/dclock/dclock.pro new file mode 100644 index 000000000..f244d7a51 --- /dev/null +++ b/examples/dclock/dclock.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = dclock + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = dclock.h +SOURCES = dclock.cpp \ + main.cpp diff --git a/examples/dclock/main.cpp b/examples/dclock/main.cpp new file mode 100644 index 000000000..eb0dbc837 --- /dev/null +++ b/examples/dclock/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "dclock.h" +#include <qapplication.h> + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + DigitalClock *clock = new DigitalClock; + clock->resize( 170, 80 ); + a.setMainWidget( clock ); + clock->setCaption("TQt Example - Digital Clock"); + clock->show(); + return a.exec(); +} diff --git a/examples/demo/categoryinterface.h b/examples/demo/categoryinterface.h new file mode 100644 index 000000000..0d497eafa --- /dev/null +++ b/examples/demo/categoryinterface.h @@ -0,0 +1,32 @@ +#ifndef CATEGORYINTERFACE_H +#define CATEGORYINTERFACE_H + +#include <qstring.h> +#include <qiconset.h> +#include <qobject.h> + +class TQWidgetStack; + +class CategoryInterface : public TQObject +{ + Q_OBJECT + +public: + CategoryInterface( TQWidgetStack *s ) : stack( s ) {} + virtual ~CategoryInterface() {} + virtual TQString name() const = 0; + virtual TQIconSet icon() const = 0; + virtual int numCategories() const = 0; + virtual TQString categoryName( int i ) const = 0; + virtual TQIconSet categoryIcon( int i ) const = 0; + virtual int categoryOffset() const = 0; + +public slots: + virtual void setCurrentCategory( int i ) = 0; + +protected: + TQWidgetStack *stack; + +}; + +#endif diff --git a/examples/demo/demo.doc b/examples/demo/demo.doc new file mode 100644 index 000000000..10f713584 --- /dev/null +++ b/examples/demo/demo.doc @@ -0,0 +1,15 @@ +/*! \page demo-example.html + + \ingroup examples + \title Qt Demo + + This program shows off some of Qt's widgets and functionality. It + isn't intended as a code example, but rather as a single application + that you can run to see many of Qt's features. + + See $QTDIR/examples/demo for the source code. + +*/ + + + diff --git a/examples/demo/demo.pro b/examples/demo/demo.pro new file mode 100644 index 000000000..3413fcd04 --- /dev/null +++ b/examples/demo/demo.pro @@ -0,0 +1,105 @@ +TEMPLATE = app +TARGET = demo + +CONFIG += qt warn_off release +unix:LIBS += -lm +DEFINES += QT_INTERNAL_ICONVIEW +DEFINES += QT_INTERNAL_WORKSPACE +DEFINES += QT_INTERNAL_CANVAS +INCLUDEPATH += . +DEPENDPATH = ../../include + +REQUIRES = full-config nocrosscompiler + +HEADERS = frame.h \ + categoryinterface.h \ + qthumbwheel.h \ + display.h \ + textdrawing/textedit.h \ + textdrawing/helpwindow.h \ + dnd/dnd.h \ + dnd/styledbutton.h \ + dnd/iconview.h \ + dnd/listview.h \ + i18n/i18n.h \ + i18n/wrapper.h \ + ../aclock/aclock.h +SOURCES = frame.cpp \ + qthumbwheel.cpp \ + display.cpp \ + textdrawing/textedit.cpp \ + textdrawing/helpwindow.cpp \ + dnd/dnd.cpp \ + dnd/styledbutton.cpp \ + dnd/iconview.cpp \ + dnd/listview.cpp \ + i18n/i18n.cpp \ + ../aclock/aclock.cpp \ + main.cpp + +FORMS = dnd/dndbase.ui + +include( ../../src/qt_professional.pri ) + +canvas { + HEADERS +=graph.h \ + qasteroids/toplevel.h \ + qasteroids/view.h \ + qasteroids/ledmeter.h + SOURCES +=graph.cpp \ + qasteroids/toplevel.cpp \ + qasteroids/view.cpp \ + qasteroids/ledmeter.cpp +} + +opengl { + HEADERS +=opengl/glworkspace.h \ + opengl/glcontrolwidget.h \ + opengl/gltexobj.h \ + opengl/glbox.h \ + opengl/glgear.h \ + opengl/gllandscape.h \ + opengl/fbm.h \ + opengl/glinfo.h \ + opengl/glinfotext.h + SOURCES +=opengl/glworkspace.cpp \ + opengl/glcontrolwidget.cpp \ + opengl/gltexobj.cpp \ + opengl/glbox.cpp \ + opengl/glgear.cpp \ + opengl/gllandscape.cpp \ + opengl/fbm.c + win32 { + SOURCES +=opengl/glinfo_win.cpp + } mac { + SOURCES +=opengl/glinfo_mac.cpp + LIBS +=-framework Carbon + } else:unix { + SOURCES +=opengl/glinfo_x11.cpp + } + + FORMS +=opengl/printpreview.ui \ + opengl/gllandscapeviewer.ui + + CONFIG -= dlopen_opengl +} + +sql { + FORMS +=sql/connect.ui \ + sql/sqlex.ui +} + +table { + FORMS +=widgets/widgetsbase.ui +} + +!table { + FORMS +=widgets/widgetsbase_pro.ui +} + +TRANSLATIONS = translations/demo_ar.ts \ + translations/demo_de.ts \ + translations/demo_fr.ts \ + translations/demo_he.ts + +PRECOMPILED_HEADER = demo_pch.h diff --git a/examples/demo/demo_pch.h b/examples/demo/demo_pch.h new file mode 100644 index 000000000..b80e6469e --- /dev/null +++ b/examples/demo/demo_pch.h @@ -0,0 +1,13 @@ +/* + * This is a precompiled header file for use in Xcode / Mac GCC / + * GCC >= 3.4 / VC to greatly speed the building of the Demo example. + * It may also be of use to people developing their own project, but + * it is probably better to define your own header. Use of this + * header is currently UNSUPPORTED. + */ + +#if defined __cplusplus + +#include "../../src/kernel/qt_pch.h" + +#endif diff --git a/examples/demo/display.cpp b/examples/demo/display.cpp new file mode 100644 index 000000000..659f2c874 --- /dev/null +++ b/examples/demo/display.cpp @@ -0,0 +1,230 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "display.h" + +#include <qpainter.h> +#include <qlayout.h> +#include <qtimer.h> +#include <qpushbutton.h> +#include <qframe.h> +#include <qdial.h> +#include <qlcdnumber.h> +#include <qprogressbar.h> +#include <qspinbox.h> + +#include <math.h> + +Screen::Screen( TQWidget *parent, const char *name ) + : TQFrame( parent, name ) +{ + setLineWidth( FrameWidth ); + setFrameStyle( Panel | Sunken ); + setBackgroundMode( PaletteBase ); + setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ); + setPaletteBackgroundColor( black ); + setPaletteForegroundColor( blue ); + + yval = new int[width()]; + memset( yval, 0, sizeof(int)*width() ); + pos0 = 0; + t0 = 0; + step = 0; +} + +Screen::~Screen() +{ + delete yval; +} + +void Screen::resizeEvent( TQResizeEvent *e ) +{ + delete yval; + int w = e->size().width(); + yval = new int[w]; + memset( yval, 0, sizeof(int)*w); +} + +void Screen::animate() +{ + if ( step == 0 ) + return; + + int t = t0; + int p = pos0; + if ( step < 0 ) { + t += width() + step; + } else { + t -= step; + p -= step; + if ( p < 0 ) + p += width(); + } + + for ( int i = 0; i < TQABS( step ); i++ ) { + int y = (int)((height()-FrameWidth)/2 * sin( 3.1415*(double)t/180.0 )); + yval[ p ] = y; + ++t; + t %= 360; + ++p; + p %= width(); + } + t0 -= step; + if ( t0 < 0 ) + t0 += 360; + pos0 = (pos0 - step) % width(); + if ( pos0 < 0 ) + pos0 += width(); + + scroll( step, 0, TQRect( FrameWidth, FrameWidth, width()-2*FrameWidth, height()-2*FrameWidth )); +} + +void Screen::setStep( int s ) +{ + step = s; +} + +void Screen::drawContents( TQPainter *p ) +{ + TQRect r = p->hasClipping() ? + p->clipRegion().boundingRect() : contentsRect(); + + int vp = ( r.left() - FrameWidth + pos0 ) % width(); + int y0 = FrameWidth + height()/2; + + for ( int x = r.left(); x <= r.right(); x++ ) { + p->drawLine( x, y0 + yval[ vp ], x, r.bottom()); + ++vp; + vp %= width(); + } +} + +/***********************************************************************/ + +Curve::Curve( TQWidget *parent, const char *name ) + : TQFrame( parent, name ) +{ + setLineWidth( FrameWidth ); + setFrameStyle( Panel | Sunken ); + setBackgroundMode( PaletteBase ); + setPaletteBackgroundColor(black); + setPaletteForegroundColor(red); + setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ); + + shift = 0; + n = 1; +} + +void Curve::drawContents( TQPainter *p ) +{ + p->moveTo( width()/2, height()/2 + (int)(90.0*sin( double(shift)*3.1415/180.0))); + + for ( double a = 0.0; a < 360.0; a += 1.0 ) { + double rad = 3.1415 / 180.0 * a; + double x = width()/2 + 90.0 * sin(rad); + double y = height()/2 + 90.0 * sin(n * rad + double(shift)*3.1415/180.0); + p->lineTo( int(x), int(y) ); + } +} + +void Curve::animate() +{ + shift = (shift + 1) % 360; + update( FrameWidth, FrameWidth, width() - 2*FrameWidth, height() - 2*FrameWidth ); +} + +void Curve::setFactor( int f ) +{ + n = f; +} + +/***********************************************************************/ + +DisplayWidget::DisplayWidget( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + timer = 0; + + TQVBoxLayout *vbox = new TQVBoxLayout( this, 10 ); + + TQHBoxLayout *hbox = new TQHBoxLayout( vbox ); + screen = new Screen( this ); + dial = new TQDial( this ); + dial->setNotchesVisible( TRUE ); + dial->setRange( -10, 10 ); + dial->setValue( 1 ); + screen->setStep( dial->value() ); + connect( dial, SIGNAL( valueChanged( int )), + screen, SLOT( setStep( int ))); + lcd = new TQLCDNumber( 2, this ); + lcd->setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::Preferred ); + lcdval = 0; + + hbox->addWidget( screen ); + + TQVBoxLayout *vb2 = new TQVBoxLayout( hbox ); + + curve = new Curve( this ); + spin = new TQSpinBox( 1, 10, 1, this ); + connect( spin, SIGNAL( valueChanged( int )), curve, SLOT( setFactor( int ))); + spin->setValue( 2 ); + vb2->addWidget( curve ); + vb2->addWidget( spin ); + + TQHBoxLayout *hbox2 = new TQHBoxLayout( vb2 ); + + hbox2->addWidget( dial ); + hbox2->addWidget( lcd ); + + bar = new TQProgressBar( 10, this ); + tbar = 0; + + vbox->addWidget( bar ); +} + +void DisplayWidget::run() +{ + if ( !timer ) { + timer = new TQTimer( this ); + connect( timer, SIGNAL( timeout() ), SLOT( tick() ) ); + } + + timer->start( 5 ); +} + +void DisplayWidget::stop() +{ + timer->stop(); +} + +void DisplayWidget::tick() +{ + // sine + screen->animate(); + // Lissajous + curve->animate(); + // lcd display + lcd->display( ++lcdval % 100 ); + // progress bar + bar->setProgress( 5 + (int)(5*sin( 3.1415 * (double)tbar / 180.0 ))); + ++tbar; + tbar %= 360; +} + +void DisplayWidget::showEvent( TQShowEvent * ) +{ + run(); + screen->repaint(); +} + +void DisplayWidget::hideEvent( TQHideEvent * ) +{ + stop(); +} + diff --git a/examples/demo/display.h b/examples/demo/display.h new file mode 100644 index 000000000..68e6843c1 --- /dev/null +++ b/examples/demo/display.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef DISPLAY_H +#define DISPLAY_H + +#ifndef QT_H +#include <qwidget.h> +#include <qframe.h> +#endif // QT_H + +class TQTimer; +class TQDial; +class TQLCDNumber; +class TQProgressBar; +class TQSpinBox; +class Screen; +class Curve; + +class DisplayWidget : public TQWidget { + Q_OBJECT +public: + DisplayWidget( TQWidget *parent=0, const char *name=0 ); + + void run(); + void stop(); + +protected: + virtual void showEvent( TQShowEvent * ); + virtual void hideEvent( TQHideEvent * ); + +private slots: + void tick(); + +private: + Screen *screen; + TQDial *dial; + Curve *curve; + TQSpinBox *spin; + TQLCDNumber *lcd; + int lcdval; + TQProgressBar *bar; + int tbar; + TQTimer *timer; +}; + +class Screen : public TQFrame { + Q_OBJECT +public: + enum { FrameWidth = 3 }; + Screen( TQWidget *parent=0, const char *name=0 ); + ~Screen(); + + void animate(); + +public slots: + void setStep( int s ); + +protected: + virtual void drawContents( TQPainter * ); + virtual void resizeEvent( TQResizeEvent * ); + +private: + int *yval; + int pos0; // buffer pointer for x == 0 + int t0; // time parameter at x == 0 + int step; +}; + +class Curve : public TQFrame { + Q_OBJECT + enum { FrameWidth = 3 }; +public: + Curve( TQWidget *parent=0, const char *name=0 ); + + void animate(); +public slots: + void setFactor( int ); + +protected: + virtual void drawContents( TQPainter * ); + +private: + int shift, n; +}; + +#endif // PLOT_H diff --git a/examples/demo/dnd/dnd.cpp b/examples/demo/dnd/dnd.cpp new file mode 100644 index 000000000..00501f5df --- /dev/null +++ b/examples/demo/dnd/dnd.cpp @@ -0,0 +1,120 @@ +#include <qiconview.h> +#include <qdragobject.h> +#include <qlayout.h> +#include <qmultilineedit.h> + +#include "dnd.h" +#include "styledbutton.h" +#include "listview.h" +#include "iconview.h" + +DnDDemo::DnDDemo( TQWidget* parent, const char* name ) + : DnDDemoBase( parent, name ) +{ + buttonPixmap1->setEditor( StyledButton::PixmapEditor ); + buttonPixmap2->setEditor( StyledButton::PixmapEditor ); + buttonPixmap3->setEditor( StyledButton::PixmapEditor ); + buttonPixmap4->setEditor( StyledButton::PixmapEditor ); + + multiLine1->setTextFormat( RichText ); + multiLine1->setText( "<p><b>Faust</b> - <i>Goethe</i></p>" + "Habe nun, ach! Philosophie,<br>" + "Juristerei und Medizin,<br>" + "Und leider auch Theologie<br>" + "Durchaus studiert, mit heißem Bemühn.<br>" + "Da steh ich nun, ich armer Tor!<br>" + "Und bin so klug als wie zuvor;<br>" + "Heiße Magister, heiße Doktor gar<br>" + "Und ziehe schon an die zehen Jahr<br>" + "Herauf, herab und quer und krumm<br>" + "Meine Schüler an der Nase herum-<br>" + "Und sehe, daß wir nichts wissen können!<br>" + "Das will mir schier das Herz verbrennen.<br>" + "Zwar bin ich gescheiter als all die Laffen,<br>" + "Doktoren, Magister, Schreiber und Pfaffen;<br>" + "Mich plagen keine Skrupel noch Zweifel,<br>" + "Fürchte mich weder vor Hölle noch Teufel-<br>" + "Dafür ist mir auch alle Freud entrissen,<br>" + "Bilde mir nicht ein, was Rechts zu wissen,<br>" + "Bilde mir nicht ein, ich könnte was lehren,<br>" + "Die Menschen zu bessern und zu bekehren.<br>" + "Auch hab ich weder Gut noch Geld,<br>" + "Noch Ehr und Herrlichkeit der Welt;<br>" + "Es möchte kein Hund so länger leben!<br>" + "Drum hab ich mich der Magie ergeben,<br>" + "Ob mir durch Geistes Kraft und Mund<br>" + "Nicht manch Geheimnis würde kund;<br>" + "Daß ich nicht mehr mit saurem Schweiß<br>" + "Zu sagen brauche, was ich nicht weiß;<br>" + "Daß ich erkenne, was die Welt<br>" + "Im Innersten zusammenhält,<br>" + "Schau alle Wirkenskraft und Samen,<br>" + "Und tu nicht mehr in Worten kramen. <br>" ); + + multiLine2->setTextFormat( RichText ); + multiLine2->setText( "<p><b>To Milton</b> - <i>Oscar Wilde</i></p>" + "Milton! I think thy spirit hath passed away<br>" + "From these white cliffs and high-embattled towers;<br>" + "This gorgeous fiery-coloured world of ours<br>" + "Seems fallen into ashes dull and grey,<br>" + "And the age changed unto a mimic play<br>" + "Wherein we waste our else too-crowded hours:<br>" + "For all our pomp and pageantry and powers<br>" + "We are but fit to delve the common clay,<br>" + "Seeing this little isle on which we stand,<br>" + "This England, this sea-lion of the sea,<br>" + "By ignorant demagogues is held in fee,<br>" + "Who love her not: Dear God! is this the land<br>" + "Which bare a triple empire in her hand<br>" + "When Cromwell spake the word Democracy!<br>" ); + + + items.insert( tr("copy"), IconItem( tr("Copy"), "editcopy.png" ) ); + items.insert( tr("cut"), IconItem( tr("Cut"), "editcut.png" )); + items.insert( tr("paste"), IconItem( tr("Paste"), "editpaste.png" )); + items.insert( tr("raise"), IconItem( tr("Raise"), "editraise.png" )); + items.insert( tr("lower"), IconItem( tr("Lower"), "editlower.png" )); + items.insert( tr("new"), IconItem( tr("New"), "filenew.png" )); + items.insert( tr("load"), IconItem( tr("Load"), "fileopen.png" )); + items.insert( tr("save"), IconItem( tr("Save"), "filesave.png" )); + items.insert( tr("undo"), IconItem( tr("Undo"), "undo.png" )); + items.insert( tr("redo"), IconItem( tr("Redo"), "redo.png" )); + items.insert( tr("delete"), IconItem( tr("Delete"), "editdelete.png" )); + items.insert( tr("help"), IconItem( tr("Help"), "help.png" )); + items.insert( tr("home"), IconItem( tr("Home"), "home.png" )); + + listView->addColumn( tr("Actions"), 240 ); + listView->setColumnWidthMode( 0, TQListView::Maximum ); + + TQMap<TQString,IconItem>::Iterator it; + for( it = items.begin(); it != items.end(); ++it ) { + IconItem item = it.data(); + + TQIconViewItem *iitem = new IconViewItem( iconView, item.name(), *item.pixmap(), it.key() ); + iitem->setRenameEnabled( TRUE ); + TQListViewItem *litem = new ListViewItem( listView, item.name(), it.key() ); + litem->setPixmap( 0, *item.pixmap() ); + } +} + +DnDDemo::~DnDDemo() +{ + +} + +IconItem::IconItem( const TQString& name, const TQString& icon ) +{ + _name = name; + _pixmap = loadPixmap( icon ); +} + +TQPixmap IconItem::loadPixmap( const TQString& name ) +{ + TQPixmap pix( "textdrawing/" + name ); + return pix; +} + +IconItem DnDDemo::findItem( const TQString& tag ) +{ + return items[ tag ]; +} diff --git a/examples/demo/dnd/dnd.h b/examples/demo/dnd/dnd.h new file mode 100644 index 000000000..311360daf --- /dev/null +++ b/examples/demo/dnd/dnd.h @@ -0,0 +1,40 @@ +#include <qpixmap.h> +#include <qmap.h> +#include "dndbase.h" + +#ifndef DNDDEMO_H +#define DNDDEMO_H + +class IconItem +{ +public: + IconItem( const TQString& name = TQString::null, const TQString& icon = TQString::null ); + + TQString name() { return _name; } + TQPixmap *pixmap() { return &_pixmap; } + + Q_DUMMY_COMPARISON_OPERATOR( IconItem ) + +protected: + TQPixmap loadPixmap( const TQString& name ); + +private: + TQString _name; + TQPixmap _pixmap; +}; + +class DnDDemo : public DnDDemoBase +{ + Q_OBJECT + +public: + DnDDemo( TQWidget* parent = 0, const char* name = 0 ); + ~DnDDemo(); + + IconItem findItem( const TQString& tag ); + +private: + TQMap<TQString,IconItem> items; +}; + +#endif diff --git a/examples/demo/dnd/dndbase.ui b/examples/demo/dnd/dndbase.ui new file mode 100644 index 000000000..73d325304 --- /dev/null +++ b/examples/demo/dnd/dndbase.ui @@ -0,0 +1,355 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>DnDDemoBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>DnDDemoBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>677</width> + <height>586</height> + </rect> + </property> + <property name="caption"> + <string>Form1</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonColor1</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="color" stdset="0"> + <color> + <red>255</red> + <green>0</green> + <blue>0</blue> + </color> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonColor2</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="color" stdset="0"> + <color> + <red>0</red> + <green>170</green> + <blue>0</blue> + </color> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonColor3</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="color" stdset="0"> + <color> + <red>0</red> + <green>0</green> + <blue>255</blue> + </color> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonColor4</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="color" stdset="0"> + <color> + <red>255</red> + <green>255</green> + <blue>0</blue> + </color> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonPixmap1</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="pixmap" stdset="0"> + <pixmap>image0</pixmap> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonPixmap2</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="pixmap" stdset="0"> + <pixmap>image1</pixmap> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonPixmap3</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="pixmap" stdset="0"> + <pixmap>image2</pixmap> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonPixmap4</cstring> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="pixmap" stdset="0"> + <pixmap>image3</pixmap> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="ListView" row="0" column="1"> + <property name="name"> + <cstring>listView</cstring> + </property> + </widget> + <widget class="IconView" row="0" column="0"> + <property name="name"> + <cstring>iconView</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="TQTextEdit" row="1" column="0"> + <property name="name"> + <cstring>multiLine1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>2</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="TQTextEdit" row="1" column="1"> + <property name="name"> + <cstring>multiLine2</cstring> + </property> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>StyledButton</class> + <header location="local">styledbutton.h</header> + <sizehint> + <width>40</width> + <height>25</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image4</pixmap> + <signal>clicked()</signal> + <signal>changed()</signal> + <property type="Color">color</property> + <property type="Pixmap">pixmap</property> + <property type="Bool">scale</property> + </customwidget> + <customwidget> + <class>IconView</class> + <header location="local">iconview.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image5</pixmap> + </customwidget> + <customwidget> + <class>ListView</class> + <header location="local">listview.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image5</pixmap> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="72495">789cecbd49732339b6a8b97fbfa2ec6277adcd1f4989d3a217a4268a1225512229896dbd80033ecf13a7f7e71bf0730e24454466466456559659df92b1949fdc89f18c00dce37ffff73fde9e16fff8effffdbfaa9ad781f887f079f98fff964d921cff9ffff7fffe3fffebbfba83ce3fbabdf13fbae3eee01fbdfffabffed77f59f63fc43f1eb2d469817d8265fdf90a57c03aedff34476786479ae30171b7bd9ede1b6eaf7b11f2397c5f370e19bebf2086ef270fc823b8bfa0fb4778dd4516707dff0cdcc3f20ef8fd9ee88ddbf69eb73ca2f6c74f86dbfb0b498ced0f0db7d7a347646c7ffc6018da7f24c6f69d1986eb7de25e7bdd65c8d8bfe8c2707b7fde2586f2e2a5e1f6bab347c6fee7aee1f67ac389e1fb3e7ebf8bfd9f08646c6f798f3c82f61503642cafde11c3fdc777c3edf5e310b887e3777c2586f2f6d8bf1ef6fff8868cfd396e8861be2abcee0c642b7f8701b13368af47c81cb81c1a6eefafee34778d7c156b621ccf33641aff4bc3d0df8818eecf1686613e63641cffc036dc5ecf36c4f07d6b0f4ce39f7886dbfb937362b8bfd911c378c536f159b7bdff1119e571fa6a18ca1b20637f1afa3ef6e7f8440ce51f12c330fed8fe2ef6af792786efd78d6198bf2d319457af0cb7e525381f3decff2e35dc7e7f1f1143f9076618caef10a33c2586dbf24fe7c4303ed5abe1f67a43f5e3fceffb86c15ed8c4505e732286f2f6541e8e5715186eefdf5d10c3fd271719c7e3f0488cd71de033d4873d8ef7199677b82286fb0f63e0f3d1396fdb87e50f64bf35e3fb0c58f664bf6d0fde2f515f9a033217b2659c2fe9c0f5fd10d8a1ef2f89f1fb0bc3ad7eed0432e9e31419f5f140e571b7e51dea97e340f9d58418ca2b1f88e1feb2047607aedbea576b0fbbc6de796fc0469ffac430bfbb29318c6f2388613c778fc8a83f3234dccac3f48c18e5bd360cfa352786f27799e176fed22132eadf91ea2379b92186f6144bc3a02f97c8d85f3937dc9657dd1343fbbc3bc3edf513b517f5afcc89a1be10c783f4316286c15ec4c4d8ff67c3601f5f88511f8ec4209f01dd8fe35b2e89717eee0d437ba93d389e8d67b86dffd122c6f9cb89a1beba44c6f13e507968ef4e9218e7ab6718ec878d4cf6ad2046fdb50cc3fd3362d44f4e0ced39a23c9ee1f8ed1d622cef60b82dafc0f93dc3f12876c4e82fcf91b13d7bd0efd17907f47f87f37f8ee355d6c4e760bf70be06dd417b7ff9842c076d7b0be4617768b7e38fe335ea8f5ade6d91c7a3b3f6fbd8bff1782cdafee07cf22e3f6fc70ffb47f6a6de1083feef57865bfd6f707ca403f7ef3ac478ff9a18eccbb1300cf608dbabec57cbb520c6f8a0320cf104eaab33407b9812a37d1a1a6eef3f96c4609fea0532f6a7b689a1fce29c18eeaf501fc8fe351bc310afbc13437b77b7c02ef6e770438cf636360cf6f39118ede70099ec67fbfd9e89378e0fc418cf1c90515fbdade1f67a7a490cf2eccc9051dffc9c18e32561b8bd5e9e88417e4f8161b0773e32da3b471a867897da87fa79280dc3f52931966fca437dad88c1beca3b60b27f9c196ecbe32e31da8327c350df2d31c63bb161f0df97c418af5d20e378ba39318ee79a18caf31d62f8be6f21e378365d62b40f03648ad7e97e1cafddd130e4174362b4dfd85eb257656018ec91478cf69311a3ffc2fac85e15383f67d8dea2838cf5ef1262ac7f4c0cf393239fe378ee0b628ceff6c868efaa1531b6e71e19e56b3f41467b5de3f7fb7db0d7bb11f278d8dab7438a2cfbedf5430f78d085eb0df6673046ff734f0cf67587f333c0efef6f88e1fa31041e76e17a9d12c3f506c767d8c7fa17c8687f1bac6f28c13ed71c78dc85ebfb2be2716b8f4f383fe33edaef05315c2f717cc7585e352086ebc51930efc2f5e6480cd76b945f7b60b75c61fb8523c0dea1bd91685f8b3e32daffdd1331da77943f89df3fdc11a33f480d83fd3c11a3fdc4fe3b3db0ef873e31fa872331deff8c8cf67e5710637bd09e38e8cff65d62b4e723c3608fd17e9a78776918daeb1063f9c864efcb1931dafb9161f87e834cf1fdd8307c1fe5d3c5f13cc1fde30ee5f7a0ff63b2e7876764b4e7d39a18f4270c8951ffd6c868af0f4f86dbefdb8c18ed89430cf547b786215e06fb32267bec2586c1bf4862b4c74b6228cfe921a3ff8aba8661fdc92686efb327c3edf5e09618caf33a86c11e45c8b85ee09e196ebf2f4ec4507e101b067bff4e8cfd9f1383bd9b5e22e378a62bc3edf7e59118cacf33c3e0afb6c4385fd45eb47725b6f70cc7b7792346ff6c18f3931762f8fea440a6f5032c8fe2cb23ce771fe3ffe611b90ff165798d3cc6fb717c065d885f9b9561889fef89c11ed638be833edc5ff791c7683fb1be81447b1e11c3f7f7a0bfe321d6b72b89d15ecf90b1fc9d6318cadb23a37dafa561b88eed19623cbdcf89219e2e20fe188fba70fd88fa3392688f713cc67d8cbf5f91c7606f8f1e31d8db03caeb18bfbfb30cc3fd789da33fa8b6c4f87db0276389f66687fa21311edee37c197b8cf240eb03c79c18f3fdb961b04f682f1cb44747818cf6f1b02586ef17a81f641feb0131c6ef389f640f8fd2707bffa9bd7ed635f1656818e23f0f19f521d903937d299e8971bde9400cf767efc8685fc4a56188b72a628ce732c350de9118ca9b9af2305f6e90d19e78d41ed437ef6418aedf13437ff985e1b6bf5e8a4cf643124379d1da30c493d7c4509e381a86f573ec1fd90fc10d43f98218ed7dcf30e417e6fb685fcf0c83bd31d7617cbc73641cefeccd30ac7f3c10637f5e0c833d4b9069ff60448cf3332686f6843131c68701328ecf01e5cbe4d3283f7d6cefb18b4cf19a0f3c403ea2bc9878f19518ecc1a140267b85f34bf161332486fb4f0c19ef2fdf0d437d3531e8fb71093ceac3fd071cdf11daa73dca3bc58fcd1532c6870dcaf398f27fec2fd99f1aaf73bcbfb830dcae0f542e3287ebfb0eb283f6ea0ed8e6bcbdff88f22fb80df15b0e4cf6aac4f954f60ae2c319327d7f420cf7efe97eb26738ff141f1e5d62b06f8733c360afae8971bd14f5d1ac1fac89f1fe0d32c68b454d8cf1eb9118caab519e295e2c2e0d4379543ec58b33c3701de7dfc48ba8ef141f168fc4b01e706afddfd998ece104e6cfc447bb0131eac71a99d6d362c3ad7e84b7c8686ffc1331da03cf30c4970b62cc7713c3ad3d08ce88213e0a40dfc6646fa22762289f9f1986f62c89313eec12437ff31e32da13fb8118f7cbce0c43beef11a37d9c196edbe798fba17c5722a33dcfd6c4b81fb4310cf123b597e243410ce589ca705b9f4bedc7f10e57c450be3c370cebabb7c4e81f16c450be33370cf1e33531d8bb2436dcda971ce7f79ce2f1b961f08767c4b89e3b350cf5778931fe8d88a1be5d888cf3d30c8831fe047f39a67c7d8ff5517c78c4f121fb5a6079948f1fc05f7cc47b381f2a5e83fc1ff453c56bc0c71d32e6cfc71331d8b73db68fd6471b94d79184f5d002eca989ef8a8618cb1b2163bc57e27c513cb7bf24c6f556f01f63ce71bd15fcc358f4c0fe5535b203f6f3981283bdac507f68bfa8ba40467b56dc21a3fd3a56c4686fb0ffb45e7b5c11a3bd02fb3e36f977408cf675828ceb01e58d6188470fc858ff6e4e8cf6b3478cf6d006a6fc79ef11637edfc60fe7265edbbf23a33ed63931aeaf07c8a84fc11a98ec8fbd23c6f5ce33c3ed751613e37ecb8561d0af0299f6a7bbc4509e3b370cf672420ced930e32adbf8e88e1fbe2c130d8972b62d03fee11437bf89418f4cfa7f6a17d613362b42f13c3705d10633cfa68b82d9fbd13e378507d685fc23ef039c5938fc4509ffd6a18aee7c4509f7d65b8ad4ff8c4683f6bc3d0df0e31f6d735dcda07af41a6f31d73628cc76f0c433c5e11e3fcf488b1be1331d457ec9169bde0cd30d4372186f226f786dbf27c8f18fac77dc3605fa97e9ccf8498e27dea1fed4773e03eedafdf21f7a17d05b68fe2cbc30ad8467bb34779b31db04fc51658e07ae001bf4ff6e7780d4cfb4115ea13adf7ed70be8dbd0891319ed92f90291ec2f930eb63203f9cf4c37926c6f3373131cac71b328e4f392146f93a23c6f14c88c19f2420df9ce455ae0c43bce213633cf26818d6bffac4b8de3f330cf1cf8018e4b3b84646f98c4a62d4ff0f6eaf5b67c4284f1131d497ae0d837dea11837fcc71fcce713c63ea0fcaafb40c837da4f6533c73340cfa79438ce37f6d18f4a54b0ce3cd1f0cb7fde77362689fe320a37dca2e0d837da4fed0f9146618f489fa83fa20f686e17a400ced71ee0cc3fa56064cfae35ac458dec130eccf9e23f7511e3ac4b83e90238f71ff1bfc07a7f5f83d966f0f30dfc1f60af4df9540e6a07f47d06f2e7b180f80fde5e6bc07ea83d9ff7c4146ff2a5af9e9f7c89e57736092f7ca320ceb9d3e318ec72331c6df0e329dafe81806799d11c3f7f395e1b6fe78488cf66f420cf3e156c8289fdc310cf24bed45f9b407c4385f8d61d89fdc10a3fc2d8841fee21d329db7bb310ce341f7a3fc859961f08fe6fb50bfdd18067d31d751fece0db7ed89af89a13d01f6bf8ff3236e0d83ffec12e37a8c300ce3bb25c6f6bc1b06fd0c88a13d2c310ceb5938dffd3eda278b18f5d3370cfa49ede943fd16b517f5c1fd60c8b7a87d7da85f98faa0fef40e790ce55754df18fa9bd4c4b81e78320ce7bf726489fef99c18ca3fa13e0cf0fbf90898d6938f38bfbc0ff1f911c747603c5c86c8a89f27985fdea17c1ce48dd3fe4008e36dfc5175054cfae68c9051def337c330fe2131cadf8418ca8f36c4d0fe5c22d3fe3add4ff15d4a0cedb54e86617ecc75981febd1703b7e59044cf2e9bf1a8678ca2246fbf16218f2df9218ea974fc4503e5b12833ef853c350ff0119e5915f1a0679bc2246fb9c1b86f1728871bd726a18da1710437b12418ced490d83bef48921becae6c863685f38340cf9beb98eeb27f47d945f4ee387fb2dbc67b82d3fa2fe8cd15e2486dbeb536a1fee77a40532ea4345e32fd1bf3f1b86f90f89617c820b62dc1f02fbc8075d94d723319e8f8a89511fb1bf43ba8ef239423ee27cd1fec811ef57f127ec67b8c8b89e786adb3be875317eab66c024df090326f90cf7c4d8df9418fbe713c3788647649aaf3762f8be250d83bd7d25467beb1986787e420ce5db9561b0ff77c8383feec8309cdfa989b1fd7dc3107f52fd385ffedc30f83faa1fe72f2a88a13d966318da83d7693ead0f86fa46c4505ffc460ce5cb3362ecef8de1f6bae313837c4aecdf00f5371a13e37a9d6db8ad7f322746fbbd310cfda5fad0bfc49218dac313c3d05e460ced89a83de47fa8ff38df1947c6f12fb03fb603fea00880291e9bb6f663c069fffd3400ee613e99c3fc7cd8877b649cfffd23319edfa98931bfc888b1fdd7c0347f766a18e4b52646ffb123467b6713c378a5a63c28df7a350cf6fa8618d6db7c6c3fcd6741d7713ea337c3108fe6c498cf9c0cc379af17628c0f2362983ff1440cede307c3d03eea4f1fdae7ad9071bc3d9f18f3ffc030cc378d0fea77260d833ecc88713dc4350cf2de27467db8360cfd2988a1fde19961d0571aef31ac3fba5b649487921986fc84da87f6c0a3f946fd670d31d63f2086fad99b61b8ff9918eacf41fe8d3dafce0c43fc372686f1897bc4303ed10d318e87290fdbf3448cfbf13132ca4b3d21c6f825370cfa2f89d15f5d20e37c057362dc9fc3f91b61fb26adbf1e9e75315f983c21633c341901f730df9edac8b4be9f00933d9e56c0a47f518c8ced4f5262187f77824cf1c18361f0cf4362fcfe9118e3812b6294a7d470db1f7f8d8cf6455e1263bc746318e4fb8218c7db5cc7f8272046fbd033dc5eb7a83fb83eefe3780dbb985fed89a17ef66018f227468cfbbb33c3d0be9218e52b2186f6d97d62685f706718dae71143fb2cdf702befc91531acf7e70219ed5b901363fb1f0dc3f9852d31da8f176294ff37621cbf0f86f64d89a17dcc7c1ff72332648c37a3c630f813ea2fca9343e383fab07b27c6f13b11e3faccca30cc774a8ced0d0d43fee610437be36764b43ffc9e18da3f417d18e1fc368c18d76776c8a4ff1e31b47f02edb7e9f99049888cfa383903a6e78926207f36ad9f7b0360d2b77c4d8cfa6518fa1fbe13a33c4d91517f82d230e8eb3d31ea4f420cfd0b3d62f4df9218c6273c2786fda402e6c726fdb11362dc9fbb20c6f8ac6318d6c3cc758c7f2a62eccfbb61f05fe67ed40fd730f8830019f5c1ee11c378a49561b07f36318ec73d31aecfbe12e3783f1163bc78320cfa1113a37de9186edb677589417fd30332ea874bfdc3f98fae0c433e46ed4579109961e80ff517f5a7ee1a86f322e7c4187fde11a3bf35e5617f2262d4f74bc36d7fd21b62e80f9b2093fd7e300cf6d35c47fb796318e21b8f18dac768fcc99e5f1a86f6917ca03d6743c36dfb1823c6f146fd1aa17c260b62f4976fc4305efe2d318ecfca30c8c38c18ea2f713c47283f279ccf11cedf84eac3f998b4df57c138e67b933532c6e3a70259e0799d2930c577d31819c7377e21c6f3455b60f26799438cfb670fc4b85e83f5197f2289317e5f10637ccc0cc3fc0d8831febc2186f6c786d19f5d13c3fcc80819e5ffe0196ecbb72f89f1fc706618e4eb8e18f3877b623cef191a86f86e460cfd17b161f0d73531da9bc030c8574a8cf25f1906fd7846267d5818867ce295189fffba300cf6fa488ce369cac3f61b467da0f9267d181b86f65e11637b2dc3609fb03e5a0f111786c1fe34c4b8bee01b86f65e13637b5f88517f3686a1bd0b621c5f531fb677448cfa4bf7933c6e0d43bc3f20c6f8e69518da630b62688fed188678202486f68489e1b63db64d8ce7d7a83c94d76c6518e219c3783ee6c530d81baa0fe52fe186617f74878cf2b2a3eb282ffbd230e4af3d62b4ff389e639caf13cecf18eb3fb5f1eec826fb739a00d37ae304c6d3a6f51517f4d7d87bab63b81d9f2c24c6f37b0932b6f7d427c6fd068718f3bb3531facb6b62acefc1707bdd7f0226f964e7c4289f27c3601fdf89617c824b62acbf204679bc32dcd6c78fc4a83fb56190574e0cfd17387e465e5f0cc3fc537b515e036e18da9b10c378d92531ae0f52ff507e45488cfa9f1b06f97589b1fdd78621bec3f920798e578621be9810637b43c330fe7d628cdf0fc4984f2e0d43bc47fd41fbea9f1b86f18e89a1bd0e43467b1a978621def488319e1b1a86fc8cda8ff1447a6618eca9b91fe35d9cdf31dac3746318fcd12331da6f733fcedf3d31aeff45c8688ff6b7c8387e93d67f8cf58107d0c70498d6db4fefc0032cef80f793ff2b5d648ab786c0a40fbb07625c4f9b12c3f8467bc36dff9d8018f78bdf90519ecb4bc3e0ff6d62a88f2d0cc3785179d4ff1931b427ab89d1fe3e1a06fd2a89a1bdf6b96168ef0999f2cb57c3303e17c4381ee67e688f2c8861fcbd3531b4874786dbfa04f507e5b360c8b89ee15e13633ee61806ffef12e3fad8d130c8eb3b31ee7fcd8971fe2431ead39218da2b22c3d05e1a2f8a877b86215eb9051e633e2712626cbf6718fcfd2531ee9f71c3d0bf8618d7fba6c4b8de200d43fb9f89a1fdd313319e0fdf2293bcd175f2f79561f087d7c4307ecd9218ea2fa8bf282fe59e18f78bfac4707f49fdc1f99ac07c09a3af50bee875603c4f77c8e7303f53e8afa0f5e41ce45b90bed48961b007afc4988f46c828cfc99618ee2f5264da0f7089717fa26318c6ef8618da9f35c430de197e9fe69f6f0c43febe25c6f29786a1fe1531ee2f84c8683ffca16188df9e88511f3686a1bc17628c6f6e9171fec28361b0bf17c4688ff686a1fd77c4e8af1e88713f6f410ce3336d88e17cda84ee477d0f4ec4a82f1bc3b0de3b2246fda0f6937ea786a17eb02782d3faca9218c78713e37a701bef7363dfa69c18c7eb0e98e6a3982063beb717c4a80faf86dbf6ee77c4b8fe30350cf25a1263f91132ae6f444b621c9fa16190c78018e76b6bb8bd7ed813e3789d1b8678f59618f4cda3fa70fcf91b31b6df330cf2901143f9596a18cecb15c0341ffe2331c6231bc3601f05319e2fba350cf18af93edaa773627c9e312286fee40b645acf8a0d43791931ea636218fcef9818ed896318ecf30531d4ef1e8951fecd75907fff80ccd13eec89d1fe527f39ae9fae901db4af35b03d007d9ba03c8a1eca13dc2fba683f273d62f067a71c7984fc868ce7974e307f421fc06a790e4cfe720afd37f6aaea23e378ed16c8288f61438ceb430219f5bd090d83fd9911a3be3a86c1bf7789515f407e04c953ea1a86f17a21c6e771a78621de5b10e3fa508718ce0fed0264941f37330cf6e88218dbdb370cfa1113e3f31513628c479e90491ed686c17e537b39ae679bfbb1fc9018fd05d5cfa1fc88fae7e0f9da2b62f427dc30e8c32d31c627f78621ff328ce7cf0686413eb6c420ef49056cf7f07c47d730cce71531e603e63a9687fdb30750fffe1c19fbbf5f223b28cfadbfb0cfbb237cffc21098e28b69014cf1c9a48f4cf1c98918e5950193fc38966118ff1532cdff0331ee5f4e90717efdca70fbfd3027c6fd934bc350fe9e18edcfce303cffdc10e37ae41332ceaf37340cf1534a8cf9fedc30ccef1d31d4e75d19067b7e04a6f90c4bc3a00f37c428af33c3e0cfc7c4507e69cac3f93e2786f9996686c19e1f9007283f8218edf78b61f0272e318e5f6918fac39149df1e88b1fd8161b8ee10637ce013e37a698f189f4fa7fa71bcf75362b85fa0bc92fd6ef0fb02fbd33c1906fbdeea972d957d077b7d20467b3d461e014f9686413f1e89c1be9d40de650ffdc10ee445927c1f1c641a0fba8efd0f0a64ec5f3d22c6fcfd9c18f773415f24c9433e20c6fbbb86211e7927c6f59b4b62e87fec210f303e5a18067b7620c6f379e7c428df33c3205f3e31cadf35319cf79ef688e1bc50f0848cfa9d9f19067fb62746fb501a86f30773623c4f7b4f8cf6e9ce30b48fbe8ffa1d6e0d833fcb8971bfc1370cf1e29018eb730cc3f9c72331fa8f2931da171c2fd1c37c7d478cebb99661187f468ceb5ff786617c32628c1f4df9381fb7c838bfe50b31ee67a486417fa87e9cbf499b1f8b7eb783fee0887c0ef9f2e9017904f37bca9005e8cb8413e3f79f0cb7f747efc0647fd8bd61881f43628c2f568661fdb14f8ce73f6a6494a7e2408cf130370cf62027c6f21f0c83ffba24c6f5bb3764f2ff47c3e08f18318eaf6d18fa3324c678c35c47f9e911e379df09b0921788cf1e0cc3f3b92362941f6618ec77438cebe9a961f0377d62688ffb6a18ce3b18467dbe330cfee68618f4393f471ee0f9cd8018fdcd9118d74fae0d837e517b70be536e18e271533e3edf3345e6f8fc9d478cefeb3a2346fb5211a3ffce0c43fc4de5a33c941b627c5ee2848cf31f3f1a067dbd24c678796c18f415db2b713e26303eb283fa34a991497f603e6517e3afc90e19fd4f03fa69ecd7e49118cf831d88d15ef50c837c41ff3feccfbd6190d73b62b43f9661f03f3131da1f733f9eb77589d15f3f1b06f9792146f999230ff07dd20d319eb77e350cf23526c6f38b33c3206fe6fbe83f62c3104f2d8971ff501a86f14988f1fcc2ce30ec2799fa315f9d12c3f38039ce27c9679a12e3f324e786a1bf1e31eedf3c1b06fb42fd47f9cdf686e13a27c67c696718faf3408cf6c5948feda7f1e0d0fe2c477670fcf78661fd89ca437d702ac330be2b62cc874686a1bd1b621cff816188ffae89f17dc1389e12e5b5c80d437d1131cae70331da13ba9ffca1458cfa6a1b86fdca0e328ee7e90ad8c1f24e6dbe29fb9d73f06f936bc3b05ed741a6f58217628c275f81957e83febf18067ddf1363f916f2397e7f418cfef51eb8d781faa71e30e97fba0326fd4af7c4389eafc478ff2332ca676618fd5f4d8ce7ef7786c1fe84c4681fb686c13e78c4287f6fc4f0bc51364646f9cba686dbf62423626cffcc30c4736b623c0fd61806ff77458cf6511083bc55dc30e8cb05b044ffbbf389713c5e0c833f0888d17e9aebe8efae8851fe6dc3505f97189fbf690cc379936764b28f966198af2531faabc030ec9f46c4387f6f86217ed811e3fe5f6318ce3b527fc8ff768871bdc2320cfac98831be36f7a3bc14c4f87cfbc630d8db1c19e77f42edc5f9aeaf8971bc778661bd83eac7f9dea1fc39389ffb9018ed434a8cf9996b18ecc32531be1f0ec7d3c1f1afaf88d13f27c458de9818d7634b641c9ffa8d18f72f9f8871fd12daef74c83edc209f437c30e9228fc01e9c36c8188f4fae0c83bd82f975c8be4c0ec4505e04faeb907e4f13628cc72e90c95f5c1a86f16d8831be2888717d12cb9314ef5a86c15e65c418cfed0c83be8d88d1dfcf0dc3f56b628cef0e86e1bc67490cfd49c6c8a45f578641bf9e8871fd746918f265498ceb2b378641bf6a623c2f641986fced1e19f52b7921c6e7bb1686617fe09d18db3337dcd61799f2503f668661fdca23c6fde9b561d82fa5f1c2f9f670feb484b5dfa7f1c1f90f2dc3f03ce61b31c60bb661d88feb13e3798ab561d84fe7c4682f7dc3b01e1503abe2e179ec15313e2ff96218f6b72e88519e9861b08f67c498cf5586613c03627c7ffa8218f7f33ac8283fe5da303c1f342646fb7c6b18d6cba83c9497aa4b8cfb3538fe0ece77e313c3fdf59418f3a79418da573e23e37c34d43ff47f93767dc31974687f79854cf1ce1419d7cbf26b60a31f0531da539f18f70b2dc3b05eb62446ff468cf21d0d88d1bf740c437e151243f9856d18ecbf61ccf71f89e1fd3bf91d32ca73d210e3f3d413c3f0fcd49e18f7371e0c437cdb25c6fd3f6918e28f2931aea78586e17c509f18f5edc5308c0fce07c9bbbb21c6f75bd886e17dabe67e3c6f39370cedf189313fbe370cf6ea9d189fcf1d1986f59857625c2f981986f38e37c8187f7a3b62d4cf67c3701e644c8ccf97740c837ef688319e38370cf6e48e18d75bb786613df596189f071d1986fcb44b0cef930850be1db4bf32330ce37f20c6f68686411f1d62b46fc230d8379a0f944f3b370cfba59218db6beac7f39cd41f94cf784d8cfa1d1886f893c613e593bf1a067da98871bdfedd309c0fc3f171517eea4b623c7fd923c67805aeeb7805e20d9718d60f273e32e64f5368aff157598c8cfd8b226294e7d430d84b8f18e3db816190e78218c77b4f8cf2fb4c8ccfb39aeb200f2eb69ff44fee89519ec786e1fa8618dbfb6218fcafb91ff3e5816188273262686f75300cf13123c6e797ae0c83bc778931dfba2786fe841532eaa74de5a37eda9161b0273362dc7fad0d437c7724c6f5dd9361e88f20c6f5476e18e231ea3feae7e98618db6fda07ed9fee0cb7f6dccb91317eb2a7c4383f43c3d09f3e31f6676918eca3b91fede3c830c813b51ff5975f1986f9318cf2756b18e667828cfe47a6c4686fde0d83fd247941f9b73b86617c9f88d1ff5886217ea1f923f927f944f967b786a1fd28ef2ef99b8618df2f66aea3bc8f89f1f9a23bc3b03f7b4d8cf28cf3eb92fc3c11e379a3d6feb903b217d31258e2fecad40736fab422c678c3350cf92831ca7734340cfd7388717c63c330be1531941f750c433c63cac778e38918e5f5ca30fcfb2b3d6494574f12e3fc3f1806792d88d1df1c0d837fec12a37dbf360cf9d02b31ae7fac0cc3fa3ff507e535991a86eb541fc9eb9618f52b370ced1d10637b7dc3200f636294d7c2308c77498ce72702c3b0df49e34bf6dbb40fc6d7c1eb24bfcc25c6f7ebcf0d43fe7020c6f5e56bc330bee63ab6776318d69fde89f1fd47916178be5b1263bcd127c6f3a8a63cfcf717ce91d13ecb9818e523310cf27b498cfbbb07c3d0fe3b62dc9fce0c833da3fad11eefd6c498efe3fcba28af714a8cf95fc730ac6f6f8971ff756418f61f6f89319e8b0c833e4d89d1bed2f8d2fe8c4076717da8cdef5c97e28908fae792fec423628c8fce0cc37a848d8cf2ec4786e1f9e21d31cac7c230c457b7c4187f9486e1ba613c5ff1064cf22977c4f8feefa561888fbbc4987fac0d43fc6beec7f54f6e18e63726c6f3039786e179a91762dccf1e19067935f5c1bfdf94e4c8289ffe8218df1fdc1886f6bbc4180f750c837c7ac4b87f591b067b3121c6f3993bc3b07ef24e8cfb077362dccfdd1a867c8bea47790ec7c4d8feca30d887676294e72bc3e0bf687c509ee59b61989f9218e31f6118da43f34bf10223c6e75b503e9584833d7388515e9f0d437b69fc5c9497a961b057341e2efa336e18fc658f18cf2faf0c437b4fc438dee6fb202fcbda62eac3f1f7ff7c3e7d2c6e7e7ef39e760e6d3d82fa47fdb6ffe7f3fd0747f137aea31cfee158fffffcc3718c7e5b0e8dbcfeddf3fd9ffad132f8dbb2f83f72f87372f849ca7e2c87f60fe45058d2722cd7f22c5ffd04566845566c25566a6556fe77cbc5bfe15358a55559b5d5583b6bfffb7afa8d1c9a71b60ed6d13a5913357a53ebc2bab4aed4185e5b37d6ccbab5e6d69d75ffb7cbc6bfeab3b01eac47eba91dc1a5f56cbdfc916ffe2a879ff47d65adad8df56abda9517c57e56ead8ed5b57ad699756ef5ad8135b446d6f83f405efea91f6631c638b399609239cc651ef359f047fee2b7e490852c62314b58ca3296b38295ac62356bd88eedd9811dd9894dd8945dfc07c8cd3fe9c32e55ffaed8b51ac51b3663b76cceeed83d5b28a9f92939fc348aedd85a9c3db047f6c496ec99bdb0155bb38dfa79656fec9d6d598775594fcdd0193b677d36f8fbe5e72fcb5fcd866cc4c6ac56162b52c380b135e7acc7edef74f4c772f85d3cce0597dce12ef7b8cf031ef288e53ce6094f79c6735ef09257accb6b450ddff1fddf2f477ffec30f6afc6a36e6477ee2133ee517fc925ff18a5fabfe5dfdbe4ffea11ca2cef31b3ee3b7aab439bfe3f7ed9c2cf8037f648ffc8975f8923fab917c519f951ac935dff057fef6f7cbd3af7ff8bbb5e15bde51a3d7e1dd560a7bfc4c3fc7c807aa8f433efa81aff80d395c7e132332978f6d25e47c6173dbb6857ebac07679cff66cdf0eec508d5c9fe776c48e76cc023bb1533bb3f3bf5fa67ee5631716b74beeda9515d9ae75a13e0bbbb61b7b67eff9c03ea8cfd13efd42befc8d6fb627f6d4beb02fed2bfbda0a6d97bdf250d57063cfec5b6b6dcf7963dfd9f75c2899ecb39ebd50ad79b01fed277bf9f7cbd6cf7cec67fbc55ed96b7b63bf2a0b75549187fa61b9fd66bfdb5bbba3fa35e3cf76f76772b84f72c83eeb3df394cd5bda3dfb4c79fa11bbb4cfad0b1edb7d7b600fed91f22a813dd6f70a8b75ec8d68bf2bb8b08510f2ef96af1f7cbeb5675c38ccb39e852b3ce1abdc612b02118a487d62bb1189d2e181487929b23fb2855fe570f9c5268a5c14d65a94ec4954a2168d2a7927f6e2208ee2f44962b992cb93987ce20731b5376cfb77cbd997cfd79863262e3eda2b2ec595b8e681d8a9cfde7e173762266eed9198b37b71f7c7b6f0b7e450ebbe68fd88588807f1a8a2ec2dcbad058fac4bf12496e259bc288f35132b15251ec5faf398b6e3b8101bf1fab7cbdeb77dd2fd7913efcc135bd151ffdf553f3d71a6ec93abe4ef9c1fc5b9d2e71b51ea2761c4500538bb3ff6c9bf2d87aab691751063f1222d3e958cadad4b6d0fad2bd6085f725e4b9b0fc558f99567156f3f7c7c4f0a29a5235de9495f06ff0132f8c9cecb504632668e4cac67993257667c239505b416b2b0852cd5a7127b594b9f75552ef655327e520e3f8fa26cd85ceee45e1ee4d1aee449e5cb5a0e55cec703399153153b8d95d59829ff3c93179f6b9397f24a5ecb1b391396bcfdbbe5f04316e55cdec97b357a3bf55988ae7cb08ff2513eb14cd979472ed9463ecb17b9926be6cb0dbf96afdfc6cc3f2587f697b17893ef722b3bb22b7b2a3fc9940c6ef418ca33792efbd65a0ec45c0ea5cffbf2730cc5edb91cb3b932da96c31ceed88ef8cf90437d54885fb1b9d5c8f736f6eb3baee3393ebbb2de95a5ba7002fbcd0965ad6ce1982fe5f4739f7ebf8edf92435567e4c4762c874e622b9bc1c656a422f9c04985ef644efee9bec2293f8dfcc4a984cb73e68b17a7e68ed3f095b3fbf1fc39fb3fef677f5d0e9d83736481b5748c4f7426ce54d4dcb71e555473cdae9d0bbb712eed911ae199f313f9c98fe5f0f3283ad7edffdf3833e7561c9db9aa2dd076d19a3a77cebd982b9f325623bc7316ce83f368ec68691d9c2767a9a2abbe5339cfaa8417fb82453f9a3f67f5e764cb59ff9e7dfa7acdd9d80f728ef36b39af62a0f5c73e3a6fcebb55f0aecdd98a6d9cadd3515187ef749d1ef6e4fee76ce10fe4f0931f936f56c58ece95aaf9cc39772eac37bd8ea8fdb3d397967d142fac6b472a8e7a7106ce1047f0e88c9404baeca862fc48cec8428af98f64d119bbd69f914397fde8ef2ec9cb27fbe52a97eb4ad327d52a6be93a3c775dfbe07aaeef06ca3aa93e697be8866ee4c66e22072af78afe921c1afbe1a632510d18ba999bf38ee35b81b2890b6513afdcc22da5aff4dc6747e59f6b311766ecddcaadddc659aa4c69e89ad8c0ddbb07e5e9be9b43f7f867e450f6beff1b1fb92777f28dfd6adca913b19969c5857bc98772a1f28fa97be55e8b193f585357dba90b1eba33f7d69dbb77cc5739cad0bdffa6ac5f90c30f6d7617562d77cc771fdc47fb8a1fdc272d87eed27db602f745598d31ebba2b3d67ece4dc180b3072d7ca6a3fa8b9deb89f3c9bbcd17ee63bd979fb753974dfbff793626e95eef6ab1f753b566d3dbb5d17b5d33d73cfe575dbb681dcdb91dbe7a93b6063bb56f1c6853bb4b97572475cb86365a5e69ef5733ef9f7e5d0e21e137a85a6f6b867f39e15b217356397ec4a9e3c2172880df9b327f9ca738c57ee898ee73a7a5d67e5799fcaf2bd802fbdf01b3964bf2e87def7b655cd9a177bc967ed732f99a37cf0b3f2b097d882d4cbac677b22775eae7e0aaff42a5959536b6b6d6dd776bcda6bac3b6fc767dede3bfcac4ffe7d3954b51e955ed6bc9207efe44dac376659efaadb6336f6a6de8590eca4e6ecda55f2e85d9aef5c394b6501b6bcf0aebd9b4f65cdbc5b6fae6ca5fc5c9777e7fdf2be8cb7f84606c756653f7b0fdee3476da2f4f47ec8b3b37496de125bf0ecbdb043bbbaaf62062ebc95d831bdd3b160250fbdb5d3f736b6ca2cdcb1f7faf3b1e18fe5f06314bd37ef1dff6beb7544e575b9aff2c9bdd7f3cea4fc54cbc7489d7b7de6a9b872671fbdc1972bb7f6da1b7a236fec7c53d7afc9a16f7df593cabbd64ee5336fec7f69896f5bcf2ad3eada535fc0aab4ca8c27f6a7fd255ffa8eeffa9eefeb3cd90fec3329f04ae87cc8e14fb4e90772f8d937f7ad673f72b81ffb899faaac59efad6c6c975bd68c0b651367de98d7f691677ee6ab98d12f84b096f65aeefcf2c3c2b763a8fa235cbff2559eed375feafa2539fcf67ef9e6effcbdca37e7fee1737dcaa674dbb5a7dc3ffa2a22f41247f813bd4fa734fca0722bdfedf953f6625db00dcb65e95fa85863a8caf179ed5f7e94f3336dfaa11c1a9be85ff9d7a2e31ef8cabff167ac61151b5a0bffd69ffb7752e7cb858e115947fdf75c4efd7b5eda1d7fd1e60243ff53162db8bc57118febaefd471535dafe9391aba58ab47f410ebde833fbcffe8bbf52367ba03c6df6790cfdb570d5fcea7ca4f637feabffa672ae77e5631a197bb91ad9777fcbbb7ec78a6c8787d695dff5567a8f488ced91dffb34827f520e3fdb44f7d55d2b0f31f61bffcc7ab5a6acb62efc73bfeff579cd7315490f78adfcb31a4d77ec0ffca1ab7cb955293b147bfea71e8d1cfdf746b57dccdf021526051ff2c403fb67e53010dfd8c6c0dfcb6b36b76355ee97f5a3402a4d763d291ffc41e0c82b772c1f44d75d33cf59fa8bc0b58f81fab235e547b6f2cf8380a72a3aba54723b909facf8cfb5ebf7e550b525141d955fe64114c44112a4ec55e5cd974116e44a939fb51caa7a572a5e78e603d60b0a39d3f2a6e3cae0530618546a76172a36bb967650078d9b063b76fe63d9fabdcfb7f629d84bd5737baa66b3efaf3e8fa1bb0f0e320d74fcca8393aa75e2497b6a355a4754445108194c830bbf63d7c1a5ed045772628f826b5eb08e6ad72ff8e4df91436313831b51e8f90c66c1ade3077315dd6cd5bcddc96e70cfbae245d9c299d2e4173954766ecc8ec12278b02a9e3beffea7f90c1e8383ca685cf96047c1938ed582a51c7d96fb5fb1891f6d0c9e8317150774957c2f8255f049123dcb79d791bed3041b3e0b264a6354fb541b3a2a7e3da876be066fc13bbbe4475b88c82d146dad836a5dc7997d1ac1bf20871fda1c74831e9bb3839ad7b3e05c49603f1870dfb9f316df7b6665bdc7d63a180a4b6c822f6b39c1d81babf91ff23c546166dbc734e4a1a94f863f2587dfca050f45284557befb0bb7b1d7ecf14b6b6215d21f43874be72d78b27b5fdbea9e8999a8c5b5d887ae2d42cfbeb2b7acc797e1270bf4b336fab7e49046d199b136eb0983300ca330164ffcceba0893300d335eaadc53d9431d87f36b760acd6a8eff1a165efad19ab0d4eb76721b56eed8c67c22d8072f614df5fd844dfc562ea0e4266cedac2a3f0916ce97790dcd59a3f0c04e7cac343e172afe5711f96b7874fae1896d441004e1249c86177e1b13861f3ef9a7f5e137e5d0d8c460c9eec22b150bbc84d74a9bd3f0c6ba0c67eec01eb050b5ea59e72bad5dd43e706077aca51784b75fa4b062773a77b1a7c1d1790be7a66777fef527b9ff5dfffcbdcdc432eeddb54cad8ab956252cc7f95caf92805ada72132e545cf1aef7e998b2d5fe42a64e246ec307b691a5b5081fc3276e792bfd4f07a8ccf617f2e49f95433502af62ab6db197854bf1183e874fe1297cb12efd9eaffd89f2cfea77ade2aabe8abb724baf37acb9194329c25568ab1e366a8c0761255e3e8de1dade861baacffd5d19fc462e3e3456450d2a236998a3e2a9b7f0737ea1b4991d9567debbe360624772dfca61472edcda7b0adf9c0bfb9ce522529afc6ecfc2adbaa6d7e4dd5fb385bf2f874bb3a31876c22bbb13763d3bec8567e1b98aaa1eaca9ec2afb31d47228e62ab3dbe948c752be50cdf33bbb0b46a0cb61df7f5339849a7b6b296d2589b38f316caf0f3ec9d54fc7899fbe3f0c473209c73a16e07de64bb30fe208bdc3c95776e45ec9bd57d807dd46152336f6446c22cb7d56f175693b4a1a9fe4c4d16bdb75d089c89bfe42ccfa3b7248a5b1885b7a6dba1fd991b05e23c9522b6279e444aef2cb91dc686fabcf3ca8163e6839549f2739d47ae5a50cd64ab62aeb8a558434893cffeccb181eddd73f9ae76f6dd3e7ef477e1458b5bfb09e43656f558c750d6b48512807ced27558576e94b79db8e328e27df9a062dd9c796e1ac5d642c9a023a228895271c1cb2853df3671cd3f4d0ecd1964ab9689e8b007c78b7277264fd6a575191551e972255b47e9f3a550710d53da6d77548ee5ab28661cda4ecf59f0273582a9d0abb585bbb18ffed5e711507dadec93f3f207b2f89d3ffe52421d1c743415eedc8d92bc157f8a1a3537b6d2cc41b8537fe9f3173e73ded47c5fa8ff56312a1f0555b48bf66e181dc293ac22edbd5584e4ed289ffe7919fc2339fcd066a5285395c75d8a99e54427a505ef6c2c7cfff4795fe5473fc186796cae4674a17204c71e4593cf57ed9d7bee2adf194da9bee822bafc63990cbed4110a7eabb28bad7d50d679cc87eef8fb764457f2953dda27f9aa4669105d0bce766c25ce5568b48c6eac93fdc27c768c66dce8debf400edbdf4c44b7d1dc99f34ed86349f824bbc2633de5cdceb42caadfdacb2c95d51e8757d19dcaf897d17db450516da3ed21cfbdc0fe62f3bdc6f5fc8d3e1b113d7cf8dfe8f13b99fb46269d5df4f4652e5e9d77bddfed5ed991f3162d83a5d8b807ad0beaa3ec9cb2d7b5638b17e59b6bd6111ba5c0cffead9e62f7d6b57c2f7a11b75fc7fc9f2a87c6f6442bd171aea275b4895e55ae12dbaefb1cbd395c59e2b18a1a9487961b250d2a27f523ebd96aac4ad9a8c65a46efd1d65a6a8b1f75beaee4a8f8d0b10efec41f46dda8f75127f9e7e84cff8ecebf6d933b155b36f9dae7a8af2293bd788906f69dff281f02579f62c076283b1d0d95ad5319b3feed47d1281af34809f0b9bb14214f622b663167edf9a4d8fef59ce9f7e5f0c3f6c48239fcc979b0af6219252cb32e63279cdb1de5eb0a25033a3e9ce9f8900f955d51b19af3e4766215d15887d80b5fb53cc86f2c61ecc78155796e1caa0848c626fe53fafc18c7b2eb89af321827edf9dc8e55c76974ff39826f4bcbc438ce39f7876a2e57eca8a205150b2a7f3d57794caae358f9a0fdb27d503a318c0be5510211ba4b67e5dec66570b027fc63bdf31764f067e4104791597538b6d7721a57516e052abab9b0b6b15e39cc950cf655bbfb6d3eaa63c4815e2b161deba0d791f54aa8bd8a1bd68b775f24e729de5bcf7aef8517d6537c887a545f20e2a360ee213eb9b9d2ec33fa7b3cf1b6fe56b7c3573989bdfa3a86de4d3c75d3f842cc552ca8f778e6da0e2b59acdaa82757edd2918eca53d83cbeb4d3f091e53c7297e153f0165fa9fc7ea9bee5fdba2dfc2939b4c93e3047c6ac13c4f1757017dfb0ccaed92e9e495fefd5aa99bde5cbf8d6ee283b34ffda3bfde35fc5dffc35be537e7eaed784e4d6eaeb3c2bbe47795bc40f51377ef479fc142f5b8d567f8f9f554ecdc5bbdba8785ac9177f12e5d712c583cce3972f75acdc6bd653333f762fe3b5755039fb215eb343bc895fad852c55027b19bfc9476bad7427f75ec1a3fc9a0cfea41c52c9cf56adea7f8fb76afcf4399f9393c69db8fbed78059e96417bedaec32b9587bdb96bd151d9c83777d943bdefe2476afe23bed2a7d9e21ed9c1f8213e8bcfe524eec78300f702e3a15e2757323e8f473afeb49eedefe62a1e275630d16b3462cebaec28affd713cfbf62ef72e617edf1d265c9cb34d62c7a5e868398cdeb19fff02395c1adfa8b5993789b0269667bdc99ee3d90f1ed36bd87a8fb95dcb1eb20ef3bd31d822d5d38acdad2aba73f75ffb110e555eddb4fb2e07de0fadb095a944b6f6f0d18be2b3c471ef5ce62f1357ff4dd48997f849c06b6fa7ed1a53f69505d1379228552bc2459b1fcfa4fe8702946591ef7a3d5b7454dc8a9f246433e1bb96bbd4cb3ef19b3fb40eee9a0f93e8cfd8c29f95c325ae99445c0ee22a899344f862678549eadf2419aff5f9146fdcae69b73973bb36522579380e777add3829be95854459f1e0c85c25834377e3ed92aad5c66bf0cbf19973604f49ede62e9e6908627d6acb2b93868fbd3d1f07aedc896eb2fba6d47d72f0f6fa1e9593ccc24a6e75fe0eebeae115fae9675e86f7c95144c92999b8b7b61795c994f9d12cb9f833b6f0a7e5f0233f9d2597ce5d72955c5b537699dc24b3e456654f4358b301bfcce67adf427b14e6aa16f7dd3af82612777ba1cd427dbe91cfdc2b77135ab19728cd4cee927b6baf245d594465132f920776113debc83b79d4e7b692a764993c0793e445af15c96bf7f5dbb9b1d36096acc28548434b49f8b35e097196b25d33d1de45e7d5d6b3779bacad0b59baa12cdcc0ff74aef7d765f017e4106da21387fb6463eb678aaeac2879f56e55249df381eba82c2f66befeadd794f5da8d9af72679136efc8d2d4cde8399d74fb6fe4ee5f82a8f4d3a629eb456d53d4bfcf8dd2a939eb689c959721e672ab3bd4cfa491b7724c364948c534bf930dbaf532616e977de4b4c9346ee954d1ccb3d1f46433f4a6d9dc387e3e42d1c2bdba17c4b2ac22711b03c95e14b62bbd74a77967fd616febc1ca236db2ae37be2978e3260a9a362ecc4bf12562b877a1db1d0cface8a842e5c7ae3e63a0d797c32ebffcda4be755b5f8c03aa92b92d67ed9c90bad9ea65eeaa741f2e03265131fd230f6d34894491b73d82c8dd3244dd32cd572fdc4baaabea57bf1b5f4a8746a2ddbc94b3b9243fba0e450d944d40b659ffd495a842f6ec8236b2b5fa2b11ccad47b8dba7fce16fe8a1cd2c77ff6c7696979ac4a1db6765f9250e5525dbd1fa6eda15ed756b98a1b2a1ba42c966b2dbd6fcee4060e2fddda8fb42d4cc2b492b364c95749276d3d97b84c9b70abf4f82c5ee8519456a447a5dd3956b67794ee94243ed997e91e72233bf65ed32ffbca51572aab9d2cb57f5651abd20a4f5a8dde6b56f181b2a2e1383da6271ecae774924ed30b95f9e93dc863fa0779fa3f450ef1131cdc697a955ea737ecc58ad2595af1523f53047bcdda266a5fa8a38f70acf295bbc8fa2283a7e82ebc627367195c2b4bf5e6edd35bfb2e9d4b3f6dcfe0078da37ea2b3f45e45cd91f22eb19ba60b8c5c76e943fa983e392c1985dd742937d2d63e5a74d2e72fda5c062bbe4a5f9246e5cf07e5c7b7f6445997a7768db1a372ad05bf6365984487b4b487da4e0a2b5dfd5919fc3372a83e155fa66bebbab5893751986eb4e5d66bd97a5f45efedb13b79adec61c79f849f9f4ee0e191053a6e6ccf273e495b285b28a7beca3edc7edafa07ef3958a66fcaa30cbc48e52817f15928fd237aa245b0741e5215c5a5731522acf4dab48a040be6a75bfff58b245ea69db0abecec8bb757d9c7911db4262b69ecf032edba23b6f1cfd35e7a16bd09a97a53466f7f5e06ff8c1caa586d9b9ea77d2b0e2ed96510a403fb3e1d5a1b6b137c39cdfd2b3fe9284669b51f122b1deb0c2f3a53d1357755629ee1ba47b4f67b4e9e7df7edccb65f3ed6d49c4326fc3c93699539cecdd73b1d9629cd704e99e72e65193e66be3ea394057f4506ffa41c32766b37b66b5d6661dc1145bb0f51f96d7cd89e5719584bb950b6e7dafd228559e40a6529afe4c22fedb8ddf31d6b9b95a9ff66b813e4bffacfa98a6ad2fbf45ecba1b3cf126122a32ccdb2f431cbfdf7ac5036b45191d198f97e24dcacfcd8c3f33aeace4afade5ed9c54e6b3755bb4447c7acfec2aadc9a2db23a6bfcf36c6789eccf9f09ff0b72f8f16169e406d76cae62425f0e79a16c5caeb28e9db6872a5eb8cabe587b6ba06ce13876e1ac7668e97c426e9cb7f6b9b8218d61384ac7ca0eb6da1c28a5cf8e1f16353b655936c9a6d985b2011d69ab68bbe27d15af4c62fe754523bbccaef8cabde263152746ee46efa3e80c145642b2ebec263a4407bfffd7e4efafc8e1c7279b894dd4d1fb7bad1df47991ddf24a794137beb4932f23c8b37992c96b25a30fea67aff30db9d1f64aaff7485c63e36e7697ddc771f4183f7851a662edece1e3bc04bf7577d9a392c4a76ca9ec9d9e8b59bb16d36181ff25de76cff4f948bd8f22373a7fb623bd8f02118ed864cfd98b7cf9ebf2f7cf9043f8b0f3cc6a738e323d871d52bd3ee205c1faeb6ab396446bf0cd5ff047a23d13a76c15f4bc1b1561ab18313a17a5bfc9f00448b689be5bdf402bbacd7004b3373363efd9d6b1a51d5a7ca53e339dc7679d6c1fffc96711fe7572f8dde7877dccbaf4349a7c1442456d336f2fe6dede1df3958acf0b79f858c772a4ecbbafd163a2e4308eb39e33f954ce99bc97b3ec3c7b4a33f721e9d8fa44d232eb2778d2d45d382fded11a78c76fea1f38b37f621fff0572f8f1c9b45dcc60dd46af657bda838c55cefc1498331cd1955e6f54b2b1d032a2a21395db649fcee6b867d981dd056f7a5f252abd38fd92e5f037a5cde36c9a2c734bcdc1951de5ccc1f85128639c6476871da23b99c84c59e8951de9330e01f366ff6cd9fbd7c8616eb383ceeeb5dd71d7b046e2ae6d1d0d7ab9a051c8a5f4c127ebf515fd5c9cf299efe92709ce9d88c7f3dc8d2edc2afc7cd65f7d37f5734fdbc376e561691fa41d74c89b082e2365ef746e7ca57e2f550cbad47b3dca26da7198fbfff97218dcab6826b5962a176edc06d60df56a7cfbfb907f7a474cf8ca5fec83f699fe3b3be5a1fedbc789ad3ccae360c69e12bd7253daf7d9e7f37022db456f49643ffbefe1a25dbf99b9e9c7f327be1d1c543ebc50f948970fe53669cf38f0b1ce57f82ab7ffb3e5d07e105b7fe13feb353a8ac3941cb63fced2ad3fe4508d52c24eee033bf96d3ce3ef94671e64e6a450d0782c6d74ae1c9d49e9bc879f6c9b58c859bacfdbdd286fc92225d12befd3aea68c5424e8822ee8d58f6828f76ab654661e452aa317729567ffb172c8b335bb634e9efbcf71da3e1f5cab4f651d9ca59645fe947f5a854dd1fa65f7d13d5f59caabb08e78a7e826a8ac3a2f758ea27cb39b571f11b67f93b1bcce9b7c97efd3797e886c3bb12ff34f63accf60ebfd96764f79ac3d57bb9e3de43772abcd49deae14fee7c921b65fcbe2da529f888b8e3b152ee4c57abd443f0f10449f7aaadf4952f0a11de928596ee44647e8f4244e3e618ecef6e2a7e8dcd907f74e63bccd22f7f2697e915fe657b99534f9b51aa355f244670e953d3ca8995bfa657b32a5afd7b261bf51c59045cc5353d27f961c7eb2f8bf912dc72b6f1edde59f9ff629f53e8a977bd255f1afffaefa7b2387244fb954f23c4b542c149d270fc13237518fece6b7d9349fa759ee4583f425bfcbef955f5e184de7f9837b19bee68f3f6e89fd6947fa3f470e3fb510ffe63f5bb55569595451cdb55b6bbf9c3fe5cbfcd3ea54fea26da6bb761d3e4b1a6dafe4837d077beef92a5fab8cf65adbc3f82177ddd469f28d8fdaefdde6afc9484736c9529f52d732ec0d3f95fc16af54fc93b7b97bad73202de3de5849e7217fffecd7feb9b2f8cfb187f0db7ff69ff3ad55c3595365dd537dbe8179deede7e7df448e67058f7af54afbd66c0f798a779e77c485d83a4ede8d07f183bfccf6c193e3d2c990bc979fe5e769a6239bfc5eeadda7e1e7277bf27e3ee04fed7a7adfbd6a7394a15ecf749b70ec8ddd5a9fc9ce87f9281f17d63f5316ffa41c7e923d2383ca2f8763abd6f64f3e58079515abd82fea142c5dc69f64a0e096f6df2a6fe6c3a4f1f6854dd1a13c049dbca3a243ab1085d4f650f6ed3b3171bdc2110fe057c41ae490af94bdabc54b62229bec2d983955e1eab51ad93e0b40675f9d25ecedf92a922cbcc22f8222fcaa3f7f871cfec0a63c33274ec3b17c6f63b3f6791515bd3d1451cced4efa693fdd2b550ed3c8546e8b58da69a7c0b509e735ba2bd2e43dbc8ae76d96f2e845b9939f2debb40a66053e05155d654fb9a5bc5121f7fabce1871cbab2c8fd891c1691ffc26b959fa8b810f653785f74e5b5700b151d1465511575d1146d649e0eff4e7bf8c9a6682d4ada730d63257dd7aea3d76594a7a80bdb1f322fdc597a0fa6a2be2633e6e9f36176ac22e087a03d85eef4bca328ac278b39237bcd9d363e3cf7a262efb4cff6b917c521c015c274e07ad993964395c95585896d8a532bdf2a772c26de8875742e94c56a360bd1556d58aabf4fdb31bc282e8b2b5fcd9ceddb2f72fe77da43eb631f8c3bf7fa091e7bc25c6fc787ca9a47a1e5662291d7ed99fd39f37c936fa8ffa91cc29ef27eb68f70c78acdc28d5cebb28aeba017bc45172ab6d1e71dfc02e53d293fce4a1437c54c29e338b4bc711a1b6b18e8bd44fd4619310f9ce256e7d34aa79f95c4eb33e25b6ba977268a7971a7e4f05eca70582c78513ce82784ff1e395ce2d987e2b1782a96c573dc5807bd1aabdfeca7626659bc387912ea5d71b953f9ebf263d52115f0dc9eeacf8a4e16dbdb10f3596764ed622b10c51ae4d04da93e36a0e7a1a36be7b2d8e8f8efb33d547eb76acf31e875e02d4f032e5ed41816ed19f127ab29daf5b1e2ad782fb645a7e83aaef55cf494efeb7956eefe7d72589c15e745bf1814c362c4a47e5f6031b64469950c2c94786fcf15b8a2f3212ff15ed92769bf14b392c33302d9bab44b01e546a59cb94cf9e5a7f8499f512c8c8c94d26e23bfd20987d2cf58e9aaccbb5f980cc85f418e2e13d6d34f222bb37b51fad267077dd65a58b1affe1694611995b1146562dfb279b8f376c96d9996d9df2587655e16655956a5fa6fefae6cf433f5ae57eeca7db0858cce8fedb5f6d7564351b63b6281f3ae7cf0351f9607582f70cf83172a57afd5b4fbcb2a4f0944ecfb47aa2fb9288f528d62792a27c948e51f99987aa36c4f714fb88173af3c2fdbf7fba4053b9517e5a5986b9b5cb6125f5e9737e5acbc8d9edc9ea3a22e76d46f5328e7e5dd5ff1d1bf24875fec866ad17db9281fcac752494cb98c308e2e9fe3dbac53b62701dd3b6d0f656c5505e6bd41e5bcfb8ffa39169549e3dfca95fd42e516d77a1f4fe7cbd1b996c3fcf051a70cf20eda03bf5ccb548de3a6dcd0faad53931c16ed3a44d6d7e7afc5b87c8d26851b17e59baae9bddc969db25bf6ca337692a98af50f4a6fceff5aeef20b72f825bee7ed1b84ca7e392887e548eb63aae654cc1dee1edc839adbf674be23e00c98b280680f2bd5cd767db1e17d58b9f16eaa4f32a0e490e9bd1415db9c4767f973f5e9393ee790f7657bfe359ae8b54ab9e533cf9ce6891b7d8e41dbc3b47dd629b779cdc7fa2941a5ddf3b8d1ef17a944252ba7720b8bcd2acf5fd8537b54d1538eff2639fc982fad8f5550855554c5958e135474c79fed4eb9f6c6c5d83d546deec61ef4d97c2d1f01ee0688526cf47302d68197105b575974f549d61ef52a8317911c068bcf6da8f2aab57f5529c642bf4d755099982978d1cf6379aebc86a7cf83a5f3a606722aba2a47b974b8de31a8ea725b35d5aeda0b5ea9b996efb93939fbef96433bcc955c55c7ea544daa6975515d5657cc973b95190c59e88d59a7ba066f51ddc069a114dfee51cd986f35a9adbc4c47b6bb9ed59777d355736d0fbd769da7ba8bfd70fbb90dd57db5a8d46ce427357607abf12351d029e572ace24e2573e51cac6c70afa46caa9f9dd7a78f1d5e295b5a3d55cbeab97aa956e12dbff466ee989ecffbb7c9a18909ab75a574a87a5572f856bd57dbea325779bdde6bae3af13abeadba153e2f5c9d8977870b373d921cf281cea3ed4e78004dfe5a47d84f8ffa9c889243e557b2cbfce5eb75b1f45ac9d367f9f533f1e9399d8695574aded696a07705e5cb9cf1a5de7fe67975ce9f2b158b56836a588d8abb6a1caed3556dc96ecdfead7248b26864d25206a7b66b51cb3c531d7b6acfdef76ba7766baff66bcc91a3b13f7458804f2fe552bfeb438de300f641eaf06b1db91332bdf2a5e2eb631d491d287dd386b0951cb912d2aa9d657c2957751b3779177512f02886e7e0c5433175cfe3d05a3a4b7dde9a977af547a58da3caa955de582b7f561775595775fdef9543fad4ed7a66bdabf7f5a13ed627af13c4f5a49eca61a66288faa2beacafeaebfaa69ea5abec4abec73c2e480ef5de9fbcae5bdf597ff79e25f9a89ffc8cce54342ce307f7ad9e7f5b377f84a7adb220ece83d43f2cbf59ddecbb19fbd34bd109360a54fb6f38d7e128f3fd91baff545f57dbda81f6ab3c2585bf553bdac6965eedf1a1f96abe4c2cfeb977a55afeb4dfdeadceab770155df99a77eab7fa3d5e671d1535acebadd83065b72a8fde5c54ebb75fa92c0532b7bafb7dd9f54d20a233adcf815df7eab3efebafcfc1af043d7dc21174b9ca9d4b7fa0c43c617e7c91dff03a6994c4574e5cdf6615edddd7fd7a500f431563570fd95b3d62217fadc7fa710defaef9179f83fd768eac3ad87247bfacb8918dd3b80dbed92b5fb33316367e13c4b7d17de0e93338c215b209ad75d6aef607b97e8f2c44c6d93adf7c5f57e6811ceaf3874dd4c4dfb7c709a3d69b861b5f4502741256e9805bd82ad774d52c6d8255bb8f5df0a13fcec96bf02669d22653d161afc95d6e1ff533354dd1944dd5d44df3af3c8ffdbdbd703bfe7375487acdaed93787e6d8b4bb3de9457dadfd72d6a99de4c91a6a89b30ecda4099d659281ad4f76f6c11f47ad75cc7ef8ee62f6ae3d8a8eb273b799fea83db1d5b4e3e64e44c75e37b813d3be9b7613b4d6d61d17aea7df3231d3fb7b85398b536dcb5973d55c3737fc89e72abf9fc9617a5e5f3498753b7feadf3df8e9e7a4682ed5df9a5bab965b7668e6cd5d73df2c9a87e6d1bbf34e4920c6fca5096a65139b27a6624539f4b937e20315b78d8336032ba7bcc84bafb540cd6fbdd39d6b6d0e44fb46a01fb629c63daefc462639ee93f07e701deed2c61beaf32762de3ce70bfd264b478d65f392ab6f34ab66dd6c9ad7e62d1de87733c98c0fadb5ffcd299e7f891cf26f7e987ebf8370f9b577d1bc978b665b8ba6d3748bae75c757621cecaadba617afa56d8ff4feb17e46a439b396a0bff5c88eddbd7ba6cfde34e73fae53c787f183de1dfdad3635fdb88d70642db6f036932cd132a7d7686c353f7a1d5b6ebc585e30fdbc4c3766cd408de1b01935e39db563f235bbd5ebe8ca2d7edbbb7fc9f37adf8ea2235564e6d99dd47564e3edec9dd8c99d532e93f762ac6d90c577ae25761eebe88c43ef67a848574517bb367bf0c36028db583159fc767d7a14b546ff769b22dc47f436f06ea90cfe9d091d7b76f5cce9b543314fc7bb40ef94b26017aa7645d5a8d9ece25d227831d5a7999df7dd37cf9ffe9be243ceb6d69d7fe3e7bb6c97ef8a9da807bb7257f15bbb23fde63263cad75da5e75cbafa1dda03a5576e6afb0b789ffb0ecbc81deff7fc208f2e5a59fccdb6ec1af3a6bd766e763bfd3e89409f101d28af7f5dd89a79e1d77ee5aed56f1543eef695a3e4f050dcef8ed99b97c90d9d97ff73fef897e4f08b6d546d39ed2611db29fbb6bba80fbbcbddd52eca8751592cb44cc861316e8252e5718eddbeab73aef758e47bb4fc98edd8df5d3b97bf5d8f96c21fbc6ff3d34738850dedd9b572986eec8e187b523fb32533a6243de9783bed35e2262ce34bbd7ab89b55cdee7637dfdda9ffbe77cf760be74fbdbfe12fca61eba3770fbbc7b2f5c4bb8bddd36eb97b5672f8e2cec3b734d66fe8d6d9de6ea524f149f9cab93eff22bae2c5790831ceb62ff39bddfaf7eb5123f8076d115b6a8ffe89ae022687f6416edb779c1cd8297d16ed1ab66ac14514ea2c65b769e5b0f5d279e6d9bbb7dd9f7e56f4cfcba1d6325f29519eee30d6df6d9bedaeb3ebee7ace94cdf4bf0ae28dc12fbb8762acdf4b28773255792ccfaed85e7b12afafb2c26a77f6d7e6deb2d9097e676f89cfb6bbf3e645c9fdccdde877ede877d4729ebafa992d99a4781e77a722ec725baa0c69374857e98abf25c15fc94ffeac1cca30bb5319d6603784bc7437da8d6bb1b7ea67afe3ddb09e3716e33dab2ff8ab7bf0c67ce82cf5b97df7a179d1ef1e14853fb10efa3493bcfa6b73fff1916f7b1e737f12787b5b9fabb523e5716776e48ef7c27d5075ba7ba93579efecdd7ab0f7f67ef5b00f8275b96a827d981df7d1bfd71eea8f3ed395ddb263edec959dde27fb749fedf37da157a454eef412ddefcb7d555fd99daa23dfeda9dedf55f7d57a6fcd5fe85891cde3bf3cf79f3f79aed7aff72a0a50b9b8dd3e0730e3ed79b2fd4efad633bc076cbfdf1ff6c7fd693f119c9d872a972ad77aff673ffd1bf6f52a1d1feabd8bea20cafdc5fe727fb5bfde2bcb5ecfbd500efcbbfd6c7fbbaff4db5a5494f6ce736fae7a77a7e54fbf8b53bf8729fea79e7751eda998a3ca55318db689fa1d27f6484ed93608f317b1d9cff7ca8beceff78be6b85771e7fe51b52df174d6395792f0b45ffebbe5507f98633d8763766727fbe7fdcb7eb55fef61cf87c551b96ceef69bffafbd6b6b4a5d59c2effb6fe43d05a220b59fa641949b5750e16d720f24841092f474d5f9ef6726a082aeb55d2ea3ecaabd2ad50555c64a98f9a62f33dd5fe70ff33bbbbd38369b9ab732032efddf6c93173b6b3aa9312813878ea158329653ddcc1ff9c5bc615a4f59edb9b419ee655e44997925afe647b9f4eeeda1f4bc6f151723bfce9fd8a9be078705769e748739d56c736a9fe727793d8bf3467e9a3751cf16d9020b5b891c0d34d14a93c5b5eb6b9eca4394ab399b555407186751260ea58dae9853c51de10668a354c4d2a6bd8ae0d0437f5dc7194aed67b61423a7cad73106f87c66fb1d387cedcbeb6b75de88212e304aef93062e31c61d8605bb9b9fa0a9f730898c6505d79613e5515765bc87559e968943ddc034e31161163bda313ee743e436167be5718602697591dc204b462e458fb12898adeec2777b899689c35751b9a6af11b025c7b08d67d8c96ef17c3dc40bec620ffbd8c1010ef112afb8837b753e490d6ffc465c9d27e5e210f7aa6fb7c8bbc3917c9331dee3033ee204a7498a95bcf05135a679d27e4f70a7422dac7f3d0e77f0a86ce114b7ab45aed923ac491c4ef018a7789200d6b191dde0293685be4eb3a36cb0ffeb78ab2cfc6dd7c49bf15347efc210a6b0d27b610b47b8c2939fbed8e6cc3935deb51a626e5c1d224eb929f422efac763800ecb10844281622124bec24b036442c565212b116a9c8e27edc1779da489aeb5b81423893d230f8accb0409960b01a225dae24c74c4b93025063be2228be3b6e88a9ee88bbdb9b42fc5305f1d264e5173bf7c1497e24a5c67d1e644271b78faca1737e256dc8991188b7bf190f8e2514cd6196a622a2a794b54c591a889637122ea1f78debb3a7af35d22aff1033c9e8ae6ea9c7492ba28a5d4ddff2bf1543b449cb27deb376fabea86b384e4af424d06ab2659598b6c72b03def924bbb8cc9a5fa86af46c5a719cd29f8d1fbfdfc3a080eb9da2749bb0e6a9e3fb71e36a7e4bb4c70a92b1e66c11c28a40545b4a498569450f1df541206f7df8752ca28272441448c607f949eb82189538bdae92af5e88c3ac9532de0617098a9dc7f3d95b1bd8c09c258afd3790c2f2cf1f99c2ea84b3dead38086744957744d375458cf3c2c138737cf67de7447231ad33d3dd0234df81eeb2c4dad813e36aea892277193aadaccebe87d3aa21a1d1f02879b4fabb3e94f22a3fbd359df4119a39e68356d9b63805adaa713aa53834ee5e83599ce34c699e230e4ace47e7b4f386216b399c35ce6319fcdd84e55916226d0476a2f8405f1304f5848d5b8b9b659c816f4213ee45270b89df3820ff14cf383953fb3188bd872c32563884dc70fd458cc562c616b96cad1cb58ce9009468ce925e5e2bf1506acc5daec8c75d839bb60cf757cac67d5a340314b321935b3c1aacf869eeab97dabe2e52d9bc637e27077ce9ce1cb4ccfafe54a99ab5c6c76a9b22cc356c4d915bb6637ec96ddb1111bb37bf6c01ecde5a25d2606f7854dd8945558951db1dad2b0b6318809cb4e142ccfdc59b2d3d1c54dac815693633888bc6ff60ff77a186faeb06df56ccb8b8c40ab1ae016f95ec6253bb627ec84d559839db2a654f191aa9b0f7eab9fdeaf0a68c055aa17586083c3f9a62b04b8e0816fc7bb1eede65a8eac81710ab3cfdae64fe5636f2f98dbb0702170b8d6b313e995d5b52bcb2bb8db1b464b46f62dad122ccddea234bff027a23a1d61c083ae62c3d0685e6488401856c0cfb711c90c14433a3cfb10dc8608969fd3899fa94f79b9cc8e76edd4b0c5cfec0d6f97ab79d2662fe323956760cc6755f34d6fbd2f91221f5bebf98e6b990b2862e3288415c89985b50d904206b9140401041b5dc86d2718d917df8cc3c2a7323675e913287c31685902dad178c3a4e24456a41825a5ddbeb5f9acaec75f8abf6709218c14efa6aefc8478e325040db6adb1f27d38d31a7a50dcdb860e9cf3a246cbecc2865dfc9b71f84a940e7c7cc165aa43d70b62077a8bf262e35f149e42dfb8e3c7bc3377e29d5d443385b7bdfc865058467b0897bf6f9f4be315e1b053371c4c9d9a1b7e0ff67e2c36fae92e13bf99c1f58fef553b9d863633ecfa57f370be277003426babacc87262d032645763c32ddcfdec3e57eac538e46b1859b3df794e79fc3630d677f7450e88c197b5f174cdcee1fe9fee2df885b856597af0f0f1e794c76f03aa872d87c9e7fdfe1285af8bfc309842e59fefb523a3e78cbda6ff1b6ba84c9e25a886f79fb16f5f8745387aff5e69152bced89f6e35d14170a88457ddfec1b1f77a7dd47e7d5dc0319c7c7c1dbddb4fead0383a086e3ff6bb7fa59fd4f761e65f211ff62bcad487ff552999fff03f297f70f879f983c33f38fc37c81f1c9680c3fffdfdd7ff0129439aee</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="2212">789c8d95cf6edb300cc6ef790a21bc0543bad46d80a0d8236ce8b1c0b00325db725c7405baee30147df7919428ff93a3f092d0e2cffaf489926f76e6e9f1bbd9dd6cfebce3fbd919d7e19bd9d57f5f5efefdfcf5ed63b3bdbf33d59d3954e6b0fdb2d9ee8d333f5e7f37fc9f8a0d7c95e0b4d6b492ca674d8fb79c5a4eab4315471b4dc3e859d393e3b4d7d4d59c22a7c7dbe37d28ee340dc5ada6a118383db9d3298c7a4dc3e87e1980d65a84cc488a2c894ec3aec31912ac1b055e4f82d4032b0ed35e4bc258235e4017244b1d325c173c27b974ec8aac396bd38c8485ba91dee90b66e47ccaa8971f91e597483759e564527097481aad9b96c2cf262d92ddb94fa13044b91748ef5b094f8c6f196e935c1497f3a4e7a03e6fbaa8d6ebcc5648719d4e81823e90006c3950208d85b97d9cb8b762112f1751bb8b74c9a1a3dfb02a44a67924ca66f839989bd452396b123269b7dceb01f6096e88ac5b1f49afce4fbdc5f0fa292c64dfd7e430b0069fdb15dd3b650516877c4b6437dee84527a4ee4b30938da89df465a6fb868e1758dfb6ba9fc9a2d06a887a7fe9f12990e12aa18618ae2f1b17502087930ca17586135b2261586940d3ed5222e7a84d6617bcddeb359d9618ff023fb7e41cac9361562a23a386ed8dbb33525cf83a24e588ecd9f853b3f245927da13a1b37079637e70a39556ee7ee5c41eaa2339f8812a9e8f29a2f92d24cb9cfe8f6f361f31f007ffc50</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="93620">789cdcbd47733cc9b1edb9bf9f82766b776dac1e50004a2cdea2b4d61278368bd4a2b416f3e52732fd1c6f924df27693bc6633ddb0faa37f08919111e1ee272245fdaffffad36ad4ffd37ffdafff385fac4be4fcc909add39ffecbbd6eb7cffff37fffefffe73ffe33f7f6f6a777f3f9f8c87dfc29f79fffd77ffca7d3fa93f3a7cc5bfa5fc26e56b998a6b7c19f48cf28a7e9ae457e4fd31da61791bfac2cf5d96047d26f39e5343d7817ce15df530eafc21f6fb9347feb53b994b07d207fbca7f53fc09f48ff214b7aefa29ca6c738ff8fa2e45fcdc9927f515696faf6e4cf347dda50b6129ed5c95f292fd03f1f8ed4e7de95d3fae627f2573a1eb30fe5b4fcfc4bf8f34dd83a823fe578f68e2ce5e743723e650bfdf389f659cc5f94fccb82729abe8cc852de437f7da27dcb1c59d2971fe4c247da7f33e1af379c4f8d9c97fe689225ff12f3edeb0be53d7049dae316c8385e918cf2efca76ca6f6057787e2417d3fcf38170febd28f94be02fc9ef74522ed21efc93b2ccdf2618f6e0949425dd0263fe3b45e534dd2b93612f5d30ecc1ad284bfe1759f2bbe077b4cf2928a7f9af0db2e4f73260b6d75116fb7d82d1bef0269c43f9600bfe147bacd7c0b097ca04ecc0de8e6499ef37199fe2c71bec794e46fe37b2e49f16c8625f4e0e0c7b6e66c892bfb5564ed3471db294cf6695d3f93440fb69cfc36fb2e4df0760b4df79574ef3f78a64c93f71c932df23cc8fcf37c9bf9c9325bffdad2cf6f00946fbbd1119e77f5716fbac90e578d385b2d487fefcc4f9597b32ecf75359eacb93c5be1681729abec27cfdc4f95a27b2d4676d95c55ff964d4d75296e365c862bfd65998fe629a5796e357c15f38de860c7f505696fa0760f887de14ec4afed65059fc35e697f10769fe05fa93fe608ef6e44b92be7c29a7e98b12b9f499a6c7c285f79293b61ffd51607d077049d21745b29596cf4afc28964aee57ca984fd6bb974ff898dae7bbc66b2f07867d7b1fcaa9bdf94f32fc47150cffe459ca92ff4186ffb0c1f44fbfb0f8a71919f5d784d53f659525ff832cf9fd89b2c4ff0d98feaaa12ce55764b4ef5d59d22b60fadfba729a6e97c852be325316ff7407e3fc9c1e19fe30248b1eb15fc239c607972cf9ed3218ed0f17649cff5159da87fecba17d414e59ce6f4296e3ef0660b42f6e9225fd78554efdc13a12a63f0e3264c95f0e94451f95c8e20f039c8ff1c7d2bf4f65f1e7ef64c95fcb92c57f44e81feaade88d2cf9bb5d65d1639f60b4df5f9025bf3555167f3721cbf15698df9f6cff4e59fc7f48867f1b2b8b3fc5f97ce27c1edfca69f9768f2ce5973c1efcf192f5438f05e80ffae7dd9d2ce58397725a7efd4616ff37769545cf8dc852ff0cf6457fed5d95d3fce1852cf5f5ceca72be6d32fceb97729afee8087fa17fec1519fe1beda5bf5ef694d3fcfe125c92f4cd5159cee742c6f1fbca125f5a6057f2c73e19e73f238bbf5da03ff2ef188f2b59eab3b764e8c92159fcfb1ce39747fb573db21caf5656167df14596fa9c37e5b43e17fe3b8ff8b46890e578f503d845ba4f96f832467f1718af4e64c49f1ff01718f65970ad34deb879e122e25306fdc1789359835dc49f2259e24ff6aaeca58cf3b5de5de10619f92365492f907d49877fb1be50be4646f98bb2a49fc952de82bd599694cfecc828df5696f4988ce3633e9964a9bf4346fdb0373b87fa3e9425ff962cf99d39382fe9569b8cf48db29fda03fadb467bdc8d729aeec2bfdb684f2bd573efba3e69e5c18897174b39f5eff1088c78183e9425decfc188efc187b29497f1d7f586f7549678f44d463c9b294bbc7b07538fdcc888df7365499f9225beb80b30f7131c6539fe1b19c73f2b4b7d1930cecf6b2b4bf93b19ed992a4b7c8cc8127f5cd113ba3e3a9d94e5780332f441058cf3b7ab64acfff2ca72bc1659ca077db2c41f1bfd4f3de0333ff4401028a7ed0d7a6429efa1ff72383ffb4196f2b5a1725a3ecc90a5fc16f381fac1f1c852fe745096f5614496f2c35f384d1f5fc912afb64730fae35a27633e3494d3f2551e0ffd33fc514ed32739b2d47fc17ca1fe08fb64ac27bf94d3f469932cf16ec7fc9c0f0fb2940f3f94d3f47a950c3d82f44ff4cf724796f29b86b2e89f7732cae37ca847dca6b2e82365c93ff8544edbdf9b9025fede6b60ee77d9ca697da73d19fae85339ad6f7a244b7d37ccbf4f9cfff34146fb5d6589f75f64293fba29cbfa0ce3f985f30f67cab23fd4224bf9c15e59f401eafbfa92fcf32e19fb5367b2c4f306ce9ffa64b55496f8cff2d01f0fcc7fa32fd2fc7e4359f4db8d2cf5db4bb2c4771bf5514f4437e5b4bca38cf5f29a2cf1df2f81a197dcb6725a3e80bfa09ef086caa9dee84a7c35eb55e14e8b2cf54febcab25f36228bbe5861fca93756276559ffa27f0b581faf303e05e899d58e2cebdf01ecb9483df3ad2cebe53a59f2f7615f451c6fe191ed34bd9705f3f85bb2a4cf61cf45e8a325e66be95dd2976bb293eaa14501fc259cc57c54fd84f357fd345116bdc0faa1a732f0af463f49febcb2e41f91a13feeca928ef134fa498e9f5596f42a19e55d6549ff248bbec8607ca8a7b26f64940f9425dd23a3fc4d39d52f59f82f935dcac7ca52de27a37c5f392d6fc11ea9bf32aeb294df93513e5216fd84fa8c1e93f4b1b294cf91a10737ca727cc44b9bfa714446fe9d729a3fc4fcb271be1e8f8ff3b37d65d17fa8dfc1f9380b32da8ffa1cb4a795da474ef77bf63e18fa281e83a177e2bb721a4fb75932f60b66c2d477514b59f267c8d0574365493f81d19e60ad2c7ac622a3fc5d59d26330f45cc0fab9fff4a32c7a3202f37a51958cfadbcaa28fba64d10febbab0eecf1495450f2ec892dfef294b7cc5f9e470be76818ce38dc9d063aeb2e805f4778e7a76ae2cfbf1cc8ff30f7bca72fe3932eaf79445eff1fc10bff7982fd47b4e958cf2beb294cf93a1672c65d99f4679ea3de74b59d2b36429bf47ffe87ed1a7b2e8c32919c7cb2acb7e7e972cf1db298371bece8b8cfda68cb2e83f8f2cf1d9c1f9ea7ed2818cfdfe0fe534fd80f3a53e733d65d9ef3a91a18f66ca697bbd1a18e7e7ef9565bf6a4e863eb295456f54c8d2fe32ce9f7acd5a2acbf5c4882cf52d3e9465ffe340c6f5c23359f4c3ed0d4cbd5f5096f1bd91a5fefa5e59ea677dd0732bad4ff4903310a69ef3eaca697a74254bf9f645394dafa03f8d9e93f5504b59f4e81759ca87b1b2e8bf4fb29cef05fec5c897b4be6b4d39cdbfdf93b19fd555167dc57457d20f3565197fb607fb53739e2ff4d71dfe87fad1ee28cb7ed98b2ce5c76732ca637ee6b9dfb65596e3bb645c0fce2b8bfe1e92451f6e317fa927672fe534ffc4218b1e7cacc038bfc93b59f4e315ed2ba0fda78cb2f4df1b598e3fef29a7f5afa664a9eff20d46fb5735b2e48f7ec892dfba2aa7e916e64301ed5ff5c168ef7449865e3c28a7fa701e90457f5e703e45b4b77d25432f2fc8a8ef4296f233f40ff5ab87f12de27ad06a03863e5de1f825eae133197ab6a1eca6f9d19e12f4f00af65b2a897ecdd864d18f73cce7922be9ce4e39ad2fbb2443afce95451fb13dd0b74bcc0f0bfa7939514eebcb5864d43755167d3626433f3e95d3f425f404f56f76a02ce57b64943f2a4b7a992cfa6c81fe32fa57faa7a22cf9fb64d4775296f41b59ea0b4b600ff5b17dd4c35d6529ef90a167efcaa9fecb60bea81ef695a57c4846794f59f429e6939d97f3714f64d4575496f13c90a177d7caa25f593ffac33b28a7e56d4d477b2ecad21e1e0ffde1579565ffb449c67e6c4b59ca633e513ffb2e197adb564ef37b980fd4d301c6db417b36321f4bd4d31b1b0c3d7da828a77a6a2fe757a27e5e379525dd05432fc65365d1734bb2e8bd6808a61eae90713d700ca6fe9d90513ea79ca6afe5fc4ad4bbe153598eef92459f850118ed093d65399e4d96fcde5259ae2f2ec0d0ab4e8d0c3d7d5516bd5920637ff30b4c7d7621e3fa1dfa97fa32b495459f6cc1bc1ebe514edbb31b92a53d0f5f59f4dc2719f55794456f92d1fed3912cf9abbfb09c5f890cbdf201c6f9b436ca727cd10725ee0fda17b2a46fa764e83b8cb7ee079694d3fcad0119d7272fca72fdab01e6fd220b32ea7f29cb7e9ce6177df1e2f1a99ffbca72bf0e8f07bd388f95458f75c8d08b0b65d12712ef4b5f387feb9d8cfe6c2a8bdef924430f1d95451fdec0d08fd687b2b4674d96f213b487fa705a564ef38f1e64e8f391b25c4fed9045afb470fed48b765b59aecf0ec8a2977a120f4af97739defd4096f2e7bcb2e8eb902ce51dcc77eabff05339cd7ffb01a3fdaf0fe534fdbc21a33d0565d97f0dc8a2df466db2e8a91bec2b8ff39b2dc952df3eaf2ce3d7204b7d65d81bf5a31391b11f5a504ef556780643cfee77ca69faf444c6fd3c3330dabfc92acbf563870cfd38208b9ef3e01f0bbcde9c214bfdc141394db7d19fd487bb1e18fa7479238bfe6b62bc8ae8cf68a42cf9c764e83dd86b11fad5f9514ef5e2ec4296fa239c9feac92559ea9bcdc15fa23f67b0bf128fb726637f14fe9efa30e328a7f17985f94f3de81cc8d06fdfca12ff2b64d10716fa9b7acfd92a8bfe5990a1679eca69ba87f1b72cb477a52c7ab44e46fb7bcad29e2c19faed4516bdb1ba83a9f71aca52be4c46fba6caa2b742b2d4e7c37eec1cf4758d8cf24765492f90511ef551ef792d32ca3f94a5fc8b8cf2b06fea3b7bac2cface2543df9595533de5c0bea8e79c25197aaea69ce68f319e0ececf8f94a5fd5d32aea71f95d3f26bcc0f07e7e7c7645c5fff5096e3b13cda1f2c94d3f408f6eca07ddbb4bf3edea907371d65d17b7361d5830de5347dd3268bbe3ac660eac3b9729a3ff2c8927fcdfcd087d13b59d23b3965d99f6d82a9174764ecff1694450fbe09532f460365b91fe041869eeb9025fe974330f5a3af2ce5b364ec3fd6c8d05b2c8ff6471732f21795451f8ec8d0876d65b9be4b76a47cd453167d9527a37c4759f41bcf1ffa659311e6fe67f0a92cf9bfc8381f4759da53254b7df1068cf1de1cc8d8affe5696f22b32daeb284b7a832cf5bb4b30ef7fbc9351bea12ce59b64dc8fd65516bd7803a3bf624759fa3347c6fede5af813f6605fc9c87f264bfee15059f40ee6e727ceffc6749cff6047863e2b2aa7e59fb017ee97366664ecb73acaa267f7609cdfe2a92cd7eb351dfb853765d18f6d32f4e74959f4ec8f30f5ac5b24438fae94452f29439fd594d3f4f107187a76fa5296f24f32ee1f44fba967274b65695f8e2cf9bdb1b2ecff75c8a2c7466c8f8bfac6caa2b72b64dc1ff8a92cfad127e37ef1908cfd48d803f5ef644e467defcab2ff5c25e379932359f4d9a004c6f9dc466439fe730a467be2a1b21c3f43865eac0b539fbeaaca69feea020cbd7dda91a53d33f85beac7c98a2c7a6f8bf12a42efae43b2a4af26caf2fc0ace877ab28cf12942cfda0bb2e83dab4f163d68dd94d3f41dfc7d11faf5c0fcd0976e4739cdef5cc9a82f22cbfee302f3a184fd4ebf4896e3592159f2bb57e5549f9de14f4a687fc321cbf1326f64291fc1bf95d09ed54059ee7f447f703f32bb228b5e1a203e58688fb327438f6dc9d053f02faa1f4b64e8d78cb2940fc8d08f387fcb93f62c2e64a96fd55416fde59071fc8db2e8e10319fb7715e554cf4ce0dfed9c1c6f1591e57876a82ced6d91713c2d8ff3c993e57873f86fa33fd3fadc2f6569ff888cfa9aca52df848cf6dbcab2ff88f3b5a1cf8333197a355096e3b13eead5a1b2e83bf4a78dfe9e1795457f1ec952bf7b5696fdd41c19fab6aa2c7a12fd4f7deb9c94a5fc9a8cf20d65d1b7e84f07fd19b33cfacfed91a5bcd75196f22e18fd131694a5ffbec9d0ff6fca52be0cc6f946ca923f5a2a4b7e8cb78bf38b666449df891ed4fdd5a3af2cfa55f48aeea76e6f64d197873218fa697b254bfa7e0686fe89276449df3860e8e14d4b59f498d8afee9f6ecfca697ad32243affd80a177d77db2a4dfeb60eadb3619fa7443867eec82a95f0365797e624b46fe9ab23caf86f653af86dfca52be4bc6f5e9beb2e8c13a19fab708c6f9c4aeb2e46f91a5bee8a02ce96532f4e914ccf5cc898cf24765692fdb07fdb6d981d11feb1519fad45696f23119c747fe4fccafb8419674ff038cf9b55e92f1fc709e0cfde32b8b3ebb9171ff01c68ffa73f2a12cfb8957b2e4ef57c0d09313f197baff69bd298bde3a90911ff35df5e15559f4cc940c7d88f3a13e1c87ca52ff830cfdf5a12ce7fb09861e1c7f294b7a818cf24fe534fdc2f383fe1a61be50ff8d9e64b477ad2cfadb238bde19637ee479be3332ee37ad2aa7e9b50119d7db615f799cff7843c6f14bca727ccd2fe5bbf05f799c7ff34196fc1df1d7a502dadfed90a5fd5b8c07f7332703b2e8bf368e5f803e1d8ec9789e7a4596fc55d82baf57afbec9b89f74a72ce9684f11f7772ee0dfb81f795c2ba7f97d1c8ffa30c67ce3fea297278b1e9b58ca69fa0bf65f827eddd4c852dfacac9ce6b77b64d4f74d16bdf6e2f1b05fbb667dd08b5bcccf12f46b1c90a1275764d19f4bd88b85f6bb2119fa70ac2cfb894bb2ec3776d11faa272fca69fef13759f29f309f2c4b8ee7d7c9d8affc24436fce95d3787b823d183d29fba513e5b4bce593a5bcc7f3417c3f61be187d287a70a09c9677d664296fbd9445cfecc8b83e8bf1b3f372bebb2a59ea732f64e8cf4859f460878cebcd81b2b417f1dc46ffd843b2948f783ce89fe8a92cf5b7c9d03fefcaa95e59623ca90f371765d9df3c93a13fa7caa21f4b64a9ff84fe73d07fd14439cd1fefc868ef4b59fa372663fff2a29cb6f78cf174d07f518d0cfd375696f64fc9d09f7565d1c7387f07fd39e991a5beb5a32ce39d27e37e8883b2d4c7f347ffac9f64e43f2aa7f98ff00f2efa63fd224bfef8a02cfa13c777713e9b97b2d497a67fea7eeef94b98fbb7c712197a330bc67eed6eac2c7ab14bc6fe6e4159ae3fff80a177364d32f6775b60e8d19a254cfd197bca527e0246fd9b982cfaac7a02436fc60b32f4ea50599e47bd81a9373f94453ff964ecbfc5ca69faab2e4cbdb93e298bfeeb90a1cf32ca928efea19e8c4a64e8db97b25cdf46fff27a7cfc4146fd96b2d4b7234b3cee94c1d48b5565c9bf26e3f9e548392dbfd90bf3fed0b84e96fc9dbcb2dcdfa8f9453f9c0230e6cf9de9bcffb54796fc1dcc17ea47ff13cce7f756ca723f31e6c717f4ed53197af00e86be997d93458fb4bfc8d043682ff5db64a82cfa03e369f45a5affa8a22cfaa94886fecb298bbec3f852af0db364c93f9c2b8bdeda90f1bc70a02ccfe3623e53bf0d6db2d4d72c28a7e9fd3619fb911159f452cf0543cf35bec9789efa1796e7addec8525f93e7037dd6c4f916d01ffd96b2940fc828df5196e363bc0be88fc60f59f25742e534bd7e06e3fafd3847163dd7807d533f5630dfb8ff38382bcbf3cab0ef22f46819e34b7de8c464d15f5d8c4711fb9de53a19e50bca72bd9df5419f856bb2e8a117f297a05f9f39e5b4fcab4896e3bfaecaa2372f64d487f3a3deb44a64497f2cc1389f87ab2cf7678ec9a2670f383feacbc7802cf58d0fcaa28f9b64d187cfadb085f6060fb2a4677ec8a2cff6b0570bfba93ecb436f663ec8a2371e988f9625e976868cfb43df95533db5467f589ee4bf4d95d3f4934f96f2d7a7729a7e9991e5f8ad91b09d93fada79e534fffe870cfdd95796f46f32f4675739d51307f4a7d19769baffad2cfa704696f2bb9ab25cafef90b13ff945163d71443cb1d15f7e4139ad7fcbe3419f3bbfb0ec475a64a9ff8cfea5bedcfe28a7f9b73e19fbc94f65d16f2bb2b4efec08534fba5db2940f4ecaa2bf2c32f454a89ceaa529ec83fb8f615e59da179371fdbda62cfa734146fb703ed49331eb477fc47b32aedf7f2aa7ed99c19e753f724e96fc7bcc5fea45bfa22c7abc4896fc3bf87f17ed3d74c8d0eb727c4baff74b7b2dee4f9e2d30f55f5159f45f0086de3b6595a5be1718f51f23b2e4df8d9425bfc4338b7a70f70dc6f177a1b2ec8f5ec8787f8c0fc6f1376bb2a46f1b60e8c1bda32ccfef487f5bd47bf15359f4d32719fa28a79ca66fc660b4671329cb7ede818cfdc0b3b2d45f248bdea8a17fa807d75332cae795452f7e91b19fb805430f461d65395e812cf1bf8ff1e2f5ecf5918cebfb3530dad7427bb95fd7b0c8d84f5a82b9bfe428cbf5d21fb02bf3a33a23438fb59545efa07ed5531332ea8f94456f603ca9973a59329e17ba90450fcc3e95d3783b447f531fb55f64e8a395b2b46746c6fd85b2beb10ad08b831719fa77a42cfb659a8ee74fb2ca72fdb74bc6f3cd7d30cebf5d5696fb33e764bc2f2ca32ce9ac1ffab07e5196ebbd7bb2f44f03f657c0f9d5eaca927f4596fcb5aa72dade4a878cfd3bcc0feab1d60718fb8395b6b28cc7822ce52bb067eab3eb9d8ce75330bfa8bf46cc8ffdbcb2e8538b7aaa8c74eed78543b2e88f2de61ff7db462de534fd5e01a3fed78d2ce95594a7fe79aec8926eafc9a217ac1e19f7f7e1fc2cec173e776429ff1893457f845fcab2bff64d861eca9125fe3d31ded44f9eaf2cfa624e163d10b13ee8a5db8c2cf5dfafca928ef2d43bc18c8ceb7f987fd437e1882ce9674f59f44c40967878c3fca65ed94764291fdc95a5fc832ce54f883f36dabf1a2aa7f51d5a64ec2f1694458ff078d03331ec93fb61c18f729a7f572163ffe75359f44b8e2cf1fa81f639d07bf71719fb6d75e5b47c38254bfd5b4f59f4494496fad75a3ff6b3606f0efa6fbb224b7dbba6b2d4d725434f227e38e89fb54f467f47caa2772c32f6ff6eca697b2e983f2efaefb220a3ff2aca727f6e968cf620debae89f9b4d96fcdb0fb2e4dfe694a53f36609cdfa6ac9ca6ef591ee773e892a1c75aca921ff57bd0a3a7349e7ee5a8b7ce9f60ecaf9df2645c0fbe80a1a78ea1b2e8ad800cbd5312e6fedb66a12c7a4ad3a15f7a60eabd2b197aea09a6de9a92513ea72ccf6f5b60b4673b5116fdf4264cbdb51e9145bfb46330af3f3794d3fcdd3519faec5d394dbfe2fc544f313ff7d7787ce8a7ea198cf63d3fc8d053a1b2d437234bf9c65e987a2aae90257d8df1d3f7dbacc888e71b30f45d7b4b46f9b3b2e88f3732de1f83f6f27aabfb2dccfdb32eeae7f5d336eaa33e8bd1dfaacf3264bc1f262b9c2fa1be1219fb6d981fd44b838bb2ecd7c464d1139d8130f5516baa2ce7e79125ffe0ae2cfb672332de0783e3531f0daecaa27f6664e8b51f65b9be89f329e07c3a1619ed1d2bcbfd7a3e19cfffd6c8a2277a4b30faa35924e37d3d0159ca57bf95e5f908d6073dd36d0917797fde0f19e53d6539fe090c7d550d94459fb13ee8ab2adac7fbed2a387fee6f55b2cab2ffd514e67e541ff6cdfda741952cfa29982acbfe15fa9bfb4f8f2e59f297d1bfd457cfbb729aff32264bfef64358f5d69a2ce9f14059d29764ec57c13f524f8d4fca69fcad3a605ccfb4b364495f7c91454fdc301e9687fdb73e19c73b28a7e5431e0f7ae485faec1cf4e49c2ce5ef67b2e45fdf95d3facae87f3b2ff9e33619fb51b1729affb8274bfcbf4c95255ef2f838df88c7a3fe5a91a1df5c65d15f9a5fe27783f5e1fcb73b32ce275016fd78244bfdeb0c59eaebe0fc1c9cff714b46fe87b2e8b13259cadfd1ff0efae7365196ebbd5db2d4b7a82a4bff4464a96fba52163df441c6fd632f309f3f1e28a7f9374f329eefce2b8b3ee1f9416f4563b2d4b7392bcbf5cc1f32f4cc4339adaf0f7f43bd750ac952dfa1ad2cfaaf47867e7295d3fa7a181f17fd710e94d3f2fb3732f4524359ae7fc21fb9e88f7d4c46fe0e98fb85e87f0fed3b8b7d5bbcbe79fa02434f9d3360e8a96d5759f6a7643ee8fed4be0f863e3a0460d4b72b2a4bfe23197a6caa2cfae40ac6f1b663b2a45f6c32de4783f672bf6af3a32c7aaa40c6fbf83e95452f91b95f152a8b5e7991f1fe7ba6f3faea858cfaf3caf23ee2988cf721d6c1389f474096f2ebbdb2e8a909197a0cc7d3eb933fca927f4cc6f5ca0618ed6faf95e5fcca64e4ff5096fdac0318e7d3ed91f17cc7bbb2e8a54f32eec71a81d1fe8ed893c5fbd3061118f17f83f1cfbfe3fda2186feaabc113ccfd27894fbaffd3fb5496fd2f1f4cfd3224e37ada988ce73de764e88b07187a6da08ceb774f65a9df26e37df518ff229f67e89025bd5e218b9ea8a17fa8476a0d32f4c81b18ed6d77c9923eaa2b4bfbdb605e8f137da1fb3d15d80ff549f30e86fe182ec9d027682ff5c47005867e19a13cf5c0ed5b59f40cfa5fe339e617e3f9fd4896f8fc189125de9c61cfbcdfe8d12363bfe54246bcc578303ebf583ff508c69ff17656214bfae4872cf5edd11f8ca7fb2d19fa00fdc178796890b1bf04ffe9401fdc4b64c4e3aab2acdf3364dc2f642bcbfddd7332e217cb33feb13d887771878cfc77e534be3c643d90ec2fa4ed69df94a53d0db294bfa3bcee273864ecb78464a9ff6681717ef72719f1b94296fa670b65b9ff09f6e4e2fc2e5932f63b1e64ec2fc8fa2ed95f90eb47f07f1eda734efb27ffcbfec20719d7734aca723d88e9888fe7ac30e3e1e141467c2b83b19f71b8284bfe0118f51f5e64949f28cbfbcb7c308e5fff5496fd891219e58bcaf2feda2f61beef777722633f62a42cefa76881110f371f643c7f87f3ff407baf4de5347fe34e46bc5a29cb7a9ef5717fe149463cfd524ed30775b2c4933b8ec778585b2acbf385e85fc6bfcd868cfb7fbe9453ffbcd6fc783eaf01467b6b6332e2d95159cacfc952be8ef632fef53364496fa03cefdfe96695e57a88a623ff198cfd8a6e9f8cf534fa93f7ffb4998ef83552967855a90aebfd3c77b2a477f760c43b17e75f407cdebe91f17d21983f852fbc9f05e75f40fceef7c9b83f674896fa878eb2dcbf342563ffe01d8cf3e977c9d88fc8284bfcc77817b1bfd16f2a4bbcc67815b99f01fb2aa2fca04c96785bd574694fb32dccfb531a3b329e67833d32be0e0361c6c319fadbac87539efe9071bf33ec9bf1708ce333de3dd17ec6b75a058cf8f5dc28cbf36075b2f8f72bf23b582f8f8f64f1afcf6f30e2d57143463c833f7350df13ed7719af8b64ac073fc9e2ef17aeb2a4bf93c55f8f591faf6f2c95d3fc471c9ff1e3915196fde71e18f1e1fa22e3fa7fac2cfbeba89feba5db828ce7a11eca125f703e1ed66b8382b2dc5f81f679bcdf358ddf795d5f9d7f9453fbb888bf31eb2bbcff7f4896f453812cfef6bc0073bffc5b59ec6f43c6fd01ef60c69b2759d2eb236589171f60b4ef7025e3fb68a43f74fdb5ed28cbfae848c67a6dac2cfbe15930e2cb2e43c6fb2aab607e3f4e4159e2514096fcbbb3b2b43f0f467b770b6549df92111f56ca52ff3b19efc7447f7ee27ceb3b6589371119f58d94657da6f9b11eac81f97d343fca123faf64c9bf43fbf8fc7b79ac2cf5b7c98837596589070332de17cff6e0fc2bb1b2c4e31719f73b34c952fe29f3df62fc6a5c94c5ffa23c9f57aa4d94a53d3b32e2db09ccf7310dc9b83f00e7cbfdf7d1802cfebb2cf1dce2fdaa833519cfef301debc30e8eaffbef5565391eeae7fe7a9fccfdf21c98ebcb2f329e27bf815db1cfde0719fbf92e19ef4b427b8a88afdd3219c73b28cbfba5f660c4db6e9d8c78d75396f68fc8f83e9a988cfb39311f351e2ec1e89f6e5559ce7743c6fa99edc3fe7427142ea1bd9d1f32d6b325b2e46f637e95189f3d32becfa74e96f8da81fd97a017da4c47ffb72232daf3ae2ce5dfc06c2ffc01f7c7873e18f1fa3913e6fa73d424237ea27ec6e34e178cf85eee91259eb7600f0eea2b3b60ac4ff70b6559bfc29e1cc4f769958cebbf5965d91f44ff733df73c2acbf31e6f64ac9f5a64ecafa23e17ebd793a52cf1da26cbf1e74d65d9df7d27e3fa3dce97ebbfc7948cf88dfa197faf65329ea77f2aa7f1748178e7e178ab1119d793313f3dc4fbfb4359e271dabec287c6e33761c6cb7d1d8cf5e065a02cebc177b2e46f309dfba53d32e2a547463c1c0a335eee4764493fcec05c2f9ec952dfe1ae2cf18cf5217eecd11ec6cb6d8f2cf59fcecab2be5c83d1fef60f19e5591fe3e55c59e2e5928cfbe57ee1d43e8f0de14fe8997a898cf83f21a3fe6f65896f5d32aefff694d3faf71530fae3782763fff643599e37617b185f313e1a4f3764ec6fb23d889f0fcc17c6c7cd4c59e2c74998ef87a90fc8781f4e1efc85f61cc988977365f1dfe84fde4fd87b2a4bbcbd92b1bfb900e3febdc1868cebebefca69fa0bccf8d9fe04f379e00719f7cfedc07c9f4a4016ffdb3d08f37a756b0b863fef62be73ff35ca82192f513fe35fbfa32cebc32659fcb7ff05463cec6dc988270e18edef4cc15c2f4664bcaf10ed29211e772232f2c35e189f7a47b2c4b7fe58d8e2fab008c6f5df32ec95fba515f49f9d13ee617e30de0c30bf195f1a980fdcbf2c233fe3c5a40f467c98d8caa9bfacc0bf71bdf67a90c53f6f4e64293fbb81110fae0fe534ffb446167ffb847fa17fdf3d95657d09fb71b17ebc97c958efad94255ec01e3cb4efe19025ffa0a89ca6cf7764f1f74dcc0f0ff1aa5d204b7b97b00f0ffb8d43cc4fc68b39fc958ff87291f967f3fb422f1d32ee47ca81192f94c57f5f5a60debf9425235eb8c2ba9e5a93111fa6607ebfd6858cf83007e3f84d96e7f5b62219fb791930afb739645c9fda92e12f914e7fddb89125fdd607737d3727637d375496f8e193b19e7880b91e0dc852fede5296eb6d6b32f6df0a60b4ff1192b19e03d33f372764f8df85b2e8cb2119cf77693abe3f2a02c37f0f3764ac97bec058df0c1a64d4375796fada60bc7fa155524ed3cb3c1efcf9f8a99ca63fc5ffd8f4e7953519fdd35016ffbf03a3fd3d96e7fb6247cae23ff760beaf6040c6f365122f6dbedfb55301f379be2518d7a78e122fece217fcff9e8cfbbf7b64d1efee1bb824f9bb0d32fc734846bcc1f1e9ef7dd8a3fa77978cf5d19a8cf5c10c8ceb73ed2a18f1ab83f950c27aa8f34dc6f7d57f90f17d56980f8c0fb53e59ceaf85f2168fd7204b7d2db4d7f2849b2d32ee3f427efaf75b962cfeb36c83e1cf9b7930afaf4cc8f0d7b06ffadbe655394d6f321d7afce692b19ff7a69cfacf81c44bdbe7fd9fe9f9163ff87d3c973619fabb0b863f3badc078bee65022c37f3a64f84be4d7eb1f3932fc711f0cff79fc5496fd18a6b3fe2f32fc99a6437f378455dfeec892bf3e5616ff5604f37ac55059d27d30f7bb0eca527f4416fb3d5dc068df2d5616bdbf10fe427b0ea1b25cef3f93e12f519e7af5f14e86bfdb29cbfd785730de3ff32c2bcbfece848cfdfc1919efefc3f9d0ff35a7caf27e17655cdf1893a57cf526cceb1b8d2919d7779acae2ff5a60f8ebda4c599eb7ed93a1af3760f8efce4959f2f7c8b85f33a72cfeb30e46fbeb1d32f4725f59f21784e94ffb1618fe717421e37ec70718feaf7753167ff302c35f4f3e95c57f8179ffc1b4a42ce9183fea650ff3a384eb4121e64309febcb322c39f55c852ffec8b2cfeab8bf129e1facf6246c6fbba313f4ab83fd77d27cbf1e663329eb75d0a5b685f674dc6fb776a60bebfbb41c67ecd1bd892f6b7703eea7fabc2761ed787ca64696f03edb52df867cc47de4f5071c1d0fb3d1b8ceb3715b08beb35e58eb2e87f9477a1ffcb1930fcf9eb4916fffd447f514fafda64f1c74fd82ffd79fb0e869e6f8d95d3f4c58d2cfebe87f9c9fd9786ab2cfe1ff642ffdf873d505f5f53bd59fc451f7f08ebf7d3be83a10f8f1659fcd9790446f9d35c59f4f88c8ceb299a0e7fbd27c3bfcafcb4e9cf0f4532fce74d394d3fe1f89fd4e77932e2454559d6ff7530dadffe5616ffef82e1cf0f627f36fd777dad2cfb356db2f8bfd310fc85feaa92111f9fcaa2ff5d32fc7b8e2cfeeacefae1df9b1be5347dc3f2f08ff5080c7fde8d95257f9f8cf7436c9545cfa2ffe8bfdb7b65d1935b32fc670b0c7fdd46fbe97feb4c87bfed8bbddadcef9fc464e8d73318f5756764e8cb2518fe76ba5796f7c18660f8d7b1c45f9bf77fcd4e60eec763bc78bdb983f6d07f6e0361fab3768b0cffb420c3bf61bca81f973619f74363fe5816de5f7223e3fde153b027dcfa21e37d13b04ffabb960fb6b0fff14ec6fd6615e5d41fd6cb64d92faf3fc0d0b3558947b683fd912afac3c1f37ad5b5b2f8cb0118fb2315d18346efc23f76c1b89e5d86ff507f29fe4ef5ee0bede3fec1f45b59f623d0dff4871df1cf36fd5903e93ef617ae697b4b9f5c9f9f7264b1c74b1d0cff743d9361af1965b1e76f61faa7e31b59f2376330f4ecb540869edc2a8bbf417b546f7e288bbeed92b1deef81797dd523c35f39cae23f8fc2f457873c19fba90332ec3d02c33f6dcb64accf57e012daf720633ff3a09ce6dfc564f827b4efcb85bf9f91e19f3cb2e45f77c8f02f4b61aeb7f75732fcd9a7b2ac970f643c4f7c03437fee2c6539bf37329e971981713e8d0919e55d65d18733b2f8b7da05cce77172caa2c7bfc9d0bb981f7c1ea9de26e3fae28a8cf7e1e078fabe9a2e19fe32a32ccfcf603c78ff4faf4ec6f337e85f5e2fed5a64f8e783b2f8575b98cfff54a7601cbfbf258bff9ab494453fa3bdbc7f763a278bffea63bca85f7b4361aedf5d32f46f0bed37eb73f97e3f970c7d89f6da39f8cf9c725a5fb306a67f0dc9787f21ecc986bf6e3964dc8f84f963e3f99b06fadb41fdb53619fe17e7e7e4f1bccd8e0c7f0b7f40ff5b1991459fd69ac22eee5faae694e5f921b4dfc5f5d34a4f59fc33dac3eb8515d89f0b3d5cee93c57fd771febabf5b0443aff6301fa947c7a88ffaf39aea9792c3fdd44b0fccfd52e92f87f77f5c2330f60bae0765f1670532be5fe004e6f3039f64f8bf2f32d6ef3330fce72eaf2cfe7d214cff79df82a1e7f61d65c93f01c33fde71bef477b51519fbbb3619cf0bcafc73f2efb83f24244bfef35639cdbf7d9171bf7f5359fcdf9e0c7f3604c39f8fa664b1f707cbc39f37c6cae20f2232fced890c7ff700c3df3dd6caa21f5b64dc8ff8a52cd7bf783ef02f3589c78ebebf220786ffaede9565bf7642c6f3953b30f607da2765e99f3c19cf0b3495454faec9d80fc478f3fe92ae4d46fe0d19fe4ae2a743ff38ec93e10f2365f9be0517ccfb496c32f61b9a643c1f89f3d3fdd73959d2076f60e8dbb9c44b87cf13cc31febc3f72d926e3fd0c983f764efcddb24916ffd27a07e7c5bf2d3d32fc25ec95feb2dd214b7a2b00437fb6509efeb29123c39f62be38a8bf8ef9e250cfdec9d2fe3aced7c1f9d47aca723f27e623fd6505e343ff58c5f870bd5fe992c51f36d05eead72ac68bfeef9cf6afa57af1f446c6f3e23b30afa7ff90c5bf5c8f60f8b3f3044c7dba5496fabec8f06f48e7faf55203c37fddbacaa227dfc1b0ffc349399d8fd710ece2fad097b2dc9fb716a67fdabd91717dc60773bdfb41c6f77d8cc138fee59d0cfd7456167f159361df685f1efeb5f6ad9ce63fb864ec3f5ec9f0474765597fa37d05f8dfc352394dbf6dc8a8cf56167f7827e379a6adb2f827e6873f3b649425fd44c67e6d4559ea673aef1f2893c55f8ce664bcefaf0ae6fb759ecae29fdfc952fe5910e6fd00ed1159fc4d3b0b467b26cccfef53c1fca77f1a2dc8f08f3565f9bec11918fe7374228b3f187484793ff8e48b8cf53cec83f7834f5bcab21fc8fcd8dfecdd95653f14e3437d393a80713fc10cf5f17eb539fa97cf5bcf67ca927e13e6fde52d0b0cff379f90c5ffb87b30d6ff59cc0713c0e5fe27cc37fabb06eccdc1f19a756197fe724b863e2c90a11fd19f2ef6431b4ca7ffcb83a137ab38be8bfbe3aaefcaa2173d61eac1f200ccfbc3c51e8dbe829edb93b17e8e94c55f8a3f54fd75a980e1bf4e0b70097aac49c6fab005867f3acec9b067195fd55b8f1619cfbf7c82b9ff3606a3fc6ba32cfe91e5e15f8e622f0efdc55359d2f73565f1975332be1f09fd55805e7bf6c9d05739b2e43fa0bf0af097a7abb2f8937732ea8fc168efb5ad2cfeaf43c6f78fde94d3f47343b888f36b76c9584f1fc952fef1a12cfae60c46fba73b32ee2fed81e13ffa5765d14b6d32fc419e2cf65d7d8079ffd4960c7f82fee2f32413cc1fbe9f6b6c91a5bec94e59fc03ce4fef676d29cbf39ba84ffd85f8cb441f895e6a91c59ee64f30f22f601f7cde645e5596ef5f42fb1de8ab26c6c3c5fab281f9eb623d59c3f8a83da33f68bf95a1b087fb8daee97ac536fa01ebb32518f676a92a8b3e1982a10ff66d65299f13a6bd5d3fc9b87e19284b7ced80a1172e4f308e776b9361cf1f64dc7fbf06c35e9f4365d11b13618def1b65b1378f8cf8fca92c7a620b867d1e9b64d8f79d2cf3ef85f6d03e1f0d6559bfa0fdb4bfd71b19f6b3514ed32b6561da5bf9938cfdf9aeb2a4a3ff8ad017d50919fb4f2565e91fe687bfa88e9465bd7a22633f6aae2cef136e93f1fcf5018cfda4674d59aee7edc9927f5820e37d2c685f89fb4d59329ebf5e2bcbf3d90b32fc411f0cfff2ea90a5fc78ae2cfae94c167b1fcfc05c5f75c9b8df9dedc3fb647a1530f7b33e94e57e758c27ef4fe935c8d0230e98fa254f86bf692b4bfb3260ec47f55a64c93fe881a157665965795e0ef39dcf8bcf703cbd3f12fd49bd327f80b19e9a63be3bd01b83900c7f6581a16fc617e5743f68e990b1df84f9a7fa04eda1ff6ac2dee8bfaa5fc21ef4cb358d77b64bfff0da8261ffaf1f61daeb73a02cfbbd3d30d63fe51719ef8faa2acb7aa40e46fd67995f6e11fea3525116ff6193a1af0330daf35a298b3fea91c51ecf3b6589bf2330da571d90b17f8bf6f37993ca5359ea2f92f17e2bf41fefc77d6cc978ffe65e59e2b103c67e455f19d7a3dec0b09f3eeb47bc3e76c1684f794616fb18f6c8b08f2919fb0962af2eafc70d2660ee97ec9565bf7b4596e38fb3ca52bfa6e37de7689f85eb6dfd4fb2a44f3bcaf2bc691b0cfb9a94c8621f238c1fef479e59ca62ef9a2ef9e70b30f637665d6579bf42014c7b9478edd21ebb7965c95f22435f607ef0fe88c5942ce9b3104cfbcf8071bc6b6a4fce17e3f9f50d8cfd85eb828cf40f30ecebd6142e307dae2c7a340746fec39e0cbd3b0543cfdedf85a94f8f7532e2d95059fcc112ccfdc41c59f25f7e61897f1530ecbff2224bfedb5659d2f364b19f7d5559bedf9ec7e7f70b74c0389f4a918cf7ab8d95e57a749b2ce5ebb67089d7bf1cb2943f5594653eff90b1df5906a33f8e2d32e2fd8f725a7eff24239e4ec0d4e70d32ded7c6f671bfa14e867fc891b11f88fa2dde9f755216fd7020237e97c8785f6e160c7b1f2dc9b05fcc1f8d9f55b2d863e70246fcec1495c5be95c5de865d61daf3644f167be9afc1580fcc6c32ecbba39ce66f67c0b8be3fbc9051ff810cfbf6c17cff8a4b167b1ea13efa877e41599ebfdb9325ffb0a19ca64ffb603e9f07fbe5f5a981a72cc7ef81f97c5d46599ea7b890f17da29630f767a7e81fde4f3bc7fce0fd56159cafef63ff55ec43e3fd4dc6d3a5debfb59425bd06e67aa34c16fbbb55c0d013e72e98fe2612a6bf390fc8488f95455fa03ce3fdd3554ed32f0f30fcdbb9a72cfe6f4616ff72f1c8d0d70e18eb89038f8ff87ab0c8623f77b16713cfa13f2265b1ff2119fe44f34b7db74fb21cffe0298b9ef8208b7d9feb60ae3f0a64a4637c4af0a7c71a59ea3bb03df097278c17fdc983ed813fa91d95657d3f25c31fc97c74e94f2e1f643c4ffb54167fb32043dfbf29cb7e1cda67e1fc6a4c87bfbcedc8b8bf7105867d8f8a64f1374d8c3fef07aafec272bfe7988cf58ec423a31f24bd7521e3fd54dfcab27e1891b1be3893f17e8c8ab2ecf76dc1b8fe339d90a197d09fbc3e3e53c6f5960318feb4bf21c3deb364dc8f89fee2f5a061890cffe690e15fd03f7c9fe2e44416ff31c278d05fcd8aca525f00c6f1c75565a9ef4696fa266765b99f53fc95cbfd985944467d7565395ff80b5eaf1fcc9425dd21e37857e5f4785df40faf57cdfa60b4b7d7234bf93ee6b387ebffd7f47c5dd553b78630fdd76107a61e1893c5feaf5330fcd3fd0d4cff182acb7aa246c6fe465598fea6fc20637f734a86bf5a80f93e609f8cf594a6e3faee4459ae2fefc8b83e6281f9be83bbb2f8f33d19d76febcae20f707e16da5bb993e578c71719f6fe4dc6fdcb6d30d7730e19fb29181fcbc2fd3e1932fc2debb350ff910c7bff04c35f0cb264acbffac2760eebb91118f7c30cc6cab23e71c978bef20ac6faa8f241c6fbec3a6499df2de6c7f5dff29c8cf54f4816ff33c17ca1bd0f8b64d487f9e2e0fef051960c7fd05516fb3d92c51e86182f5e5f198564ec674c95e5f85732fc475b59fc23e61fafcf8c2c32f4d7bbb2e82d8c2fafd70cfa64a4db609ccf624396f68f61afbc3e3db92ba7f6bdc478f1facde44196fc534b39cd3f8b853dbcdf60b606e378bd0118d77bfaa8cfc7f5f09bd88747ff71ee8361afd71919eba51798df6fac0c7b94fef2b8fea83cc832dfef0118f53fbb64d8cb1b19fac806a3fed7820c7b1a93b17ff0a59cceaf7353d882fea95b64941f91a5fc2b04c3be0fef64b1b7d38d8cef639b8369ef3f64ecbfb864a9ff10294bbc47ff599ee43f56c8927ed274e88d0219d70f5bc2c61f48fb7d65d12f5f64ecef2cc9288ffeb1f3f0bf5965e9bf0319f7db3dc178fea37c25430f9ec9787ff78e8cef871b93c57e1a383f1be7d7ec2bcbfb461a647cdf4aac2cf6ba2163bf66ab9cda6353e6bfe7e430ffba64bc1fdc03c31f55cb647c9f5e8f8ce345641c6f4546fc477be87f6ee83f07ed7ff595458f8dc9f037df64bc7f12f395fea673554eebef223ff5c7e8870c7f535396e71dd11e17fd3f2f93e15f2bca69fe619d2cfe628cfea05e19b7c878ff759f8cfce26f3dfaa7fe5e599e971f82d1befe9d8cfbcb313ed43fd3880cff95b6dfcb53ef5c7d30fcd5dd11a65eb9bb60e8fdbb0746feeb842cf6f040fd25eaa10a19f9591efee8fe2d4c7d715f81e11f4e0332f44c070cfbaf6dc992de792acb7ac727c35e0261dafbe18d2ce5bba1b2e89b3219f1fc06cec37ffec2f27d98683fedfd352363bdf6ae2cfaca254bfb4e5565596fa1fdb687e7eb1e64c95f2b0ad35e6f79b294bfedc9d80fda92c51e2e6730fc55f947392d7fbe92f1fc445759eeffcd81d1decb2719fae9a22cfa27268b3d341a608c57ad40467b589efebb26ece2fcee3d32de376c91f17d921365593f1cc972fc36fadfc5f9b56eca32de7b32d6772c0fbd322c93b1fec278f17ace90f5c15fbc6c30fced284fc6fecf4a59ee5f3e097b5c5ff5c9781f53858cf7230ec1dcbf1a9025ff4059f20fabcaf23cde180c7f3c75c9a81ffde9c19fcd0e64f89b1119efffd809fb68ef6c40c6fb9f1c65699f4f96fdae39ecc5e77a10f3c3c7f332f7544f78aa57ee3e19fe6509863eb9cfc0d01be537b2ccbf6706ece1fad08b0cfd93539678df16a63fb9ba60e88167160c7fd09e93a1577a6499eff56f30fc596d43867f78288bfd958469ffb5b5b2f8a32919f77768ba8cef710086ff7a313fd743ac1ff6d1bf288bbde17c1db4bf5126637fc75396fa94e5f8758c0fedfd72524ef31f3b64a9effa0b8b5efa22e37e308c87de1fd65196fde9888cfb5deb60daff5d59eadf93a1bfaa609ccfad40c6f7913495456fb864395e0ded75713ed5a6725a5fdb21637f7c4a167bbe603c3c9e5f5559dec73320637f69a92cfee6930c7f955316fb5d93619f3f603e5fdc264b7aed038cf3add6c858cf8d94c59f84641cff4b393dfec82163fd555416ff017bf078ffd09bb2f4d78c8cf5e2938cf3f95696fa241e7a3edf77712263fd18284bfb5c32f496af2cfe734786ffaa28a7cf8b7430bf7cf4df6240c6fb60e7caf2fd1f7d309e8f9ec6ca697a17fdc3eb038340394dbfa7f1c6cfab3fb4c0dcdf1a83e19f1e4f61ae8f1e0f30fcd9a94f167f719f80a16f6e3730fcd7cb13a63faac560fabb99b2f8b3104c7fd755167f33218bfd740365291f09f37ed1f349394dafe4c8623fe79bb2dc3fef83e1ff6a0159ea3bb695451f5dc8a8efae2cfe6d01863face595e5fa5f852ce52fb1b2e88d1fb2ccf7beaf2cd7a7b3609ebf47867fa8284b7d6732ee976b097b7c7e6b4e96f2d7aeb2947f2363fdf541c67ae8a59cda43b501e6fd7a9fcaf27d0c07b2d4773b2a8bbe989011ef4760f44ff94c86dee92a4bfa8a8cfd1e2d0f3de191f1beb3aab21c6f08e6f74ffcc2523fdb0b7f33ee90f13e31d81ffdcbbd4f96fcb7a2b23cff7b23433f8d95e579e10218fd55ad2b4b7bbec9f87ef7bcb29ccf808cf5e65059fae3872cfe64585396f72f303ffdb547467bf7cae25f35bfd4d73f28a7f595619fbe2fe5bb6f64e43f2acbf741887ff2a9bfee1961aec7ee5330fcd9ed4196f4cb5d59d6873730d61fd71159fccf03f91dec07ddc8582f5daecaa9fd9c341ddf575602e3788f1b59ca5f1de5b4fc614586be60fdf07f970b59eabf0464b1af1bd2b93eba0ec9f0873530da77b595a5fd9a8ef74d7594c5df58607e3fcb950cff775496fbeb343fd6434f65d1630119eff3cb82a9ef8a64bcdf7eac2cebd7902cf5df914e7f76ea90e1cf06caa2cf7c329e277d57167ddc03a33fae196539fe1759ca3f5bcaf23efb2a18fd716a9025ffe3a22cfacd21c39f3e9465bd5726e3fb60793cf4c7a94996faaf3d65696f44c67a74a42cfe45fca9efa33f4e7565d1479a8eefafd928cbfbbfd6647c5f5905ccfb17fb647cdfce43598e7f244bf9cb5659ceff45c6fb86351def036b83d19fe73219ef33d674b4374fc6f10acad29e13598e772b29cbfb1c0f601ffdcbf6fb38bfa7b27c9f1adb0f7f77292a4b7b766439de65af9c1e6f7cc966b25636f3fff7df593beb981f37eb998f9f0db2a1f91d64a36c6cfeb2363f9bec36bbcbeecdfff9265f903d648fd913f27bd973f692bd9a4f94bd65ef26e5613ecfec2b5bce56cca76cfe7633ff3ae6b79bad666bd9baf9344c2dc97192a335b3ad6c3bdb311fdfe4e8a69fa4fe5eb69f1d98cfd0941a19ae9a9f87f9ebd8fc6d929d6667e633cf2eb2cbeccafcfece2e93313167f3f387f89c4c8fbd994f35fdeda79f9ae99b9af9fd9ecd993ecb653fcc2736bd98e4eba7798fe6f399e649f27ea53d7ecce6cd788ccd18f4ccc735e98d6c215b34bf47664c923c2593bb64724afed85064b8653eb1613fada3674665607e0fccff0dcd279fad66b226259f1d6532d95ec64a47646e46636a3ef38c9dfc7f26f5fbff5f98e3ff96df8e99c9a1f93734b33e3433779fce61f9ed9bf99bcbb86644523bc978e62f619aff94da8c933d659251ec9a3e33f33b13649f19936ef2251f2f1365e24c6cacc84bed2ec8249651cdacd3b9df4deb3899d2c9e804a98d3866fc9cf4f7d1703fb33133e02dadbb6afe6f643ec67ecca88ccd380c3256666b7e8fcd886cb3e33f949d54d39e111b08d2dffbc45632bb741ec799bd1993f7ccc1fcbb31299bd45ede937ca687fb69fe6e669ff4606a3f77631baef9094dbe643477a92da57562f464de27bd9cd857d1cc7db29fda5e80d1ee27f5678e26cd359fe4772ff918fb19674eb493ccd9fc4e4668fc878a276223e9bccf1cb2a1f9f8b091c45662d333b1f9db3e7331d62271659fe649caadcdbffb349f9fc61bdfd8839fda5bc2495d89055c600723e37daec602123bf0523bba99b453eaad4ee9dfeed9cff4ef5e6a8bddccc3a474d3b26f699ce99a71d998fcbdd436a6693c313126f3fc83d94937f332e71aa61e24ce9433bee9c977f3ffc9dc36f691da429cdac92e892ba9277b4f7b7b9d71cd482523d24e472f32b695c4896ea692a99a4f2d53cf34cc4f33d3cab4339d4c3793f4e8d4f4602ff15099be990511e258e2053dcc84c47386998169c920b545d8a1e18af94bc58c4bc68c83955dc08b8dcde81cff48f1c48c4898199a8ff4469829a7f35be67862036bb187cc2833361f37f924b66246243223b2319fc4ae12db703293ccd48cc02c33cf2c32cbcc2af39df931bfdfccbf3f9977f37fb9cc8749fbcc7c65f29982e83bb10b63216b3346e9279bcc8a38534c6db49bb6cbd851c65849261919a30232a5ecd834df32bfe756d6fc7f26bbf823d9899979afccc38c446a1bc61e8ac656928f9b31cbec6cd2e3ebc476922f21b5dcccd872535bd9189bd999ffbb98bcaf64fe5a5ea665f95660855664c5d6dada585b6b67edad8375343f27eb6cfe72317fbf5ab7cc8f75b71ed6d37a659a628789cda523bd49ed30f196efa6057bb115fc3ea63653b1cac62e12fd956ab08c6555122ff6878a2776a600dbe826f66155cdb894cde792fe6d6faca16cd5ccdfeb56c36a667356cb6a5bc98a22ed3933161deb657533ef56cfea5b036b688dacb135b1a6d6cc9a5b0b6b69adac6febc77cdeac772b677da46f64c85b05ab68956c7370db329675ccbe5bd5642d94896cdb8cf72e8d59c64ecccfc4b4e395fc369f97b1c36eba76e9d98e69bc190b1357be8dadfcb1ecc44fcfd8f46ee2bf6c57ecc4f6c436d29ebf243664e6e9c1c48b5c3667fba917abda811dda911ddb6b7b636fed9dbdb70ff6d13ed967fb625fed9b7db71ff6d37ed965f3a9987fabe653b3eb76c35ada4dbb65b7ed8eddb57b76df1ed8437b648f2ddbb6adb6a97f644626678ee75bb5f4b803d32af97d349f69ba7619187b19641796977cec3fd4fa24892736e6a23dc9bccca81c12965149e247d23b699c718cef5f9bdeda2569f6d49ed9737b612fed95fd6dffd86ff6bb9db33fec4f3b7936a86017ed92638aa43f967e927f6dc749ef57f79dc07a7742277262333233676d3c99d176cec6f6cd8f398ed5322d38a4edf0533b9e64bba67dd3447b9911e9db4e76e06c9d9db3770e7f283b49e249159fa299973e6d443e99b1e1a2d5b0137f9fda8c73744eced9b93857e7e6dc9d87f3343f2fa7ec549caa5373ea4ec3f47cd369e94f1b9fa6d3319f669ada353f0df3d3b3eb4edf19384367e48c9d89337566b6edcc9d8dd57616c97c48dbf08bad1c8d9a7b98f8354de24af2717619cb8ccae18f144ffedc469ca5b19389b1132ff924b662e24823892de66768b4559ced3a2bebe97c3b3fce9b7574de9d9cf3e17c3a5ff6d3c91bbb28a4b6d0768ae65332cb90522214cc1232937c30421d7ccce8b8b6d3751dd7752aaee7fa6e602fdcd08ddcd85d1b05b17537aef9485c633c496cc58c8789f646599bd86265dd9d954d62cbffbc9db87bf7603e4777ff3f6e270fe30d92b89ec692f4e3b9a7c436e4b7b34cec23bb339ddbb2c7eed9bdb857f7669ddcbb35751fc6573dedaafb745fa98f6a8b4db865b762c6a568c6c18c8c199544c465d55e3a7f363ac676dcaa5b73eb6ec36dba2db7ed76ecbedb757b6e3f337207c656123bad261fd872cdd84ac57cccbac7584af23b59f774ff67e2891985a13b72c7eec49dba3377ee2ecc67e62edd95fbedfeb86fee7b3a42ffe6e35ac97926f1c34d6c241b1a5b39b8268224bf130d66bc9967e6eaceb6dd0ff7337d4ea0e0dc4dff15dd92973571a1ee65d211e9aa8d5866fe9b11719a5e229fede4c7e99a309c84622bfd29a63fc6969c9649ada69eaeee39f6d5fa486eccf57c638953dbb37d8929497ba47de9e798da88516b5e90d88c95f5c27fbf9d7891177b6b6f63ceabf50f7ebaded69d783befdf6a3bf6d8f47e3a07137bf10eeec96a9af8917ebc83e911331ee9889cbca377f2cedec5bb7a37b7e894ed92fbf2ee663cecd43eda699c28ba15ef6116e9a6f7cdfcb7bda75bd5d1e822c65b6ec58c44c57b7965ef958c8af96b62339657f1aa5ecdab7b0daf69cf8c4df66ddf1469658aa68dc96bb85b6678c7a69d494c19984f238d2fcd84ff7df1c4d8c69bbbf2daff702cfeeac7d8cfc4d8d3bfc966bc8ed53467ec27676607998755f7ba5ecf6ada766664b5cc68f8eec6ebbb676fe086ded01b79636be1bcbc8937f51ede0c31bb9bd88419819953f4e6dec25b7a2b6fe67d9b1fcbfb494728ebbd99889e3523b13223627ebcf7e4271d9daa977cebe687d33176d53551e9d3fbf4bebcbc57f08a8907cbeedc0fab656ce56846e3e1956c376d6fd178dbb13df64a665ccc08fd7becc4ddfbd9ffd636feca5290bb6b1653960900c77fdd4e7cc7777dcf1efbbe1ff8a133f3233ff69d44f39811312b447fed6e7dcfdff85b7f67b7fcbd7f703efda3d3730a6ec53f99f99deaa7b4ff7fcc78ccfdb37ff1afded4bff9f7f4af6fded358f8c3f0cd6880ac493f7b2bf3999ab19bfa6753f6e959fec37ffa0fefc34b6c2deb1fcd715e6ec72ffb15bf6aec64ec1cbdaebb36b366ec99d1496ddbd88e7b7296091bfb19ffebf1c4d8c7d85d19fdfe3bece3d72364e24e6a2fff8aad9839d834675b4cced6ac39c66ecfd849c7c4733b592324bfdd0fbfe6d74d0f35fca67ff05b4e4fe67af20a5933bfdfbcbb5df4db7edb5bf81dbfebf7ec4fbfef0f4c8ffff843efdb6f1b1b49462419899bb1ad453a1a0bff6a7e46fed8fc9ccd484efca9f977e6dafedcd85dc38ccac25ffa2bffdbff31fe6a62bbfe9b19979269dfdaac2dab56cd6a9831890de73213ff3d33f957edc4cff91fbf9afbffbd8dfc7964b1854d18fcf4bfdcc3bfd096aad7f5bd74cecdfcc0fc7f6227d5c47b793ddbf77ae6af79bfe017fd52900d329ee33e8d5d7493486ee6f733b09cba591d16bd855d0c6cd3bf3d7f1038c652cc98f85de3bf12bbb925d661c6eeed17fb08dcc0f32f81677efc2008c2200a2253d6e40de2601d6c9c7ab00d76c13e3804c7e0149c4ddf9f92b6791d3f486cc4aa3933afe3cc12dbc9bc8cfe2afc2bf1c4782c9bf1c3adfd4b7682f226be8cddc33fdb9ee062ecbf9bce3f37b111676ace3df65daf63dbc1d53906b7e01e3c8267f00acae98864cd8cb0921109aca0125483aa59b37ff9e3a066e6fdc5f4753d6804cda0152476734eacc77b939148ff4d7e0f9211093a66e42e6644ba5e36e805fd60e05fbc65300c46c13898786dbbea786ec96e05d36016cc4da4f333e360e1c7468fb9c95e43622beedab4bd64562cafccf49fb7936019accc1cff8b9efd6bfefd3f46af6cbce89fb3136766d6e8c63f8b8d04df899d98f9f76196700bafe7bf053f6644debc51f01ee4ecb299c1897632113df830fd17a763f2157c065fe6df2fd3c7cda069e7ccbf79f3ff056f11a45ecd8cc622f16fe9888cfdab1911932f70d27f4bc90582d00aedd0f1afa11112a11f06611846ae6357ed4b18876b3b76bbe1c6af865bdf35f6d135eb2613ed9d6562277690c693e09f8d27e1cec4f45f7ba2df6a13bf94f91b71c8ff08f7ff8cad180f90f865379973e1c1ebb81f493c31f6b1703fc2a3330d4fe139bc84d7f016de8d7d1b55eb56c38719914a32a7c3287cda5fe12b30231234c37258099cb01256837cd0f42f612df862fcf096c697a523627abe1e3ac98884f564044dfe86191133467edfa985adb01d76c26e1826231ef6c27e380887e1281c1b2fea9ad8f7e12c838b696fce7c6237e79e334d678531f9dd73d2ff3262fb9f1a8fbffaf93be5bd8d9ffb67ecc44f22e5da0fcca89cfc373f3263313176626c261c87536714cec2799009174edd1cb9e3d9c187f70c97c1247c2656627e8ac988183b31b33ed98e31bf9338e125facbfc3db594c04ec72589ecc9a85cc2d44652ef654627b4937f139f67c67715b682cff0dbfcfc846fe17b980b3fc2cff02bcc8785b0182cd23872b2eaa98d987687a5e0ec7ed9d37f269e445977f61771e0f769aeee5fe5ff9be3e2b5ddd1ef6d979f4f54a6e994953d315ae6181e6d3bca9808338dacc88e1ceb14b9dec471cdba41bc5612d9274125f282a1e9eb6a64062f0a83afb016ae4c9f7e465132f74d5fb7a3385adbf968e32d4237b0a3ad1997a51925137792118876c9bf6674cafe25da4771580e1ae1cafe8a0ee12a3a46a7e81c5d42df1c69e854a36b748beed1c339b9bde062c6c1aceced69e6e1ae93dfd1337ad9a3df6f27ff8d8dfc5a5375bd4ab20671672656d87f3b27b5d75f94dd78bbdf672761212a4715671a558d070b9ca3fb1165fc38f88e6a513d6ab8eda8696ce496ecbb277b206ed59f472da38c8626c20fbdb7f019b5cda874c25632c3cd02a7627a3699f15ffe355a9bbeed3ab5c0369aac18f582a253b3f349dc497bddfca4d69144a146d40f9a516cca9971493ed1c9d849371a04a368e8dd9da7778d46d1389a18d5656cc43d1b2572143b3156123b67b193df17477eb1917f640b5edbdba46bf46134c52ee4c1dbfb39b3d61fb94b77f15b2cca9dfbb9df632bd1ccf4ff3c7a450bafe47e7a9d68192dc363388e56d177f41335a337ff98ecf8ba691c4946c47cdecda89878e2fd44b9e823fa8cbea2bc8903aba0633c92198fa860fccf97e9f562548a82381b6da25ed48d7a7126f88a2df3f78219af756c9bdfc7e810148c6d35022776a2c8d8561c9d622b76c3efa81d7bd17b343073cf7572b19928916d8fa2851b271f67ea9ee3d0cd99d129c551f4fc7d76122cbded3f8a0332e7bd6d1cff23ed14af83a53b8a375c97fc83ba7e97068bb7c6522ae138dec57b3f1f1fe263b48c4ff139bec4d7f816ce8ddfeaa52bc4a6591fe6e27bd44aec446cc57bc68ff819bfe2725c3163d2323691c4faaf681dbea2aee9fd6ed48982a0186793f8602848fe1a57cd4f2daec7553322c6968c7f8be386fd99dac7d18cd4298927d125ba182b798f866615598f9b71cb89e276dcb187c69ea7f13eb10d3bb0eaf6d4d8f8d32bfd9e7862e6fae42ffa2cfbcbd8607dd2f53f7eebfe5534357169f567eb9b5f79af24ee98fa7ef37ac5993a276315afd8ac4ce283b190a3db8b7b713f1ec4437f1fe4fc71b26a97357b3c8ac7f1249e46eff12c9e2723132fe265bc8abfe39ff82dea261e2ace84adb862eca318e5e3f7a813e7cc4804a68fcfc9a884dff15bfc1185664c3ecdc8189b898d3a881b71dec49e7b12dfe3afd4462ef1221ac405732c2f2e86ef76352e7957abb44e6e97791abd1527b6e1c66b6b6d1bfb8e7f9f9df8d9744e77ffacd7fea20f937dab78fd7b6280b7777ffccc5fd5f697f577e3f837dbc96eed24761255d6ceda8dca6b2f9aaffd75b00ebdfa3a725ca364bf937d46b76a466464ace43d7a5fc7666c66a6bf5aebf57ab3deae77ebfdfa10954c24ef999ffcfa68d46c270acddfc2f0677d32cad6fcbb3ea563538a4af1c7fabcbe245128b6c26f13656e71debe25f6117f98bc460787e1fa6a94f6325cfa737f6ef4b7e3e4edf7f56d7d5f3feca9fbe5c6c1696d45d5686162fccbfc7efdf678e2e7fede9a5db497bb7287ffdc7e99b1853f8f2f7f6e7bdd646d1fee7e5b7df1def8ad6e385e3fc3c2fab52e9b9fcababaae790d7f613fd7756f6e2ce4c3ad061ffe7cdd58378d9dccd7ad786cfe6f1a4fd6ed7567dd5df78cff7a995eef1b4bd9469df5603d5c8fd6e3f5c458c4cffa10bfafa766f44ed1a7f98451693d5b5fd67363436fe6f3b15ec4d5f572bd5a7f9b91fc599b9f786114d7c8d8a1172e93ddfe78968c4adc5cbf0587f5bb198d9c59487e78a5752e38c57b7bbafe0c4ebfd54e929efbdb91446c2758fdf3d711dd631c8b4dfc4dfb6b79ebdf769dc539fbb5c456e2931991af757e5d5817d7a54dd66eb90dc7dd645c3bd9454ff496b18c99b190796c62fcc6dad8f17ce36cdc8d59166d824d183f375134302aacbd1ec73f9b78b3de6c8cf5243feb4d6446646aacc6e881e4f77a1a978d9d84e6ff2f9b6dd8deec36fbcd6193592fd6a760bc4ec7255c1acf784ffe75abd1301e191d5eb5df37c7cd697376bbae1905134f8671d7edfab5cd25eefed678b2b9feca46ba7f6623a37ff5fac7e6f617a3f2573fbefd5bead9dc378fcd33aafab5b5b3796dca9bcaa6baa96dea9b86e7985e48be60ac9aacdd933189ccca7dd3dcb436ed4d67d335e3d2dbf43783cdd0fc849bd1c6f4e666b2996e669bf966b1596e569befcd6addddfc98317bdbbc6f729b8ff568f319bf365febfde67393df148c1dbd99e0e0069f5177bd30a353dc94824a5c88061b3322dbec36b36927aa222e1a3bbd05bef5b9b5b67634de3a5bd79e26b369eb6dfde0b4f57f9b9db87b6ffd777baceb8e7eeff5c26df06b5bf17fbd46f9654c3e7e4b9c32e7146ea36dec76a3f976bddd6cb7dbdd76bf3d6c8f5ed5c97babf41aa15933f9f3ed291a6e9ced797bd95eb7b7ed7dfbd83eb7af6d795bd956b7b56d7ddbd83637936d6bdbde76b6dd6d6fdbdf0eb6c3cd6a3b4a7e36c1766c46a7b09d247e6ef395fcde5ed623e3af528d157aebebfa1a86c9b807a3b8102e8d774c3ce43d51df46e18db6197fbc9d6e67dbf976b15d6e57db787331ff7e6f7df3f9f96df1c4f457f6efedfdba3fbff7bac7e6e66db76fbf8e2b7fa5eafefc188b5fe7ff1bf1a4b375b7ef5b2fee79c56d6efbb1fddc7e6df3dbc2b6e855bd29ae93d89e1dcfb627e3ab9ccd743bd9968c957477d95d6667edec9db3ededdc9db7f377c12edc453be30a779bdd76b7dbed7787cd70dbda1d7727936bb4cb6c42333ae1eebcbb98f179db5d37ebf8b5bb25f1c3c4f4f1a614be45c375bc6e253ed28cc77c63af1bf138f162e9cfc379edeebbc7eeb95ded5edbef5d795771be77d5e0beabfd163b718fd86ffc8b792ceb8adfeaeb7ff9ecea5e25d9ffddd5ff3a2d5e2731eb6faf57bced7f1fafc2e9aee10d76cd7565d7dab5779d5d77d70bf6bbfe6eb01b3a85643f251d91625c4c66706c7adef4e5c8f47e7637de4d76d3dd6c37df2d76cbdd6af7bdfb317d3fdbbdedde77b9ddc7ee73f7b5cb9bd4c2aeb82bed0afbec3eb36d99cf68f3637e5b9be9de36a3f2b6778c759d8371b24b1fbeeddd6d331911e364e2bdbbb1f7dede332aefbef7e37b300c8c3c0fcffb301afb85edb7dddf47f6c09ed97d7bf65be289fbf6f77cbd3bfbbd5a6b73a3c6721751f657b6f2eeceff8ea5d4fefbbd62ffc7ac463adb781fef5a26206ff6dbfd6ebf0f328eb73fb8c93cf87fbbfbaee6449aa6cbfbfd1bdc137850ec557bef2ddc75d3066868ef23f6bf6f1648339a1964e67d9f8df8f6898a52016a35a84e9e3c99e540f3ec03f8f3e4acdcaaab9e1550ca34ceaaacce9aaccdba34cffa6cb889d99861199e11199951199d31199b71199f09e931133309c26539536e7ca6a62fd0aa999636999e199976350099e39501ad7a89d5ccbce8d7e3c54ab5cc8412a6870c31c6447c3939c78d67ddccccce9ccccdf6500f8fd697bec393bb963cc34400edfd2b8ebcd38c3bca7f7225509fb204b813e85fea899bcdce146032cf16d9325b65eb6c13301726db1e3747eec83f56038503e4edd067104a79d92e7bc95ef2695ae693dccbfdfc9807799847797c23f2537ece2f79925ff35b0e60e5795ee4655ee575dee46dde4169f22653f20e6a9f0f999a8fd90e220206fa1c223a88b4a12034722c61efa89877ce30399ee3172dec722227732aa773266751cd0e2715d5aff5e46cdcf3922763b9d1f26cfc4d1ef2c691d7b164947b98bf7305e87d7d82ca3d4ff98a933997e0d7ea92e67c2e40402ae652349e9617c66f8fe80817fece933d6082c7eaad063511b329f4ab9c61a9952bb99a6bb99e1bb9995bb90dd838b99beff3433ecbe7f902ca2d5fe6ab7c8dbc59bec9b7f92e7f29a6c5a4f0a0fac5b140cb0a95224ce32242b1dcad296250aaf8ca14a7842dcea02c6c71b975082ff063d6697e5cf96c9114d7e256c01fe52cf25c4596edbfe6497879de47e09bff6adcb6c8918efc917bfca12b45fe91d27ff57e4591cd4e9bdba528b3655115753cf3b9a2f17b1fc5d94cd1a2555af1f2368993cb163c975774a95ef4459f47c5508c0556e00551900555d00553b0f0882bf84228c4422a64284aa1165aa1174661165661174e46156eb12f0ec5ac98178b6259ac8a35b0a62c364574eb8a6daa16bbe2a59c826641dc0d8a73c8b1cc02d6d080997766fdc15b9693d22bfdf25806f1a10cb37d193d30f9dcc603f7831ebafdcdbaac9f3af267f99d2b81f14c4f8e42197ffe3ee5a93c97903066976c595ecb5b99965999974559222d29da7809c58bbd2b9b1c50345b5637253f96753a2b9bb22dbbb22f87722cb1122fc89228c9922ae99229d992839f7c299462299572a9946aa9957a699466699576e91487d22df7e5a19c95f3729189e5b25c95eb72536ecb5df992f7e5f62654d36a524d41b7ea2b5379b72ec720ce20a22ca42bffb64a89ea186daba00aabe06b3df91173fdc194ef8f43bdc55aeffddef1dd2a97dfd777058727f329ecd7b157155571b2ab4ed9bc3a57972aa9ae484d4ab4828b432be1d0ccfbdd73e1d7cb8dbe1ed26dbea96ef9aa4aabaccaaba22aabaaaaa16daab6eaaabe1aaab1c2a0a2160784f88aa8c88aaae88aa9d88aabf84aa8c44aaae44aa9d44aabf4caa8cccaaaeccaa9dc6a5f1d009d6535abe6d5a2dae743b5045c56e506a23cad5ae758ac5f8ed5a6da56bb1221f272d4e30ee2affd577a12281fce03ceff9623bfe437d3df7a5bf9797da0c0f54fe62ed17b7ef63ee529e7cefd99ace27a5a7af50430e98fe1710598b0a7bef61e3c3939976d72a8fdeba13ed641d6d5611d95621dd72748f72ed55827f515eaad4ec1a8d39f056153e775519775550a755d917553b7503bf8d9d7433dd6588dd7444dd6544dd74ccdd65ccd43156a11f1a796f2975aae16b5522b80cd1218a39fcb5aadb55acf1988b7cc0c22e2daa8cd2f79f2340e42bdf87d1d79324ff26ba6039af2ebbaae0fb8c946ebcfdeabb6921da071aeeddaa9dd7a5f1fea99df1fd7c723bcc7e2d4a3b1e0fb0c967ab1330ff23fbb0eea79bda897655fafea7549011a9b7a0b3f53c024834759bd7b6d0121e0cc501770d54bc934d392a98866d2788ddf1c9ba0a2eaae099ba8929bb83935e7d26a2e90cc5f9b1b54089521442b9ab238a4eba66a00c84c2cfaa639bf346dd3357db445f1563354e11b4f3eb3bd407beeb95064fa5fe888f08e2b423003447e8dd1fec8e81f1cfb7cdc2b17abf8dc27783336588337444326e7863a860d0d980047d0d80620a25ff58b7d631be6aad441c3365c315679c3370270640b7dbfbd33e4594901b1b4de0163faaa2fa96a68c446025ce4c62b494047a9db466db4466f8cc66cacc66e9cc66df6cda19935f366d12ca1ae0abb59379b669bd1cdae7939c6b74d3b6d27fea58c8a2c36aba0f972fe245a3d65891fa87fad234fb3ce67f93cfabb27335cec57394aeb65d764d74298d5066dd8466d8c3001a62086f2972e42735790c12787cbd09eda737b6993f6dadedab4cddabc2dda12f5f783137fe0f2f61ae2cd06ae0354ea735b0126800a680d53d215e0d2022c6ddb766ddf0eedd8622dde122dd95295dcd22dd3b22dd7f285de0aad589aadd4caadd2aaadd6eaadd10cad99b9adf5757ef22c06badbb6f2fcfa271cf9a1e97f8e9741cef1741c2b983f5f0b13de3ecd4fc46cd5da97aa755ab7ddb78776d6cea3dcefdb05e2c9a54323f4d7e36996b6d77392b6cb6b980755daaeda75bb69b780c90e74e4238e64edcb3b7c109740771a11bcd9b911011188d12aa29b16623745c880dab4dda4f33abf3b76411776511777a7eedc5d4abd4bba6b6175b71c82f12e83e4b3e8caaef22749d75a1db8c0cf791264af6b54fec0a46bffb37ce4d7bb3ce3c8e37d7fe1d74f0ccdcfdeb3ebbabe1b4e9b6eecb00eef880e7cd711039ea05d573c1a9345e3c1b7aaa33aba633ab6e332b2e34bbc4d3ba11321d492ea4d27dff523fdc18b67f576e70b70057e168dd42915dea9103173801151529dd64ddba639767a677466677576e7746eb7ef0eddac9b778b6ed9adba75c61644b7e9b6dd2ea7ba977eda1a6104a8980f4c3ecbbd9fef2701fbfe622cf8753ee443343ee6c8a3fde07dcdcfb8d906fda4f77abfc3fa631ff4a1b7ba307d741f5761d1ae3688832fa7a8a312b58ffb537fee2f7dd25ffb5b0fbeabcffabc2f50b4d59775f6563f2c08b3dd5d59205a46b8945c5f81dfbb42ec06b1425fd76b48569bbeedbb1e7ef4433ff6588ff7444ff6544ff74ccf667c9bf45cabf47c2ff4622ff572af9cca5eedbf386fe5237b8d269fef17f94d479e20f231471ef5039e589fbd6faff70654b3b77abb777ab7df17cd711da128853f7ac7e9691e2bb18658d21ffa593f4f837ed12ffb5555f5eb4eecebfeaee0af9af1194f762832be6b0ff0a41a4aae2efa6d853552d5f7750bc90d440034dc6fd7ef4aa17f19a67ddfb9c364f0067f380e417e18c2211ae2e1349c878bcf0fc9701d6ebd3ca4a772c886fc733d09f2e7e3b481f9710eff735ceba3f29db9c9cff8f9d1df0dc5500ee0e00790cba1bb99435f34f11130615054028810f125563b6a1886f12a0dd8800fc4400ed440d7ab811958e8e1edaf0a8f34e49d8efcca933b53deb80279653f706d055c8378fa810e30866f64d0fc0ef24bae1f071e5011866010076990076550076dd0076330076b487a67b06fdee00cee7fa627c0930ff68904f99b8ebce6231fae96847b7c12bb7da4279fed4f19f6c575380026b3613e2caa6b99bdf2e4be2bee8e899e34693b2c87d5b01e36c376d80d2fe3749c8cdee8577d8bfa78f31af16e1f79c90f2ff616733d6afa832b90e30fdc23df6fab7a031ab381f6dad7e311e2311ab8d28cc1188e513e1be3f1349e87002dc218afe32d77c674ccaed4988fc558f601805b8fcdd87e999f38cfed35fc404fde62adb7f55e9fee4bf9902baf63d17f94f0fa998e8ddd08c6388e23068ff09118c9a2f157a745e01f993b4fd4a4e9a8914ab2911e99911db991074484511ca5511e15c0e2f688a90085f4690496fe50fff4a7a6fcac284a86ba1955844a7d05eeadfbdda88dfa680026e6688df6e88ceeb81f0f853acec6f9b81897e36a5c8f9b71db0be30eeacb57f9c9ebdcc9ef7de363d367d747fec3bebfbb0fe523ae8497e7fc8a969f7d566c8279988f1db1000bb1e8a28414161fd77188563e06e0b700151d3b9d84b4ede361c4ced8054bb02b76c3522cc372ec9e9f60e52b4fde6bcbee952b0f6edc2beafd81fb59c165fe68efb57f7830ac42b158bdc6ea768335588b4100820d159fdfb0117445c3300c1fd71881911885d11883b1fd97fbe383fd079af02466fa2d1ff9b2200ea1f5f37fdafe7d44e7d9bca6fe19a7310ee331011331099331653030b5684ed3380afb23132fef3bd992f31c29ca6548524cc374ccc04c40c5c26cccc1dc7687ed1f1a817a1c9461f70b671ebc48df7e0f7eeaeeb15eb9f1932bbb1ff7005400a72b6496727dc10ea30198ccb079bbc2066c812db115b6f6dc5b866dc61cdb623bec059fe213dcfb8a27f1b3917a14c9fe61dfbfe5231facd5fae335341393fe3ede1bf97f70ed1b6b22711f13f023da1c8d47788c9fbc258636324cd15c3cf0448160c7ba8f79a9371a62af18bfe0097ec56f788a67788e1778d9499d548da82747a5ea3b68215f1feff6ffe0c72b2fd035a0247835dc5bece7f87123bd55f060cac0a17bf5395e8d125ee30ddee21ddee3033ee2180e11064ee0e4b8c3a9c1ba65388d33388b7338ffa59ecc7eedc9b7fd2681f3eb3adeb77ce44d47be81cccff287ae7cb476ff947dc6695cc0455cc2655c8156c54fb886eba7296ee066d4223c50bdaf0cd6cff3c7ba95ab7e1b70ab3fe036ee00322ebe1f45e8bb0a3fd497768bcffa1a8d6b010e0f1e6cfae21163b515e4ed2ccadf2bbcaf1a09a2df01a262c84faabe11113750dc35aa4857ea353ec717fd1a5fe2ab02c7d7f806dfb62b7c87bf10536212068447f8c49108708608a144c497fbb4b0e96ffdf9fa2cc463e7e775b7f875bdfdfb6b84df10f904975f75253cff5843fc1b4ffe5c17f6be1227e24c5c8884b81237222532223c2d899c40fb1ba68f53201e73f1c0930a1079b9e8090bad4e941d4d80d3c734a2215aa2237a6220c68627303064a21109b291080a45bac010bcc27a200f4137138229448285166a3305ffb41ed8aaa84ff5a53e111cc11342d5f66bc87d843623c43625a45c21644221544223747c4718841939843576b546d88443b8c49e3810b3aff424ccee36fbccb7ff62dbb7d96b4ef2364e35fd0591dff766fd5190aefce05cf38c4bf78cf1d335f6c49c58104b6245ac890db12576c48bcf90537212c35fc72ae2489cdcaae49094d7f3c54d92ebf23aab7d34bb05d520bd1b9f4dd15831e9e713f2480625311afd8e0c4bba531117205ba71a09b1038d9e9011199327f24c5e4a814cc82b792bdb822453e0c096ccb281cc51a44d16258e1e133259921559930dd9921dd9f70b722047cf253112277c6c4b12444c922445d2e437d677ddc7cd9f8cd25eaebfae4d7c1dcbfd9523af3f532a509fd8fe2ff7435c41baf2414e84ae587df639a707922159624572244f0aa4484a4448cafe8cc84925ec12eabe23eb9e9f902aa9913a6990e6c8901669271ce974f435b98af988d6a4002a2eb9270fe48c9c938b7e4730254d2e4baa534b865c3513724d6ec8ed18903bf2859a8e2635a13cca1f1dea98f154408554d45ea838cd8b8e3af5f38e231aea4c5da884ba6638754b8f540a6d3c60c484caa87c1ca8822aa90a00a981292e497f3d1f7fca3eeac7dfe7d1cfd3dfbcd5f4fd75104b7db896f28d0b482fe0fda6efeef1ee7e9f8d8fa1966aa896eaa89e1aa89114288cc2893d4550a4bf382d205f4c2edb58bf4c4f42a253144543612896e2289e12289192289952b21da5de784a4b8fddb56c283d9f530665f64dc1350265d5eb6e5af2944d6e28670c2897da0f3c75a8586a3604d83844d49c5aa46b3463452df3865ae532b5ce646a7353a82d20b2a576d44b6ab5e79b4c4fe949c7d01eedd3473aa0433a425bede81821427f63df6ff8fb98d78fbefa730d644abdb3f1c77a23efe71ce2d75c01ef7478b6c71bc560d1e4abb168fa4cb5f485eae984bed237f05e319d86144582f78a02f23487fc044f1ac0a404bf75a3330a4193432de892aee89a6ee896eec092f534a57bd26d387ca407724e8f3486d5344e1364489300263d063443b33437f8344f0bb438deba75e9d05239a7e5740ec98e9ccb6909c5465c211a5aa155a85a3da775daa04ef989da8e346d661bdaa26ddac14fb44befe903e80930e53beb85c17bfdf44aef740134e0f0473e337bdf9781f9ab6d072ae4e75f45c71f7028d0bffa9cf48c9ed30b7a49afe835bda1b7f48e7e61a6cc04378eeb3b2209e2ca797196cff2ad8ad533078fd03e2d0ded6d3cb38cc778b7fa46832593e07d2eed95f1c9fb21765042f25cf2484380210e13a1cdda5847f395dc25f55093cc99b9a46b7a52ac99244d3b36bd3057e6c6a40c880959303953f42b481676f074604ab267aa61c5d461c8344ccb744ccf0ccc48c7e0bd42e28bf1aef7f6fd2e5ff831bffe6cdcebdd1ce1b7d7397e81cd37c69151653006024a86642886a6570cc3b00cc7f09e81c56511ce621d30f1d08c7c382004ce2cda4157b445fb38db31208e7cb828da0b4465372a753b8e3ad31a23f42b46642402bbf30474a42e191930513a9b51bb39a3e57977abf4625fec99849e64727d2c3a46678c34604cc61a79c61ea78cc3b8cc9e39902933632ca263e6cc8259a61db362d6cc86b0992db3635ed82955b313e21bebbb7ee40b7ff8f7bb6f7ab2dff03c4531d8f3f99120fb509f3e2ddf5973c97aac8fc8c9866cc442b0c59e8803daf0c142c80b985ce021445f975decc54bb48e05ad9a80c451bda880ca96bd81712fc3e1c8b3199b5f0db6205b5a674bb6626bb61925b62570b68302490b3bb0238bb17869b0044b167aae17364bdd24f058f3a661694cc3ce49c232a4c9b27774168cc5a42c876fc88ce5598115598995598555598dd5d9096bb026f3c20cac85b8f2bdfd27bfcf8fff1cf30df167b975e48749e43f1fc30db2575df9326b796f01d1d3f1b55f2b6bb30eebb27b40e5c0ced839bb60a7ecb255d915bb3e2d101a910559ca80106137e8548ff382dd9e65f49affc2ee2e7eecc744780094baeba58fd91766c14d09919b701ee7e32577c4676ccb055c5857d4041d29818ddca9bbe63677a6a2bc6a1aead69eb80b517109773dd7dc8d4be9123bd306970d6b4c63742ea7d5b2e10aaee42aaee61aaee53aaea7f7dcc08dacc961f0792d76f2bdfd27418ee6e59feed14263bfdaef367c3f0f32ffe47eeadf9d3d11dec26facb9e4708ee0488ee2688ee1588ee37876ca0938cb8927eb7c09dde0789f6b5c5ebada43fba6ce75bce2a478057e0b9d32e81d85d3fc7c8db8d04b244e4e6b4e19594ee5344ee70cce6c7768acb711c9b0998e0167511e67e78786e51ccea5626ecf1db8195d276a47c5173483763f4b928f97899470dc9c5b9066bbe49629da8c5d722b6eedd5dc86db723bee8535f9293fe13de0c994f75f31f9922748073e1bebfd88135f69d477c72b3f5fd7f556f9231ff0211ff131daaacb5ff884bf123bfed6aa270bc55ea70e9d181cb5f1f2363d3997fec45e483e6577c763e886b3a8054cc223099ecde7333ee78b61c5977cc5d77cc3b77c57a7f5b5dea25944caea1bbee7077e1caf9c432bd4a5ac8b81a948ebccf3188ffbed914e5c9ee0c9131a3d00d5825862496a3c356c5ae946f034cf04e0c2788ee779811779899779058a0a2cb1f86f7fffc91f7be35fcbebbe7621d0ff668dfddf7125d89f8defdc97d7798337798bb77907d0317897dff3077ec6cf39d19f1d9751710cc22e56f805bf00eb2df9254ff22b7ecd6f001374f28a82cec139d7fc96dff12f02faf2054ff021fd0d84f0c77c4ada178d2444422c9cf0dd20e501e7d473e1cc54c2454884ab701352213b1eb99b900b0560b108071439b09b8b413a4299f542c5177e29d442c3344323b44227f4c28078c29ac2f87d3db96bc4fac339f63b2ad1f2efcedd42baf2d10ea0d7bb3eeefb655ef256054cc0050230390990320a343c670456e03045e0fd5c102e8c3f04d429bc9facb23c9f04519004595004f542207b46bb4f9346d0045d3004934b054bb005477085bd7010663f66b5766dd5d7345612c2bcbd090bb2ef97c292568495b01636c256d8092f473fa0e2e4c8172d44d90bb446f93424a0539995ee2899dd796b712a4e444ff4c5a31888a11881ca1bf45e18c5374cbe65dbf7731f3f9f67b7d06ed3cf74e4f736faf50c84df30799db737bfbb5f523c41427e162f62225ec59b988a99988b8558d23ba6132bb13e49111b6947129d252024c332e1f8426cc456ecc45e1cb804d3c451c4445c24045d24454a70455a644456e484c3cfb9c6beac37f55ae44b2257089515c86349d44bd2174a511045511265510989537466af7e16a1338f62efb4175551ebe38b756b4eaca88b4619b4b6686211af8a96688b0eaf882e6b8a7bf120cefee61c89276bec851ff3ee6ffb1b6f45febd3350832c4c3f5ab3ff8b964c9ecf693ee50926f462241080cd5c5c884b7125ae050ef7c48db81577ec3a8efc2d60c2892f23952449264dcf6b69c2cd254ff2a5a31448a11449b17492ce42205da444ba4a3729953229978a3a4315f93050fb33c1b5995412ba5449755533075a951aa9953aa987eb86c409404b20ceeecf8b53102bd208ef808df48d3ec712eed51221911225d1542531a02512f25eac214180cc6c25eeefceef0ae6ef4ee47cda8377be18c1e1f33d55c1fcda40cef35c4ffee4cd37f7df4bf0cf49a2d04ba23887c792244b8aa44a1afd22e992e16dc829519cdc2399e4a703daa17b9d27a9644a96644b8ee44a7bc6920ed24c9a4b0b69c9efa495e04a6b69236da59d94ff322bbf1b8ff8417a91a7f264a0aa52f6645f3eca81b49643399263a9904ff2f9c845dd2940a77bca17391126f255be5d30399533398fb67221977225eee51a78b2e225b9915bd680e7dddff104d55f6c5bf828160bfdc80bafb19b52e139bc9f148578d1b5e125502f97c8fb74dceb498926dfc94f784512845eee0115418c00924152e451c6708fe9645c2664f2f2725ca3f3b4ce71da0a495acb146973994c5f25f8c9a401d9300b99654c999379591059c195455992e53a93e39feb866505a2af2dc1c9aaacc97a7d6940c484a8beca86b0974da9035c2cd9961d745267e8c8aebc970ff24c9ecb0b7929afe4b5bc91b7f2aec1e51765aa4c148f1b0111b448c317f76f3cf9beff47edfddc95af6258e175fe04dac00eb9c779f5dff8bb0fcbfbf9958f5a7e2246fc8479e12772a31cc59512f08a12b216e4289e122971992a27e57c395e88f38b0251d2c54d6b2551aeca4d49954cc99522f59452dacb9cb454200696ae4aad344a2b1c7e59e3052adf88034be3fdba6ac6094850a674a35a274aaf0ccaa8600aae100aa9500aad300aab7010e60a8aa88081288aa7d0c75450d471503471a67872ade84aa8f8aca1004b145f3115eb3f390f1294fcc97ef96ff7ee676b5a3e3aa1f8cbf560779ea872c3abf073e455b0bd1a7263839f82f5c584abd88aa3b821adec95c3f9a2cc94390f915792dc57a9ce485b59284b65a5ac958db2155c65a7bca0affb533dd5578f6af0aa25af3c51c3aaeff3811d3dbc523a355263f504e5ac5ed444bdaa3735051ddaaa999a4ba95aa8a560a915d45a6dd4d6bfa64251b7aedaa9bd3a28ba3a42c5d451c58133e82b868807267f9757a0f694bd46b19fafdffafbf2d1fd848fd7b8bc1bef32e93dd89b2fba720b363755a62a2ed72aa958ec44a5545a655456e500344115554995554555136e18554dd5554335554bb55507426357ddab0775a6ce65495da8c7befc6d2d645a27a32a44f85c5daa2bcc51d7ea46d8031233a650b78cadeed4176daa4d344fa421766344529e69be76d482382fa3db4a0bb5e8a278732dd64ef01931edace2c20b3fd52eca54e2b4e43f3d5f189b7eb497eaff5179cd4c3f8be9b4abe26b3775d4522dbde52a862afcc799b7176744a8d85aae155aa955d3a9d668add669bdbce0e6da4049da28b91a260b1a2e5dd5bd4668a44669b4c668acc6693ce2c98fdd0ee97dffc94613c623e628bd266a92266b8a262b98a66a1a93e35b4dd70ccc9402cd94e69aa58882aed99a13319aabedb58336d3e6dac267829db6d44eda4a5b6b1b68b7da0e78335587574cfe8a233f750562b06fcc7bdc6dfce998f2d39eff38b71702e7f3f321c558bb8a2e2072d552667bcbb517a83b2d43ffbd3ed527ba5764baef89fa510ff4508ff4583fe967fda227fa55bfe9a99ea1015ebdd42bbdd61bbdd53bbdd707f5a88fbff104ed5301f5a8131d13421d7f642fed8b4ee8a43463399dc2b7b952e28c4d4c755a677456e7749ec474487be452977499ca747059eaa06bca141059e93a3c37b4445b2b96b6fd6fceab47e76e7dba7efeafcbfd3b1e9ec464f09a10585f8d1330bdb8bf7325d54ddd826aebce51023b5cfab4b7ac36baabeff5833e8b7b7dae05fa425fea2b7dad6f1449df0ababed35f8ca99ae9ad31313cc3378e426a0446684446f4eb0a5523aeaf985b27c6a94ec06f1d8db3941b17944d1a8971356e8c8d6fe5a37430d261a7da4666e4466194edc4a88c7a28c61a533ddbb38dc69b7b4ba3d51d5d373aa3370663d41d6fa1fd57e7d5a3f6947eb47ffeaf3dd37d5c2bc8a2c51f5cb9af27fb7a3c0db860323c2889a56b2a6160dad6c00cdc683d376cbdb9cf0691b7b9c806619093b94119b4c16847833538c1d53c8337384330a686a831eadc9034ca900d45ef0df57d0eff9ac76fd1faad92828878576fc0b3dd47c2500ed3977da96e0ccdd00d63e4b1c4300d4b570cdb700c371086cad81b0763e6adbd45a819a331780b630e8e6e6134c6f2fe7c69acbce57ffffd27e8bb4fa2e58f75c25f7bb3e77bbb6fd1fa6d5cebc798f18f199640ffcef95dba09def845dc1b38b0c432706f0976b7f49647d99b435d7a73637daa7a2da75ba79de87b63636c8d9df1624ecd89e999be7934216037236163c6e6c93c0b293a0e4f98a1b1aeb7b80bad5445a3f6e6b591eef5d66f4cc044d84905bace04c5317375231b6601f72cc3955999f5717fc6cdc66ccdaeba9abdcf869acff88cb7340703f316881d80c8089f70e12dd5fe9ff93eadb3719b85d7b798e95dfbe158d68ff55f53347a19f9bfce8ffc382feca1ecdfe0086a811bb8626a2fa895386008a0a26dd17f69b488335936f439698e2666e2b5aecf4cc2244dcaa44dc6644d6089c99b82219a4743baa322eabd2999b2a9fcb6b6fed61768e70f5aefd8487d61aa7c6b6a75a6903f50cbf4d1d4f5ca34d4d6344deb165dd2dbc2b4bbc2747cf7d2626ad89aaecf842b9f3196881bc668ee8d31d4e0f1f04ff0e4ad8659988274e2dfe2ca6b094c94eb3fe3c08ff91ad091ef9ec50a5e0057079540edbdb4e0bb5ae4b3115bd4de3c808552437f69cd592fdd56d1de9c9b0b73a907e6ca5c9b1b736beecc17736b4d35c69a08a9e5699c091ee9dd9830da93b21d95fa4c906d65f9d5d06ffa82ef1e3cb28ea02bafda6305e88b86acd8978fd5ed286f5b3b3b58a79ebfb46a5f66d699caac4bd8fa0c9521c600475c7340ccf19656f24f7f3f63a09cb2320eaf5f7caf16d83efafeb9cfe645ee3910baeed3b323deb7d6d5c0ad9b4a6889ee18f387cda9fd832b608bd8b98116f7e65476698fea9059e92db2322bb70aabb42aabb61aab9543abb37a6bb046ab33630b33b5dff66aa57d81d6023722562145a9466049264a722c470fe5b1708bb0488b32498bf64fc9f17695288b31318b8dc7a1cf32c4116f19ae3ccbe200199eca46d26750459c01fdff0779f2abc684e7681d4d8137b7c08c3c301a1c5cf50dbcd40a62b5f4167f67ec183244fdbb63c2a8226ee8165277f0cfd8a3dc756409afc04f9f459aa2410d5b4bb0c424be56972aba5a92255b8a1688f0c79686a4c8322dcbb22dc772adfd6f3be876f5ae93eab375e8147259e1d6acdf58f3879edc1159584b6b65adadcdc4b6b6d62e9b5b2ff6d49e40a0e50f3d62a97546fc804f70b1ce882b548638038f56882721f58ac93fc4914fe614f3e07524f2af3897fddd7706410ce3481c603207be5c1f5cf1203b435c01f59ca398a6697ddae8995a5e1d3bfbd84fed009d8f6965e8cb33ec580bec937db62f7662b296a966f6d5befdb19f3145bb181ab1cf3ba5531157eebb52323bb5333bb70b2bb24bbbb26bbbb956ad6db77667f7f1543bd91065dd3932b7ce57dae2909e001aefb882a9800a7cde7fd3f7fd1a18c4fad6434f50dcf5e089cf20aea0d80b792ea686dcc03596f61831361670366e13e5e9581d539bb4299bb6199bb5399bb7055b843e966cf9a1153fe64fa0f05dbbb3155bb5b54eb275331752dbb04ddb122bc0c3b61ddb8dae6752dedafb5eb70ff6cc9e63d831b217c050c73a1b63047a827041fc402cb197e82760443deabfe9fb7eb504e9074459c3fb36a4508c83b8027e616ebaacac3616379254e6adec9557c6337b6db8f6c68fc3786ad85b7b67bf385367e278a0d2aae33b47940ffe5a40437227306427b44d277262a3704eced9b938c999f0d588bc88ceb50d8ac4b9d9be933a1958c2fcce1170618007c7d4166f9d9d1c6a41654e692f9d8aca4c179e57ff2e9e8062809da1181ff96b64710fff7cb7bff628dfb646cbd4f6e8d41667dd0fe10e9833138f4ee3b4da3e2ec3e2584691d339bd3338a3b970302b7270b5750887742887761887753887b3343b717827f2394770444772644771544773f4288a4e272d8912c2311cf3d2969993062f3e6d9de36909eaeed90f8edcb5e41c310f2db197f6b28447a031e7327bc5e47f828dff032dd28b7b6ebc0a29a7b2ce881b8fe7909d810d82f7029e3c6c7224eda5c587adbdf40cc7f24a7deed8b7bde39c8c40385661e9b8966457cede39383367ee2c9ca5b372d65ae0a9d06ebc1458b17576ce0bf83bf07b56e61f27c2d170a756ea4ea25b39891c7be57a91edfa9e1db601536625628be51e91c687ad53a1881850003d419fd5a9d0e72ac18f85edbf892780c102551465216edc3d162002f1ef02c55d0f0f4241efb801f8ada575b647a8cb082dff3d1d3b377423378ef617e9acc587dbc53db967f7e226eed5bdd9949bba999bbb855bba955b879545bb8ddb5a99dbb9dd793c5b6eef0e36e18e01e762f62a9e7a4bb4f4dbb3d0fd03c686778e32cf0a1878471f215466118abecee8f3207e50f7570226fc727ffcff4fad3180860027eef9f08ff6ae2b77ae4838b2d9a13f99e053c02e2dcef55d1cb41ed061e52b7d6ec2e654a36d3926e6527690ccaf954b47e42d049550dcb37f9ed0c1daedfcb3cb403d2593e0ecb2c9dce59279321d0b974fda64d6ef41a99c8071bd735366a20e16708cb2e025248d1de4246764116536f48813e5dd5f21d410676c40310246fd9b7872d70ef00be55b0cd3221f8d2a8abd405dee0a7b9487fe28836fbf473bc836af749445994f8724f41d33f43def0aae48e5ae64d6ae1ced5de5acdd6e57fcacb97d332aaaab6ab3d6699d9cce6e43e66aaeee1aae6963ae15a728aef2ec2074bda14f3b60df1cf5b767e7441006214201bd6e421d7adb4708215543fc419f3b60e2f41593ff0136fe4fb428eb1a49a49e2886413e1b55e4ab811710e3b836e206ca0120b74f0cdce7bce5e3fa47afa03ef156fdbeccfa3d27f6fb18f27dd7316649eb0baeebeedd3d11b807fb00f19459a6be90b4c6ec543b1627ba015783cdafa20c98e73b45b8726769c789a02773f05836e8086e2f51752af09bebb40bd8a17f7005b801ef8b74047d0e7915fcabe22e14735909e2071a4742c8f88fc8e6deeb11e80b8ab6cc01b2495cd7b417140320cf81ae47fd837a096980eb415d40ff2e218e4d83de5dc5a9ed87d45146b15b1bdb737b9ec5a8d8beed07c0336082e559886feedc9d2b276fe506c61add13f5f89576e7de0a10635026e2068827267850148b3d7e0f98f8e0bbeef78afe55f909ca81c3d5831bc8ea4c17fcd60ac5360fcea00818e2afcb2387467902bcc62354106ad0bfcb075f5cffcd7611424e8a9e2354efbf771eede3f9e37ddefe0e62380bddc9c9915e0d3de2eae33af43af830eef179106f7fc65e0143dd9f3dee83cabf892728d242baf188addec69542ea4d57903d238b462db248649f57fa110b3d2afadddd569117b3509c849e3f7ef778edd7f69e6b9c1fb6fe768f47455af1f81df289a8cf915e3c622ec45974cd0391f235ee42a83c5eff37e9c93d57d71eb93b7002f293c7f811d826e4f2800dca5f90dfe6514efd40e7c10114b13e7ad0f51f88b87e943d9e3fb2bcf71cfad94619fabbb7fbbcbdfee0068a741fcf111ee8fd1ff9c7038d47acf5d63ef4e4f1fb574cfe07d8f83f5151dcf598abbbf3a34579fc23977fc4613e83e628903d3e7cc5c3f3bcd9f39bbd239e3c328b47fd69efbf730571ec81dc1be7defef67eedfd333c10408fa80c457b65f688411ef77c70e471fde333ddf393fff3bfffd7ff0527554e47</data> + </image> + <image name="image3"> + <data format="XPM.GZ" length="9213">789cedd6b10ac2301845e13d4ff1d36c416c429782f80882a3200e314574e8a27510f1dd35191c1ce2206488e76cb7217c5b686b64b35e8969d565f2d3294838fab398e13a8eb7ed6e79578d73567a2b9db866a61a2f41b47dd57771cee3dc0ff1439c3ace432a9d66d331ff2ecdfc8d7c888888888888888888888888758afa7b1fe22f21d623faa2212222febb58fe9543ac432cff678588888888888888888888885899f858a827579f8c14</data> + </image> + <image name="image4"> + <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data> + </image> + <image name="image5"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </image> +</images> +<slots> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/dnd/iconview.cpp b/examples/demo/dnd/iconview.cpp new file mode 100644 index 000000000..c8ce01b87 --- /dev/null +++ b/examples/demo/dnd/iconview.cpp @@ -0,0 +1,42 @@ +#include <qdragobject.h> + +#include "dnd.h" +#include "iconview.h" + + +IconView::IconView( TQWidget* parent, const char* name ) + : TQIconView( parent, name ) +{ + connect( this, SIGNAL(dropped(TQDropEvent*, const TQValueList<TQIconDragItem>&)), + SLOT(slotNewItem(TQDropEvent*, const TQValueList<TQIconDragItem>&))); +} + +IconView::~IconView() +{ + +} + + +TQDragObject *IconView::dragObject() +{ + if ( !currentItem() ) return 0; + + TQTextDrag * drg = new TQTextDrag( ((IconViewItem*)currentItem())->tag(), this ); + drg->setSubtype("dragdemotag"); + drg->setPixmap( *currentItem()->pixmap() ); + + return drg; +} + +void IconView::slotNewItem( TQDropEvent *e, const TQValueList<TQIconDragItem>& ) +{ + TQString tag; + if ( !e->provides( "text/dragdemotag" ) ) return; + + if ( TQTextDrag::decode( e, tag ) ) { + IconItem item = ((DnDDemo*) parentWidget())->findItem( tag ); + IconViewItem *iitem = new IconViewItem( this, item.name(), *item.pixmap(), tag ); + iitem->setRenameEnabled( TRUE ); + } + e->acceptAction(); +} diff --git a/examples/demo/dnd/iconview.h b/examples/demo/dnd/iconview.h new file mode 100644 index 000000000..a0b4e3a95 --- /dev/null +++ b/examples/demo/dnd/iconview.h @@ -0,0 +1,31 @@ +#include <qiconview.h> +#include <qstring.h> + +#include "dnd.h" + +class IconViewItem : public TQIconViewItem +{ +public: + IconViewItem( TQIconView * parent, const TQString & text, const TQPixmap & icon, const TQString& tag ) + : TQIconViewItem( parent, text, icon ), _tag( tag ) {} + virtual ~IconViewItem() {} + + TQString tag() { return _tag; } + +private: + TQString _tag; +}; + +class IconView : public TQIconView +{ + Q_OBJECT + +public: + IconView( TQWidget* parent = 0, const char* name = 0 ); + ~IconView(); + + TQDragObject *dragObject(); + +public slots: + void slotNewItem( TQDropEvent *t, const TQValueList<TQIconDragItem>& ); +}; diff --git a/examples/demo/dnd/listview.cpp b/examples/demo/dnd/listview.cpp new file mode 100644 index 000000000..443bb7e50 --- /dev/null +++ b/examples/demo/dnd/listview.cpp @@ -0,0 +1,72 @@ +#include <qdragobject.h> +#include <qapplication.h> +#include "listview.h" +#include "dnd.h" + +ListView::ListView( TQWidget* parent, const char* name ) + : TQListView( parent, name ) +{ + setAcceptDrops( TRUE ); + setSorting( -1, FALSE ); + dragging = FALSE; +} + +ListView::~ListView() +{ + +} + +void ListView::dragEnterEvent( TQDragEnterEvent *e ) +{ + if ( e->provides( "text/dragdemotag" ) ) + e->accept(); +} + +void ListView::dropEvent( TQDropEvent *e ) +{ + if ( !e->provides( "text/dragdemotag" ) ) + return; + + TQString tag; + + if ( TQTextDrag::decode( e, tag ) ) { + IconItem item = ((DnDDemo*) parentWidget())->findItem( tag ); + TQListViewItem *after = itemAt( viewport()->mapFromParent( e->pos() ) ); + ListViewItem *litem = new ListViewItem( this, after, item.name(), tag ); + litem->setPixmap( 0, *item.pixmap() ); + } +} + +void ListView::contentsMousePressEvent( TQMouseEvent *e ) +{ + TQListView::contentsMousePressEvent( e ); + dragging = TRUE; + pressPos = e->pos(); +} + +void ListView::contentsMouseMoveEvent( TQMouseEvent *e ) +{ + TQListView::contentsMouseMoveEvent( e ); + + if ( ! dragging ) return; + + if ( !currentItem() ) return; + + if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) { + TQTextDrag *drg = new TQTextDrag( ((ListViewItem*)currentItem())->tag(), this ); + + const TQPixmap *p = ((ListViewItem*)currentItem())->pixmap( 0 ); + if (p) + drg->setPixmap(*p); + drg->setSubtype( "dragdemotag" ); + drg->dragCopy(); + dragging = FALSE; + } +} + +void ListView::contentsMouseReleaseEvent( TQMouseEvent *e ) +{ + TQListView::contentsMouseReleaseEvent( e ); + dragging = FALSE; +} + diff --git a/examples/demo/dnd/listview.h b/examples/demo/dnd/listview.h new file mode 100644 index 000000000..b6b17a0da --- /dev/null +++ b/examples/demo/dnd/listview.h @@ -0,0 +1,35 @@ +#include <qlistview.h> + +class ListViewItem : public TQListViewItem +{ +public: + ListViewItem ( TQListView * parent, const TQString& name, const TQString& tag ) + : TQListViewItem( parent, name ), _tag( tag ) {} + ListViewItem ( TQListView * parent, TQListViewItem * after, const TQString& name, const TQString& tag ) + : TQListViewItem( parent, after, name ), _tag( tag ) {} + virtual ~ListViewItem() {} + + TQString tag() { return _tag; } + +private: + TQString _tag; +}; + +class ListView : public TQListView +{ + Q_OBJECT + +public: + ListView( TQWidget* parent = 0, const char* name = 0 ); + ~ListView(); + + void dragEnterEvent( TQDragEnterEvent * ); + void dropEvent( TQDropEvent * ); + void contentsMousePressEvent( TQMouseEvent * ); + void contentsMouseMoveEvent( TQMouseEvent * ); + void contentsMouseReleaseEvent( TQMouseEvent * ); + +private: + TQPoint pressPos; + bool dragging; +}; diff --git a/examples/demo/dnd/styledbutton.cpp b/examples/demo/dnd/styledbutton.cpp new file mode 100644 index 000000000..3736198e4 --- /dev/null +++ b/examples/demo/dnd/styledbutton.cpp @@ -0,0 +1,308 @@ +/********************************************************************** +** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** Licensees holding valid TQt Commercial licenses may use this file in +** accordance with the TQt Commercial License Agreement provided with +** the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "styledbutton.h" + +#include <qcolordialog.h> +#include <qpalette.h> +#include <qlabel.h> +#include <qpainter.h> +#include <qimage.h> +#include <qpixmap.h> +#include <qapplication.h> +#include <qdragobject.h> +#include <qstyle.h> + +StyledButton::StyledButton(TQWidget* parent, const char* name) + : TQButton( parent, name ), pix( 0 ), spix( 0 ), edit( ColorEditor ), s( 0 ), mousePressed( FALSE ) +{ + setMinimumSize( minimumSizeHint() ); + setAcceptDrops( TRUE ); + + connect( this, SIGNAL(clicked()), SLOT(onEditor())); +} + +StyledButton::StyledButton( const TQBrush& b, TQWidget* parent, const char* name, WFlags f ) + : TQButton( parent, name, f ), spix( 0 ), s( 0 ) +{ + col = b.color(); + pix = b.pixmap(); + setMinimumSize( minimumSizeHint() ); +} + +StyledButton::~StyledButton() +{ + if ( pix ) { + delete pix; + pix = 0; + } + if ( spix ) { + delete spix; + spix = 0; + } +} + +void StyledButton::setEditor( EditorType e ) +{ + if ( edit == e ) + return; + + edit = e; + update(); +} + +StyledButton::EditorType StyledButton::editor() const +{ + return edit; +} + +void StyledButton::setColor( const TQColor& c ) +{ + col = c; + update(); +} + +void StyledButton::setPixmap( const TQPixmap & pm ) +{ + if ( !pm.isNull() ) { + delete pix; + pix = new TQPixmap( pm ); + } else { + delete pix; + pix = 0; + } + scalePixmap(); +} + +TQColor StyledButton::color() const +{ + return col; +} + +TQPixmap* StyledButton::pixmap() const +{ + return pix; +} + +bool StyledButton::scale() const +{ + return s; +} + +void StyledButton::setScale( bool on ) +{ + if ( s == on ) + return; + + s = on; + scalePixmap(); +} + +TQSize StyledButton::sizeHint() const +{ + return TQSize( 50, 25 ); +} + +TQSize StyledButton::minimumSizeHint() const +{ + return TQSize( 50, 25 ); +} + +void StyledButton::scalePixmap() +{ + delete spix; + + if ( pix ) { + spix = new TQPixmap( 6*width()/8, 6*height()/8 ); + TQImage img = pix->convertToImage(); + + spix->convertFromImage( s? img.smoothScale( 6*width()/8, 6*height()/8 ) : img ); + } else { + spix = 0; + } + + update(); +} + +void StyledButton::resizeEvent( TQResizeEvent* e ) +{ + scalePixmap(); + TQButton::resizeEvent( e ); +} + +void StyledButton::drawButton( TQPainter *paint ) +{ + style().drawPrimitive(TQStyle::PE_ButtonBevel, paint, rect(), colorGroup(), + isDown() ? TQStyle::Style_Sunken : TQStyle::Style_Default); + drawButtonLabel(paint); + + if (hasFocus()) + style().drawPrimitive(TQStyle::PE_FocusRect, paint, + style().subRect(TQStyle::SR_PushButtonFocusRect, this), + colorGroup(), TQStyle::Style_Default); +} + +void StyledButton::drawButtonLabel( TQPainter *paint ) +{ + TQColor pen = isEnabled() ? + hasFocus() ? palette().active().buttonText() : palette().inactive().buttonText() + : palette().disabled().buttonText(); + paint->setPen( pen ); + + if(!isEnabled()) { + paint->setBrush( TQBrush( colorGroup().button() ) ); + } + else if ( edit == PixmapEditor && spix ) { + paint->setBrush( TQBrush( col, *spix ) ); + paint->setBrushOrigin( width()/8, height()/8 ); + } else + paint->setBrush( TQBrush( col ) ); + + paint->drawRect( width()/8, height()/8, 6*width()/8, 6*height()/8 ); +} + +void StyledButton::onEditor() +{ + switch (edit) { + case ColorEditor: { + TQColor c = TQColorDialog::getColor( palette().active().background(), this ); + if ( c.isValid() ) { + setColor( c ); + emit changed(); + } + } break; + case PixmapEditor: { + TQPixmap p; + /* + if ( pixmap() ) + p = qChoosePixmap( this,*pixmap() ); + else + p = qChoosePixmap( this, TQPixmap() ); + if ( !p.isNull() ) { + setPixmap( p ); + emit changed(); + } + */ + } break; + default: + break; + } +} + +void StyledButton::mousePressEvent(TQMouseEvent* e) +{ + TQButton::mousePressEvent(e); + mousePressed = TRUE; + pressPos = e->pos(); +} + +void StyledButton::mouseMoveEvent(TQMouseEvent* e) +{ + TQButton::mouseMoveEvent( e ); +#ifndef QT_NO_DRAGANDDROP + if ( !mousePressed ) + return; + if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) { + if ( edit == ColorEditor ) { + TQColorDrag *drg = new TQColorDrag( col, this ); + TQPixmap pix( 25, 25 ); + pix.fill( col ); + TQPainter p( &pix ); + p.drawRect( 0, 0, pix.width(), pix.height() ); + p.end(); + drg->setPixmap( pix ); + mousePressed = FALSE; + drg->dragCopy(); + } + else if ( edit == PixmapEditor && pix && !pix->isNull() ) { + TQImage img = pix->convertToImage(); + TQImageDrag *drg = new TQImageDrag( img, this ); + if(spix) + drg->setPixmap( *spix ); + mousePressed = FALSE; + drg->dragCopy(); + } + } +#endif +} + +#ifndef QT_NO_DRAGANDDROP +void StyledButton::dragEnterEvent( TQDragEnterEvent *e ) +{ + setFocus(); + if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) + e->accept(); + else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) + e->accept(); + else + e->ignore(); +} + +void StyledButton::dragLeaveEvent( TQDragLeaveEvent * ) +{ + if ( hasFocus() ) + parentWidget()->setFocus(); +} + +void StyledButton::dragMoveEvent( TQDragMoveEvent *e ) +{ + if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) + e->accept(); + else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) + e->accept(); + else + e->ignore(); +} + +void StyledButton::dropEvent( TQDropEvent *e ) +{ + if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) { + TQColor color; + TQColorDrag::decode( e, color ); + setColor(color); + emit changed(); + e->accept(); + } + else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) { + TQImage img; + TQImageDrag::decode( e, img ); + TQPixmap pm; + pm.convertFromImage(img); + setPixmap(pm); + emit changed(); + e->accept(); + } else { + e->ignore(); + } +} +#endif // QT_NO_DRAGANDDROP diff --git a/examples/demo/dnd/styledbutton.h b/examples/demo/dnd/styledbutton.h new file mode 100644 index 000000000..fd96cd63c --- /dev/null +++ b/examples/demo/dnd/styledbutton.h @@ -0,0 +1,106 @@ +/********************************************************************** +** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** Licensees holding valid TQt Commercial licenses may use this file in +** accordance with the TQt Commercial License Agreement provided with +** the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#ifndef STYLEDBUTTON_H +#define STYLEDBUTTON_H + +#include <qbutton.h> +#include <qpixmap.h> + +class TQColor; +class TQBrush; + +class StyledButton : public TQButton +{ + Q_OBJECT + + Q_PROPERTY( TQColor color READ color WRITE setColor ) + Q_PROPERTY( TQPixmap pixmap READ pixmap WRITE setPixmap ) + Q_PROPERTY( EditorType editor READ editor WRITE setEditor ) + Q_PROPERTY( bool scale READ scale WRITE setScale ) + + Q_ENUMS( EditorType ) + +public: + enum EditorType { ColorEditor, PixmapEditor }; + + StyledButton( TQWidget* parent = 0, const char* name = 0 ); + StyledButton( const TQBrush& b, TQWidget* parent = 0, const char* name = 0, WFlags f = 0 ); + ~StyledButton(); + + void setEditor( EditorType ); + EditorType editor() const; + + void setColor( const TQColor& ); + void setPixmap( const TQPixmap& ); + + TQPixmap* pixmap() const; + TQColor color() const; + + void setScale( bool ); + bool scale() const; + + TQSize sizeHint() const; + TQSize minimumSizeHint() const; + +public slots: + virtual void onEditor(); + +signals: + void changed(); + +protected: + void mousePressEvent(TQMouseEvent*); + void mouseMoveEvent(TQMouseEvent*); +#ifndef QT_NO_DRAGANDDROP + void dragEnterEvent ( TQDragEnterEvent * ); + void dragMoveEvent ( TQDragMoveEvent * ); + void dragLeaveEvent ( TQDragLeaveEvent * ); + void dropEvent ( TQDropEvent * ); +#endif // QT_NO_DRAGANDDROP + void drawButton( TQPainter* ); + void drawButtonLabel( TQPainter* ); + void resizeEvent( TQResizeEvent* ); + void scalePixmap(); + +private: + TQPixmap* pix; + TQPixmap* spix; // the pixmap scaled down to fit into the button + TQColor col; + EditorType edit; + bool s; + TQPoint pressPos; + bool mousePressed; +}; + +#endif //STYLEDBUTTON_H diff --git a/examples/demo/frame.cpp b/examples/demo/frame.cpp new file mode 100644 index 000000000..a712f7b4f --- /dev/null +++ b/examples/demo/frame.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "frame.h" + +#include <qapplication.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qaccel.h> +#include <qtoolbox.h> +#include <qpainter.h> +#include <qwidgetstack.h> +#include <qstylefactory.h> +#include <qaction.h> +#include <qsignalmapper.h> +#include <qdict.h> +#include <qdir.h> +#include <qtextcodec.h> +#include <stdlib.h> +#include <qbuttongroup.h> +#include <qtoolbutton.h> + +static TQTranslator *translator = 0; +static TQTranslator *qt_translator = 0; + +Frame::Frame( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name ) +{ + TQMenuBar *mainMenu = menuBar(); + TQPopupMenu *fileMenu = new TQPopupMenu( this, "file" ); + fileMenu->insertItem( tr( "&Exit" ), this, SLOT( close() ), + TQAccel::stringToKey( tr( "Ctrl+Q" ) ) ); + + TQPopupMenu *styleMenu = new TQPopupMenu( this, "style" ); + styleMenu->setCheckable( TRUE ); + TQActionGroup *ag = new TQActionGroup( this, 0 ); + ag->setExclusive( TRUE ); + TQSignalMapper *styleMapper = new TQSignalMapper( this ); + connect( styleMapper, SIGNAL( mapped( const TQString& ) ), + this, SLOT( setStyle( const TQString& ) ) ); + + TQStringList list = TQStyleFactory::keys(); + list.sort(); + TQDict<int> stylesDict( 17, FALSE ); + for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + TQString style = *it; + TQString styleAccel = style; + if ( stylesDict[styleAccel.left(1)] ) { + for ( uint i = 0; i < styleAccel.length(); i++ ) { + if ( !stylesDict[styleAccel.mid( i, 1 )] ) { + stylesDict.insert(styleAccel.mid( i, 1 ), (const int *)1); + styleAccel = styleAccel.insert( i, '&' ); + break; + } + } + } else { + stylesDict.insert(styleAccel.left(1), (const int *)1); + styleAccel = "&"+styleAccel; + } + TQAction *a = new TQAction( style, TQIconSet(), + styleAccel, 0, ag, 0, ag->isExclusive() ); + connect( a, SIGNAL( activated() ), styleMapper, SLOT(map()) ); + styleMapper->setMapping( a, a->text() ); + } + ag->addTo( styleMenu ); + + mainMenu->insertItem( tr( "&File" ), fileMenu ); + mainMenu->insertItem( tr( "St&yle" ), styleMenu ); + + stack = new TQWidgetStack( this ); + + setCentralWidget( stack ); +} + +void Frame::setCategories( const TQPtrList<CategoryInterface> &l ) +{ + categories = l; + TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this ); + dw->setResizeEnabled( TRUE ); + dw->setVerticalStretchable( TRUE ); + addDockWindow( dw, DockLeft ); + setDockEnabled( dw, DockTop, FALSE ); + setDockEnabled( dw, DockBottom, FALSE ); + dw->setCloseMode( TQDockWindow::Always ); + + toolBox = new TQToolBox( dw ); + dw->setWidget( toolBox ); + + dw->setCaption( tr( "Demo Categories" ) ); + + for ( int i = 0; i < categories.count(); ++i ) + toolBox->addItem( createCategoryPage( categories.at(i) ), + categories.at(i)->icon(), + categories.at(i)->name() ); + + categories.first()->setCurrentCategory( 0 ); +} + +TQWidget *Frame::createCategoryPage( CategoryInterface *c ) +{ + TQButtonGroup *g = new TQButtonGroup( 1, Horizontal, toolBox ); + g->setFrameStyle( TQFrame::NoFrame ); + g->setEraseColor(green); + g->setBackgroundMode(PaletteBase); + for ( int i = 0; i < c->numCategories(); ++i ) { + TQToolButton *b = new TQToolButton( g ); + b->setBackgroundMode(PaletteBase); + b->setTextLabel( c->categoryName( i ) ); + b->setIconSet( c->categoryIcon( i ) ); + b->setAutoRaise( TRUE ); + b->setTextPosition( TQToolButton::Right ); + b->setUsesTextLabel( TRUE ); + g->insert( b, i + c->categoryOffset() ); + connect( g, SIGNAL( clicked( int ) ), c, SLOT( setCurrentCategory( int ) ) ); + } + return g; +} + +void Frame::setStyle( const TQString& style ) +{ + TQStyle *s = TQStyleFactory::create( style ); + if ( s ) + TQApplication::setStyle( s ); +} + +void Frame::updateTranslators() +{ + if ( !qt_translator ) { + qt_translator = new TQTranslator( qApp ); + translator = new TQTranslator( qApp ); + qApp->installTranslator( qt_translator ); + qApp->installTranslator( translator ); + } + + TQString base = TQDir("../../translations").absPath(); + qt_translator->load( TQString( "qt_%1" ).arg( TQTextCodec::locale() ), base ); + translator->load( TQString( "translations/demo_%1" ).arg( TQTextCodec::locale() ) ); +} + +bool Frame::event( TQEvent *e ) +{ + if ( e->type() == TQEvent::LocaleChange ) + updateTranslators(); + + return TQMainWindow::event( e ); +} diff --git a/examples/demo/frame.h b/examples/demo/frame.h new file mode 100644 index 000000000..865ea21db --- /dev/null +++ b/examples/demo/frame.h @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qmainwindow.h> +#include <qintdict.h> +#include "categoryinterface.h" + +class TQToolBox; +class TQStyle; +class TQWidgetStack; + +class Frame : public TQMainWindow +{ + Q_OBJECT + +public: + Frame( TQWidget *parent=0, const char *name=0 ); + void setCategories( const TQPtrList<CategoryInterface> &l ); + + static void updateTranslators(); + + TQWidgetStack *widgetStack() const { return stack; } + +private slots: + void setStyle( const TQString& ); + +protected: + bool event( TQEvent *e ); + +private: + TQWidget *createCategoryPage( CategoryInterface *c ); + +private: + TQToolBox *toolBox; + TQWidgetStack *stack; + TQIntDict<TQWidget> categoryPages; + TQPtrList<CategoryInterface> categories; + +}; diff --git a/examples/demo/graph.cpp b/examples/demo/graph.cpp new file mode 100644 index 000000000..96e03d6ab --- /dev/null +++ b/examples/demo/graph.cpp @@ -0,0 +1,445 @@ +#include "graph.h" +#include <qcanvas.h> +#include <stdlib.h> +#include <qdatetime.h> +#include <qhbox.h> +#include <qpushbutton.h> +#include <qslider.h> +#include <qlabel.h> +#include <qlayout.h> + +const int bounce_rtti = 1234; + +// We use a global variable to save memory - all the brushes and pens in +// the mesh are shared. +static TQBrush *tb = 0; +static TQPen *tp = 0; + +class EdgeItem; +class NodeItem; +class FigureEditor; +typedef TQValueList<NodeItem*> NodeItemList; +typedef TQValueList<EdgeItem*> EdgeItemList; + +#define SPEED2ADVANCE(x) (301-x) + +class GraphWidgetPrivate +{ +public: + GraphWidgetPrivate() { + moving = 0; + speed = 275; + } + ~GraphWidgetPrivate() { + delete canvas; + } + NodeItemList nodeItems; + FigureEditor* editor; + TQCanvas* canvas; + TQCanvasItem* moving; + int speed; +}; + +class EdgeItem: public TQCanvasLine +{ +public: + EdgeItem( NodeItem*, NodeItem*, TQCanvas* ); + void setFromPoint( int x, int y ) ; + void setToPoint( int x, int y ); + void moveBy(double dx, double dy); + + NodeItem* from; + NodeItem* to; +}; + + + +class NodeItem: public TQCanvasEllipse +{ +public: + NodeItem( GraphWidgetPrivate* g ); + ~NodeItem() {} + + void addInEdge( EdgeItem *edge ) { inList.append( edge ); } + void addOutEdge( EdgeItem *edge ) { outList.append( edge ); } + + void moveBy(double dx, double dy); + + void calcForce(); + void advance( int stage ); + +private: + GraphWidgetPrivate* graph; + EdgeItemList inList; + EdgeItemList outList; +}; + + + +void EdgeItem::moveBy(double, double) +{ + //nothing +} + +EdgeItem::EdgeItem( NodeItem *fromItem, NodeItem *toItem, TQCanvas *canvas ) + : TQCanvasLine( canvas ) +{ + from = fromItem; + to = toItem; + setPen( *tp ); + setBrush( *tb ); + from->addOutEdge( this ); + to->addInEdge( this ); + setPoints( int(from->x()), int(from->y()), int(to->x()), int(to->y()) ); + setZ( 127 ); +} + +void EdgeItem::setFromPoint( int x, int y ) +{ + setPoints( x,y, endPoint().x(), endPoint().y() ); +} + +void EdgeItem::setToPoint( int x, int y ) +{ + setPoints( startPoint().x(), startPoint().y(), x, y ); +} + + +void NodeItem::moveBy(double dx, double dy) +{ + double nx = x() + dx; + double ny = y() + dy; + if ( graph->moving != this ) { + nx = TQMAX( width()/2, nx ); + ny = TQMAX( height()/2, ny ); + nx = TQMIN( canvas()->width() - width()/2, nx ); + ny = TQMIN( canvas()->height() - height()/2, ny ); + } + TQCanvasEllipse::moveBy( nx-x(), ny-y() ); + EdgeItemList::Iterator it; + for ( it = inList.begin(); it != inList.end(); ++it ) + (*it)->setToPoint( int(x()), int(y()) ); + for ( it = outList.begin(); it != outList.end(); ++it ) + (*it)->setFromPoint( int(x()), int(y()) ); +} + +NodeItem::NodeItem( GraphWidgetPrivate* g ) + : TQCanvasEllipse( 32, 32, g->canvas ) +{ + graph = g; + graph->nodeItems.append( this ); + setPen( *tp ); + setBrush( *tb ); + setZ( 128 ); +} + +void NodeItem::advance( int stage ) { + switch ( stage ) { + case 0: + calcForce(); + break; + case 1: + TQCanvasItem::advance(stage); + break; + } +} + +void NodeItem::calcForce() { + if ( graph->moving == this ) { + setVelocity( 0, 0 ); + return; + } + double xvel = 0; + double yvel = 0; + for ( NodeItemList::Iterator it = graph->nodeItems.begin(); it != graph->nodeItems.end(); ++it ) { + NodeItem* n = (*it); + if ( n == this ) + continue; + double dx = x() - n->x(); + double dy = y() - n->y(); + double l = 2 * ( dx * dx + dy * dy ); + if ( l > 0 ) { + xvel = xvel + dx*260 / l; + yvel = yvel + dy*260 / l; + } + } + double w = 1 + outList.count() + inList.count(); + w *= 10; + EdgeItemList::Iterator it2; + EdgeItem * e; + NodeItem* n; + for ( it2 = outList.begin(); it2 != outList.end(); ++it2 ) { + e = (*it2); + n = e->to; + xvel = xvel - ( x() - n->x() ) / w; + yvel = yvel - ( y() - n->y() ) / w; + } + for ( it2 = inList.begin(); it2 != inList.end(); ++it2 ) { + e = (*it2); + n = e->from; + xvel = xvel - ( x() - n->x() ) / w; + yvel = yvel - ( y() - n->y() ) / w; + } + if ( TQABS( xvel ) < .1 && TQABS( yvel ) < .1 ) + xvel = yvel = 0; + setVelocity( xvel, yvel ); +} + + +class FigureEditor : public TQCanvasView { +public: + FigureEditor( GraphWidgetPrivate *g, TQWidget* parent=0, const char* name=0, WFlags f=0); + + TQSize sizeHint() const; + + +protected: + void contentsMousePressEvent(TQMouseEvent*); + void contentsMouseReleaseEvent(TQMouseEvent*); + void contentsMouseMoveEvent(TQMouseEvent*); + + + void resizeEvent( TQResizeEvent* ); + void showEvent( TQShowEvent* ); + void hideEvent( TQHideEvent* e); + +private: + void initialize(); + TQPoint moving_start; + GraphWidgetPrivate* graph; +}; + + +FigureEditor::FigureEditor( + GraphWidgetPrivate* g, TQWidget* parent, + const char* name, WFlags f) : + TQCanvasView(g->canvas, parent,name,f) +{ + graph = g; +} + +void FigureEditor::contentsMousePressEvent(TQMouseEvent* e) +{ + TQCanvasItemList l=canvas()->collisions(e->pos()); + for (TQCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) { + if ((*it)->rtti()==bounce_rtti ) + continue; + graph->moving = *it; + moving_start = e->pos(); + return; + } + graph->moving = 0; +} + +void FigureEditor::contentsMouseReleaseEvent(TQMouseEvent* ) +{ + if ( graph->moving ) + graph->moving = 0; +} + +void FigureEditor::contentsMouseMoveEvent(TQMouseEvent* e) +{ + if ( graph->moving ) { + graph->moving->moveBy(e->pos().x() - moving_start.x(), + e->pos().y() - moving_start.y()); + moving_start = e->pos(); + canvas()->update(); + } +} + +class BouncyText : public TQCanvasText { + void initPos(); + void initSpeed(); +public: + int rtti() const; + BouncyText(const TQString&, TQFont, TQCanvas*); + void advance(int); +}; + +BouncyText::BouncyText( const TQString& text, TQFont f, TQCanvas* canvas) : + TQCanvasText(text, f, canvas) +{ + setAnimated(TRUE); + initPos(); +} + + +int BouncyText::rtti() const +{ + return bounce_rtti; +} + +void BouncyText::initPos() +{ + initSpeed(); + int trial=1000; + do { + move(rand()%(canvas()->width()-boundingRect().width()), + rand()%(canvas()->height()-boundingRect().height())); + advance(0); + } while (trial-- && xVelocity()==0.0 && yVelocity()==0.0); +} + +void BouncyText::initSpeed() +{ + const double speed = 2.0; + double d = (double)(rand()%1024) / 1024.0; + double e = (double)(rand()%1024) / 1024.0; + + if ( d < .5 ) + d = -1 - d; + else + d = d + 1; + if ( e < .5 ) + e = -1 - e; + else + e = e + 1; + + setVelocity( d*speed, e * speed ); +} + +void BouncyText::advance( int stage ) +{ + switch ( stage ) { + case 0: { + double vx = xVelocity(); + double vy = yVelocity(); + + if ( vx == 0.0 && vy == 0.0 ) { + // stopped last turn + initSpeed(); + vx = xVelocity(); + vy = yVelocity(); + } + + TQRect r = boundingRect(); + r.moveBy( int(vx), int(vy) ); + + if ( r.left() < 0 || r.right() > canvas()->width() ) + vx = -vx; + if ( r.top() < 0 || r.bottom() > canvas()->height() ) + vy = -vy; + + r = boundingRect(); + r.moveBy( int(vx), int(vy) ); + if ( r.left() < 0 || r.right() > canvas()->width() ) + vx = 0; + if ( r.top() < 0 || r.bottom() > canvas()->height() ) + vy = 0; + + setVelocity( vx, vy ); + } break; + case 1: + TQCanvasItem::advance( stage ); + break; + } +} + +GraphWidget::GraphWidget( TQWidget *parent, const char *name) + : TQWidget( parent, name ) +{ + d = new GraphWidgetPrivate; + d->canvas = 0; + TQVBoxLayout* vb = new TQVBoxLayout( this, 11, 6 ); + d->editor = new FigureEditor( d, this ); + vb->addWidget( d->editor ); + TQHBoxLayout* hb = new TQHBoxLayout( vb ); + hb->addWidget( new TQLabel("Slow", this ) ); + TQSlider* slider = new TQSlider( 0, 300, 25, d->speed, Horizontal, this ); + connect( slider, SIGNAL( valueChanged(int) ), this, SLOT( setSpeed(int) ) ); + hb->addWidget( slider ); + hb->addWidget( new TQLabel("Fast", this ) ); + hb->addSpacing( 10 ); + TQPushButton* btn = new TQPushButton( "Shuffle Nodes", this ); + connect( btn, SIGNAL( clicked() ), this, SLOT( shuffle() ) ); + hb->addWidget( btn ); +} + + +GraphWidget::~GraphWidget() +{ + delete d; +} + +void GraphWidget::setSpeed(int s) +{ + d->speed = s; + if ( isVisible() && d->canvas ) + d->canvas->setAdvancePeriod( SPEED2ADVANCE( s ) ); +} + +void GraphWidget::shuffle() +{ + + for ( NodeItemList::Iterator it = d->nodeItems.begin(); it != d->nodeItems.end(); ++it ) { + NodeItem* ni = (*it); + ni->move(rand()%(d->canvas->width()-ni->width()),rand()%(d->canvas->height()-ni->height())); + } +} + + +TQSize FigureEditor::sizeHint() const +{ + return TQSize( 600, 400 ); +} + +void FigureEditor::resizeEvent( TQResizeEvent* e ) +{ + if ( canvas() ) + canvas()->resize( contentsRect().width(), contentsRect().height() ); + TQCanvasView::resizeEvent( e ); +} + +void FigureEditor::showEvent( TQShowEvent* ) +{ + initialize(); + canvas()->setAdvancePeriod( SPEED2ADVANCE(graph->speed) ); +} + +void FigureEditor::hideEvent( TQHideEvent* ) +{ + initialize(); + canvas()->setAdvancePeriod( -10 ); +} + +void FigureEditor::initialize() +{ + if ( canvas() ) + return; + resize( sizeHint() ); + graph->canvas = new TQCanvas( contentsRect().width(), contentsRect().height() ); + if ( !tb ) tb = new TQBrush( TQt::red ); + if ( !tp ) tp = new TQPen( TQt::black ); + srand( TQTime::currentTime().msec() ); + int nodecount = 0; + + int rows = 3; + int cols = 3; + + TQMemArray<NodeItem*> lastRow(cols); + for ( int r = 0; r < rows; r++ ) { + NodeItem *prev = 0; + for ( int c = 0; c < cols; c++ ) { + NodeItem *ni = new NodeItem( graph ); + ni->setAnimated( TRUE ); + nodecount++; + ni->move(rand()%(graph->canvas->width()-ni->width()),rand()%(graph->canvas->height()-ni->height())); + + if ( r > 0 ) + (new EdgeItem( lastRow[c], ni, graph->canvas ))->show(); + if ( prev ) + (new EdgeItem( prev, ni, graph->canvas ))->show(); + prev = ni; + lastRow[c] = ni; + ni->show(); + } + } + + graph->canvas->advance(); + + TQCanvasItem* i = new BouncyText( tr( "Drag the nodes around!" ), TQFont("helvetica", 24), graph->canvas); + i->show(); + setCanvas( graph->canvas ); + setMinimumSize( 600, 400 ); + setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ); +} diff --git a/examples/demo/graph.h b/examples/demo/graph.h new file mode 100644 index 000000000..841202bd0 --- /dev/null +++ b/examples/demo/graph.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qwidget.h> +class TQStyle; +class TQListBox; +class TQListBoxItem; +class TQWidgetStack; + +class GraphWidgetPrivate; + +class GraphWidget : public TQWidget +{ + Q_OBJECT +public: + GraphWidget( TQWidget *parent=0, const char *name=0 ); + ~GraphWidget(); + +private slots: + void shuffle(); + void setSpeed(int); + +private: + GraphWidgetPrivate* d; +}; diff --git a/examples/demo/i18n/en.po b/examples/demo/i18n/en.po new file mode 100644 index 000000000..32980ce48 --- /dev/null +++ b/examples/demo/i18n/en.po @@ -0,0 +1,848 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: none:0 +msgid "--language--" +msgstr "English" + +#: none:0 +msgid "&File" +msgstr "&File" + +#: none:0 +msgid "New" +msgstr "New" + +#: none:0 +msgid "&New..." +msgstr "&New..." + +#: none:0 +msgid "Open" +msgstr "Open" + +#: none:0 +msgid "&Open..." +msgstr "&Open.." + +#: none:0 +msgid "Save As" +msgstr "Save As" + +#: none:0 +msgid "Save &As..." +msgstr "Save &As..." + +#: none:0 +msgid "Save" +msgstr "Save" + +#: none:0 +msgid "&Save..." +msgstr "&Save..." + +#: none:0 +msgid "Print" +msgstr "Print" + +#: none:0 +msgid "&Print..." +msgstr "&Print..." + +#: none:0 +msgid "&Close" +msgstr "&Close" + +#: none:0 +msgid "&Edit" +msgstr "&Edit" + +#: none:0 +msgid "&Undo" +msgstr "&Undo" + +#: none:0 +msgid "Undo" +msgstr "Undo" + +#: none:0 +msgid "&Redo" +msgstr "&Redo" + +#: none:0 +msgid "Redo" +msgstr "Redo" + +#: none:0 +msgid "Cut" +msgstr "Cut" + +#: none:0 +msgid "&Cut" +msgstr "&Cut" + +#: none:0 +msgid "C&opy" +msgstr "C&opy" + +#: none:0 +msgid "Copy" +msgstr "Copy" + +#: none:0 +msgid "Paste" +msgstr "Paste" + +#: none:0 +msgid "&Paste" +msgstr "&Paste" + +#: none:0 +msgid "Clear" +msgstr "Clear" + +#: none:0 +msgid "Select All" +msgstr "Select All" + +#: none:0 +msgid "Line up" +msgstr "Line up" + +#: none:0 +msgid "For&mat" +msgstr "For&mat" + +#: none:0 +msgid "Bold" +msgstr "Bold" + +#: none:0 +msgid "&Bold" +msgstr "&Bold" + +#: none:0 +msgid "Italic" +msgstr "Italic" + +#: none:0 +msgid "&Italic" +msgstr "&Itatlic" + +#: none:0 +msgid "Underline" +msgstr "Underline" + +#: none:0 +msgid "&Underline" +msgstr "&Underline" + +#: none:0 +msgid "Left" +msgstr "Left" + +#: none:0 +msgid "&Left" +msgstr "&Left" + +#: none:0 +msgid "Center" +msgstr "Center" + +#: none:0 +msgid "C&enter" +msgstr "C&enter" + +#: none:0 +msgid "Right" +msgstr "Right" + +#: none:0 +msgid "&Right" +msgstr "&Right" + +#: none:0 +msgid "Justify" +msgstr "Justify" + +#: none:0 +msgid "&Justify" +msgstr "&Justify" + +#: none:0 +msgid "Color" +msgstr "Color" + +#: none:0 +msgid "&Color..." +msgstr "&Color..." + +#: none:0 +msgid "Standard" +msgstr "Standard" + +#: none:0 +msgid "Bullet List (Disc)" +msgstr "Bullet List (Disc)" + +#: none:0 +msgid "Bullet List (Circle)" +msgstr "Bullet List (Circle)" + +#: none:0 +msgid "Bullet List (Square)" +msgstr "Bullet List (Square)" + +#: none:0 +msgid "Ordered List (Decimal)" +msgstr "Ordered List (Decimal)" + +#: none:0 +msgid "Ordered List (Alpha lower)" +msgstr "(Ordered List (Alpha lower)" + +#: none:0 +msgid "Ordered List (Alpha upper)" +msgstr "Ordered List (Alpha upper)" + +#: none:0 +msgid "OK" +msgstr "OK" + +#: none:0 +msgid "Cancel" +msgstr "Cancel" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"locally connected" +msgstr "" +"_: QPrintDialog\n" +"locally connected" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Aliases: " +msgstr "" +"_: QPrintDialog\n" +"Aliases: " + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"unknown" +msgstr "" +"_: QPrintDialog\n" +"unknown" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Unknown Location" +msgstr "" +"_: QPrintDialog\n" +"Unknown Location" + +#: none:0 +msgid "Printer settings" +msgstr "Printer settings" + +#: none:0 +msgid "Print in color if available" +msgstr "Print in color if available" + +#: none:0 +msgid "Print in grayscale" +msgstr "Print in grayscale" + +#: none:0 +msgid "Print destination" +msgstr "Print destination" + +#: none:0 +msgid "Print to printer:" +msgstr "Print to printer:" + +#: none:0 +msgid "Printer" +msgstr "Printer" + +#: none:0 +msgid "Host" +msgstr "Host" + +#: none:0 +msgid "Comment" +msgstr "Comment" + +#: none:0 +msgid "Print to file:" +msgstr "Print to file:" + +#: none:0 +msgid "Browse..." +msgstr "Browse..." + +#: none:0 +msgid "Options" +msgstr "Options" + +#: none:0 +msgid "Print all" +msgstr "Print all" + +#: none:0 +msgid "Print range" +msgstr "Print range" + +#: none:0 +msgid "From page:" +msgstr "From page:" + +#: none:0 +msgid "To page:" +msgstr "To page:" + +#: none:0 +msgid "Print first page first" +msgstr "Print first page first" + +#: none:0 +msgid "Print last page first" +msgstr "Print last page first" + +#: none:0 +msgid "Number of copies:" +msgstr "Number of copies:"" + +#: none:0 +msgid "Paper format" +msgstr "Paper format" + +#: none:0 +msgid "Portrait" +msgstr "Portrait" + +#: none:0 +msgid "Landscape" +msgstr "Landscape" + +#: none:0 +msgid "A0 (841 x 1189 mm)" +msgstr "A0 (841 x 1189 mm)" + +#: none:0 +msgid "A1 (594 x 841 mm)" +msgstr "A1 (594 x 841 mm)" + +#: none:0 +msgid "A2 (420 x 594 mm)" +msgstr "A2 (420 x 594 mm)" + +#: none:0 +msgid "A3 (297 x 420 mm)" +msgstr "A3 (297 x 420 mm)" + +#: none:0 +msgid "A4 (210x297 mm, 8.26x11.7 inches)" +msgstr "A4 (210x297 mm, 8.26x11.7 inches)" + +#: none:0 +msgid "A5 (148 x 210 mm)" +msgstr "A5 (148 x 210 mm)" + +#: none:0 +msgid "A6 (105 x 148 mm)" +msgstr "A6 (105 x 148 mm)" + +#: none:0 +msgid "A7 (74 x 105 mm)" +msgstr "A7 (74 x 105 mm)" + +#: none:0 +msgid "A8 (52 x 74 mm)" +msgstr "A8 (52 x 74 mm)" + +#: none:0 +msgid "A9 (37 x 52 mm)" +msgstr "A9 (37 x 52 mm)" + +#: none:0 +msgid "B0 (1030 x 1456 mm)" +msgstr "B0 (1030 x 1456 mm)" + +#: none:0 +msgid "B1 (728 x 1030 mm)" +msgstr "B1 (728 x 1030 mm)" + +#: none:0 +msgid "B10 (32 x 45 mm)" +msgstr "B10 (32 x 45 mm)" + +#: none:0 +msgid "B2 (515 x 728 mm)" +msgstr "B2 (515 x 728 mm)" + +#: none:0 +msgid "B3 (364 x 515 mm)" +msgstr "B3 (364 x 515 mm)" + +#: none:0 +msgid "B4 (257 x 364 mm)" +msgstr "B4 (257 x 364 mm)" + +#: none:0 +msgid "B5 (182x257 mm, 7.17x10.13 inches)" +msgstr "B5 (182x257 mm, 7.17x10.13 inches)" + +#: none:0 +msgid "B6 (128 x 182 mm)" +msgstr "B6 (128 x 182 mm)" + +#: none:0 +msgid "B7 (91 x 128 mm)" +msgstr "B7 (91 x 128 mm)" + +#: none:0 +msgid "B8 (64 x 91 mm)" +msgstr "B8 (64 x 91 mm)" + +#: none:0 +msgid "B9 (45 x 64 mm)" +msgstr "B9 (45 x 64 mm)" + +#: none:0 +msgid "C5E (163 x 229 mm)" +msgstr "C5E (163 x 229 mm)" + +#: none:0 +msgid "DLE (110 x 220 mm)" +msgstr "DLE (110 x 220 mm)" + +#: none:0 +msgid "Executive (7.5x10 inches, 191x254 mm)" +msgstr "Executive (7.5x10 inches, 191x254 mm)" + +#: none:0 +msgid "Folio (210 x 330 mm)" +msgstr "Folio (210 x 330 mm)" + +#: none:0 +msgid "Ledger (432 x 279 mm)" +msgstr "Ledger (432 x 279 mm)" + +#: none:0 +msgid "Legal (8.5x14 inches, 216x356 mm)" +msgstr "Legal (8.5x14 inches, 216x356 mm)" + +#: none:0 +msgid "Letter (8.5x11 inches, 216x279 mm)" +msgstr "Letter (8.5x11 inches, 216x279 mm)" + +#: none:0 +msgid "Tabloid (279 x 432 mm)" +msgstr "Tabloid (279 x 432 mm)" + +#: none:0 +msgid "US Common #10 Envelope (105 x 241 mm)" +msgstr "US Common #10 Envelope (105 x 241 mm)" + +#: none:0 +msgid "Setup Printer" +msgstr "Setup Printer" + +#: none:0 +msgid "Postscript files (*.ps);;All files (*)" +msgstr "Postscript files (*.ps);;All files (*)" + +#: none:0 +msgid "Hu&e:" +msgstr "Hu&e:" + +#: none:0 +msgid "&Sat:" +msgstr "&Sat:" + +#: none:0 +msgid "&Val:" +msgstr "&Val:" + +#: none:0 +msgid "&Red:" +msgstr "&Red:" + +#: none:0 +msgid "&Green:" +msgstr "&Green:" + +#: none:0 +msgid "Bl&ue:" +msgstr "Bl&ue:" + +#: none:0 +msgid "A&lpha channel:" +msgstr "A&lpha channel:" + +#: none:0 +msgid "&Basic colors" +msgstr "&Basic colors" + +#: none:0 +msgid "&Custom colors" +msgstr "&Custom colors" + +#: none:0 +msgid "&Define Custom Colors >>" +msgstr "&Define Custom Colors >>" + +#: none:0 +msgid "&Add To Custom Colors" +msgstr "&Add To Custom Colors" + +#: none:0 +msgid "Select color" +msgstr "Select color" + +#: none:0 +msgid "Copy or Move a File" +msgstr "Copy or Move a File" + +#: none:0 +msgid "Read: %1" +msgstr "Read: %1" + +#: none:0 +msgid "Write: %1" +msgstr "Write: %1" + +#: none:0 +msgid "&Cancel" +msgstr "&Cancel" + +#: none:0 +msgid "All files (*)" +msgstr "All files (*)" + +#: none:0 +msgid "Name" +msgstr "Name" + +#: none:0 +msgid "Size" +msgstr "Size" + +#: none:0 +msgid "Type" +msgstr "Type" + +#: none:0 +msgid "Date" +msgstr "Date" + +#: none:0 +msgid "Attributes" +msgstr "Attributes" + +#: none:0 +msgid "Look &in:" +msgstr "Look &in:" + +#: none:0 +msgid "File &name:" +msgstr "File &name:" + +#: none:0 +msgid "File &type:" +msgstr "File &type:" + +#: none:0 +msgid "Back" +msgstr "Back" + +#: none:0 +msgid "One directory up" +msgstr "One directory up" + +#: none:0 +msgid "Create New Folder" +msgstr "Create New Folder" + +#: none:0 +msgid "List View" +msgstr "List View" + +#: none:0 +msgid "Detail View" +msgstr "Detail View" + +#: none:0 +msgid "Preview File Info" +msgstr "Preview File Info" + +#: none:0 +msgid "Preview File Contents" +msgstr "Preview File Contents" + +#: none:0 +msgid "Read-write" +msgstr "Read-write" + +#: none:0 +msgid "Read-only" +msgstr "Read-only" + +#: none:0 +msgid "Write-only" +msgstr "Write-only" + +#: none:0 +msgid "Inaccessible" +msgstr "Inaccessible" + +#: none:0 +msgid "Symlink to File" +msgstr "Symlink to File" + +#: none:0 +msgid "Symlink to Directory" +msgstr "Symlink to Directory" + +#: none:0 +msgid "Symlink to Special" +msgstr "Symlink to Special" + +#: none:0 +msgid "File" +msgstr "File" + +#: none:0 +msgid "Dir" +msgstr "Dir" + +#: none:0 +msgid "Special" +msgstr "Special" + +#: none:0 +msgid "Save as" +msgstr "Save as" + +#: none:0 +msgid "&Open" +msgstr "&Open" + +#: none:0 +msgid "&Save" +msgstr "&Save" + +#: none:0 +msgid "&Rename" +msgstr "&Rename" + +#: none:0 +msgid "&Delete" +msgstr "&Delete" + +#: none:0 +msgid "R&eload" +msgstr "R&eload" + +#: none:0 +msgid "Sort by &Name" +msgstr "Sort by &Name" + +#: none:0 +msgid "Sort by &Size" +msgstr "Sort by &Size" + +#: none:0 +msgid "Sort by &Date" +msgstr "Sort by &Date" + +#: none:0 +msgid "&Unsorted" +msgstr "&Unsorted" + +#: none:0 +msgid "Sort" +msgstr "Sort" + +#: none:0 +msgid "Show &hidden files" +msgstr "Show &hidden files" + +#: none:0 +msgid "the file" +msgstr "the file" + +#: none:0 +msgid "the directory" +msgstr "the directory" + +#: none:0 +msgid "the symlink" +msgstr "the symlink" + +#: none:0 +msgid "Delete %1" +msgstr "Delete %1" + +#: none:0 +msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>" +msgstr "<qt>Do you really want to delete %1 \"%2\"?</qt>" + +#: none:0 +msgid "&Yes" +msgstr "&Yes" + +#: none:0 +msgid "&No" +msgstr "&No" + +#: none:0 +msgid "New Folder 1" +msgstr "New Folder 1" + +#: none:0 +msgid "New Folder" +msgstr "New Folder" + +#: none:0 +msgid "New Folder %1" +msgstr "New Folder %1" + +#: none:0 +msgid "Find Directory" +msgstr "Find Directory" + +#: none:0 +msgid "Directories" +msgstr "Directories" + +#: none:0 +msgid "Error" +msgstr "Error" + +#: none:0 +msgid "" +"%1\n" +"File not found.\n" +"Check path and filename." +msgstr "" +"%1\n" +"File not found.\n" +"Check path and filename." + +#: none:0 +msgid "ERROR" +msgstr "ERROR" + +#: none:0 +msgid "&Font" +msgstr "&Font" + +#: none:0 +msgid "Font st&yle" +msgstr "Font st&yle" + +#: none:0 +msgid "&Size" +msgstr "&Size" + +#: none:0 +msgid "Effects" +msgstr "Effects" + +#: none:0 +msgid "Stri&keout" +msgstr "Stri&keout" + +#: none:0 +msgid "&Color" +msgstr "&Color" + +#: none:0 +msgid "Sample" +msgstr "Sample" + +#: none:0 +msgid "Scr&ipt" +msgstr "Scr&ipt" + +#: none:0 +msgid "Apply" +msgstr "Apply" + +#: none:0 +#: none:0 +msgid "Close" +msgstr "Close" + +#: none:0 +msgid "Select Font" +msgstr "Select Font" + +#: none:0 +msgid "&OK" +msgstr "&OK" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"OK" +msgstr "OK" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Yes" +msgstr "Yes" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"No" +msgstr "No" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Abort" +msgstr "Abort" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Retry" +msgstr "Retry" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Ignore" +msgstr "Ignore" + +#: none:0 +msgid "" +"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI " +"toolkit from Trolltech. Qt provides single-source portability across Windows " +"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11" +".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>" +msgstr "" +"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI " +"toolkit from Trolltech. Qt provides single-source portability across Windows " +"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11" +".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>" + +#: none:0 +msgid "Minimize" +msgstr "Minimize" + +#: none:0 +msgid "Maximize" +msgstr "Maximize" diff --git a/examples/demo/i18n/en.qm b/examples/demo/i18n/en.qm Binary files differnew file mode 100644 index 000000000..eccc5fda6 --- /dev/null +++ b/examples/demo/i18n/en.qm diff --git a/examples/demo/i18n/i18n.cpp b/examples/demo/i18n/i18n.cpp new file mode 100644 index 000000000..a66c21670 --- /dev/null +++ b/examples/demo/i18n/i18n.cpp @@ -0,0 +1,253 @@ +#include "i18n.h" +#include "wrapper.h" +#include "../textdrawing/textedit.h" + +#include <qaction.h> +#include <qlayout.h> +#include <qvbox.h> +#include <qworkspace.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qpixmap.h> +#include <qiconset.h> +#include <qapplication.h> +#include <qwidgetlist.h> +#include <qlabel.h> +#include <qtextedit.h> + + +static int windowIdNumber = 5000; +static bool firstShow = TRUE; + + +I18nDemo::I18nDemo(TQWidget *parent, const char *name) + : TQMainWindow(parent, name, 0), lastwrapper(0) +{ + initActions(); + initMenuBar(); + + TQVBox *box = new TQVBox(this); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setMargin( 1 ); + box->setLineWidth( 1 ); + + workspace = new TQWorkspace(box); + connect(workspace, SIGNAL(windowActivated(TQWidget *)), + SLOT(windowActivated(TQWidget *))); + workspace->setBackgroundMode(PaletteMid); + + setCentralWidget(box); +} + + +I18nDemo::~I18nDemo() +{ +} + + +void I18nDemo::initActions() +{ + actionClose = new TQAction(tr("Close the current window."), + tr("Close"), + CTRL + Key_F4, + this); + connect(actionClose, SIGNAL(activated()), SLOT(closeSlot())); + + actionCloseAll = new TQAction(tr("Close all opened windows."), + tr("Close All"), + 0, + this); + connect(actionCloseAll, SIGNAL(activated()), SLOT(closeAllSlot())); + + actionTile = new TQAction(tr("Tile opened windows."), + tr("Tile"), + 0, + this); + connect(actionTile, SIGNAL(activated()), SLOT(tileSlot())); + + actionCascade = new TQAction(tr("Cascade opened windows."), + tr("Cascade"), + 0, + this); + connect(actionCascade, SIGNAL(activated()), SLOT(cascadeSlot())); +} + + +void I18nDemo::initMenuBar() +{ + newMenu = new TQPopupMenu(this); + connect(newMenu, SIGNAL(activated(int)), SLOT(newSlot(int))); + + newMenu->insertItem("&English", 0); + newMenu->insertItem("&Japanese", 1); + newMenu->insertItem("&Korean", 2); + newMenu->insertItem("&Norwegian", 3); + + windowMenu = new TQPopupMenu(this); + connect(windowMenu, SIGNAL(activated(int)), SLOT(windowSlot(int))); + + windowMenu->setCheckable(TRUE); + + actionClose->addTo(windowMenu); + actionCloseAll->addTo(windowMenu); + windowMenu->insertSeparator(); + actionTile->addTo(windowMenu); + actionCascade->addTo(windowMenu); + windowMenu->insertSeparator(); + + menuBar()->insertItem(tr("&New"), newMenu); + menuBar()->insertItem(tr("&Window"), windowMenu); +} + + +void I18nDemo::newSlot(int id) +{ + TQString qmfile; + switch (id) { + default: + case 0: qmfile = "i18n/en.qm"; break; + case 1: qmfile = "i18n/ja.qm"; break; + case 2: qmfile = "i18n/ko.qm"; break; + case 3: qmfile = "i18n/no.qm"; break; + } + + if (lastwrapper) { + qApp->removeTranslator(&lastwrapper->translator); + lastwrapper = 0; + } + + Wrapper *wrapper = new Wrapper(workspace, windowIdNumber); + wrapper->translator.load(qmfile, "."); + + qApp->installTranslator(&wrapper->translator); + + connect(wrapper, SIGNAL(destroyed()), SLOT(wrapperDead())); + wrapper->setCaption(tr("--language--")); + + TextEdit *te = new TextEdit(wrapper); + te->layout()->setResizeMode( TQLayout::FreeResize ); + te->setMinimumSize(500, 400); + te->fileNew(); + te->currentEditor()-> + setText(tr("<h3>About TQt</h3>" + "<p>This program uses TQt version %1, a multiplatform C++ " + "GUI toolkit from Trolltech. TQt provides single-source " + "portability across Windows 95/98/NT/2000, Mac OS X, Linux, Solaris, " + "HP-UX and many other versions of Unix with X11.</p>" + "<p>See <tt>http://www.trolltech.com/qt/</tt> for more " + "information.</p>").arg(QT_VERSION_STR)); + + qApp->removeTranslator(&wrapper->translator); + + te->show(); + wrapper->show(); + + windowMenu->insertItem(wrapper->caption(), wrapper->id); + windowMenu->setItemChecked(wrapper->id, TRUE); + lastwrapper = wrapper; + + windowIdNumber++; +} + + +void I18nDemo::windowSlot(int id) +{ + if (id < 5000) + return; + + TQWidgetList list = workspace->windowList(); + Wrapper *wrapper = (Wrapper *) list.first(); + while (wrapper) { + if (wrapper->id == id) { + wrapper->setFocus(); + break; + } + + wrapper = (Wrapper *) list.next(); + } +} + + +void I18nDemo::windowActivated(TQWidget *w) +{ + if (lastwrapper) { + qApp->removeTranslator(&lastwrapper->translator); + windowMenu->setItemChecked(lastwrapper->id, FALSE); + } + + if (! w) { + lastwrapper = 0; + return; + } + + Wrapper *wrapper = (Wrapper *) w; + + windowMenu->setItemChecked(wrapper->id, TRUE); + lastwrapper = wrapper; +} + + +void I18nDemo::closeSlot() +{ + TQWidget *w = workspace->activeWindow(); + delete w; +} + + +void I18nDemo::closeAllSlot() +{ + TQWidget *w; + while ((w = workspace->activeWindow())) + w->close(TRUE); +} + + +void I18nDemo::tileSlot() +{ + workspace->tile(); +} + + +void I18nDemo::cascadeSlot() +{ + workspace->cascade(); +} + + +void I18nDemo::wrapperDead() +{ + Wrapper *w = (Wrapper *) sender(); + + if (w == lastwrapper) { + qApp->removeTranslator(&w->translator); + lastwrapper = 0; + } + + windowMenu->removeItem(w->id); +} + + +void I18nDemo::showEvent(TQShowEvent *) +{ + if (firstShow) { + newSlot(1); + firstShow = FALSE; + return; + } + + if (! lastwrapper) + return; + + qApp->installTranslator(&lastwrapper->translator); +} + + +void I18nDemo::hideEvent(TQHideEvent *) +{ + if (! lastwrapper) + return; + + qApp->removeTranslator(&lastwrapper->translator); +} diff --git a/examples/demo/i18n/i18n.h b/examples/demo/i18n/i18n.h new file mode 100644 index 000000000..850e48c39 --- /dev/null +++ b/examples/demo/i18n/i18n.h @@ -0,0 +1,44 @@ +#ifndef I18N_H +#define I18N_H + +#include <qmainwindow.h> + +class TQWorkspace; +class TQAction; +class TQPopupMenu; +class Wrapper; + + +class I18nDemo : public TQMainWindow +{ + Q_OBJECT + +public: + I18nDemo(TQWidget *, const char * = 0); + ~I18nDemo(); + + void initActions(); + void initMenuBar(); + + void showEvent(TQShowEvent *); + void hideEvent(TQHideEvent *); + + TQWorkspace *workspace; + TQAction *actionClose, *actionCloseAll, *actionTile, *actionCascade; + TQPopupMenu *windowMenu, *newMenu; + Wrapper *lastwrapper; + + +public slots: + void newSlot(int); + void windowSlot(int); + void windowActivated(TQWidget *); + void closeSlot(); + void closeAllSlot(); + void tileSlot(); + void cascadeSlot(); + void wrapperDead(); +}; + + +#endif // I18N_H diff --git a/examples/demo/i18n/ja.po b/examples/demo/i18n/ja.po new file mode 100644 index 000000000..c61d2139b --- /dev/null +++ b/examples/demo/i18n/ja.po @@ -0,0 +1,847 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: none:0 +msgid "--language--" +msgstr "日本語" + +#: none:0 +msgid "&File" +msgstr "ファイル (&F)" + +#: none:0 +msgid "New" +msgstr "æ–°è¦" + +#: none:0 +msgid "&New..." +msgstr "æ–°è¦(&N)..." + +#: none:0 +msgid "Open" +msgstr "é–‹ã" + +#: none:0 +msgid "&Open..." +msgstr "é–‹ã(&O)..." + +#: none:0 +msgid "Save As" +msgstr "åå‰ã‚’付ã‘ã¦ä¿å˜" + +#: none:0 +msgid "Save &As..." +msgstr "åå‰ã‚’付ã‘ã¦ä¿å˜(&A)..." + +#: none:0 +msgid "Save" +msgstr "ä¿å˜" + +#: none:0 +msgid "&Save..." +msgstr "ä¿å˜(&S)..." + +#: none:0 +msgid "Print" +msgstr "å°åˆ·" + +#: none:0 +msgid "&Print..." +msgstr "å°åˆ·(&P)..." + +#: none:0 +msgid "&Close" +msgstr "é–‰ã˜ã‚‹(&C)" + +#: none:0 +msgid "&Edit" +msgstr "編集(&E)" + +#: none:0 +msgid "&Undo" +msgstr "å…ƒã«æˆ»ã™(&U)" + +#: none:0 +msgid "Undo" +msgstr "å…ƒã«æˆ»ã™" + +#: none:0 +msgid "&Redo" +msgstr "やり直ã—(&R)" + +#: none:0 +msgid "Redo" +msgstr "やり直ã—" + +#: none:0 +msgid "Cut" +msgstr "切りå–り" + +#: none:0 +msgid "&Cut" +msgstr "切りå–り(&C)" + +#: none:0 +msgid "C&opy" +msgstr "コピー(&O)" + +#: none:0 +msgid "Copy" +msgstr "コピー" + +#: none:0 +msgid "Paste" +msgstr "貼り付ã‘" + +#: none:0 +msgid "&Paste" +msgstr "貼り付ã‘(&P)" + +#: none:0 +msgid "Clear" +msgstr "クリア" + +#: none:0 +msgid "Select All" +msgstr "å…¨ã¦é¸æŠž" + +#: none:0 +msgid "Line up" +msgstr "ツールãƒãƒ¼ã‚’ラインアップ" + +#: none:0 +msgid "For&mat" +msgstr "フォーマット(&M)" + +#: none:0 +msgid "Bold" +msgstr "ボールド" + +#: none:0 +msgid "&Bold" +msgstr "ボールド(&B)" + +#: none:0 +msgid "Italic" +msgstr "イタリック" + +#: none:0 +msgid "&Italic" +msgstr "イタリック(&I)" + +#: none:0 +msgid "Underline" +msgstr "下線" + +#: none:0 +msgid "&Underline" +msgstr "下線(&U)" + +#: none:0 +msgid "Left" +msgstr "å·¦" + +#: none:0 +msgid "&Left" +msgstr "å·¦(&L)" + +#: none:0 +msgid "Center" +msgstr "ä¸å¤®" + +#: none:0 +msgid "C&enter" +msgstr "ä¸å¤®(&E)" + +#: none:0 +msgid "Right" +msgstr "å³" + +#: none:0 +msgid "&Right" +msgstr "å³(&R)" + +#: none:0 +msgid "Justify" +msgstr "ブãƒãƒƒã‚¯æƒãˆ" + +#: none:0 +msgid "&Justify" +msgstr "ブãƒãƒƒã‚¯æƒãˆ(&J)" + +#: none:0 +msgid "Color" +msgstr "色" + +#: none:0 +msgid "&Color..." +msgstr "色(&C)..." + +#: none:0 +msgid "Standard" +msgstr "普通" + +#: none:0 +msgid "Bullet List (Disc)" +msgstr "ビュレットリスト (円 塗りã¤ã¶ã—)" + +#: none:0 +msgid "Bullet List (Circle)" +msgstr "ビュレットリスト (円)" + +#: none:0 +msgid "Bullet List (Square)" +msgstr "ビュレットリスト (æ£æ–¹å½¢)" + +#: none:0 +msgid "Ordered List (Decimal)" +msgstr "列挙リスト (10進法)" + +#: none:0 +msgid "Ordered List (Alpha lower)" +msgstr "列挙リスト (å°æ–‡å—ã«)" + +#: none:0 +msgid "Ordered List (Alpha upper)" +msgstr "列挙リスト (大文å—ã«)" + +#: none:0 +msgid "OK" +msgstr "ã¯ã„" + +#: none:0 +msgid "Cancel" +msgstr "ã‚ャンセル" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"locally connected" +msgstr "ãƒãƒ¼ã‚«ãƒ«ã«æŽ¥ç¶šä¸" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Aliases: " +msgstr "エイリアス" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"unknown" +msgstr "未知" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Unknown Location" +msgstr "未知ã®å ´æ‰€" + +#: none:0 +msgid "Printer settings" +msgstr "プリンターã®è¨å®š" + +#: none:0 +msgid "Print in color if available" +msgstr "å¯èƒ½ãªã‚‰ã‚«ãƒ©ãƒ¼ã§å°åˆ·" + +#: none:0 +msgid "Print in grayscale" +msgstr "白黒ã§å°åˆ·" + +#: none:0 +msgid "Print destination" +msgstr "å°åˆ·å¯¾è±¡" + +#: none:0 +msgid "Print to printer:" +msgstr "å°åˆ·ã™ã‚‹ãƒ—リンタ:" + +#: none:0 +msgid "Printer" +msgstr "プリンタ" + +#: none:0 +msgid "Host" +msgstr "ホスト" + +#: none:0 +msgid "Comment" +msgstr "コメント" + +#: none:0 +msgid "Print to file:" +msgstr "ファイルã«å‡ºåŠ›:" + +#: none:0 +msgid "Browse..." +msgstr "ブラウズ..." + +#: none:0 +msgid "Options" +msgstr "オプション" + +#: none:0 +msgid "Print all" +msgstr "å…¨ã¦å°åˆ·" + +#: none:0 +msgid "Print range" +msgstr "å°åˆ·ç¯„囲" + +#: none:0 +msgid "From page:" +msgstr "開始ページ:" + +#: none:0 +msgid "To page:" +msgstr "終了ページ:" + +#: none:0 +msgid "Print first page first" +msgstr "最åˆã®ãƒšãƒ¼ã‚¸ã‹ã‚‰å°åˆ·" + +#: none:0 +msgid "Print last page first" +msgstr "最後ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰å°åˆ·" + +#: none:0 +msgid "Number of copies:" +msgstr "ã‚³ãƒ”ãƒ¼ã®æ•°:" + +#: none:0 +msgid "Paper format" +msgstr "ページャフォーマット" + +#: none:0 +msgid "Portrait" +msgstr "縦長" + +#: none:0 +msgid "Landscape" +msgstr "横長" + +#: none:0 +msgid "A0 (841 x 1189 mm)" +msgstr "A0 (841 x 1189 mm)" + +#: none:0 +msgid "A1 (594 x 841 mm)" +msgstr "A1 (594 x 841 mm)" + +#: none:0 +msgid "A2 (420 x 594 mm)" +msgstr "A2 (420 x 594 mm)" + +#: none:0 +msgid "A3 (297 x 420 mm)" +msgstr "A3 (297 x 420 mm)" + +#: none:0 +msgid "A4 (210x297 mm, 8.26x11.7 inches)" +msgstr "A4 (210x297 mm, 8.26x11.7 inch)" + +#: none:0 +msgid "A5 (148 x 210 mm)" +msgstr "A5 (148 x 210 mm)" + +#: none:0 +msgid "A6 (105 x 148 mm)" +msgstr "A6 (105 x 148 mm)" + +#: none:0 +msgid "A7 (74 x 105 mm)" +msgstr "A7 (74 x 105 mm)" + +#: none:0 +msgid "A8 (52 x 74 mm)" +msgstr "A8 (52 x 74 mm)" + +#: none:0 +msgid "A9 (37 x 52 mm)" +msgstr "A9 (37 x 52 mm)" + +#: none:0 +msgid "B0 (1030 x 1456 mm)" +msgstr "B0 (1030 x 1456 mm" + +#: none:0 +msgid "B1 (728 x 1030 mm)" +msgstr "B1 (728 x 1030 mm)" + +#: none:0 +msgid "B10 (32 x 45 mm)" +msgstr "B10 (32 x 45 mm)" + +#: none:0 +msgid "B2 (515 x 728 mm)" +msgstr "B2 (515 x 728 mm)" + +#: none:0 +msgid "B3 (364 x 515 mm)" +msgstr "B3 (364 x 515 mm)" + +#: none:0 +msgid "B4 (257 x 364 mm)" +msgstr "B4 (257 x 364 mm)" + +#: none:0 +msgid "B5 (182x257 mm, 7.17x10.13 inches)" +msgstr "B5 (182x257 mm, 7.17x10.13 inch)" + +#: none:0 +msgid "B6 (128 x 182 mm)" +msgstr "B6 (128 x 182 mm)" + +#: none:0 +msgid "B7 (91 x 128 mm)" +msgstr "B7 (91 x 128 mm)" + +#: none:0 +msgid "B8 (64 x 91 mm)" +msgstr "B8 (64 x 91 mm)" + +#: none:0 +msgid "B9 (45 x 64 mm)" +msgstr "B9 (45 x 64 mm)" + +#: none:0 +msgid "C5E (163 x 229 mm)" +msgstr "C5E (163 x 229 mm)" + +#: none:0 +msgid "DLE (110 x 220 mm)" +msgstr "DLE (110 x 220 mm)" + +#: none:0 +msgid "Executive (7.5x10 inches, 191x254 mm)" +msgstr "Executive (7.5x10 inch, 191x254 mm)" + +#: none:0 +msgid "Folio (210 x 330 mm)" +msgstr "Folio (210 x 330 mm)" + +#: none:0 +msgid "Ledger (432 x 279 mm)" +msgstr "Ledger (432 x 279 mm)" + +#: none:0 +msgid "Legal (8.5x14 inches, 216x356 mm)" +msgstr "Legal (8.5x14 inch, 216x356 mm)" + +#: none:0 +msgid "Letter (8.5x11 inches, 216x279 mm)" +msgstr "Letter (8.5x11 inch, 216x279 mm)" + +#: none:0 +msgid "Tabloid (279 x 432 mm)" +msgstr "タブãƒã‚¤ãƒ‰ (279 x 432 mm)" + +#: none:0 +msgid "US Common #10 Envelope (105 x 241 mm)" +msgstr "US 一般 #10 å°ç’ (105 x 241 mm)" + +#: none:0 +msgid "Setup Printer" +msgstr "プリンタã®è¨å®š" + +#: none:0 +msgid "Postscript files (*.ps);;All files (*)" +msgstr "Postscript files (*.ps);;All files (*)" + +#: none:0 +msgid "Hu&e:" +msgstr "色調(&e):" + +#: none:0 +msgid "&Sat:" +msgstr "彩度(&S):" + +#: none:0 +msgid "&Val:" +msgstr "値(&V):" + +#: none:0 +msgid "&Red:" +msgstr "赤(&R):" + +#: none:0 +msgid "&Green:" +msgstr "ç·‘(&G):" + +#: none:0 +msgid "Bl&ue:" +msgstr "é’(&u):" + +#: none:0 +msgid "A&lpha channel:" +msgstr "アルファãƒãƒ£ãƒ³ãƒãƒ«(&l):" + +#: none:0 +msgid "&Basic colors" +msgstr "基本色(&B)" + +#: none:0 +msgid "&Custom colors" +msgstr "カスタム色(&C)" + +#: none:0 +msgid "&Define Custom Colors >>" +msgstr "カスタム色を定義(&D) >>" + +#: none:0 +msgid "&Add To Custom Colors" +msgstr "カスタム色ã«è¿½åŠ (&A)" + +#: none:0 +msgid "Select color" +msgstr "è‰²ã‚’é¸æŠž" + +#: none:0 +msgid "Copy or Move a File" +msgstr "ファイルをコピーã€ç§»å‹•" + +#: none:0 +#, c-format +msgid "Read: %1" +msgstr "èªã¿è¾¼ã¿: %1" + +#: none:0 +#, c-format +msgid "Write: %1" +msgstr "書ãè¾¼ã¿: %1" + +#: none:0 +msgid "&Cancel" +msgstr "ã‚ャンセル(&C)" + +#: none:0 +msgid "All files (*)" +msgstr "å…¨ã¦ã®ãƒ•ァイル (*)" + +#: none:0 +msgid "Name" +msgstr "åå‰" + +#: none:0 +msgid "Size" +msgstr "サイズ" + +#: none:0 +msgid "Type" +msgstr "タイプ" + +#: none:0 +msgid "Date" +msgstr "日付" + +#: none:0 +msgid "Attributes" +msgstr "属性" + +#: none:0 +msgid "Look &in:" +msgstr "Look &in:" + +#: none:0 +msgid "File &name:" +msgstr "ファイルå(&n):" + +#: none:0 +msgid "File &type:" +msgstr "ファイルタイプ(&t):" + +#: none:0 +msgid "Back" +msgstr "戻る" + +#: none:0 +msgid "One directory up" +msgstr "ディレクトリを一ã¤ä¸Šã«" + +#: none:0 +msgid "Create New Folder" +msgstr "æ–°ã—ã„フォルダを作æˆ" + +#: none:0 +msgid "List View" +msgstr "リストビュー" + +#: none:0 +msgid "Detail View" +msgstr "詳細ãªãƒ“ュー" + +#: none:0 +msgid "Preview File Info" +msgstr "ãƒ•ã‚¡ã‚¤ãƒ«æƒ…å ±ã‚’ãƒ—ãƒ¬ãƒ“ãƒ¥ãƒ¼" + +#: none:0 +msgid "Preview File Contents" +msgstr "ファイルã®ä¸èº«ã‚’プレビュー" + +#: none:0 +msgid "Read-write" +msgstr "èªã¿è¾¼ã¿ 書ãè¾¼ã¿" + +#: none:0 +msgid "Read-only" +msgstr "èªã¿è¾¼ã¿ã®ã¿" + +#: none:0 +msgid "Write-only" +msgstr "書ãè¾¼ã¿ã®ã¿" + +#: none:0 +msgid "Inaccessible" +msgstr "アクセスä¸å¯" + +#: none:0 +msgid "Symlink to File" +msgstr "ファイルã«ã‚·ãƒ リンク" + +#: none:0 +msgid "Symlink to Directory" +msgstr "ディレクトリã«ã‚·ãƒ リンク" + +#: none:0 +msgid "Symlink to Special" +msgstr "特殊ã«ã‚·ãƒ リンク" + +#: none:0 +msgid "File" +msgstr "ファイル" + +#: none:0 +msgid "Dir" +msgstr "ディレクトリ" + +#: none:0 +msgid "Special" +msgstr "特殊" + +#: none:0 +msgid "Save as" +msgstr "åå‰ã‚’付ã‘ã¦ä¿å˜" + +#: none:0 +msgid "&Open" +msgstr "é–‹ã(&O)" + +#: none:0 +msgid "&Save" +msgstr "ä¿å˜(&S)" + +#: none:0 +msgid "&Rename" +msgstr "åå‰å¤‰æ›´(&R)" + +#: none:0 +msgid "&Delete" +msgstr "削除(&D)" + +#: none:0 +msgid "R&eload" +msgstr "å†èªã¿è¾¼ã¿(&e)" + +#: none:0 +msgid "Sort by &Name" +msgstr "åå‰ã§ã‚½ãƒ¼ãƒˆ(&N)" + +#: none:0 +msgid "Sort by &Size" +msgstr "サイズã§ã‚½ãƒ¼ãƒˆ(&S)" + +#: none:0 +msgid "Sort by &Date" +msgstr "日付ã§ã‚½ãƒ¼ãƒˆ(&D)" + +#: none:0 +msgid "&Unsorted" +msgstr "ソートãªã—(&U)" + +#: none:0 +msgid "Sort" +msgstr "ソート" + +#: none:0 +msgid "Show &hidden files" +msgstr "éš ã—ファイルを表示(&h)" + +#: none:0 +msgid "the file" +msgstr "ファイル" + +#: none:0 +msgid "the directory" +msgstr "ディレクトリ" + +#: none:0 +msgid "the symlink" +msgstr "シムリンク" + +#: none:0 +#, c-format +msgid "Delete %1" +msgstr "%1 を削除" + +#: none:0 +msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>" +msgstr "<qt>本当㫠%1 \"%2\" を削除ã—ã¾ã™ã‹?</qt>" + +#: none:0 +msgid "&Yes" +msgstr "ã¯ã„(&Y)" + +#: none:0 +msgid "&No" +msgstr "ã„ã„ãˆ(&N)" + +#: none:0 +msgid "New Folder 1" +msgstr "æ–°è¦ãƒ•ォルダ 1" + +#: none:0 +msgid "New Folder" +msgstr "æ–°è¦ãƒ•ォルダ" + +#: none:0 +#, c-format +msgid "New Folder %1" +msgstr "æ–°è¦ãƒ•ォルダ %1" + +#: none:0 +msgid "Find Directory" +msgstr "ディレクトリを検索" + +#: none:0 +msgid "Directories" +msgstr "ディレクトリ" + +#: none:0 +msgid "Error" +msgstr "エラー" + +#: none:0 +msgid "" +"%1\n" +"File not found.\n" +"Check path and filename." +msgstr "" +"%1\n" +"ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n" +"パスã¨ãƒ•ァイルåã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ä¸‹ã•ã„。" + +#: none:0 +msgid "ERROR" +msgstr "エラー" + +#: none:0 +msgid "&Font" +msgstr "フォント(&F)" + +#: none:0 +msgid "Font st&yle" +msgstr "フォントスタイル(&y)" + +#: none:0 +#: none:0 +msgid "&Size" +msgstr "サイズ(&S)" + +#: none:0 +msgid "Effects" +msgstr "効果" + +#: none:0 +msgid "Stri&keout" +msgstr "Stri&keout" + +#: none:0 +msgid "&Color" +msgstr "色(&C)" + +#: none:0 +msgid "Sample" +msgstr "例" + +#: none:0 +msgid "Scr&ipt" +msgstr "スクリプト(&i)" + +#: none:0 +msgid "Apply" +msgstr "é©ç”¨" + +#: none:0 +#: none:0 +msgid "Close" +msgstr "é–‰ã˜ã‚‹" + +#: none:0 +msgid "Select Font" +msgstr "ãƒ•ã‚©ãƒ³ãƒˆã‚’é¸æŠž" + +#: none:0 +msgid "&OK" +msgstr "ã¯ã„(&O)" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"OK" +msgstr "ã¯ã„" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Yes" +msgstr "ã¯ã„" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"No" +msgstr "ã„ã„ãˆ" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Abort" +msgstr "䏿¢" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Retry" +msgstr "å†è©¦è¡Œ" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Ignore" +msgstr "無視" + +#: none:0 +msgid "" +"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI " +"toolkit from Trolltech. Qt provides single-source portability across Windows " +"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11" +".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>" +msgstr "" +"<h3>Qt ã«ã¤ã„ã¦</h3><p>ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ 㯠Trolltech社ã®ãƒžãƒ«ãƒ" +"プラットフォームC++ GUI ツールã‚ットQt ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %1 ã‚’" +"使用ã—ã¦ã„ã¾ã™ã€‚Qt ã¯Windows 95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX " +"ä»–X11ã¨Unixã®å¤šãã®ç‰ˆã§ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰äº’æ›ã‚’実ç¾ã—ã¾ã™ã€‚<" +"/p><p>詳細ã¯<tt>http://www.trolltech.com/qt/</tt>ã‚’å‚ç…§ã—ã¦ãã ã•" +"ã„。</p>" + +#: none:0 +msgid "Minimize" +msgstr "最å°åŒ–" + +#: none:0 +msgid "Maximize" +msgstr "最大化" diff --git a/examples/demo/i18n/ja.qm b/examples/demo/i18n/ja.qm Binary files differnew file mode 100644 index 000000000..788888e33 --- /dev/null +++ b/examples/demo/i18n/ja.qm diff --git a/examples/demo/i18n/ko.po b/examples/demo/i18n/ko.po new file mode 100644 index 000000000..81a3ec7cd --- /dev/null +++ b/examples/demo/i18n/ko.po @@ -0,0 +1,847 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: none:0 +msgid "--language--" +msgstr "한êµì–´" + +#: none:0 +msgid "&File" +msgstr "íŒŒì¼ ì°¾ê¸° (&F)" + +#: none:0 +msgid "New" +msgstr "새" + +#: none:0 +msgid "&New..." +msgstr "새 (&N)..." + +#: none:0 +msgid "Open" +msgstr "열기" + +#: none:0 +msgid "&Open..." +msgstr "열기 (&O)..." + +#: none:0 +msgid "Save As" +msgstr "다른 ì´ë¦„으로 ì €ìž¥" + +#: none:0 +msgid "Save &As..." +msgstr "다른 ì´ë¦„으로 ì €ìž¥ (&A)..." + +#: none:0 +msgid "Save" +msgstr "ì €ìž¥" + +#: none:0 +msgid "&Save..." +msgstr "ì €ìž¥ (&S)..." + +#: none:0 +msgid "Print" +msgstr "ì¸ì‡„" + +#: none:0 +msgid "&Print..." +msgstr "ì¸ì‡„ (&P)..." + +#: none:0 +msgid "&Close" +msgstr "닫기 (&C)" + +#: none:0 +msgid "&Edit" +msgstr "편집 (&E)" + +#: none:0 +msgid "&Undo" +msgstr "실행취소 (&U)" + +#: none:0 +msgid "Undo" +msgstr "실행취소" + +#: none:0 +msgid "&Redo" +msgstr "다시 실행 (&R)" + +#: none:0 +msgid "Redo" +msgstr "다시 실행" + +#: none:0 +msgid "Cut" +msgstr "ìžë¥´ê¸°" + +#: none:0 +msgid "&Cut" +msgstr "ìžë¥´ê¸° (&C)" + +#: none:0 +msgid "C&opy" +msgstr "복사 (&O)" + +#: none:0 +msgid "Copy" +msgstr "복사" + +#: none:0 +msgid "Paste" +msgstr "붙여넣기" + +#: none:0 +msgid "&Paste" +msgstr "붙여넣기 (&P)" + +#: none:0 +msgid "Clear" +msgstr "지움" + +#: none:0 +msgid "Select All" +msgstr "ëª¨ë‘ ê³ ë¥´ê¸°" + +#: none:0 +msgid "Line up" +msgstr "ë„구줄 올리기" + +#: none:0 +msgid "For&mat" +msgstr "í˜•ì‹ (&M)" + +#: none:0 +msgid "Bold" +msgstr "볼드" + +#: none:0 +msgid "&Bold" +msgstr "볼드 (&B)" + +#: none:0 +msgid "Italic" +msgstr "ì´íƒ¤ë¦" + +#: none:0 +msgid "&Italic" +msgstr "ì´íƒ¤ë¦ (&I)" + +#: none:0 +msgid "Underline" +msgstr "밑줄" + +#: none:0 +msgid "&Underline" +msgstr "밑줄 (&U)" + +#: none:0 +msgid "Left" +msgstr "왼쪽" + +#: none:0 +msgid "&Left" +msgstr "왼쪽 (&L)" + +#: none:0 +msgid "Center" +msgstr "중앙" + +#: none:0 +msgid "C&enter" +msgstr "중앙 (&E)" + +#: none:0 +msgid "Right" +msgstr "오른쪽" + +#: none:0 +msgid "&Right" +msgstr "오른쪽 (&R)" + +#: none:0 +msgid "Justify" +msgstr "ì°½ ë„ˆë¹„ì— ë§žì¶¤" + +#: none:0 +msgid "&Justify" +msgstr "ì°½ ë„ˆë¹„ì— ë§žì¶¤ (&J)" + +#: none:0 +msgid "Color" +msgstr "색ìƒ" + +#: none:0 +msgid "&Color..." +msgstr "ìƒ‰ìƒ (&C)..." + +#: none:0 +msgid "Standard" +msgstr "Standard" + +#: none:0 +msgid "Bullet List (Disc)" +msgstr "Bullet List (Disc)" + +#: none:0 +msgid "Bullet List (Circle)" +msgstr "Bullet List (Circle)" + +#: none:0 +msgid "Bullet List (Square)" +msgstr "Bullet List (Square)" + +#: none:0 +msgid "Ordered List (Decimal)" +msgstr "Ordered List (Decimal)" + +#: none:0 +msgid "Ordered List (Alpha lower)" +msgstr "Ordered List (Alpha lower)" + +#: none:0 +msgid "Ordered List (Alpha upper)" +msgstr "Ordered List (Alpha upper)" + +#: none:0 +msgid "OK" +msgstr "확ì¸" + +#: none:0 +msgid "Cancel" +msgstr "취소" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"locally connected" +msgstr "로컬로 ì ‘ì†ë¨" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Aliases: " +msgstr "Aliases: " + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"unknown" +msgstr "알 수 없는 í¬ë§·" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Unknown Location" +msgstr "Unknown Location" + +#: none:0 +msgid "Printer settings" +msgstr "프린터 ì„¤ì •" + +#: none:0 +msgid "Print in color if available" +msgstr "ë 수 있으면 ìƒ‰ì„ ê°™ì´ ì¸ì‡„" + +#: none:0 +msgid "Print in grayscale" +msgstr "회색으로 ì¸ì‡„" + +#: none:0 +msgid "Print destination" +msgstr "프린트 대ìƒ" + +#: none:0 +msgid "Print to printer:" +msgstr "프린터로 ì¸ì‡„" + +#: none:0 +msgid "Printer" +msgstr "프린터" + +#: none:0 +msgid "Host" +msgstr "호스트" + +#: none:0 +msgid "Comment" +msgstr "설명" + +#: none:0 +msgid "Print to file:" +msgstr "파ì¼ë¡œ 안쇄" + +#: none:0 +msgid "Browse..." +msgstr "브ë¼ìš°ì¦ˆ..." + +#: none:0 +msgid "Options" +msgstr "옵션" + +#: none:0 +msgid "Print all" +msgstr "ëª¨ë‘ ì¸ì‡„" + +#: none:0 +msgid "Print range" +msgstr "ì¸ì‡„í• ë²”ìœ„" + +#: none:0 +msgid "From page:" +msgstr "쪽ì—서:" + +#: none:0 +msgid "To page:" +msgstr "쪽까지:" + +#: none:0 +msgid "Print first page first" +msgstr "순서대로 ì¸ì‡„" + +#: none:0 +msgid "Print last page first" +msgstr "ì—순서로 ì¸ì‡„" + +#: none:0 +msgid "Number of copies:" +msgstr "ì¸ì‡„부수:" + +#: none:0 +msgid "Paper format" +msgstr "용지 í¬ë§·" + +#: none:0 +msgid "Portrait" +msgstr "묘사" + +#: none:0 +msgid "Landscape" +msgstr "í’ê²½" + +#: src/dialogs/qprintdialog.cpp:1069 +msgid "A0 (841 x 1189 mm)" +msgstr "A0 (841 x 1189 mm)" + +#: src/dialogs/qprintdialog.cpp:1070 +msgid "A1 (594 x 841 mm)" +msgstr "A1 (594 x 841 mm)" + +#: src/dialogs/qprintdialog.cpp:1071 +msgid "A2 (420 x 594 mm)" +msgstr "A2 (420 x 594 mm)" + +#: src/dialogs/qprintdialog.cpp:1072 +msgid "A3 (297 x 420 mm)" +msgstr "A3 (297 x 420 mm)" + +#: src/dialogs/qprintdialog.cpp:1073 +msgid "A4 (210x297 mm, 8.26x11.7 inches)" +msgstr "A4 (210x297 mm, 8.26x11.7 inches)" + +#: src/dialogs/qprintdialog.cpp:1074 +msgid "A5 (148 x 210 mm)" +msgstr "A5 (148 x 210 mm)" + +#: src/dialogs/qprintdialog.cpp:1075 +msgid "A6 (105 x 148 mm)" +msgstr "A6 (105 x 148 mm)" + +#: src/dialogs/qprintdialog.cpp:1076 +msgid "A7 (74 x 105 mm)" +msgstr "A7 (74 x 105 mm)" + +#: src/dialogs/qprintdialog.cpp:1077 +msgid "A8 (52 x 74 mm)" +msgstr "A8 (52 x 74 mm)" + +#: src/dialogs/qprintdialog.cpp:1078 +msgid "A9 (37 x 52 mm)" +msgstr "A9 (37 x 52 mm)" + +#: src/dialogs/qprintdialog.cpp:1079 +msgid "B0 (1030 x 1456 mm)" +msgstr "B0 (1030 x 1456 mm)" + +#: src/dialogs/qprintdialog.cpp:1080 +msgid "B1 (728 x 1030 mm)" +msgstr "B1 (728 x 1030 mm)" + +#: src/dialogs/qprintdialog.cpp:1081 +msgid "B10 (32 x 45 mm)" +msgstr "B10 (32 x 45 mm)" + +#: src/dialogs/qprintdialog.cpp:1082 +msgid "B2 (515 x 728 mm)" +msgstr "B2 (515 x 728 mm)" + +#: src/dialogs/qprintdialog.cpp:1083 +msgid "B3 (364 x 515 mm)" +msgstr "B3 (364 x 515 mm)" + +#: src/dialogs/qprintdialog.cpp:1084 +msgid "B4 (257 x 364 mm)" +msgstr "B4 (257 x 364 mm)" + +#: src/dialogs/qprintdialog.cpp:1085 +msgid "B5 (182x257 mm, 7.17x10.13 inches)" +msgstr "B5 (182x257 mm, 7.17x10.13 inches)" + +#: src/dialogs/qprintdialog.cpp:1086 +msgid "B6 (128 x 182 mm)" +msgstr "B6 (128 x 182 mm)" + +#: src/dialogs/qprintdialog.cpp:1087 +msgid "B7 (91 x 128 mm)" +msgstr "B7 (91 x 128 mm)" + +#: src/dialogs/qprintdialog.cpp:1088 +msgid "B8 (64 x 91 mm)" +msgstr "B8 (64 x 91 mm)" + +#: src/dialogs/qprintdialog.cpp:1089 +msgid "B9 (45 x 64 mm)" +msgstr "B9 (45 x 64 mm)" + +#: src/dialogs/qprintdialog.cpp:1090 +msgid "C5E (163 x 229 mm)" +msgstr "C5E (163 x 229 mm)" + +#: src/dialogs/qprintdialog.cpp:1091 +msgid "DLE (110 x 220 mm)" +msgstr "DLE (110 x 220 mm)" + +#: src/dialogs/qprintdialog.cpp:1092 +msgid "Executive (7.5x10 inches, 191x254 mm)" +msgstr "Executive (7.5x10 inches, 191x254 mm)" + +#: src/dialogs/qprintdialog.cpp:1094 +msgid "Folio (210 x 330 mm)" +msgstr "Folio (210 x 330 mm)" + +#: src/dialogs/qprintdialog.cpp:1095 +msgid "Ledger (432 x 279 mm)" +msgstr "Ledger (432 x 279 mm)" + +#: src/dialogs/qprintdialog.cpp:1096 +msgid "Legal (8.5x14 inches, 216x356 mm)" +msgstr "Legal (8.5x14 inches, 216x356 mm)" + +#: src/dialogs/qprintdialog.cpp:1097 +msgid "Letter (8.5x11 inches, 216x279 mm)" +msgstr "Letter (8.5x11 inches, 216x279 mm)" + +#: src/dialogs/qprintdialog.cpp:1098 +msgid "Tabloid (279 x 432 mm)" +msgstr "Tabloid (279 x 432 mm)" + +#: src/dialogs/qprintdialog.cpp:1099 +msgid "US Common #10 Envelope (105 x 241 mm)" +msgstr "US Common #10 Envelope (105 x 241 mm)" + +#: none:0 +msgid "Setup Printer" +msgstr "Setup Printer" + +#: none:0 +msgid "Postscript files (*.ps);;All files (*)" +msgstr "í¬ìŠ¤íŠ¸ìŠ¤í¬ë¦½í™”ì¼ (*.ps);;ëª¨ë“ íŒŒì¼ (*)" + +#: none:0 +msgid "Hu&e:" +msgstr "색ìƒ: (&e)" + +#: none:0 +msgid "&Sat:" +msgstr "시작 (&S)" + +#: none:0 +msgid "&Val:" +msgstr "ê°’ (&V)" + +#: none:0 +msgid "&Red:" +msgstr "ì 색: (&R)" + +#: none:0 +msgid "&Green:" +msgstr "녹색:(&G)" + +#: none:0 +msgid "Bl&ue:" +msgstr "ì²ìƒ‰:(&u)" + +#: none:0 +msgid "A&lpha channel:" +msgstr "알파체ë„:(&l)" + +#: none:0 +msgid "&Basic colors" +msgstr "기본 색ìƒ(&B)" + +#: none:0 +msgid "&Custom colors" +msgstr "ì‚¬ìš©ìž ìƒ‰(&C)" + +#: none:0 +msgid "&Define Custom Colors >>" +msgstr "ì‚¬ìš©ìž ìƒ‰ ì •ì˜ >>(&D)" + +#: none:0 +msgid "&Add To Custom Colors" +msgstr "색 ì •ì˜ì— 추가(&A)" + +#: none:0 +msgid "Select color" +msgstr "색 ì„ íƒ" + +#: none:0 +msgid "Copy or Move a File" +msgstr "íŒŒì¼ ì´ë™/복사" + +#: none:0 +msgid "Read: %1" +msgstr "ì½ê¸°: %1" + +#: none:0 +msgid "Write: %1" +msgstr "쓰기: %1" + +#: none:0 +msgid "&Cancel" +msgstr "취소(&C)" + +#: none:0 +msgid "All files (*)" +msgstr "ëª¨ë“ íŒŒì¼ (*)" + +#: none:0 +msgid "Name" +msgstr "ì´ë¦„" + +#: none:0 +msgid "Size" +msgstr "í¬ê¸°" + +#: none:0 +msgid "Type" +msgstr "형ì‹" + +#: none:0 +msgid "Date" +msgstr "ë‚ ì§œ" + +#: none:0 +msgid "Attributes" +msgstr "ì†ì„±" + +#: none:0 +msgid "Look &in:" +msgstr "찾기:(&i)" + +#: none:0 +msgid "File &name:" +msgstr "íŒŒì¼ ì´ë¦„(&n):" + +#: none:0 +msgid "File &type:" +msgstr "íŒŒì¼ í˜•ì‹(&t):" + +#: none:0 +msgid "Back" +msgstr "뒤로" + +#: none:0 +msgid "One directory up" +msgstr "í•œê°œì˜ ë””ë ‰í† ë¦¬" + +#: none:0 +msgid "Create New Folder" +msgstr "새 í´ë” 만들기" + +#: none:0 +msgid "List View" +msgstr "ëª©ë¡ ë³´ê¸°" + +#: none:0 +msgid "Detail View" +msgstr "ìžì„¸ížˆ 보기" + +#: none:0 +msgid "Preview File Info" +msgstr "íŒŒì¼ ì •ë³´ 미리보기" + +#: none:0 +msgid "Preview File Contents" +msgstr "íŒŒì¼ ë‚´ìš© 미리보기" + +#: none:0 +msgid "Read-write" +msgstr "ì½ê¸°-쓰기ì½ê¸° ì „ìš©" + +#: none:0 +msgid "Read-only" +msgstr "ì½ê¸° ì „ìš©" + +#: none:0 +msgid "Write-only" +msgstr "쓰기 ì „ìš©:" + +#: none:0 +msgid "Inaccessible" +msgstr "ì ‘ê·¼í• ìˆ˜ 없는" + +#: none:0 +msgid "Symlink to File" +msgstr "íŒŒì¼ ì—°ê²°" + +#: none:0 +msgid "Symlink to Directory" +msgstr "-" + +#: none:0 +msgid "Symlink to Special" +msgstr "ë””ë ‰í† ë¦¬ ì—°ê²°" + +#: none:0 +msgid "File" +msgstr "파ì¼" + +#: none:0 +msgid "Dir" +msgstr "ë””ë ‰í† ë¦¬" + +#: none:0 +msgid "Special" +msgstr "íŠ¹ì •" + +#: none:0 +msgid "Save as" +msgstr "다른 ì´ë¦„으로 ì €ìž¥" + +#: none:0 +msgid "&Open" +msgstr "열기(&O)" + +#: none:0 +msgid "&Save" +msgstr "ì €ìž¥(&S)" + +#: none:0 +msgid "&Rename" +msgstr "ì´ë¦„ 바꾸기(&R)" + +#: none:0 +msgid "&Delete" +msgstr "지우기(&D)" + +#: none:0 +msgid "R&eload" +msgstr "다시 불러오기(&e)" + +#: none:0 +msgid "Sort by &Name" +msgstr "ì´ë¦„으로 ì •ë ¬(&N)" + +#: none:0 +msgid "Sort by &Size" +msgstr "íŒŒì¼ í¬ê¸°ë¡œ ì •ë ¬(&S)" + +#: none:0 +msgid "Sort by &Date" +msgstr "ë‚ ì§œë¡œ ì •ë ¬(&D)" + +#: none:0 +msgid "&Unsorted" +msgstr "ì •ë ¬ 안함(&U)" + +#: none:0 +msgid "Sort" +msgstr "ì •ë ¬" + +#: none:0 +msgid "Show &hidden files" +msgstr "숨겨진 íŒŒì¼ ë³´ê¸°(&h)" + +#: none:0 +msgid "the file" +msgstr "파ì¼" + +#: none:0 +msgid "the directory" +msgstr "ìžë£Œë°©" + +#: none:0 +msgid "the symlink" +msgstr "ì—°ê²°" + +#: none:0 +msgid "Delete %1" +msgstr "지우기: %1" + +#: none:0 +msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>" +msgstr "<qt>ì •ë§ë¡œ ì‚ì œí•˜ì‹œê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ? %1 \"%2\"?</qt>" + +#: none:0 +msgid "&Yes" +msgstr "예(&Y)" + +#: none:0 +msgid "&No" +msgstr "아니오(&N)" + +#: none:0 +msgid "New Folder 1" +msgstr "새í´ë” 1" + +#: none:0 +msgid "New Folder" +msgstr "새 í´ë”" + +#: none:0 +msgid "New Folder %1" +msgstr "새 í´ë” %1" + +#: none:0 +msgid "Find Directory" +msgstr "ìžë£Œë°© 찾기" + +#: none:0 +msgid "Directories" +msgstr "ìžë£Œë°©" + +#: none:0 +msgid "Error" +msgstr "오류" + +#: none:0 +msgid "" +"%1\n" +"File not found.\n" +"Check path and filename." +msgstr "" +"%1\n" +"파ì¼ì„ ë°œê²¬í• ìˆ˜ 없습니다.\n" +"파ì¼ëª…ê³¼ 경로를 확ì¸í•´ 주시길 ë°”ëžë‹ˆë‹¤." + +#: none:0 +msgid "ERROR" +msgstr "오류" + +#: none:0 +msgid "&Font" +msgstr "글꼴(&F)" + +#: none:0 +msgid "Font st&yle" +msgstr "글꼴 스타ì¼(&y)" + +#: none:0 +msgid "&Size" +msgstr "í¬ê¸°(&S)" + +#: none:0 +msgid "Effects" +msgstr "효과" + +#: none:0 +msgid "Stri&keout" +msgstr "삼진(&k)" + +#: none:0 +msgid "&Color" +msgstr "색깔(&C)" + +#: none:0 +msgid "Sample" +msgstr "견본" + +#: none:0 +msgid "Scr&ipt" +msgstr "스í¬ë¦½íЏ(&p)" + +#: none:0 +msgid "Apply" +msgstr "ì ìš©" + +#: none:0 +#: none:0 +msgid "Close" +msgstr "닫기" + +#: none:0 +msgid "Select Font" +msgstr "글꼴 ê³ ë¥´ê¸°" + +#: none:0 +msgid "&OK" +msgstr "예(&O)" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"OK" +msgstr "확ì¸" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Cancel" +msgstr "취소" + + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Yes" +msgstr "확ì¸" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"No" +msgstr "취소" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Abort" +msgstr "중지" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Retry" +msgstr "재시ë„" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Ignore" +msgstr "무시" + +#: none:0 +msgid "Minimize" +msgstr "가장 작게" + +#: none:0 +msgid "Maximize" +msgstr "가장 í¬ê²Œ" + +#: none:0 +msgid "" +"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI " +"toolkit from Trolltech. Qt provides single-source portability across Windows " +"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11" +".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>" +msgstr "" +"<h3>Qtì— ëŒ€í•˜ì—¬</h3><p>ì´ í”„ë¡œê·¸ëž¨ì€ Qt version %1ì„ ì‚¬ìš©í•©ë‹ˆë‹¤, 트롤í…ì‚¬ì˜ " +"ë‹¤ì¤‘í”Œë ›í¼ C++ GUI 툴킷.Qt는 윈ë„우즈 95/98/NT/2000, X11ì´ ê°€ëŠ¥í•œ Mac OS X, Linux, " +"Solaris, HP-UXì—ì´ì „가능한 싱글소스를 ì œê³µí•©ë‹ˆë‹¤. </p><p>좀 ë” ë§Žì€ ì •ë³´ë¥¼ " +"ì›í•˜ì‹œë©´ <tt>http://www.trolltech.com/qt/</tt>ì„방문해 주시길 ë°”ëžë‹ˆë‹¤.</p>" diff --git a/examples/demo/i18n/ko.qm b/examples/demo/i18n/ko.qm Binary files differnew file mode 100644 index 000000000..028e8b527 --- /dev/null +++ b/examples/demo/i18n/ko.qm diff --git a/examples/demo/i18n/no.po b/examples/demo/i18n/no.po new file mode 100644 index 000000000..1aaffb714 --- /dev/null +++ b/examples/demo/i18n/no.po @@ -0,0 +1,847 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: none:0 +msgid "--language--" +msgstr "Norsk" + +#: none:0 +msgid "&File" +msgstr "&Fil" + +#: none:0 +msgid "New" +msgstr "Ny" + +#: none:0 +msgid "&New..." +msgstr "&Ny..." + +#: none:0 +msgid "Open" +msgstr "Ã…pne" + +#: none:0 +msgid "&Open..." +msgstr "&Ã…pne..." + +#: none:0 +msgid "Save As" +msgstr "Lagre som" + +#: none:0 +msgid "Save &As..." +msgstr "L&agre som..." + +#: none:0 +msgid "Save" +msgstr "Lagre" + +#: none:0 +msgid "&Save..." +msgstr "&Lagre..." + +#: none:0 +msgid "Print" +msgstr "Skriv ut" + +#: none:0 +msgid "&Print..." +msgstr "&Skriv ut..." + +#: none:0 +msgid "&Close" +msgstr "Lu&kk" + +#: none:0 +msgid "&Edit" +msgstr "&Rediger" + +#: none:0 +msgid "&Undo" +msgstr "&Angre" + +#: none:0 +msgid "Undo" +msgstr "Angre" + +#: none:0 +msgid "&Redo" +msgstr "&Gjør om" + +#: none:0 +msgid "Redo" +msgstr "Gjør om" + +#: none:0 +msgid "Cut" +msgstr "Klipp ut" + +#: none:0 +msgid "&Cut" +msgstr "&Klipp ut" + +#: none:0 +msgid "C&opy" +msgstr "K&opier" + +#: none:0 +msgid "Copy" +msgstr "Kopier" + +#: none:0 +msgid "Paste" +msgstr "Lim inn" + +#: none:0 +msgid "&Paste" +msgstr "&Lim inn" + +#: none:0 +msgid "Clear" +msgstr "Tøm" + +#: none:0 +msgid "Select All" +msgstr "Velg Alle" + +#: none:0 +msgid "Line up" +msgstr "Ordne" + +#: none:0 +msgid "For&mat" +msgstr "For&mat" + +#: none:0 +msgid "Bold" +msgstr "Uthevet" + +#: none:0 +msgid "&Bold" +msgstr "&Uthevet" + +#: none:0 +msgid "Italic" +msgstr "Kursiv" + +#: none:0 +msgid "&Italic" +msgstr "&Kursiv" + +#: none:0 +msgid "Underline" +msgstr "Understreket" + +#: none:0 +msgid "&Underline" +msgstr "&Understreket" + +#: none:0 +msgid "Left" +msgstr "Venstre" + +#: none:0 +msgid "&Left" +msgstr "&Venstre" + +#: none:0 +msgid "Center" +msgstr "Senter" + +#: none:0 +msgid "C&enter" +msgstr "S&enter" + +#: none:0 +msgid "Right" +msgstr "Høyre" + +#: none:0 +msgid "&Right" +msgstr "&Høyre" + +#: none:0 +msgid "Justify" +msgstr "Justert" + +#: none:0 +msgid "&Justify" +msgstr "&Justert" + +#: none:0 +msgid "Color" +msgstr "Farge" + +#: none:0 +msgid "&Color..." +msgstr "&Farge..." + +#: none:0 +msgid "Standard" +msgstr "Vanlig tekst" + +#: none:0 +msgid "Bullet List (Disc)" +msgstr "Liste (kule)" + +#: none:0 +msgid "Bullet List (Circle)" +msgstr "Liste (sirkel)" + +#: none:0 +msgid "Bullet List (Square)" +msgstr "Liste (firkant)" + +#: none:0 +msgid "Ordered List (Decimal)" +msgstr "Sortert liste (tall)" + +#: none:0 +msgid "Ordered List (Alpha lower)" +msgstr "Sortert liste (smÃ¥ bokstaver)" + +#: none:0 +msgid "Ordered List (Alpha upper)" +msgstr "Sortert liste (store bokstaver)" + +#: none:0 +msgid "OK" +msgstr "OK" + +#: none:0 +msgid "Cancel" +msgstr "Avbryt" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"locally connected" +msgstr "" +"_: QPrintDialog\n" +"lokalt tilkoblet" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Aliases: " +msgstr "" +"_: QPrintDialog\n" +"Aliaser: " + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"unknown" +msgstr "" +"_: QPrintDialog\n" +"ukjent" + +#: none:0 +msgid "" +"_: QPrintDialog\n" +"Unknown Location" +msgstr "" +"_: QPrintDialog\n" +"Ukjent sted" + +#: none:0 +msgid "Printer settings" +msgstr "Skriverinnstillinger" + +#: none:0 +msgid "Print in color if available" +msgstr "Skriv ut i farger hvis mulig" + +#: none:0 +msgid "Print in grayscale" +msgstr "Skriv ut i grÃ¥toner" + +#: none:0 +msgid "Print destination" +msgstr "UtskriftsmÃ¥l" + +#: none:0 +msgid "Print to printer:" +msgstr "Skriv ut til:" + +#: none:0 +msgid "Printer" +msgstr "Skriver" + +#: none:0 +msgid "Host" +msgstr "Vert" + +#: none:0 +msgid "Comment" +msgstr "Kommentar" + +#: none:0 +msgid "Print to file:" +msgstr "Skriv til fil:" + +#: none:0 +msgid "Browse..." +msgstr "Bla gjennom..." + +#: none:0 +msgid "Options" +msgstr "Valg" + +#: none:0 +msgid "Print all" +msgstr "Skriv ut alt" + +#: none:0 +msgid "Print range" +msgstr "Skriv ut i omrÃ¥det" + +#: none:0 +msgid "From page:" +msgstr "Fra side:" + +#: none:0 +msgid "To page:" +msgstr "Til side:" + +#: none:0 +msgid "Print first page first" +msgstr "Skriv ut første side først" + +#: none:0 +msgid "Print last page first" +msgstr "Skriv ut siste side først" + +#: none:0 +msgid "Number of copies:" +msgstr "Antall kopier" + +#: none:0 +msgid "Paper format" +msgstr "Papirformat" + +#: none:0 +msgid "Portrait" +msgstr "StÃ¥ende" + +#: none:0 +msgid "Landscape" +msgstr "Sidelengs" + +#: src/dialogs/qprintdialog.cpp:1069 +msgid "A0 (841 x 1189 mm)" +msgstr "A0 (841 x 1189 mm)" + +#: src/dialogs/qprintdialog.cpp:1070 +msgid "A1 (594 x 841 mm)" +msgstr "A1 (594 x 841 mm)" + +#: src/dialogs/qprintdialog.cpp:1071 +msgid "A2 (420 x 594 mm)" +msgstr "A2 (420 x 594 mm)" + +#: src/dialogs/qprintdialog.cpp:1072 +msgid "A3 (297 x 420 mm)" +msgstr "A3 (297 x 420 mm)" + +#: src/dialogs/qprintdialog.cpp:1073 +msgid "A4 (210x297 mm, 8.26x11.7 inches)" +msgstr "A4 (210x297 mm, 8,26x11,7 tommer)" + +#: src/dialogs/qprintdialog.cpp:1074 +msgid "A5 (148 x 210 mm)" +msgstr "A5 (148 x 210 mm)" + +#: src/dialogs/qprintdialog.cpp:1075 +msgid "A6 (105 x 148 mm)" +msgstr "A6 (105 x 148 mm)" + +#: src/dialogs/qprintdialog.cpp:1076 +msgid "A7 (74 x 105 mm)" +msgstr "A7 (74 x 105 mm)" + +#: src/dialogs/qprintdialog.cpp:1077 +msgid "A8 (52 x 74 mm)" +msgstr "A8 (52 x 74 mm)" + +#: src/dialogs/qprintdialog.cpp:1078 +msgid "A9 (37 x 52 mm)" +msgstr "A9 (37 x 52 mm)" + +#: src/dialogs/qprintdialog.cpp:1079 +msgid "B0 (1030 x 1456 mm)" +msgstr "B0 (1030 x 1456 mm)" + +#: src/dialogs/qprintdialog.cpp:1080 +msgid "B1 (728 x 1030 mm)" +msgstr "B1 (728 x 1030 mm)" + +#: src/dialogs/qprintdialog.cpp:1081 +msgid "B10 (32 x 45 mm)" +msgstr "B10 (32 x 45 mm)" + +#: src/dialogs/qprintdialog.cpp:1082 +msgid "B2 (515 x 728 mm)" +msgstr "B2 (515 x 728 mm)" + +#: src/dialogs/qprintdialog.cpp:1083 +msgid "B3 (364 x 515 mm)" +msgstr "B3 (364 x 515 mm)" + +#: src/dialogs/qprintdialog.cpp:1084 +msgid "B4 (257 x 364 mm)" +msgstr "B4 (257 x 364 mm)" + +#: src/dialogs/qprintdialog.cpp:1085 +msgid "B5 (182x257 mm, 7.17x10.13 inches)" +msgstr "B5 (182x257 mm, 7,17x10,13 tommer)" + +#: src/dialogs/qprintdialog.cpp:1086 +msgid "B6 (128 x 182 mm)" +msgstr "B6 (128 x 182 mm)" + +#: src/dialogs/qprintdialog.cpp:1087 +msgid "B7 (91 x 128 mm)" +msgstr "B7 (91 x 128 mm)" + +#: src/dialogs/qprintdialog.cpp:1088 +msgid "B8 (64 x 91 mm)" +msgstr "B8 (64 x 91 mm)" + +#: src/dialogs/qprintdialog.cpp:1089 +msgid "B9 (45 x 64 mm)" +msgstr "B9 (45 x 64 mm)" + +#: src/dialogs/qprintdialog.cpp:1090 +msgid "C5E (163 x 229 mm)" +msgstr "C5E (163 x 229 mm)" + +#: src/dialogs/qprintdialog.cpp:1091 +msgid "DLE (110 x 220 mm)" +msgstr "DLE (110 x 220 mm)" + +#: src/dialogs/qprintdialog.cpp:1092 +msgid "Executive (7.5x10 inches, 191x254 mm)" +msgstr "Executive (7,5x10 tommer, 191x254 mm)" + +#: src/dialogs/qprintdialog.cpp:1094 +msgid "Folio (210 x 330 mm)" +msgstr "Folio (210 x 330 mm)" + +#: src/dialogs/qprintdialog.cpp:1095 +msgid "Ledger (432 x 279 mm)" +msgstr "Ledger (432 x 279 mm)" + +#: src/dialogs/qprintdialog.cpp:1096 +msgid "Legal (8.5x14 inches, 216x356 mm)" +msgstr "Legal (8,5x14 tommer, 216x356 mm)" + +#: src/dialogs/qprintdialog.cpp:1097 +msgid "Letter (8.5x11 inches, 216x279 mm)" +msgstr "Brev (8.5x11 tommer, 216x279 mm)" + +#: src/dialogs/qprintdialog.cpp:1098 +msgid "Tabloid (279 x 432 mm)" +msgstr "Tabloid (279 x 432 mm)" + +#: src/dialogs/qprintdialog.cpp:1099 +msgid "US Common #10 Envelope (105 x 241 mm)" +msgstr "Standard US-#10-konvolutt (105 x 241 mm)" + +#: src/dialogs/qprintdialog.cpp:1123 +msgid "Setup Printer" +msgstr "Oppsett av skriver" + +#: src/dialogs/qprintdialog.cpp:1201 +msgid "Postscript files (*.ps);;All files (*)" +msgstr "Postskript-filer (*.ps);;Alle filer (*)" + +#: none:0 +msgid "Hu&e:" +msgstr "Hu&e:" + +#: none:0 +msgid "&Sat:" +msgstr "&Sat:" + +#: none:0 +msgid "&Val:" +msgstr "&Val:" + +#: none:0 +msgid "&Red:" +msgstr "&Rød:" + +#: none:0 +msgid "&Green:" +msgstr "&Grønn:" + +#: none:0 +msgid "Bl&ue:" +msgstr "B&lÃ¥:" + +#: none:0 +msgid "A&lpha channel:" +msgstr "A&lfakanal:" + +#: none:0 +msgid "&Basic colors" +msgstr "&Standardfarger" + +#: none:0 +msgid "&Custom colors" +msgstr "&Brukerdefinerte farger"" + +#: none:0 +msgid "&Define Custom Colors >>" +msgstr "&Definer egne farger >>"" + +#: none:0 +msgid "&Add To Custom Colors" +msgstr "&Føy til egendefinerte farger" + +#: none:0 +msgid "Select color" +msgstr "Velg farge" + +#: none:0 +msgid "Copy or Move a File" +msgstr "Kopier eller flytt en fil" + +#: none:0 +msgid "Read: %1" +msgstr "Lese: %1" + +#: none:0 +msgid "Write: %1" +msgstr "Skrive: %1" + +#: none:0 +msgid "&Cancel" +msgstr "&Avbryt" + +#: none:0 +msgid "All files (*)" +msgstr "Alle filer (*)" + +#: none:0 +msgid "Name" +msgstr "Navn" + +#: none:0 +msgid "Size" +msgstr "Størrelse" + +#: none:0 +msgid "Type" +msgstr "Type" + +#: none:0 +msgid "Date" +msgstr "Dato" + +#: none:0 +msgid "Attributes" +msgstr "Attributter" + +#: none:0 +msgid "Look &in:" +msgstr "Se &i:" + +#: none:0 +msgid "File &name:" +msgstr "Fil&navn:" + +#: none:0 +msgid "File &type:" +msgstr "Fil&type:" + +#: none:0 +msgid "Back" +msgstr "Tilbake" + +#: none:0 +msgid "One directory up" +msgstr "En katalog opp" + +#: none:0 +msgid "Create New Folder" +msgstr "Lag ny mappe" + +#: none:0 +msgid "List View" +msgstr "Listevisning" + +#: none:0 +msgid "Detail View" +msgstr "Detaljertvisning" + +#: none:0 +msgid "Preview File Info" +msgstr "ForhÃ¥ndsvis filinformasjon" + +#: none:0 +msgid "Preview File Contents" +msgstr "ForhÃ¥ndsvis innhold" + +#: none:0 +msgid "Read-write" +msgstr "Lese-skrive" + +#: none:0 +msgid "Read-only" +msgstr "Bare lese" + +#: none:0 +msgid "Write-only" +msgstr "Bare skrive" + +#: none:0 +msgid "Inaccessible" +msgstr "Utilgjenglig" + +#: none:0 +msgid "Symlink to File" +msgstr "Symbolsk lenke til fil" + +#: none:0 +msgid "Symlink to Directory" +msgstr "Symbolsk lenke til katalog" + +#: none:0 +msgid "Symlink to Special" +msgstr "Symbolsk lenke til spesial" + +#: none:0 +msgid "File" +msgstr "Fil" + +#: none:0 +msgid "Dir" +msgstr "Katalog" + +#: none:0 +msgid "Special" +msgstr "Spesial" + +#: none:0 +msgid "Save as" +msgstr "Lagre som"" + +#: none:0 +msgid "&Open" +msgstr "&Ã…pne" + +#: none:0 +msgid "&Save" +msgstr "&Lagre" + +#: none:0 +msgid "&Rename" +msgstr "&Endre navn"" + +#: none:0 +msgid "&Delete" +msgstr "&Slett" + +#: none:0 +msgid "R&eload" +msgstr "Last &pÃ¥ nytt" + +#: none:0 +msgid "Sort by &Name" +msgstr "Sorter etter &navn" + +#: none:0 +msgid "Sort by &Size" +msgstr "Sorter etter &størrelse" + +#: none:0 +msgid "Sort by &Date" +msgstr "Sorter etter &dato" + +#: none:0 +msgid "&Unsorted" +msgstr "&Usortert" + +#: none:0 +msgid "Sort" +msgstr "Sorter" + +#: none:0 +msgid "Show &hidden files" +msgstr "Vis &skjulte filer" + +#: none:0 +msgid "the file" +msgstr "filen" + +#: none:0 +msgid "the directory" +msgstr "katalogen" + +#: none:0 +msgid "the symlink" +msgstr "den symbolske lenken" + +#: none:0 +msgid "Delete %1" +msgstr "Slett %1" + +#: none:0 +msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>" +msgstr "<qt>Vil du virkelig slette %1 \"%2\"?</qt>" + +#: none:0 +msgid "&Yes" +msgstr "&Ja" + +#: none:0 +msgid "&No" +msgstr "&Nei" + +#: none:0 +msgid "New Folder 1" +msgstr "Ny mappe 1" + +#: none:0 +msgid "New Folder" +msgstr "Ny mappe" + +#: none:0 +msgid "New Folder %1" +msgstr "Ny mappe %1" + +#: none:0 +msgid "Find Directory" +msgstr "Finn katalog" + +#: none:0 +msgid "Directories" +msgstr "Kataloger" + +#: none:0 +msgid "Error" +msgstr "Feil" + +#: none:0 +msgid "" +"%1\n" +"File not found.\n" +"Check path and filename." +msgstr " +"%1\n" +"Fil ikke funnet.\n" +"Sjekk sti og filnavn." + +#: none:0 +msgid "ERROR" +msgstr "FEIL" + +#: none:0 +msgid "&Font" +msgstr "&Skrifttype" + +#: none:0 +msgid "Font st&yle" +msgstr "S&kriftstil" + +#: none:0 +msgid "&Size" +msgstr "&Størrelse" + +#: none:0 +msgid "Effects" +msgstr "Effekter" + +#: none:0 +msgid "Stri&keout" +msgstr "Strek &over" + +#: none:0 +msgid "&Color" +msgstr "&Farge" + +#: none:0 +msgid "Sample" +msgstr "Eksempel" + +#: none:0 +msgid "Scr&ipt" +msgstr "Skr&ipt" + +#: none:0 +msgid "Apply" +msgstr "Bruk" + +#: none:0 +msgid "Close" +msgstr "Lukk" + +#: none:0 +msgid "Select Font" +msgstr "Velg skrifttype" + +#: none:0 +msgid "&OK" +msgstr "&OK" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"OK" +msgstr "OK" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Yes" +msgstr "Ja" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"No" +msgstr "Nei" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Abort" +msgstr "Avbryt" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Retry" +msgstr "Prøv igjen" + +#: none:0 +msgid "" +"_: QMessageBox\n" +"Ignore" +msgstr "Ignorer" + +#: none:0 +msgid "" +"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI " +"toolkit from Trolltech. Qt provides single-source portability across Windows " +"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11" +".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>" +msgstr "" +"<h3>Om Qt</h3><p>Dette programmet bruker Qt versjon %1, et multiplatform C++ " +"GUI-verktøy fra Trolltech. Kode skrevet for Qt gir portabel kode for Windows 9" +"5/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX og mange andre versjoner av Unix med X11." +"</p><p>Se <tt>http://www.trolltech.com/qt/</tt> for mer informasjon.</p>" + +#: none:0 +msgid "Minimize" +msgstr "Minimer" + +#: none:0 +msgid "Maximize" +msgstr "Maksimer" diff --git a/examples/demo/i18n/no.qm b/examples/demo/i18n/no.qm Binary files differnew file mode 100644 index 000000000..05482a882 --- /dev/null +++ b/examples/demo/i18n/no.qm diff --git a/examples/demo/i18n/wrapper.h b/examples/demo/i18n/wrapper.h new file mode 100644 index 000000000..b1bddf586 --- /dev/null +++ b/examples/demo/i18n/wrapper.h @@ -0,0 +1,21 @@ +#ifndef WRAPPER_H +#define WRAPPER_H + +#include <qvbox.h> +#include <qtranslator.h> + + +class Wrapper : public TQVBox +{ +public: + Wrapper(TQWidget *parent, int i, const char *name = 0) + : TQVBox(parent, name, WDestructiveClose), translator(this), id(i) + { + } + + TQTranslator translator; + int id; +}; + + +#endif // WRAPPER_H diff --git a/examples/demo/icons.h b/examples/demo/icons.h new file mode 100644 index 000000000..32177688e --- /dev/null +++ b/examples/demo/icons.h @@ -0,0 +1,1938 @@ +/* XPM */ +const char *widgeticon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 64 1", +" c #e7e7e7", +". c Gray59", +"X c #e9d3b7", +"o c #a79783", +"O c #968775", +"+ c #cfbba2", +"@ c #bbbbbb", +"# c Gray70", +"$ c #6f6557", +"% c #838383", +"& c #7b7b7b", +"* c #baa891", +"= c #837666", +"- c #a2a2a2", +"; c #c9b59d", +": c Gray54", +"> c Gray67", +", c Gray42", +"< c #e4ceb2", +"1 c #cbcbcb", +"2 c #f9f9f9", +"3 c #c1c1c1", +"4 c #070706", +"5 c #4a443b", +"6 c #3c3731", +"7 c #dac5ab", +"8 c #dddddd", +"9 c #d2d2d2", +"0 c #484848", +"q c #b6a58f", +"w c #2c2823", +"e c #f1f1f1", +"r c #38332d", +"t c #555454", +"y c #665d51", +"u c #5b5348", +"i c #433d36", +"p c #ddc8ad", +"a c #c0ad96", +"s c #534b41", +"d c #d3bfa6", +"f c #867f76", +"g c #9e9d9c", +"h c #d7c3a9", +"j c #a8a198", +"k c #e0caaf", +"l c #312d29", +"z c #9f8f7c", +"x c #919090", +"c c #8e8d8c", +"v c #7f7263", +"b c #af9e89", +"n c #edd7bd", +"m c #b7b7b6", +"M c #796d5e", +"N c #e0cbb2", +"B c #8d7f6e", +"V c #252220", +"C c #191714", +"Z c #a7a7a7", +"A c #bdb3a7", +"S c #afafb0", +"D c Gray53", +"F c None", +/* pixels */ +"FFFFFFFe81S.%,t06li FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"F28@g&t0irr666rrrlV,2FFFFFFFFFFFFFFFFFFFFFFFFFFF", +">,t005ii50tt,%xg-ZS#mFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"#.,y,&x->m313S-.x%&9SFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"91191@>-gxD&&&&&&&,S@2FFFFFFFFFFFFFFFFFFFFFFFFFF", +"129-D%DD:ccc:D%%%%,Sm2FFFFFFFFFFFFFFFFFFFFFFFFFF", +"3e@-.xcc:DDD%%%%%&,mm2FFFFFFFFFFFFFFFFFFFFFFFFFF", +"3 >.cc::::&&%%%%%&,@#FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"@ Zxcc::D%t0:%%%&&,3#FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"m Zxc:::%,0tc%%%%&,1#FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"# Zxc::D%c05tlw6y&&9SFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"S Zx::DD%:ilrV444V, #FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"Ze-c:DDD%%,$t0lC44V.&@ FFFFFFFFFFFFFFFFFFFFFFFFF", +"ge-:DDD%%%%O=y5VCwwwwVw8FFFFFFFFFFFFFFFFFFFFFFFF", +"ge-D%D%%%%&Bbzv$v==$uiCC.2FFFFFFFFFFFFFFFFFFFFFF", +"g -%%%%D:cxco;*bbbbzvy5l4,eFFFFFFFFFFFFFFFFFFFFF", +"Z #.g-Z>SS#Sj*;**aaqzB$s6Ct FFFFFFFFFFFFFFFFFFFF", +"Z81333@@mmm#Sjbob*;+aoB$siCl1FFFFFFF29>1FF89eFFF", +">89913@@mmSg>S-cfzod+*zBys6C4D8FFFF>t6wV,tC4V,9F", +"#91 13@@@-t0tS>Z-gDqh+qOMs6V444t3 %5ssirC44CC44g", +"@93 13@@@,,StcSZZ-%chh;bBys56VC4C665ss5irV44CC44", +"11@ 13@@@,%3,,SZ--D:jddaoOOvy5wwwlr6i5s5i6lC4444", +"91# 93@@@,&3&,SZ--c%3Ad;*a;qO$iwwwlr6i555i6wC44C", +"83S893@m@&t@,,SZ--.&8 q++hph*Bu6rrrr6ii55i6rwC4C", +"em#983@mm>0tt->Z-g.& F3a7kkd*zvys5i66666ii66rlCC", +"F>#@8@@mmm>.Z>>ZZ>-&FFFgkkpdaoBvyus5i6666666rlwV", +"FmSZ83@mmmmm#>-.cD.3FFFmdkkdabO=M$yu5i66rr66rlwl", +"FeS1 1@@S-.xxg#1 2FFFFF8*Nkh;qoB=M$yusi6rrrrllwl", +"FF9SZx.Z#1 2FFFFFFFFFFF2jNN7+abzB=M$yysirrrrlwVl", +"FFFFFFFFFFFFFFFFFFFFFFFFmdNpd;*bzB=vM$yu56rllwVl", +"FFFFFFFFFFFFFFFFFFFFFFFF q<k7+aqozO=vM$yu56rlwVl", +"FFFFFFFFFFFFFFFFFFFFFFFFFjkkph+aqbzOBvM$yusirwwl", +"FFFFFFFFFFFFFFFFFFFFFFFFF1;kk7d;aqozOB=M$yusirwr", +"FFFFFFFFFFFFFFFFFFFFFFFFF2q7kph+;*bozOB=M$yusirr", +"FFFFFFFFFFFFFFFFFFFFFFFFF f+kkph+a*bozOB=M$yus5i", +"FFFFFFFFFFFFFFFFFFFFFF2g,lwopkk7d;a*bozOB=M$yuss", +"FFFFFFFFFFFFFFFFFFFFFFxM5V4ydkNk7d;a*bozOB=M$yuu", +"FFFFFFFFFFFFFFFFFFFFF>OBsC4w*k<<k7d;aqbozOB=M$yy", +"FFFFFFFFFFFFFFFFFFFFeO*z$w44vp<<<k7d;aqbozOB=M$$", +"FFFFFFFFFFFFFFFFFFFF8b;bB5C4s7<<<<k7d;aqbozOB=MM", +"FFFFFFFFFFFFFFFFFFFF8*dao$r4id<<XX<k7+;aqbozOB==", +"FFFFFFFFFFFFFFFFFFFFeb7;qBuVi+<<XXX<k7d;aqbozOBB", +"FFFFFFFFFFFFFFFFFFFFFgp+;o=5s;N<XXXX<N7d;aqbozOO", +"FFFFFFFFFFFFFFFFFFFFF1;d+*zM=;k<XXXXX<N7d;aqbozz", +"FFFFFFFFFFFFFFFFFFFFFFj7+abo*+7<XXXXXXXN7d;a*boo", +"FFFFFFFFFFFFFFFFFFFFFF@+d;aa;d7<XXXXnnXXN7d;a*bb", +"FFFFFFFFFFFFFFFFFFFFFF2oh;+;+hp<<XXXnnnnX<pd+a*q", +"FFFFFFFFFFFFFFFFFFFFFFF@;dhhhpN<XXnnnnnnnnXN7+;;" +}; + +/* XPM */ +const char *widgeticon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 64 1", +" c #706557", +". c #818181", +"X c #100f0e", +"o c Gray73", +"O c #797979", +"+ c #e9d3b7", +"@ c #c9b59d", +"# c #cfbba2", +"$ c #847766", +"% c Gray91", +"& c Gray84", +"* c Gray64", +"= c #b4b4b4", +"- c #8b8b8b", +"; c #baa891", +": c #e3cdb2", +"> c Gray42", +", c #a9a9a9", +"< c #3b3732", +"1 c #dac5ab", +"2 c #4c443b", +"3 c #c1c1c1", +"4 c #b7a58f", +"5 c #2b2823", +"6 c #9a9a9b", +"7 c #464646", +"8 c #cbcbcb", +"9 c Gray33", +"0 c #38332c", +"q c #928472", +"w c #665d51", +"e c #929292", +"r c #9d8d7a", +"t c #5c5348", +"y c #aa9985", +"u c #433d35", +"i c #ddc8ad", +"p c #c0ae96", +"a c #a59581", +"s c #544b41", +"d c #d3bfa5", +"f c #e0caaf", +"g c #a2927e", +"h c #847c73", +"j c #ae9d88", +"k c #928d86", +"l c #302d29", +"z c #796d5e", +"x c #7f7263", +"c c #b1a08a", +"v c #252320", +"b c #d7c2a8", +"n c #8c7e6d", +"m c #968775", +"M c #dfcab1", +"N c #1d1b19", +"B c #a6a099", +"V c #9e907d", +"C c #9a8a78", +"Z c #a79782", +"A c Gray94", +"S c #afafaf", +"D c #868686", +"F c None", +/* pixels */ +"FFFFFFFFFFFFXXXNvNNXFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFXXXN5l0<<<<00lvlFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"N77777uu7799>.e6*,S=0FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"66>w>Oe*So383S*6eDO&OFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"388&8o,*6eD.O.OO..>SDFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"3A&*DDDD-----DD...>S.FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"*Ao*ee---DDDD.....>=.FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"6%,e------.OD....O>oOFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"6%,e----D.97-D...O>3>FFFFFFFFFFFFFFFFFFFFFFFFFFF", +".%,e----.>79-..D..>8>FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"O%*e---DD-779l5<wOO&>FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"O%*e--DDD-ul0vXFFv>%9FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"9A*--DDDDD> 97lXFFve7XXFFFFFFFFFFFFFFFFFFFFFFFFF", +"7A*-DDDDD..m$w2vN5555vXXFFFFFFFFFFFFFFFFFFFFFFFF", +"<A*DDDD....qcgx x$$ tuNXNFFFFFFFFFFFFFFFFFFFFFFF", +"l%*.DDDD--eky@;yjjjrxw2lXNFFFFFFFFFFFFFFFFFFFFFF", +"5%Se6**,SS=SB;@;;pp4gn s<XNXFFFFFFFFFFFFFFFFFFFF", +"v%8333ooo===SBcyj;p#;an suNXNFFFFFFFFXXXFFXXFFFF", +"N&&&83ooooS*,S*khVyd#;gnws<NFNXFFFFl<05NXXXFXNXF", +"X&8%83ooo*979S,,*6D4b#4Czs<NFFFXNX<2ssu0XFFXXFFN", +"X&3%83oo3>>S9-S,**Dkbb@ynws2<vXXNl<2ss2u0vXXXXFF", +"X8o%83ooo>.3>>S,**DDhddpamCxw25vvl0<u2s2u<lNXXFF", +"F3=%83ooo>O3O>S***-ONzd@;p@4q u555l0<u222u<5NXFF", +"F=S&&3oooO9o>>S***eOXFm##bib;nt<0000<uu22u<05NXF", +"F6=8&3ooo,799*,***6>FFN;1ffd;Cxw22u<<<<uuuu<0lNF", +"F9=3&ooo==,6,S,,,,*<FFF2ffidpaqxwts2u<<<<<<<0l5X", +"FNS*&3ooo==o=,*eO90FFFFXdffdpjC$z wt2u<<00<<0l5N", +"FF-8%8ooS6.w<NXFFFFFFFFFc:fb@4gq$z wtsu<0000ll5v", +"FFFN97<NXFFFFFFFFFFFFFFF ::1#pcgq$z wwsu0000l5vN", +"FFFFFFFFFFFFFFFFFFFFFFFF5d:id@;jVq$xz wt2<0ll5vN", +"FFFFFFFFFFFFFFFFFFFFFFFFFg:f1#p4yVq$xz wt2<0l5vN", +"FFFFFFFFFFFFFFFFFFFFFFFFFuffib#p4jgqnxz wt2u055v", +"FFFFFFFFFFFFFFFFFFFFFFFFFX@ff1d@p4yrmn$z wtsu05v", +"FFFFFFFFFFFFFFFFFFFFFFFFFFq1fib#@;cZVmn$z wtsu05", +"FFFFFFFFFFFFFFFFFFFFFFFFFXs#ffib#p;cygmn$z wtsu0", +"FFFFFFFFFFFFFFFFFFFFFFFXNv5yiff1d@p;cyVmn$z wtsu", +"FFFFFFFFFFFFFFFFFFFFFFvz2NXwdf:f1d@p;cZVmn$z wt2", +"FFFFFFFFFFFFFFFFFFFFFXCnsXFv4f::f1d@p4jZrmn$z ws", +"FFFFFFFFFFFFFFFFFFFFF ;g 5FFxi:::f1d@p4jarmn$z t", +"FFFFFFFFFFFFFFFFFFFFFZ@cn2XFs1::::f1d@p4jarqn$zw", +"FFFFFFFFFFFFFFFFFFFFFcdpa 0Fud::++:f1d@p4jarqn$ ", +"FFFFFFFFFFFFFFFFFFFFF$1@4qtNu#::+++:f1d@p4jarmnz", +"FFFFFFFFFFFFFFFFFFFFF<i#@y$2s@::++++:M1d@p4jZVm$", +"FFFFFFFFFFFFFFFFFFFFFX@d#;rz$@f:++++++:1d@p4jZVn", +"FFFFFFFFFFFFFFFFFFFFFFt1#pcy;#1:+++++++:1d@p;cZm", +"FFFFFFFFFFFFFFFFFFFFFFX#d@pp@d1:++++++++:1d@p;cV", +"FFFFFFFFFFFFFFFFFFFFFFF b@#@#bi:+++++++++:id#p;y", +"FFFFFFFFFFFFFFFFFFFFFFFXcp@@@@#d11iiMMMMMib#@p;a" +}; + +/* XPM */ +const char *dbicon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 128 2", +" c #9b8471", +". c #c4a48e", +"X c #ab806c", +"o c #93918c", +"O c #6a534a", +"+ c #9c7d69", +"@ c #a27d69", +"# c #b4a69a", +"$ c #a4816d", +"% c #6f6d6d", +"& c #b1826e", +"* c #91816d", +"= c #a59687", +"- c #c5baaf", +"; c #8e7e6a", +": c #94816e", +"> c #a28571", +", c #e8e7e5", +"< c #ad4e34", +"1 c #99806c", +"2 c Gray99", +"3 c #393534", +"4 c #dad9d8", +"5 c #cbc6c1", +"6 c #9e816d", +"7 c #c5937d", +"8 c #ba8a75", +"9 c #c8c1ba", +"0 c #f4f3f2", +"q c #ab8974", +"w c #b38672", +"e c #d6927d", +"r c #4a6299", +"t c #d19b85", +"y c #595754", +"u c #292828", +"i c #aa8470", +"p c #abb9d7", +"a c #917d6a", +"s c #8c6856", +"d c #874c32", +"f c #7a472d", +"g c #967d69", +"h c #b89a86", +"j c #b98671", +"k c #915c44", +"l c #c38974", +"z c #744a31", +"x c #a87f6b", +"c c #b28975", +"v c #ba937e", +"b c #9f4c31", +"n c #52453d", +"m c #6e462d", +"M c #9598b1", +"N c #73758b", +"B c #907f6c", +"V c #bbb3ab", +"C c #7586b4", +"Z c #897b77", +"A c #c58d79", +"S c #bcbcbc", +"D c #934a30", +"F c #7c5f51", +"G c #9b7b67", +"H c #8e7f6c", +"J c #bd8d78", +"K c #8d7966", +"L c #93715e", +"P c #cc8e79", +"I c #e1deda", +"U c #81472e", +"Y c #c45035", +"T c #9f8d7e", +"R c #85624c", +"E c #b8836f", +"W c #926c5b", +"Q c #bbaca0", +"! c #647aab", +"~ c #d0ccc7", +"^ c #654931", +"/ c #927864", +"( c #adabb7", +") c #8d8477", +"_ c #423c3a", +"` c #a79f95", +"' c #e0a690", +"] c #a27666", +"[ c #98624c", +"{ c #8b7d6a", +"} c #a58773", +"| c #d8d4e3", +" . c #a55941", +".. c #7e7164", +"X. c #a27b67", +"o. c #2f2e2e", +"O. c #ac8e79", +"+. c #927b68", +"@. c #947f74", +"#. c #d7d4cf", +"$. c #333130", +"%. c #947f6c", +"&. c #181715", +"*. c #f8f7f7", +"=. c #af806c", +"-. c #8d7c68", +";. c #835941", +":. c #2d2f34", +">. c #c98c77", +",. c #cf907b", +"<. c #a89180", +"1. c #ab7a68", +"2. c #c5c4d8", +"3. c #9ea4bf", +"4. c #e49f88", +"5. c #eeedeb", +"6. c #8a7564", +"7. c #817d84", +"8. c #a05f48", +"9. c #c08873", +"0. c #977462", +"q. c #9b705d", +"w. c #8b7e6f", +"e. c #74543d", +"r. c #98836f", +"t. c #586997", +"y. c #8e806c", +"u. c None", +/* pixels */ +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.*.I 5 Q # = <.<.h # V 5 I *.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.*.#.# > G G X.X.@ @ @ @ X.X.X.+ T Q #.*.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.*.9 T G G + @ @ @ @ @ @ @ @ @ @ @ @ + + G T 9 0 u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.2 5 T G G + + + @ @ @ x x x x x x @ @ @ @ + + G G > - 0 u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.5.` g G G G + @ @ @ @ x x x X X X X x x @ @ @ + + + + G <.I u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u., T g g g + + + @ @ @ x x X X X X X X X x x x @ @ + + + g g g - 2 u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.4 +.g g g + + + @ @ $ x X =.=.=.=.=.=.X X X x x @ @ + + g g g +.# *.u.u.u.u.u.u.u.", +"u.u.u.u.u.I : +.+.g g g + + 6 $ $ x X =.=.=.=.& & =.X X X X x $ 6 + + 1 g g +.+.` *.u.u.u.u.u.u.", +"u.u.u.u.0 T +.a a g g g + 1 6 $ $ x X X =.=.& & & =.=.X X x $ $ 6 6 1 1 g g a a -.# 2 u.u.u.u.u.", +"u.u.u.u.V K a a a a g g 1 1 6 6 $ $ x X =.=.& & & & =.X X x $ $ 6 6 1 1 g g a a a -.- u.u.u.u.u.", +"u.u.u.#.K -.; a a %.%.%.1 6 6 6 6 $ x X X & & & & & =.X x $ $ 6 6 6 1 1 %.%.a a ; ; -.4 u.u.u.u.", +"u.u.2 = -.; ; ; a a %.%.1 1 1 6 6 $ $ x X =.& & & & =.X x $ $ 6 6 1 1 1 1 %.a a ; ; -.= *.u.u.u.", +"u.u.#.-.-.; ; ; B B %.%.1 1 1 1 6 6 $ $ X & w & E w & X $ $ 6 6 1 1 %.%.%.%.B a ; ; ; -.9 u.u.u.", +"u.u.` -.{ ; ; ; B B B %.%.%.1 1 1 6 $ i $ L R F F s X.i $ 6 6 1 1 %.%.%.%.%.B B ; ; ; ; r.5.u.u.", +"u.5.y.{ { ; ; ; H B B B B %.%.%.1 1 6 L e.^ m U U m z [ + 6 1 1 %.%.%.B B B B B ; ; ; ; -.9 u.u.", +"u.~ { { { { ; H B B B B B B B * %.r.W z m D b < Y b U f ;.g 1 %.%.B B B B B B B H ; ; ; ; = 2 u.", +"u.V { { { ; H H B B B B B B B B * K d m f d < Y Y < d U f k : %.* B B B B B H H H H H ; ; ; I u.", +"u.` { { { ; H H B H H H B B B B * W U ^ z d d d D D d z ^ d q.* B B B H H H H H H H H H H { 9 u.", +"u.= ; ; H H H H H y.y.y.y.y.y.y.y.8.U ^ z z n m U ^ m m z f 8.y.H H H H H H H H H H H H H ; Q u.", +"u.T H H H H H H y.y.y.y.y.y.y.y.y. .U ^ z ^ m f d ^ ^ m ^ m .B y.y.y.y.H H H y.y.y.y.H H H ` u.", +"u.T y.H H y.y.y.y.y.y.y.y.y.y.y.y.[ D z z m b < Y < z m ^ f .y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.= u.", +"u.) y.y.y.y.y.y.y.y.y.y.y.B B B * s b U z f d < Y b f z ^ D [ * y.y.y.y.y.y.y.y.y.y.y.y.y.y.= u.", +"u.w.: B B B B B B B B B * * * * : * ;.b D d d b b D D d D b / * * B B B y.y.B y.y.y.y.y.* * = u.", +"u.w.: * * * * * * * B * * : : : : / d D b < < < < < < D s r.: : : * * * * * B * * * * * * ` u.", +"u.o : * * * : : : : * : : : : 1 1 6 > G ;.f D b < b D d s 6 r.1 : : : : : * * * * * * * * * Q u.", +"u.` -.: : : : : : : : : 1 1 1 1 6 6 $ i i q.R ;.;.;.s X.i $ 6 1 1 1 1 : : : : : : * : : : : 9 u.", +"u.9 ..r.r.r.: : : : r.w.Z 1 6 6 6 $ $ i & w j E E j j & i $ $ 6 6 1 1 1 1 : : : : r.: : r.r.I u.", +"u., ..1 r.r.r.r.r.r. @.t.t.Z $ i i i X & & E E E E E & X i $ $ $ 6 6 1 1 1 r.r.r.r.r.r.r.<.*.u.", +"u.u.o K r. 6 @.t.r 7.6.G w & & & E E E E E & & i i $ $ $ 6 6 6 6 r.r.r.r.r.r.r.9 u.u.", +"u.u.~ ..6 6 > Z N % :.3 F w j E E E E E E E & & i i $ $ $ 6 6 6 <.5.u.u.", +"u.u.*.) K } > > > > > > q ..:.u u o.n 0.9.j E E E E E & & & i i $ $ > > > > > > 9 u.u.u.", +"u.u.u.~ ..6 } } } } } } i q 0.o.u O X.n $.O 1.l j E E E E & & & i i i > > > } > > > > = 0 u.u.u.", +"u.u.u.u.` 6.> q q q q q i i c R u s J 8 ] n $.F E l E E E & & i i i i i i } } } } } } ~ u.u.u.u.", +"u.u.u.u., { K q q q q c c w c 8 O o.X.9.9.9.s 3 _ W l j j E w w w w w q q q q q q q h *.u.u.u.u.", +"u.u.u.u.u.~ K g c c c c c c c 8 j _ n 9.9.9.>.E O $.O =.l 8 j j w w c c c c c q c } 4 u.u.u.u.u.", +"u.u.u.u.u.u.9 +.1 c J 8 8 8 8 8 A =.3 F >.l l l P 1.O _ F 9.A 8 8 8 8 8 c c c J } 5 u.u.u.u.u.u.", +"u.u.u.u.u.u.u.9 1 6 q J J J J J A ,.q.u W ,.>.>.>.P P ] n n ] P A J J J 8 J v q - u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.5 > } O.7 7 A A A A ,.O o.1.e >.>.>.>.,.P F $.O j ,.7 A 7 7 O.V u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.I ` q O.v 7 t ,.P ,.,.O 3 9.e ,.,.,.,.,.e 1.3 3 F 7 t v <.~ u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.*.9 O.v v h t t t t ,._ O e e e e e e e 4.] u u _ y o , u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u., V h h h . . . ' v 3 s ' ' ' ' t ' 7 O u o.u u ` u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u., 9 Q . . . . . _ u O > O.> ..n &.&.$.o.o.o.% 4 u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.2 , ~ - - T u u u 3 y y % o 9 y u $.o.o.o.u $.V u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0 % u o.o.o 5.2 u.u.7.u o.u o.3 $.u u S u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u., n u o.o.y % % y 3 o.3 N M 3.( 7._ $.4 u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.4 3 u $.o.o.o.o.o.3 M C t.r ! 2.( 3 y *.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.S u o.$.$.$.$.u % M r r ! ! 3.| 7.u 5 u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.` $._ _ _ _ 3 7.C r t.p p C | ( 3 o u.u.u.u.u." +}; + +/* XPM */ +const char *dbicon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 128 2", +" c #a3816d", +". c #2a2929", +"X c #b1826e", +"o c #91816d", +"O c #796a5b", +"+ c #8e7e6a", +"@ c #4b433b", +"# c #94816d", +"$ c #9d8571", +"% c #ad4e34", +"& c #9a816d", +"* c #a28571", +"= c #9e816d", +"- c #0b0b0a", +"; c #756c73", +": c #c4937d", +"> c #3a3633", +", c #ad816d", +"< c #ba8a75", +"1 c #ab8974", +"2 c #574d44", +"3 c #cdc9da", +"4 c #b38672", +"5 c #876858", +"6 c #d6927d", +"7 c #d19984", +"8 c #aa8570", +"9 c #917d6a", +"0 c #a9816d", +"q c #4b6399", +"w c #874c32", +"e c #63574c", +"r c #7a472d", +"t c #957d69", +"y c #b98671", +"u c #a17d6a", +"i c #915c44", +"p c #c38974", +"a c #9a7d6a", +"s c #744a31", +"d c #aa7f6b", +"f c #b28975", +"g c #9d7d69", +"h c #9f4c31", +"j c #6e462d", +"k c #b8937e", +"l c #8491ba", +"z c #a57e6a", +"x c #907f6c", +"c c #c58d79", +"v c #735749", +"b c #c5a28c", +"n c #934a30", +"m c #6b7397", +"M c #bd9b85", +"N c #9a7a66", +"B c #897b77", +"V c #8e7f6c", +"C c #647aa9", +"Z c #9da9c6", +"A c #bd8d78", +"S c #8d7966", +"D c #817261", +"F c #93705e", +"G c #cc8e79", +"H c #2f2d2c", +"J c #81472e", +"K c #353230", +"L c #c45035", +"P c #88644d", +"I c #433c37", +"U c #927864", +"Y c #b8836f", +"T c #8a7361", +"R c #916958", +"E c #5a6c98", +"W c #795e52", +"Q c #654930", +"! c #dba993", +"~ c #43598f", +"^ c #c5a892", +"/ c #daa28b", +"( c #e4a58f", +") c #a27666", +"_ c #98624c", +"` c #8b7d6a", +"' c #645d52", +"] c #a55941", +"[ c #a58773", +"{ c #a37a66", +"} c #adaab7", +"| c #ab8e78", +" . c #907b68", +".. c #947f74", +"X. c #947f6c", +"o. c #634d45", +"O. c #232120", +"+. c #b0806c", +"@. c #a47a68", +"#. c #6e6358", +"$. c #a5806c", +"%. c #9e7b68", +"&. c #8d7c68", +"*. c #835941", +"=. c #2d2f34", +"-. c #c98c77", +";. c #997c68", +":. c #cf907b", +">. c #99836f", +",. c #a27c69", +"<. c #9c9bab", +"1. c #31302f", +"2. c #ab7a68", +"3. c #e49f88", +"4. c #987f6c", +"5. c #967561", +"6. c #7b5f4a", +"7. c #9ca1bb", +"8. c #807c84", +"9. c #a05f48", +"0. c #987262", +"q. c #181816", +"w. c #96836f", +"e. c #c08873", +"r. c #947b68", +"t. c #9b705d", +"y. c #8e806c", +"u. c None", +/* pixels */ +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.- O.I 2 e W O W W e 2 > O.- u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.- . e T %.%.%.,.,.,.,.,.,.,.%.g 5 o.H - u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.- > O N %.%.,.,.u u ,.z z z z ,.,.,.%.%.N 5 I - u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.> O ;.;.g %.g u ,.z z z z z z z z z z u g g ;.;.T @ - u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.q.e r.;.;.;.g u u z z z d d d d d d d z z ,.u g g a a ;.O O.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.q.O r.t ;.a g g u u z z d d d , , , d d d z z u u g g a t t r.@ u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.. D r.r.t t a g u u z $.0 d , , +.+.+., , , d d z u u g a ;.;.t r.e - u.u.u.u.u.u.u.", +"u.u.u.u.u.O.T .r.r.t t a g = $.0 d , +.+.+.+.+.+., , d d $. = g a a a t 9 .e - u.u.u.u.u.u.", +"u.u.u.u.- O .9 t t t 4.a a = 0 d , +.+.+.X X +., , d 0 $. = = a a 4.t t 9 .e u.u.u.u.u.u.", +"u.u.u.u.2 . . .9 9 t t 4.& = = $.0 , , +.X X X +., , d $.$. = = 4.4.4.t 9 9 9 &.2 u.u.u.u.u.", +"u.u.u.. S &.+ 9 9 X.X.X.4.= = = = $.d , +.X X X +., , 0 $.$.= = = & 4.X.X.9 9 + + &.H u.u.u.u.", +"u.u.u.#.&.+ + + 9 9 X.X.4.& & = = $.0 , +.X X X +., , $.$. = = 4.4.4.4.X.9 9 + + &.O - u.u.u.", +"u.u.H &.&.+ + + x x X.X.4.4.4.& = = $., X 4 X Y 4 X 0 $. = = & 4.X.X.X.X.x 9 + + + &.@ u.u.u.", +"u.u.' &.` + + + x x x X.X.X.4.4.& & 0 $.F P 6.6.R @.8 = & & 4.X.X.X.X.X.x x + + + + D q.u.u.", +"u.q.D ` ` + + + V x x x x X.X.X.4.4.= F v Q j J J j s _ g = & 4.X.X.X.x x x x x + + + + &.@ u.u.", +"u.K ` ` ` ` + V x x x x x x x o X.w.F s j n h % L h J r *.;.& X.X.x x x x x x x V + + + + O - u.", +"u.2 ` ` ` + V V x x x x x x x x o .w j r w % L L % w J r i # X.o x x x x x V V V V V + + + O.u.", +"u.e ` ` ` + V V x V V V x x x x o R J Q s w w w n n w s Q w t.o x x x V V V V V V V V V V ` @ u.", +"u.#.+ + V V V V V y.y.y.y.y.y.y.y.9.J Q s s @ j J Q j j s r 9.y.V V V V V V V V V V V V V + e u.", +"u.O V V V V V V y.y.y.y.y.y.y.y.y.] J Q s Q j r w Q Q j Q j ] x y.y.y.y.V V V y.y.y.y.V V V #.u.", +"u.O y.V V y.y.y.y.y.y.y.y.y.y.y.y._ n s s j h % L % s j Q r ] y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.O u.", +"u.O y.y.y.y.y.y.y.y.y.y.y.x x x o 5 h J s r w % L h r s Q n _ o y.y.y.y.y.y.y.y.y.y.y.y.y.y.D u.", +"u.#.# x x x x x x x x x o o o o # o *.h n w w h h n n w n h U o o x x x y.y.x y.y.y.y.y.o o O u.", +"u.' # o o o o o o o x o o # # # # >.U w n h % % % % % % n R w.# # # o o o o o x o o o o o o #.u.", +"u.2 # o o o # # # # o # # # # # & & * N *.r n h % h n w R = & & # # # # # o o o o o o o o o e u.", +"u.@ &.w.# # # # # # # # & # & & & = 8 , t.P *.*.*.P { 8 = & & & # # # # # # # o # # # # 2 u.", +"u.1.D >.w.w.w.w.w.w.>.B B & = & = 0 , 4 y Y Y y y X 0 = = & & & # # # # # w.# # w.w.H u.", +"u.q.O & >.>.>.>.>.>.>...E E B 8 8 0 , X X Y Y Y Y Y X , 0 = & & & & w.w.w.w.w.w.w.T - u.", +"u.u.e S $ >.>.>.$ $ >.= ..q q 8.T %.4 X X X Y Y Y Y Y X X , 0 = = & & >.>.>.>.>.>.>.2 u.u.", +"u.u.1.O & $ $ $ $ $ $ = * B m ; =.K W 4 y Y Y Y Y Y Y Y X X , 8 0 = = = $ $ $ $ $ $ t q.u.u.", +"u.u.- ' S [ $ * * * * * * 8 ; =.. . H @ 0.e.y Y Y Y Y Y X X X , 0 * * * * * $ $ $ $ 2 u.u.u.", +"u.u.u.H D & [ [ [ [ [ [ 8 1 5.H . v { o.K o.2.p y Y Y Y Y X X X 8 8 8 * * * [ * * * * U - u.u.u.", +"u.u.u.u.e T * 1 1 1 1 1 8 8 f 5 . 5 A < ) 2 K W Y p Y Y Y X X 8 8 8 8 8 8 8 [ [ [ [ [ I u.u.u.u.", +"u.u.u.u.q.D S 1 1 1 1 f f 4 f < o.H @.e.e.e.R > I F p y y Y 4 4 4 4 4 1 1 1 1 1 1 1 T - u.u.u.u.", +"u.u.u.u.u.> S t f f f f f f f < y I @ e.e.e.-.Y v K o.+.p < y y 4 4 f f f f f 1 f [ H u.u.u.u.u.", +"u.u.u.u.u.u.I .& f A < < < < < c +.> v -.p p p G 2.o.I W e.c < < < < < f f f A [ I u.u.u.u.u.u.", +"u.u.u.u.u.u.u.> & = 1 A A A A A c :.t.. R :.-.-.-.G G ) @ @ ) G c A A A < A A 1 @ u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.> = [ | : : c c c c :.v H 2.6 -.-.-.-.:.G W 1.e y :.c c : : | 2 u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.O.O 1 | k : 7 :.G :.:.o.> e.6 :.:.:.:.:.6 2.K > 5 : 7 k >.> u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.- @ 1 k k M b 7 7 7 :.I o.6 6 6 6 6 6 6 3.) . . I ' 2 q.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.q.#.k M M b b b ! k > 5 ( ( ( / / ! : v . H . . . u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.q.2 X.M b ^ ^ ^ I . e * | $ >.D 2 - O.1.H H H 1.q.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.q.@ #.$ ` . . . > @ @ I K O.q.O.1.1.H H . H O.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.- 1.. H 1.. - u.u.u.. . H O.1.> K . . O.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.q.H . H H 1.. O.H 1.H > 8.<.7.} 8.I . O.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.O.H . 1.1.1.1.1.H K <.l E q C 3 } > 1.- u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.. . H 1.1.1.1.. #.l ~ q C C Z 3 8.. O.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.H . H H H H . ; E ~ ~ Z Z C 3 <.K H u.u.u.u.u." +}; + +/* XPM */ +const char *internicon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 32 1", +" c #54706a", +". c #32494f", +"X c #a5b6b0", +"o c #1f6796", +"O c #56758a", +"+ c #273133", +"@ c #465450", +"# c #173547", +"$ c #5e7968", +"% c #7192af", +"& c #6e8c86", +"* c #112836", +"= c #688370", +"- c #2d5161", +"; c #5885a9", +": c #134c6e", +"> c #53605e", +", c #080f14", +"< c #656860", +"1 c #405c65", +"2 c #2e3f44", +"3 c #131b21", +"4 c #44677a", +"5 c #17425c", +"6 c #8e9185", +"7 c #3f4944", +"8 c #3979a3", +"9 c #797770", +"0 c #202527", +"q c #363936", +"w c #7e9c93", +"e c None", +/* pixels */ +"eeeeeeeeeeeeeeeeeeee%&&OOOO&eeeeeeeeeeeeeeeeeeee", +"eeeeeeeeeeeeeeeewOO 4OOOO4411..9eeeeeeeeeeeeeeee", +"eeeeeeeeeeeeeX&OOwwO4OOOO411-.2q2@9eeeeeeeeeeeee", +"eeeeeeeeeeee;OO%XXwO444411.22.qqq+07eeeeeeeeeeee", +"eeeeeeeeeewO;%XXX&O4411--..222q2++000>eeeeeeeeee", +"eeeeeeeee%;;XXXwOO444411-..222qq++00+0qeeeeeeeee", +"eeeeeeee%;;%%%%OOOOO4411-..22++++0000q3+eeeeeeee", +"eeeeeee8%;;;%%%OOOOO4>>11-.77q+++003300,3eeeeeee", +"eeeeee8%%;;;%%;OOOO4>><>>@@77qqq++000000,3eeeeee", +"eeeee88%%;;%%;;OOO>>>>>>>>@77q+q+0000+033,0eeeee", +"eeee%8%%%;%%;;OOOO $411>>@777qq++000q2+033,<eeee", +"eeee88;;;%%;;;OOO4O 4>>>@@7722qqq+++7q++033,eeee", +"eee8o88;%;;%;OOOO <>@@77777qqqqq++q0q+00,0eee", +"eeXooo8%;;;;;OO <<>>@@@@7@7qqqqq+077q+q03,9ee", +"ee;o8;%;8;;;8O4411>>>1@@>@7@77qqqq++q@70+703,0ee", +"eeoo88888;;&;&44>>><<>>>>@772#22+++q77307q0,,,ee", +"e%ooo88888;= &$>$>>>@@@.5.2##22+++21+07q0003,@e", +"e8ooo88888&&44OOO>---.555#5@7##2+++2-.77+00+3,3e", +"eoooo8oooo4444O4----.---..@@72*22++2.2@q0+000,,e", +"e8;oooooo8OOO=4-:-:-5->@@@@@.2#22+2.*0q7q++003,e", +"%88oooooo $&6=$ ::::5:-..@@@@7722+220330000003,>", +";oooooo8O =&==&$-:::55555@@7@.722+0++000300303,7", +"8ooooo;w&&&w&&&= 1: 1-:5-@@777.7.++++000300333,+", +"8oooo8w66=&w&&=$$ =$$ 11@@@@7#22+2+**0000033,,0", +"8oooo;www&ww= $$ $$$$>-.@@772###****0000033,,0", +"8oooo&XXXwww= $= $$$$$ .5..77722.+***3++0033,,0", +";oooo&XXXw&=$$$$$$>$$ $ @5-.777777+***00q0033,,+", +"%o4O4&66&&&==$$$$1@$$$$ >25.277@77+****0+03033,@", +"eo4OO&996===$ === $$$ @#5277@7#****00000333,9", +"eo4ooO=99$$=$==$=$$$$$$ >>.5-772******+000003,,e", +"e4::::4$ > $=$$$===$$ <>><2-7###****++00003,,3e", +"e%::::-141>>>> $9999<<>>@<>22#52#***+++0003,3,7e", +"ee:::::-1111>-199<<9<<@><<@77272******0003333,9e", +"ee45:::::-11111><<<<>@>><@@q2q7###+++**0333333ee", +"eee5::::::-111--1>11>-@>@..+227##22+++*033,3,<ee", +"eee455:5555------1-1>@@@...22222222++**33,,,3eee", +"eeee5555555555-11-1><<>@..2.2.2.772+**33,,,,&eee", +"eeee%#555-5555--@@><<<>@-.q2.22222+***3333,7eeee", +"eeeee1#555--555--@@@>@.7.7q22###2#***3333,,eeeee", +"eeeeee.#555--555-....@@.7772####*****333,,6eeeee", +"eeeeeee-##55--55-......77772####*****33,,9eeeeee", +"eeeeeeee-*##555--....222.772###+****03,,6eeeeeee", +"eeeeeeeee1####5......2222222#2+*****3,3eeeeeeeee", +"eeeeeeeeee 2###55.77..2++##222+****3,0eeeeeeeeee", +"eeeeeeeeeeee@####2.772.+#####+++0033>eeeeeeeeeee", +"eeeeeeeeeeeeew@###2@@72+**#****330>eeeeeeeeeeeee", +"eeeeeeeeeeeeeeee>2##++q2#****0+79eeeeeeeeeeeeeee", +"eeeeeeeeeeeeeeeeeee$>@27722@>eeeeeeeeeeeeeeeeeee" +}; + +/* XPM */ +const char *internicon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 32 1", +" c #526f6b", +". c #2d4750", +"X c #226a98", +"o c #a7b7ae", +"O c #293233", +"+ c #53748a", +"@ c #44534e", +"# c #1c3848", +"$ c #112a39", +"% c #2e5263", +"& c #5d7a67", +"* c #688472", +"= c #688cae", +"- c #457fa9", +"; c #6f9383", +": c #144c6e", +"> c #506462", +", c #0e1419", +"< c #686c63", +"1 c #405c65", +"2 c #313d3f", +"3 c #151e23", +"4 c #16425c", +"5 c #43667d", +"6 c #617f93", +"7 c #8f8d7a", +"8 c #3d4844", +"9 c #829e9a", +"0 c #7f7769", +"q c #212728", +"w c #575c58", +"e c None", +/* pixels */ +"eeeeeeeeeeeeeeeeeee@1 66+6>8eeeeeeeeeeeeeeeeeeee", +"eeeeeeeeeeeeeeee +6+5+6++5551.2Oeeeeeeeeeeeeeeee", +"eeeeeeeeeeeee>+6699+5+6++511%.282O3eeeeeeeeeeeee", +"eeeeeeeeeeee+669oo96555511..282222Oqeeeeeeeeeeee", +"eeeeeeeeee6669ooo6+5511%%...2222OOqqO3eeeeeeeeee", +"eeeeeeeee6==ooo96+55551%%..222OOOOqqOq,eeeeeeeee", +"eeeeeeee6=-=9==6++++551%%...2OOOOqq3qOq3eeeeeeee", +"eeeeeee-=======6++++5>>11%8882OOqqq33qq3,eeeeeee", +"eeeeeeX=======6+++5>>>>www@8822OOqq3qqq33,eeeeee", +"eeeeeX-======66+++>>>>>www@882OOOqqqqOq33,,eeeee", +"eeee%-=======6++++ <511ww@8882OOOqqq22qq,,,,eeee", +"eeeeX-=======6+++++ 5>>w@@@82222OOqO82qO33,,eeee", +"eeeXXX--=-===++++ <w@@@@8882222OOOOqOqq3,3eee", +"eeeXXX-=--==-++ <<>w@@@@8@82222OqO88OO2q,,eee", +"ee5X--=------+5511>>>1@@w@8@88222OOq2@8322q3,,ee", +"eeXXX------666 >>><<wwww@882#22OOO2@23q8Oq,,,ee", +"e%XXXXX---6* *&><>>>@@@.4.2##.2OOq2@qq82qq3,,3e", +"e:XXXXX-XX;* 5+++>%%%.444#.@8##2OOO2%288qqqO3,,e", +"eXXXXXXXXX5555+5%%%1..%%.%@@82$22OO2.2@OqOqq3,,e", +"eX=XXXXXXX++6*5%:%:%4%w@1@@@.2#.2O2.$q28OOqq3,,e", +"e--XXXXXX ;7*& ::::4:...@@@@8822O22q33qqqqq33,e", +"%XXXXXX-+ *;**;&%:::44444@@@@@822OqOO3q33qq33,,,", +":XXXXX-9;;;;;;;* 1% 1%:4%@@888.82OOOOqqq3qq33,,,", +"5XXXXX99;**;;**&& +*&&>1>@@@@8#.2O2$$qqqqqq3,,,,", +"5XXXX-99;;9;* &&> &&&&>..@@@82$##$$33qqqqq3,,,,", +"1XXXX6ooo99;* &* &&&&&>.4.8@888.2$$$33Oqqq3,,,,", +"%XXXX6ooo9;*&&&&&&>&& & @4%8888@88O$$$3qOq33,,,,", +"eX5+5677;;;**&&&&1>&&&& >.4.888@88O$$$qqOq333,,e", +"eX5++6*07***& &** &&& @#.28@@2$$$$$qqqq33,,,e", +"e%55X5*00<&&&**&*&&&&&& >>.4%8@2$$$$$qOqqqq3,,,e", +"e%::::5& > &*&&&**&&& >www#%8#$$$$$$OOqqq3,,,,e", +"e1:::::1>>>>>> &0000<<www<w2.#.2$$$$OOOq33,,3,,e", +"ee:::::%1111>%1<0<<0<w@w<<@88282$$$$$qq333,33,ee", +"ee%::::::%11>11><<<<wwww<w@2228#$##OOqq33333,,ee", +"eee::::::4%%11%%1>11>%@w@..O228##22OOq333,,3,,ee", +"eee.44::444%%%%%%1%1>@@@8..22222222OO$33,,,,,eee", +"eeee4444444444%11%1>www@%8282..8882$$$3,,,,,eeee", +"eeee$4444.44444%1@wwwww@%828..2222O$$333,,,,eeee", +"eeeee#4444%%444%%@@@w@8@882..####$$$3333,,,eeeee", +"eeeeee.4444%%444....8@@8@28###$$$$$$333,,,eeeeee", +"eeeeeee##444.%44%......8888##$$$$$$$333,,eeeeeee", +"eeeeeeee###44..%%.......8@82#$#O$$$q33,,eeeeeeee", +"eeeeeeeee####44.........22.2##O$$$$33,,eeeeeeeee", +"eeeeeeeeeeO.###4..8@8..OO##222q$$$q33,eeeeeeeeee", +"eeeeeeeeeeee.#####8@8..O#####OOOqq33,eeeeeeeeeee", +"eeeeeeeeeeeee2####2@@82$$$$$$$$qq3,eeeeeeeeeeeee", +"eeeeeeeeeeeeeeeeO##22222#$$$$qq33eeeeeeeeeeeeeee", +"eeeeeeeeeeeeeeeeeeeqqOO882q33eeeeeeeeeeeeeeeeeee" +}; + + + +/* XPM */ +const char *texticon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 128 2", +" c #c1ad96", +". c #b3a28e", +"X c #cdc4ba", +"o c #c6b9ac", +"O c #aaaaaa", +"+ c #645a4f", +"@ c #dddddd", +"# c #151613", +"$ c #696054", +"% c #d3d2d3", +"& c #4b4c4b", +"* c #747474", +"= c #f6f6f6", +"- c #faf9f9", +"; c #49433a", +": c #9a9a9a", +"> c #948473", +", c #c9b59c", +"< c Gray64", +"1 c #6e6e6d", +"2 c Gray70", +"3 c #bcbcbc", +"4 c #434342", +"5 c #cccccb", +"6 c #959595", +"7 c #597046", +"8 c Gray52", +"9 c #38322b", +"0 c Gray99", +"q c #5c5248", +"w c #c6b299", +"e c Gray95", +"r c #e4e4e3", +"t c #a89884", +"y c #7d7e7d", +"u c #555555", +"i c #9a8b79", +"p c #a39481", +"a c #eeeeee", +"s c Gray77", +"d c #3d3e3d", +"f c #7d7162", +"g c #bfac95", +"h c #74695b", +"j c #8b7d6c", +"k c #c1af99", +"l c #ac9c88", +"z c #544c42", +"x c #7a6e60", +"c c #a3b3a2", +"v c #d2cac1", +"b c #087106", +"n c #c3b098", +"m c #807464", +"M c #8b8b8b", +"N c #c4b29c", +"B c #b6a692", +"V c #bda991", +"C c #232422", +"Z c #323231", +"A c #c6b49e", +"S c #c1c1c0", +"D c #bead99", +"F c #94897c", +"G c #bdab94", +"H c #443e36", +"J c #807a72", +"K c #2d2924", +"L c #322d27", +"P c #093809", +"I c #2c2c2a", +"U c #e9e9e9", +"Y c #786c5e", +"T c #3c3935", +"R c #626261", +"E c #877a6a", +"W c #25201d", +"Q c #6f6457", +"! c #a1927f", +"~ c #c2b19c", +"^ c #c3ae96", +"/ c #726658", +"( c #2b2621", +") c #d7d5d3", +"_ c #968776", +"` c #9e9488", +"' c #40403f", +"] c #9e8f7d", +"[ c #c6b097", +"{ c #005000", +"} c #c1ac93", +"| c #dad8d6", +" . c #988a78", +".. c #beb7b1", +"X. c #bfa991", +"o. c #bbab96", +"O. c #272826", +"+. c #8f8171", +"@. c #8b7f70", +"#. c #1b1c1a", +"$. c #3b362f", +"%. c #1f211f", +"&. c #baa892", +"*. c #cebba3", +"=. c #6c6862", +"-. c #847767", +";. c #dedcd9", +":. c #363933", +">. c #ececeb", +",. c #e6e6e5", +"<. c #2c7f24", +"1. c #a0988f", +"2. c #aa9284", +"3. c #a9a197", +"4. c #908677", +"5. c #b09f8b", +"6. c #fbfbfb", +"7. c #b9a58e", +"8. c #dae1da", +"9. c #c0b2a2", +"0. c #484847", +"q. c #c7c6c6", +"w. c #b7afa5", +"e. c #737875", +"r. c #777777", +"t. c #7f7e73", +"y. c Gray0", +"u. c None", +/* pixels */ +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +": :.& 0.0.0.0.0.& & & 0.0.0.0.0.0.0.& & & & & & & & & & & & & 0.' a u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"1 6 = = = 0 u.u.u.u.u.u.u.u.- = = = - u.u.u.u.u.u.u.u.u.6.- - >.O.% u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"R O u.u.u.5 O : 6 6 6 6 6 : a u.u.u.e : 6 6 6 6 6 : O 5 u.u.u.- :.5 u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u 2 u.@ & u 6 < O O O O O & < u.u.u.q.O.< O O O O < 6 =.0.s u.= d s u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"& s r Z M 0 u.u.u.u.u.u.u.8 < a ,.= s & u.u.u.u.u.u.u.u.2 0.s u.d 3 u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"4 % =.8 u.u.u.u.u.u.u.a 5 1 =.@.> ` 4.J ;.- u.u.u.u.u.u.u.5 :.@ 0.2 u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"d 6 0.- u.u.u.u.u.6.q.+ z z z / .! ! _ E F ..;.- u.u.u.u.u.y 1 u 2 u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"Z ' M u.u.u.u.8.c t.q H 9 L W 9 Y _ t l i E -.E ` ) = u.u.u.,.0.4 O u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"#.d 8 2 3 | 2 :.$.H H K # %.#.C $.Q > t t ] E -.j i B w.) 6.u.& C O u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"I Z y I %.I #.# W ( W L =.1 : U 4 L Q +.i _ > i p 5.V 7.l v 0 8 %.2 u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"e e u.@ u #.#.P b 7 q q 1.y < u.,.I L $ m j l n g n n } v e - 0 u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.= q.y { b <.> h R u : - u.r 0.9 $ f l N w n k [ ^ v - u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.- 4 { b 7 2.Q I d =.O a 5 W q Y ! k w n g g n w X.o = u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.% # b 7 > t H I C O.' R O.z h p ~ A k g g w [ 7.X u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.r.L Q f l _ y y Z O.C O.Z ; x . *.*.n g n w 7.e u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.U L q Y .. s u.@ O 1 Z O.%.O.' $ 4.B , w n n w [ X.X u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.8 9 / _ ..u.u.u.% I K 9 C #.#.%.:.$ .7.w , , [ 7.r u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.>.T q +.D , v = u.% $.#.H + q H C # #.C :.+ @.7., w 9.= u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.2 L Q ] D n 9.r q.( y.L $ m . .$ $.#.# #.C Z $ i 5.X u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.0 y L + j l g &.F z 9 T + h E t N k ] Q T #.# #.O.T q 3 a u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.0 : L q f p g &.i Q q + $ x > 5.N *.*.n _ z I #.# #.d y e u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.L z h @.B . f $ $ $ Q -.! B N A A , w . +.z C & e.e u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.8 u T z $ E ] E Y Q Q / f > t o.N A N n n , , l 4.3.0 u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.O % K ; + x -.m f Y Y m j .5.D A A N g ^ w , V ;.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.3 ( ; + / x f m f f E +.! . k A A n g n } 9.- u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.3 H $.z $ h Y x x m E > p B ~ A A n g ^ X.| u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.3 O.K H q Q h h Y f E _ t B ~ A N k g g ^ ~ = u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.5 4 : & K ; + Q / h Y E i l o.N A N k g g n ^ v u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 0.u.= O K K z + $ Q h -.i l o.N A N G [ >.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 6.u.u.@ 4 #.H q + $ Q m i l o.N N n g G k ^ o 0 u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 - u.u.u.e 8 # K ; z q + m _ 5.D N N k G G n } X u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 - u.u.u.u.0 2 T # 9 ; z + f _ l D N ~ g G g ^ V % u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 - u.u.u.u.u.u.e M # #.$.; q Y +.l k ~ g g g V a u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.* : u.u.u.S ' - u.u.u.u.u.u.u.u.% R # ( $.q Y _ B N A , , k } X 0 u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.R O u.u.u.5 Z = u.u.u.u.u.u.u.u.u.0 s I # 9 q f i t ! ] ! B G , [ | u.", +"u.u.u.u.u.u.u.u.u.u.u.u.0 d s u.u.u.r O.a u.u.u.u.u.u.u.u.u.u.u.U 1 # 9 L #.# y.y.y.# ( ; m D = ", +"u.u.u.u.u.u.u.u.u.u.u.u.3 C e u.u.u.0 & 2 u.u.u.u.u.u.u.u.u.u.u.u.e O.y.y.y.y.y.y.y.y.y.y.y.( S ", +"u.u.u.u.u.u.u.0 ) q.3 8 ' 2 u.u.u.u.u.| u 8 3 q.) u.u.u.u.u.u.u.u.u.;.#.y.y.y.y.y.y.y.y.y.y.y.T ", +"u.u.u.u.u.u.u.;.# T ' u 2 ,.@ @ @ @ @ r s R 4 T # S u.u.u.u.u.u.u.u.u.) Z y.y.y.y.y.y.y.y.y.Z q.", +"u.u.u.u.u.u.u.U 1 1 * y * 1 1 1 1 1 1 1 * y * 1 R % u.u.u.u.u.u.u.u.u.u.e O 1 Z # # # d * S = u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u." +}; + +/* XPM */ +const char *texticon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 128 2", +" c #5a534a", +". c Gray35", +"X c #6a6153", +"o c Gray77", +"O c #49443a", +"+ c #acacac", +"@ c #9c8d7b", +"# c Gray71", +"$ c #645b4f", +"% c #938573", +"& c #b3a28d", +"* c Gray42", +"= c #cfbaa2", +"- c #897d6c", +"; c #979797", +": c #a59582", +"> c #554e44", +", c #aa9a86", +"< c #cacaca", +"1 c Gray70", +"2 c Gray72", +"3 c #36312b", +"4 c #e9e9e9", +"5 c #7d7162", +"6 c #bfac95", +"7 c #bebebe", +"8 c #c9b69e", +"9 c #727272", +"0 c #817464", +"q c Gray55", +"w c #0b4d09", +"e c #b5a490", +"r c #057905", +"t c #2d2e2d", +"y c #75695b", +"u c #1a1c1b", +"i c Gray23", +"p c #a4a4a4", +"a c Gray26", +"s c gainsboro", +"d c #c5b39d", +"f c #0b0b0a", +"g c #141413", +"h c Gray47", +"j c Gray38", +"k c #222422", +"l c Gray29", +"z c #a0917e", +"x c #2e2a25", +"c c #c2af98", +"v c #433e37", +"b c #bca991", +"n c #ad9d88", +"m c #3d3a34", +"M c #c1af99", +"N c #312d27", +"B c #716c64", +"V c #092708", +"C c #25221e", +"Z c #71675a", +"A c #bcaa94", +"S c #2e312a", +"D c #d5d5d5", +"F c #333332", +"G c #c4b098", +"H c #c6b49e", +"J c #908272", +"K c Gray1", +"L c #c2ae97", +"P c #c6b098", +"I c Gray50", +"U c #786d5e", +"Y c #bead98", +"T c #baa995", +"R c #86796a", +"E c #c0ac95", +"W c #c8b299", +"Q c #c0ae96", +"! c #c5b29b", +"~ c #c0ad96", +"^ c #c6b39b", +"/ c #9e8f7d", +"( c #9a8b78", +") c #c5af97", +"_ c Gray51", +"` c #cdb69d", +"' c #50483e", +"] c #c2b19c", +"[ c #201e1b", +"{ c #cab49b", +"} c #2c2622", +"| c #c6b199", +" . c #c4b19a", +".. c #171918", +"X. c #262725", +"o. c #c5b098", +"O. c #1d1a16", +"+. c #0b120c", +"@. c #12100f", +"#. c #8e806f", +"$. c #171615", +"%. c #202220", +"&. c #282a28", +"*. c #0e0e0e", +"=. c #837767", +"-. c #080706", +";. c #080908", +":. c #978676", +">. c #988977", +",. c #a0a0a0", +"<. c #060606", +"1. c #957e73", +"2. c #4b813b", +"3. c #b8a793", +"4. c #514a42", +"5. c #2f4a24", +"6. c #bfb2a3", +"7. c #6e6456", +"8. c #a89885", +"9. c #7e7b79", +"0. c #676867", +"q. c #bca792", +"w. c #817f65", +"e. c #373835", +"r. c #3d362f", +"t. c #8c7e6e", +"y. c #b0a08b", +"u. c None", +/* pixels */ +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"0.< 1 2 2 2 2 2 # 1 1 # 2 2 2 2 2 # # # # # # # # # 1 1 1 1 1 < 9 u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"; 0.f f ;.<.u.u.u.u.u.u.u.u.-.;.;.;.K u.u.u.u.u.u.u.u.K <.<.<.. p u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"; . u.u.u...l 0.* * * * * u.u.u.u.g j * * * * * j i f u.u.u.l p u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"p l u.[ ; + q I h h h h h D t u.u.u.j 7 h h h h h I q ,.I ;.u.a + u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"1 i *.o q f u.u.u.u.u.u.u.+ &.K <.u. * u.u.u.u.u.u.u.g ; ; K e.# K u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"2 F ; _ u.u.u.u.u.u.u.K g 9.4. Z > Z > K u.u.u.u.u.u.u.u.q h &.7 <.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"o 9 < f u.u.u.u.u.u.g v > O 0 z : ( 0 X v u <.u.u.u.u.u.*.o j 7 ;.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"< # 9 u.u.u.u.<.+.x ' r.3 x ' R / , : % - t.7.x <.u.u.u.u.q + 2 f u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"s 2 t u.K u.f S O 4.' N g @.<.O. =.z n 8.J R - % 5 m $.K u.l o < *.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"4 2 %.%.X.&.[ C } } } C [ h &.@.C > =.@ / >.#.J / & 6 , y f K s 4 *.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"l a K f k k [ V w O r.O.u.+ k u.g C > 5 - J , b A A c | o.#.@.X.a K u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.<.g u w r 2.1.O X.,.X.u.K ..C 4.Z t.3.^ W Q ~ c G ` J ;.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.K V r r w.:.v F &.[ f u.@.r.$ 5 , ! .c 6 6 ~ | { :.@.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.*.w r 7.z - %.t S F k u 3 0 , ! .L 6 6 6 G | P % f u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.<.+.5.Z R n B e.S &.&.&.S O Z z 8 8 G ~ 6 ~ L | ) ) v u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.g 3 7.5 : 6.[ g k S &.X.X.S > J 3.8 8 c Q ~ G | o.( <.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.K C y / T g u.u.;.e.i &.%.u k F - e | { | | o.P 4.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.f r.7.z 8 U f u.u.a [ O m X.....%.e.$ - & { ` W b u u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.K [ > #.A ` #.u u.F m @.' Z U $ m %...u k F X @ b ` J K u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.;.x $ J y.8 y. F [ -.v X 0 z e : Z 3 u ..u X.m $ ( N u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.<.x > 5 z Y 6 % 7.' ' $ y - , ] = Y J S ....u &.e.t g u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.-.C 4.y :.3.M ( 7. $ X 5 >.& ] 8 = 8 e 5 O %.g &.0.F u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.. 3 ' 7.=.y.: 5 X X X Z - : T d H ^ ! { G : $ O * &.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.+ t ..' $ 0 J R U Z Z U 0 % n Y H H .Q Q ^ ` b & v u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 u u.C ' $ U 0 5 5 U 5 =.t.@ y.Y H H .Q 6 L | | / f u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 t u.<.} O 7.U 5 5 5 0 - % z e ] H d .~ 6 L c | > u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.K [ 3 > X y U U U 0 R % 8.3.] H d c 6 6 L P y.f u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.u a } O 7.Z y U 5 - ( n T d H ! M 6 E c { u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.. . u.$.N ' $ 7.7.Z U t./ y.Y d H ! ~ 6 ~ | c u u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.9 u.u.f C r.> $ X 7.U t.z & Y H d G 6 6 c { R u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.<.$.x O $ $ Z - z y.M d ! M 6 ~ | W x u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.u.K f [ r.O > X R / e ] d ] ~ A ~ | n $.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.u.u.u.<.$.C r.O > X =./ e ] ! L A A ~ W : -.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.u.u.u.u.K @.O.x m O $ 0 ( T ] M ~ 6 6 E { > u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.K # i u.u.u.0._ u.u.u.u.u.u.u.u.u.;.g [ 3 v $ =.8.Y d H 8 ^ E ) & @.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.;.< t u.u.u.j q u.u.u.u.u.u.u.u.u.u.<.@.$.} v X % , 8.: : n A { = - K u.", +"u.u.u.u.u.u.u.u.u.u.u.u.$.s ..u.u.u.l p u.u.u.u.u.u.u.u.u.u.u.u.<.$.x v 3 C f -.<.;.C ' 5 q.N u.", +"u.u.u.u.u.u.u.u.u.u.u.u.. o K u.u.u.u D $.u.u.u.u.u.u.u.u.u.u.u.u.<.$.;.u.u.u.u.u.u.u.u.u.O.4.K ", +"u.u.u.u.u.u.u.u.*.g %.j o l u.u.u.u.u.9 + a ..g <.u.u.u.u.u.u.u.u.u.;.u.u.u.u.u.u.u.u.u.u.u.u.f ", +"u.u.u.u.u.u.u.F D 7 7 + a K f f f f f K . + 7 o 1 <.u.u.u.u.u.u.u.u.K f K u.u.u.u.u.u.u.u.K ;.<.", +"u.u.u.u.u.u.u.i s o 7 1 + 2 2 2 2 2 2 2 + # 7 < < ;.u.u.u.u.u.u.u.u.u.u.f *.-.K u.u.K -.*.f u.u.", +"u.u.u.u.u.u.u.K *.g g g $.$.$.$.$.$.$.$.$.g g g f u.u.u.u.u.u.u.u.u.u.u.u.u.<.-.<.<.-.K u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u." +}; +/* XPM */ +const char *twodicon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 128 2", +" c #959292", +". c #6d6a6a", +"X c #797575", +"o c #eae9e8", +"O c #a4a1a1", +"+ c #c1bfbf", +"@ c #6a6767", +"# c #bcbaba", +"$ c #070808", +"% c #8c8989", +"& c #555352", +"* c #acaaa9", +"= c #585555", +"- c #9e9b9b", +"; c #b2afaf", +": c #383736", +"> c #5c5959", +", c #656161", +"< c #a9a6a6", +"1 c #615e5d", +"2 c #222121", +"3 c #817e7e", +"4 c #121211", +"5 c #2a2929", +"6 c #e2e0e0", +"7 c #4c4a4a", +"8 c #e0dede", +"9 c #b8b5b5", +"0 c #262525", +"q c #494646", +"w c #878383", +"e c #1d1d1d", +"r c #3c3b3a", +"t c #918d8e", +"y c #c6c4c4", +"u c #191918", +"i c #aeacac", +"p c #7c7979", +"a c #898686", +"s c #444242", +"d c #2d2c2c", +"f c #3f3d3c", +"g c #747171", +"h c #302e2e", +"j c #151515", +"k c #323130", +"l c #514e4e", +"z c #363434", +"x c #4e4c4b", +"c c #3f3e3d", +"v c #3a3838", +"b c #343232", +"n c #434140", +"m c #2c2b2b", +"M c #e5e4e4", +"N c #999696", +"B c #848181", +"V c #1c1b1b", +"C c #c8c6c6", +"Z c #e7e6e6", +"A c #f4f3f3", +"S c #474444", +"D c #cbc9c9", +"F c #fbfbfb", +"G c #fafaf9", +"H c #f0eeee", +"J c #5f5c5b", +"K c #dbd9d9", +"L c #878585", +"P c #736f6f", +"I c #d7d5d5", +"U c #42403f", +"Y c #e5e3e3", +"T c #7e7b7b", +"R c #706d6d", +"E c #625f5e", +"W c Gray95", +"Q c #575454", +"! c #d0cdcd", +"~ c #b7b4b4", +"^ c #dcdada", +"/ c #535150", +"( c #d2d0cf", +") c #7b7878", +"_ c #cccaca", +"` c #353433", +"' c #272626", +"] c #f2f1f0", +"[ c #757272", +"{ c #676463", +"} c #b5b3b3", +"| c #cecccb", +" . c #dedcdb", +".. c #242423", +"X. c #d5d3d3", +"o. c #31302f", +"O. c #cac8c7", +"+. c #52504f", +"@. c #777373", +"#. c #5f5c5c", +"$. c #aba8a8", +"%. c #d8d6d6", +"&. c #b3b0b0", +"*. c #7f7c7c", +"=. c #4b4848", +"-. c #9b9797", +";. c #4a4847", +":. c #464443", +">. c #d3d1d1", +",. c #dad8d7", +"<. c #636060", +"1. c #939090", +"2. c #999695", +"3. c #eeeded", +"4. c #5a5756", +"5. c #ecebeb", +"6. c #838080", +"7. c #6f6c6c", +"8. c #989494", +"9. c #8b8888", +"0. c #bab8b7", +"q. c #a19e9e", +"w. c #5b5958", +"e. c #f7f6f6", +"r. c #8e8b8b", +"t. c #1f1f1e", +"y. c #716e6e", +"u. c None", +/* pixels */ +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.9 p = s v 7 J L y u.u.u.u.u.u.u.( > q & 1 . g g y.{ 1 > x q q & { t C u.u.u.u.u.u.u.", +"u.u.u.u.O k 4 : @ 3 9.X <.m 4 v C u.u.u.u.u.& : p . E & q q =.> { R p 3 *.. Q ..4 h O u.u.u.u.u.", +"u.u.u.P j / C W _ < O } 6 u.&.;.u 3 u.u.u.u.S & D | ! G u.u.u.u.; 8.a O D u.u.i > t.x 8 u.u.u.", +"u.u.r.$ O u.a m 4 u e j 4 & O.u.P $ i u.u.u.O e 4 4 4 5 ! u.] x 4 ' 5 ..V 4 e , X.u.; ..r A u.u.", +"u.~ $ u.: ..T y Y M K $.S $ u.P o.F u.u.u.Y _ _ C S & u.; $ # H A 5.M C U 4 = u.Z d 7 u.u.", +"u.+.h u.7 ` K u.u.u.u.u.u.u.X 2 ( H ..w u.u.u.u.u.u.u.B : u.N u 5.u.u.u.u.u.u.u. ' J u.+ $ L u.", +"H 5 1.u.$ s o u.u.u.u.u.u.u.u.q E u.Q ` u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.I u y.u.R ..W ", +"6 ' K F <.0 +.G u.u.u.u.u.u.u.w o.u.@.5 e.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.[ j Y W 5 < ", +"6 ' I u.u.D ' Y u.u.u.u.u.u.u. 0 u.p 5 A u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.^ u u./ <.", +"A m #.u.u.9 ' o u.u.u.u.u.u.u.{ s u.P m G u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.4.4.u.3 s ", +"u.L 4 4.{ 5 { u.u.u.u.u.u.u.D ..-.u.q U u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.L s u.i ` ", +"u.u.~ 4.+.% u.u.u.u.u.u.6 #.4 & u. .u < u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.* : F %.5 ", +"u.u.u.u.u.u.u.u.u.Z -.7 2 ` *.u.o s S u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.+ o.] M ' ", +"u.u.u.u.u.u.u.X.) ..j c 2.u.u.; 5 2 >.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.C h H Z 5 ", +"u.u.u.u.u.%.S j h a .u.u.% ` 4 #.,.u.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.y h H Z 5 ", +"u.u.u.u.X ..c u.u.< & 5 ' +.i u.u.u.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.~ b A 6 ' ", +"u.u.u.E $ ) u.A a 5 4 : 3 3.u.u.u.u.u.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.- r u._ 5 ", +"u.G 1 ..| K Q 2 r p C u.u.u.u.i :.: E X.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.[ 7 u.- r ", +"u.% $ # 9 ' r O u.u.u.u.u.u.I t.c > ..5 Z u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.c . u.. x ", +"W ..@ ( 4 7 R 4.{ C u.u.u.u.B c u.u.Y t.X u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.} $ # u.U X ", +"q.d u.1 $ 2 z n ` 2 s O.u.u.r.o.+ O.*.S u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.;.d u.+ 2 D ", +"J 4.u.` h } u.u.u.+ : 2 $.u.o k 4 $ E ; r G u.u.u.u.u.w z u.2.e Z u.u.u.u.u.u.u.u.O 4 ; u.: f u.", +"r T F 7.N p . t Z u.u.. u J ^ u.>.q , i c G u.u.u.u.u.T r u.- j o u.u.u.u.u.u.o . u r.u.w 4 9 u.", +"z w u.r.4 5 h u 5 O u.u.i 2 t.X @ u + T q u.u.+ < D I f <.u.C 4 X C K 8 ( i p d u w u.# 4 t u.u.", +"n g u., $ B F ^ P 4 v M u.M L U q O H e T u.1.4 4 4 4 h ,.u.u.N t.4 4 4 4 4 k 6.] u.) $ . u.u.u.", +"@.r u.u.& z u.u.u.; f d 8.u.u.u.u.u.x e 8 u.:.@ A C # u.u.u.u.u.F | # 9 + M u.3. s 2 @.u.u.u.u.", +"I u > 0.n : u.u.u.u.u.+.$ 7 N + O =.V &.u.u.= : X [ @ J 7 q 7 w.<.. X ) X @ l e u U ! u.u.u.u.u.", +"u.* c o.U ~ u.u.u.u.u.u.+ > v h : = ! u.u.u.^ { / Q > <.R g R , J 4.& / & = @ - .u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u." +}; + +/* XPM */ +const char *twodicon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 128 2", +" c #868282", +". c #b8b6b6", +"X c #757272", +"o c #918d8e", +"O c #adaaaa", +"+ c #7d7a7a", +"@ c #a29f9f", +"# c #8a8787", +"$ c #cdcaca", +"% c #605d5d", +"& c #bebcbc", +"* c #6a6666", +"= c #a8a5a5", +"- c #dad8d8", +"; c #555252", +": c #989595", +"> c #3f3d3c", +", c #595656", +"< c #eae9e9", +"1 c #514e4d", +"2 c #d3d0d0", +"3 c #4d4a4a", +"4 c #5c5a59", +"5 c #222121", +"6 c #6e6b6b", +"7 c #e3e1e1", +"8 c #a4a1a1", +"9 c #969393", +"0 c #9d9999", +"q c #b1aeae", +"w c #0f0f0e", +"e c #2d2c2c", +"r c #151515", +"t c #181818", +"y c #b3b1b1", +"u c #9f9b9b", +"i c #111111", +"p c #939091", +"a c #484645", +"s c #b5b2b2", +"d c #1d1d1d", +"f c #040404", +"g c #272626", +"h c #535050", +"j c #636060", +"k c #787474", +"l c #c9c7c7", +"z c #343232", +"x c #575454", +"c c #393736", +"v c #2f2e2d", +"b c #434140", +"n c #323130", +"m c #2c2b2a", +"M c #2a2929", +"N c #3a3838", +"B c Gray3", +"V c #454242", +"C c #3f3e3d", +"Z c #3c3a39", +"A c #a3a0a0", +"S c #4e4c4b", +"D c #d0cdcd", +"F c #dddbdb", +"G c #42403f", +"H c #8e8b8b", +"J c #e0dedd", +"K c #201f1f", +"L c #736f6f", +"P c #5f5c5c", +"I c #7a7777", +"U c #c3c1c1", +"Y c #4b4948", +"T c #6c6969", +"R c #373535", +"E c #cecccc", +"W c #706d6c", +"Q c #bab8b8", +"! c #676463", +"~ c #dedddd", +"^ c #c7c5c5", +"/ c #afacac", +"( c #e8e6e6", +") c #1b1b1a", +"_ c #6b6868", +"` c #bdbbbb", +"' c #838080", +"] c #d6d4d4", +"[ c #0b0b0b", +"{ c #c2c0bf", +"} c #31302f", +"| c #4b4847", +" . c #a6a4a3", +".. c #7b7878", +"X. c #474544", +"o. c #797676", +"O. c #c0bebe", +"+. c #292827", +"@. c #fafaf9", +"#. c #5a5857", +"$. c #d5d3d3", +"%. c #e5e3e3", +"&. c #edebeb", +"*. c #20201f", +"=. c #8b8787", +"-. c #cac8c8", +";. c #b7b5b4", +":. c #c5c4c3", +">. c #c4c2c2", +",. c #8f8c8b", +"<. c #f0efef", +"1. c #e1e0df", +"2. c #7f7c7c", +"3. c #282727", +"4. c #716e6e", +"5. c #878585", +"6. c #5b5958", +"7. c #716e6d", +"8. c #efeded", +"9. c #4f4c4c", +"0. c #83807f", +"q. c #d1cfcf", +"w. c #807d7d", +"e. c #d8d5d5", +"r. c #e6e5e5", +"t. c #353333", +"y. c #464443", +"u. c None", +/* pixels */ +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.m h k o u W Y 5 u.u.u.u.u.u.u.) 4.=...6 j #.6.4 * 6 L ' =.# I ! V 5 u.u.u.u.u.u.u.", +"u.u.u.u.R = 7 A j 1 a x _ s 1.u 5 u.u.u.u.u.I A ; % T + =.=.5.4.! P ; 1 h j k U 7 / c u.u.u.u.u.", +"u.u.u.4 - + 5 f K t.R e i u.v # 2 1 u.u.u.u.H I K d d f u.u.u.u.v G | G c K u.u.n L $ ' r u.u.u.", +"u.u.X.( R u.| s J 2 E - J ..*.u.4 &.} u.u.u.R $ F F F . d u.f ' F & . U q.~ $ * t u.v O.u f u.u.", +"u.m <.G u.8 U h 5 i w r z H ( G u.4 O u.u.u.u.i K K 5 H I u.v &.+.B f [ w 5 G p %.k u.w y ' u.u.", +"u.2./ u. = r u.u.u.u.u.u.u.x ^ ) B U Y u.u.u.u.u.u.u.S A u.> 2 [ u.u.u.u.u.u.u.G & 7.u.g <.Y u.", +"B Q b u.< o [ u.u.u.u.u.u.u.u.# T u.o.= u.u.u.u.u.u.u.S 8 u.> D w u.u.u.u.u.u.u.u.t e.P u.P O.f ", +"i ` r u._ & 2.f u.u.u.u.u.u.u.3 O u., . f u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u., - i f ;.t.", +"i & t u.u.K & i u.u.u.u.u.u.u.G & u.h . f u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.r ] G u.+ _ ", +"f s 6 u.u.m & [ u.u.u.u.u.u.u.! o u.4 s f u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.X X u.1 o ", +"u.Y J X * . ! u.u.u.u.u.u.u.K { > u.# 9 u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.Y o u.} = ", +"u.u.m X + a u.u.u.u.u.u.i 6 F I u.r 2 t.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.n A u.t Q ", +"u.u.u.u.u.u.u.u.u.w > :.= 1 u.[ o H u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.g O f w ` ", +"u.u.u.u.u.u.u.t ; U - : C u.u.v . ^ ) u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.5 q B w Q ", +"u.u.u.u.u.t H - q | r u.u.X.= 7 6 t u.u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.5 q B w Q ", +"u.u.u.u.x { 9 G u.u.t...Q ` + n u.u.u.u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.m = f i ` ", +"u.u.u.T ( ; u.f | . ~ @ 1 B u.u.u.u.u.u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.Z 0 u.K . ", +"u.f 6 O.d r o.^ 0 ; 5 u.u.u.u.} ,.8 T ) u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u., ' u.Z u ", +"u.a @.+.m & u c u.u.u.u.u.u.t -.9 L U Q w u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.: % u.% 0.", +"f { j ) J ' P X ! 5 u.u.u.u.S 9 u.u.i l x u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.e 8.3.u.p ; ", +"N y u.6 @.>. .p = ^ o *.u.u.y.O g G *.h H u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.# y u.g l K ", +"W X u.= q e u.u.u.g 8 ^ z u.[ O F &.T v 0 f u.u.u.u.u.3 8 u.C E w u.u.u.u.u.u.u.u.c 7 v u.@ : u.", +"0 h u.P > ; % V w u.u.% 2 W r u.) =.* } : f u.u.u.u.u.h 0 u.Z - [ u.u.u.u.u.u.[ % $.X.u.3 1.M u.", +" .Y u.X.%.;.q $.Q c u.u.} :.$ , j $.g h # u.u.g t.K t : * u.5 %.x 5 r r ) n h y ] Y u.+.~ V u.u.", +"p #.u.* @.S u.r 4 r.u w u.w Y p =.R B E h u.b J F F ~ / t u.u.> -.F F F ~ J O 9.f u.; < j u.u.u.", +", 0 u.u.I .u.u.u.v : y C u.u.u.u.u.' E i u.,.j f 5 3.u.u.u.u.u.u.d +.m g w u.B G o >., u.u.u.u.", +"t ] L M p @ u.u.u.u.u.+ ( > g c 5.D v u.u.k 8 , , j W =. L * % x ; ; j w.E ] p d u.u.u.u.u.", +"u.n : O p m u.u.u.u.u.u.g L u / @ k d u.u.u.r ! + o.L _ P #.P * W X + + + k j Z r u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.", +"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u." +}; + +/* XPM */ +const char * threedicon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 16 1", +" c #a2a5a5", +". c #f3f2f2", +"X c #cccbc9", +"o c #5d5257", +"O c #904857", +"+ c #b3b2af", +"@ c #8e9393", +"# c #c3c4bf", +"$ c #b5838c", +"% c #dad7d7", +"& c #697377", +"* c #bcbcb8", +"= c #dac0c5", +"- c #7f8184", +"; c #e4e4e4", +": c None", +/* pixels */ +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::;+ @@+%:::::::::::::::::::::::::::::::", +"::::::::.#-&--&o&-X:::::::::::::::::::::::::::::", +":::::::;@ &&--o--&& .:::::::::::::::::::::::::::", +":::::::o@ --&&&--%::::::::::::::::::::::::::", +"::::::+o +++*+@&@ -.:::::::::::::::::::::::::", +"::::::@@ +++** @:::::::::::::::::::::::::", +"::::::+ +*++++*+ &#::::::::::::::::::::::::", +"::::::.# #..:;#+++++@--&.::.;:::::::::::::::::::", +"::::::::;::::::X++++@-&&%::%& .:::::::::::::::::", +"::::::::::::::::*+++ o X*::;&&&*.:::::::::::::::", +"::::::::::. @;::#+++++:;*::;&&&&-%::::::::::::::", +":::::.::::%+@&@%#**++.:X%::.-&&&&o-;::::::::::::", +"::X@-@@%:.**+ &@*****::+:::;*@&&-ooo .::::::::::", +":@&@@@- ;%+**++*****%;@;::.###+@-oooo-#.::::::::", +"#&++*+@-%;*+******#+$@;:::.X####+&ooo-@@%:::::::", +" @++++@@X:.#+**##***%:::::: +####*@oo@ @-+.:::::", +"* ++++@@%:::#**%:X&.::::::%&####*## @@@@@@@;::::", +"X+++++@@%:::.***%#&X::::::-@#********+ @@ -%:::", +"; +++*+@+:::.****+@@:::::;o #****++++++ + -.::", +":++++* +.:.****%#-.::::@@###*# @;*++++ +@&.:", +":;+++* @-@*****;.@;:::%-X###**-;:.#+++ @&-+:", +"::* ++*+ @-@*****;: %:::-*X#### ::::%++ @-@-&.", +"::: +++*++******.:*:::X %#####-.:::::#++++@-&OX", +":::.@-+*+*******;:.%:::@%X###X ::::::;++++ OOo+", +"::::.@& +*******.:.:::X+%#####-;::::::.*++++-&- ", +"::::::#&o- $$$%:::::@%####X :::::::.***++ +@", +":::::::.+OOOOOO$.::.% +%#####-.:::::::.*****+ @ ", +":::::::::.;====.:.@--&X####X *::::::::.*****+@ +", +":::::::::::::::::*++ @#####*@:::::::::;***** @@*", +"::::::::::::::::*&+#**#####*#:::::::::X###***++%", +"::::::::::::::::&o #****###%*;:::::::;#####*##*.", +"::::::::::::::::.* +******X+@- ;.::;#######* X:", +"::::::::::::::::::;+ +****# @@@-o--@*######*++.:", +"::::::::::::::::::::X ****#+@-oo&@#X#####*+ %::", +":::::::::::::::::::::.+@+***##*++*X######*@@ :::", +":::::::::::::::::::::::%@@+***###########$O&;:::", +"::::::::::::::::::::::::.+- +##*######X*$OO=::::", +"::::::::::::::::::::::::::;#-- *###X#*$OOO%:::::", +"::::::::::::::::::::::::::::; oo-$ $$OOO$.::::::", +"::::::::::::::::::::::::::::::.X $OO$$=;::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::", +"::::::::::::::::::::::::::::::::::::::::::::::::" +}; + +/* XPM */ +const char *threedicon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 64 1", +" c #9b495a", +". c Gray99", +"X c #728b91", +"o c #abaaa6", +"O c #dbabb3", +"+ c #4e4f4f", +"@ c #c1c2bd", +"# c #92a9b0", +"$ c #9b9996", +"% c #0d0c0c", +"& c #b9bab5", +"* c #bdbdb8", +"= c #2d2d2c", +"- c #ac7881", +"; c #b2b2ae", +": c #c4c5c0", +"> c #b09598", +", c #7d7679", +"< c #b5b4b0", +"1 c #b8a4a8", +"2 c #dbdbd8", +"3 c #848687", +"4 c #6a6968", +"5 c #82989d", +"6 c #637e84", +"7 c #6b323e", +"8 c #c9cac5", +"9 c #89a0a5", +"0 c #5c7276", +"q c #b9b6b3", +"w c #7a414d", +"e c #403a3c", +"r c #ffccdd", +"t c #69757a", +"y c #c5c8c2", +"u c #bfbfba", +"i c #b7b8b3", +"p c #a2a19e", +"a c #8f8d8a", +"s c #eae9e9", +"d c #a1a9ae", +"f c #7b5960", +"g c #c7c6c2", +"h c #706b6b", +"j c #979391", +"k c #cecdc9", +"l c #83807f", +"z c #afafaa", +"x c #261317", +"c c #727f83", +"v c #828e91", +"b c #7a6c70", +"n c #a3b4b5", +"m c #72716f", +"M c Gray10", +"N c #36191f", +"B c #b4aab6", +"V c #fd87a5", +"C c #5a5758", +"Z c #91b5bc", +"A c #484645", +"S c #918a8e", +"D c #616162", +"F c None", +/* pixels */ +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFM=+CA=MFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFM6X6XX60,+=FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFF%vZ66X6Dcv6t+%FFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFF+9d$pd93vt6t5,MFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFF=mpoooz<&zvt5#dl%FFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFCpoooz;;<iio##d#4FFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFF4<ooo$pqi<i&<dZ#3=FFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFMmz,M%%ej*qqqn5XXDFFF%MFFFFFFFFFFFFFFFFFFF", +"FFFFFFFF=%FFFF%,&<<<9X,,MFF3cAMFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFF%;i<<pf12=Fe266te%FFFFFFFFFFFFFFF", +"FFFFFFFFFFM4AMFFj&<<zq.s=Fks660t4=FFFFFFFFFFFFFF", +"FFFFFFFFFFpu$he=p*&qq..2M%.sX00t,DCMFFFFFFFFFFFF", +"FF=e+,b=FM@*;pmju**&u..jFFs2&960,CADA%FFFFFFFFFF", +"FAlj$jadMm@ii;<*&*uu2s$%FF;k@g<v,CeeCce%FFFFFFFF", +"=lz<&oajAA&*i&&q&*@q>h%FFFMp:@::obee+X5mMFFFFFFF", +"Dpzz<za$eFM$u&&g@&<C=%FFFFFC*@@@:*S+CX99vA%FFFFF", +"azoz<;jpeFF%$u&2.kD%FFFFFFMly@@@uu:ov595954MFFFF", +"liz;;ij$AFFF=:*&2:,MFFFFFF+$yuuuuu***;9999zSMFFF", +"eiz;<uqpX%FFM*u*&;$+FFFFFMho:uuu*iu&<<zd9dB#c%FF", +"%oq;<&p#n0%F=@u**2:,%FFFFApg@uu@z+A;&;zzod#Z9CFF", +"FA*;<qop#9cel@**&2.aMFFFMak:@@u@l%FM3izoodZXcv=F", +"FFl;<q&;p5,j@***&2.$MFFFCg8::@:;eFFFFD<ooo$c5XD%", +"FF%3zqqqq<<*&&*&*..$FFFMo2::::83%FFFFFl<zoo9c,f=", +"FFFM3j;&qq&ii&&&2..AFFFm28yg:8<eFFFFFF=&;zzpfwfe", +"FFFF%Alp<**&&uuOs.:FFFM@2:ygg8l%FFFFFFMii<<;,ha+", +"FFFFFF=Dh->11>-Vrg%FFFm2g:yykzeFFFFFFFMi*&iipp;m", +"FFFFFFF%=7w -f%FM=A<2@::yg,%FFFFFFFM&*&&&zpp4", +"FFFFFFFFFF%NNNx%FMl3S,8:@@:8z=FFFFFFFFe:u**&o$oC", +"FFFFFFFFFFFFFFFFF1O1pjg@@@:@mFFFFFFFFFD8@u*uoj$A", +"FFFFFFFFFFFFFFFF=,1guu@@@@:kAFFFFFFFFFzy@@uui<u=", +"FFFFFFFFFFFFFFFFDho@uuuu@uy2vMFFFFFFF+k::@@u@8;%", +"FFFFFFFFFFFFFFFF%Cpq*u*uuu8n5X+MFFF%C8y::@:ipzAF", +"FFFFFFFFFFFFFFFFFF=lo&uu**:ovv$3Ae+a88::@@@&<z%F", +"FFFFFFFFFFFFFFFFFFF%A$;*u**uq$,fwh$yy:::@@ioqAFF", +"FFFFFFFFFFFFFFFFFFFFFM4p;uu*u:*;zu8y:::@:*jj,FFF", +"FFFFFFFFFFFFFFFFFFFFFFF=mjquuuu::::::::y:-fbMFFF", +"FFFFFFFFFFFFFFFFFFFFFFFF%el;q@@u@@@::y8*- xFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFMCljo*:yy8yu> xFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFM=+f->>>- 7%FFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF%%N7ww77N%FFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; + +/* XPM */ +const char *joyicon[] = { +/* columns rows colors chars-per-pixel */ +"48 48 64 1", +" c #e7e4e5", +". c #8a898f", +"X c #4d4c5c", +"o c #7b7a8a", +"O c #1c1b2b", +"+ c #680a0f", +"@ c #575564", +"# c #cfd8ef", +"$ c #282535", +"% c #6b6a7c", +"& c #383648", +"* c #8c0101", +"= c #dbdbde", +"- c #bdbcc2", +"; c #dca9a8", +": c #c4c8da", +"> c #2b1625", +", c #fefefe", +"< c #c6c7ca", +"1 c #f3f2f4", +"2 c #ececee", +"3 c #0c0916", +"4 c #151322", +"5 c #cc0505", +"6 c #801115", +"7 c #a4a4aa", +"8 c #f8f8f8", +"9 c #a50000", +"0 c #ea1515", +"q c #dee6f8", +"w c #171625", +"e c #ecf2ff", +"r c #ababb2", +"t c #932c2d", +"y c #727180", +"u c #f5e9e9", +"i c #a25757", +"p c #413f4f", +"a c #2e2b3c", +"s c #656372", +"d c #95959e", +"f c #5e5d6e", +"g c #1b1928", +"h c #f62020", +"j c #222030", +"k c #41111c", +"l c #333142", +"z c #161b2b", +"x c #12101e", +"c c #191727", +"v c #ac97a6", +"b c #fbfbfb", +"n c #f9fafe", +"m c #73515a", +"M c #eacac9", +"N c #b1b0bc", +"B c #bea6a8", +"V c #ac8a8a", +"C c #bcc0d4", +"Z c #d0d0d6", +"A c #1f1d2d", +"S c #ff4545", +"D c #b93939", +"F c None", +/* pixels */ +"FFFFFFFFFFFFF i6t;,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFF *9959;FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF,i95h555uFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF1690Sh00;FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF8t950hh5MFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFB+9555DbFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFF,V+**tuFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFF, Bv=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFF8:qbFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFF,:q1FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFF=#2FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFF2:q,FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFbCq8FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFZ#1FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFF #2FFFFFFF81bFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFF8Cq,FFb -.paX<,FFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFF,:q=-.X>+***kg7,FFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFb <dqoxcz+999**>4d,FFFFFFFFFFFFFF", +"FFFFFFFFFFF,2<.X$4a#rcOzk*****>OcobFFFFFFFFFFFFF", +"FFFFFFF,2<d@$c4ccw4N#$4cc>+++kAAO4y8FFFFFFFFFFFF", +"FFF,2<dmkk>4www4443oe@3wwwzzwwgOOO4s8FFFFFFFFFFF", +"Fb7Xj>*999*kwcccccxped344cggccccOOgxs1FFFFFFFFFF", +",s3x4k99***+gcwwwwxgZZc3xwcgcggggOOg4X2FFFFFFFFF", +"734w4k*****+zc44xxx3dn&cAOwcccccggOOgxp FFFFFFFF", +"XA4wxxk+66kOOOAgwAg4lfc4gjAwcccccggOAO4a FFFFFFF", +"pAO4cxxx44wwgOAAA$j4c4334l&OccccwccgOAAcaZFFFFFF", +"7xjwcgcc4444wcOOAjAg$l&jcp@lOccwwwccgOAjg$=FFFFF", +"1jAA4OOOOgc444wgOAjApdNo&pfpAOOOgcwccOOAjA$<FFFF", +"Fr3jwcOOOOOgc44wgOAjpNq7@pljAjjjjjAOOOOAj$jj-,FF", +"Fb&cAwOAOOOOgcwwwc$lps%p$AOAAOOOOAAAAjjjj$$$$7,F", +"FF<3jgcAOOOOOggcccl&l&OcOgcwwwcgOAAAAAjj$$$$$aNF", +"FF,@4jwOAOggggggc$p$&&cw4wwcgOOOOOOAAAjjjAgwwlp=", +"FFF=3jOcAOgcccccc&aO&j4cggggggggggOAOOg4xxwA$lpy", +"FFF,oxjcOAOccccwj&Oa&Oggggcwccccggw4x33xgja&p@@X", +"FFFF2wAOcAOcwwwwaaA&$cccwwwwwww4x333xwA$lpXsyof@", +"FFFFFdxjgOAOwwwgljlacww44444xx33334A$lpXfyooyf$-", +"FFFFF1AOAgAOc4w>>O$>>444xx333334A$lpXfyooosXaxo,", +"FFFFFFr3jOOAO44>>>>>4xx333334AalpXf%ooo%@l44fZ,F", +"FFFFFF8&cjgAAc4444x33333xcja&pXf%oooy@pOxp7 ,FFF", +"FFFFFFF<3jOOAO4x333334O$&pXXf%oooyfpjxa.=bFFFFFF", +"FFFFFFF,@4jOAOx33xg$lpXX@f%yooyfX$x$.Z8FFFFFFFFF", +"FFFFFFFF=3AAO$&&apX@ffs%yyoysXawOs-1FFFFFFFFFFFF", +"FFFFFFFF,yxjj@-Ny%%%%yyy%sXlcxXN2FFFFFFFFFFFFFFF", +"FFFFFFFFF2xgA@:Co%%%%%fX&gxp7 ,FFFFFFFFFFFFFFFFF", +"FFFFFFFFFFd3Olfsf%sfX&j4l.ZbFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFF8jxjjapX&jxAy<8FFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF=g3cAA4gs-2FFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFF2.l$@72,FFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; + +/* XPM */ +const char *joyicon_sel[] = { +/* columns rows colors chars-per-pixel */ +"48 48 64 1", +" c #373546", +". c #eaf2ff", +"X c #4a4758", +"o c #2e1725", +"O c #8c0102", +"+ c #afafc0", +"@ c #585567", +"# c #ce0606", +"$ c #f01919", +"% c #71070b", +"& c #d0d7ed", +"* c #aea2b4", +"= c #151322", +"- c #4e0c14", +"; c #c8c8d7", +": c #a60000", +"> c #222132", +", c #020103", +"< c #1a1828", +"1 c #7b7a8c", +"2 c #6b6a7c", +"3 c #181625", +"4 c #1f1d2d", +"5 c #2f090f", +"6 c #737284", +"7 c #3f3d4e", +"8 c #858b99", +"9 c #0a0812", +"0 c #626173", +"q c #12111e", +"w c #9595a5", +"e c #5f5e71", +"r c #312f40", +"t c #1c1826", +"y c #e1e9fd", +"u c #1b1a2a", +"i c #24212e", +"p c #f92f2f", +"a c #0f0d19", +"s c #b7bed0", +"d c #2b293b", +"f c #272434", +"g c #1e1c2b", +"h c #706f81", +"j c #6e6d7f", +"k c #151a2a", +"l c #2d2835", +"z c #1f2030", +"x c #5c5b6c", +"c c #111626", +"v c #69687a", +"b c #1a1c2c", +"n c #282638", +"m c #160000", +"M c #4f4d5f", +"N c #1c1b2b", +"B c #161824", +"V c #181727", +"C c #777688", +"Z c #7e7d8f", +"A c #62616b", +"S c #797889", +"D c #666578", +"F c None", +/* pixels */ +"FFFFFFFFFFFFFm-%%5,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFmO::##-FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF,-:#p###mFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF,%:$p$$$5FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF,%:#$$p#mFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFmO:###O,FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFF,m%OO%mFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFF,,5*AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFF,ss,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFF,0.aFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFi.7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFF9&8,FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFF,8&,FFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFF7.iFFFFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFFqyxFFFFFFF,,,FFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFF,s+,FF,,9at4B,,FFFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFFFF,vyB,aBo%OO%-z9,FFFFFFFFFFFFFFF", +"FFFFFFFFFFFFFFF,,,XyS=>z%:::OOoz9,FFFFFFFFFFFFFF", +"FFFFFFFFFFF,,9aB4b &+<ub-OOOOOo4>a,FFFFFFFFFFFFF", +"FFFFFFF,,9a=g44guV=+&l=VVo-%%ob44>q,FFFFFFFFFFFF", +"FFF,,,95--okV33===aS.@a33ckkcc<Nggzq,FFFFFFFFFFF", +"F,9qkoO:::O-cV<<<<q7.89==V<<<VV<ugu4=,FFFFFFFFFF", +",q33c-::OOO%<V3333qu;;3aq3<<<<<<<ugu43,FFFFFFFFF", +"9u=3c5OOOOO-kV==qqa9w. <4N3<<VV<<uugu4u,FFFFFFFF", +"=>=3qq5%%%-Nbgg<3g<= x<=tig3<<VVV<uNgNg4,FFFFFFF", +"a>N=Vqqq=ccV<u444n>=V=99=r uVVVV3V<<N444i,FFFFFF", +",N>3Vu<V====3<ug4z4ufr i37@rb<V3333<<N44ii,FFFFF", +",a>4=NNNu<V===3<N4>47w+C Xx74ggN<V33<ug4iin,FFFF", +"F,<>3VggNNu<V==3<Nz>X+y*@7r>zz>>zz4NNuggiifl9,FF", +"F,azz3N4NNuuu<333<n 7Dv7f4N44NNNNgg44zziifflr9,F", +"FF,3><<4guuuu<<<VV 7r bVNuV333<<ugg444iifflnl aF", +"FF,94z3g4N<<<<<<Vf7f <3=33<<uuuNNggg4iii4t33 X,", +"FFF,=>N<4N<<VV<<< rN >=V<uuuuu<<<uuggut=qq3gfrMg", +"FFF,,N>Vg4uVVVV3> ud N<<<<V33VV<<<3=qaaqt>d 7@@i", +"FFFF,q>g<4g<3333rd47fV<V3333333=qa9aa34nr7M0hCe=", +"FFFFF,u><N4u333trzrrt33=====qaa99a=4nr7MehSShe ,", +"FFFFF,az4<4gV=3ttgloo===qaa999a=gnr7Meh1ZCDMrt,,", +"FFFFFF,V>Nu4N==ooooo=qaa999a=4d 7Mxj1Z12@ 4a,,,F", +"FFFFFF,94z<44V====qa9999q3id 7Mx2SZ1hx7fq9,,,FFF", +"FFFFFFF,=>gN4N=aa999aqgl 7XMx2CZZ6eXd=9,,,FFFFFF", +"FFFFFFF,9N>N4Na99qtfr7XM@xv6116eXr<9,,,FFFFFFFFF", +"FFFFFFFF,qz4gn7 r7M@xe0vhCCh0M 4a,,,FFFFFFFFFFFF", +"FFFFFFFF,,uzz@s+hvvv2j66j0M >q9,,FFFFFFFFFFFFFFF", +"FFFFFFFFF,a44@;;Z2jjjveM f=9,,,FFFFFFFFFFFFFFFFF", +"FFFFFFFFFF,=grx0ev0xM7n39,,,FFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFF,9<>>d7X7d<a9,,FFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFF,qV<4>Nq9,,FFFFFFFFFFFFFFFFFFFFFFFFFF", +"FFFFFFFFFFFF,9==9,,,FFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; diff --git a/examples/demo/main.cpp b/examples/demo/main.cpp new file mode 100644 index 000000000..b8c69398d --- /dev/null +++ b/examples/demo/main.cpp @@ -0,0 +1,377 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "frame.h" +#include "graph.h" +#include "display.h" +#include "icons.h" + +#include "textdrawing/textedit.h" +#include "textdrawing/helpwindow.h" +#include "dnd/dnd.h" +#include "i18n/i18n.h" + +#include <qmodules.h> + +#if defined(QT_MODULE_OPENGL) +#include "opengl/glworkspace.h" +#include "opengl/gllandscapeviewer.h" +#include "opengl/glinfotext.h" +#endif + +#if defined(QT_MODULE_CANVAS) +#include "qasteroids/toplevel.h" +#endif + +#if defined(QT_MODULE_TABLE) +#include "widgets/widgetsbase.h" +#else +#include "widgets/widgetsbase_pro.h" +#endif + +#include <stdlib.h> + +#include <qapplication.h> +#include <qimage.h> + +#include <qtabwidget.h> +#include <qfont.h> +#include <qworkspace.h> +#include <qwidgetstack.h> + +#if defined(QT_MODULE_SQL) +#include <qsqldatabase.h> +#include "sql/sqlex.h" +#endif + +#if defined(Q_OS_MACX) +#include <stdlib.h> +#include <qdir.h> +#endif + +#include "categoryinterface.h" + +static void qdemo_set_caption( CategoryInterface *c, int i ) +{ + TQWidget *w = qApp->mainWidget(); + if ( !w ) + return; + TQString title = Frame::tr( "TQt Demo Collection" ); + title += " - " + c->categoryName( i - c->categoryOffset() ); + w->setCaption( title ); +} + +class WidgetCategory : public CategoryInterface +{ +public: + WidgetCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "Widgets"; } + TQIconSet icon() const { return TQPixmap( widgeticon ); } + int numCategories() const { return 2; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "Widgets" ); + break; + case 1: + return Frame::tr( "Drag and Drop" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + stack->addWidget( new WidgetsBase( stack ), categoryOffset() + 0 ); + stack->addWidget( new DnDDemo( stack ), categoryOffset() + 1 ); + } + + int categoryOffset() const { return 0; } + +private: + bool created; + +}; + +#if defined(QT_MODULE_SQL) +class DatabaseCategory : public CategoryInterface +{ +public: + DatabaseCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "Database"; } + TQIconSet icon() const { return TQPixmap( dbicon ); } + int numCategories() const { return 1; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "SQL Explorer" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + stack->addWidget( new SqlEx( stack ), categoryOffset() + 0 ); + } + + int categoryOffset() const { return 10; } + +private: + bool created; + +}; +#endif + +#if defined(QT_MODULE_CANVAS) +class CanvasCategory : public CategoryInterface +{ +public: + CanvasCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "2D Graphics"; } + TQIconSet icon() const { return TQPixmap( twodicon ); } + int numCategories() const { return 2; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "Graph Drawing" ); + break; + case 1: + return Frame::tr( "Display" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + stack->addWidget( new GraphWidget( stack ), categoryOffset() + 0 ); + stack->addWidget( new DisplayWidget( stack ), categoryOffset() + 1 ); + } + + int categoryOffset() const { return 100; } + +private: + bool created; + +}; +#endif + +#if defined(QT_MODULE_OPENGL) +class OpenGLCategory : public CategoryInterface +{ +public: + OpenGLCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "3D Graphics"; } + TQIconSet icon() const { return TQPixmap( threedicon ); } + int numCategories() const { return 3; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "3D Demo" ); + break; + case 1: + return Frame::tr( "Fractal landscape" ); + break; + case 2: + return Frame::tr( "OpenGL info" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + stack->addWidget( new GLWorkspace( stack ), categoryOffset() + 0 ); + stack->addWidget( new GLLandscapeViewer( stack ), categoryOffset() + 1 ); + stack->addWidget( new GLInfoText( stack ), categoryOffset() + 2 ); + } + int categoryOffset() const { return 1000; } + +private: + bool created; + +}; +#endif + +class TextCategory : public CategoryInterface +{ +public: + TextCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "Text Drawing/Editing"; } + TQIconSet icon() const { return TQPixmap( texticon ); } + int numCategories() const { return 2; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "Richtext Editor" ); + break; + case 1: + return Frame::tr( "Help Browser" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + TextEdit *te = new TextEdit( stack ); + te->load( "textdrawing/example.html" ); + stack->addWidget( te, categoryOffset() + 0 ); + TQString home = TQDir( "../../doc/html/index.html" ).absPath(); + HelpWindow *w = new HelpWindow( home, ".", stack, "helpviewer" ); + stack->addWidget( w, categoryOffset() + 1 ); + } + int categoryOffset() const { return 10000; } + +private: + bool created; + +}; + +class I18NCategory : public CategoryInterface +{ +public: + I18NCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "Internationalization"; } + TQIconSet icon() const { return TQPixmap( internicon ); } + int numCategories() const { return 1; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "Internationalization" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + stack->addWidget( new I18nDemo( stack ), categoryOffset() + 0 ); + } + int categoryOffset() const { return 100000; } + +private: + bool created; + +}; + +#if defined(QT_MODULE_CANVAS) +class GameCategory : public CategoryInterface +{ +public: + GameCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {} + + TQString name() const { return "Game"; } + TQIconSet icon() const { return TQPixmap( joyicon ); } + int numCategories() const { return 1; } + TQString categoryName( int i ) const { + switch ( i ) { + case 0: + return Frame::tr( "Asteroids" ); + break; + } + return TQString::null; + } + TQIconSet categoryIcon( int ) const { return TQIconSet(); } + void setCurrentCategory( int i ) { + create(); + stack->raiseWidget( i ); + qdemo_set_caption( this, i ); + } + void create() { + if ( created ) + return; + created = TRUE; + stack->addWidget( new KAstTopLevel( stack ), categoryOffset() + 0 ); + } + int categoryOffset() const { return 1000000; } + +private: + bool created; + +}; +#endif + +int main( int argc, char **argv ) +{ + TQString category; + TQApplication a( argc, argv ); + + Frame::updateTranslators(); + Frame frame; + a.setMainWidget( &frame ); + + TQPtrList<CategoryInterface> categories; + categories.append( new WidgetCategory( frame.widgetStack() ) ); +#if defined(QT_MODULE_SQL) + categories.append( new DatabaseCategory( frame.widgetStack() ) ); +#endif + categories.append( new CanvasCategory( frame.widgetStack() ) ); +#if defined(QT_MODULE_OPENGL) + categories.append( new OpenGLCategory( frame.widgetStack() ) ); +#endif + categories.append( new TextCategory( frame.widgetStack() ) ); + categories.append( new I18NCategory( frame.widgetStack() ) ); + categories.append( new GameCategory( frame.widgetStack() ) ); + frame.setCategories( categories ); + + frame.resize( 1000, 700 ); + frame.show(); + + return a.exec(); +} diff --git a/examples/demo/opengl/fbm.c b/examples/demo/opengl/fbm.c new file mode 100644 index 000000000..4409ae08f --- /dev/null +++ b/examples/demo/opengl/fbm.c @@ -0,0 +1,207 @@ +/***************************************************************** + + Implementation of the fractional Brownian motion algorithm. These + functions were originally the work of F. Kenton Musgrave. + For documentation of the different functions please refer to the + book: + "Texturing and modeling: a procedural approach" + by David S. Ebert et. al. + +******************************************************************/ + +#if defined (_MSC_VER) +#include <qglobal.h> +#endif + +#include <time.h> +#include <stdlib.h> +#include "fbm.h" + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4244) +#endif + +/* Definitions used by the noise2() functions */ + +#define B 0x100 +#define BM 0xff + +#define N 0x1000 +#define NP 12 /* 2^N */ +#define NM 0xfff + +static int p[B + B + 2]; +static float g3[B + B + 2][3]; +static float g2[B + B + 2][2]; +static float g1[B + B + 2]; +static int start = 1; + +static void init(void); + +#define s_curve(t) ( t * t * (3. - 2. * t) ) + +#define lerp(t, a, b) ( a + t * (b - a) ) + +#define setup(i,b0,b1,r0,r1)\ + t = vec[i] + N;\ + b0 = ((int)t) & BM;\ + b1 = (b0+1) & BM;\ + r0 = t - (int)t;\ + r1 = r0 - 1.; +#define at3(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] ) + +static float noise3(float vec[3]); + +/* Fractional Brownian Motion function */ + +double fBm( Vector point, double H, double lacunarity, double octaves, + int init ) +{ + + double value, frequency, remainder; + int i; + static double exponent_array[10]; + float vec[3]; + + /* precompute and store spectral weights */ + if ( init ) { + start = 1; + srand( time(0) ); + /* seize retquired memory for exponent_array */ + frequency = 1.0; + for (i=0; i<=octaves; i++) { + /* compute weight for each frequency */ + exponent_array[i] = pow( frequency, -H ); + frequency *= lacunarity; + } + } + + value = 0.0; /* initialize vars to proper values */ + frequency = 1.0; + vec[0]=point.x; + vec[1]=point.y; + vec[2]=point.z; + + + /* inner loop of spectral construction */ + for (i=0; i<octaves; i++) { + /* value += noise3( vec ) * exponent_array[i];*/ + value += noise3( vec ) * exponent_array[i]; + vec[0] *= lacunarity; + vec[1] *= lacunarity; + vec[2] *= lacunarity; + } /* for */ + + remainder = octaves - (int)octaves; + if ( remainder ) /* add in ``octaves'' remainder */ + /* ``i'' and spatial freq. are preset in loop above */ + value += remainder * noise3( vec ) * exponent_array[i]; + + return( value ); + +} /* fBm() */ + + +float noise3(float vec[3]) +{ + int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11; + float rx0, rx1, ry0, ry1, rz0, rz1, *q, sy, sz, a, b, c, d, t, u, v; + register int i, j; + + if (start) { + start = 0; + init(); + } + + setup(0, bx0,bx1, rx0,rx1); + setup(1, by0,by1, ry0,ry1); + setup(2, bz0,bz1, rz0,rz1); + + i = p[ bx0 ]; + j = p[ bx1 ]; + + b00 = p[ i + by0 ]; + b10 = p[ j + by0 ]; + b01 = p[ i + by1 ]; + b11 = p[ j + by1 ]; + + t = s_curve(rx0); + sy = s_curve(ry0); + sz = s_curve(rz0); + + + q = g3[ b00 + bz0 ] ; u = at3(rx0,ry0,rz0); + q = g3[ b10 + bz0 ] ; v = at3(rx1,ry0,rz0); + a = lerp(t, u, v); + + q = g3[ b01 + bz0 ] ; u = at3(rx0,ry1,rz0); + q = g3[ b11 + bz0 ] ; v = at3(rx1,ry1,rz0); + b = lerp(t, u, v); + + c = lerp(sy, a, b); + + q = g3[ b00 + bz1 ] ; u = at3(rx0,ry0,rz1); + q = g3[ b10 + bz1 ] ; v = at3(rx1,ry0,rz1); + a = lerp(t, u, v); + + q = g3[ b01 + bz1 ] ; u = at3(rx0,ry1,rz1); + q = g3[ b11 + bz1 ] ; v = at3(rx1,ry1,rz1); + b = lerp(t, u, v); + + d = lerp(sy, a, b); + + return lerp(sz, c, d); +} + +static void normalize2(float v[2]) +{ + float s; + + s = sqrt(v[0] * v[0] + v[1] * v[1]); + v[0] = v[0] / s; + v[1] = v[1] / s; +} + +static void normalize3(float v[3]) +{ + float s; + + s = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + v[0] = v[0] / s; + v[1] = v[1] / s; + v[2] = v[2] / s; +} + +static void init(void) +{ + int i, j, k; + + for (i = 0 ; i < B ; i++) { + p[i] = i; + + g1[i] = (float)((rand() % (B + B)) - B) / B; + + for (j = 0 ; j < 2 ; j++) + g2[i][j] = (float)((rand() % (B + B)) - B) / B; + normalize2(g2[i]); + + for (j = 0 ; j < 3 ; j++) + g3[i][j] = (float)((rand() % (B + B)) - B) / B; + normalize3(g3[i]); + } + + while (--i) { + k = p[i]; + p[i] = p[j = rand() % B]; + p[j] = k; + } + + for (i = 0 ; i < B + 2 ; i++) { + p[B + i] = p[i]; + g1[B + i] = g1[i]; + for (j = 0 ; j < 2 ; j++) + g2[B + i][j] = g2[i][j]; + for (j = 0 ; j < 3 ; j++) + g3[B + i][j] = g3[i][j]; + } +} diff --git a/examples/demo/opengl/fbm.h b/examples/demo/opengl/fbm.h new file mode 100644 index 000000000..474cd3c2d --- /dev/null +++ b/examples/demo/opengl/fbm.h @@ -0,0 +1,39 @@ +/***************************************************************** + + Prototypes for the fractional Brownian motion algorithm. These + functions were originally the work of F. Kenton Musgrave. For + documentation of the different functions please refer to the book: + "Texturing and modeling: a procedural approach" + by David S. Ebert et. al. + +******************************************************************/ + +#ifndef _fbm_h +#define _fbm_h + +#include <math.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define TRUE 1 +#define FALSE 0 + +typedef struct { + double x; + double y; + double z; +} Vector; + +double fBm( Vector point, double H, double lacunarity, double octaves, + int init ); +#endif + +#ifdef __cplusplus +} +#endif + + + + diff --git a/examples/demo/opengl/gear.xpm b/examples/demo/opengl/gear.xpm new file mode 100644 index 000000000..ccba9ec4e --- /dev/null +++ b/examples/demo/opengl/gear.xpm @@ -0,0 +1,304 @@ +/* XPM */ +static char *gear[] = { +/* width height num_colors chars_per_pixel */ +" 48 48 249 2", +/* colors */ +".. c #7a7a7b", +".# c #afafaf", +".a c #adadad", +".b c #727273", +".c c #a7a7a7", +".d c #a5a5a5", +".e c #9d9f9d", +".f c #9d9d9d", +".g c #9b9b9b", +".h c #656666", +".i c #9a999a", +".j c #626463", +".k c #979797", +".l c #969796", +".m c #5e5e5f", +".n c #5e5c5f", +".o c #5c5e5d", +".p c #919191", +".q c #c6c6c5", +".r c #8d8d8d", +".s c #535454", +".t c #bdbcbc", +".u c #bbbaba", +".v c #838383", +".w c #818181", +".x c #8e8f91", +".y c #484849", +".z c #797979", +".A c #aeaead", +".B c #777777", +".C c #acacab", +".D c #abaaaa", +".E c #747574", +".F c #a8a8a7", +".G c #706f70", +".H c #b1b2b3", +".I c #323233", +".J c #9b9a9a", +".K c #656565", +".L c #9a9a99", +".M c #cfcdcd", +".N c #999898", +".O c #dedfdf", +".P c #2b2c2c", +".Q c #959694", +".R c #5f5f5f", +".S c #5f5d5f", +".T c #939292", +".U c #5c5b5c", +".V c #a0a0a2", +".W c #242425", +".X c #595959", +".Y c #8e8e8d", +".Z c #575757", +".0 c #555555", +".1 c #c0bfbe", +".2 c #545554", +".3 c #8a8889", +".4 c #888887", +".5 c #cdcdce", +".6 c #858484", +".7 c #cacbcb", +".8 c #161617", +".9 c #807e7f", +"#. c #131414", +"## c #8d8e8f", +"#a c #7b7a7a", +"#b c #454545", +"#c c #c0c1c1", +"#d c #444344", +"#e c #bfbfc0", +"#f c #424342", +"#g c #f2f2f2", +"#h c #757674", +"#i c #403f40", +"#j c #3f3f3f", +"#k c #3d3d3d", +"#l c #6a6a69", +"#m c #696868", +"#n c #e2e2e2", +"#o c #2f2f2f", +"#p c #a8a9a9", +"#q c #626261", +"#r c #616060", +"#s c #d8d8d8", +"#t c #5a5a59", +"#u c #232323", +"#v c #9e9f9f", +"#w c #1d1d1d", +"#x c #1c1b1c", +"#y c #cdcccd", +"#z c #1a1b1a", +"#A c #191919", +"#B c #cacaca", +"#C c #949595", +"#D c #151515", +"#E c #121312", +"#F c #c2c2c2", +"#G c #8c8d8d", +"#H c #0f0f0f", +"#I c #444443", +"#J c #434242", +"#K c #414040", +"#L c #b9bab9", +"#M c #b6b6b6", +"#N c #b5b4b5", +"#O c #b4b4b4", +"#P c #6d6b6b", +"#Q c #7a7b7b", +"#R c #343433", +"#S c #696767", +"#T c #acacac", +"#U c None", +"#V c #dedddd", +"#W c #717172", +"#X c #a6a6a6", +"#Y c #707171", +"#Z c #292828", +"#0 c #a4a4a4", +"#1 c #6e6f6f", +"#2 c #6a6b6b", +"#3 c #9d9c9d", +"#4 c #d0d1cf", +"#5 c #c8c7c7", +"#6 c #929092", +"#7 c #c6c5c5", +"#8 c #141413", +"#9 c #131412", +"a. c #c5c3c4", +"a# c #9fa0a2", +"aa c #d2d3d4", +"ab c #8b8c8b", +"ac c #8a8a8a", +"ad c #bfbfbe", +"ae c #bfbdbe", +"af c #515352", +"ag c #878687", +"ah c #828282", +"ai c #b7b7b6", +"aj c #fbfcfc", +"ak c #494b4a", +"al c #49494a", +"am c #7e7e7e", +"an c #484949", +"ao c #f9fafa", +"ap c #474748", +"aq c #f7f8f8", +"ar c #797a79", +"as c #787878", +"at c #aaa9a9", +"au c #737473", +"av c #a8a9a7", +"aw c #ececed", +"ax c #39393a", +"ay c #6d6c6d", +"az c #6b6c6b", +"aA c #e5e6e6", +"aB c #afb1b1", +"aC c #9f9f9e", +"aD c #323333", +"aE c #676667", +"aF c #2f3130", +"aG c #646464", +"aH c #636463", +"aI c #949393", +"aJ c #181716", +"aK c #141312", +"aL c #d3d2d4", +"aM c #212122", +"aN c #565656", +"aO c #1e1f1f", +"aP c #525452", +"aQ c #888787", +"aR c #515251", +"aS c #858584", +"aT c #4e4e4e", +"aU c #ffffff", +"aV c #4d4e4d", +"aW c #828181", +"aX c #5c5c5f", +"aY c #151516", +"aZ c #5a5c5d", +"a0 c #141515", +"a1 c #8f8f91", +"a2 c #111112", +"a3 c #464646", +"a4 c #101111", +"a5 c #c1c2c2", +"a6 c #f5f5f5", +"a7 c #bfc0c0", +"a8 c #414241", +"a9 c #3f403f", +"b. c #3e3e3e", +"b# c #727171", +"ba c #3b3c3b", +"bb c #716f70", +"bc c #e9e9e9", +"bd c #363636", +"be c #353435", +"bf c #afb0b0", +"bg c #686767", +"bh c #313031", +"bi c #e1e1e1", +"bj c #2e2e2e", +"bk c #626361", +"bl c #2c2c2c", +"bm c #605f5f", +"bn c #dadbda", +"bo c #a2a2a3", +"bp c #262626", +"bq c #6b6d6d", +"br c #a1a0a2", +"bs c #5a5b59", +"bt c #242424", +"bu c #d5d5d5", +"bv c #595758", +"bw c #575556", +"bx c #8c8a8a", +"by c #d1d1d1", +"bz c #1e1e1e", +"bA c #cfcfcf", +"bB c #535352", +"bC c #979898", +"bD c #515150", +"bE c #1b1a1b", +"bF c #504f4f", +"bG c #181a18", +"bH c #848282", +"bI c #c9c9c9", +"bJ c #4e4b4d", +"bK c #161616", +"bL c #151415", +"bM c #141414", +"bN c #c5c5c5", +"bO c #111011", +"bP c #bdbdbd", +"bQ c #777675", +"bR c #0b0a0b", +"bS c #bbbbbb", +"bT c #858686", +"bU c #848685", +"bV c #b8b9b8", +"bW c #4b4b4d", +"bX c #808081", +"bY c #4a4b4c", +"bZ c #b5b5b5", +"b0 c #393738", +"b1 c #7c7e7d", +"b2 c #b3b1b3", +/* pixels */ +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#G.Rbpab#UboaEb.axb0b0aNbU#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#WbWbM#8#.b0.Gbp.8aK#.bM#.#.bMbzak#C#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#Uar.WbMbMbMbM#zaO#.bMbMbMbMbMbMbMbMaJaO.o#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#Uad.wbp#.#.bMbM#uaN#zbMbMbMbMbMbMbMbMbKaO#xaY.U#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#Ba6aj.6.8bMbMbMbMacaUaL#PbLbMbMbMbM#D#wbzbKbMbM.G#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#Uadbcajaqbc.5.IbMbMbMbM#nawbcao#g.NbFbMbEaO.8bMbMbMaK.6#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U.OaUaoawbcaA#nb#bMbMbM#KaUbi#4.M#sawajbb#zbMbMbMbMbM#9#z.B#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#Uaa#ebcaA#nbi.OaQbMbMa0#QaUby.M.7#5#7.5.KbMbMbMbMbMbMbM#.#x.B#U#hbh.W.N#U#U#U#U#U#U#U", +"#U#U#U#U#U#Ubo.oaA#n.O#VbnbnaS.vaQa7aA.7#5#7#F#c.1#RbMbMbMbMbMbMbMbM#.bl#d#z#.a4#I#v#U#U#U#U#U#U", +"#U#U#U#U#U#U.zaF.Y.O#Vbn#sbuaa#4bA#y.7#5bNa5#caeat#wbMbMbMbMbMbMbM#D#xbz#DbMbMbM#A.G#U#U#U#U#U#U", +"#U#U#U#U.rbdbO#E.d#n#sbuaabybA.M.7#5bN#F#cad.t.u.g#wbMbMbMbMbMbMbGbz.8bMbMbMbMbM#8bp.N#U#U#U#U#U", +"#U#UbZ#e.vbhbMaza6#saaby#4.5.5bI#5bNa5.1ae.u#L#M#O.6bpbLbM#u#aaNbEbMbMbMbMbMbMbMbMbMax#U#U#U#U#U", +"#U#Ubcaoaqbi#Paobnaa#4bA.M.7#5#7a5#cad.t.ubV#O.Hbf.a.T#f.I#7aoaIbEbMbMbMbMbMbMbMbMbMbKay#U#U#U#U", +"#U#UaU.Obna6aU#nby#4.5.7bI.q#F#cadbP.ubV#N#Obf.A#T.D.c#Xbfaobf#3a3.8bMbMbMbMbMbMbMbMbGbm#U#U#U#U", +"#Uadajbu#sbu#n#4.M#y#B#5bNa5a7adbS#Lai#O.H.#.a.Cat#Xbo.VaC.f.gbC.Ybl#DbMbMbMbMbMbLbp.X#U#U#U#U#U", +"#UbAawaaaabybA.M.7bI#7#F#cad.t.u#LbZ#Obf.##T#Tav.dboa##v.g.L.laI#6ar#xbMbMbMbMbG.PaS#U#U#U#U#U#U", +"#Ubcbiby#4bA.7bI.qa.a5.1ad.u#L#M#OaB.#.a.Dav.dbr.V#v.f.g.k#C.T#6.YabaP#AbM#Dbz#waK.z#U#U#U#U#U#U", +"#UbP#0bA#y.7#5#7a5a7aebS.uai#O.Hbf.a.C#p.cbobr#v.f.J.N.laIa1.x#G.3.4bTbJbzaObKbM#9a9#U#U#U#U#U#U", +"#U..bM.X#O#7a.a5a7aebS#L#M#Obf.#.f#2.saf.w.V#v#3.LbCaI.Ta1.xab.3aQbTaW.X#AbMbMbM#D#x#v#U#U#U#U#U", +"#U#U#abhbMa5#eadbS#Lai#O.H.#.a.Qb.bdbl.W.I.Z.l.N.QaIa1.x.rac.4bT.vay#RbLbMbMbMbMbM#9#Y#U#U#U#U#U", +"#U#U#U#U#bad.t.ubVbZ#Obf.a.C.CbJ#RbEbMbMbK#RazaI#6.x#Gbx.4bT.6.wambhbMbMbMbMbMbMbM#8a4#HaKar#U#U", +"#U#U#U#U#bbS#Lai#Obfbf.a.Dav.pbd.WbMbMbMbMbMb#.f##ab.3.4bTah.9am#QblbMbMbMbMbMbMbMbMbMbM#9.o#U#U", +"#U#U#U#U#6#B#N.Hbf.a#Tat.c.dagbd#wbMbMbMbMbMa8#Mab.4bT.v.wamb1aras#I#.bMbMbMbMbMbMbMbMbM#D.o#U#U", +"#U#UbZaAa6#cbf.##T#Tav.dbr.V.Bbd#wbMbV.Na2aKbM.L#MaS.wbXb1#aas#h.E.Za2bMbMbMbMbMbMbMbM#z#Z.o#U#U", +"#UbZa6aw.ubf#T.Dav.c#0.V#v.f.vbd#wbFac#oaObRbMa8#g.vb1#Q.zbQ#h.b.G#1aYbMbMbMbMbMbM.8#ubdaT.o#U#U", +"#Uadaobf.A#Tat.c.dbra#.f#3.N.Tba#ibMbfaDbj#HbMbMaU.Y#aasbQau#Y.Gbq#2aX#obtaO#DbLaJbpbabWaP.o#U#U", +"#UbZaU.t.Dav#Xbo.V#v#3.JbC.Q#6aN.0bMbk#0aObRbMbMbN#ObQ#hb#.Gbqaz#m.haH#r.S.XbjaM.P#JbFbB.y.o#U#U", +"#U#Ua6.5.F#0br#v.e.g.N.laI#6.x#Q.m.IbM#Z#HbRbMbMac.c.bbb#1az#lbg.Kbk#r.n.Ubs.Ib0.yaPaTbY.W.r#U#U", +"#U#Ubn#Vbr.V.f.g.L.kaI.T.x.Yab.4.iasbMbMbMbMbMbMbS.a.Gay#2bg.hbk#r.naX#t.Z.2bd#faRaVapbt#Y#U#U#U", +"#U#Uad#g.d.f.LbC.l.T.p.x#GacaQbT.TaabhbMbMbMbMaRa6.waz#maEaH#qbmaXaZbvaN.saRbe.yak#dbt#Y#U#U#U#U", +"#U#U#UaU#v.N.laI.T.x##ab.4aQ.6.w.9.c#n.nbMbM.n#Vbn#lbg.K.j#r.n.U.Xbw.0aPaRaTbjal#i#u.r#U#U#U#U#U", +"#U#U#UaibhbMbMbMakab.3.4aSaW.wb1#a.zb2aqaUaUaUbPb#.haH#r.RaX#tbv.0.saRbWalan.Pb0#8#i#U#U#U#U#U#U", +"#U#U#U.V.6.6.6#a.WaragbH.wamb1aras#hau.G.T.p#Q.haG#qbm.naXbvaN.2aPbFap#k#i#j.W#8#.a4.y#U#U#U#U#U", +"#U#U#U#U#U#U#U#UbgaVaW.9b1#Q.zbQ.E#W.Gayaz#m.K.j#q.SaXbsbv.0bBaRbF.yb.#Rbpbt#A#.bM#8#H#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#Ua8aub1.z.B.Eb#.G#1#2#maEaGbk.RaXbsbvaN.saRbFaTak#K.I#zbMbMbMaYa2aK#Y#U#U#U#U#U", +"#U#U#U#U#U#U#U#UbN#s.Eas#h.Ebb.Gbq#l#S.KaH#r.maZ.X.Z.2aPbDaTbYan#IbdbEbMbMbMbMbObO#Y#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#UawbSbQ.E#Y.Gbq#2#m.KaH#r.S.n#tbv.0bBaRbFbJana3#d#fbl#AbMbMbMbOa4#Y#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#Ua6au.b.G#1az#lbg.K#qbm.nbsbv.0.2bBbFaTbYana3#da8#jbdbp#Aa2bOa2.b#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#UbV#d.nbq#2bg.haH#r.SaXbsbv.0.sbDbFbWaka3#d#f#ib.bab0aD#uaJa2.b#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U.vbla9aGaH.Xb..0#t.X.0.saRbFbJakap#b#I#K#i#kaxb0be.IbjaO.k#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#GbWbtbF.Wbp#daOa9aPbDaTbY.ya3#da9bebj#kaxbe#RaFblaM.Y#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#0bQblbz#a#U.kax#IbJakap#b#fbdaO#zbM#wax.IaF.WaO.Y#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#Ubmb.apa3#da8#i#ibMbMbMbMaJbl#o#dbr#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#Ubm#o#d#f#i#k#k#ibMbMbMbMbMbpaS#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#lbpaxbabaaxba#ibzbzbM#daS#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#db0b0b0#Z#wbjbg#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U", +"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U" +}; diff --git a/examples/demo/opengl/glbox.cpp b/examples/demo/opengl/glbox.cpp new file mode 100644 index 000000000..f065888b5 --- /dev/null +++ b/examples/demo/opengl/glbox.cpp @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying an openGL wireframe box +** +** The OpenGL code is mostly borrowed from Brian Pauls "spin" example +** in the Mesa distribution +** +****************************************************************************/ + +#include "glbox.h" + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/*! + Create a GLBox widget +*/ + +GLBox::GLBox( TQWidget* parent, const char* name, WFlags f ) + : GLControlWidget( parent, name, 0, f ) +{ + setAnimationDelay( -1 ); + xRot = yRot = zRot = 0.0; // default object rotation + scale = 1.25; // default object scale + object = 0; +} + + +/*! + Release allocated resources +*/ + +GLBox::~GLBox() +{ + makeCurrent(); + glDeleteLists( object, 1 ); +} + + +/*! + Paint the box. The actual openGL commands for drawing the box are + performed here. +*/ + +void GLBox::paintGL() +{ + glClear( GL_COLOR_BUFFER_BIT ); + + glLoadIdentity(); + transform(); + glCallList( object ); + drawText(); + qglColor( green ); + glLineWidth( 1.0 ); + glBegin( GL_LINES ); + { + glVertex3f( 0.0, 0.0, 0.0 ); + glVertex3f( 0.98, 0.98, 0.98 ); + } + glEnd(); + renderText( 1.0, 1.0, 1.0, "Wirebox", TQFont( "helvetica", 12, TQFont::Bold, TRUE ) ); +} + + +/*! + Set up the OpenGL rendering state, and define display list +*/ + +void GLBox::initializeGL() +{ + qglClearColor( black ); // Let OpenGL clear to black + object = makeObject(); // Generate an OpenGL display list + glShadeModel( GL_FLAT ); +} + + + +/*! + Set up the OpenGL view port, matrix mode, etc. +*/ + +void GLBox::resizeGL( int w, int h ) +{ + glViewport( 0, 0, (GLint)w, (GLint)h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 ); + glMatrixMode( GL_MODELVIEW ); +} + + +/*! + Generate an OpenGL display list for the object to be shown, i.e. the box +*/ + +GLuint GLBox::makeObject() +{ + GLuint list; + + list = glGenLists( 1 ); + + glNewList( list, GL_COMPILE ); + + qglColor( white ); // Shorthand for glColor3f or glIndex + + glLineWidth( 2.0 ); + + glBegin( GL_LINE_LOOP ); + glVertex3f( 1.0, 0.5, -0.4 ); + glVertex3f( 1.0, -0.5, -0.4 ); + glVertex3f( -1.0, -0.5, -0.4 ); + glVertex3f( -1.0, 0.5, -0.4 ); + glEnd(); + + glBegin( GL_LINE_LOOP ); + glVertex3f( 1.0, 0.5, 0.4 ); + glVertex3f( 1.0, -0.5, 0.4 ); + glVertex3f( -1.0, -0.5, 0.4 ); + glVertex3f( -1.0, 0.5, 0.4 ); + glEnd(); + + glBegin( GL_LINES ); + glVertex3f( 1.0, 0.5, -0.4 ); glVertex3f( 1.0, 0.5, 0.4 ); + glVertex3f( 1.0, -0.5, -0.4 ); glVertex3f( 1.0, -0.5, 0.4 ); + glVertex3f( -1.0, -0.5, -0.4 ); glVertex3f( -1.0, -0.5, 0.4 ); + glVertex3f( -1.0, 0.5, -0.4 ); glVertex3f( -1.0, 0.5, 0.4 ); + glEnd(); + + glEndList(); + + return list; +} diff --git a/examples/demo/opengl/glbox.h b/examples/demo/opengl/glbox.h new file mode 100644 index 000000000..2667cfa3b --- /dev/null +++ b/examples/demo/opengl/glbox.h @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying an openGL wireframe box +** +****************************************************************************/ + +#ifndef GLBOX_H +#define GLBOX_H + +#include "glcontrolwidget.h" + +class GLBox : public GLControlWidget +{ + Q_OBJECT + +public: + + GLBox( TQWidget* parent = 0, const char* name = 0, WFlags f = 0 ); + ~GLBox(); + +protected: + + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + virtual GLuint makeObject(); + +private: + GLuint object; +}; + + +#endif // GLBOX_H diff --git a/examples/demo/opengl/glcontrolwidget.cpp b/examples/demo/opengl/glcontrolwidget.cpp new file mode 100644 index 000000000..2e019f051 --- /dev/null +++ b/examples/demo/opengl/glcontrolwidget.cpp @@ -0,0 +1,195 @@ +#include "glcontrolwidget.h" + +#include <qcursor.h> +#include <qtimer.h> + +#include <math.h> + +GLControlWidget::GLControlWidget( TQWidget *parent, const char *name, TQGLWidget *share, WFlags f ) +: TQGLWidget( parent, name, share, f ), + xRot(0),yRot(0),zRot(0),xTrans(0),yTrans(0),zTrans(-10.0),scale(5.0), animation(TRUE), wasAnimated(FALSE), delay( 50 ) +{ + setCursor( pointingHandCursor ); + timer = new TQTimer( this ); + connect( timer, SIGNAL(timeout()), SLOT(animate()) ); + timer->start( delay ); +} + +void GLControlWidget::transform() +{ + glTranslatef( xTrans, yTrans, zTrans ); + glScalef( scale, scale, scale ); + + glRotatef( xRot, 1.0, 0.0, 0.0 ); + glRotatef( yRot, 0.0, 1.0, 0.0 ); + glRotatef( zRot, 0.0, 0.0, 1.0 ); +} + +void GLControlWidget::drawText() +{ + glPushAttrib( GL_LIGHTING_BIT | GL_TEXTURE_BIT ); + glDisable( GL_LIGHTING ); + glDisable( GL_TEXTURE_2D ); + qglColor( white ); + TQString str( "Rendering text in OpenGL is easy with TQt" ); + TQFontMetrics fm( font() ); + renderText( (width() - fm.width( str )) / 2, 15, str ); + TQFont f( "courier", 8 ); + TQFontMetrics fmc( f ); + qglColor( TQColor("skyblue") ); + int x, y, z; + x = (xRot >= 0) ? (int) xRot % 360 : 359 - (TQABS((int) xRot) % 360); + y = (yRot >= 0) ? (int) yRot % 360 : 359 - (TQABS((int) yRot) % 360); + z = (zRot >= 0) ? (int) zRot % 360 : 359 - (TQABS((int) zRot) % 360); + str.sprintf( "Rot X: %03d - Rot Y: %03d - Rot Z: %03d", x, y, z ); + renderText( (width() - fmc.width( str )) / 2, height() - 15, str, f ); + glPopAttrib(); +} + +/*! + Set the rotation angle of the object to \e degrees around the X axis. +*/ +void GLControlWidget::setXRotation( double degrees ) +{ + xRot = (GLfloat)fmod(degrees, 360.0); + updateGL(); +} + +/*! + Set the rotation angle of the object to \e degrees around the Y axis. +*/ +void GLControlWidget::setYRotation( double degrees ) +{ + yRot = (GLfloat)fmod(degrees, 360.0); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Z axis. +*/ +void GLControlWidget::setZRotation( double degrees ) +{ + zRot = (GLfloat)fmod(degrees, 360.0); + updateGL(); +} + +void GLControlWidget::setScale( double s ) +{ + scale = s; + updateGL(); +} + +void GLControlWidget::setXTrans( double x ) +{ + xTrans = x; + updateGL(); +} + +void GLControlWidget::setYTrans( double y ) +{ + yTrans = y; + updateGL(); +} + +void GLControlWidget::setZTrans( double z ) +{ + zTrans = z; + updateGL(); +} + +void GLControlWidget::setRotationImpulse( double x, double y, double z ) +{ + setXRotation( xRot + 180*x ); + setYRotation( yRot + 180*y ); + setZRotation( zRot - 180*z ); +} + +void GLControlWidget::setTranslationImpulse( double x, double y, double z ) +{ + setXTrans( xTrans + 2*x ); + setYTrans( yTrans - 2*y ); + setZTrans( zTrans + 2*z ); +} + +void GLControlWidget::mousePressEvent( TQMouseEvent *e ) +{ + e->accept(); + oldPos = e->pos(); +} + +void GLControlWidget::mouseReleaseEvent( TQMouseEvent *e ) +{ + e->accept(); + oldPos = e->pos(); +} + +void GLControlWidget::mouseMoveEvent( TQMouseEvent *e ) +{ + e->accept(); + double dx = e->x() - oldPos.x(); + double dy = e->y() - oldPos.y(); + + oldPos = e->pos(); + + double rx = dx / width(); + double ry = dy / height(); + + if ( e->state() == LeftButton ) + setRotationImpulse( ry, rx, 0 ); + else if ( e->state() == RightButton ) + setRotationImpulse( ry, 0, rx ); + else if ( e->state() == MidButton ) + setTranslationImpulse( rx, ry, 0 ); + else if ( e->state() == ( LeftButton | RightButton ) ) + setTranslationImpulse( rx, 0, ry ); +} + +void GLControlWidget::wheelEvent( TQWheelEvent *e ) +{ + e->accept(); + if ( scale <= ( (double)e->delta() / 1000 ) ) + return; + setScale( scale - ( (double)e->delta() / 1000 )); +} + +void GLControlWidget::mouseDoubleClickEvent( TQMouseEvent * ) +{ + if ( delay <= 0 ) + return; + + animation = !animation; + if ( animation ) + timer->start( delay ); + else + timer->stop(); +} + +void GLControlWidget::showEvent( TQShowEvent *e ) +{ + if ( wasAnimated && !timer->isActive() ) + timer->start( delay ); + + TQGLWidget::showEvent( e ); +} + +void GLControlWidget::hideEvent( TQHideEvent *e ) +{ + wasAnimated = timer->isActive(); + timer->stop(); + TQGLWidget::hideEvent( e ); +} + +void GLControlWidget::animate() +{ +} + +void GLControlWidget::setAnimationDelay( int ms ) +{ + timer->stop(); + delay = ms; + if ( animation ) { + wasAnimated = TRUE; + timer->start( delay ); + } +} diff --git a/examples/demo/opengl/glcontrolwidget.h b/examples/demo/opengl/glcontrolwidget.h new file mode 100644 index 000000000..7a1b6174b --- /dev/null +++ b/examples/demo/opengl/glcontrolwidget.h @@ -0,0 +1,56 @@ +#ifndef GLCONTROLWIDGET_H +#define GLCONTROLWIDGET_H + +#include <qgl.h> + +class GLControlWidget : public TQGLWidget +{ + Q_OBJECT + +public: + GLControlWidget( TQWidget *parent, const char *name = 0, TQGLWidget *share = 0, WFlags f = 0 ); + + virtual void transform(); + +public slots: + void setXRotation( double degrees ); + void setYRotation( double degrees ); + void setZRotation( double degrees ); + + void setScale( double s ); + + void setXTrans( double x ); + void setYTrans( double y ); + void setZTrans( double z ); + + virtual void setRotationImpulse( double x, double y, double z ); + virtual void setTranslationImpulse( double x, double y, double z ); + void drawText(); + +protected: + void setAnimationDelay( int ms ); + void mousePressEvent( TQMouseEvent *e ); + void mouseReleaseEvent( TQMouseEvent *e ); + void mouseMoveEvent( TQMouseEvent * ); + void mouseDoubleClickEvent( TQMouseEvent * ); + void wheelEvent( TQWheelEvent * ); + + void showEvent( TQShowEvent * ); + void hideEvent( TQHideEvent * ); + + GLfloat xRot, yRot, zRot; + GLfloat xTrans, yTrans, zTrans; + GLfloat scale; + bool animation; + +protected slots: + virtual void animate(); + +private: + bool wasAnimated; + TQPoint oldPos; + TQTimer* timer; + int delay; +}; + +#endif diff --git a/examples/demo/opengl/glgear.cpp b/examples/demo/opengl/glgear.cpp new file mode 100644 index 000000000..07c5f3694 --- /dev/null +++ b/examples/demo/opengl/glgear.cpp @@ -0,0 +1,271 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// Draws a gear. +// +// Portions of this code have been borrowed from Brian Paul's Mesa +// distribution. +// + +#include "glgear.h" + +#include <math.h> + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/* + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth ) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat angle, da; + GLfloat u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth/2.0; + r2 = outer_radius + tooth_depth/2.0; + + const double pi = 3.14159264; + da = 2.0*pi / teeth / 4.0; + + glShadeModel( GL_FLAT ); + + glNormal3f( 0.0, 0.0, 1.0 ); + + /* draw front face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + /* draw front sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*pi / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + + glNormal3f( 0.0, 0.0, -1.0 ); + + /* draw back face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*pi / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + } + glEnd(); + + + /* draw outward faces of teeth */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + u = r2*cos(angle+da) - r1*cos(angle); + v = r2*sin(angle+da) - r1*sin(angle); + len = sqrt( u*u + v*v ); + u /= len; + v /= len; + glNormal3f( v, -u, 0.0 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + u = r1*cos(angle+3*da) - r2*cos(angle+2*da); + v = r1*sin(angle+3*da) - r2*sin(angle+2*da); + glNormal3f( v, -u, 0.0 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + } + + glVertex3f( r1*cos(0.0), r1*sin(0.0), width*0.5 ); + glVertex3f( r1*cos(0.0), r1*sin(0.0), -width*0.5 ); + + glEnd(); + + + glShadeModel( GL_SMOOTH ); + + /* draw inside radius cylinder */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glNormal3f( -cos(angle), -sin(angle), 0.0 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + } + glEnd(); + +} + +void GLGear::draw() +{ + glPushMatrix(); + glRotatef( view_rotx, 1.0, 0.0, 0.0 ); + glRotatef( view_roty, 0.0, 1.0, 0.0 ); + glRotatef( view_rotz, 0.0, 0.0, 1.0 ); + + glPushMatrix(); + glTranslatef( -3.0, -2.0, 0.0 ); + glRotatef( angle, 0.0, 0.0, 1.0 ); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( 3.1, -2.0, 0.0 ); + glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 ); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( -3.1, 2.2, -1.8 ); + glRotatef( 90.0, 1.0, 0.0, 0.0 ); + glRotatef( 2.0*angle-2.0, 0.0, 0.0, 1.0 ); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); +} + +GLGear::GLGear( TQWidget *parent, const char *name, WFlags f ) + : GLControlWidget( parent, name, 0, f ) +{ + scale = 1.0; + setAnimationDelay( 15 ); + view_rotx = 20.0; + view_roty = 30.0; + view_rotz = 0.0; + angle = 0.0; +} + +void GLGear::initializeGL() +{ + static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 }; + static GLfloat ared[4] = {0.8, 0.1, 0.0, 1.0 }; + static GLfloat agreen[4] = {0.0, 0.8, 0.2, 1.0 }; + static GLfloat ablue[4] = {0.2, 0.2, 1.0, 1.0 }; + + glLightfv( GL_LIGHT0, GL_POSITION, pos ); + glEnable( GL_CULL_FACE ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_DEPTH_TEST ); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ared ); + gear( 1.0, 4.0, 1.0, 20, 0.7 ); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, agreen ); + gear( 0.5, 2.0, 2.0, 10, 0.7 ); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ablue ); + gear( 1.3, 2.0, 0.5, 10, 0.7 ); + glEndList(); + + glEnable( GL_NORMALIZE ); +} + + +void GLGear::resizeGL( int width, int height ) +{ + GLfloat w = (float) width / (float) height; + GLfloat h = 1.0; + + glViewport( 0, 0, width, height ); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum( -w, w, -h, h, 5.0, 60.0 ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -40.0 ); +} + + +void GLGear::paintGL() +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glPushMatrix(); + transform(); + draw(); + drawText(); + + glPushAttrib( GL_LIGHTING_BIT | GL_TEXTURE_BIT ); + glDisable( GL_LIGHTING ); + glDisable( GL_TEXTURE_2D ); + qglColor( green ); + glLineWidth( 1.0 ); + glBegin( GL_LINES ); + { + glVertex3f( 0.0, 0.0, 0.0 ); + glVertex3f( 2.98, 2.98, 2.98 ); + } + glEnd(); + renderText( 3.0, 3.0, 3.0, "Gears", TQFont( "helvetica", 12, TQFont::Bold, TRUE ) ); + glPopMatrix(); + glPopAttrib(); +} + +void GLGear::animate() +{ + angle += 2.0; + view_roty += 1.0; + updateGL(); +} diff --git a/examples/demo/opengl/glgear.h b/examples/demo/opengl/glgear.h new file mode 100644 index 000000000..fed4256ca --- /dev/null +++ b/examples/demo/opengl/glgear.h @@ -0,0 +1,26 @@ +#ifndef GLGEAR_H +#define GLGEAR_H + +#include "glcontrolwidget.h" + +class GLGear : public GLControlWidget +{ + Q_OBJECT + +public: + GLGear( TQWidget *parent = 0, const char *name = 0, WFlags f = 0 ); + +protected: + void draw(); + void animate(); + void initializeGL(); + void resizeGL( int, int ); + void paintGL(); + +private: + GLfloat view_rotx, view_roty, view_rotz; + GLint gear1, gear2, gear3; + GLfloat angle; +}; + +#endif // GLGEAR_H diff --git a/examples/demo/opengl/glinfo.h b/examples/demo/opengl/glinfo.h new file mode 100644 index 000000000..70266fc1d --- /dev/null +++ b/examples/demo/opengl/glinfo.h @@ -0,0 +1,26 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef GLINFO_H +#define GLINFO_H + +#include <qstring.h> + +class GLInfo +{ +public: + GLInfo(); + TQString info();//extensions(); +/* TQString configs(); */ + +protected: + TQString infotext; +/* TQString config; */ +}; +#endif diff --git a/examples/demo/opengl/glinfo_x11.cpp b/examples/demo/opengl/glinfo_x11.cpp new file mode 100644 index 000000000..5155f87c8 --- /dev/null +++ b/examples/demo/opengl/glinfo_x11.cpp @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#define QT_CLEAN_NAMESPACE // avoid clashes with Xmd.h + +#include <qstringlist.h> +#include <qgl.h> +#include "glinfo.h" + +#include <GL/glx.h> +#include <GL/gl.h> +#include <GL/glu.h> + +#ifndef GLX_NONE_EXT +#define GLX_NONE_EXT 0x8000 +#endif + +typedef struct visualAttribs { + /* X visual attribs */ + int id; + int c_class; + int depth; + int redMask, greenMask, blueMask; + int colormapSize; + int bitsPerRGB; + /* GL visual attribs */ + int supportsGL; + int transparent; + int bufferSize; + int level; + int rgba; + int doubleBuffer; + int stereo; + int auxBuffers; + int redSize, greenSize, blueSize, alphaSize; + int depthSize; + int stencilSize; + int accumRedSize, accumGreenSize, accumBlueSize, accumAlphaSize; + int numSamples, numMultisample; + int visualCaveat; +} VisualAttribs; + +static void screenInfo( Display *dpy, int scrnum, TQString &infotext ) +{ + const char *serverVendor = glXQueryServerString( dpy, scrnum, GLX_VENDOR ); + const char *serverVersion = glXQueryServerString( dpy, scrnum, GLX_VERSION ); + const char *serverExtensions = glXQueryServerString( dpy, scrnum, GLX_EXTENSIONS ); + const char *clientVendor = glXGetClientString( dpy, GLX_VENDOR ); + const char *clientVersion = glXGetClientString( dpy, GLX_VERSION ); + const char *clientExtensions = glXGetClientString( dpy, GLX_EXTENSIONS ); + const char *glxExtensions = glXQueryExtensionsString( dpy, scrnum ); + const char *glVendor = (const char *) glGetString( GL_VENDOR ); + const char *glRenderer = (const char *) glGetString( GL_RENDERER ); + const char *glVersion = (const char *) glGetString( GL_VERSION ); + const char *glExtensions = (const char *) glGetString( GL_EXTENSIONS ); + const char *gluVersion = (const char *) gluGetString( (GLenum) GLU_VERSION ); + const char *gluExtensions = (const char *) gluGetString( (GLenum) GLU_EXTENSIONS ); + + infotext.sprintf( "%sServer GLX vendor string: %s\n", infotext.ascii(), serverVendor ); + infotext.sprintf( "%sServer GLX version string: %s\n", infotext.ascii(), serverVersion ); + infotext.sprintf( "%sServer GLX extensions:\n", infotext.ascii() ); + + infotext += TQString( serverExtensions ).replace( ' ', '\n' ) + "\n\n"; + + infotext.sprintf( "%sClient GLX vendor string: %s\n", infotext.ascii(), clientVendor ); + infotext.sprintf( "%sClient GLX version string: %s\n", infotext.ascii(), clientVersion ); + infotext.sprintf( "%sClient GLX extensions:\n", infotext.ascii() ); + + infotext += TQString( clientExtensions ).replace( ' ', '\n' ) + "\n\n"; + + infotext.sprintf( "%sGLX extensions:\n", infotext.ascii() ); + + infotext += TQString( glxExtensions ).replace( ' ', '\n' ) + "\n\n"; + + infotext.sprintf( "%sOpenGL vendor string: %s\n", infotext.ascii(), glVendor ); + infotext.sprintf( "%sOpenGL renderer string: %s\n", infotext.ascii(), glRenderer ); + infotext.sprintf( "%sOpenGL version string: %s\n", infotext.ascii(), glVersion ); + infotext.sprintf( "%sOpenGL extensions:\n", infotext.ascii() ); + + infotext += TQString( glExtensions ).replace( ' ', '\n' ) + "\n\n"; + + infotext.sprintf( "%sGLU version: %s\n", infotext.ascii(), gluVersion ); + infotext.sprintf( "%sGLU extensions:\n", infotext.ascii() ); + + infotext += TQString( gluExtensions ).replace( ' ', '\n' ) + "\n\n"; +} + +static const char * visualClassName( int cls ) +{ + switch ( cls ) { + case StaticColor: + return "StaticColor"; + case PseudoColor: + return "PseudoColor"; + case StaticGray: + return "StaticGray"; + case GrayScale: + return "GrayScale"; + case TrueColor: + return "TrueColor"; + case DirectColor: + return "DirectColor"; + default: + return ""; + } +} + +static const char * caveatString( int caveat ) +{ + switch ( caveat ) { +#if defined(GLX_EXT_visual_rating) + case GLX_NONE_EXT: + return "None"; + case GLX_SLOW_VISUAL_EXT: + return "Slow"; + case GLX_NON_CONFORMANT_VISUAL_EXT: + return "Nonconformant"; +#endif + default: + return "<none>"; + } +} + +static void visualAttribs( Display * dpy, XVisualInfo * vi, VisualAttribs * attribs ) +{ + memset( attribs, 0, sizeof( VisualAttribs ) ); + + attribs->id = vi->visualid; + attribs->c_class = vi->c_class; + attribs->depth = vi->depth; + attribs->redMask = vi->red_mask; + attribs->greenMask = vi->green_mask; + attribs->blueMask = vi->blue_mask; + attribs->colormapSize = vi->colormap_size; + attribs->bitsPerRGB = vi->bits_per_rgb; + + if ( glXGetConfig( dpy, vi, GLX_USE_GL, &attribs->supportsGL ) != 0 ) + return; + attribs->accumAlphaSize = 0; + glXGetConfig( dpy, vi, GLX_BUFFER_SIZE, &attribs->bufferSize ); + glXGetConfig( dpy, vi, GLX_LEVEL, &attribs->level ); + glXGetConfig( dpy, vi, GLX_RGBA, &attribs->rgba ); + glXGetConfig( dpy, vi, GLX_DOUBLEBUFFER, &attribs->doubleBuffer ); + glXGetConfig( dpy, vi, GLX_STEREO, &attribs->stereo ); + glXGetConfig( dpy, vi, GLX_AUX_BUFFERS, &attribs->auxBuffers ); + glXGetConfig( dpy, vi, GLX_RED_SIZE, &attribs->redSize ); + glXGetConfig( dpy, vi, GLX_GREEN_SIZE, &attribs->greenSize ); + glXGetConfig( dpy, vi, GLX_BLUE_SIZE, &attribs->blueSize ); + glXGetConfig( dpy, vi, GLX_ALPHA_SIZE, &attribs->alphaSize ); + glXGetConfig( dpy, vi, GLX_DEPTH_SIZE, &attribs->depthSize ); + glXGetConfig( dpy, vi, GLX_STENCIL_SIZE, &attribs->stencilSize ); + glXGetConfig( dpy, vi, GLX_ACCUM_RED_SIZE, &attribs->accumRedSize ); + glXGetConfig( dpy, vi, GLX_ACCUM_GREEN_SIZE, &attribs->accumGreenSize ); + glXGetConfig( dpy, vi, GLX_ACCUM_BLUE_SIZE, &attribs->accumBlueSize ); + glXGetConfig( dpy, vi, GLX_ACCUM_ALPHA_SIZE, &attribs->accumAlphaSize ); + + attribs->transparent = 0; // transparent pixel missing + attribs->numSamples = 0; // multisample tests missing + attribs->numMultisample = 0; + +#if defined(GLX_EXT_visual_rating) + const char *ext = glXQueryExtensionsString( dpy, vi->screen ); + if ( ext && strstr( ext, "GLX_EXT_visual_rating" ) ) + glXGetConfig(dpy, vi, GLX_VISUAL_CAVEAT_EXT, &attribs->visualCaveat); + else + attribs->visualCaveat = GLX_NONE_EXT; +#else + attribs->visualCaveat = 0; +#endif +} + +static void visualInfo( Display *dpy, int scrnum, TQString &configs ) +{ + TQString str; + XVisualInfo *visuals, temp; + int numVisuals; + long mask; + int i; + + /* get list of all visuals on this screen */ + temp.screen = scrnum; + mask = VisualScreenMask; + visuals = XGetVisualInfo( dpy, mask, &temp, &numVisuals ); + + VisualAttribs attribs; + configs.append( "Vis Vis Visual Trans buff lev render DB ste r g b a aux dep ste accum buffers MS MS\n" + " ID Depth Type parent size el type reo sz sz sz sz buf th ncl r g b a num bufs Caveat\n" + "-----------------------------------------------------------------------------------------------------------\n" ); + for ( i = 0; i < numVisuals; i++ ) { + visualAttribs( dpy, &visuals[i], &attribs ); + str.sprintf( "0x%2x %2d %-12s %d %2d %d %-4s %d %d %d %d %d %d" + " %d %2d %d %2d %2d %2d %2d %d %d %s\n", + attribs.id, + attribs.depth, + visualClassName( attribs.c_class ), + attribs.transparent, + attribs.bufferSize, + attribs.level, + attribs.rgba ? "rgba" : "ci", + attribs.doubleBuffer, + attribs.stereo, + attribs.redSize, + attribs.greenSize, + attribs.blueSize, + attribs.alphaSize, + attribs.auxBuffers, + attribs.depthSize, + attribs.stencilSize, + attribs.accumRedSize, + attribs.accumGreenSize, + attribs.accumBlueSize, + attribs.accumAlphaSize, + attribs.numSamples, + attribs.numMultisample, + caveatString( attribs.visualCaveat ) ); + configs.append( str ); + } + + + XFree( visuals ); +} + +GLInfo::GLInfo() +{ + TQGLWidget gl((TQWidget *) 0); + gl.makeCurrent(); + Display *dpy; + char *displayName = 0; + int numScreens, scrNum; + + dpy = gl.x11Display(); + if ( !dpy ) { + qWarning( "Error: unable to open display %s\n", displayName ); + } + + numScreens = ScreenCount( dpy ); + infotext.sprintf( "Display name: %s\nDirect rendering: %s\n", DisplayString( dpy ), + gl.format().directRendering() ? "Yes" : "No" ); + + for ( scrNum = 0; scrNum < numScreens; scrNum++ ) { + screenInfo( dpy, scrNum, infotext ); + visualInfo( dpy, scrNum, infotext ); + if ( scrNum + 1 < numScreens ) + infotext.append( "\n\n" ); + } +} + +TQString GLInfo::info() +{ + return infotext; +} diff --git a/examples/demo/opengl/glinfotext.h b/examples/demo/opengl/glinfotext.h new file mode 100644 index 000000000..80f42baba --- /dev/null +++ b/examples/demo/opengl/glinfotext.h @@ -0,0 +1,23 @@ +#include <qlayout.h> +#include <qtextview.h> +#include <qfont.h> +#include "glinfo.h" + +class GLInfoText : public TQWidget +{ +public: + GLInfoText(TQWidget *parent) + : TQWidget(parent) + { + view = new TQTextView(this); + view->setFont(TQFont("courier", 10)); + view->setWordWrap(TQTextEdit::NoWrap); + TQHBoxLayout *l = new TQHBoxLayout(this); + l->addWidget(view); + GLInfo info; + view->setText(info.info()); + } + +private: + TQTextView *view; +}; diff --git a/examples/demo/opengl/gllandscape.cpp b/examples/demo/opengl/gllandscape.cpp new file mode 100644 index 000000000..0aa836687 --- /dev/null +++ b/examples/demo/opengl/gllandscape.cpp @@ -0,0 +1,880 @@ +#include <qimage.h> +#include "gllandscape.h" + + +#include <math.h> + +#include "fbm.h" + +#ifndef PI +#define PI 3.14159 +#endif + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#pragma warning(disable:4244) // init: truncation from const double to float +#endif + +GLLandscape::GLLandscape( TQWidget * parent, const char * name ) + : TQGLWidget( parent, name ) +{ + mouseButtonDown = FALSE; + animationRunning = FALSE; + oldX = oldY = oldZ = 0.0; + landscape = 0; + vertexNormals = 0; + normals = 0; + wave = 0; + wt = 0; + cubeRot = 0; + createGrid( 50 ); + setWireframe( 0 ); +} + +GLLandscape::~GLLandscape() +{ + destroyGrid(); +} + +void GLLandscape::initializeGL() +{ + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) views[AxisView].model ); + + glTranslatef( 0.0, 0.0, -50.0 ); + glRotatef( -45, 1, 0, 0 ); + glRotatef( -45, 0, 0, 1 ); + glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) views[CurrentView].model ); + glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) views[DefaultView].model ); + + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + /* Use GL utility library function to obtain desired view */ + gluPerspective( 60, 1, 1, 250 ); + glGetFloatv( GL_PROJECTION_MATRIX, (GLfloat *)views[CurrentView].projection ); + glGetFloatv( GL_PROJECTION_MATRIX, (GLfloat *)views[DefaultView].projection ); + + qglClearColor( black ); + glDepthFunc( GL_LESS ); + calculateVertexNormals(); + + TQImage tex; + tex.load("opengl/qtlogo.png"); + tex = TQGLWidget::convertToGLFormat(tex); // flipped 32bit RGBA + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); + initDisplayLists(); +} + +void GLLandscape::resizeGL( int width, int height ) +{ + glViewport( 0, 0, width, height ); +} + +void GLLandscape::paintGL() +{ + TQString str; + GLboolean lighting; + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + switch ( mode ) { + case Wireframe: + drawWireframe(); + str = tr( "Wireframe" ); + break; + case Filled: + drawFilled(); + str = tr( "Flat shaded" ); + break; + case SmoothShaded: + str = tr( "Smooth shaded" ); + drawSmoothShaded(); + break; + case Landscape: + drawSmoothShaded(); + str = tr( "Landscape" ); + break; + } + glGetBooleanv( GL_LIGHTING, &lighting ); + if ( lighting ) + glDisable( GL_LIGHTING ); + qglColor( white ); + renderText(15, height() - 15, str); + drawAxis(); + drawCube(); + if ( lighting ) + glEnable( GL_LIGHTING ); +} + +void GLLandscape::drawAxis() +{ + glPushAttrib(GL_ALL_ATTRIB_BITS); + glViewport(15, 20, 50, 50); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(-1.1, 1.1, -1.1, 1.1, 0.1, 10); + glTranslatef(0, 0, -1.2); + glRotatef(-45, 1, 0, 0); + glRotatef(-45, 0, 0, 1); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadMatrixf((GLfloat *) views[AxisView].model); + + glCallList(axisList); + qglColor(white); + renderText(1.1f, 0, 0, "x"); + renderText(0, 1.1f, 0, "y"); + renderText(0, 0, 1.1f, "z"); + + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glPopAttrib(); +} + +void GLLandscape::drawCube() +{ + glPushAttrib(GL_ALL_ATTRIB_BITS); + glViewport(width()-75, 0, 75, 75); + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + glOrtho(-1.1, 1.1, -1.1, 1.1, 0.1, 10); + glTranslatef(0, 0, -1.2); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glRotatef(cubeRot, 1, 0, 0); + glRotatef(cubeRot, 0, 1, 0); + glRotatef(cubeRot, 0, 0, 1); + glTranslatef(-0.5, -0.5, -0.5); + + glCallList(cubeList); + + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glPopAttrib(); +} + +void GLLandscape::drawWireframe() +{ + qglColor( white ); + glBegin( GL_LINES ); + { + for ( int y = 0; y < (gridSize-1); y++ ) + for ( int x = 0; x < (gridSize-1); x++) { + glVertex3f( x-gridHalf, y-gridHalf, landscape[x][y] ); + glVertex3f( x+1-gridHalf, y-gridHalf, landscape[x+1][y] ); + glVertex3f( x-gridHalf, y-gridHalf, landscape[x][y] ); + glVertex3f( x+1-gridHalf, y+1-gridHalf, landscape[x+1][y+1] ); + + glVertex3f( x-gridHalf, y-gridHalf, landscape[x][y] ); + glVertex3f( x-gridHalf, y+1-gridHalf, landscape[x][y+1] ); + } + } + glEnd(); + glBegin( GL_LINE_STRIP ); + { + for ( int x = 0; x < gridSize; x++ ) { + glVertex3f( x-gridHalf, gridHalf-1, landscape[x][gridSize-1] ); + } + } + glEnd(); + glBegin( GL_LINE_STRIP ); + { + for ( int y = 0; y < gridSize; y++ ) { + glVertex3f( gridHalf-1, y-gridHalf, landscape[gridSize-1][y] ); + } + } + glEnd(); +} + +void GLLandscape::drawFilled() +{ + for ( int y = 0; y < gridSize-1; y++ ) + for ( int x = 0; x < gridSize-1; x++ ) { + qglColor( red ); + glBegin( GL_TRIANGLE_STRIP ); + { + glVertex3f(x-gridHalf,y-gridHalf, landscape[x][y]); + glVertex3f(x+1-gridHalf,y-gridHalf, landscape[x+1][y]); + glVertex3f(x-gridHalf,y+1-gridHalf, landscape[x][y+1]); + } + glEnd(); + qglColor( white ); + glBegin( GL_TRIANGLE_STRIP ); + { + glVertex3f(x+1-gridHalf,y-gridHalf, landscape[x+1][y]); + glVertex3f(x+1-gridHalf,y+1-gridHalf, landscape[x+1][y+1]); + glVertex3f(x-gridHalf,y+1-gridHalf, landscape[x][y+1]); + } + glEnd(); + } +} + +void GLLandscape::drawSmoothShaded() +{ + if ( mode == SmoothShaded ) { + GLfloat materialAmbient[] = { 0.00, 0.00, 1.0, 0.0 }; + GLfloat materialShininess[] = { 128.0 }; + GLfloat materialSpecular[] = { 1.0, 1.0, 1.0, 0.0 }; + + glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular ); + glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient ); + glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess ); + } else { + GLfloat materialAmbient[] = { 0.20, 0.33, 0.20, 0.0 }; + GLfloat materialShininess[] = { 1.0 }; + GLfloat materialSpecular[] = { 0.1, 0.1, 0.1, 0.1 }; + + glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular ); + glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient ); + glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess ); + } + + for ( int y = 0; y < gridSize-1; y++ ) + for ( int x = 0; x < gridSize-1; x++ ) { + glBegin( GL_POLYGON ); + { + glNormal3dv(vertexNormals[x][y].n); + glVertex3f(x-gridHalf,y-gridHalf,landscape[x][y]); + + glNormal3dv(vertexNormals[x+1][y].n); + glVertex3f(x+1-gridHalf, y-gridHalf, landscape[x+1][y]); + + glNormal3dv(vertexNormals[x+1][y+1].n); + glVertex3f(x+1-gridHalf, y+1-gridHalf, landscape[x+1][y+1]); + } + glEnd(); + + glBegin( GL_POLYGON ); + { + glNormal3dv(vertexNormals[x][y].n); + glVertex3f(x-gridHalf,y-gridHalf, landscape[x][y]); + + glNormal3dv(vertexNormals[x+1][y+1].n); + glVertex3f(x+1-gridHalf,y+1-gridHalf, landscape[x+1][y+1]); + + glNormal3dv(vertexNormals[x][y+1].n); + glVertex3f(x-gridHalf,y+1-gridHalf, landscape[x][y+1]); + } + glEnd(); + } + + // Draw water + if ( mode == Landscape ) { + GLfloat materialAmbient[] = { 0.00, 0.00, 1.0, 0.0 }; + GLfloat materialShininess[] = { 128.0 }; + GLfloat materialSpecular[] = { 1.0, 1.0, 1.0, 0.0 }; + + glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular ); + glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient ); + glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess ); + + glEnable( GL_BLEND ); + glBegin( GL_POLYGON ); + { + glNormal3f( 0, 0, 1 ); + glVertex3f( -gridHalf, -gridHalf, .2 ); + glNormal3f( 0, 0, 1 ); + glVertex3f( -gridHalf, gridHalf, .2 ); + glNormal3f( 0, 0, 1 ); + glVertex3f( gridHalf, gridHalf, .2 ); + glNormal3f( 0, 0, 1 ); + glVertex3f( gridHalf, -gridHalf, .2 ); + + } + glEnd(); + glDisable( GL_BLEND ); + } +} + +void GLLandscape::setGridSize( int size ) +{ + destroyGrid(); // destroy old grid + createGrid( size ); // create new grid + initializeGL(); + updateGL(); +} + +void GLLandscape::createGrid( int size ) +{ + if ( (size % 2) != 0 ) + size++; + gridSize = size; + gridHalf = gridSize / 2; + initFractals = TRUE; + landscape = new double*[gridSize]; + normals = new gridNormals*[gridSize]; + vertexNormals = new avgNormals*[gridSize]; + wt = new double*[gridSize]; + wave = new double*[gridSize]; + for ( int i = 0; i < gridSize; i++ ) { + landscape[i] = new double[gridSize]; + normals[i] = new gridNormals[gridSize]; + vertexNormals[i] = new avgNormals[gridSize]; + wt[i] = new double[gridSize]; + wave[i] = new double[gridSize]; + + memset( landscape[i], 0, gridSize*sizeof(double) ); + memset( normals[i], 0, gridSize*sizeof(gridNormals) ); + memset( vertexNormals[i], 0, gridSize*sizeof(avgNormals) ); + memset( wt[i], 0, gridSize*sizeof(double) ); + memset( wave[i], 0, gridSize*sizeof(double) ); + } +} + +void GLLandscape::destroyGrid() +{ + if ( landscape != NULL ) { + for( int i = 0; i < gridSize; i++ ) { + delete[] landscape[i]; + delete[] normals[i]; + delete[] vertexNormals[i]; + delete[] wt[i]; + delete[] wave[i]; + } + delete[] landscape; + delete[] normals; + delete[] vertexNormals; + delete[] wt; + delete[] wave; + } + landscape = 0; +} + +void GLLandscape::rotate( GLfloat deg, Axis axis ) +{ + makeCurrent(); + glMatrixMode( GL_MODELVIEW ); + for ( int i = DefaultView; i <= AxisView; i++ ) { + glLoadMatrixf((GLfloat *) views[i].model); + if ( axis == XAxis ) + glRotatef( deg, 1, 0, 0 ); + else if ( axis == YAxis ) + glRotatef( deg, 0, 1, 0 ); + else + glRotatef( deg, 0, 0, 1 ); + glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *) views[i].model); + } + glLoadMatrixf((GLfloat *) views[CurrentView].model); +} + +void GLLandscape::rotateX( int deg ) +{ + static int oldDeg = 0; + + rotate( deg-oldDeg, XAxis ); + oldDeg = deg; + updateGL(); +} + +void GLLandscape::rotateY( int deg ) +{ + static int oldDeg = 0; + + rotate( deg-oldDeg, YAxis ); + oldDeg = deg; + updateGL(); +} + +void GLLandscape::rotateZ( int deg ) +{ + static int oldDeg = 0; + + rotate( deg-oldDeg, ZAxis ); + oldDeg = deg; + updateGL(); +} + +void GLLandscape::zoom( int z ) +{ + float zoom; + if ( z < 100 ) { + zoom = 1 + 4.99 - (z*5.0 / 100.0); + } else { + z = 200 - z; + zoom = z / 100.0; + } + makeCurrent(); + glMatrixMode( GL_MODELVIEW ); + // Always scale the original model matrix + glLoadMatrixf((GLfloat *) views[DefaultView].model); + glScalef( zoom, zoom, zoom ); + glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *) views[CurrentView].model); + updateGL(); +} + +void GLLandscape::resetGrid() +{ + setGridSize( gridSize ); +} + +void GLLandscape::fractalize() +{ + Vector p; + double value; + double roughness = 0.5; + int frequency = 50; + + p.x = p.y = p.z = 0; + // Initialise fbm routine + if ( initFractals ) { + initFractals = FALSE; + value = fBm( p, roughness, 2.0, 8.0, 1 ); + } + + // Fractalize grid + for ( int x = 0; x < gridSize; x++ ) { + for ( int y = 0; y < gridSize; y++ ) { + p.x = (double) x / (101 - frequency); + p.y = (double) y / (101 - frequency); + p.z = (double) landscape[x][y] / (101 - frequency); + value = fBm(p, roughness, 2.0, 8.0, 0); + landscape[x][y] += value; + } + } + calculateVertexNormals(); + updateGL(); +} + + +// +// Calculate the vector cross product of v and w, store result in n. +// +static void crossProduct( double v[3], double w[3], double n[3] ) +{ + n[0] = v[1]*w[2]-w[1]*v[2]; + n[1] = w[0]*v[2]-v[0]*w[2]; + n[2] = v[0]*w[1]-w[0]*v[1]; +} + +void GLLandscape::calculateVertexNormals() +{ + double len, v[3], v2[3], w[3], w2[3], n[3], n2[3]; + + // Calculate the surface normals for all polygons in the + // height field + for ( int i = 0; i < (gridSize-1); i++ ) + for ( int k = 0; k < (gridSize-1); k++ ) { + /* Lower poly normal */ + v[0] = 1; // (i+1)-i + v[1] = 0; // k-k + v[2] = landscape[i+1][k]-landscape[i][k]; + w[0] = 1; // (i+1)-i + w[1] = 1; // (k+1)-k + w[2] = landscape[i+1][k+1]-landscape[i][k]; + crossProduct( v, w, n ); + len = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); + normals[i][k].l[0] = n[0]/len; + normals[i][k].l[1] = n[1]/len; + normals[i][k].l[2] = n[2]/len; + + /* Upper poly normal */ + v2[0] = -1.0; // i-(i+1); + v2[1] = 0.0; // (k+1)-(k+1); + v2[2] = landscape[i][k+1]-landscape[i+1][k+1]; + w2[0] = -1.0; // i-(i+1); + w2[1] = -1.0; // k-(k+1); + w2[2] = landscape[i][k]-landscape[i+1][k+1]; + crossProduct( v2, w2, n2 ); + len = sqrt(n2[0]*n2[0]+n2[1]*n2[1]+n2[2]*n2[2]); + normals[i][k].u[0] = n2[0]/len; + normals[i][k].u[1] = n2[1]/len; + normals[i][k].u[2] = n2[2]/len; + } + + // Calculate proper vertex normals + averageNormals(); +} + +void GLLandscape::averageNormals() +{ + // Calculate the average surface normal for a vertex based on + // the normals of the surrounding polygons + for ( int i = 0; i < gridSize; i++ ) + for ( int k = 0; k < gridSize; k++ ) { + if ( i > 0 && k > 0 && i < (gridSize-1) && k < (gridSize-1) ) { + // For vertices that are *not* on the edge of the height field + for ( int t = 0; t < 3; t++ ) // X, Y and Z components + vertexNormals[i][k].n[t] = ( normals[i][k].u[t] + + normals[i][k].l[t] + + normals[i][k-1].u[t] + + normals[i-1][k-1].u[t] + + normals[i-1][k-1].l[t] + + normals[i-1][k].l[t] )/6.0; + } else { + // Vertices that are on the edge of the height field retquire + // special attention.. + if ( i == 0 && k == 0 ) { + for ( int t = 0; t < 3; t++ ) + vertexNormals[i][k].n[t] = ( normals[i][k].u[t] + + normals[i][k].l[t] )/2.0; + } else if ( i == gridSize-1 && k == gridSize-1 ) { + for ( int t = 0; t < 3; t++ ) + vertexNormals[i][k].n[t] = ( normals[i][k].u[t] + + normals[i][k].l[t] )/2.0; + } else if ( i == gridSize-1) { + for ( int t = 0; t < 3; t++ ) + vertexNormals[i][k].n[t] = vertexNormals[i-1][k].n[t]; + } else if ( k == gridSize-1 ) { + for ( int t = 0; t < 3; t++ ) + vertexNormals[i][k].n[t] = vertexNormals[i][k-1].n[t]; + } else if ( k > 0 ) { + for ( int t = 0; t < 3; t++ ) + vertexNormals[i][k].n[t] = (normals[i][k].u[t] + + normals[i][k].l[t] + + normals[i][k-1].u[t])/3.0; + } else if ( i > 0 ) { + for ( int t = 0; t < 3; t++ ) + vertexNormals[i][k].n[t] = (normals[i][k].u[t] + + normals[i][k].l[t] + + normals[i-1][k].l[t])/3.0; + } + } + } +} + +void GLLandscape::setWireframe( int state ) +{ + if ( state != 1 ) { + // Enable line antialiasing + makeCurrent(); + glEnable( GL_LINE_SMOOTH ); + glEnable( GL_BLEND ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_LIGHTING ); + glDisable( GL_NORMALIZE ); + + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glHint( GL_LINE_SMOOTH_HINT, GL_DONT_CARE ); + + mode = Wireframe; + updateGL(); + } +} + +void GLLandscape::setFilled( int state ) +{ + if ( state != 1 ) { + makeCurrent(); + glEnable( GL_DEPTH_TEST ); + glDisable( GL_LINE_SMOOTH ); + glDisable( GL_BLEND ); + glDisable( GL_LIGHTING ); + glDisable( GL_NORMALIZE ); + + mode = Filled; + updateGL(); + } +} + +void GLLandscape::setSmoothShaded( int state ) +{ + if ( state != 1 ) { + makeCurrent(); + glEnable( GL_DEPTH_TEST ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_NORMALIZE ); + glDisable( GL_LINE_SMOOTH ); + glDisable( GL_BLEND ); + + glShadeModel( GL_SMOOTH ); + glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE ); + + // Setup lighting and material properties + GLfloat position[] = { 15.0, -15.0, 15.0, 0.0 }; + GLfloat ambient[] = { 0.50, 0.50, 0.50, 0.0 }; + GLfloat diffuse[] = { 1.00, 1.00, 1.00, 0.0 }; + GLfloat specular[] = { 1.0, 1.0, 1.0, 0.0 }; + GLfloat materialAmbient[] = { 0.00, 0.00, 1.0, 0.0 }; + // GLfloat materialDiffuse[] = { 1.00, 1.00, 1.0, 0.0 }; + GLfloat materialShininess[] = { 128.0 }; + GLfloat materialSpecular[] = { 1.0, 1.0, 1.0, 0.0 }; + + glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular ); + // glMaterialfv( GL_FRONT, GL_DIFFUSE, materialDiffuse ); + glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient ); + glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess ); + + glLightfv( GL_LIGHT0, GL_POSITION, position ); + glLightfv( GL_LIGHT0, GL_AMBIENT, ambient ); + glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse ); + glLightfv( GL_LIGHT0, GL_SPECULAR, specular ); + + mode = SmoothShaded; + calculateVertexNormals(); + updateGL(); + } +} + +void GLLandscape::setLandscape( int state ) +{ + if ( state != 1 ) { + makeCurrent(); + glEnable( GL_DEPTH_TEST ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_NORMALIZE ); + glDisable( GL_LINE_SMOOTH ); + glDisable( GL_BLEND ); + + glShadeModel( GL_SMOOTH ); + glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE ); + + // Setup lighting and material properties + GLfloat position[] = { 15.0, -15.0, 15.0, 0.0 }; + GLfloat ambient[] = { 0.50, 0.50, 0.50, 0.0 }; + GLfloat diffuse[] = { 1.00, 1.00, 1.00, 0.0 }; + GLfloat specular[] = { 1.0, 1.0, 1.0, 0.0 }; + + glLightfv( GL_LIGHT0, GL_POSITION, position ); + glLightfv( GL_LIGHT0, GL_AMBIENT, ambient ); + glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse ); + glLightfv( GL_LIGHT0, GL_SPECULAR, specular ); + + glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR ); + + mode = Landscape; + calculateVertexNormals(); + updateGL(); + } +} + +void GLLandscape::mousePressEvent( TQMouseEvent *e ) +{ + oldPos = e->pos(); + mouseButtonDown = TRUE; +} + +void GLLandscape::mouseReleaseEvent( TQMouseEvent *e ) +{ + oldPos = e->pos(); + mouseButtonDown = FALSE; +} + +void GLLandscape::mouseMoveEvent( TQMouseEvent *e ) +{ + GLfloat rx = (GLfloat) (e->x() - oldPos.x()) / width(); + GLfloat ry = (GLfloat) (e->y() - oldPos.y()) / height(); + + if ( e->state() == LeftButton ) { + // Left button down - rotate around X and Y axes + oldX = 180*ry; + oldY = 180*rx; + rotate( oldX, XAxis ); + rotate( oldY, YAxis ); + updateGL(); + } else if ( e->state() == RightButton ) { + // Right button down - rotate around X and Z axes + oldX = 180*ry; + oldZ = 180*rx; + rotate( oldX, XAxis ); + rotate( oldZ, ZAxis ); + updateGL(); + } + oldPos = e->pos(); +} + +void GLLandscape::timerEvent( TQTimerEvent *e ) +{ + if (e->timerId() == cubeTimer) { + cubeRot += 1; + if (!animationRunning) + updateGL(); + return; + } + + int dx, dy; // disturbance point + float s, v, W, t; + int i, j; + + if ( mode == Landscape ) { + dx = dy = 0; + } else { + dx = dy = gridSize >> 1; + } + W = 0.3; + v = -4; // wave speed + + for ( i = 0; i < gridSize; i++ ) + for ( j = 0; j < gridSize; j++ ) + { + s = sqrt( (double) ( (j - dx) * (j - dx) + (i - dy) * (i - dy) ) ); + wt[i][j] += 0.1; + t = s / v; + + if ( mode == Landscape ) { + if ( (landscape[i][j] + wave[i][j]) < 0 ) + landscape[i][j] -= wave[i][j]; + if ( (dy - j != 0) || (dx - i != 0) ) + wave[i][j] = (3 * sin( 2 * PI * W * (wt[i][j] + t ))) / + (0.2*(sqrt( pow((double)(dx-i), 2) + pow((double)(dy-j), 2))+2)); + else + wave[i][j] = ( 3 * sin( 2 * PI * W * ( wt[i][j] + t ) ) ); + if ( landscape[i][j] + wave[i][j] < 0 ) + landscape[i][j] += wave[i][j]; + + } else { + landscape[i][j] -= wave[i][j]; + + if ( s != 0 ) + wave[i][j] = 2 * sin(2 * PI * W * ( wt[i][j] + t )) / + (0.2*(s + 2)); + else + wave[i][j] = 2 * sin( 2 * PI * W * ( wt[i][j] + t ) ); + landscape[i][j] += wave[i][j]; + } + + } + if ( mode == SmoothShaded || mode == Landscape ) + calculateVertexNormals(); + updateGL(); +} + +void GLLandscape::toggleWaveAnimation( bool state ) +{ + if (state) { + animTimer = startTimer(20); + animationRunning = TRUE; + } else { + killTimer(animTimer); + animationRunning = FALSE; + } +} + +void GLLandscape::showEvent( TQShowEvent * ) +{ + if (animationRunning) + animTimer = startTimer(20); + cubeTimer = startTimer(50); +} + +void GLLandscape::hideEvent( TQHideEvent * ) +{ + if (animationRunning) + killTimer(animTimer); + killTimer(cubeTimer); +} + +void GLLandscape::initDisplayLists() +{ + // axisList + axisList = glGenLists(1); + glNewList(axisList, GL_COMPILE); + + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_DEPTH_TEST); + glColor3f(1.0, 0.0, 0.0); + glBegin(GL_LINES); + { + glColor3f(1.0, 0.0, 0.0); + glVertex3f(-1.0f, 0, 0); // x axis + glVertex3f(1.0f, 0, 0); + + glVertex3f(1.0f, 0, 0); + glVertex3f(0.8f, 0.2f, 0); + glVertex3f(1.0f, 0, 0); + glVertex3f(0.8f, -.2f, 0); + + glColor3f(0.0, 1.0, 0.0); + glVertex3f(0, -1.0f, 0); // y axis + glVertex3f(0, 1.0f, 0); + + glVertex3f(0, 1.0f, 0); + glVertex3f(0.2f, 0.8f, 0); + glVertex3f(0, 1.0f, 0); + glVertex3f(-0.2f, 0.8f, 0); + + glColor3f(0.5, 0.5, 1.0); + glVertex3f(0, 0, -1.0f); // z axis + glVertex3f(0, 0, 1.0f); + + glVertex3f(0, 0, 1.0f); + glVertex3f(0, 0.2f, 0.8f); + glVertex3f(0, 0, 1.0f); + glVertex3f(0,-0.2f, 0.8f); + } + glEnd(); + + glEndList(); + + // cubeList + cubeList = glGenLists(1); + glNewList(cubeList, GL_COMPILE); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR); + + glBegin( GL_QUADS ); + { + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); + + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 ); + + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 0.0, 1.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 0.0, 0.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 0.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); + + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); + + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 ); + + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 ); + glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 0.0, 1.0 ); + glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 ); + } + glEnd(); + glDisable(GL_TEXTURE_2D); + + glEndList(); +} diff --git a/examples/demo/opengl/gllandscape.h b/examples/demo/opengl/gllandscape.h new file mode 100644 index 000000000..7d91215c9 --- /dev/null +++ b/examples/demo/opengl/gllandscape.h @@ -0,0 +1,98 @@ +#ifndef GLLANDSCAPE_H +#define GLLANDSCAPE_H + +#include <qgl.h> + +class GLLandscape : public TQGLWidget +{ + Q_OBJECT + +public: + GLLandscape( TQWidget * parent = 0, const char * name = 0 ); + ~GLLandscape(); + +public slots: + void rotateX( int ); + void rotateY( int ); + void rotateZ( int ); + void zoom( int ); + void fractalize(); + void resetGrid(); + + void setWireframe( int ); + void setFilled( int ); + void setSmoothShaded( int ); + void setLandscape( int ); + void setGridSize( int ); + + void toggleWaveAnimation( bool ); + +signals: + void rotatedX( int ); + void rotatedY( int ); + void rotatedZ( int ); + +protected: + void paintGL(); + void initializeGL(); + void resizeGL( int w, int h ); + void mousePressEvent( TQMouseEvent * ); + void mouseReleaseEvent( TQMouseEvent * ); + void mouseMoveEvent( TQMouseEvent * ); + void timerEvent( TQTimerEvent * ); + void showEvent( TQShowEvent * ); + void hideEvent( TQHideEvent * ); + + void drawWireframe(); + void drawFilled(); + void drawSmoothShaded(); + void drawAxis(); + void drawCube(); + +private: + enum Axis { XAxis, YAxis, ZAxis }; + enum RenderModes { Wireframe, Filled, SmoothShaded, Landscape }; + enum Views { DefaultView, CurrentView, AxisView }; + + void rotate( GLfloat deg, Axis axis ); + void calculateVertexNormals(); + void averageNormals(); + void createGrid( int size ); + void destroyGrid(); + void initDisplayLists(); + + RenderModes mode; + + typedef struct grid_normals { + double u[3], l[3]; + } gridNormals; + + // Structure used to store the vertex normals for the landscape + typedef struct avg_normals { + double n[3]; + } avgNormals; + + typedef struct viewMatrix { + GLfloat model[4][4]; // OpenGL model view matrix for the view + GLfloat projection[4][4]; // OpenGL projection matrix for the view + } viewMatrix; + + double ** landscape; // Height field data + double ** wave; // Wave data + double ** wt; // Parameterized wave data + gridNormals ** normals; + avgNormals ** vertexNormals; + viewMatrix views[3]; + + TQPoint oldPos; + GLfloat oldX, oldY, oldZ; + bool initFractals; + int gridSize, gridHalf; + bool animationRunning; + bool mouseButtonDown; + int cubeTimer, animTimer; + GLfloat cubeRot; + GLint axisList, cubeList; +}; + +#endif diff --git a/examples/demo/opengl/gllandscapeviewer.ui b/examples/demo/opengl/gllandscapeviewer.ui new file mode 100644 index 000000000..d587a56a4 --- /dev/null +++ b/examples/demo/opengl/gllandscapeviewer.ui @@ -0,0 +1,623 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>GLLandscapeViewer</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>GLLandscapeViewer</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>731</width> + <height>519</height> + </rect> + </property> + <property name="caption"> + <string>TQt/OpenGL example</string> + </property> + <property name="layoutMargin" stdset="0"> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>Layout9</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>18</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>X-rotation</string> + </property> + </widget> + <widget class="TQThumbWheel"> + <property name="name"> + <cstring>wheelX</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>30</height> + </size> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Y-rotation</string> + </property> + </widget> + <widget class="TQThumbWheel"> + <property name="name"> + <cstring>wheelY</cstring> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>30</height> + </size> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout7</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1_3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Z-rotation</string> + </property> + </widget> + <widget class="TQThumbWheel"> + <property name="name"> + <cstring>wheelZ</cstring> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>30</height> + </size> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>Layout15</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup2</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Rendering mode</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton" row="0" column="0"> + <property name="name"> + <cstring>RadioButton1</cstring> + </property> + <property name="text"> + <string>&Wireframe</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="1"> + <property name="name"> + <cstring>RadioButton1_2</cstring> + </property> + <property name="text"> + <string>Fl&at shaded</string> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="2"> + <property name="name"> + <cstring>RadioButton1_3</cstring> + </property> + <property name="text"> + <string>&Smooth shaded</string> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="3"> + <property name="name"> + <cstring>RadioButton1_3_2</cstring> + </property> + <property name="text"> + <string>&Landscape</string> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout14</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>fractalize_btn_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Fractalize</string> + </property> + <property name="autoRepeat"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton" row="0" column="2"> + <property name="name"> + <cstring>reset_btn</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Reset grid</string> + </property> + <property name="autoRepeat"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton" row="0" column="0"> + <property name="name"> + <cstring>animate_btn</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Animate</string> + </property> + <property name="toggleButton"> + <bool>true</bool> + </property> + <property name="autoRepeat"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>Layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout18</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Zoom</string> + </property> + </widget> + <widget class="TQThumbWheel"> + <property name="name"> + <cstring>wheelZoom</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>30</width> + <height>0</height> + </size> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Size</string> + </property> + </widget> + <widget class="TQThumbWheel"> + <property name="name"> + <cstring>wheelSize</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>30</width> + <height>0</height> + </size> + </property> + </widget> + </vbox> + </widget> + <widget class="TQFrame"> + <property name="name"> + <cstring>Frame5</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>1</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="GLLandscape"> + <property name="name"> + <cstring>landscape</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </hbox> + </widget> + </hbox> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>GLLandscape</class> + <header location="local">gllandscape.h</header> + <sizehint> + <width>100</width> + <height>100</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>3</hordata> + <verdata>3</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image0</pixmap> + <signal>rotatedX(int)</signal> + <slot access="public" specifier="">rotateZ(int)</slot> + <slot access="public" specifier="">rotateY(int)</slot> + <slot access="public" specifier="">rotateX(int)</slot> + <slot access="public" specifier="">zoom(int)</slot> + <slot access="public" specifier="">fractalize()</slot> + <slot access="public" specifier="">setWireframe(int)</slot> + <slot access="public" specifier="">setFilled(int)</slot> + <slot access="public" specifier="">setGridSize(int)</slot> + <slot access="public" specifier="">toggleWaveAnimation(bool)</slot> + <slot access="public" specifier="">setSmoothShaded(int)</slot> + <slot access="public" specifier="">setLandscape(int)</slot> + <slot access="public" specifier="">resetGrid()</slot> + </customwidget> + <customwidget> + <class>TQThumbWheel</class> + <header location="local">qthumbwheel.h</header> + <sizehint> + <width>100</width> + <height>16</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>0</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image0</pixmap> + <signal>valueChanged(int)</signal> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b722ddac1741fc04c5a3201e6615f43085390f22febbb65dd6666dd821dda36996b552b0df6d4055e2d937fdcd82bd361da8f3ab6ddf87e3fa23a431e01e98cb99901a2c6c1ff78bcbf19fe372713275ed6908f441ab51300617649108624641d22a9427c21a192405241a256e08e4850311172a3b95d87159742e98ef09bda403e03271f6a5bc663e9d8214279afd05eaa048f11e242f753c27bb21ee9cef4afc00c1c26728</data> + </image> +</images> +<connections> + <connection> + <sender>RadioButton1</sender> + <signal>stateChanged(int)</signal> + <receiver>landscape</receiver> + <slot>setWireframe(int)</slot> + </connection> + <connection> + <sender>RadioButton1_2</sender> + <signal>stateChanged(int)</signal> + <receiver>landscape</receiver> + <slot>setFilled(int)</slot> + </connection> + <connection> + <sender>animate_btn</sender> + <signal>toggled(bool)</signal> + <receiver>landscape</receiver> + <slot>toggleWaveAnimation(bool)</slot> + </connection> + <connection> + <sender>RadioButton1_3</sender> + <signal>stateChanged(int)</signal> + <receiver>landscape</receiver> + <slot>setSmoothShaded(int)</slot> + </connection> + <connection> + <sender>wheelY</sender> + <signal>valueChanged(int)</signal> + <receiver>landscape</receiver> + <slot>rotateY(int)</slot> + </connection> + <connection> + <sender>wheelZ</sender> + <signal>valueChanged(int)</signal> + <receiver>landscape</receiver> + <slot>rotateZ(int)</slot> + </connection> + <connection> + <sender>wheelSize</sender> + <signal>valueChanged(int)</signal> + <receiver>landscape</receiver> + <slot>setGridSize(int)</slot> + </connection> + <connection> + <sender>wheelZoom</sender> + <signal>valueChanged(int)</signal> + <receiver>landscape</receiver> + <slot>zoom(int)</slot> + </connection> + <connection> + <sender>wheelX</sender> + <signal>valueChanged(int)</signal> + <receiver>landscape</receiver> + <slot>rotateX(int)</slot> + </connection> + <connection> + <sender>RadioButton1_3_2</sender> + <signal>stateChanged(int)</signal> + <receiver>landscape</receiver> + <slot>setLandscape(int)</slot> + </connection> + <connection> + <sender>reset_btn</sender> + <signal>clicked()</signal> + <receiver>landscape</receiver> + <slot>resetGrid()</slot> + </connection> + <connection> + <sender>fractalize_btn_2</sender> + <signal>clicked()</signal> + <receiver>landscape</receiver> + <slot>fractalize()</slot> + </connection> +</connections> +<tabstops> + <tabstop>RadioButton1</tabstop> + <tabstop>RadioButton1_2</tabstop> + <tabstop>RadioButton1_3</tabstop> + <tabstop>RadioButton1_3_2</tabstop> + <tabstop>fractalize_btn_2</tabstop> + <tabstop>reset_btn</tabstop> + <tabstop>animate_btn</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">gllandscapeviewer.ui.h</include> +</includes> +<slots> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/opengl/gllandscapeviewer.ui.h b/examples/demo/opengl/gllandscapeviewer.ui.h new file mode 100644 index 000000000..c82acdc09 --- /dev/null +++ b/examples/demo/opengl/gllandscapeviewer.ui.h @@ -0,0 +1,37 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename slots use TQt Designer which will +** update this file, preserving your code. Create an init() slot in place of +** a constructor, and a destroy() slot in place of a destructor. +*****************************************************************************/ + + +void GLLandscapeViewer::init() +{ + wheelX->setOrientation( Horizontal ); + wheelY->setOrientation( Horizontal ); + wheelZ->setOrientation( Horizontal ); + + wheelZoom->setOrientation( Vertical ); + wheelZoom->setRange( 0, 200 ); + wheelZoom->setValue( 100 ); + + wheelSize->setOrientation( Vertical ); + wheelSize->setRange( 25, 200 ); + wheelSize->setValue( 50 ); + wheelSize->setSteps( 10, 10 ); + + wheelX->setRange( 0, 360 ); + wheelY->setRange( 0, 360 ); + wheelZ->setRange( 0, 360 ); + + wheelX->setTransmissionRatio( 0.5 ); + wheelY->setTransmissionRatio( 0.5 ); + wheelZ->setTransmissionRatio( 0.5 ); +} + +void GLLandscapeViewer::destroy() +{ + +} diff --git a/examples/demo/opengl/gllogo.bmp b/examples/demo/opengl/gllogo.bmp Binary files differnew file mode 100644 index 000000000..ee64a1036 --- /dev/null +++ b/examples/demo/opengl/gllogo.bmp diff --git a/examples/demo/opengl/gltexobj.cpp b/examples/demo/opengl/gltexobj.cpp new file mode 100644 index 000000000..30a9b8c93 --- /dev/null +++ b/examples/demo/opengl/gltexobj.cpp @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget demonstrating the use of TQImages for textures. +** +** Much of the GL code is inspired by the 'spectex' and 'texcyl' +** public domain demo programs by Brian Paul. +** +****************************************************************************/ + +#include "gltexobj.h" +#include <qimage.h> + +/*! + Create a GLTexobj widget +*/ + +GLTexobj::GLTexobj( TQWidget* parent, const char* name, WFlags f ) + : GLControlWidget( parent, name, 0, f ), impX( -2 ), impY( 0.5 ), impZ( 1 ) +{ + object = 0; +} + +/*! + Release allocated resources +*/ + +GLTexobj::~GLTexobj() +{ + makeCurrent(); + glDeleteLists( object, 1 ); +} + + +/*! + Paint the texobj. The actual openGL commands for drawing the texobj are + performed here. +*/ + +void GLTexobj::paintGL() +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glPushMatrix(); + transform(); + glCallList( object ); + drawText(); + glPushAttrib( GL_LIGHTING_BIT | GL_TEXTURE_BIT ); + glDisable( GL_LIGHTING ); + glDisable( GL_TEXTURE_2D ); + qglColor( green ); + glLineWidth( 1.0 ); + glBegin( GL_LINES ); + { + glVertex3f( 0.0f, 0.0f, 1.0f ); + glVertex3f( 0.98f, 0.98f, 0.98f ); + } + glEnd(); + renderText( 1.0, 1.0, 1.0, "Can", TQFont( "helvetica", 12, TQFont::Bold, TRUE ) ); + glPopAttrib(); + glPopMatrix(); +} + + +/*! + Set up the OpenGL rendering state, and define display list +*/ + +void GLTexobj::initializeGL() +{ + // Set up the lights + + GLfloat whiteDir[4] = {2.0, 2.0, 2.0, 1.0}; + GLfloat whiteAmb[4] = {1.0, 1.0, 1.0, 1.0}; + GLfloat lightPos[4] = {30.0, 30.0, 30.0, 1.0}; + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteAmb); + + glMaterialfv(GL_FRONT, GL_DIFFUSE, whiteDir); + glMaterialfv(GL_FRONT, GL_SPECULAR, whiteDir); + glMaterialf(GL_FRONT, GL_SHININESS, 20.0); + + glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDir); // enable diffuse + glLightfv(GL_LIGHT0, GL_SPECULAR, whiteDir); // enable specular + glLightfv(GL_LIGHT0, GL_POSITION, lightPos); + + // Set up the textures + + TQImage tex1, tex2, buf; + + if ( !buf.load( "opengl/gllogo.bmp" ) ) { // Load first image from file + qWarning( "Could not read image file, using single-color instead." ); + TQImage dummy( 128, 128, 32 ); + dummy.fill( TQt::green.rgb() ); + buf = dummy; + } + tex1 = TQGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA + + if ( !buf.load( "opengl/qtlogo.bmp" ) ) { // Load first image from file + qWarning( "Could not read image file, using single-color instead." ); + TQImage dummy( 128, 128, 32 ); + dummy.fill( TQt::red.rgb() ); + buf = dummy; + } + tex2 = TQGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA + + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glEnable( GL_TEXTURE_2D ); + + // Set up various other stuff + + glClearColor( 0.0, 0.0, 0.0, 0.0 ); // Let OpenGL clear to black + glEnable( GL_CULL_FACE ); // don't need Z testing for convex objects + glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); + + // Make the object display list + + object = makeObject( tex1, tex2 ); // Generate an OpenGL display list +} + + + +/*! + Set up the OpenGL view port, matrix mode, etc. +*/ + +void GLTexobj::resizeGL( int w, int h ) +{ + glViewport( 0, 0, w, h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 ); + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -70.0 ); +} + + +/*! + Generate an OpenGL display list for the object to be shown, i.e. the texobj +*/ + +GLuint GLTexobj::makeObject( const TQImage& tex1, const TQImage& tex2 ) +{ + GLUquadricObj* q = gluNewQuadric(); + GLuint cylinderObj = glGenLists(1); + glNewList( cylinderObj, GL_COMPILE ); + + glTranslatef( 0.0, 0.0, -1.0 ); + + // cylinder + glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() ); + gluQuadricTexture( q, GL_TRUE ); + gluCylinder(q, 0.6, 0.6, 2.0, 24, 1); + + // end cap + glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2.width(), tex2.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, tex2.bits() ); + glTranslatef( 0.0, 0.0, 2.0 ); + gluDisk( q, 0.0, 0.6, 24, 1 ); + + // other end cap + glTranslatef( 0.0, 0.0, -2.0 ); + gluQuadricOrientation( q, (GLenum)GLU_INSIDE ); + gluDisk( q, 0.0, 0.6, 24, 1 ); + + glEndList(); + gluDeleteQuadric( q ); + + return cylinderObj; +} + +void GLTexobj::animate() +{ + xRot += impX; + yRot += impY; + zRot -= impZ; + + impX -= impX * 0.05; + impY -= impY * 0.05; + impZ -= impZ * 0.05; + + if ( impX > 0.1 || impY > 0.1 || impZ > 0.1 || + impX < -0.1 || impY < -0.1 || impZ < -0.1 ) + updateGL(); +} + +void GLTexobj::setRotationImpulse( double x, double y, double z ) +{ + if ( animation ) { + impX += 180*x; + impY += 180*y; + impZ += 180*z; + } else { + GLControlWidget::setRotationImpulse( x, y, z ); + } +} diff --git a/examples/demo/opengl/gltexobj.h b/examples/demo/opengl/gltexobj.h new file mode 100644 index 000000000..5d235dcff --- /dev/null +++ b/examples/demo/opengl/gltexobj.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying an openGL wireframe box +** +****************************************************************************/ + +#ifndef GLTEXOBJ_H +#define GLTEXOBJ_H + +#include "glcontrolwidget.h" + +class GLTexobj : public GLControlWidget +{ + Q_OBJECT + +public: + GLTexobj( TQWidget* parent, const char* name = 0, WFlags f = 0 ); + ~GLTexobj(); + +protected: + void animate(); + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + virtual GLuint makeObject( const TQImage& tex1, const TQImage& tex2 ); + + void setRotationImpulse( double x, double y, double z ); + +private: + GLuint object; + double impX, impY, impZ; +}; + +#endif // GLTEXOBJ_H diff --git a/examples/demo/opengl/glworkspace.cpp b/examples/demo/opengl/glworkspace.cpp new file mode 100644 index 000000000..ecc1f374e --- /dev/null +++ b/examples/demo/opengl/glworkspace.cpp @@ -0,0 +1,212 @@ +#include "glworkspace.h" +#include "glbox.h" +#include "glgear.h" +#include "gltexobj.h" + +#include <qworkspace.h> +#include <qdialog.h> +#include <qtoolbar.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qaction.h> +#include <qprinter.h> +#include <qpainter.h> +#include <qcheckbox.h> +#include <qvbox.h> +#include <qimage.h> +#include "printpreview.h" + + +GLWorkspace::GLWorkspace( TQWidget *parent, const char *name, WFlags f ) +: TQMainWindow( parent, name, f ), printer( 0 ) +{ + setupSceneActions(); + + TQVBox *vbox = new TQVBox( this ); + vbox->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + vbox->setMargin( 1 ); + vbox->setLineWidth( 1 ); + + workspace = new TQWorkspace( vbox ); + workspace->setBackgroundMode( PaletteMid ); + setCentralWidget( vbox ); +} + +GLWorkspace::~GLWorkspace() +{ +} + +void GLWorkspace::setupSceneActions() +{ + TQToolBar *tb = new TQToolBar( "Scene", this ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "&Scene" ), menu ); + + TQAction *a; + TQActionGroup *newGroup = new TQActionGroup( this ); + newGroup->setMenuText( tr( "&New" ) ); + newGroup->setText( tr( "New" ) ); + newGroup->setUsesDropDown( TRUE ); + newGroup->setExclusive( FALSE ); + newGroup->setIconSet( TQPixmap( "textdrawing/filenew.png" ) ); + a = new TQAction( tr( "Wirebox" ), TQPixmap( "opengl/wirebox.xpm" ), tr( "&Wirebox" ), 0, newGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( newWirebox() ) ); + a = new TQAction( tr( "Gear" ), TQPixmap( "opengl/gear.xpm" ), tr( "&Gears" ), 0, newGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( newGear() ) ); + a = new TQAction( tr( "Texture" ), TQPixmap( "opengl/texture.xpm" ), tr( "&Texture" ), 0, newGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( newTexture() ) ); +/* a = new TQAction( tr( "Nurbs" ), TQPixmap( "opengl/nurbs.xpm" ), tr( "&Nurbs" ), 0, newGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( newNurbs() ) );*/ + newGroup->addTo( tb ); + newGroup->addTo( menu ); + + menu->insertSeparator(); + TQActionGroup *printGroup = new TQActionGroup( this ); + printGroup->setMenuText( tr( "&Print" ) ); + printGroup->setText( tr( "Print" ) ); + printGroup->setUsesDropDown( TRUE ); + printGroup->setExclusive( FALSE ); + printGroup->setIconSet( TQPixmap( "textdrawing/print.png" ) ); + TQAction *da = new TQAction( tr( "Window Size" ), TQPixmap( "textdrawing/print.png" ), tr( "&Window Size" ), CTRL + Key_P, printGroup ); + connect( da, SIGNAL( activated() ), this, SLOT( filePrintWindowRes() ) ); + a = new TQAction( tr( "Low Resolution" ), tr( "&Low Resolution" ), 0, printGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrintLowRes() ) ); + a = new TQAction( tr( "Medium Resolution" ), tr( "&Medium Resolution" ), 0, printGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrintMedRes() ) ); + a = new TQAction( tr( "High Resolution" ), tr( "&High Resolution" ), 0, printGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrintHighRes() ) ); + printGroup->addSeparator(); + a = new TQAction( tr( "Setup" ), tr( "&Setup..." ), 0, printGroup ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrintSetup() ) ); + da->addTo( tb ); + printGroup->addTo( menu ); + + a = new TQAction( tr( "Close" ), TQPixmap(), tr( "&Close" ), 0, this ); + connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) ); + a->addTo( menu ); +} + +void GLWorkspace::newWirebox() +{ + GLBox *gl = new GLBox( workspace, 0, WDestructiveClose ); + gl->setIcon( TQPixmap( "opengl/wirebox.xpm" ) ); + gl->setCaption( tr( "Wirebox" ) ); + gl->resize( 320, 240 ); + gl->show(); +} + +void GLWorkspace::newGear() +{ + GLGear *gl = new GLGear( workspace, 0, WDestructiveClose ); + gl->setIcon( TQPixmap( "opengl/gear.xpm" ) ); + gl->setCaption( tr( "Gear" ) ); + gl->resize( 320, 240 ); + gl->show(); +} + +void GLWorkspace::newTexture() +{ + GLTexobj *gl = new GLTexobj( workspace, 0, WDestructiveClose ); + gl->setIcon( TQPixmap( "opengl/texture.xpm" ) ); + gl->setCaption( tr( "Texture" ) ); + gl->resize( 320, 240 ); + gl->show(); +} + +void GLWorkspace::newNurbs() +{ + GLGear *gl = new GLGear ( workspace, 0, WDestructiveClose ); + gl->setIcon( TQPixmap( "opengl/nurbs.xpm" ) ); + gl->setCaption( tr( "Nurbs" ) ); + gl->resize( 320, 240 ); + gl->show(); +} + +void GLWorkspace::filePrint( int x, int y ) +{ + bool print = printer || filePrintSetup(); + if ( !print || !printer ) + return; + + TQWidget *widget = workspace->activeWindow(); + if ( !widget || !widget->inherits( "TQGLWidget" ) ) + return; + TQGLWidget *gl = (TQGLWidget *)widget; + TQPixmap pm = gl->renderPixmap( x, y ); + + PrintPreview view( this ); + TQImage temp = pm.convertToImage(); + temp = temp.smoothScale( 400, 300 ); + TQPixmap temppix; + temppix.convertFromImage( temp ); + view.setPixmap( temppix ); + view.setIcon( TQPixmap( "opengl/snapshot.xpm" ) ); + view.setCaption( gl->caption() + " - Print preview" ); + if ( view.exec() ) { + TQImage img = pm.convertToImage(); + if ( view.checkInvert->isChecked() ) { + img.invertPixels(); + } + if ( view.checkMirror->isChecked() ) { + img = img.mirror( TRUE, FALSE ); + } + if ( view.checkFlip->isChecked() ) { + img = img.mirror( FALSE, TRUE ); + } + if ( view.checkLeft->isEnabled() && view.checkLeft->isChecked() ) { + } + if ( view.checkRight->isEnabled() && view.checkRight->isChecked() ) { + } + pm.convertFromImage( img ); + + TQPainter painter; + if ( !painter.begin( printer ) ) + return; + + painter.drawPixmap( TQPoint( 0, 0 ), pm ); + + painter.end(); + } +} + +void GLWorkspace::filePrintWindowRes() +{ + filePrint( 0, 0 ); +} + +void GLWorkspace::filePrintLowRes() +{ + filePrint( 640, 480 ); +} + +void GLWorkspace::filePrintMedRes() +{ + filePrint( 1024, 768 ); +} + +void GLWorkspace::filePrintHighRes() +{ + filePrint( 2048, 1536 ); +} + +bool GLWorkspace::filePrintSetup() +{ + bool newPrinter = !printer; + + if ( !printer ) + printer = new TQPrinter; + if ( printer->setup() ) { + return TRUE; + } else { + if ( newPrinter ) { + delete printer; + printer = 0; + } + return FALSE; + } +} + +void GLWorkspace::fileClose() +{ + workspace->closeActiveWindow(); +} diff --git a/examples/demo/opengl/glworkspace.h b/examples/demo/opengl/glworkspace.h new file mode 100644 index 000000000..4bf532a95 --- /dev/null +++ b/examples/demo/opengl/glworkspace.h @@ -0,0 +1,37 @@ +#ifndef GLWORKSPACE_H +#define GLWORKSPACE_H + +#include <qmainwindow.h> + +class TQWorkspace; +class TQPrinter; + +class GLWorkspace : public TQMainWindow +{ + Q_OBJECT +public: + GLWorkspace( TQWidget *parent = 0, const char *name = 0, WFlags f = 0 ); + ~GLWorkspace(); + +protected: + void setupSceneActions(); + +protected slots: + void newWirebox(); + void newGear(); + void newTexture(); + void newNurbs(); + void filePrint( int x, int y ); + void filePrintWindowRes(); + void filePrintLowRes(); + void filePrintMedRes(); + void filePrintHighRes(); + bool filePrintSetup(); + void fileClose(); + +private: + TQWorkspace *workspace; + TQPrinter *printer; +}; + +#endif //GLWORKSPACE_H diff --git a/examples/demo/opengl/nurbs.xpm b/examples/demo/opengl/nurbs.xpm new file mode 100644 index 000000000..946d08115 --- /dev/null +++ b/examples/demo/opengl/nurbs.xpm @@ -0,0 +1,305 @@ +/* XPM */ +static char *nest[] = { +/* width height num_colors chars_per_pixel */ +" 48 48 202 2", +/* colors */ +".. c None", +".# c #1f1000", +".a c #200800", +".b c #201000", +".c c #201700", +".d c #20170f", +".e c #201800", +".f c #201f0f", +".g c #2f1f00", +".h c #2f2710", +".i c #301700", +".j c #301f00", +".k c #30200f", +".l c #302810", +".m c #3f2000", +".n c #3f270f", +".o c #3f2f10", +".p c #402700", +".q c #40270f", +".r c #402f0f", +".s c #402f10", +".t c #40371f", +".u c #403720", +".v c #40382f", +".w c #4f3000", +".x c #4f3010", +".y c #4f371f", +".z c #4f3f1f", +".A c #4f3f3f", +".B c #4f402f", +".C c #4f403f", +".D c #503700", +".E c #50370f", +".F c #503f10", +".G c #50401f", +".H c #504020", +".I c #504030", +".J c #50403f", +".K c #504730", +".L c #50473f", +".M c #5f3f10", +".N c #5f4000", +".O c #5f401f", +".P c #5f471f", +".Q c #5f481f", +".R c #5f482f", +".S c #5f5030", +".T c #5f5040", +".U c #5f5750", +".V c #604010", +".W c #60481f", +".X c #604830", +".Y c #604f20", +".Z c #604f3f", +".0 c #605730", +".1 c #60584f", +".2 c #6f4000", +".3 c #6f4810", +".4 c #6f5730", +".5 c #6f5740", +".6 c #6f5f30", +".7 c #6f5f3f", +".8 c #6f6040", +".9 c #6f6850", +"#. c #704f10", +"## c #70501f", +"#a c #705020", +"#b c #705710", +"#c c #70581f", +"#d c #705830", +"#e c #705f2f", +"#f c #705f3f", +"#g c #705f4f", +"#h c #705f50", +"#i c #70683f", +"#j c #706840", +"#k c #70706f", +"#l c #7f5000", +"#m c #7f5f2f", +"#n c #7f6030", +"#o c #7f673f", +"#p c #7f6840", +"#q c #7f685f", +"#r c #805820", +"#s c #805f10", +"#t c #80602f", +"#u c #80673f", +"#v c #80684f", +"#w c #806f40", +"#x c #806f50", +"#y c #806f5f", +"#z c #80704f", +"#A c #80786f", +"#B c #807f5f", +"#C c #8f6020", +"#D c #8f6f3f", +"#E c #8f6f50", +"#F c #8f7040", +"#G c #8f784f", +"#H c #906010", +"#I c #906720", +"#J c #90682f", +"#K c #906f3f", +"#L c #90702f", +"#M c #907060", +"#N c #90773f", +"#O c #907840", +"#P c #90786f", +"#Q c #907f6f", +"#R c #908050", +"#S c #90875f", +"#T c #90886f", +"#U c #908f70", +"#V c #909080", +"#W c #9f701f", +"#X c #9f702f", +"#Y c #9f7840", +"#Z c #9f804f", +"#0 c #9f8050", +"#1 c #a0680f", +"#2 c #a0783f", +"#3 c #a0804f", +"#4 c #a0806f", +"#5 c #a0874f", +"#6 c #a0875f", +"#7 c #a08f50", +"#8 c #a08f5f", +"#9 c #a0906f", +"a. c #a09770", +"a# c #a0977f", +"aa c #af701f", +"ab c #af782f", +"ac c #af7f3f", +"ad c #af803f", +"ae c #af876f", +"af c #af884f", +"ag c #af8f5f", +"ah c #af8f6f", +"ai c #af8f7f", +"aj c #af9070", +"ak c #af907f", +"al c #af9880", +"am c #af9f70", +"an c #afa080", +"ao c #b06f0f", +"ap c #b0802f", +"aq c #b0904f", +"ar c #b0975f", +"as c #b09780", +"at c #b0a06f", +"au c #b0a890", +"av c #bf8f3f", +"aw c #bf907f", +"ax c #bf974f", +"ay c #bf977f", +"az c #bf985f", +"aA c #bf9860", +"aB c #bf9f6f", +"aC c #bfa080", +"aD c #bfa870", +"aE c #bfa880", +"aF c #bfa890", +"aG c #c09750", +"aH c #c09f80", +"aI c #c0a760", +"aJ c #c0a76f", +"aK c #c0b080", +"aL c #c0b790", +"aM c #cf9740", +"aN c #cfa78f", +"aO c #cfa87f", +"aP c #cfaf6f", +"aQ c #cfaf90", +"aR c #d09f80", +"aS c #d0a860", +"aT c #d0b770", +"aU c #d0b88f", +"aV c #d0b890", +"aW c #dfa750", +"aX c #dfaf90", +"aY c #dfb79f", +"aZ c #dfb8a0", +"a0 c #dfc08f", +"a1 c #e0a780", +"a2 c #e0b790", +"a3 c #e0b79f", +"a4 c #e0b870", +"a5 c #e0bfa0", +"a6 c #e0c8a0", +"a7 c #e0cf9f", +"a8 c #efb090", +"a9 c #efbf90", +"b. c #efd7af", +"b# c #f0bf9f", +"ba c #f0c0a0", +"bb c #f0cfb0", +"bc c #ffc8af", +"bd c #ffd7b0", +"be c #ffd7bf", +"bf c #ffd8bf", +"bg c #ffdfc0", +"bh c #ffe7c0", +/* pixels */ +"............................#8#8#9.Y..........#8#8#2#2..........................................", +"..........................au#3#3a.aD#T#8aIa.#8........#8..#8#8..................................", +"......................#Z#2aOaPar#PaLalaD#8#8....aD..#2......#8#8................................", +"....................#8#Aajam#xa.........aE#x#e#t#p#O#8.G#3aV#Z#9#8#2#o..........................", +"..................a#.....p#0....aE#P.p.i.2ab.P#aat#K.Y#F.4.x#ZazaV....#2aL......................", +"............#F#D....aE#TaA#FaI#D#b#D.E.Y#3ad#D.H.s.l.k.q.E.z.f.O#Y#7an#0#SanaL..................", +"..........#o#v....aBaKaua##2#.#C#C#m#2.w#t#I.P.M.n.k.i##.c.d.q.p.b.6#daI....#b..................", +"..........#q..#2#FaAalaB#s#J#n.W#K##.R.z.k.x.s.d.n.o.r.Q.c.g.E#a.P.c.f#da##8..aI................", +"........#3..#2.1..#D#tad#Zag#w#d#n.n.u.d.#.k.#.c.c.n.b.#.d.F#L.f##.f.c.c#7#D..a7................", +"......aD#9a..Q..#LaW#maTaIa4#6.d.c.d.c.f.c.s.s.c.#.b.o.P.r.r.W.##a.M.#.e.k.4#eaKaOaL............", +"......aD#8aL..#F.2#X.0.Y#e.Y.u.d.c.c.j.#.c.y.j.n#Mak#M#v.W#L.##d#K#c.s.f.l#R.caDa0..a0..........", +"....#Ta.#F#A..#l#W#N.W#s.z.d.k.n.k.y.o.g.t.aawbdb#a3aQ#4#f.Z.y.x#aad#a.O.R.#aD.eaLaz..#F........", +"....#2alal#8#t#n#Z.W.V.g.e.f.t.o.s.g.k.y.E#4babab#a1aRae#M.L.K.N.zaMac.W.4.u.c.c.RaD#8aD........", +"....aU#8#m#Q#L#K#c.M.c.c.e.l.t.f.#.b.Y#a.Obfbfbhbaa5aNas#Q.T.C#a#e#m#X#m#f.S.c.c#j..a0#2#2......", +"..#2#2..#8#s#r#l.w.i.c.t.z.H.t.#.o#x#F.MaRbfbhbgbca9aQas#Q.1.C.H.2.B#u#Y.4.H.S.B.e..#2b.au......", +"....#FaDaO#5.p#W#J.i.#.f.o.H.l.R#v#u#t.waZbfbgbgbca3aQak#E.T.L.H.F#K#f#Y#a#a.R.0.l.Z#T..#W......", +"....aV#9#e#0.pap#C.c.f.#.z.t.4.4.G.3.r.maXbhbgbga6aZaNaj#Q.J.L.K#w.V.3#Y#u.W#d.S.c.taD..aA#2....", +"..azauaL.2ag#2#C.3.g.c.z.G.b.G.n.4.w.q.baXbfbcb#a5aQas#Q.5.I.J.H#.###b.O#Iab.W.e.c.kaD....aU....", +"..#Z..#l#2#7aA.N.F.c.c.c.#aha5bbaZai#y.P.0bba2a2aXawai#y.L.I.A#t.M.Q#L#naa#8.p.D.#.z#FaD..au#8..", +"..#Wa.ab#c.2aG#t.x.c.h.cbebaa8baaYaH#E.Z.WaNaQaNayai#M.1.J.C.K#H#I.P#e.v#s#D.D.n#z.h.Ba7..a.#2..", +"....aF#l#L#2#L#6.P.#.caZbgbgbaa1aXaw#4#g.A.Vaeai#4#y.T.A.C.B#J#L#H#c#S.4.DaI#b.F.4#6ataO..aEa...", +"aA#o#pab#lag#a#r.n.c.vaZbhbgbbbaaXasai#q.J.B#K#E.5.A.A.J.H.W.Vacad#N#R#o.j#C#7##.n#8.c#6aE..aE..", +"....#t#Lao#5#mazag.caebhbhbgbba2aXaC#U#h.C.u#u#K.Y.7#K#K#2.3.k#m.4.Q.0aB.o.xaq#m.c#0.7.R....aE..", +"....az#NaoaMaTaqaA.#aXbhbdbbbaaXaQak#M.1.I.L.u.y.z###5#racad#5#7.k.s#raI#Z.R#s#6.#.0#F.9..#Z....", +"....aI.Nac#5aq#l#I.faNbfbcbba5aQaw#4#y.L.I.L.K.k.E.i.i.D.3aa#Hac.E.l#m#Oah.O#raf.z.c#wauaD#Z....", +"an...X#naS#cap#Y#1.N#gbbbaa5a5aCak#M.1.I.I.I#J.V#faXbbaYas#E#J#I.3.k.4ad#2.4#s.D#f.#.R#GaJ#T....", +"#T#9#oag#saa#J#F#b.m.cbbaXaNaHak#Q#h.C.I.J.B#lahaTbca8a3aHak.U#a#a.G.B#5#w.TaG#K.G#6.laAaAa.....", +"..auaDaI#u#WaxaS.P#b.#.CaQaw#4#M#q.L.C.I.A.M#EaTbcbca1a2aHah#x.X#d.y.G#maq.8ap#X.z#G.g#2aE#8aL..", +"..#Fan#laE#HaWaxat#w.m.c#x#P#y.5.C.L.J.C#u#caAbcbhbeb#aRay#4#P.T.C.s.k#DaS.7.E.baB.c.7aIaK..#9..", +"....aE#q#2.6#a#I#taK.YaP.c.j.X.K.X.H.H.X#taJbcbfbgbfbaaYaHak#P.U.J.G#F#ma4aq#N.Q.c.#.7ar........", +"....a.aG.D#6.p.Dac#d#2.6#z.a.j.O#n.D.E.#.cawbdbdbebba5aRaC#4#y.L.C.S#mafar#d#N.0.h.#az#V#8..#D..", +"aL..aDaG.X#N#o.M#I#u#X.S.E.4.c.f.r.i.3#c.cawbdbcbeb#aXaNak#Q.5.L.L.B#2#mar#m.M.6.c.B#Z.RaT..#Za.", +"#8auaE..#F.w#3ar#a#9ab#o.N###j.c.x.k.g.M.r#EbfbcbaaZaQas#4#y.I.C.A.0#5#m#Z#t#o.h.caA.t#e....al.8", +"....aEaI..aA#r#F#oat#i#oac.2.c.c#J.x.G.P.p.jbca2aXaNaFai#P.5.I.I.v#2#Y#O#Y#C.7.c.caT.c#2..aAaAaG", +"......#8a.am#k#Yag#F#w#FaD.V.#am#m.q.k.G.P.r#gaXawawae#M#g.C.L.A#dac#d#3#o.O.x.caP.c.#aA..aT#S..", +"......#S....#T#i.uaI#n.D#jam.r.aag.W.W.E.W#a.p#gai#Q#y.T.C.C.A.5acaq#o#v.O.o.c.c.c.c.F..aB#OaT#B", +"........#R....#T.w#faj.m.i#n#G#o.zag.O#u#m.F.j.0.K.L.I.I.C.Z#u#5aTaJ.H.E.G.f.#aP.d.##3a.#Z..a...", +"........a#....#T..#e#F#6.O.a#O.w.6#i#8.G.O.6#X#i.O.x.H.X.H#aaxavaA.l.k.x.t.##S#w.c.lazaA#Z#T....", +"..............am....ag#D#i#z.Q.o.#.w#e#0.m.Y#d.W.E.x.x#e#t#e#K#2.p.j.#.c.h.##9.7.#.SaD#DaE......", +"................#N....aC.R.6.4#6.7.F.q.Y#0#e.n.F.O.O#a#w#v.E.E.b.j.c.e.d.#.H#B.#.7#7#U..........", +"................aA#8#2#T#7.X.7.7.0.0.6ag#o#R#f.r.0#n#p.#.c.#.c.#.#.c.c.#.c#G#R#S#i#0............", +"..................aL#8#Zaq#8.0.#.4#n.t.c.##waJ#0.G.z.R.r.o.f.d.c.e.#.4.0#o#8#F.#.o........#U....", +"......................#8#8#DaDaD.T.h.t#8#z.h#Z.0.R.g.m#G#n.l.h.c.##z.0.##G#j.#.UaS#3#8#T#q......", +"....................aE......#8aK#N#R#6.O.#.B#0#6#o.7#G.u.d.#.c.c.#.#.h#v#v#j#z#8#S#T#UaD........", +"......................#Z....#NaL#8#jam#B.6#w.7#i.u#7araT#z#z#p#iaTaPat#p#R.#a....Y..............", +"..........................#R..aEaja#.1#7#A#0.6.c.c.S#6.f.#.d#R.#.e.c.#.7#T......................", +"................................#F#8#6........#o#o.c.c#K#n#u.o.Y#v#R#k..aI..a.a.................", +"..............................#9#9....an#Z............#8#0..#0#RaE....#U#Sa....................." +}; +SIMPLE = T +BITPIX = 8 +NAXIS = 2 +NAXIS1 = 48 +NAXIS2 = 48 +HISTORY Written by XV 3.10 +END + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SSSSSSSSSSSSSSSSS ƒSSSSSSƒSƒ~©SSŠƒ”SSSSSSSSSSSSSSSSSSSSSSSSSSs‰SSSSiirci/M +l~oS¤S””SSSSSSSSSSSSSSSSSSSSS~S©•–Y‹yƒ]P‰~_†SSSSSSSSSSSSSSSSSSSSSSƒSSv´ +dz]m_d6‹–´ppid´°i~”SMSSSSSSSSSSSSSSSSS©SSS®v~‰EBƒ‰i_y6&lldpƒ†Š§SSSS +SSSSSSSSSSSr§§R&6p&ƒTL%yc'&pTydXªƒ†nSSSSSSSSSSSS´ƒTYc6m¦ƒ@?L// +YTis/SSSSŠSSSSSSSSSSœ|†‹L__TT]’i~_/Tciy~ƒdƒSSSSSSSSSSSSSSvSS¥L]Y‰ +_=+Mƒ]+=EESml99 @z_‹ŠSSSSSSSSSSSSSS’rdpI/3]ƒ%MZI955]c]r|) &_P§r©SSS +SSSS–SS†S]s‰Ew3]d@E]vdE5@L@S™“œ'"56ƒm'œœƒ†SSSSSS~SS†3_•%cyi?’Eib= TFHCCERi† +´¦@9@°ƒ”ƒS”SSSSƒSS†d6¤c7d/’II9IS)b—‚rREED[…ilE/=S¢w´zSSS”o|’sms§C +b+"@I/bº‘xbEHDZ…ZƒiE5°œS´ƒSSS©¤Sœ]sidi…Fl5@I) ׿º±¬—~[CC9||w|f_´|Sœœš +§©Ss3ƒ–Si@Sd5"B/uá×ËÁµœˆrCEDT†bƒci&œ6]SSœ`´S§šLviBjivP9Y/LWÞ×áʺ±˜‚[H +HB|b–bB]BƒL´Sƒ”SS”š7‰)7…Z|]p Ec79ÞÞáÕÅ«¥ˆrHEPbŒ–ZvT&œSrSSS©n|]Sjc®M° LF +L@@Lc¦×áåáËÁ¥˜~XE@sbºvI_–SSSSSs S©d¬™m%p~r[EHEEiWœ×éáÊ«¡ˆ~RE0"rª_9¢_¤®SSS§§¤is™ªITEµˆxnHECDBu´××´¿¥•pLZ;@b`ƒv?y|©´S†i’^ylsT%Õº±¥˜‚bECEBS•´×ÀÁ¥˜XSS@B†mRšr@‰'œœ”SS SLcªWƒ|m@bÕËÅÅ¥˜xYCCClC_ºÕÁœuljL"Y†|Y^7_Ly¦†SSSS¤@…†Sj±á×ÕŵˆrHCHF"97Lyd…9'bw•E]Œ?m§§ƒSSSSœvvœ´œºéÞÕ˺µ˜xYCH6;?S†]…††‹"0]¤ƒL^‰TsfSƒSSSScpv†bœ’‘ééåÕ¿º¥ŠbE6irM_rr|L"bYIT¢/5bƒ_LSS©SœiiS’S]+9ÁéåÕ˺œ—nEBru[DDE@IC…†v~i f‹S+‰©S©SSS¬Sp|p‰IÁååË´ºˆbDC‘—ˆrRDEBlpdWƒY7¤T=Y‰¯S©”SSs”WFšc5&áËÀËÁ¥uRI±µ±¡—xYEEFdjI]9^r7+p&BÍS”|SSƒSS|‹œ@=•ÅÕÁ—rITÕ¿¿º—rHCDcBIpcy)7?s§S§SSœ§´F’|fL?@@+Y3+ºá×Êŵœ‚[CE@PSTEjI"§SS¹SSSSº]ƒ)ƒf?6YY@L/%ºéååÊÁ±•‚EHFmCL|iIZP6§Sœ|SSSSs§¯†)sl/@'Llic3Ááåå×Áµ˜uRH@=r_|SSLT'R†SsSSSS||S^]S36?@6/psB«áéå×ȵœ‚YE@FBi|Y@PBS|Ù§SSSSS¹b‚prWB'6MSEááéËűœ‚RES]bvb_PdSÃ||SSSSS|œœccƒIC6/0";9ˆËËÊ´«‘xHF@?œ…IY6L§§SSSSSS†”sySSsvI^?"+";/6ÞÊÁµˆ_R;5S†SEL§´œSsSSSSSSS§´SsFvTM]M6 ; +x˜xlIpZrW0'~§ÃSÃSSSSSSSS§”ISp¬b´¤º‰00/I//ISB"Y]®¯´SSSSSSSSSSƒS|YSrc†ƒ’mZc+6"+=pS‹rSÍSSSSSSSSSSSSSnS|sœœ¢^lcIrSL?"50+//I9SIZ–S¤SSSSSSSSSSSSSilSS¢®§–|Pffb|3cjIB+"S+)]Z¤SSTSSSSSSSSSSSSSSSsrSS©†œs¤rTr9Mƒ†r@0'"+9?E|‹ ƒƒ ´SSSSSSSSSSSSSSSSSS–SS)ƒSS©~)FISrMsY5ƒœºSS|´SSSSSSSSSSSSSSSSSSSSSy•p”SSSS©p]ciw@ƒºƒ|iSSSSSSSSSSSSSSSSSSSSSSSSƒ|¯°–~´œ§SS§S|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS§ƒƒ”§†¤”SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMSSSSS||SSSSSSSSSSSSSSSSSSSSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ diff --git a/examples/demo/opengl/printpreview.ui b/examples/demo/opengl/printpreview.ui new file mode 100644 index 000000000..b312edca1 --- /dev/null +++ b/examples/demo/opengl/printpreview.ui @@ -0,0 +1,277 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>PrintPreview</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>PrintPreview</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>634</width> + <height>195</height> + </rect> + </property> + <property name="caption"> + <string>Print Preview</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQGroupBox" row="0" column="0"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Preview</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>pixmapLabel</cstring> + </property> + <property name="text"> + <string>TextLabel1</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQGroupBox" row="0" column="1"> + <property name="name"> + <cstring>GroupBox2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>4</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Modify</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkInvert</cstring> + </property> + <property name="text"> + <string>&Invert Colors</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkMirror</cstring> + </property> + <property name="text"> + <string>&Mirror</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkFlip</cstring> + </property> + <property name="text"> + <string>&Flip</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkLeft</cstring> + </property> + <property name="text"> + <string>Rotate 90° &left</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkRight</cstring> + </property> + <property name="text"> + <string>Rotate 90° &right</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="caption"> + <string></string> + </property> + <property name="text"> + <string>&Print</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Discard</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>PrintPreview</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>PrintPreview</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>checkLeft</sender> + <signal>toggled(bool)</signal> + <receiver>checkRight</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>checkRight</sender> + <signal>toggled(bool)</signal> + <receiver>checkLeft</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>checkInvert</sender> + <signal>toggled(bool)</signal> + <receiver>PrintPreview</receiver> + <slot>invertColors(bool)</slot> + </connection> + <connection> + <sender>checkMirror</sender> + <signal>toggled(bool)</signal> + <receiver>PrintPreview</receiver> + <slot>mirror(bool)</slot> + </connection> + <connection> + <sender>checkFlip</sender> + <signal>toggled(bool)</signal> + <receiver>PrintPreview</receiver> + <slot>flip(bool)</slot> + </connection> + <connection> + <sender>checkLeft</sender> + <signal>toggled(bool)</signal> + <receiver>PrintPreview</receiver> + <slot>rotateLeft(bool)</slot> + </connection> + <connection> + <sender>checkRight</sender> + <signal>toggled(bool)</signal> + <receiver>PrintPreview</receiver> + <slot>rotateRight(bool)</slot> + </connection> +</connections> +<includes> + <include location="global" impldecl="in declaration">qimage.h</include> + <include location="global" impldecl="in declaration">qpixmap.h</include> + <include location="local" impldecl="in implementation">printpreview.ui.h</include> +</includes> +<variables> + <variable>TQPixmap pix</variable> +</variables> +<slots> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot>updatePreview()</slot> + <slot>flip( bool )</slot> + <slot>invertColors( bool )</slot> + <slot>mirror( bool )</slot> + <slot>rotateLeft( bool )</slot> + <slot>rotateRight( bool )</slot> + <slot>setPixmap( const TQPixmap & pm )</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/opengl/printpreview.ui.h b/examples/demo/opengl/printpreview.ui.h new file mode 100644 index 000000000..fd19c2c4b --- /dev/null +++ b/examples/demo/opengl/printpreview.ui.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions respectively slots use +** TQt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + +void PrintPreview::init() +{ + +} + +void PrintPreview::destroy() +{ + +} + +void PrintPreview::updatePreview() +{ + TQImage img = pix.convertToImage(); + if ( checkInvert->isChecked() ) { + img.invertPixels(); + } + if ( checkMirror->isChecked() ) { + img = img.mirror( TRUE, FALSE ); + } + if ( checkFlip->isChecked() ) { + img = img.mirror( FALSE, TRUE ); + } + if ( checkLeft->isEnabled() && checkLeft->isChecked() ) { + } + if ( checkRight->isEnabled() && checkRight->isChecked() ) { + } + TQPixmap pm; + pm.convertFromImage( img ); + pixmapLabel->setPixmap( pm ); +} + +void PrintPreview::flip( bool ) +{ + updatePreview(); +} + +void PrintPreview::invertColors( bool ) +{ + updatePreview(); +} + +void PrintPreview::mirror( bool ) +{ + updatePreview(); +} + +void PrintPreview::rotateLeft( bool ) +{ + updatePreview(); +} + +void PrintPreview::rotateRight( bool ) +{ + updatePreview(); +} + +void PrintPreview::setPixmap( const TQPixmap & pm ) +{ + pix = pm; + updatePreview(); +} diff --git a/examples/demo/opengl/qtlogo.bmp b/examples/demo/opengl/qtlogo.bmp Binary files differnew file mode 100644 index 000000000..b7f9215d9 --- /dev/null +++ b/examples/demo/opengl/qtlogo.bmp diff --git a/examples/demo/opengl/qtlogo.png b/examples/demo/opengl/qtlogo.png Binary files differnew file mode 100644 index 000000000..e6e3beef3 --- /dev/null +++ b/examples/demo/opengl/qtlogo.png diff --git a/examples/demo/opengl/snapshot.xpm b/examples/demo/opengl/snapshot.xpm new file mode 100644 index 000000000..1c7180c40 --- /dev/null +++ b/examples/demo/opengl/snapshot.xpm @@ -0,0 +1,238 @@ +/* XPM */ +static char *camera[] = { +/* width height num_colors chars_per_pixel */ +" 32 32 151 2", +/* colors */ +".. c None", +".# c #1f1f1f", +".a c #202020", +".b c #2f2720", +".c c #302020", +".d c #302820", +".e c #3f2720", +".f c #3f2820", +".g c #3f2f2f", +".h c #3f3730", +".i c #402820", +".j c #402f20", +".k c #403730", +".l c #4f2820", +".m c #4f302f", +".n c #4f403f", +".o c #4f484f", +".p c #50302f", +".q c #50403f", +".r c #5f2f20", +".s c #5f3020", +".t c #5f3830", +".u c #5f4f30", +".v c #5f4f50", +".w c #5f5760", +".x c #60372f", +".y c #60382f", +".z c #60482f", +".A c #604f40", +".B c #60504f", +".C c #60606f", +".D c #6f4030", +".E c #6f4730", +".F c #6f676f", +".G c #6f7790", +".H c #70402f", +".I c #704030", +".J c #704830", +".K c #704f3f", +".L c #705f50", +".M c #706860", +".N c #707780", +".O c #7f6850", +".P c #7f706f", +".Q c #804f2f", +".R c #80573f", +".S c #805f40", +".T c #806740", +".U c #807060", +".V c #807f80", +".W c #80808f", +".X c #8090b0", +".Y c #80a0d0", +".Z c #8f5730", +".0 c #8f5840", +".1 c #8f7f7f", +".2 c #8f8f90", +".3 c #905f40", +".4 c #906740", +".5 c #90684f", +".6 c #907f6f", +".7 c #908780", +".8 c #908f8f", +".9 c #9097a0", +"#. c #909fb0", +"## c #90a7cf", +"#a c #9f5f30", +"#b c #9f684f", +"#c c #9f7750", +"#d c #9f887f", +"#e c #9f8f80", +"#f c #9f9790", +"#g c #9f98a0", +"#h c #9fa0af", +"#i c #9fafd0", +"#j c #9fafdf", +"#k c #a06f4f", +"#l c #a0703f", +"#m c #a07f5f", +"#n c #a0906f", +"#o c #a09780", +"#p c #a09890", +"#q c #a09f9f", +"#r c #a0b0c0", +"#s c #a0b7e0", +"#t c #af7850", +"#u c #af875f", +"#v c #af978f", +"#w c #af9fa0", +"#x c #afa09f", +"#y c #afa0a0", +"#z c #afa7af", +"#A c #afa8a0", +"#B c #afa8b0", +"#C c #afafcf", +"#D c #afb7d0", +"#E c #b07f50", +"#F c #b07f5f", +"#G c #b0a08f", +"#H c #b0a79f", +"#I c #b0a8af", +"#J c #b0afa0", +"#K c #b0b0b0", +"#L c #b0c7ef", +"#M c #bf875f", +"#N c #bfa89f", +"#O c #bfaf9f", +"#P c #bfb0a0", +"#Q c #bfb0af", +"#R c #bfb7b0", +"#S c #bfb8bf", +"#T c #c0b09f", +"#U c #c0b7af", +"#V c #c0b8af", +"#W c #c0b8bf", +"#X c #c0bfb0", +"#Y c #c0c0bf", +"#Z c #c0d0df", +"#0 c #cf9f6f", +"#1 c #cfc0b0", +"#2 c #cfc0c0", +"#3 c #cfd7f0", +"#4 c #d0bfa0", +"#5 c #d0c8c0", +"#6 c #d0cfc0", +"#7 c #d0cfd0", +"#8 c #d0d7a0", +"#9 c #dfcfbf", +"a. c #dfd7cf", +"a# c #dfd7df", +"aa c #dfd8df", +"ab c #dfe0bf", +"ac c #dfe7ff", +"ad c #e0d7af", +"ae c #e0d7d0", +"af c #e0d8df", +"ag c #e0e0e0", +"ah c #efe0e0", +"ai c #efe7e0", +"aj c #efe7ef", +"ak c #efe88f", +"al c #efe8f0", +"am c #eff0a0", +"an c #f0e0c0", +"ao c #f0e7e0", +"ap c #f0e8e0", +"aq c #f0f0ef", +"ar c #f0f0ff", +"as c #f0f8ff", +"at c #fff7ff", +"au c #fff8f0", +/* pixels */ +"............................................#o#N#N#v#P..........", +"........................................#H#U#H#N#U#5ae#Y#H......", +"......................................#H#v#e#N#U#1aeaeahah#H....", +"....................................#H#v.1#d#O#Y#5aeahapaqaa#H..", +"..................................#H#N.1.M.7#Ya#aeagapatapap#5..", +"..................................#1#y.V.7#q#I#S#Ya#agajalalah#O", +"...................8#y.V.P.h.h...1a.#1#P#W#q.V.9#.#.#Kaaatauau#1", +".............8#y#q#y#I#R#Y#q.e.c#Papapaual#B.G###r#i.X#Calauau#1", +".........p.f.8#K#S#R#K#S#S#S#q.b#1auauauau.X#rakab#L.Y#iasauau#7", +".......p.l.j.n#d#K#R#R#S#K#K#S#p#Pauauauau#D#8amac#L.Y##auauaual", +".....p.j.e.p.i.q#d#A#I#W#W#Q#S#S#Pauauauau#D#Zacac#L#j#sauauauag", +"...m.p.m.f.e.i.l.S#Raaaaagalatal#Xauauatah#K#L#3ac#3#j#3auauau#6", +"...l.m.m.e.i.y#b.Laiauauauauauau#Pauauahafaf#7#r#r#i#Dauauauauae", +"...e.f.j.b.e#b.R.haaauauauauauau#Hahaoaf#5#6#7#K#h#Ba#ajauauag#H", +".D.D.l.b.a.f#M.h.#aaauauauauauau.P#5aeae#1#Y#6#w.2.9#g#z#7#7ae..", +".p.s.s.b.a.f#F.t.baiaualagahalag.E#dae#1#P#J#Y#y.F.C.N.W.2#f#H..", +".e.p.p.a.a.f#E.D.calau.F.#.u#n#2.K.f#4#X#x.8#y#A.F.o.w.C.7#H....", +".t.x.f.a.a.e#E.D.caqau.g.z.A.A#J.R.f.O#Y#U#f#y#P#N.M.v#d#x......", +"...i.c.b.a.f#E.D.calaq.Bad#G.d#I.E.#.q#o#N#X#P#P#P#v#A#x........", +"...e.a.a.b.f#t.x.capap.M.L.k.oae.D.#.K.R.f.B#Y#1#1#V............", +"...e.b.b.b.f#t.t.calau#P.n.n#Qau.y.#.R.R.#.c....................", +"...i.e.c.b.f#t.x.haqauau#Y#Yaqau.p.#.R.R.c.h....................", +"...l.c.e.e.j#t.s.tauau#6.q.q#Nau.h.c.T.0.c.j....................", +"...c.e.i.i.j#F.x.Dauau.U.S.1.q#5.D.c.5.R.c.j....................", +"...e.i.l.l.y#b.x.taq#5.A#4an.1#9.H.c#c.Z.c.p....................", +"...e.l.l.l.3.0.r.5auae.U#N#O#e#9.D.c#m.4.r.I....................", +"...c.r.x.r.0.J#t#0arau#9.6#d#9au.J.c.R.3.s.I....................", +"...e.x.y.y.3.3.Z#uauauauauauauah.Q.l.D.0.x......................", +".....l.H.I.Z#k.y#mauauauau#9#v.4.J.r............................", +".......y.I.J#k.x.3#T#q#m.3.Q.Q.y.s..............................", +".........y.Z#t#l#a.Z.J.y.H.x....................................", +"...........y#l.I.x.x.x.........................................." +}; +SIMPLE = T +BITPIX = 8 +NAXIS = 2 +NAXIS1 = 32 +NAXIS2 = 32 +HISTORY Written by XV 3.10 +END + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SSSSSDxNCCCSSSSSSSSSSSSSSSSSSSSSSSSSDd„xmdRDMCSSSSSSSSSSSSSSSSSSSSSDNRzCk²Ÿ…kZZD +=SSSSSSSSSSSSSSSSS4MNdzD…ùùùùÒžoR=SSSSSSSSSSSSSSS.CDDkkdŽùùùùùùåZ4MgCSSSSSSSSSSS +S%=C=gR„¨òùÒ‚ŽÒùR%ak=NSSSSSSSSSSS.444kg=qùÙs®²’ÒM%…o=NSSSSSSSSSSS./44DwCDïÉRÀà„Ò +M%~d%:SSSSSSSSSSS%.//2ŠCMùùse„EÉM%qa%2SSSSSSSSSSS4%..2„=DùùÍEE®ù8%ig%2SSSSSSSSSS +S/.%(.„C8ïùù¿¿ïù:aa%8SSSSSSSSSSS.(((.„D%ëù²EEµùDaa%SSSSSSSSSSS. (.„C%ééib9KÙ +MWa.U¿Â¹SSSSSSS/%( .ˆM%ëïUÓ¢)«QE–®½²²²ž©¥SSSSDC. .ˆM%ïù4LRRa.l¿¸˜¥²®iTŽ¥SSS +.:: .ˆM%ëùkOÅW.À½¥¥©kK[b‰¨SS:==( .ŠD(èùëàåëàQŽÙ²¿¥kbv‚˜¨SMM4( .”8Ûùùùùùù +uÉÙÙ¿ͤ–›«ÏÏÙSS..2(.wa8Ûùùùùùù¨åéÛÉÍϰ¢«Ûëùùà¨S4::./Dwbèùùùùùù²ùùåÛÛÏ®¸ùùùùÙ +S:::../4e¸ÛÛàëûë½ùùûå°ÅØèرØùùùÍSS:2.:/EŽ©«»»µ»»²ùùùù¸ÌèèűµùùùàSSS:42Eް¸¸»°°»™ +²ùùùù¸ÌãèÅœ¥ùùùëSSSS:.°»¸°»»»Ÿ(ÂùùùùÜÚÅœ®öùùÏSSSSSS¥Ÿ¥«¸¿Ÿ.%²ééùë«x¥®´ëùù +SSSSSSSSS¥u88S„ØÂ²»Ÿ–œœ°ÛûùùÂSSSSSSSSSSSSSSSSSÂ¥‰Ÿ«»¿Ûàëëëå²SSSSSSSSSSSSSSSS +S¨®„i‰¿ÛÙàéûééÉSSSSSSSSSSSSSSSSSSS¨ž„޲¿ÉÙåéïÛ¨SSSSSSSSSSSSSSSSSSSS¨ž’®¸ÂÙÙåå¨SSSSSSSSSSSSSSSSSSSSSS¨¸¨®¸ÉÙ¿¨SSSSSSSSSSSSSSSSSSSSSSSSS–®®ž²SSSSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ diff --git a/examples/demo/opengl/texture.xpm b/examples/demo/opengl/texture.xpm new file mode 100644 index 000000000..3c423e948 --- /dev/null +++ b/examples/demo/opengl/texture.xpm @@ -0,0 +1,130 @@ +/* XPM */ +static char *Monalisa[] = { +/* width height num_colors chars_per_pixel */ +" 48 48 27 1", +/* colors */ +". c #000000", +"# c #281808", +"a c #38240c", +"b c #492c10", +"c c #553414", +"d c #593818", +"e c #5a5a5a", +"f c #65411c", +"g c #794d24", +"h c #7d5124", +"i c #86592c", +"j c #966534", +"k c #9a6938", +"l c #aa7545", +"m c #ae7949", +"n c #b68251", +"o c #be8a59", +"p c #c79665", +"q c #cf9e6d", +"r c #d3a275", +"s c #d7aa7d", +"t c #dfb28a", +"u c #e3ba92", +"v c #ebc7a6", +"w c #ebcbae", +"x c #ffffff", +"y c None", +/* pixels */ +"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", +"e..............................................x", +"e.oppqnnoononoonnoonpppooqpooonopppqppoonnpoopox", +"e.oloonpnoonpooooopnpolljjllnpnqoopooopnnnnpoopx", +"e.looooopnoonpoppoplifbbbbccdgloppppoqpoooopoqqx", +"e.ooopqppqpoopopppibbdcababbddcdloppqoolpnppppqx", +"e.pporpppppqppqoogbcdgabbbbbaccdckppqqpoopoqrrrx", +"e.rpqqqooppoprrrgbccgdbcbbaababccbjppqqppopoqrrx", +"e.pqppqsqpppqrrkbbdilkigcbabbabbdcclpqpqopppqqqx", +"e.oqqqppqpqqrtpcgnrstrrnmifbbbbccccdnpqrqqqoqqqx", +"e.qpqpqpqpqstrjdnruwwwusrnigcbabccdchrrsrqrqqprx", +"e.oqqpqqpqrttoajrvwwwwwwrrlhdbbaacdcborqrrrrqrrx", +"e.qqqrrtrstwtfdntwvvwvwwuqmjgcbbbacbbirqpqrrrrsx", +"e.qrrrrrrrtvofdntwvwwvwutpmkidcbaaababpnopppprrx", +"e.srprrrprspidhouwwvvwvtsrpnkjfbbaaaabjknnmnpprx", +"e.rrsrrssssoddiruvvvvwvwttrrokgccbbabagjkkkmpnpx", +"e.stwrwrwrvkddipuuvvvvtssrrpnkfdcbbaaafiijkllmnx", +"e.lnrsrwrvpjddfppoqutslllmmkjifcddbbbbffhiklknmx", +"e.kjjrsrwrmfddffkkjpslfilifdbhgcccbbbbcfgghjkkkx", +"e.ijjrwrrrofdddblafmtiimmahfklhbccbabacfffgjjjhx", +"e.hjjppklonddakoonlrtilrrnkornicccbbaacgfggfihfx", +"e.fhfkiidjkdbakttrsrtmosstttrmhddddcbcbdffhkfghx", +"e.dffafhfffhaairuutusqmwuwurplhdfddcdccggggghffx", +"e.dddddfdddaddhruututnrswutrlkfcdfdfdcchjjkkmmkx", +"e.daffdadaddaadrstrutomustsokffddddcdccddfhihjkx", +"e.fgddddabadddalrsotpiktutpmkidcddfddcdddddghfgx", +"e.fcddddbabbdbainrsnfairspnkigdcdfccdcccdddddfdx", +"e.ddddbbddbbbadfmlsrkmmmmomkjgddfdfgdccdfffffffx", +"e.ddcdadbbabddahlnlnmiiioonlffdbfdccddddfffffffx", +"e.cdbbdbdcbcdbdakorrmmkmopniifdcddddcddddffgfgfx", +"e.cddcbdddcabddadkrqmlmmnlkfhdbccccddcccdfdfgfgx", +"e.dgffffhhcfadbddalsvtonkjffddcdccddcdccdggfgggx", +"e.dcdddffgdadddbadaoqomkffffdbbbcbdddcbccfffgfgx", +"e.cdddgilkfbcdbdaaaaiffffdfdbddbccddccbbcffdfgfx", +"e.fhggghkkhddbdbaaaaadfafddbfbddccccbcbbcfddfgdx", +"e.hkhmllkkidabdbbaaaafdfadbddffdcbabbbbabdffdfgx", +"e.imlllhliifddbbb#baakjffddfhhhfcbdbbbbbbfdfiffx", +"e.hljhllhjhfbdbbaaadafmlkihhhiihdbbbbabbbdfgghgx", +"e.dhlggiiigdccdbaa#abgmlmkkjkklkhdbdbbdaabbccccx", +"e.hbadfdcbcbaabaaabdfimnnmllmnmkiddbdddbbbabddcx", +"e.gbbabbbabbbcbbbbbinrppoonppppojfdffddcbbabcbcx", +"e.dba#abcbabcbcbdhknrtrtrrrrrrroliffidccccbdcghx", +"e.fbab#acbbcbbccinsrtttssttwssrpkfigifcbbcbbbcfx", +"e.daacbbdcbbbbdborpwttwwttwswsrpmigfgdbbdbbbbcdx", +"e.dcccbcddcbddfirtuwwwswswswrwprlfigfdcddccbacdx", +"e.fdcdcddbbcddgmrswwwuwtswwtwsrpjiiffccbcfddcbcx", +"e.fdfhccbbbbfhiowwswwwtwutwttwrpjfiggbcdhgdfcbbx", +"exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +}; +SIMPLE = T +BITPIX = 8 +NAXIS = 2 +NAXIS1 = 48 +NAXIS2 = 48 +HISTORY Written by XV 3.10 +COMMENT the GIMP was here +END + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZ€G>GY::1111GYa”ÑѲÑÑÑ»ÑÁ»Ñ»»Ñ«Ÿ +nGaUU1:>YU>G:11ÿZ€G>:>:>>11:>>Uƒ«²ÑÑÑÁÑ»²ÑѻѲ«ŸnaaGG::1:G>>:1:ÿZ€>:::1:>>:1>>Ga +«»ÁÑÑѲѲѲѫџ«GaUG>:>>::1':>ÿZ€>'':11>:1111>1”«ŸÑ»»ÑÑ»»Ñ²Ñ²«ŸƒaUGU>11>1111:>ÿ +Z€G1'1':11:11::aŒ²«»»»²²»»Ñ²²«ŸrGaUaG:11:111:GÿZ€>1''1:1'1:1:1>YrŒ«»«»«««««««” +aGGa>::::1>:UYÿZ€U11'111'111:11111aŒ«ŸŸ””ŒŸŸŸŸ”nG>GG>>:11'1:1:ÿZ€Y1'>G>:1:1''1' +''1>GaƒŒŒƒƒŒƒra>>1>>>111'1>>:ÿZ€>YUUaaaU>::>1'''1UƒƒrrnrrrY>1>11>''11::::ÿ +Z€YnYYnYG1>11'''>'GƒraYYYaaY>1111'111>GUUYUÿZ€aƒYaaG>>1111''rnGG>>GYYYG +:1>111111G>GaGGÿZ€YrYƒrra>'1>11''''G>G'>1>>GG>:1'1111'1>GG>GUÿZ€GYUUUYrrY>>1>1 +'''''>G'G>>1G1>>::::1:11:G>>GU>ÿZ€:>>>UarG1:>1>''''aGGGG>G>1>>1::>>::11:GG>GUGÿ +Z€>:>>>GGU>'>>>1'>'”§”ƒrGGGG>111:1>>>:1::GGGUGUÿZ€>UGGGGYY:G'>1>>'²Î»”ŒrnGG>>:> +::>>:>::>UUGUUUÿZ€:>>:1>>>:'1>>'>r«§ƒƒƒŒrGY>1::::>>:::>G>GUGUÿZ€:>11>1>:1:>1>' +r”««ƒƒrƒ”ŸŒaaG>:>>>>:>>>>GGUGUGÿZ€>>:>'>11'1>>'YŒŒƒaaa””ŒGG>1G>::>>>>GGGGGGGÿZ€>>>>11>>111'>Gƒ²«rƒƒƒƒ”ƒrnU>>G>GU>::>GGGGGGGÿZ€G:>>>>1'11>1'aŒ«²ŒG'a«²ŸŒraU>:>G::>:::>>>>>G>ÿZ€GU>>>>'1'>>>'«²”»Ÿar»Á»Ÿƒra>:>>G>>:>>>>>UYGUÿZ€>'GG>'>'>>''>«²»«Á»”ƒÁ²»²”rGG>>>>:>::>>GYaYnrÿZ€>>>>>G>>>'>>Y«ÁÁ»Á»Œ«²ÑÁ»«rG:>G>G>::YnnrrƒƒrÿZ€>GG'GYGGGY''a«ÁÁ»Á²§ƒÑÁÑÁ«ŸY>G>>:>::UUUUUYGGÿZ€GYGraa>nr>1'r»»«²«»ƒ”²²»»»«ƒY>>>>:1:1>GGYrGUYÿZ€YnnŸŸr”Œ>>'r””Œ«»a««Œr”«Œa:::11'':UGUUGaYGÿZ€ann«Ñ«««”G>>>1'Gƒ»aaƒƒ'YGrY1::1'1':GGGUnnnYÿZ€rnn«²«Ñ«ƒG>>GGrrnŸ²GaaG>1YU:::1111:GUUYnrrrÿZ€Œ«²«Ñ«ÎŸn>>GŸŸ”§Á»²ƒƒrnaG:>>1111GGYarrŒƒÿZ€²»Ñ«Ñ«Ñ«Îr>>aŸÁÁÎÎÎλ²²««ŸŒrG>:11'''GaanrƒŒÿZ€««²««²²²²”>>a«ÁÎÎÎÎÑÎÑ»»««”rU::11'1'UnrrrƒŸŒŸÿZ€²«Ÿ«««Ÿ«²Ÿa>Y”ÁÑÑÎÎÑ벫ŸŒrnG11''''1nrŒŒƒŒŸŸ«ÿZ€§«««««««»Î”G>Œ»ÑÎÑÑÎÑÁ»Ÿƒra>:1'''1'1ŸŒ”ŸŸŸŸ««ÿZ€§§§««»«²»Ñ»G>Œ»ÑÎÎÑÎÑÑÁ§ƒnU:111':11a«§Ÿ§««««²ÿZ€”§§Ÿ§§Ÿ§«»»”'n«ÎÑÑÑÑÑÑ««Y>11'':>:1”«§««««§««ÿZ€§Ÿ§Ÿ§Ÿ§Ÿ§²»«n>Œ«ÁÑÑÑÁ²«ŒaU:1'1::>:Y««²«§«§§Ÿ«ÿZ€”§§§ŸŸ§Ÿ§§«»Ÿ:UŒ«²»««ŒƒaG1111::::>ŒŸ§«§§§”§§§ÿZ€Ÿ§ŸŸ§²§ŸŸŸ§««r11>araU:1'11'11>::Ÿ§Ÿ§”ŸŸŸ§§§ÿZ€«Ÿ§§§””ŸŸ”Ÿ«««U1::U>1:11''1'1::1nŸŸ§§ŸŸ”Ÿ”§««ÿZ€ŸŸ”«ŸŸŸŸŸ§ŸŸ§””U1:>U'11111'::>:rŸŸ§§Ÿ””Ÿ”§«««ÿZ€”””Ÿ§ŸŸ§Ÿ””Ÿ”ŸŸŸa11>:'1'11>>:>”ŸŸ§””ŸŒŸŸŸŸ§ÿZ€”””””ŸŒ””ŒŸ”ŸŸ”ŸaG1111::>U”ŸŸŸŸ”§Ÿ””””Ÿ”§§ÿZ€”””ŒŸŒ””ŒŸ”””””ŸŒŸ”nnŒŸŒ§””Ÿ”””ŸŒŒŒŒŸ””ŸÿZ€”ŸŸ§ŒŒ””Œ”Œ””ŒŒ””ŒŸŸŸ””§Ÿ”””Œ”ŸŸŸ§ŸŸ””ŒŒŸ””Ÿ”ÿZ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ diff --git a/examples/demo/opengl/wirebox.xpm b/examples/demo/opengl/wirebox.xpm new file mode 100644 index 000000000..77ca534c3 --- /dev/null +++ b/examples/demo/opengl/wirebox.xpm @@ -0,0 +1,155 @@ +/* XPM */ +static char * EscherCube_xpm[] = { +"48 48 104 2", +" c None", +". c #30C230C22081", +"X c #30C230C230C2", +"o c #30C2410330C2", +"O c #410330C24103", +"+ c #410341034103", +"@ c #514451445144", +"# c #514461855144", +"$ c #618551446185", +"% c #618561856185", +"& c #71C671C671C6", +"* c #71C6820771C6", +"= c #965882078617", +"- c #861792488617", +"; c #965892489658", +": c #9658A2899658", +"> c #9E79A2899E79", +", c #AEBAAEBA9E79", +"< c #AEBAAEBAAEBA", +"1 c #AEBABEFBAEBA", +"2 c #BEFBBEFBBEFB", +"3 c #CF3CBEFBCF3C", +"4 c #CF3CCF3CCF3C", +"5 c #DF7DCF3CCF3C", +"6 c #DF7DDF7DCF3C", +"7 c #DF7DDF7DDF7D", +"8 c #EFBEDF7DDF7D", +"9 c #DF7DEFBEDF7D", +"0 c #EFBEDF7DEFBE", +"q c #EFBEEFBEDF7D", +"w c #208130C22081", +"e c #410351445144", +"r c #514451446185", +"t c #71C6618571C6", +"y c #861771C68617", +"u c #9E7992489E79", +"i c #9E79AEBA9E79", +"p c #BEFBAEBABEFB", +"a c #BEFBCF3CBEFB", +"s c #BEFBCF3CCF3C", +"d c #CF3CCF3CDF7D", +"f c #CF3CDF7DCF3C", +"g c #DF7DDF7DEFBE", +"h c #208120812081", +"j c #30C2208130C2", +"k c #410330C230C2", +"l c #4103410330C2", +"z c #410351444103", +"x c #618551445144", +"c c #618561855144", +"v c #618571C66185", +"b c #861771C671C6", +"n c #8617820771C6", +"m c #965882079658", +"M c #9E7992489658", +"N c #AEBAA289AEBA", +"B c #BEFBAEBAAEBA", +"V c #DF7DCF3CDF7D", +"C c #CF3CDF7DDF7D", +"Z c #208120811040", +"A c #965892488617", +"S c #104020812081", +"D c #861782078617", +"F c #861792489658", +"G c #965892489E79", +"H c #104020811040", +"J c #208110402081", +"K c #30C220812081", +"L c #BEFBBEFBCF3C", +"P c #104010401040", +"I c #208110401040", +"U c #618571C671C6", +"Y c #71C671C68617", +"T c #71C682078617", +"R c #CF3CBEFBBEFB", +"E c #CF3CCF3CBEFB", +"W c #000010401040", +"Q c #104010402081", +"! c #9E79AEBAAEBA", +"~ c #104010400000", +"^ c #AEBAA2899E79", +"/ c #71C671C66185", +"( c #000010400000", +") c #000000000000", +"_ c #104000001040", +"` c #2081208130C2", +"' c #9658A2899E79", +"] c #104000000000", +"[ c #000000001040", +"{ c #30C241034103", +"} c #9E79A289AEBA", +"| c #AEBABEFBBEFB", +" . c #514461856185", +".. c #9E79A2899658", +"X. c #71C661856185", +"o. c #30C230C24103", +"O. c #514441035144", +"+. c #514451444103", +"@. c #410341035144", +"#. c #AEBAAEBABEFB", +"$. c #208130C230C2", +"%. c #6185618571C6", +"&. c #514441034103", +"*. c #861782079658", +" . X o O + @ # $ % & * = - ; : > , < 1 2 2 3 4 5 6 7 7 8 9 0 q ", +" w X X O + @ e r % t & y - ; : u i < < p a 3 s d f 7 7 g 9 0 9 ; ", +" h j X k l + z x c t v b n m ; M > N < B 2 2 a 3 4 V 6 7 7 0 9 m ; ", +" h h w X f d f d f V f V f 7 f 7 C 7 f V f V f d f V f 7 9 g 9 m ; ; ", +" Z h w j - 4 4 5 4 5 4 5 4 V f V 6 V f V f V 4 5 4 5 4 V 7 7 7 m A ; ; ", +" S h h j - D s 4 4 4 4 4 4 4 4 d f V f d f d 4 d 4 4 4 V C 7 7 m - ; F G ", +" H J Z K * D D m ; M 5 4 V 7 = D m - ; ; ", +" H h S h * y D L F ; : 4 f V C D D m a ; ; G ", +" P I H J & b n 2 2 m A M 3 4 5 f y D = 2 2 A ; ; ", +" P P H J U Y & p 1 2 - ; : 4 4 d f y T D 1 p 1 ; F G ", +" P P H J % t & < < < m ; u R E 4 f b * y B < < A ; ; ", +" W P P Q % t v < ! < - ; : L a 4 4 & * y < < ! ; ; G ", +" ~ P ~ I c $ % > ^ > m ; M 2 2 3 4 t / b ^ i ^ ; M ; ", +" ( P W P # $ % > > > F ; : p a 3 s t U & > > > ; ; G ", +" ) _ ( _ @ $ # M ; u m ; u p 2 2 a % v t M ; u ; M ; ", +" ( _ ( P P P H h h ` w X o : ; F F ; : & * D - G ' > i < 1 2 a % v t : ; F ; : u ", +" ) ] ( _ ~ P P I Z h w j X O m - m ; ; M & y - m ; > i N < 2 2 $ c % m - m ; M : ", +") [ ( _ W P P Q H h h j X O { D D - F G : y T m ; u > } < p | r .% D D - G : u ", +"V f 5 4 5 f V f V f V f V f V y * y m ; u f 5 f V f 5 4 V f x @ $ y * y : u ..", +"4 d f 4 f d f d 4 d f V f V f U & U F G : d f d f d f 4 4 d @ r # U & U G : > ", +"3 4 3 E 4 E 4 4 3 4 4 4 5 4 5 t v X.; ; u 4 4 4 4 E 4 E 3 4 @ @ x t v X.; u ..", +"a 4 a o.{ + .% v ; G > 3 a 4 e @ # .% v u ' > ", +"3 2 3 X O o $ # $ ; ; u 2 3 2 O.+.@ $ # $ : u > ", +"a 2 a X o + @ @ @ ; u ' 2 2 2 z @ @ @ @ @ u > } ", +"p < p X k l O.z O.; : u 1 p < O.+.@ O.z O...> i ", +"1 < 1 o.o + @.z @.; G > #.1 < z O.@ + @.z > > } ", +"N , N X O o l + o ; ; u 1 1 1 O.+.@ O l + : u > ", +"i } i o.o + O o o.; u o + z @ # % v } i } e @ @ } < #.| L a 4 f V o o.o G ' > ", +"> ..u o O + . X . ; o O + O.@ $ % & u u ..@ @ x , < 1 2 2 3 4 5 6 X . X ; u ..", +"' u : O + + j $.j $.o.{ O.e r % %.U G : u @ r # < < p 2 3 s d f 7 $.j $.u : u ", +"; A M l + + h j . K h j h K h h h h ; ; A x @ $ h h h h h K h j 6 7 7 0 : u ..", +"- m - + { @. h h w %.w h h h h h S h S m - m # r # h S h S h h h f 7 9 g F G : ", +"y D D l + + Z h h t % h Z J Z J Z J Z J D y D x # $ H J Z J Z J f V 7 7 - M ; ", +"* y * + z O. S h h & U t y * y @ $ . 4 d C 7 - m ; ", +"& / b l + + P J Z y & t & & / x c $ E 5 4 V n = D ", +"v %.v + z O. H J H D * & & v %.# % . a 4 f V * D - ", +"X.% % + &.z P P H D n y c $ % $ c $ a 3 4 V * y D ", +"# $ # + z @ P P H J m - D $ # $ # $ % 2 3 4 d * y T ", +"@ @ x + + z W P P Q m D m @ @ @ $ c % 2 R E 4 & b * ", +"z O.e + z @ P ~ I ; ; *. @ z O. .% % L s 4 U & * ", +"&.+ &.l &.+.W P M ; m + &.+ $ c X.2 3 v t & ", +"{ + { @.z O._ u ' ; + { + .$ % 3 v t & ", +"O o k + O.P P P H h h ` w X o l + z @ c X./ b n m ; u o O o $ % % % t v ", +"$.X $.@._ ~ P P I Z h w j X O + + @ # % v & * D - ; : X $.X .% v %.v ", +"j . j _ W P P Q H h h j X O { + &.@ $ c t & y D m ; > . j . % c X.% ", +"w j w ` w j w ` w ` h ` h h S h h h h ` h ` w ` w j w ` w j .% % ", +"h h K h h h h h h h J h J H J Z J H J h h h h h h h J h h h $ % ", +"S h h h H h S h S h S h H Q H J H Q H h H h S h S h S h S h . "}; diff --git a/examples/demo/qasteroids/bg.png b/examples/demo/qasteroids/bg.png Binary files differnew file mode 100644 index 000000000..33cdc48c1 --- /dev/null +++ b/examples/demo/qasteroids/bg.png diff --git a/examples/demo/qasteroids/ledmeter.cpp b/examples/demo/qasteroids/ledmeter.cpp new file mode 100644 index 000000000..de75852a9 --- /dev/null +++ b/examples/demo/qasteroids/ledmeter.cpp @@ -0,0 +1,117 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ + +#include <qpainter.h> +#include "ledmeter.h" + +KALedMeter::KALedMeter( TQWidget *parent ) : TQFrame( parent ) +{ + mCRanges.setAutoDelete( TRUE ); + mRange = 100; + mCount = 20; + mCurrentCount = 0; + mValue = 0; + setMinimumWidth( mCount * 2 + frameWidth() ); +} + +void KALedMeter::setRange( int r ) +{ + mRange = r; + if ( mRange < 1 ) + mRange = 1; + setValue( mValue ); + update(); +} + +void KALedMeter::setCount( int c ) +{ + mCount = c; + if ( mCount < 1 ) + mCount = 1; + setMinimumWidth( mCount * 2 + frameWidth() ); + calcColorRanges(); + setValue( mValue ); + update(); +} + +void KALedMeter::setValue( int v ) +{ + mValue = v; + if ( mValue > mRange ) + mValue = mRange; + else if ( mValue < 0 ) + mValue = 0; + int c = ( mValue + mRange / mCount - 1 ) * mCount / mRange; + if ( c != mCurrentCount ) + { + mCurrentCount = c; + update(); + } +} + +void KALedMeter::addColorRange( int pc, const TQColor &c ) +{ + ColorRange *cr = new ColorRange; + cr->mPc = pc; + cr->mColor = c; + mCRanges.append( cr ); + calcColorRanges(); +} + +void KALedMeter::resizeEvent( TQResizeEvent *e ) +{ + TQFrame::resizeEvent( e ); + int w = ( width() - frameWidth() - 2 ) / mCount * mCount; + w += frameWidth() + 2; + setFrameRect( TQRect( 0, 0, w, height() ) ); +} + +void KALedMeter::drawContents( TQPainter *p ) +{ + TQRect b = contentsRect(); + + unsigned cidx = 0; + int ncol = mCount; + TQColor col = colorGroup().foreground(); + + if ( !mCRanges.isEmpty() ) + { + col = mCRanges.at( cidx )->mColor; + ncol = mCRanges.at( cidx )->mValue; + } + p->setBrush( col ); + p->setPen( col ); + + int lw = b.width() / mCount; + int lx = b.left() + 1; + for ( int i = 0; i < mCurrentCount; i++, lx += lw ) + { + if ( i > ncol ) + { + if ( ++cidx < mCRanges.count() ) + { + col = mCRanges.at( cidx )->mColor; + ncol = mCRanges.at( cidx )->mValue; + p->setBrush( col ); + p->setPen( col ); + } + } + + p->drawRect( lx, b.top() + 1, lw - 1, b.height() - 2 ); + } +} + +void KALedMeter::calcColorRanges() +{ + int prev = 0; + ColorRange *cr; + for ( cr = mCRanges.first(); cr; cr = mCRanges.next() ) + { + cr->mValue = prev + cr->mPc * mCount / 100; + prev = cr->mValue; + } +} + diff --git a/examples/demo/qasteroids/ledmeter.h b/examples/demo/qasteroids/ledmeter.h new file mode 100644 index 000000000..8018c72df --- /dev/null +++ b/examples/demo/qasteroids/ledmeter.h @@ -0,0 +1,53 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ + +#ifndef __LEDMETER_H__ +#define __LEDMETER_H__ + +#include <qframe.h> +#include <qptrlist.h> + + +class KALedMeter : public TQFrame +{ + Q_OBJECT +public: + KALedMeter( TQWidget *parent ); + + int range() const { return mRange; } + void setRange( int r ); + + int count() const { return mCount; } + void setCount( int c ); + + int value () const { return mValue; } + + void addColorRange( int pc, const TQColor &c ); + +public slots: + void setValue( int v ); + +protected: + virtual void resizeEvent( TQResizeEvent * ); + virtual void drawContents( TQPainter * ); + void calcColorRanges(); + +protected: + struct ColorRange + { + int mPc; + int mValue; + TQColor mColor; + }; + + int mRange; + int mCount; + int mCurrentCount; + int mValue; + TQPtrList<ColorRange> mCRanges; +}; + +#endif diff --git a/examples/demo/qasteroids/sounds/Explosion.wav b/examples/demo/qasteroids/sounds/Explosion.wav Binary files differnew file mode 100644 index 000000000..7b140b1c6 --- /dev/null +++ b/examples/demo/qasteroids/sounds/Explosion.wav diff --git a/examples/demo/qasteroids/sprites.h b/examples/demo/qasteroids/sprites.h new file mode 100644 index 000000000..361bd0e2b --- /dev/null +++ b/examples/demo/qasteroids/sprites.h @@ -0,0 +1,129 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ + +#ifndef __SPRITES_H__ +#define __SPRITES_H__ + +#include <qcanvas.h> + +#define ID_ROCK_LARGE 1024 +#define ID_ROCK_MEDIUM 1025 +#define ID_ROCK_SMALL 1026 + +#define ID_MISSILE 1030 + +#define ID_BIT 1040 +#define ID_EXHAUST 1041 + +#define ID_ENERGY_POWERUP 1310 +#define ID_TELEPORT_POWERUP 1311 +#define ID_BRAKE_POWERUP 1312 +#define ID_SHIELD_POWERUP 1313 +#define ID_SHOOT_POWERUP 1314 + +#define ID_SHIP 1350 +#define ID_SHIELD 1351 + +#define MAX_SHIELD_AGE 350 +#define MAX_POWERUP_AGE 500 +#define MAX_MISSILE_AGE 40 + +class KMissile : public TQCanvasSprite +{ +public: + KMissile( TQCanvasPixmapArray *s, TQCanvas *c ) : TQCanvasSprite( s, c ) + { myAge = 0; } + + virtual int rtti() const { return ID_MISSILE; } + + void growOlder() { myAge++; } + bool expired() { return myAge > MAX_MISSILE_AGE; } + +private: + int myAge; +}; + +class KBit : public TQCanvasSprite +{ +public: + KBit( TQCanvasPixmapArray *s, TQCanvas *c ) : TQCanvasSprite( s, c ) + { death = 7; } + + virtual int rtti() const { return ID_BIT; } + + void setDeath( int d ) { death = d; } + void growOlder() { death--; } + bool expired() { return death <= 0; } + +private: + int death; +}; + +class KExhaust : public TQCanvasSprite +{ +public: + KExhaust( TQCanvasPixmapArray *s, TQCanvas *c ) : TQCanvasSprite( s, c ) + { death = 1; } + + virtual int rtti() const { return ID_EXHAUST; } + + void setDeath( int d ) { death = d; } + void growOlder() { death--; } + bool expired() { return death <= 0; } + +private: + int death; +}; + +class KPowerup : public TQCanvasSprite +{ +public: + KPowerup( TQCanvasPixmapArray *s, TQCanvas *c, int t ) : TQCanvasSprite( s, c ), + myAge( 0 ), type(t) { } + + virtual int rtti() const { return type; } + + void growOlder() { myAge++; } + bool expired() const { return myAge > MAX_POWERUP_AGE; } + +protected: + int myAge; + int type; +}; + +class KRock : public TQCanvasSprite +{ +public: + KRock (TQCanvasPixmapArray *s, TQCanvas *c, int t, int sk, int st) : TQCanvasSprite( s, c ) + { type = t; skip = cskip = sk; step = st; } + + void nextFrame() + { + if (cskip-- <= 0) { + setFrame( (frame()+step+frameCount())%frameCount() ); + cskip = TQABS(skip); + } + } + + virtual int rtti() const { return type; } + +private: + int type; + int skip; + int cskip; + int step; +}; + +class KShield : public TQCanvasSprite +{ +public: + KShield( TQCanvasPixmapArray *s, TQCanvas *c ) + : TQCanvasSprite( s, c ) {} + + virtual int rtti() const { return ID_SHIELD; } +}; + +#endif diff --git a/examples/demo/qasteroids/sprites/.pbm b/examples/demo/qasteroids/sprites/.pbm new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/examples/demo/qasteroids/sprites/.pbm diff --git a/examples/demo/qasteroids/sprites/bits/bits.ini b/examples/demo/qasteroids/sprites/bits/bits.ini new file mode 100644 index 000000000..cb2976f88 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits.ini @@ -0,0 +1,9 @@ +Cyclic_Animation=On +Width=12 +Height=12 +Final_frame=16 ;; NR_ROTS +Antialias=On +Output_Alpha=On +Output_to_File=On +Output_File_Type=n +Input_File_Name=bits.pov diff --git a/examples/demo/qasteroids/sprites/bits/bits.pov b/examples/demo/qasteroids/sprites/bits/bits.pov new file mode 100644 index 000000000..9be7ccb67 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits.pov @@ -0,0 +1,31 @@ + +#version 3.0 +global_settings { assumed_gamma 2.0 } + +#include "colors.inc" +#include "textures.inc" +#include "metals.inc" + +camera { + location <15, -15, -100> + look_at <0, 0, 0> +} + +light_source { <50, 50, -50> colour White } +light_source { <0, 0, -50> colour White } + +prism { + linear_sweep + linear_spline + 0, + 0.2, + 5, + <2, 0>, <0, 2>, <-1, 1>, <0, -3>, <2, 0> + texture { T_Silver_2A } + + rotate <360*clock, 50, 30> + scale <20, 20, 20> +} + + + diff --git a/examples/demo/qasteroids/sprites/bits/bits0000.png b/examples/demo/qasteroids/sprites/bits/bits0000.png Binary files differnew file mode 100644 index 000000000..5ec9d0294 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0000.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0001.png b/examples/demo/qasteroids/sprites/bits/bits0001.png Binary files differnew file mode 100644 index 000000000..07b401233 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0001.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0002.png b/examples/demo/qasteroids/sprites/bits/bits0002.png Binary files differnew file mode 100644 index 000000000..833379229 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0002.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0003.png b/examples/demo/qasteroids/sprites/bits/bits0003.png Binary files differnew file mode 100644 index 000000000..9f1fc0283 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0003.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0004.png b/examples/demo/qasteroids/sprites/bits/bits0004.png Binary files differnew file mode 100644 index 000000000..eb1cc090c --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0004.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0005.png b/examples/demo/qasteroids/sprites/bits/bits0005.png Binary files differnew file mode 100644 index 000000000..149be63c1 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0005.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0006.png b/examples/demo/qasteroids/sprites/bits/bits0006.png Binary files differnew file mode 100644 index 000000000..4ac75c8ed --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0006.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0007.png b/examples/demo/qasteroids/sprites/bits/bits0007.png Binary files differnew file mode 100644 index 000000000..907241dd7 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0007.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0008.png b/examples/demo/qasteroids/sprites/bits/bits0008.png Binary files differnew file mode 100644 index 000000000..15332684f --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0008.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0009.png b/examples/demo/qasteroids/sprites/bits/bits0009.png Binary files differnew file mode 100644 index 000000000..05402ba9e --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0009.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0010.png b/examples/demo/qasteroids/sprites/bits/bits0010.png Binary files differnew file mode 100644 index 000000000..ca4f2297a --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0010.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0011.png b/examples/demo/qasteroids/sprites/bits/bits0011.png Binary files differnew file mode 100644 index 000000000..91913c032 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0011.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0012.png b/examples/demo/qasteroids/sprites/bits/bits0012.png Binary files differnew file mode 100644 index 000000000..e55d4399a --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0012.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0013.png b/examples/demo/qasteroids/sprites/bits/bits0013.png Binary files differnew file mode 100644 index 000000000..9c7343600 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0013.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0014.png b/examples/demo/qasteroids/sprites/bits/bits0014.png Binary files differnew file mode 100644 index 000000000..f0463a2a9 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0014.png diff --git a/examples/demo/qasteroids/sprites/bits/bits0015.png b/examples/demo/qasteroids/sprites/bits/bits0015.png Binary files differnew file mode 100644 index 000000000..bce35aac5 --- /dev/null +++ b/examples/demo/qasteroids/sprites/bits/bits0015.png diff --git a/examples/demo/qasteroids/sprites/exhaust/exhaust.png b/examples/demo/qasteroids/sprites/exhaust/exhaust.png Binary files differnew file mode 100644 index 000000000..a17ee71cf --- /dev/null +++ b/examples/demo/qasteroids/sprites/exhaust/exhaust.png diff --git a/examples/demo/qasteroids/sprites/missile/missile.png b/examples/demo/qasteroids/sprites/missile/missile.png Binary files differnew file mode 100644 index 000000000..4283c6709 --- /dev/null +++ b/examples/demo/qasteroids/sprites/missile/missile.png diff --git a/examples/demo/qasteroids/sprites/powerups/brake.png b/examples/demo/qasteroids/sprites/powerups/brake.png Binary files differnew file mode 100644 index 000000000..75cd649cc --- /dev/null +++ b/examples/demo/qasteroids/sprites/powerups/brake.png diff --git a/examples/demo/qasteroids/sprites/powerups/energy.png b/examples/demo/qasteroids/sprites/powerups/energy.png Binary files differnew file mode 100644 index 000000000..2d97ac1ed --- /dev/null +++ b/examples/demo/qasteroids/sprites/powerups/energy.png diff --git a/examples/demo/qasteroids/sprites/powerups/shield.png b/examples/demo/qasteroids/sprites/powerups/shield.png Binary files differnew file mode 100644 index 000000000..bd6055582 --- /dev/null +++ b/examples/demo/qasteroids/sprites/powerups/shield.png diff --git a/examples/demo/qasteroids/sprites/powerups/shoot.png b/examples/demo/qasteroids/sprites/powerups/shoot.png Binary files differnew file mode 100644 index 000000000..4b2b3e335 --- /dev/null +++ b/examples/demo/qasteroids/sprites/powerups/shoot.png diff --git a/examples/demo/qasteroids/sprites/powerups/teleport.png b/examples/demo/qasteroids/sprites/powerups/teleport.png Binary files differnew file mode 100644 index 000000000..121ec9cde --- /dev/null +++ b/examples/demo/qasteroids/sprites/powerups/teleport.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock1.ini b/examples/demo/qasteroids/sprites/rock1/rock1.ini new file mode 100644 index 000000000..e42fc7662 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock1.ini @@ -0,0 +1,9 @@ +Cyclic_Animation=On +Width=48 +Height=48 +Final_frame=32 ;; NR_ROTS +Antialias=On +Output_Alpha=On +Output_to_File=On +Output_File_Type=n +Input_File_Name=rock1.pov diff --git a/examples/demo/qasteroids/sprites/rock1/rock1.pov b/examples/demo/qasteroids/sprites/rock1/rock1.pov new file mode 100644 index 000000000..58298c050 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock1.pov @@ -0,0 +1,26 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" +// #include "stones.inc" + +camera { + location <2,2,-6> + up <0, 1, 0> +// right <4/3, 0, 0> + look_at <0,0,0> +} + +object { light_source { <10, 5, -5> color red 1.1 green 1.1 blue 1.0 } } + +#declare Rock = +mesh { + #include "rock.inc" /* collection of triangle or smooth_triangle data */ +} + +object { + Rock + texture { pigment {White} } + scale 1.9 + rotate <60, 45, 360*clock> +} + diff --git a/examples/demo/qasteroids/sprites/rock1/rock10000.png b/examples/demo/qasteroids/sprites/rock1/rock10000.png Binary files differnew file mode 100644 index 000000000..2e3ff9322 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10000.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10001.png b/examples/demo/qasteroids/sprites/rock1/rock10001.png Binary files differnew file mode 100644 index 000000000..ba70d2404 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10001.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10002.png b/examples/demo/qasteroids/sprites/rock1/rock10002.png Binary files differnew file mode 100644 index 000000000..88d776e43 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10002.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10003.png b/examples/demo/qasteroids/sprites/rock1/rock10003.png Binary files differnew file mode 100644 index 000000000..9db197d4c --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10003.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10004.png b/examples/demo/qasteroids/sprites/rock1/rock10004.png Binary files differnew file mode 100644 index 000000000..9b92d55c3 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10004.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10005.png b/examples/demo/qasteroids/sprites/rock1/rock10005.png Binary files differnew file mode 100644 index 000000000..9cdddf5ab --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10005.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10006.png b/examples/demo/qasteroids/sprites/rock1/rock10006.png Binary files differnew file mode 100644 index 000000000..0c421a009 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10006.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10007.png b/examples/demo/qasteroids/sprites/rock1/rock10007.png Binary files differnew file mode 100644 index 000000000..2339c8367 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10007.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10008.png b/examples/demo/qasteroids/sprites/rock1/rock10008.png Binary files differnew file mode 100644 index 000000000..d1eb8aaf9 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10008.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10009.png b/examples/demo/qasteroids/sprites/rock1/rock10009.png Binary files differnew file mode 100644 index 000000000..47ada4278 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10009.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10010.png b/examples/demo/qasteroids/sprites/rock1/rock10010.png Binary files differnew file mode 100644 index 000000000..1a2eba02e --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10010.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10011.png b/examples/demo/qasteroids/sprites/rock1/rock10011.png Binary files differnew file mode 100644 index 000000000..ec213e1c8 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10011.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10012.png b/examples/demo/qasteroids/sprites/rock1/rock10012.png Binary files differnew file mode 100644 index 000000000..3bdb39b61 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10012.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10013.png b/examples/demo/qasteroids/sprites/rock1/rock10013.png Binary files differnew file mode 100644 index 000000000..08de9a088 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10013.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10014.png b/examples/demo/qasteroids/sprites/rock1/rock10014.png Binary files differnew file mode 100644 index 000000000..3b6ce6084 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10014.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10015.png b/examples/demo/qasteroids/sprites/rock1/rock10015.png Binary files differnew file mode 100644 index 000000000..01216dce4 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10015.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10016.png b/examples/demo/qasteroids/sprites/rock1/rock10016.png Binary files differnew file mode 100644 index 000000000..efb612d44 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10016.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10017.png b/examples/demo/qasteroids/sprites/rock1/rock10017.png Binary files differnew file mode 100644 index 000000000..97bbfce88 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10017.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10018.png b/examples/demo/qasteroids/sprites/rock1/rock10018.png Binary files differnew file mode 100644 index 000000000..29862676c --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10018.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10019.png b/examples/demo/qasteroids/sprites/rock1/rock10019.png Binary files differnew file mode 100644 index 000000000..80eab6df8 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10019.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10020.png b/examples/demo/qasteroids/sprites/rock1/rock10020.png Binary files differnew file mode 100644 index 000000000..78023e088 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10020.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10021.png b/examples/demo/qasteroids/sprites/rock1/rock10021.png Binary files differnew file mode 100644 index 000000000..076a33848 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10021.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10022.png b/examples/demo/qasteroids/sprites/rock1/rock10022.png Binary files differnew file mode 100644 index 000000000..4f8f5edcb --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10022.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10023.png b/examples/demo/qasteroids/sprites/rock1/rock10023.png Binary files differnew file mode 100644 index 000000000..4e6ba042a --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10023.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10024.png b/examples/demo/qasteroids/sprites/rock1/rock10024.png Binary files differnew file mode 100644 index 000000000..1a15fc3b7 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10024.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10025.png b/examples/demo/qasteroids/sprites/rock1/rock10025.png Binary files differnew file mode 100644 index 000000000..b627d537d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10025.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10026.png b/examples/demo/qasteroids/sprites/rock1/rock10026.png Binary files differnew file mode 100644 index 000000000..7df23b167 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10026.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10027.png b/examples/demo/qasteroids/sprites/rock1/rock10027.png Binary files differnew file mode 100644 index 000000000..d2cb5d3f8 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10027.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10028.png b/examples/demo/qasteroids/sprites/rock1/rock10028.png Binary files differnew file mode 100644 index 000000000..68611a679 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10028.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10029.png b/examples/demo/qasteroids/sprites/rock1/rock10029.png Binary files differnew file mode 100644 index 000000000..44d6a30bb --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10029.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10030.png b/examples/demo/qasteroids/sprites/rock1/rock10030.png Binary files differnew file mode 100644 index 000000000..9dca7db1d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10030.png diff --git a/examples/demo/qasteroids/sprites/rock1/rock10031.png b/examples/demo/qasteroids/sprites/rock1/rock10031.png Binary files differnew file mode 100644 index 000000000..10beae6ab --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock1/rock10031.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock2.ini b/examples/demo/qasteroids/sprites/rock2/rock2.ini new file mode 100644 index 000000000..d50e6fada --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock2.ini @@ -0,0 +1,9 @@ +Cyclic_Animation=On +Width=32 +Height=32 +Final_frame=32 ;; NR_ROTS +Antialias=On +Output_Alpha=On +Output_to_File=On +Output_File_Type=n +Input_File_Name=rock2.pov diff --git a/examples/demo/qasteroids/sprites/rock2/rock2.pov b/examples/demo/qasteroids/sprites/rock2/rock2.pov new file mode 100644 index 000000000..2f37a2062 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock2.pov @@ -0,0 +1,26 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" +// #include "stones.inc" + +camera { + location <2,2,-6> + up <0, 1, 0> +// right <4/3, 0, 0> + look_at <0,0,0> +} + +object { light_source { <10, 5, -5> color red 1.1 green 1.1 blue 1.0 } } + +#declare Rock = +mesh { + #include "rock.inc" /* collection of triangle or smooth_triangle data */ +} + +object { + Rock + texture { pigment {White} } + scale 1.9 + rotate <60, 30, 360*clock> +} + diff --git a/examples/demo/qasteroids/sprites/rock2/rock20000.png b/examples/demo/qasteroids/sprites/rock2/rock20000.png Binary files differnew file mode 100644 index 000000000..5cb52bb81 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20000.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20001.png b/examples/demo/qasteroids/sprites/rock2/rock20001.png Binary files differnew file mode 100644 index 000000000..c4c85eb59 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20001.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20002.png b/examples/demo/qasteroids/sprites/rock2/rock20002.png Binary files differnew file mode 100644 index 000000000..dea49d7e8 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20002.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20003.png b/examples/demo/qasteroids/sprites/rock2/rock20003.png Binary files differnew file mode 100644 index 000000000..39772b8aa --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20003.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20004.png b/examples/demo/qasteroids/sprites/rock2/rock20004.png Binary files differnew file mode 100644 index 000000000..fb02ee48e --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20004.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20005.png b/examples/demo/qasteroids/sprites/rock2/rock20005.png Binary files differnew file mode 100644 index 000000000..a81c5ac7d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20005.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20006.png b/examples/demo/qasteroids/sprites/rock2/rock20006.png Binary files differnew file mode 100644 index 000000000..cf5c2f4c4 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20006.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20007.png b/examples/demo/qasteroids/sprites/rock2/rock20007.png Binary files differnew file mode 100644 index 000000000..479c21d27 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20007.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20008.png b/examples/demo/qasteroids/sprites/rock2/rock20008.png Binary files differnew file mode 100644 index 000000000..871abca06 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20008.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20009.png b/examples/demo/qasteroids/sprites/rock2/rock20009.png Binary files differnew file mode 100644 index 000000000..d5d786081 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20009.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20010.png b/examples/demo/qasteroids/sprites/rock2/rock20010.png Binary files differnew file mode 100644 index 000000000..1da995334 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20010.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20011.png b/examples/demo/qasteroids/sprites/rock2/rock20011.png Binary files differnew file mode 100644 index 000000000..29886585e --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20011.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20012.png b/examples/demo/qasteroids/sprites/rock2/rock20012.png Binary files differnew file mode 100644 index 000000000..d104ff954 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20012.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20013.png b/examples/demo/qasteroids/sprites/rock2/rock20013.png Binary files differnew file mode 100644 index 000000000..e12943df9 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20013.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20014.png b/examples/demo/qasteroids/sprites/rock2/rock20014.png Binary files differnew file mode 100644 index 000000000..dc7529cfd --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20014.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20015.png b/examples/demo/qasteroids/sprites/rock2/rock20015.png Binary files differnew file mode 100644 index 000000000..3d9d3185e --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20015.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20016.png b/examples/demo/qasteroids/sprites/rock2/rock20016.png Binary files differnew file mode 100644 index 000000000..6314f03b8 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20016.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20017.png b/examples/demo/qasteroids/sprites/rock2/rock20017.png Binary files differnew file mode 100644 index 000000000..5a8aeef21 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20017.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20018.png b/examples/demo/qasteroids/sprites/rock2/rock20018.png Binary files differnew file mode 100644 index 000000000..f0e5b088d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20018.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20019.png b/examples/demo/qasteroids/sprites/rock2/rock20019.png Binary files differnew file mode 100644 index 000000000..d731950d0 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20019.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20020.png b/examples/demo/qasteroids/sprites/rock2/rock20020.png Binary files differnew file mode 100644 index 000000000..8bc7e20fe --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20020.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20021.png b/examples/demo/qasteroids/sprites/rock2/rock20021.png Binary files differnew file mode 100644 index 000000000..b2854b25d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20021.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20022.png b/examples/demo/qasteroids/sprites/rock2/rock20022.png Binary files differnew file mode 100644 index 000000000..781d620a0 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20022.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20023.png b/examples/demo/qasteroids/sprites/rock2/rock20023.png Binary files differnew file mode 100644 index 000000000..1f64b02c2 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20023.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20024.png b/examples/demo/qasteroids/sprites/rock2/rock20024.png Binary files differnew file mode 100644 index 000000000..bd19e7444 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20024.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20025.png b/examples/demo/qasteroids/sprites/rock2/rock20025.png Binary files differnew file mode 100644 index 000000000..180f5b65c --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20025.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20026.png b/examples/demo/qasteroids/sprites/rock2/rock20026.png Binary files differnew file mode 100644 index 000000000..f2681d46f --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20026.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20027.png b/examples/demo/qasteroids/sprites/rock2/rock20027.png Binary files differnew file mode 100644 index 000000000..5bc1add09 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20027.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20028.png b/examples/demo/qasteroids/sprites/rock2/rock20028.png Binary files differnew file mode 100644 index 000000000..5621b4d6d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20028.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20029.png b/examples/demo/qasteroids/sprites/rock2/rock20029.png Binary files differnew file mode 100644 index 000000000..aec4a3474 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20029.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20030.png b/examples/demo/qasteroids/sprites/rock2/rock20030.png Binary files differnew file mode 100644 index 000000000..121b70eea --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20030.png diff --git a/examples/demo/qasteroids/sprites/rock2/rock20031.png b/examples/demo/qasteroids/sprites/rock2/rock20031.png Binary files differnew file mode 100644 index 000000000..661b18e7c --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock2/rock20031.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock3.ini b/examples/demo/qasteroids/sprites/rock3/rock3.ini new file mode 100644 index 000000000..26a3cf969 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock3.ini @@ -0,0 +1,9 @@ +Cyclic_Animation=On +Width=20 +Height=20 +Final_frame=32 ;; NR_ROTS +Antialias=On +Output_Alpha=On +Output_to_File=On +Output_File_Type=n +Input_File_Name=rock3.pov diff --git a/examples/demo/qasteroids/sprites/rock3/rock3.pov b/examples/demo/qasteroids/sprites/rock3/rock3.pov new file mode 100644 index 000000000..2f37a2062 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock3.pov @@ -0,0 +1,26 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" +// #include "stones.inc" + +camera { + location <2,2,-6> + up <0, 1, 0> +// right <4/3, 0, 0> + look_at <0,0,0> +} + +object { light_source { <10, 5, -5> color red 1.1 green 1.1 blue 1.0 } } + +#declare Rock = +mesh { + #include "rock.inc" /* collection of triangle or smooth_triangle data */ +} + +object { + Rock + texture { pigment {White} } + scale 1.9 + rotate <60, 30, 360*clock> +} + diff --git a/examples/demo/qasteroids/sprites/rock3/rock30000.png b/examples/demo/qasteroids/sprites/rock3/rock30000.png Binary files differnew file mode 100644 index 000000000..de1205a88 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30000.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30001.png b/examples/demo/qasteroids/sprites/rock3/rock30001.png Binary files differnew file mode 100644 index 000000000..12ebc0031 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30001.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30002.png b/examples/demo/qasteroids/sprites/rock3/rock30002.png Binary files differnew file mode 100644 index 000000000..265c381bc --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30002.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30003.png b/examples/demo/qasteroids/sprites/rock3/rock30003.png Binary files differnew file mode 100644 index 000000000..1ff7a0675 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30003.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30004.png b/examples/demo/qasteroids/sprites/rock3/rock30004.png Binary files differnew file mode 100644 index 000000000..5b505bf10 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30004.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30005.png b/examples/demo/qasteroids/sprites/rock3/rock30005.png Binary files differnew file mode 100644 index 000000000..204c9697b --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30005.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30006.png b/examples/demo/qasteroids/sprites/rock3/rock30006.png Binary files differnew file mode 100644 index 000000000..32140cffb --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30006.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30007.png b/examples/demo/qasteroids/sprites/rock3/rock30007.png Binary files differnew file mode 100644 index 000000000..f01baa6b3 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30007.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30008.png b/examples/demo/qasteroids/sprites/rock3/rock30008.png Binary files differnew file mode 100644 index 000000000..eee458e5a --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30008.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30009.png b/examples/demo/qasteroids/sprites/rock3/rock30009.png Binary files differnew file mode 100644 index 000000000..14412d4e1 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30009.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30010.png b/examples/demo/qasteroids/sprites/rock3/rock30010.png Binary files differnew file mode 100644 index 000000000..bb61d549b --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30010.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30011.png b/examples/demo/qasteroids/sprites/rock3/rock30011.png Binary files differnew file mode 100644 index 000000000..8486e5a45 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30011.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30012.png b/examples/demo/qasteroids/sprites/rock3/rock30012.png Binary files differnew file mode 100644 index 000000000..d9ae4191e --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30012.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30013.png b/examples/demo/qasteroids/sprites/rock3/rock30013.png Binary files differnew file mode 100644 index 000000000..ce694002a --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30013.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30014.png b/examples/demo/qasteroids/sprites/rock3/rock30014.png Binary files differnew file mode 100644 index 000000000..981e92c13 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30014.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30015.png b/examples/demo/qasteroids/sprites/rock3/rock30015.png Binary files differnew file mode 100644 index 000000000..63f0a69d8 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30015.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30016.png b/examples/demo/qasteroids/sprites/rock3/rock30016.png Binary files differnew file mode 100644 index 000000000..72bc42fc7 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30016.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30017.png b/examples/demo/qasteroids/sprites/rock3/rock30017.png Binary files differnew file mode 100644 index 000000000..c89f358ce --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30017.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30018.png b/examples/demo/qasteroids/sprites/rock3/rock30018.png Binary files differnew file mode 100644 index 000000000..e1ba724d4 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30018.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30019.png b/examples/demo/qasteroids/sprites/rock3/rock30019.png Binary files differnew file mode 100644 index 000000000..5f004a766 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30019.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30020.png b/examples/demo/qasteroids/sprites/rock3/rock30020.png Binary files differnew file mode 100644 index 000000000..58009bf92 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30020.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30021.png b/examples/demo/qasteroids/sprites/rock3/rock30021.png Binary files differnew file mode 100644 index 000000000..8d9549c85 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30021.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30022.png b/examples/demo/qasteroids/sprites/rock3/rock30022.png Binary files differnew file mode 100644 index 000000000..1e8a1c233 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30022.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30023.png b/examples/demo/qasteroids/sprites/rock3/rock30023.png Binary files differnew file mode 100644 index 000000000..9b960d669 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30023.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30024.png b/examples/demo/qasteroids/sprites/rock3/rock30024.png Binary files differnew file mode 100644 index 000000000..6c15f2b89 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30024.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30025.png b/examples/demo/qasteroids/sprites/rock3/rock30025.png Binary files differnew file mode 100644 index 000000000..12b05da54 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30025.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30026.png b/examples/demo/qasteroids/sprites/rock3/rock30026.png Binary files differnew file mode 100644 index 000000000..16190e944 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30026.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30027.png b/examples/demo/qasteroids/sprites/rock3/rock30027.png Binary files differnew file mode 100644 index 000000000..a8625015d --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30027.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30028.png b/examples/demo/qasteroids/sprites/rock3/rock30028.png Binary files differnew file mode 100644 index 000000000..e3e0c1806 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30028.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30029.png b/examples/demo/qasteroids/sprites/rock3/rock30029.png Binary files differnew file mode 100644 index 000000000..ec70b8443 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30029.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30030.png b/examples/demo/qasteroids/sprites/rock3/rock30030.png Binary files differnew file mode 100644 index 000000000..0b060d038 --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30030.png diff --git a/examples/demo/qasteroids/sprites/rock3/rock30031.png b/examples/demo/qasteroids/sprites/rock3/rock30031.png Binary files differnew file mode 100644 index 000000000..c1dc1b92f --- /dev/null +++ b/examples/demo/qasteroids/sprites/rock3/rock30031.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0000.png b/examples/demo/qasteroids/sprites/shield/shield0000.png Binary files differnew file mode 100644 index 000000000..e3434e623 --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0000.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0001.png b/examples/demo/qasteroids/sprites/shield/shield0001.png Binary files differnew file mode 100644 index 000000000..038cf5dbd --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0001.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0002.png b/examples/demo/qasteroids/sprites/shield/shield0002.png Binary files differnew file mode 100644 index 000000000..1cf0da0ad --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0002.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0003.png b/examples/demo/qasteroids/sprites/shield/shield0003.png Binary files differnew file mode 100644 index 000000000..40c725655 --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0003.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0004.png b/examples/demo/qasteroids/sprites/shield/shield0004.png Binary files differnew file mode 100644 index 000000000..4ee43bae0 --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0004.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0005.png b/examples/demo/qasteroids/sprites/shield/shield0005.png Binary files differnew file mode 100644 index 000000000..0122e14ea --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0005.png diff --git a/examples/demo/qasteroids/sprites/shield/shield0006.png b/examples/demo/qasteroids/sprites/shield/shield0006.png Binary files differnew file mode 100644 index 000000000..dc5bea344 --- /dev/null +++ b/examples/demo/qasteroids/sprites/shield/shield0006.png diff --git a/examples/demo/qasteroids/sprites/ship/ship.ini b/examples/demo/qasteroids/sprites/ship/ship.ini new file mode 100644 index 000000000..479cc20ea --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship.ini @@ -0,0 +1,9 @@ +Cyclic_Animation=On +Width=42 +Height=42 +Final_frame=32 ;; NR_ROTS +Antialias=On +Output_Alpha=On +Output_to_File=On +Output_File_Type=n +Input_File_Name=ship.pov diff --git a/examples/demo/qasteroids/sprites/ship/ship.pov b/examples/demo/qasteroids/sprites/ship/ship.pov new file mode 100644 index 000000000..8f185cd7b --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship.pov @@ -0,0 +1,128 @@ + +#version 3.0 +global_settings { assumed_gamma 2.0 } + +#include "colors.inc" +#include "textures.inc" +#include "metals.inc" + +camera { + orthographic + up <0, 130, 0> + right <130, 0, 0> + location <0, 0, -130> + look_at <0, 0, 0> +} + +light_source { <50, 25, -25> colour White } +light_source { <0, 0, -100> colour Gray80 } + +#declare ShipColor = color red 1.0 green 1.0 blue 0.9 + +#declare BaseTexture = +texture { + pigment { ShipColor } +} + +#declare Grubby = +texture { + pigment { + bozo + color_map { + [0.0 color rgbt <1, 1, 1, 1>] + [0.8 color rgbt <0.9, 0.9, 0.9, 0.5>] + [1.0 color rgbt <0.8, 0.8, 0.8, 0.5>] + } + turbulence 2.0 + scale 3 + } +} + +#declare ShipTexture = +texture { BaseTexture } +texture { Grubby } + +union { + cone { + <12, 0, 0>, 0.5 + <11, 0, 0>, 1.0 + texture { ShipTexture } + } + cone { + <11, 0, 0>, 1.0 + <8, 0, 0>, 2.0 + texture { ShipTexture } + } + cone { + <8, 0, 0>, 2.0 + <3.5, 0, 0>, 3.8 + texture { ShipTexture } + } + difference { + cone { + <8, 0, -0.01>, 2.0 + <3.5, 0, -0.01>, 3.8 + pigment { color Gray20 } + } + box { + <9, -4.0, -3.7>, + <2, 4.0, 10> + rotate <0, -18, 0> + } + box { + <6.5, -4.0, -8>, + <10, 4.0, 8> + } + box { + <2, -4.0, -8>, + <4.5, 4.0, 8> + } + } + cone { + <3.5, 0, 0>, 3.8 + <2, 0, 0>, 4.0 + texture { ShipTexture } + } + cylinder { + <2, 0, 0>, + <-9, 0, 0>, + 4.0 + texture { ShipTexture } + } + cone { + <-9, 0, 0>, 4.0 + <-10, 0, 0>, 3.5 + texture { ShipTexture } + } + prism { + linear_sweep + linear_spline + 0, + 0.5, + 4, + <7.5, 0>, <-7.5, 10>, <-7.5, -10>, <7.5, 0> + rotate <90, 0, 0> + texture { T_Silver_2A } + texture { ShipTexture } + } + prism { + linear_sweep + linear_spline + -0.5, + 0.5, + 4, + <4, 0>, <-7.5, 5>, <-7.5, -5>, <4, 0> + pigment { color White } + } + cone { + <-12, 0, 0>, 3.0 + <-10, 0, 0>, 2.0 + texture { T_Silver_2A } + pigment { color Gray60 } + } + + rotate <0, 0,-360*clock> + scale <5, 5, 5> +} + + diff --git a/examples/demo/qasteroids/sprites/ship/ship0000.png b/examples/demo/qasteroids/sprites/ship/ship0000.png Binary files differnew file mode 100644 index 000000000..1d73a6e2c --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0000.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0001.png b/examples/demo/qasteroids/sprites/ship/ship0001.png Binary files differnew file mode 100644 index 000000000..d3f4b3f3b --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0001.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0002.png b/examples/demo/qasteroids/sprites/ship/ship0002.png Binary files differnew file mode 100644 index 000000000..c5f40fa20 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0002.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0003.png b/examples/demo/qasteroids/sprites/ship/ship0003.png Binary files differnew file mode 100644 index 000000000..a1c8c2590 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0003.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0004.png b/examples/demo/qasteroids/sprites/ship/ship0004.png Binary files differnew file mode 100644 index 000000000..8d3b6d9cc --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0004.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0005.png b/examples/demo/qasteroids/sprites/ship/ship0005.png Binary files differnew file mode 100644 index 000000000..15843ddef --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0005.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0006.png b/examples/demo/qasteroids/sprites/ship/ship0006.png Binary files differnew file mode 100644 index 000000000..380509ac7 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0006.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0007.png b/examples/demo/qasteroids/sprites/ship/ship0007.png Binary files differnew file mode 100644 index 000000000..633f5629f --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0007.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0008.png b/examples/demo/qasteroids/sprites/ship/ship0008.png Binary files differnew file mode 100644 index 000000000..e40ad04d6 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0008.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0009.png b/examples/demo/qasteroids/sprites/ship/ship0009.png Binary files differnew file mode 100644 index 000000000..19f3436e3 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0009.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0010.png b/examples/demo/qasteroids/sprites/ship/ship0010.png Binary files differnew file mode 100644 index 000000000..b1142f4eb --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0010.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0011.png b/examples/demo/qasteroids/sprites/ship/ship0011.png Binary files differnew file mode 100644 index 000000000..b8acd629b --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0011.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0012.png b/examples/demo/qasteroids/sprites/ship/ship0012.png Binary files differnew file mode 100644 index 000000000..06ac9eb5b --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0012.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0013.png b/examples/demo/qasteroids/sprites/ship/ship0013.png Binary files differnew file mode 100644 index 000000000..71cf38c0c --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0013.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0014.png b/examples/demo/qasteroids/sprites/ship/ship0014.png Binary files differnew file mode 100644 index 000000000..988a77f78 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0014.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0015.png b/examples/demo/qasteroids/sprites/ship/ship0015.png Binary files differnew file mode 100644 index 000000000..1ad219304 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0015.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0016.png b/examples/demo/qasteroids/sprites/ship/ship0016.png Binary files differnew file mode 100644 index 000000000..c4f712504 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0016.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0017.png b/examples/demo/qasteroids/sprites/ship/ship0017.png Binary files differnew file mode 100644 index 000000000..09e226e7c --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0017.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0018.png b/examples/demo/qasteroids/sprites/ship/ship0018.png Binary files differnew file mode 100644 index 000000000..56b6190bb --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0018.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0019.png b/examples/demo/qasteroids/sprites/ship/ship0019.png Binary files differnew file mode 100644 index 000000000..473340a63 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0019.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0020.png b/examples/demo/qasteroids/sprites/ship/ship0020.png Binary files differnew file mode 100644 index 000000000..dcfaa9879 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0020.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0021.png b/examples/demo/qasteroids/sprites/ship/ship0021.png Binary files differnew file mode 100644 index 000000000..f5718a2aa --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0021.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0022.png b/examples/demo/qasteroids/sprites/ship/ship0022.png Binary files differnew file mode 100644 index 000000000..d59ca3208 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0022.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0023.png b/examples/demo/qasteroids/sprites/ship/ship0023.png Binary files differnew file mode 100644 index 000000000..8f2492710 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0023.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0024.png b/examples/demo/qasteroids/sprites/ship/ship0024.png Binary files differnew file mode 100644 index 000000000..0cae4978f --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0024.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0025.png b/examples/demo/qasteroids/sprites/ship/ship0025.png Binary files differnew file mode 100644 index 000000000..bc7c5db22 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0025.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0026.png b/examples/demo/qasteroids/sprites/ship/ship0026.png Binary files differnew file mode 100644 index 000000000..386a9c7ce --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0026.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0027.png b/examples/demo/qasteroids/sprites/ship/ship0027.png Binary files differnew file mode 100644 index 000000000..ad9677988 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0027.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0028.png b/examples/demo/qasteroids/sprites/ship/ship0028.png Binary files differnew file mode 100644 index 000000000..117420f07 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0028.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0029.png b/examples/demo/qasteroids/sprites/ship/ship0029.png Binary files differnew file mode 100644 index 000000000..0677ce19f --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0029.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0030.png b/examples/demo/qasteroids/sprites/ship/ship0030.png Binary files differnew file mode 100644 index 000000000..576625cb5 --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0030.png diff --git a/examples/demo/qasteroids/sprites/ship/ship0031.png b/examples/demo/qasteroids/sprites/ship/ship0031.png Binary files differnew file mode 100644 index 000000000..ba876908c --- /dev/null +++ b/examples/demo/qasteroids/sprites/ship/ship0031.png diff --git a/examples/demo/qasteroids/toplevel.cpp b/examples/demo/qasteroids/toplevel.cpp new file mode 100644 index 000000000..fbec2ec28 --- /dev/null +++ b/examples/demo/qasteroids/toplevel.cpp @@ -0,0 +1,494 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ +// --- toplevel.cpp --- +#include <qaccel.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlcdnumber.h> +#include <qpushbutton.h> + +#include <qapplication.h> + +#include "toplevel.h" +#include "ledmeter.h" + + +#define SB_SCORE 1 +#define SB_LEVEL 2 +#define SB_SHIPS 3 + +struct SLevel +{ + int nrocks; + double rockSpeed; +}; + +#define MAX_LEVELS 16 + +SLevel levels[MAX_LEVELS] = +{ + { 1, 0.4 }, + { 1, 0.6 }, + { 2, 0.5 }, + { 2, 0.7 }, + { 2, 0.8 }, + { 3, 0.6 }, + { 3, 0.7 }, + { 3, 0.8 }, + { 4, 0.6 }, + { 4, 0.7 }, + { 4, 0.8 }, + { 5, 0.7 }, + { 5, 0.8 }, + { 5, 0.9 }, + { 5, 1.0 } +}; + +const char *soundEvents[] = +{ + "ShipDestroyed", + "RockDestroyed", + 0 +}; + +const char *soundDefaults[] = +{ + "Explosion.wav", + "ploop.wav", + 0 +}; + + +KAstTopLevel::KAstTopLevel( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name, 0 ) +{ + TQWidget *border = new TQWidget( this ); + border->setBackgroundColor( black ); + setCentralWidget( border ); + + TQVBoxLayout *borderLayout = new TQVBoxLayout( border ); + borderLayout->addStretch( 1 ); + + TQWidget *mainWin = new TQWidget( border ); + mainWin->setFixedSize(640, 480); + borderLayout->addWidget( mainWin, 0, AlignHCenter ); + + borderLayout->addStretch( 1 ); + + view = new KAsteroidsView( mainWin ); + view->setFocusPolicy( StrongFocus ); + connect( view, SIGNAL( shipKilled() ), SLOT( slotShipKilled() ) ); + connect( view, SIGNAL( rockHit(int) ), SLOT( slotRockHit(int) ) ); + connect( view, SIGNAL( rocksRemoved() ), SLOT( slotRocksRemoved() ) ); + connect( view, SIGNAL( updateVitals() ), SLOT( slotUpdateVitals() ) ); + + TQVBoxLayout *vb = new TQVBoxLayout( mainWin ); + TQHBoxLayout *hb = new TQHBoxLayout; + TQHBoxLayout *hbd = new TQHBoxLayout; + vb->addLayout( hb ); + + TQFont labelFont( "helvetica", 24 ); + TQColorGroup grp( darkGreen, black, TQColor( 128, 128, 128 ), + TQColor( 64, 64, 64 ), black, darkGreen, black ); + TQPalette pal( grp, grp, grp ); + + mainWin->setPalette( pal ); + + hb->addSpacing( 10 ); + + TQLabel *label; + label = new TQLabel( tr("Score"), mainWin ); + label->setFont( labelFont ); + label->setPalette( pal ); + label->setFixedWidth( label->sizeHint().width() ); + hb->addWidget( label ); + + scoreLCD = new TQLCDNumber( 6, mainWin ); + scoreLCD->setFrameStyle( TQFrame::NoFrame ); + scoreLCD->setSegmentStyle( TQLCDNumber::Flat ); + scoreLCD->setFixedWidth( 150 ); + scoreLCD->setPalette( pal ); + hb->addWidget( scoreLCD ); + hb->addStretch( 10 ); + + label = new TQLabel( tr("Level"), mainWin ); + label->setFont( labelFont ); + label->setPalette( pal ); + label->setFixedWidth( label->sizeHint().width() ); + hb->addWidget( label ); + + levelLCD = new TQLCDNumber( 2, mainWin ); + levelLCD->setFrameStyle( TQFrame::NoFrame ); + levelLCD->setSegmentStyle( TQLCDNumber::Flat ); + levelLCD->setFixedWidth( 70 ); + levelLCD->setPalette( pal ); + hb->addWidget( levelLCD ); + hb->addStretch( 10 ); + + label = new TQLabel( tr("Ships"), mainWin ); + label->setFont( labelFont ); + label->setFixedWidth( label->sizeHint().width() ); + label->setPalette( pal ); + hb->addWidget( label ); + + shipsLCD = new TQLCDNumber( 1, mainWin ); + shipsLCD->setFrameStyle( TQFrame::NoFrame ); + shipsLCD->setSegmentStyle( TQLCDNumber::Flat ); + shipsLCD->setFixedWidth( 40 ); + shipsLCD->setPalette( pal ); + hb->addWidget( shipsLCD ); + + hb->addStrut( 30 ); + + vb->addWidget( view, 10 ); + +// -- bottom layout: + vb->addLayout( hbd ); + + TQFont smallFont( "helvetica", 14 ); + hbd->addSpacing( 10 ); + + TQString sprites_prefix = "qasteroids/sprites/"; +/* + label = new TQLabel( tr( "T" ), mainWin ); + label->setFont( smallFont ); + label->setFixedWidth( label->sizeHint().width() ); + label->setPalette( pal ); + hbd->addWidget( label ); + + teleportsLCD = new TQLCDNumber( 1, mainWin ); + teleportsLCD->setFrameStyle( TQFrame::NoFrame ); + teleportsLCD->setSegmentStyle( TQLCDNumber::Flat ); + teleportsLCD->setPalette( pal ); + teleportsLCD->setFixedHeight( 20 ); + hbd->addWidget( teleportsLCD ); + + hbd->addSpacing( 10 ); +*/ + TQPixmap pm( sprites_prefix + "powerups/brake.png" ); + label = new TQLabel( mainWin ); + label->setPixmap( pm ); + label->setFixedWidth( label->sizeHint().width() ); + label->setPalette( pal ); + hbd->addWidget( label ); + + brakesLCD = new TQLCDNumber( 1, mainWin ); + brakesLCD->setFrameStyle( TQFrame::NoFrame ); + brakesLCD->setSegmentStyle( TQLCDNumber::Flat ); + brakesLCD->setPalette( pal ); + brakesLCD->setFixedHeight( 20 ); + hbd->addWidget( brakesLCD ); + + hbd->addSpacing( 10 ); + + pm.load( sprites_prefix + "powerups/shield.png" ); + label = new TQLabel( mainWin ); + label->setPixmap( pm ); + label->setFixedWidth( label->sizeHint().width() ); + label->setPalette( pal ); + hbd->addWidget( label ); + + shieldLCD = new TQLCDNumber( 1, mainWin ); + shieldLCD->setFrameStyle( TQFrame::NoFrame ); + shieldLCD->setSegmentStyle( TQLCDNumber::Flat ); + shieldLCD->setPalette( pal ); + shieldLCD->setFixedHeight( 20 ); + hbd->addWidget( shieldLCD ); + + hbd->addSpacing( 10 ); + + pm.load( sprites_prefix + "powerups/shoot.png" ); + label = new TQLabel( mainWin ); + label->setPixmap( pm ); + label->setFixedWidth( label->sizeHint().width() ); + label->setPalette( pal ); + hbd->addWidget( label ); + + shootLCD = new TQLCDNumber( 1, mainWin ); + shootLCD->setFrameStyle( TQFrame::NoFrame ); + shootLCD->setSegmentStyle( TQLCDNumber::Flat ); + shootLCD->setPalette( pal ); + shootLCD->setFixedHeight( 20 ); + hbd->addWidget( shootLCD ); + + hbd->addStretch( 1 ); + + label = new TQLabel( tr( "Fuel" ), mainWin ); + label->setFont( smallFont ); + label->setFixedWidth( label->sizeHint().width() + 10 ); + label->setPalette( pal ); + hbd->addWidget( label ); + + powerMeter = new KALedMeter( mainWin ); + powerMeter->setFrameStyle( TQFrame::Box | TQFrame::Plain ); + powerMeter->setRange( MAX_POWER_LEVEL ); + powerMeter->addColorRange( 10, darkRed ); + powerMeter->addColorRange( 20, TQColor(160, 96, 0) ); + powerMeter->addColorRange( 70, darkGreen ); + powerMeter->setCount( 40 ); + powerMeter->setPalette( pal ); + powerMeter->setFixedSize( 200, 12 ); + hbd->addWidget( powerMeter ); + + shipsRemain = 3; + showHiscores = FALSE; + + actions.insert( TQt::Key_Up, Thrust ); + actions.insert( TQt::Key_Left, RotateLeft ); + actions.insert( TQt::Key_Right, RotateRight ); + actions.insert( TQt::Key_Space, Shoot ); + actions.insert( TQt::Key_Z, Teleport ); + actions.insert( TQt::Key_X, Brake ); + actions.insert( TQt::Key_S, Shield ); + actions.insert( TQt::Key_P, Pause ); + actions.insert( TQt::Key_L, Launch ); + actions.insert( TQt::Key_N, NewGame ); + + view->showText( tr( "Press N to start playing" ), yellow ); +} + +KAstTopLevel::~KAstTopLevel() +{ +} + +void KAstTopLevel::playSound( const char * ) +{ +} + +void KAstTopLevel::keyPressEvent( TQKeyEvent *event ) +{ + if ( event->isAutoRepeat() || !actions.contains( event->key() ) ) + { + event->ignore(); + return; + } + + Action a = actions[ event->key() ]; + + switch ( a ) + { + case RotateLeft: + view->rotateLeft( TRUE ); + break; + + case RotateRight: + view->rotateRight( TRUE ); + break; + + case Thrust: + view->thrust( TRUE ); + break; + + case Shoot: + view->shoot( TRUE ); + break; + + case Shield: + view->setShield( TRUE ); + break; + + case Teleport: + view->teleport( TRUE ); + break; + + case Brake: + view->brake( TRUE ); + break; + + default: + event->ignore(); + return; + } + event->accept(); +} + +void KAstTopLevel::keyReleaseEvent( TQKeyEvent *event ) +{ + if ( event->isAutoRepeat() || !actions.contains( event->key() ) ) + { + event->ignore(); + return; + } + + Action a = actions[ event->key() ]; + + switch ( a ) + { + case RotateLeft: + view->rotateLeft( FALSE ); + break; + + case RotateRight: + view->rotateRight( FALSE ); + break; + + case Thrust: + view->thrust( FALSE ); + break; + + case Shoot: + view->shoot( FALSE ); + break; + + case Brake: + view->brake( FALSE ); + break; + + case Shield: + view->setShield( FALSE ); + break; + + case Teleport: + view->teleport( FALSE ); + break; + + case Launch: + if ( waitShip ) + { + view->newShip(); + waitShip = FALSE; + view->hideText(); + } + else + { + event->ignore(); + return; + } + break; + + case NewGame: + slotNewGame(); + break; +/* + case Pause: + { + view->pause( TRUE ); + TQMessageBox::information( this, + tr("KAsteroids is paused"), + tr("Paused") ); + view->pause( FALSE ); + } + break; +*/ + default: + event->ignore(); + return; + } + + event->accept(); +} + +void KAstTopLevel::showEvent( TQShowEvent *e ) +{ + TQMainWindow::showEvent( e ); + view->pause( FALSE ); + view->setFocus(); +} + +void KAstTopLevel::hideEvent( TQHideEvent *e ) +{ + TQMainWindow::hideEvent( e ); + view->pause( TRUE ); +} + +void KAstTopLevel::slotNewGame() +{ + score = 0; + shipsRemain = SB_SHIPS; + scoreLCD->display( 0 ); + level = 0; + levelLCD->display( level+1 ); + shipsLCD->display( shipsRemain-1 ); + view->newGame(); + view->setRockSpeed( levels[0].rockSpeed ); + view->addRocks( levels[0].nrocks ); +// view->showText( tr( "Press L to launch." ), yellow ); + view->newShip(); + waitShip = FALSE; + view->hideText(); + isPaused = FALSE; +} + +void KAstTopLevel::slotShipKilled() +{ + shipsRemain--; + shipsLCD->display( shipsRemain-1 ); + + playSound( "ShipDestroyed" ); + + if ( shipsRemain ) + { + waitShip = TRUE; + view->showText( tr( "Ship Destroyed. Press L to launch."), yellow ); + } + else + { + view->showText( tr("Game Over!"), red ); + view->endGame(); + doStats(); +// highscore->addEntry( score, level, showHiscores ); + } +} + +void KAstTopLevel::slotRockHit( int size ) +{ + switch ( size ) + { + case 0: + score += 10; + break; + + case 1: + score += 20; + break; + + default: + score += 40; + } + + playSound( "RockDestroyed" ); + + scoreLCD->display( score ); +} + +void KAstTopLevel::slotRocksRemoved() +{ + level++; + + if ( level >= MAX_LEVELS ) + level = MAX_LEVELS - 1; + + view->setRockSpeed( levels[level-1].rockSpeed ); + view->addRocks( levels[level-1].nrocks ); + + levelLCD->display( level+1 ); +} + +void KAstTopLevel::doStats() +{ + TQString r( "0.00" ); + if ( view->shots() ) + r = TQString::number( (double)view->hits() / view->shots() * 100.0, + 'g', 2 ); + +/* multi-line text broken in TQt 3 + TQString s = tr( "Game Over\n\nShots fired:\t%1\n Hit:\t%2\n Missed:\t%3\nHit ratio:\t%4 %\n\nPress N for a new game" ) + .arg(view->shots()).arg(view->hits()) + .arg(view->shots() - view->hits()) + .arg(r); +*/ + + view->showText( "Game Over. Press N for a new game.", yellow, FALSE ); +} + +void KAstTopLevel::slotUpdateVitals() +{ + brakesLCD->display( view->brakeCount() ); + shieldLCD->display( view->shieldCount() ); + shootLCD->display( view->shootCount() ); +// teleportsLCD->display( view->teleportCount() ); + powerMeter->setValue( view->power() ); +} diff --git a/examples/demo/qasteroids/toplevel.h b/examples/demo/qasteroids/toplevel.h new file mode 100644 index 000000000..158363b08 --- /dev/null +++ b/examples/demo/qasteroids/toplevel.h @@ -0,0 +1,79 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ + +#ifndef __KAST_TOPLEVEL_H__ +#define __KAST_TOPLEVEL_H__ + +#include <qmainwindow.h> +#include <qdict.h> +#include <qmap.h> + +#include "view.h" + + +class KALedMeter; +class TQLCDNumber; + +class KAstTopLevel : public TQMainWindow +{ + Q_OBJECT +public: + KAstTopLevel( TQWidget *parent=0, const char *name=0 ); + virtual ~KAstTopLevel(); + +private: + void playSound( const char *snd ); + void readSoundMapping(); + void doStats(); + +protected: + virtual void showEvent( TQShowEvent * ); + virtual void hideEvent( TQHideEvent * ); + virtual void keyPressEvent( TQKeyEvent *event ); + virtual void keyReleaseEvent( TQKeyEvent *event ); + +private slots: + void slotNewGame(); + + void slotShipKilled(); + void slotRockHit( int size ); + void slotRocksRemoved(); + + void slotUpdateVitals(); + +private: + KAsteroidsView *view; + TQLCDNumber *scoreLCD; + TQLCDNumber *levelLCD; + TQLCDNumber *shipsLCD; + + TQLCDNumber *teleportsLCD; +// TQLCDNumber *bombsLCD; + TQLCDNumber *brakesLCD; + TQLCDNumber *shieldLCD; + TQLCDNumber *shootLCD; + KALedMeter *powerMeter; + + bool sound; + TQDict<TQString> soundDict; + + // waiting for user to press Enter to launch a ship + bool waitShip; + bool isPaused; + + int shipsRemain; + int score; + int level; + bool showHiscores; + + enum Action { Launch, Thrust, RotateLeft, RotateRight, Shoot, Teleport, + Brake, Shield, Pause, NewGame }; + + TQMap<int,Action> actions; +}; + +#endif + diff --git a/examples/demo/qasteroids/view.cpp b/examples/demo/qasteroids/view.cpp new file mode 100644 index 000000000..99acca1ff --- /dev/null +++ b/examples/demo/qasteroids/view.cpp @@ -0,0 +1,908 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ + +#include <stdlib.h> +#include <math.h> +#include <qapplication.h> +#include <qkeycode.h> +#include <qaccel.h> +#include <qmessagebox.h> + +#include "view.h" + +#define IMG_BACKGROUND "qasteroids/bg.png" + +#define REFRESH_DELAY 33 +#define SHIP_SPEED 0.3 +#define MISSILE_SPEED 10.0 +#define SHIP_STEPS 64 +#define ROTATE_RATE 2 +#define SHIELD_ON_COST 1 +#define SHIELD_HIT_COST 30 +#define BRAKE_ON_COST 4 + +#define MAX_ROCK_SPEED 2.5 +#define MAX_POWERUP_SPEED 1.5 +#define MAX_SHIP_SPEED 12 +#define MAX_BRAKES 5 +#define MAX_SHIELDS 5 +#define MAX_FIREPOWER 5 + +#define TEXT_SPEED 4 + +#define PI_X_2 6.283185307 +#ifndef M_PI +#define M_PI 3.141592654 +#endif + +static struct +{ + int id; + const char *path; + int frames; +} +kas_animations [] = +{ + { ID_ROCK_LARGE, "rock1/rock1%1.png", 32 }, + { ID_ROCK_MEDIUM, "rock2/rock2%1.png", 32 }, + { ID_ROCK_SMALL, "rock3/rock3%1.png", 32 }, + { ID_SHIP, "ship/ship%1.png", 32 }, + { ID_MISSILE, "missile/missile.png", 1 }, + { ID_BIT, "bits/bits%1.png", 16 }, + { ID_EXHAUST, "exhaust/exhaust.png", 1 }, + { ID_ENERGY_POWERUP, "powerups/energy.png", 1 }, +// { ID_TELEPORT_POWERUP, "powerups/teleport%1.png", 12 }, + { ID_BRAKE_POWERUP, "powerups/brake.png", 1 }, + { ID_SHIELD_POWERUP, "powerups/shield.png", 1 }, + { ID_SHOOT_POWERUP, "powerups/shoot.png", 1 }, + { ID_SHIELD, "shield/shield%1.png", 6 }, + { 0, 0, 0 } +}; + + + +KAsteroidsView::KAsteroidsView( TQWidget *parent, const char *name ) + : TQWidget( parent, name ), + field(640, 440), + view(&field,this) +{ + view.setVScrollBarMode( TQScrollView::AlwaysOff ); + view.setHScrollBarMode( TQScrollView::AlwaysOff ); + view.viewport()->setFocusProxy( this ); + rocks.setAutoDelete( TRUE ); + missiles.setAutoDelete( TRUE ); + bits.setAutoDelete( TRUE ); + powerups.setAutoDelete( TRUE ); + exhaust.setAutoDelete( TRUE ); + + field.setBackgroundColor( black ); + TQPixmap pm( IMG_BACKGROUND ); + field.setBackgroundPixmap( pm ); + + textSprite = new TQCanvasText( &field ); + TQFont font( "helvetica", 18 ); + textSprite->setFont( font ); + + shield = 0; + shieldOn = FALSE; + refreshRate = REFRESH_DELAY; + + initialized = readSprites(); + + shieldTimer = new TQTimer( this ); + connect( shieldTimer, SIGNAL(timeout()), this, SLOT(hideShield()) ); + mTimerId = -1; + + shipPower = MAX_POWER_LEVEL; + vitalsChanged = TRUE; + can_destroy_powerups = FALSE; + + mPaused = TRUE; + + if ( !initialized ) { + textSprite->setText( tr("Error: Cannot read sprite images") ); + textSprite->setColor( red ); + textSprite->move( (field.width()-textSprite->boundingRect().width()) / 2, + (field.height()-textSprite->boundingRect().height()) / 2 ); + textSprite->show(); + } +} + +// - - - + +KAsteroidsView::~KAsteroidsView() +{ +} + +// - - - + +void KAsteroidsView::reset() +{ + if ( !initialized ) + return; + rocks.clear(); + missiles.clear(); + bits.clear(); + powerups.clear(); + exhaust.clear(); + + shotsFired = 0; + shotsHit = 0; + + rockSpeed = 1.0; + powerupSpeed = 1.0; + mFrameNum = 0; + mPaused = FALSE; + + ship->hide(); + shield->hide(); +/* + if ( mTimerId >= 0 ) { + killTimer( mTimerId ); + mTimerId = -1; + } +*/ +} + +// - -- + +void KAsteroidsView::newGame() +{ + if ( !initialized ) + return; + if ( shieldOn ) + { + shield->hide(); + shieldOn = FALSE; + } + reset(); + if ( mTimerId < 0 ) + mTimerId = startTimer( REFRESH_DELAY ); + emit updateVitals(); +} + +// - - - + +void KAsteroidsView::endGame() +{ +} + +void KAsteroidsView::pause( bool p ) +{ + if ( !initialized ) + return; + if ( !mPaused && p ) { + if ( mTimerId >= 0 ) { + killTimer( mTimerId ); + mTimerId = -1; + } + } else if ( mPaused && !p ) + mTimerId = startTimer( REFRESH_DELAY ); + mPaused = p; +} + +// - - - + +void KAsteroidsView::newShip() +{ + if ( !initialized ) + return; + ship->move( width()/2, height()/2, 0 ); + shield->move( width()/2, height()/2, 0 ); + ship->setVelocity( 0.0, 0.0 ); + shipDx = 0; + shipDy = 0; + shipAngle = 0; + rotateL = FALSE; + rotateR = FALSE; + thrustShip = FALSE; + shootShip = FALSE; + brakeShip = FALSE; + teleportShip = FALSE; + shieldOn = TRUE; + shootDelay = 0; + shipPower = MAX_POWER_LEVEL; + rotateRate = ROTATE_RATE; + rotateSlow = 0; + + mBrakeCount = 0; + mTeleportCount = 0; + mShootCount = 0; + + ship->show(); + shield->show(); + mShieldCount = 1; // just in case the ship appears on a rock. + shieldTimer->start( 1000, TRUE ); +} + +void KAsteroidsView::setShield( bool s ) +{ + if ( !initialized ) + return; + if ( shieldTimer->isActive() && !s ) { + shieldTimer->stop(); + hideShield(); + } else { + shieldOn = s && mShieldCount; + } +} + +void KAsteroidsView::brake( bool b ) +{ + if ( !initialized ) + return; + if ( mBrakeCount ) + { + if ( brakeShip && !b ) + { + rotateL = FALSE; + rotateR = FALSE; + thrustShip = FALSE; + rotateRate = ROTATE_RATE; + } + + brakeShip = b; + } +} + +// - - - + +bool KAsteroidsView::readSprites() +{ + TQString sprites_prefix = "qasteroids/sprites/"; + + int i = 0; + while ( kas_animations[i].id ) + { + TQCanvasPixmapArray *anim = + new TQCanvasPixmapArray( sprites_prefix + kas_animations[i].path, + kas_animations[i].frames ); + if ( !anim->isValid() ) + return FALSE; + animation.insert( kas_animations[i].id, anim ); + i++; + } + + ship = new TQCanvasSprite( animation[ID_SHIP], &field ); + ship->hide(); + + shield = new KShield( animation[ID_SHIELD], &field ); + shield->hide(); + + return (ship->image(0) && shield->image(0)); +} + +// - - - + +void KAsteroidsView::addRocks( int num ) +{ + if ( !initialized ) + return; + for ( int i = 0; i < num; i++ ) + { + KRock *rock = new KRock( animation[ID_ROCK_LARGE], &field, + ID_ROCK_LARGE, randInt(2), randInt(2) ? -1 : 1 ); + double dx = (2.0 - randDouble()*4.0) * rockSpeed; + double dy = (2.0 - randDouble()*4.0) * rockSpeed; + rock->setVelocity( dx, dy ); + rock->setFrame( randInt( rock->frameCount() ) ); + if ( dx > 0 ) + { + if ( dy > 0 ) + rock->move( 5, 5, 0 ); + else + rock->move( 5, field.height() - 25, 0 ); + } + else + { + if ( dy > 0 ) + rock->move( field.width() - 25, 5, 0 ); + else + rock->move( field.width() - 25, field.height() - 25, 0 ); + } + rock->show( ); + rocks.append( rock ); + } +} + +// - - - + +void KAsteroidsView::showText( const TQString &text, const TQColor &color, bool scroll ) +{ + if ( !initialized ) + return; + textSprite->setText( text ); + textSprite->setColor( color ); + + if ( scroll ) { + textSprite->move( (field.width()-textSprite->boundingRect().width()) / 2, + -textSprite->boundingRect().height() ); + textDy = TEXT_SPEED; + } else { + textSprite->move( (field.width()-textSprite->boundingRect().width()) / 2, + (field.height()-textSprite->boundingRect().height()) / 2 ); + textDy = 0; + } + textSprite->show(); +} + +// - - - + +void KAsteroidsView::hideText() +{ + textDy = -TEXT_SPEED; +} + +// - - - + +void KAsteroidsView::resizeEvent(TQResizeEvent* event) +{ + TQWidget::resizeEvent(event); + field.resize(width()-4, height()-4); + view.resize(width(),height()); +} + +// - - - + +void KAsteroidsView::timerEvent( TQTimerEvent * ) +{ + field.advance(); + + TQCanvasSprite *rock; + + // move rocks forward + for ( rock = rocks.first(); rock; rock = rocks.next() ) { + ((KRock *)rock)->nextFrame(); + wrapSprite( rock ); + } + + wrapSprite( ship ); + + // check for missile collision with rocks. + processMissiles(); + + // these are generated when a ship explodes + for ( KBit *bit = bits.first(); bit; bit = bits.next() ) + { + if ( bit->expired() ) + { + bits.removeRef( bit ); + } + else + { + bit->growOlder(); + bit->setFrame( ( bit->frame()+1 ) % bit->frameCount() ); + } + } + + for ( KExhaust *e = exhaust.first(); e; e = exhaust.next() ) + exhaust.removeRef( e ); + + // move / rotate ship. + // check for collision with a rock. + processShip(); + + // move powerups and check for collision with player and missiles + processPowerups(); + + if ( textSprite->isVisible() ) + { + if ( textDy < 0 && + textSprite->boundingRect().y() <= -textSprite->boundingRect().height() ) { + textSprite->hide(); + } else { + textSprite->moveBy( 0, textDy ); + } + if ( textSprite->boundingRect().y() > (field.height()-textSprite->boundingRect().height())/2 ) + textDy = 0; + } + + if ( vitalsChanged && !(mFrameNum % 10) ) { + emit updateVitals(); + vitalsChanged = FALSE; + } + + mFrameNum++; +} + +void KAsteroidsView::wrapSprite( TQCanvasItem *s ) +{ + int x = int(s->x() + s->boundingRect().width() / 2); + int y = int(s->y() + s->boundingRect().height() / 2); + + if ( x > field.width() ) + s->move( s->x() - field.width(), s->y() ); + else if ( x < 0 ) + s->move( field.width() + s->x(), s->y() ); + + if ( y > field.height() ) + s->move( s->x(), s->y() - field.height() ); + else if ( y < 0 ) + s->move( s->x(), field.height() + s->y() ); +} + +// - - - + +void KAsteroidsView::rockHit( TQCanvasItem *hit ) +{ + KPowerup *nPup = 0; + int rnd = int(randDouble()*30.0) % 30; + switch( rnd ) + { + case 4: + case 5: + nPup = new KPowerup( animation[ID_ENERGY_POWERUP], &field, + ID_ENERGY_POWERUP ); + break; + case 10: +// nPup = new KPowerup( animation[ID_TELEPORT_POWERUP], &field, +// ID_TELEPORT_POWERUP ); + break; + case 15: + nPup = new KPowerup( animation[ID_BRAKE_POWERUP], &field, + ID_BRAKE_POWERUP ); + break; + case 20: + nPup = new KPowerup( animation[ID_SHIELD_POWERUP], &field, + ID_SHIELD_POWERUP ); + break; + case 24: + case 25: + nPup = new KPowerup( animation[ID_SHOOT_POWERUP], &field, + ID_SHOOT_POWERUP ); + break; + } + if ( nPup ) + { + double r = 0.5 - randDouble(); + nPup->move( hit->x(), hit->y(), 0 ); + nPup->setVelocity( hit->xVelocity() + r, hit->yVelocity() + r ); + nPup->show( ); + powerups.append( nPup ); + } + + if ( hit->rtti() == ID_ROCK_LARGE || hit->rtti() == ID_ROCK_MEDIUM ) + { + // break into smaller rocks + double addx[4] = { 1.0, 1.0, -1.0, -1.0 }; + double addy[4] = { -1.0, 1.0, -1.0, 1.0 }; + + double dx = hit->xVelocity(); + double dy = hit->yVelocity(); + + double maxRockSpeed = MAX_ROCK_SPEED * rockSpeed; + if ( dx > maxRockSpeed ) + dx = maxRockSpeed; + else if ( dx < -maxRockSpeed ) + dx = -maxRockSpeed; + if ( dy > maxRockSpeed ) + dy = maxRockSpeed; + else if ( dy < -maxRockSpeed ) + dy = -maxRockSpeed; + + TQCanvasSprite *nrock; + + for ( int i = 0; i < 4; i++ ) + { + double r = rockSpeed/2 - randDouble()*rockSpeed; + if ( hit->rtti() == ID_ROCK_LARGE ) + { + nrock = new KRock( animation[ID_ROCK_MEDIUM], &field, + ID_ROCK_MEDIUM, randInt(2), randInt(2) ? -1 : 1 ); + emit rockHit( 0 ); + } + else + { + nrock = new KRock( animation[ID_ROCK_SMALL], &field, + ID_ROCK_SMALL, randInt(2), randInt(2) ? -1 : 1 ); + emit rockHit( 1 ); + } + + nrock->move( hit->x(), hit->y(), 0 ); + nrock->setVelocity( dx+addx[i]*rockSpeed+r, dy+addy[i]*rockSpeed+r ); + nrock->setFrame( randInt( nrock->frameCount() ) ); + nrock->show( ); + rocks.append( nrock ); + } + } + else if ( hit->rtti() == ID_ROCK_SMALL ) + emit rockHit( 2 ); + rocks.removeRef( (TQCanvasSprite *)hit ); + if ( rocks.count() == 0 ) + emit rocksRemoved(); +} + +void KAsteroidsView::reducePower( int val ) +{ + shipPower -= val; + if ( shipPower <= 0 ) + { + shipPower = 0; + thrustShip = FALSE; + if ( shieldOn ) + { + shieldOn = FALSE; + shield->hide(); + } + } + vitalsChanged = TRUE; +} + +void KAsteroidsView::addExhaust( double x, double y, double dx, + double dy, int count ) +{ + for ( int i = 0; i < count; i++ ) + { + KExhaust *e = new KExhaust( animation[ID_EXHAUST], &field ); + e->move( x + 2 - randDouble()*4, y + 2 - randDouble()*4 ); + e->setVelocity( dx, dy ); + e->show( ); + exhaust.append( e ); + } +} + +void KAsteroidsView::processMissiles() +{ + KMissile *missile; + + // if a missile has hit a rock, remove missile and break rock into smaller + // rocks or remove completely. + TQPtrListIterator<KMissile> it(missiles); + + for ( ; it.current(); ++it ) + { + missile = it.current(); + missile->growOlder(); + + if ( missile->expired() ) + { + missiles.removeRef( missile ); + continue; + } + + wrapSprite( missile ); + + TQCanvasItemList hits = missile->collisions( TRUE ); + TQCanvasItemList::Iterator hit; + for ( hit = hits.begin(); hit != hits.end(); ++hit ) + { + if ( (*hit)->rtti() >= ID_ROCK_LARGE && + (*hit)->rtti() <= ID_ROCK_SMALL ) + { + shotsHit++; + rockHit( *hit ); + missiles.removeRef( missile ); + break; + } + } + } +} + +// - - - + +void KAsteroidsView::processShip() +{ + if ( ship->isVisible() ) + { + if ( shieldOn ) + { + shield->show(); + reducePower( SHIELD_ON_COST ); + static int sf = 0; + sf++; + + if ( sf % 2 ) + shield->setFrame( (shield->frame()+1) % shield->frameCount() ); + shield->move( ship->x() - 9, ship->y() - 9 ); + + TQCanvasItemList hits = shield->collisions( TRUE ); + TQCanvasItemList::Iterator it; + for ( it = hits.begin(); it != hits.end(); ++it ) + { + if ( (*it)->rtti() >= ID_ROCK_LARGE && + (*it)->rtti() <= ID_ROCK_SMALL ) + { + int factor; + switch ( (*it)->rtti() ) + { + case ID_ROCK_LARGE: + factor = 3; + break; + + case ID_ROCK_MEDIUM: + factor = 2; + break; + + default: + factor = 1; + } + + if ( factor > mShieldCount ) + { + // shield not strong enough + shieldOn = FALSE; + break; + } + rockHit( *it ); + // the more shields we have the less costly + reducePower( factor * (SHIELD_HIT_COST - mShieldCount*2) ); + } + } + } + + if ( !shieldOn ) + { + shield->hide(); + TQCanvasItemList hits = ship->collisions( TRUE ); + TQCanvasItemList::Iterator it; + for ( it = hits.begin(); it != hits.end(); ++it ) + { + if ( (*it)->rtti() >= ID_ROCK_LARGE && + (*it)->rtti() <= ID_ROCK_SMALL ) + { + KBit *bit; + for ( int i = 0; i < 12; i++ ) + { + bit = new KBit( animation[ID_BIT], &field ); + bit->move( ship->x() + 5 - randDouble() * 10, + ship->y() + 5 - randDouble() * 10, + randInt(bit->frameCount()) ); + bit->setVelocity( 1-randDouble()*2, + 1-randDouble()*2 ); + bit->setDeath( 60 + randInt(60) ); + bit->show( ); + bits.append( bit ); + } + ship->hide(); + shield->hide(); + emit shipKilled(); + break; + } + } + } + + + if ( rotateSlow ) + rotateSlow--; + + if ( rotateL ) + { + shipAngle -= rotateSlow ? 1 : rotateRate; + if ( shipAngle < 0 ) + shipAngle += SHIP_STEPS; + } + + if ( rotateR ) + { + shipAngle += rotateSlow ? 1 : rotateRate; + if ( shipAngle >= SHIP_STEPS ) + shipAngle -= SHIP_STEPS; + } + + double angle = shipAngle * PI_X_2 / SHIP_STEPS; + double cosangle = cos( angle ); + double sinangle = sin( angle ); + + if ( brakeShip ) + { + thrustShip = FALSE; + rotateL = FALSE; + rotateR = FALSE; + rotateRate = ROTATE_RATE; + if ( fabs(shipDx) < 2.5 && fabs(shipDy) < 2.5 ) + { + shipDx = 0.0; + shipDy = 0.0; + ship->setVelocity( shipDx, shipDy ); + brakeShip = FALSE; + } + else + { + double motionAngle = atan2( -shipDy, -shipDx ); + if ( angle > M_PI ) + angle -= PI_X_2; + double angleDiff = angle - motionAngle; + if ( angleDiff > M_PI ) + angleDiff = PI_X_2 - angleDiff; + else if ( angleDiff < -M_PI ) + angleDiff = PI_X_2 + angleDiff; + double fdiff = fabs( angleDiff ); + if ( fdiff > 0.08 ) + { + if ( angleDiff > 0 ) + rotateL = TRUE; + else if ( angleDiff < 0 ) + rotateR = TRUE; + if ( fdiff > 0.6 ) + rotateRate = mBrakeCount + 1; + else if ( fdiff > 0.4 ) + rotateRate = 2; + else + rotateRate = 1; + + if ( rotateRate > 5 ) + rotateRate = 5; + } + else if ( fabs(shipDx) > 1 || fabs(shipDy) > 1 ) + { + thrustShip = TRUE; + // we'll make braking a bit faster + shipDx += cosangle/6 * (mBrakeCount - 1); + shipDy += sinangle/6 * (mBrakeCount - 1); + reducePower( BRAKE_ON_COST ); + addExhaust( ship->x() + 20 - cosangle*22, + ship->y() + 20 - sinangle*22, + shipDx-cosangle, shipDy-sinangle, + mBrakeCount+1 ); + } + } + } + + if ( thrustShip ) + { + // The ship has a terminal velocity, but trying to go faster + // still uses fuel (can go faster diagonally - don't care). + double thrustx = cosangle/4; + double thrusty = sinangle/4; + if ( fabs(shipDx + thrustx) < MAX_SHIP_SPEED ) + shipDx += thrustx; + if ( fabs(shipDy + thrusty) < MAX_SHIP_SPEED ) + shipDy += thrusty; + ship->setVelocity( shipDx, shipDy ); + reducePower( 1 ); + addExhaust( ship->x() + 20 - cosangle*20, + ship->y() + 20 - sinangle*20, + shipDx-cosangle, shipDy-sinangle, 3 ); + } + + ship->setFrame( shipAngle >> 1 ); + + if ( shootShip ) + { + if ( !shootDelay && (int)missiles.count() < mShootCount + 2 ) + { + KMissile *missile = new KMissile( animation[ID_MISSILE], &field ); + missile->move( 21+ship->x()+cosangle*21, + 21+ship->y()+sinangle*21, 0 ); + missile->setVelocity( shipDx + cosangle*MISSILE_SPEED, + shipDy + sinangle*MISSILE_SPEED ); + missile->show( ); + missiles.append( missile ); + shotsFired++; + reducePower( 1 ); + + shootDelay = 5; + } + + if ( shootDelay ) + shootDelay--; + } + + if ( teleportShip ) + { + int ra = rand() % 10; + if( ra == 0 ) + ra += rand() % 20; + int xra = ra * 60 + ( (rand() % 20) * (rand() % 20) ); + int yra = ra * 50 - ( (rand() % 20) * (rand() % 20) ); + ship->move( xra, yra ); + } + + vitalsChanged = TRUE; + } +} + +// - - - + +void KAsteroidsView::processPowerups() +{ + if ( !powerups.isEmpty() ) + { + // if player gets the powerup remove it from the screen, if option + // "Can destroy powerups" is enabled and a missile hits the powerup + // destroy it + + KPowerup *pup; + TQPtrListIterator<KPowerup> it( powerups ); + + for( ; it.current(); ++it ) + { + pup = it.current(); + pup->growOlder(); + + if( pup->expired() ) + { + powerups.removeRef( pup ); + continue; + } + + wrapSprite( pup ); + + TQCanvasItemList hits = pup->collisions( TRUE ); + TQCanvasItemList::Iterator it; + for ( it = hits.begin(); it != hits.end(); ++it ) + { + if ( (*it) == ship ) + { + switch( pup->rtti() ) + { + case ID_ENERGY_POWERUP: + shipPower += 150; + if ( shipPower > MAX_POWER_LEVEL ) + shipPower = MAX_POWER_LEVEL; + break; + case ID_TELEPORT_POWERUP: + mTeleportCount++; + break; + case ID_BRAKE_POWERUP: + if ( mBrakeCount < MAX_BRAKES ) + mBrakeCount++; + break; + case ID_SHIELD_POWERUP: + if ( mShieldCount < MAX_SHIELDS ) + mShieldCount++; + break; + case ID_SHOOT_POWERUP: + if ( mShootCount < MAX_FIREPOWER ) + mShootCount++; + break; + } + + powerups.removeRef( pup ); + vitalsChanged = TRUE; + } + else if ( (*it) == shield ) + { + powerups.removeRef( pup ); + } + else if ( (*it)->rtti() == ID_MISSILE ) + { + if ( can_destroy_powerups ) + { + powerups.removeRef( pup ); + } + } + } + } + } // -- if( powerups.isEmpty() ) +} + +// - - - + +void KAsteroidsView::hideShield() +{ + shield->hide(); + mShieldCount = 0; + shieldOn = FALSE; +} + +double KAsteroidsView::randDouble() +{ + int v = rand(); + return (double)v / (double)RAND_MAX; +} + +int KAsteroidsView::randInt( int range ) +{ + return rand() % range; +} + +void KAsteroidsView::showEvent( TQShowEvent *e ) +{ +#if defined( QT_LICENSE_PROFESSIONAL ) + static bool wasThere = FALSE; + + if ( !wasThere ) { + wasThere = TRUE; + TQMessageBox::information( this, tr("TQCanvas demo"), + tr("This game has been implemented using the TQCanvas class.\n" + "The TQCanvas class is not part of the Professional Edition. Please \n" + "contact Trolltech if you want to upgrade to the Enterprise Edition.") ); + } +#endif + + TQWidget::showEvent( e ); +} diff --git a/examples/demo/qasteroids/view.h b/examples/demo/qasteroids/view.h new file mode 100644 index 000000000..2f2c53b28 --- /dev/null +++ b/examples/demo/qasteroids/view.h @@ -0,0 +1,138 @@ +/* + * KAsteroids - Copyright (c) Martin R. Jones 1997 + * + * Part of the KDE project + */ + +#ifndef __AST_VIEW_H__ +#define __AST_VIEW_H__ + +#include <qwidget.h> +#include <qptrlist.h> +#include <qintdict.h> +#include <qtimer.h> +#include <qcanvas.h> +#include "sprites.h" + +#define MAX_POWER_LEVEL 1000 + +class KAsteroidsView : public TQWidget +{ + Q_OBJECT +public: + KAsteroidsView( TQWidget *parent = 0, const char *name = 0 ); + virtual ~KAsteroidsView(); + + int refreshRate; + + void reset(); + void setRockSpeed( double rs ) { rockSpeed = rs; } + void addRocks( int num ); + void newGame(); + void endGame(); + void newShip(); + + void rotateLeft( bool r ) { rotateL = r; rotateSlow = 5; } + void rotateRight( bool r ) { rotateR = r; rotateSlow = 5; } + void thrust( bool t ) { thrustShip = t && shipPower > 0; } + void shoot( bool s ) { shootShip = s; shootDelay = 0; } + void setShield( bool s ); + void teleport( bool te) { teleportShip = te && mTeleportCount; } + void brake( bool b ); + void pause( bool p); + + void showText( const TQString &text, const TQColor &color, bool scroll=TRUE ); + void hideText(); + + int shots() const { return shotsFired; } + int hits() const { return shotsHit; } + int power() const { return shipPower; } + + int teleportCount() const { return mTeleportCount; } + int brakeCount() const { return mBrakeCount; } + int shieldCount() const { return mShieldCount; } + int shootCount() const { return mShootCount; } + +signals: + void shipKilled(); + void rockHit( int size ); + void rocksRemoved(); + void updateVitals(); + +private slots: + void hideShield(); + +protected: + bool readSprites(); + void wrapSprite( TQCanvasItem * ); + void rockHit( TQCanvasItem * ); + void reducePower( int val ); + void addExhaust( double x, double y, double dx, double dy, int count ); + void processMissiles(); + void processShip(); + void processPowerups(); + void processShield(); + double randDouble(); + int randInt( int range ); + + virtual void resizeEvent( TQResizeEvent *event ); + virtual void timerEvent( TQTimerEvent * ); + + void showEvent( TQShowEvent * ); + +private: + TQCanvas field; + TQCanvasView view; + TQIntDict<TQCanvasPixmapArray> animation; + TQPtrList<TQCanvasSprite> rocks; + TQPtrList<KMissile> missiles; + TQPtrList<KBit> bits; + TQPtrList<KExhaust> exhaust; + TQPtrList<KPowerup> powerups; + KShield *shield; + TQCanvasSprite *ship; + TQCanvasText *textSprite; + + bool rotateL; + bool rotateR; + bool thrustShip; + bool shootShip; + bool teleportShip; + bool brakeShip; + bool pauseShip; + bool shieldOn; + + bool vitalsChanged; + + int shipAngle; + int rotateSlow; + int rotateRate; + int shipPower; + + int shotsFired; + int shotsHit; + int shootDelay; + + int mBrakeCount; + int mShieldCount; + int mTeleportCount; + int mShootCount; + + double shipDx; + double shipDy; + + int textDy; + int mFrameNum; + bool mPaused; + int mTimerId; + + double rockSpeed; + double powerupSpeed; + + bool can_destroy_powerups; + + TQTimer *shieldTimer; + bool initialized; +}; + +#endif diff --git a/examples/demo/qthumbwheel.cpp b/examples/demo/qthumbwheel.cpp new file mode 100644 index 000000000..5d4127480 --- /dev/null +++ b/examples/demo/qthumbwheel.cpp @@ -0,0 +1,301 @@ +/**************************************************************************** +** +** Definition of TQThumbWheel class +** +** Created : 010205 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the widgets module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "qthumbwheel.h" + +#ifndef QT_NO_THUMBWHEEL +#include <qpainter.h> +#include <qdrawutil.h> +#include <qpixmap.h> +#include <math.h> + +static const double m_pi = 3.14159265358979323846; +static const double rad_factor = 180.0 / m_pi; + +TQThumbWheel::TQThumbWheel( TQWidget *parent, const char *name ) + : TQFrame( parent, name ) +{ + orient = Vertical; + init(); +} + +/*! + Destructs the wheel. +*/ + +TQThumbWheel::~TQThumbWheel() +{ +} + +/*! + \internal + */ + +void TQThumbWheel::init() +{ + track = TRUE; + mousePressed = FALSE; + pressedAt = -1; + rat = 1.0; + setFrameStyle( WinPanel | Sunken ); + setMargin( 2 ); + setFocusPolicy( WheelFocus ); +} + +void TQThumbWheel::setOrientation( Orientation orientation ) +{ + orient = orientation; + update(); +} + +void TQThumbWheel::setTracking( bool enable ) +{ + track = enable; +} + +void TQThumbWheel::setTransmissionRatio( double r ) +{ + rat = r; +} + +/*! + Makes TQRangeControl::setValue() available as a slot. +*/ + +void TQThumbWheel::setValue( int value ) +{ + TQRangeControl::setValue( value ); +} + +void TQThumbWheel::valueChange() +{ + repaint( FALSE ); + emit valueChanged(value()); +} + +void TQThumbWheel::rangeChange() +{ +} + +void TQThumbWheel::stepChange() +{ +} + +/*! + \reimp +*/ + +void TQThumbWheel::keyPressEvent( TQKeyEvent *e ) +{ + switch ( e->key() ) { + case Key_Left: + if ( orient == Horizontal ) + subtractLine(); + break; + case Key_Right: + if ( orient == Horizontal ) + addLine(); + break; + case Key_Up: + if ( orient == Vertical ) + subtractLine(); + break; + case Key_Down: + if ( orient == Vertical ) + addLine(); + break; + case Key_PageUp: + subtractPage(); + break; + case Key_PageDown: + addPage(); + break; + case Key_Home: + setValue( minValue() ); + break; + case Key_End: + setValue( maxValue() ); + break; + default: + e->ignore(); + return; + }; +} + +/*! + \reimp +*/ + +void TQThumbWheel::mousePressEvent( TQMouseEvent *e ) +{ + if ( e->button() == LeftButton ) { + mousePressed = TRUE; + pressedAt = valueFromPosition( e->pos() ); + } +} + +/*! + \reimp +*/ + +void TQThumbWheel::mouseReleaseEvent( TQMouseEvent *e ) +{ + int movedTo = valueFromPosition( e->pos() ); + setValue( value() + movedTo - pressedAt ); + pressedAt = movedTo; +} + +/*! + \reimp +*/ + +void TQThumbWheel::mouseMoveEvent( TQMouseEvent *e ) +{ + if ( !mousePressed ) + return; + if ( track ) { + int movedTo = valueFromPosition( e->pos() ); + setValue( value() + movedTo - pressedAt ); + pressedAt = movedTo; + } +} + +/*! + \reimp +*/ + +void TQThumbWheel::wheelEvent( TQWheelEvent *e ) +{ + int step = ( e->state() & ControlButton ) ? lineStep() : pageStep(); + setValue( value() - e->delta()*step/120 ); + e->accept(); +} + +/*!\reimp +*/ + +void TQThumbWheel::focusInEvent( TQFocusEvent *e ) +{ + TQWidget::focusInEvent( e ); +} + +/*!\reimp +*/ + +void TQThumbWheel::focusOutEvent( TQFocusEvent *e ) +{ + TQWidget::focusOutEvent( e ); +} + +void TQThumbWheel::drawContents( TQPainter *p ) +{ + TQRect cr = contentsRect(); + // double buffer + TQPixmap pix( width(), height() ); + TQPainter pt( &pix ); + TQBrush brush = backgroundPixmap() ? + TQBrush( backgroundColor(), *backgroundPixmap() ) : TQBrush( backgroundColor() ); + pt.fillRect( cr, brush ); + + const int n = 17; + const double delta = m_pi / double(n); + // ### use positionFromValue() with rad*16 or similar + double alpha = 2*m_pi*double(value()-minValue())/ + double(maxValue()-minValue())*transmissionRatio(); + alpha = fmod(alpha, delta); + TQPen pen0( colorGroup().midlight() ); + TQPen pen1( colorGroup().dark() ); + + if ( orient == Horizontal ) { + double r = 0.5*cr.width(); + int y0 = cr.y()+1; + int y1 = cr.bottom()-1; + for ( int i = 0; i < n; i++ ) { + int x = cr.x() + int((1-cos(delta*double(i)+alpha))*r); + pt.setPen( pen0 ); + pt.drawLine( x, y0, x, y1 ); + pt.setPen( pen1 ); + pt.drawLine( x+1, y0, x+1, y1 ); + } + } else { + // vertical orientation + double r = 0.5*cr.height(); + int x0 = cr.x()+1; + int x1 = cr.right()-1; + for ( int i = 0; i < n; i++ ) { + int y = cr.y() + int((1-cos(delta*double(i)+alpha))*r); + pt.setPen( pen0 ); + pt.drawLine( x0, y, x1, y ); + pt.setPen( pen1 ); + pt.drawLine( x0, y+1, x1, y+1 ); + } + } + qDrawShadePanel( &pt, cr, colorGroup()); + + pt.end(); + p->drawPixmap( 0, 0, pix ); +} + +int TQThumbWheel::valueFromPosition( const TQPoint &p ) +{ + TQRect wrec = contentsRect(); + int pos, min, max; + if ( orient == Horizontal ) { + pos = p.x(); + min = wrec.left(); + max = wrec.right(); + } else { + pos = p.y(); + min = wrec.top(); + max = wrec.bottom(); + } + double alpha; + if ( pos < min ) + alpha = 0; + else if ( pos > max ) + alpha = m_pi; + else + alpha = acos( 1.0 - 2.0*double(pos-min)/double(max-min) );// ### taylor + double deg = alpha*rad_factor/transmissionRatio(); + // ### use valueFromPosition() + return minValue() + int((maxValue()-minValue())*deg/360.0); +} + +#endif diff --git a/examples/demo/qthumbwheel.h b/examples/demo/qthumbwheel.h new file mode 100644 index 000000000..9986194f4 --- /dev/null +++ b/examples/demo/qthumbwheel.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Definition of TQThumbWheel class +** +** Created : 010205 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the widgets module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#ifndef TQTHUMBWHEEL_H +#define TQTHUMBWHEEL_H + +#ifndef QT_H +#include "qframe.h" +#include "qrangecontrol.h" +#endif // QT_H + +#ifndef QT_NO_THUMBWHEEL + +class TQThumbWheel : public TQFrame, public TQRangeControl +{ + Q_OBJECT + +public: + TQThumbWheel( TQWidget *parent=0, const char *name=0 ); + ~TQThumbWheel(); + + virtual void setOrientation( Orientation ); + Orientation orientation() const; + virtual void setTracking( bool enable ); + bool tracking() const; + virtual void setTransmissionRatio( double r ); + double transmissionRatio() const; + +public slots: + virtual void setValue( int ); + +signals: + void valueChanged( int value ); + +protected: + void valueChange(); + void rangeChange(); + void stepChange(); + + void keyPressEvent( TQKeyEvent * ); + void mousePressEvent( TQMouseEvent * ); + void mouseReleaseEvent( TQMouseEvent * ); + void mouseMoveEvent( TQMouseEvent * ); + void wheelEvent( TQWheelEvent * ); + void focusInEvent( TQFocusEvent *e ); + void focusOutEvent( TQFocusEvent *e ); + + void drawContents( TQPainter * ); + +private: + void init(); + int valueFromPosition( const TQPoint & ); + + + double rat; + int pressedAt; + Orientation orient; + uint track : 1; + uint mousePressed : 1; + + class TQThumbWheelPrivate; + TQThumbWheelPrivate *d; +}; + +inline TQThumbWheel::Orientation TQThumbWheel::orientation() const +{ + return orient; +} + +inline bool TQThumbWheel::tracking() const +{ + return (bool)track; +} + +inline double TQThumbWheel::transmissionRatio() const +{ + return rat; +} + +#endif // QT_NO_WHEEL + +#endif // TQWHEEL_H diff --git a/examples/demo/sql/book.sql b/examples/demo/sql/book.sql new file mode 100644 index 000000000..417ef4347 --- /dev/null +++ b/examples/demo/sql/book.sql @@ -0,0 +1,42 @@ +-- The following SQL generates the database +-- used by the 'book' example programs +-- 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. + +DROP TABLE author; +DROP TABLE book; +DROP TABLE sequence; + +CREATE TABLE author +( id integer primary key, +forename varchar(40), +surname varchar(40) ); + +CREATE TABLE book +( id integer primary key, +title varchar(40), +price numeric(10,2), +authorid integer, +notes varchar(255) ); + +create index book_authorid_idx on book( authorid ); + +CREATE TABLE sequence +( tablename varchar(10), +sequence numeric); + +INSERT INTO author VALUES ( 0, 'Philip K', 'Dick' ); +INSERT INTO author VALUES ( 1, 'Robert', 'Heinlein' ); +INSERT INTO author VALUES ( 2, 'Sarah', 'Paretsky' ); + +INSERT INTO book VALUES ( 0, 'The Man Who Japed', 6.99, 0, 'A good book' ); +INSERT INTO book VALUES ( 1, 'The Man in the High Castle', 9.99, 0, 'Worth reading' ); +INSERT INTO book VALUES ( 2, 'The Number of the Beast', 8.99, 1, 'Get this!' ); +INSERT INTO book VALUES ( 3, 'Indemnity Only', 9.99, 2, 'Cool' ); +INSERT INTO book VALUES ( 4, 'Burn Marks', 9.99, 2, 'Need to make notes' ); +INSERT INTO book VALUES ( 5, 'Deadlock', 9.99, 2, 'Hmmm..' ); + +INSERT INTO sequence VALUES ( 'author', 2 ); +INSERT INTO sequence VALUES ( 'book', 5 ); diff --git a/examples/demo/sql/connect.ui b/examples/demo/sql/connect.ui new file mode 100644 index 000000000..ee875f318 --- /dev/null +++ b/examples/demo/sql/connect.ui @@ -0,0 +1,244 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ConnectDialog</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>ConnectDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>303</width> + <height>247</height> + </rect> + </property> + <property name="caption"> + <string>Connect...</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>GroupBox3</cstring> + </property> + <property name="title"> + <string>Connection settings</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLineEdit" row="1" column="1"> + <property name="name"> + <cstring>editDatabase</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="text"> + <string>Database Name:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboDatabase</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="3" column="1"> + <property name="name"> + <cstring>editPassword</cstring> + </property> + <property name="echoMode"> + <enum>Password</enum> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel4</cstring> + </property> + <property name="text"> + <string>&Username:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editUsername</cstring> + </property> + </widget> + <widget class="TQLabel" row="3" column="0"> + <property name="name"> + <cstring>TextLabel4_2</cstring> + </property> + <property name="text"> + <string>&Password:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editPassword</cstring> + </property> + </widget> + <widget class="TQComboBox" row="0" column="1"> + <property name="name"> + <cstring>comboDriver</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="2" column="1"> + <property name="name"> + <cstring>editUsername</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="4" column="1"> + <property name="name"> + <cstring>editHostname</cstring> + </property> + </widget> + <widget class="TQLabel" row="4" column="0"> + <property name="name"> + <cstring>TextLabel5</cstring> + </property> + <property name="text"> + <string>&Hostname:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editHostname</cstring> + </property> + </widget> + <widget class="TQLabel" row="5" column="0"> + <property name="name"> + <cstring>TextLabel5_2</cstring> + </property> + <property name="text"> + <string>P&ort:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>portSpinBox</cstring> + </property> + </widget> + <widget class="TQSpinBox" row="5" column="1"> + <property name="name"> + <cstring>portSpinBox</cstring> + </property> + <property name="specialValueText"> + <string>Default</string> + </property> + <property name="maxValue"> + <number>65535</number> + </property> + <property name="minValue"> + <number>-1</number> + </property> + <property name="value"> + <number>-1</number> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>D&river</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboDriver</cstring> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout25</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>ConnectDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>ConnectDialog</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>comboDriver</tabstop> + <tabstop>editDatabase</tabstop> + <tabstop>editUsername</tabstop> + <tabstop>editPassword</tabstop> + <tabstop>editHostname</tabstop> + <tabstop>portSpinBox</tabstop> + <tabstop>PushButton1</tabstop> + <tabstop>PushButton2</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">connect.ui.h</include> +</includes> +<slots> + <slot>init()</slot> + <slot>destroy()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/sql/connect.ui.h b/examples/demo/sql/connect.ui.h new file mode 100644 index 000000000..cc1bce9bf --- /dev/null +++ b/examples/demo/sql/connect.ui.h @@ -0,0 +1,20 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename slots use TQt Designer which will +** update this file, preserving your code. Create an init() slot in place of +** a constructor, and a destroy() slot in place of a destructor. +*****************************************************************************/ + +#include <qsqldatabase.h> + +void ConnectDialog::init() +{ + comboDriver->clear(); + comboDriver->insertStringList( TQSqlDatabase::drivers() ); +} + +void ConnectDialog::destroy() +{ + +} diff --git a/examples/demo/sql/sqlex.ui b/examples/demo/sql/sqlex.ui new file mode 100644 index 000000000..a7e972f8f --- /dev/null +++ b/examples/demo/sql/sqlex.ui @@ -0,0 +1,309 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>SqlEx</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>SqlEx</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>654</width> + <height>438</height> + </rect> + </property> + <property name="caption"> + <string>Form1</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQSplitter"> + <property name="name"> + <cstring>vsplit</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <widget class="TQSplitter"> + <property name="name"> + <cstring>hsplit</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <widget class="TQListView"> + <column> + <property name="text"> + <string>Tables</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Type</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Retquired</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>lv</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>LastColumn</enum> + </property> + </widget> + <widget class="TQDataTable"> + <property name="name"> + <cstring>dt</cstring> + </property> + <property name="frameworkCode" stdset="0"> + <bool>false</bool> + </property> + </widget> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>gb</cstring> + </property> + <property name="title"> + <string>SQL Query</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>Layout22</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTextEdit"> + <property name="name"> + <cstring>te</cstring> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>submitBtn</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>80</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>&Submit</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>clearBtn</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>80</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>C&lear</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout23</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>lbl</cstring> + </property> + <property name="text"> + <string>Press "Connect" to open a database</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>conBtn</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>80</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>&Connect...</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>clearBtn</sender> + <signal>clicked()</signal> + <receiver>te</receiver> + <slot>clear()</slot> + </connection> + <connection> + <sender>conBtn</sender> + <signal>clicked()</signal> + <receiver>SqlEx</receiver> + <slot>dbConnect()</slot> + </connection> + <connection> + <sender>lv</sender> + <signal>returnPressed(TQListViewItem*)</signal> + <receiver>SqlEx</receiver> + <slot>showTable(TQListViewItem*)</slot> + </connection> + <connection> + <sender>lv</sender> + <signal>doubleClicked(TQListViewItem*)</signal> + <receiver>SqlEx</receiver> + <slot>showTable(TQListViewItem*)</slot> + </connection> + <connection> + <sender>submitBtn</sender> + <signal>clicked()</signal> + <receiver>SqlEx</receiver> + <slot>execQuery()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">sqlex.ui.h</include> +</includes> +<slots> + <slot>init()</slot> + <slot>dbConnect()</slot> + <slot>execQuery()</slot> + <slot>showTable( TQListViewItem * item )</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/sql/sqlex.ui.h b/examples/demo/sql/sqlex.ui.h new file mode 100644 index 000000000..b8e88ca91 --- /dev/null +++ b/examples/demo/sql/sqlex.ui.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename slots use TQt Designer which will +** update this file, preserving your code. Create an init() slot in place of +** a constructor, and a destroy() slot in place of a destructor. +*****************************************************************************/ +#include <qsqldriver.h> +#include <qmessagebox.h> +#include <qsqldatabase.h> +#include <qlineedit.h> +#include <qcombobox.h> +#include <qspinbox.h> +#include <qsqlerror.h> +#include <qsqlcursor.h> +#include <qsqlselectcursor.h> +#include <qdatatable.h> +#include "connect.h" + +static void showError( const TQSqlError& err, TQWidget* parent = 0 ) +{ + TQString errStr ( "The database reported an error\n" ); + if ( !err.databaseText().isEmpty() ) + errStr += err.databaseText(); + if ( !err.driverText().isEmpty() ) + errStr += err.driverText(); + TQMessageBox::warning( parent, "Error", errStr ); +} + +ConnectDialog* conDiag = 0; + +void SqlEx::init() +{ + hsplit->setResizeMode( lv, TQSplitter::KeepSize ); + vsplit->setResizeMode( gb, TQSplitter::KeepSize ); + submitBtn->setEnabled( FALSE ); + conDiag = new ConnectDialog( this, "Connection Dialog", TRUE ); +} + +void SqlEx::dbConnect() +{ + if ( conDiag->exec() != TQDialog::Accepted ) + return; + if ( dt->sqlCursor() ) { + dt->setSqlCursor( 0 ); + } + // close old connection (if any) + if ( TQSqlDatabase::contains( "SqlEx" ) ) { + TQSqlDatabase* oldDb = TQSqlDatabase::database( "SqlEx" ); + oldDb->close(); + TQSqlDatabase::removeDatabase( "SqlEx" ); + } + // open the new connection + TQSqlDatabase* db = TQSqlDatabase::addDatabase( conDiag->comboDriver->currentText(), "SqlEx" ); + if ( !db ) { + TQMessageBox::warning( this, "Error", "Could not open database" ); + return; + } + db->setHostName( conDiag->editHostname->text() ); + db->setDatabaseName( conDiag->editDatabase->text() ); + db->setPort( conDiag->portSpinBox->value() ); + if ( !db->open( conDiag->editUsername->text(), conDiag->editPassword->text() ) ) { + showError( db->lastError(), this ); + return; + } + lbl->setText( "Double-Click on a table-name to view the contents" ); + lv->clear(); + + TQStringList tables = db->tables(); + for ( TQStringList::Iterator it = tables.begin(); it != tables.end(); ++it ) { + TQListViewItem* lvi = new TQListViewItem( lv, *it ); + TQSqlRecordInfo ri = db->recordInfo ( *it ); + for ( TQSqlRecordInfo::Iterator it = ri.begin(); it != ri.end(); ++it ) { + TQString req; + if ( (*it).isRetquired() > 0 ) { + req = "Yes"; + } else if ( (*it).isRetquired() == 0 ) { + req = "No"; + } else { + req = "?"; + } + TQListViewItem* fi = new TQListViewItem( lvi, (*it).name(), + TQVariant::typeToName( (*it).type() ), req ); + lvi->insertItem( fi ); + } + lv->insertItem( lvi ); + } + submitBtn->setEnabled( TRUE ); +} + +void SqlEx::execQuery() +{ + // use a custom cursor to populate the data table + TQSqlSelectCursor* cursor = new TQSqlSelectCursor( te->text(), TQSqlDatabase::database( "SqlEx", TRUE ) ); + if ( cursor->isSelect() ) { + dt->setSqlCursor( cursor, TRUE, TRUE ); + dt->setSort( TQStringList() ); + dt->refresh( TQDataTable::RefreshAll ); + TQString txt( "Query OK" ); + if ( cursor->size() >= 0 ) + txt += ", returned rows: " + TQString::number( cursor->size() ); + lbl->setText( txt ); + } else { + // an error occured if the cursor is not active + if ( !cursor->isActive() ) { + showError( cursor->lastError(), this ); + } else { + lbl->setText( TQString("Query OK, affected rows: %1").arg( cursor->numRowsAffected() ) ); + } + } +} + +void SqlEx::showTable( TQListViewItem * item ) +{ + // get the table name + TQListViewItem* i = item->parent(); + if ( !i ) { + i = item; + } + + // populate the data table + TQSqlCursor* cursor = new TQSqlCursor( i->text( 0 ), TRUE, TQSqlDatabase::database( "SqlEx", TRUE ) ); + dt->setSqlCursor( cursor, TRUE, TRUE ); + dt->setSort( cursor->primaryIndex() ); + dt->refresh( TQDataTable::RefreshAll ); + lbl->setText( "Displaying table " + i->text( 0 ) ); +} diff --git a/examples/demo/textdrawing/bidi.txt b/examples/demo/textdrawing/bidi.txt new file mode 100644 index 000000000..7674ab0f0 --- /dev/null +++ b/examples/demo/textdrawing/bidi.txt @@ -0,0 +1,6 @@ +This page contains text in many languages, advertising the Tenth International Unicode Conference. The page is encoded using Unicode UTF-8 and to view it you need a Unicode-capable browser. If you don't have access to such a browser, you may want to visit the individual Web pages, each containing the text in a single language. The text on these Web pages was provided by volunteer translators (see the Credits page). If you would like to offer a language we don't yet have, or have a comment about one of the existing pages, please mail us. + +×ירופה, ×ª×•×›× ×” וה××™× ×˜×¨× ×˜: Unicode ×™×•×¦× ×œ×©×•×§ העולמי הירשמו כעת ×œ×›× ×¡ Unicode ×”×‘×™× ×œ×ומי העשירי, שייערך בין הת××¨×™×›×™× 12Ö¾10 במרץ 1997, ×‘×ž×™×™× ×¥ ×©×‘×’×¨×ž× ×™×”. ×‘×›× ×¡ ישתתפו ×ž×•×ž×—×™× ×ž×›×œ ×¢× ×¤×™ התעשייה ×‘× ×•×©× ×”××™× ×˜×¨× ×˜ העולמי וה־Unicode, בהת×מה לשוק ×”×‘×™× ×œ×ומי והמקומי, ×‘×™×™×©×•× Unicode במערכות הפעלה וביישומי×, ×‘×’×•×¤× ×™×, בפריסת טקסט ובמחשוב ×¨×‘Ö¾×œ×©×•× ×™. some english inbetween ×›×שר ×”×¢×•×œ× ×¨×•×¦×” לדבר, ×”×•× ×ž×“×‘×¨ ב־Unicode + +أوروبا, برمجيات Ø§Ù„ØØ§Ø³ÙˆØ¨ + انترنيت : some english ØªØµØ¨Ø Ø¹Ø§Ù„Ù…ÙŠØ§ مع يونيكود more english تسجّل الآن Ù„ØØ¶ÙˆØ± المؤتمر الدولي العاشر ليونيكود, الذي سيعقد ÙÙŠ 10-12 آذار 1997 بمدينة ماينتس, ألمانيا. وسيجمع المؤتمر بين خبراء من ÙƒØ§ÙØ© قطاعات الصناعة على الشبكة العالمية انترنيت ويونيكود, ØÙŠØ« ستتم, على الصعيدين الدولي والمØÙ„ÙŠ على ØØ¯ سواء مناقشة سبل استخدام يونكود ÙÙŠ النظم القائمة ÙˆÙيما يخص التطبيقات Ø§Ù„ØØ§Ø³ÙˆØ¨ÙŠØ©, الخطوط, تصميم النصوص والØÙˆØ³Ø¨Ø© متعددة اللغات. english عندما يريد العالم أن يتكلّم, Ùهو ÙŠØªØØ¯Ù‘Ø« بلغة يونيكود. english... + diff --git a/examples/demo/textdrawing/editcopy.png b/examples/demo/textdrawing/editcopy.png Binary files differnew file mode 100644 index 000000000..2f931cb2e --- /dev/null +++ b/examples/demo/textdrawing/editcopy.png diff --git a/examples/demo/textdrawing/editcut.png b/examples/demo/textdrawing/editcut.png Binary files differnew file mode 100644 index 000000000..54c8e1440 --- /dev/null +++ b/examples/demo/textdrawing/editcut.png diff --git a/examples/demo/textdrawing/editdelete.png b/examples/demo/textdrawing/editdelete.png Binary files differnew file mode 100644 index 000000000..9f0491ddc --- /dev/null +++ b/examples/demo/textdrawing/editdelete.png diff --git a/examples/demo/textdrawing/editlower.png b/examples/demo/textdrawing/editlower.png Binary files differnew file mode 100644 index 000000000..50605f276 --- /dev/null +++ b/examples/demo/textdrawing/editlower.png diff --git a/examples/demo/textdrawing/editpaste.png b/examples/demo/textdrawing/editpaste.png Binary files differnew file mode 100644 index 000000000..b1b7f8537 --- /dev/null +++ b/examples/demo/textdrawing/editpaste.png diff --git a/examples/demo/textdrawing/editraise.png b/examples/demo/textdrawing/editraise.png Binary files differnew file mode 100644 index 000000000..f15725170 --- /dev/null +++ b/examples/demo/textdrawing/editraise.png diff --git a/examples/demo/textdrawing/example.html b/examples/demo/textdrawing/example.html new file mode 100644 index 000000000..211838dac --- /dev/null +++ b/examples/demo/textdrawing/example.html @@ -0,0 +1,340 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> +<title>TQt Toolkit - TQLabel Class</title><style type="text/css"><!-- +h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; } +a:link { color: #004faf; text-decoration: none } +a:visited { color: #672967; text-decoration: none }body { background: white; color: black; } +--></style> +</head><body bgcolor="#ffffff"> + +<h1 align=center>TQLabel Class Reference</h1><br clear="all"> +<p> +The TQLabel widget provides a static information display +<a href="#details">More...</a> +<p> +<code>#include <<a href="qlabel-h.html">qlabel.h</a>></code> +<p> +Inherits <a href="qframe.html">TQFrame</a>. +<p><a href="qlabel-members.html">List of all member functions.</a> +<h2>Public Members</h2> +<ul> +<li><div class="fn"><a href="#39107d"><b>TQLabel</b></a> ( QWidget * parent, const char * name=0, WFlags f=0 ) </div> +<li><div class="fn"><a href="#2bafbb"><b>TQLabel</b></a> ( const QString & text, TQWidget * parent, const char * name=0, WFlags f=0 ) </div> +<li><div class="fn"><a href="#5514c7"><b>TQLabel</b></a> ( QWidget * buddy, const QString &, TQWidget * parent, const char * name=0, WFlags f=0 ) </div> +<li><div class="fn"><a href="#9958af"><b>~TQLabel</b></a> () </div> +<li><div class="fn">TQString <a href="#72cf09"><b>text</b></a> () const</div> +<li><div class="fn">TQPixmap* <a href="#101ecb"><b>pixmap</b></a> () const</div> +<li><div class="fn">TQMovie* <a href="#7dcdfe"><b>movie</b></a> () const</div> +<li><div class="fn">TextFormat <a href="#0b92ed"><b>textFormat</b></a> () const</div> +<li><div class="fn">void <a href="#5de3f9"><b>setTextFormat</b></a> ( TextFormat ) </div> +<li><div class="fn">int <a href="#2fcaa3"><b>alignment</b></a> () const</div> +<li><div class="fn">virtual void <a href="#1f406e"><b>setAlignment</b></a> ( int ) </div> +<li><div class="fn">int <a href="#e3c907"><b>indent</b></a> () const</div> +<li><div class="fn">void <a href="#ed9b8b"><b>setIndent</b></a> ( int ) </div> +<li><div class="fn">bool autoResize () const <em>(obsolete)</em></div> +<li><div class="fn">virtual void setAutoResize ( bool ) <em>(obsolete)</em></div> +<li><div class="fn">bool <a href="#7e1f73"><b>hasScaledContents</b></a> () const</div> +<li><div class="fn">void <a href="#e9e3cf"><b>setScaledContents</b></a> ( bool ) </div> +<li><div class="fn">virtual void <a href="#191701"><b>setBuddy</b></a> ( QWidget * ) </div> +<li><div class="fn">TQWidget* <a href="#123954"><b>buddy</b></a> () const</div> +</ul> +<h2>Public Slots</h2> +<ul> +<li><div class="fn">virtual void <a href="#dffb43"><b>setText</b></a> ( const QString & ) </div> +<li><div class="fn">virtual void <a href="#f3f301"><b>setPixmap</b></a> ( const QPixmap & ) </div> +<li><div class="fn">virtual void <a href="#60de9f"><b>setMovie</b></a> ( const QMovie & ) </div> +<li><div class="fn">virtual void <a href="#301e3c"><b>setNum</b></a> ( int ) </div> +<li><div class="fn">virtual void <a href="#1a8f6a"><b>setNum</b></a> ( double ) </div> +<li><div class="fn">void <a href="#be73f3"><b>clear</b></a> () </div> +</ul> +<h2>Protected Members</h2> +<ul> +<li><div class="fn">virtual void <a href="#fac264"><b>drawContents</b></a> ( QPainter * ) </div> +<li><div class="fn">virtual void <a href="#479dd2"><b>drawContentsMask</b></a> ( QPainter * ) </div> +</ul> +<h2>Properties</h2> +<table border=1 cellpadding=3 cellspacing=0> +<tr><th>Type<th>Name<th>READ<th>WRITE<th>Options +<tr><td>TQString<td>text<td>text<td>setText<td> +<tr><td>TextFormat<td>textFormat<td>textFormat<td>setTextFormat<td> +<tr><td>TQPixmap<td>pixmap<td>pixmap<td>setPixmap<td> +<tr><td>bool<td>scaledContents<td>hasScaledContents<td>setScaledContents<td> +<tr><td>Alignment<td>alignment<td>alignment<td>setAlignment<td> +<tr><td>int<td>indent<td>indent<td>setIndent<td> +</table> +<p> +<hr><h2><a name="details"></a>Detailed Description</h2> +The TQLabel widget provides a static information display +<p> +TQLabel is used for displaying information in the form of text or +image to the user. No user interaction functionality is +provided. The visual appearance of the label can be configured in +various ways, and it can be used for specifying a focus accelerator +key for another widget. +<p>A TQLabel can contain any of the following content types: +<ul> +<li> A plain text: set by passing a <a href="qstring.html">TQString</a> to <a href="#dffb43">setText</a>(). +<li> A rich text: set by passing a TQString that contains a rich text to setText(). +<li> A pixmap: set by passing a <a href="qpixmap.html">TQPixmap</a> to <a href="#f3f301">setPixmap</a>(). +<li> A movie: set by passing a <a href="qmovie.html">TQMovie</a> to <a href="#60de9f">setMovie</a>(). +<li> A number: set by passing an <em>int</em> or a <em>double</em> to <a href="#1a8f6a">setNum</a>(), which converts the number to plain text. +<li> Nothing: The same as an empty plain text. This is the default. Set by <a href="#be73f3">clear</a>(). +</ul> +<p>When the content is changed using any of these functions, any +previous content is cleared. +<p>The look of a TQLabel can be tuned in several ways. All the settings +of <a href="qframe.html">TQFrame</a> are available for specifying a widget frame. The +positioning of the content within the TQLabel widget area can be +tuned with <a href="#1f406e">setAlignment</a>() and <a href="#ed9b8b">setIndent</a>(). For example, this code +sets up a sunken panel with a two-line text in the bottom right +corner (both lines being flush with the right side of the label): +<p><pre> <a href="qlabel.html">TQLabel</a> *label = new <a href="qlabel.html">TQLabel</a>; + label-><a href="qframe.html#c0d758">setFrameStyle</a>( TQFrame::Panel | TQFrame::Sunken ); + label-><a href="#dffb43">setText</a>( "first line\nsecond line" ); + label-><a href="#1f406e">setAlignment</a>( AlignBottom | AlignRight ); +</pre> +<p>A TQLabel is often used as a label for another, interactive +widget. For this use, TQLabel provides a handy mechanism for adding +an accelerator key (see <a href="qaccel.html">TQAccel</a>) that will set the keyboard focus to +the other widget (called the TQLabel's "buddy"). Example: +<p><pre> <a href="qlineedit.html">TQLineEdit</a>* phoneEdit = new <a href="qlineedit.html">TQLineEdit</a>( this, "phoneEdit" ); + <a href="qlabel.html">TQLabel</a>* phoneLabel = new <a href="qlabel.html">TQLabel</a>( phoneEdit, "&Phone:", this, "phoneLabel" ); +</pre> +<p>In this example, keyboard focus is transferred to the label's buddy +(the <a href="qlineedit.html">TQLineEdit</a>) when the user presses <dfn>Alt-P.</dfn> You can also +use the <a href="#191701">setBuddy</a>() function to accomplish the same. +<p> +<p>See also <a href="qlineedit.html">TQLineEdit</a>, <a href="qtextview.html">TQTextView</a>, <a href="qpixmap.html">TQPixmap</a>, <a href="qmovie.html">TQMovie</a> and <a href="guibooks.html#fowler">GUI Design Handbook: Label</a> +<p>Examples: + <a href="cursor-cursor-cpp.html#TQLabel">cursor/cursor.cpp</a> + <a href="layout-layout-cpp.html#TQLabel">layout/layout.cpp</a> + <a href="popup-popup-cpp.html#TQLabel">popup/popup.cpp</a> + <a href="menu-menu-cpp.html#TQLabel">menu/menu.cpp</a> + <a href="progress-progress-cpp.html#TQLabel">progress/progress.cpp</a> + <a href="qmag-qmag-cpp.html#TQLabel">qmag/qmag.cpp</a> + <a href="movies-main-cpp.html#TQLabel">movies/main.cpp</a> + <a href="customlayout-main-cpp.html#TQLabel">customlayout/main.cpp</a> + +<hr><h2>Member Function Documentation</h2> +<h3 class="fn"><a name="5514c7"></a>TQLabel::TQLabel ( <a href="qwidget.html">TQWidget</a> * buddy, const <a href="qstring.html">TQString</a> & text, <a href="qwidget.html">TQWidget</a> * parent, const char * name=0, WFlags f=0 )</h3> +<p>Constructs a label with a text and a buddy. +<p>The <em>text</em> is set with <a href="#dffb43">setText</a>(). The <em>buddy</em> is set with <a href="#191701">setBuddy</a>(). +<p>The <em>parent, name</em> and <em>f</em> arguments are passed to the <a href="qframe.html">TQFrame</a> +constructor. +<p>See also <a href="#dffb43">setText</a>(), <a href="#191701">setBuddy</a>(), <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#c0d758">setFrameStyle</a>() and <a href="#ed9b8b">setIndent</a>(). +<h3 class="fn"><a name="39107d"></a>TQLabel::TQLabel ( <a href="qwidget.html">TQWidget</a> * parent, const char * name=0, WFlags f=0 )</h3> +<p>Constructs an empty label. +<p>The <em>parent, name</em> and <em>f</em> arguments are passed to the <a href="qframe.html">TQFrame</a> +constructor. +<p>See also <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#c0d758">setFrameStyle</a>() and <a href="#ed9b8b">setIndent</a>(). +<h3 class="fn"><a name="2bafbb"></a>TQLabel::TQLabel ( const <a href="qstring.html">TQString</a> & text, <a href="qwidget.html">TQWidget</a> * parent, const char * name=0, WFlags f=0 )</h3> +<p>Constructs a label with a text. The <em>text</em> is set with <a href="#dffb43">setText</a>(). +<p>The <em>parent, name</em> and <em>f</em> arguments are passed to the <a href="qframe.html">TQFrame</a> +constructor. +<p>See also <a href="#dffb43">setText</a>(), <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#c0d758">setFrameStyle</a>() and <a href="#ed9b8b">setIndent</a>(). +<h3 class="fn"><a name="9958af"></a>TQLabel::~TQLabel ()</h3> +<p>Destructs the label. +<h3 class="fn">int <a name="2fcaa3"></a>TQLabel::alignment () const</h3> +<p>Returns the alignment setting. +<p>See also <a href="#1f406e">setAlignment</a>(). +<h3 class="fn">bool <a name="75b2a1"></a>TQLabel::autoResize () const</h3> +<p><b>This function is obsolete.</b> It is provided to keep old source working, and will probably be removed in a future version of TQt. We strongly advise against using it in new code.<p> +<p>Returns TRUE if auto-resizing is enabled, or FALSE if auto-resizing +is disabled. +<p>Auto-resizing is disabled by default. +<p>See also <a href="#c0e104">setAutoResize</a>(). +<h3 class="fn"><a href="qwidget.html">TQWidget</a> * <a name="123954"></a>TQLabel::buddy () const</h3> +<p>Returns the buddy of this label, or 0 if no buddy is currently set. +<p>See also <a href="#191701">setBuddy</a>(). +<h3 class="fn">void <a name="be73f3"></a>TQLabel::clear () <code>[slot]</code></h3> +<p>Clears any label contents. Equivalent with <a href="#dffb43">setText</a>( "" ). +<h3 class="fn">void <a name="fac264"></a>TQLabel::drawContents ( <a href="qpainter.html">TQPainter</a> * p ) <code>[virtual protected]</code></h3> +<p>Draws the label contents using the painter <em>p.</em> +<p>Reimplemented from <a href="qframe.html#99e687">TQFrame.</a> +<h3 class="fn">void <a name="479dd2"></a>TQLabel::drawContentsMask ( <a href="qpainter.html">TQPainter</a> * p ) <code>[virtual protected]</code></h3> +<p>Draws the label contents mask using the painter <em>p.</em> +Used only in transparent mode. +<p>See also <a href="qwidget.html#c7a335">TQWidget::setAutoMask</a>();. +<p>Reimplemented from <a href="qframe.html#4cbf11">TQFrame.</a> +<h3 class="fn">void <a name="0435a2"></a>TQLabel::fontChange ( const <a href="qfont.html">TQFont</a> & ) <code>[virtual protected]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Reimplemented from <a href="qwidget.html#570a8f">TQWidget.</a> +<h3 class="fn">bool <a name="7e1f73"></a>TQLabel::hasScaledContents () const</h3> +<p>Returns whether the label will scale its contents to fill all +available space. +<p>See also <a href="#e9e3cf">setScaledContents</a>(). +<h3 class="fn">int <a name="dae451"></a>TQLabel::heightForWidth ( int w ) const <code>[virtual]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Reimplemented from <a href="qwidget.html#2e8476">TQWidget.</a> +<h3 class="fn">int <a name="e3c907"></a>TQLabel::indent () const</h3> +<p>Returns the indent of the label. +<p>See also <a href="#ed9b8b">setIndent</a>(). +<h3 class="fn"><a href="qsize.html">TQSize</a> <a name="53c8c7"></a>TQLabel::minimumSizeHint () const <code>[virtual]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Reimplemented from <a href="qwidget.html#3f0fc2">TQWidget.</a> +<h3 class="fn"><a href="qmovie.html">TQMovie</a>* <a name="7dcdfe"></a>TQLabel::movie () const</h3> +<p>If the label contains a movie, returns a pointer to it. Otherwise, +returns 0. +<p>See also <a href="#60de9f">setMovie</a>(). +<h3 class="fn"><a href="qpixmap.html">TQPixmap</a> * <a name="101ecb"></a>TQLabel::pixmap () const</h3> +<p>If the label contains a pixmap, returns a pointer to it. Otherwise, +returns 0. +<p>See also <a href="#f3f301">setPixmap</a>(). +<h3 class="fn">void <a name="3cb6e7"></a>TQLabel::resizeEvent ( <a href="qresizeevent.html">TQResizeEvent</a> * e ) <code>[virtual protected]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Reimplemented from <a href="qwidget.html#28c156">TQWidget.</a> +<h3 class="fn">void <a name="1f406e"></a>TQLabel::setAlignment ( int alignment ) <code>[virtual]</code></h3> +<p>Sets the alignment of the label contents. +<p>The <em>alignment</em> must be a bitwise OR of <a href="qt.html#AlignmentFlags">TQt::AlignmentFlags</a> +values. The <code>WordBreak, ExpandTabs, SingleLine</code> and <code>ShowPrefix</code> flags apply only if the label contains a plain text, and +are otherwise ignored. The <code>DontClip</code> flag is always ignored. +<p>If the label has a buddy, the <code>ShowPrefix</code> flag is forced to TRUE. +<p>The default alignment is <code>AlignLeft | AlignVCenter | +ExpandTabs</code> if the label doesn't have a buddy and +<code>AlignLeft | AlignVCenter | ExpandTabs | ShowPrefix </code> if +the label has a buddy. +<p>See also <a href="qt.html#AlignmentFlags">TQt::AlignmentFlags</a>, <a href="#2fcaa3">alignment</a>(), <a href="#191701">setBuddy</a>() and <a href="#dffb43">setText</a>(). +<p>Examples: + <a href="cursor-cursor-cpp.html#setAlignment">cursor/cursor.cpp</a> + <a href="layout-layout-cpp.html#setAlignment">layout/layout.cpp</a> + <a href="popup-popup-cpp.html#setAlignment">popup/popup.cpp</a> + <a href="qmag-qmag-cpp.html#setAlignment">qmag/qmag.cpp</a> + <a href="customlayout-main-cpp.html#setAlignment">customlayout/main.cpp</a> +<h3 class="fn">void <a name="1b6d73"></a>TQLabel::setAutoMask ( bool b ) <code>[virtual]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Reimplemented from <a href="qwidget.html#c7a335">TQWidget.</a> +<h3 class="fn">void <a name="c0e104"></a>TQLabel::setAutoResize ( bool enable ) <code>[virtual]</code></h3> +<p><b>This function is obsolete.</b> It is provided to keep old source working, and will probably be removed in a future version of TQt. We strongly advise against using it in new code.<p> +Enables auto-resizing if <em>enable</em> is TRUE, or disables it if <em>enable</em> is FALSE. +<p>When auto-resizing is enabled, the label will resize itself to fit +the contents whenever the contents change. The top left corner is +not moved. This is useful for TQLabel widgets that are not managed by +a <a href="qlayout.html">TQLayout</a> (e.g. top-level widgets). +<p>Auto-resizing is disabled by default. +<p>See also <a href="#75b2a1">autoResize</a>(), <a href="qwidget.html#ab3108">adjustSize</a>() and <a href="#614dd5">sizeHint</a>(). +<h3 class="fn">void <a name="191701"></a>TQLabel::setBuddy ( <a href="qwidget.html">TQWidget</a> * buddy ) <code>[virtual]</code></h3> +<p>Sets the buddy of this label to <em>buddy.</em> +<p>When the user presses the accelerator key indicated by this label, +the keyboard focus is transferred to the label's buddy widget. +<p>The buddy mechanism is only available for TQLabels that contain a +plain text in which one letter is prefixed with '&'. It is this +letter that is set as the accelerator key. The letter is displayed +underlined, and the '&' is not displayed (i.e. the <code>ShowPrefix</code> +alignment flag is turned on; see <a href="#1f406e">setAlignment</a>()). +<p>In a dialog, you might create two data entry widgets and a label for +each, and set up the geometry layout so each label is just to the +left of its data entry widget (its "buddy"), somewhat like this: +<p><pre> <a href="qlineedit.html">TQLineEdit</a> *nameEd = new <a href="qlineedit.html">TQLineEdit</a>( this ); + <a href="qlabel.html">TQLabel</a> *nameLb = new <a href="qlabel.html">TQLabel</a>( "&Name:", this ); + nameLb-><a href="#191701">setBuddy</a>( nameEd ); + <a href="qlineedit.html">TQLineEdit</a> *phoneEd = new <a href="qlineedit.html">TQLineEdit</a>( this ); + <a href="qlabel.html">TQLabel</a> *phoneLb = new <a href="qlabel.html">TQLabel</a>( "&Phone:", this ); + phoneLb-><a href="#191701">setBuddy</a>( phoneEd ); + // ( layout setup not shown ) +</pre> +<p>With the code above, the focus jumps to the Name field when the user +presses Alt-N, and to the Phone field when the user presses Alt-P. +<p>To unset a previously set buddy, call this function with <em>buddy</em> +set to 0. +<p>See also <a href="#123954">buddy</a>(), <a href="#dffb43">setText</a>(), <a href="qaccel.html">TQAccel</a> and <a href="#1f406e">setAlignment</a>(). +<p>Examples: + <a href="layout-layout-cpp.html#setBuddy">layout/layout.cpp</a> +<h3 class="fn">void <a name="ed9b8b"></a>TQLabel::setIndent ( int indent )</h3> +<p>Sets the indent of the label to <em>indent</em> pixels. +<p>The indent applies to the left edge if <a href="#2fcaa3">alignment</a>() is <code>AlignLeft,</code> +to the right edge if alignment() is <code>AlignRight,</code> to the top edge +if alignment() is <code>AlignTop,</code> and to to the bottom edge if +alignment() is <code>AlignBottom.</code> +<p>If <em>indent</em> is negative, or if no indent has been set, the label +computes the effective indent as follows: If <a href="qframe.html#e0ccef">frameWidth</a>() is 0, the +effective indent becomes 0. If frameWidth() is greater than 0, the +effective indent becomes half the width of the "x" character of the +widget's current <a href="qwidget.html#3a7237">font</a>(). +<p>If <em>indent</em> is non-negative, the effective indent is <em>indent</em> +pixels. +<p>See also <a href="#e3c907">indent</a>(), <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#e0ccef">frameWidth</a>() and <a href="qwidget.html#3a7237">font</a>(). +<p>Examples: + <a href="movies-main-cpp.html#setIndent">movies/main.cpp</a> +<h3 class="fn">void <a name="60de9f"></a>TQLabel::setMovie ( const <a href="qmovie.html">TQMovie</a> & movie ) <code>[virtual slot]</code></h3> +<p>Sets the label contents to <em>movie.</em> Any previous content is cleared. +<p>The buddy accelerator, if any, is disabled. +<p>The label resizes itself if auto-resizing is enabled. +<p>See also <a href="#7dcdfe">movie</a>() and <a href="#191701">setBuddy</a>(). +<h3 class="fn">void <a name="1a8f6a"></a>TQLabel::setNum ( double num ) <code>[virtual slot]</code></h3> +<p>Sets the label contents to a plain text containing the printed value +of <em>num.</em> Does nothing if this is equal to the current contents of +the label. Any previous content is cleared. +<p>The buddy accelerator, if any, is disabled. +<p>The label resizes itself if auto-resizing is enabled. +<p>See also <a href="#dffb43">setText</a>(), <a href="qstring.html#01d80b">TQString::setNum</a>() and <a href="#191701">setBuddy</a>(). +<h3 class="fn">void <a name="301e3c"></a>TQLabel::setNum ( int num ) <code>[virtual slot]</code></h3> +<p>Sets the label contents to a plain text containing the printed value +of <em>num.</em> Does nothing if this is equal to the current contents of +the label. Any previous content is cleared. +<p>The buddy accelerator, if any, is disabled. +<p>The label resizes itself if auto-resizing is enabled. +<p>See also <a href="#dffb43">setText</a>(), <a href="qstring.html#01d80b">TQString::setNum</a>() and <a href="#191701">setBuddy</a>(). +<h3 class="fn">void <a name="f3f301"></a>TQLabel::setPixmap ( const <a href="qpixmap.html">TQPixmap</a> & pixmap ) <code>[virtual slot]</code></h3> +<p>Sets the label contents to <em>pixmap.</em> Any previous content is cleared. +<p>The buddy accelerator, if any, is disabled. +<p>The label resizes itself if auto-resizing is enabled. +<p>See also <a href="#101ecb">pixmap</a>() and <a href="#191701">setBuddy</a>(). +<h3 class="fn">void <a name="e9e3cf"></a>TQLabel::setScaledContents ( bool enable )</h3> +<p>When called with <em>enable</em> == TRUE, and the label shows a pixmap, +it will scale the pixmap to fill available space. +<p>See also <a href="#7e1f73">hasScaledContents</a>(). +<h3 class="fn">void <a name="dffb43"></a>TQLabel::setText ( const <a href="qstring.html">TQString</a> & text ) <code>[virtual slot]</code></h3> +<p>Sets the label contents to <em>text,</em> or does nothing if <em>text</em> is +equal to the current contents of the label. Any previous content is +cleared. +<p><em>text</em> will be interpreted either as a plain text or as a rich +text, depending on the text format setting; see <a href="#5de3f9">setTextFormat</a>(). The +default setting is <code>AutoText,</code> i.e. TQLabel will try to auto-detect +the format of <em>text.</em> +<p>If <em>text</em> is interpreted as a plain text, and a buddy has been set, +the buddy accelerator key is updated from the new text. +<p>The label resizes itself if auto-resizing is enabled. +<p>Note that Qlabel is well suited to display small rich text documents +only. For large documents, use <a href="qtextview.html">TQTextView</a> instead. It will flicker +less on resize and can also provide a scrollbar if necessary. +<p>See also <a href="#72cf09">text</a>(), <a href="#5de3f9">setTextFormat</a>(), <a href="#191701">setBuddy</a>() and <a href="#1f406e">setAlignment</a>(). +<p>Examples: + <a href="cursor-cursor-cpp.html#setText">cursor/cursor.cpp</a> + <a href="layout-layout-cpp.html#setText">layout/layout.cpp</a> + <a href="popup-popup-cpp.html#setText">popup/popup.cpp</a> + <a href="qmag-qmag-cpp.html#setText">qmag/qmag.cpp</a> + <a href="customlayout-main-cpp.html#setText">customlayout/main.cpp</a> +<h3 class="fn">void <a name="5de3f9"></a>TQLabel::setTextFormat ( <a href="qt.html#TextFormat">TQt::TextFormat</a> format )</h3> +<p>Sets the text format to <em>format.</em> See the <a href="qt.html#TextFormat">TQt::TextFormat</a> enum for +an explanation of the possible options. +<p>The default format is <code>AutoText.</code> +<p>See also <a href="#0b92ed">textFormat</a>() and <a href="#dffb43">setText</a>(). +<h3 class="fn"><a href="qsize.html">TQSize</a> <a name="614dd5"></a>TQLabel::sizeHint () const <code>[virtual]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Examples: + <a href="layout-layout-cpp.html#sizeHint">layout/layout.cpp</a> +<p>Reimplemented from <a href="qwidget.html#290bcd">TQWidget.</a> +<h3 class="fn"><a href="qsizepolicy.html">TQSizePolicy</a> <a name="26e1d9"></a>TQLabel::sizePolicy () const <code>[virtual]</code></h3> +<p>Reimplemented for internal reasons; the API is not affected. +<p>Reimplemented from <a href="qwidget.html#2d5d13">TQWidget.</a> +<h3 class="fn"><a href="qstring.html">TQString</a> <a name="72cf09"></a>TQLabel::text () const</h3> +<p>Returns the label text. If the content is a plain or a rich text, +this is the string that was passed to <a href="#dffb43">setText</a>(). Otherwise, it is an +empty/null string. +<p>See also <a href="#dffb43">setText</a>(), <a href="#1a8f6a">setNum</a>() and <a href="#be73f3">clear</a>(). +<h3 class="fn">TQt::TextFormat <a name="0b92ed"></a>TQLabel::textFormat() const</h3> +<p>Returns the current text format. +<p>See also <a href="#5de3f9">setTextFormat</a>(). +<hr><p> +Search the documentation, FAQ, qt-interest archive and more (uses +<a href="http://www.trolltech.com">www.trolltech.com</a>):<br> +<form method=post action="http://www.trolltech.com/search.cgi"> +<input type=hidden name="version" value="3.0.0-snapshot"><nobr> +<input size="50" name="search"><input type=submit value="Search"> +</nobr></form><hr><p> +This file is part of the <a href="index.html">TQt toolkit</a>, +copyright © 1995-2006 +<a href="http://www.trolltech.com">Trolltech</a>, all rights reserved.<p><address><hr><div align="center"> +<table width="100%" cellspacing="0" border="0"><tr> +<td>Copyright © 2006 Trolltech<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a> +<td align="right"><div align="right">TQt version 3.0.0-snapshot</div> +</table></div></address></body></html> diff --git a/examples/demo/textdrawing/filenew.png b/examples/demo/textdrawing/filenew.png Binary files differnew file mode 100644 index 000000000..be963bf86 --- /dev/null +++ b/examples/demo/textdrawing/filenew.png diff --git a/examples/demo/textdrawing/fileopen.png b/examples/demo/textdrawing/fileopen.png Binary files differnew file mode 100644 index 000000000..6077b815f --- /dev/null +++ b/examples/demo/textdrawing/fileopen.png diff --git a/examples/demo/textdrawing/filesave.png b/examples/demo/textdrawing/filesave.png Binary files differnew file mode 100644 index 000000000..a1cb03dd0 --- /dev/null +++ b/examples/demo/textdrawing/filesave.png diff --git a/examples/demo/textdrawing/help.png b/examples/demo/textdrawing/help.png Binary files differnew file mode 100644 index 000000000..2ab2c25d7 --- /dev/null +++ b/examples/demo/textdrawing/help.png diff --git a/examples/demo/textdrawing/helpwindow.cpp b/examples/demo/textdrawing/helpwindow.cpp new file mode 100644 index 000000000..de353df7d --- /dev/null +++ b/examples/demo/textdrawing/helpwindow.cpp @@ -0,0 +1,337 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "helpwindow.h" +#include <qstatusbar.h> +#include <qpixmap.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qiconset.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qstylesheet.h> +#include <qmessagebox.h> +#include <qfiledialog.h> +#include <qapplication.h> +#include <qcombobox.h> +#include <qevent.h> +#include <qlineedit.h> +#include <qobjectlist.h> +#include <qfileinfo.h> +#include <qfile.h> +#include <qdatastream.h> +#include <qprinter.h> +#include <qsimplerichtext.h> +#include <qpainter.h> +#include <qpaintdevicemetrics.h> + +#include <ctype.h> + +HelpWindow::HelpWindow( const TQString& home_, const TQString& _path, + TQWidget* parent, const char *name ) + : TQMainWindow( parent, name, WDestructiveClose ), + pathCombo( 0 ), selectedURL() +{ + readHistory(); + readBookmarks(); + + browser = new TQTextBrowser( this ); + browser->mimeSourceFactory()->setFilePath( _path ); + browser->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + connect( browser, SIGNAL( textChanged() ), + this, SLOT( textChanged() ) ); + + setCentralWidget( browser ); + + if ( !home_.isEmpty() ) + browser->setSource( home_ ); + + connect( browser, SIGNAL( highlighted( const TQString&) ), + statusBar(), SLOT( message( const TQString&)) ); + + resize( 640,700 ); + + TQPopupMenu* file = new TQPopupMenu( this ); + file->insertItem( tr("&New Window"), this, SLOT( newWindow() ), ALT | Key_N ); + file->insertItem( tr("&Open File"), this, SLOT( openFile() ), ALT | Key_O ); + file->insertItem( tr("&Print"), this, SLOT( print() ), ALT | Key_P ); + + // The same three icons are used twice each. + TQIconSet icon_back( TQPixmap("textdrawing/previous.png") ); + TQIconSet icon_forward( TQPixmap("textdrawing/next.png") ); + TQIconSet icon_home( TQPixmap("textdrawing/home.png") ); + + TQPopupMenu* go = new TQPopupMenu( this ); + backwardId = go->insertItem( icon_back, + tr("&Backward"), browser, SLOT( backward() ), + ALT | Key_Left ); + forwardId = go->insertItem( icon_forward, + tr("&Forward"), browser, SLOT( forward() ), + ALT | Key_Right ); + go->insertItem( icon_home, tr("&Home"), browser, SLOT( home() ) ); + + hist = new TQPopupMenu( this ); + TQStringList::Iterator it = history.begin(); + for ( ; it != history.end(); ++it ) + mHistory[ hist->insertItem( *it ) ] = *it; + connect( hist, SIGNAL( activated( int ) ), + this, SLOT( histChosen( int ) ) ); + + bookm = new TQPopupMenu( this ); + bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) ); + bookm->insertSeparator(); + + TQStringList::Iterator it2 = bookmarks.begin(); + for ( ; it2 != bookmarks.end(); ++it2 ) + mBookmarks[ bookm->insertItem( *it2 ) ] = *it2; + connect( bookm, SIGNAL( activated( int ) ), + this, SLOT( bookmChosen( int ) ) ); + + menuBar()->insertItem( tr("&File"), file ); + menuBar()->insertItem( tr("&Go"), go ); + menuBar()->insertItem( tr( "History" ), hist ); + menuBar()->insertItem( tr( "Bookmarks" ), bookm ); + + menuBar()->setItemEnabled( forwardId, FALSE); + menuBar()->setItemEnabled( backwardId, FALSE); + connect( browser, SIGNAL( backwardAvailable( bool ) ), + this, SLOT( setBackwardAvailable( bool ) ) ); + connect( browser, SIGNAL( forwardAvailable( bool ) ), + this, SLOT( setForwardAvailable( bool ) ) ); + + + TQToolBar* toolbar = new TQToolBar( this ); + addToolBar( toolbar, "Toolbar"); + TQToolButton* button; + + button = new TQToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar ); + connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) ); + button->setEnabled( FALSE ); + button = new TQToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar ); + connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) ); + button->setEnabled( FALSE ); + button = new TQToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar ); + + toolbar->addSeparator(); + + pathCombo = new TQComboBox( TRUE, toolbar ); + connect( pathCombo, SIGNAL( activated( const TQString & ) ), + this, SLOT( pathSelected( const TQString & ) ) ); + toolbar->setStretchableWidget( pathCombo ); + setRightJustification( TRUE ); + setDockEnabled( DockLeft, FALSE ); + setDockEnabled( DockRight, FALSE ); + + pathCombo->insertItem( home_ ); + + browser->setFocus(); +} + + +void HelpWindow::setBackwardAvailable( bool b) +{ + menuBar()->setItemEnabled( backwardId, b); +} + +void HelpWindow::setForwardAvailable( bool b) +{ + menuBar()->setItemEnabled( forwardId, b); +} + + +void HelpWindow::textChanged() +{ + if ( browser->documentTitle().isNull() ) + setCaption( browser->context() ); + else + setCaption( browser->documentTitle() ) ; + + selectedURL = caption(); + if ( !selectedURL.isEmpty() && pathCombo ) { + bool exists = FALSE; + int i; + for ( i = 0; i < pathCombo->count(); ++i ) { + if ( pathCombo->text( i ) == selectedURL ) { + exists = TRUE; + break; + } + } + if ( !exists ) { + pathCombo->insertItem( selectedURL, 0 ); + pathCombo->setCurrentItem( 0 ); + mHistory[ hist->insertItem( selectedURL ) ] = selectedURL; + } else + pathCombo->setCurrentItem( i ); + selectedURL = TQString::null; + } +} + +HelpWindow::~HelpWindow() +{ + history.clear(); + TQMap<int, TQString>::Iterator it = mHistory.begin(); + for ( ; it != mHistory.end(); ++it ) + history.append( *it ); + + TQFile f( TQDir::currentDirPath() + "/.history" ); + f.open( IO_WriteOnly ); + TQDataStream s( &f ); + s << history; + f.close(); + + bookmarks.clear(); + TQMap<int, TQString>::Iterator it2 = mBookmarks.begin(); + for ( ; it2 != mBookmarks.end(); ++it2 ) + bookmarks.append( *it2 ); + + TQFile f2( TQDir::currentDirPath() + "/.bookmarks" ); + f2.open( IO_WriteOnly ); + TQDataStream s2( &f2 ); + s2 << bookmarks; + f2.close(); +} + +void HelpWindow::about() +{ + TQMessageBox::about( this, "HelpViewer Example", + "<p>This example implements a simple HTML help viewer " + "using TQt's rich text capabilities</p>" + "<p>It's just about 100 lines of C++ code, so don't expect too much :-)</p>" + ); +} + + +void HelpWindow::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQBrowser" ); +} + +void HelpWindow::openFile() +{ +#ifndef QT_NO_FILEDIALOG + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) + browser->setSource( fn ); +#endif +} + +void HelpWindow::newWindow() +{ + ( new HelpWindow(browser->source(), "qbrowser") )->show(); +} + +void HelpWindow::print() +{ +#ifndef QT_NO_PRINTER + TQPrinter printer; + printer.setFullPage(TRUE); + if ( printer.setup() ) { + TQPainter p( &printer ); + TQPaintDeviceMetrics metrics(p.device()); + int dpix = metrics.logicalDpiX(); + int dpiy = metrics.logicalDpiY(); + const int margin = 72; // pt + TQRect body(margin*dpix/72, margin*dpiy/72, + metrics.width()-margin*dpix/72*2, + metrics.height()-margin*dpiy/72*2 ); + TQFont font("times", 10); + TQStringList filePaths = browser->mimeSourceFactory()->filePath(); + TQString file; + TQStringList::Iterator it = filePaths.begin(); + for ( ; it != filePaths.end(); ++it ) { + file = TQUrl( *it, TQUrl( browser->source() ).path() ).path(); + if ( TQFile::exists( file ) ) + break; + else + file = TQString::null; + } + if ( file.isEmpty() ) + return; + TQFile f( file ); + if ( !f.open( IO_ReadOnly ) ) + return; + TQTextStream ts( &f ); + TQSimpleRichText richText( ts.read(), font, browser->context(), browser->styleSheet(), + browser->mimeSourceFactory(), body.height() ); + richText.setWidth( &p, body.width() ); + TQRect view( body ); + int page = 1; + do { + richText.draw( &p, body.left(), body.top(), view, colorGroup() ); + view.moveBy( 0, body.height() ); + p.translate( 0 , -body.height() ); + p.setFont( font ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number(page) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number(page) ); + if ( view.top() >= richText.height() ) + break; + printer.newPage(); + page++; + } while (TRUE); + } +#endif +} + +void HelpWindow::pathSelected( const TQString &_path ) +{ + browser->setSource( _path ); + TQMap<int, TQString>::Iterator it = mHistory.begin(); + bool exists = FALSE; + for ( ; it != mHistory.end(); ++it ) { + if ( *it == _path ) { + exists = TRUE; + break; + } + } + if ( !exists ) + mHistory[ hist->insertItem( _path ) ] = _path; +} + +void HelpWindow::readHistory() +{ + if ( TQFile::exists( TQDir::currentDirPath() + "/.history" ) ) { + TQFile f( TQDir::currentDirPath() + "/.history" ); + f.open( IO_ReadOnly ); + TQDataStream s( &f ); + s >> history; + f.close(); + while ( history.count() > 20 ) + history.remove( history.begin() ); + } +} + +void HelpWindow::readBookmarks() +{ + if ( TQFile::exists( TQDir::currentDirPath() + "/.bookmarks" ) ) { + TQFile f( TQDir::currentDirPath() + "/.bookmarks" ); + f.open( IO_ReadOnly ); + TQDataStream s( &f ); + s >> bookmarks; + f.close(); + } +} + +void HelpWindow::histChosen( int i ) +{ + if ( mHistory.contains( i ) ) + browser->setSource( mHistory[ i ] ); +} + +void HelpWindow::bookmChosen( int i ) +{ + if ( mBookmarks.contains( i ) ) + browser->setSource( mBookmarks[ i ] ); +} + +void HelpWindow::addBookmark() +{ + mBookmarks[ bookm->insertItem( caption() ) ] = caption(); +} diff --git a/examples/demo/textdrawing/helpwindow.h b/examples/demo/textdrawing/helpwindow.h new file mode 100644 index 000000000..0115da9fc --- /dev/null +++ b/examples/demo/textdrawing/helpwindow.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef HELPWINDOW_H +#define HELPWINDOW_H + +#include <qmainwindow.h> +#include <qtextbrowser.h> +#include <qstringlist.h> +#include <qmap.h> +#include <qdir.h> + +class TQComboBox; +class TQPopupMenu; + +class HelpWindow : public TQMainWindow +{ + Q_OBJECT +public: + HelpWindow( const TQString& home_, const TQString& path, TQWidget* parent = 0, const char *name=0 ); + ~HelpWindow(); + +private slots: + void setBackwardAvailable( bool ); + void setForwardAvailable( bool ); + + void textChanged(); + void about(); + void aboutTQt(); + void openFile(); + void newWindow(); + void print(); + + void pathSelected( const TQString & ); + void histChosen( int ); + void bookmChosen( int ); + void addBookmark(); + +private: + void readHistory(); + void readBookmarks(); + + TQTextBrowser* browser; + TQComboBox *pathCombo; + int backwardId, forwardId; + TQString selectedURL; + TQStringList history, bookmarks; + TQMap<int, TQString> mHistory, mBookmarks; + TQPopupMenu *hist, *bookm; + +}; + + + + + +#endif + diff --git a/examples/demo/textdrawing/home.png b/examples/demo/textdrawing/home.png Binary files differnew file mode 100644 index 000000000..aa150a32c --- /dev/null +++ b/examples/demo/textdrawing/home.png diff --git a/examples/demo/textdrawing/next.png b/examples/demo/textdrawing/next.png Binary files differnew file mode 100644 index 000000000..4b29ff454 --- /dev/null +++ b/examples/demo/textdrawing/next.png diff --git a/examples/demo/textdrawing/previous.png b/examples/demo/textdrawing/previous.png Binary files differnew file mode 100644 index 000000000..4e3556c8d --- /dev/null +++ b/examples/demo/textdrawing/previous.png diff --git a/examples/demo/textdrawing/print.png b/examples/demo/textdrawing/print.png Binary files differnew file mode 100644 index 000000000..57e3e532f --- /dev/null +++ b/examples/demo/textdrawing/print.png diff --git a/examples/demo/textdrawing/redo.png b/examples/demo/textdrawing/redo.png Binary files differnew file mode 100644 index 000000000..bae07d3eb --- /dev/null +++ b/examples/demo/textdrawing/redo.png diff --git a/examples/demo/textdrawing/textbold.png b/examples/demo/textdrawing/textbold.png Binary files differnew file mode 100644 index 000000000..7b5be472a --- /dev/null +++ b/examples/demo/textdrawing/textbold.png diff --git a/examples/demo/textdrawing/textcenter.png b/examples/demo/textdrawing/textcenter.png Binary files differnew file mode 100644 index 000000000..5c68b09ce --- /dev/null +++ b/examples/demo/textdrawing/textcenter.png diff --git a/examples/demo/textdrawing/textedit.cpp b/examples/demo/textdrawing/textedit.cpp new file mode 100644 index 000000000..57949a7a7 --- /dev/null +++ b/examples/demo/textdrawing/textedit.cpp @@ -0,0 +1,477 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "textedit.h" + +#include <qtextedit.h> +#include <qaction.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qtoolbar.h> +#include <qtabwidget.h> +#include <qapplication.h> +#include <qfontdatabase.h> +#include <qcombobox.h> +#include <qlineedit.h> +#include <qfileinfo.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qprinter.h> +#include <qpaintdevicemetrics.h> +#include <qsimplerichtext.h> +#include <qcolordialog.h> +#include <qpainter.h> + +TextEdit::TextEdit( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name, 0 ) +{ + setupFileActions(); + setupEditActions(); + setupTextActions(); + + tabWidget = new TQTabWidget( this ); + connect( tabWidget, SIGNAL( currentChanged( TQWidget * ) ), + this, SLOT( editorChanged( TQWidget * ) ) ); + setCentralWidget( tabWidget ); +} + +void TextEdit::setupFileActions() +{ + TQToolBar *tb = new TQToolBar( this ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "&File" ), menu ); + + TQAction *a; + a = new TQAction( tr( "New" ), TQPixmap( "textdrawing/filenew.png" ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Open" ), TQPixmap( "textdrawing/fileopen.png" ), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileOpen() ) ); + a->addTo( tb ); + a->addTo( menu ); + menu->insertSeparator(); + a = new TQAction( tr( "Save" ), TQPixmap( "textdrawing/filesave.png" ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Save As" ), TQPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) ); + a->addTo( menu ); + menu->insertSeparator(); + a = new TQAction( tr( "Print" ), TQPixmap( "textdrawing/print.png" ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Close" ), TQPixmap(), tr( "&Close" ), 0, this, "fileClose" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) ); + a->addTo( menu ); +} + +void TextEdit::setupEditActions() +{ + TQToolBar *tb = new TQToolBar( this ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "&Edit" ), menu ); + + TQAction *a; + a = new TQAction( tr( "Undo" ), TQPixmap( "textdrawing/undo.png" ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Redo" ), TQPixmap( "textdrawing/redo.png" ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) ); + a->addTo( tb ); + a->addTo( menu ); + menu->insertSeparator(); + a = new TQAction( tr( "Cut" ), TQPixmap( "textdrawing/editcut.png" ), tr( "&Cut" ), CTRL + Key_X, this, "editCut" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Copy" ), TQPixmap( "textdrawing/editcopy.png" ), tr( "C&opy" ), CTRL + Key_C, this, "editCopy" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Paste" ), TQPixmap( "textdrawing/editpaste.png" ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" ); + connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) ); + a->addTo( tb ); + a->addTo( menu ); +} + +void TextEdit::setupTextActions() +{ + TQToolBar *tb = new TQToolBar( this ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "For&mat" ), menu ); + + comboStyle = new TQComboBox( FALSE, tb ); + comboStyle->insertItem( tr("Standard") ); + comboStyle->insertItem( tr("Bullet List (Disc)") ); + comboStyle->insertItem( tr("Bullet List (Circle)") ); + comboStyle->insertItem( tr("Bullet List (Square)") ); + comboStyle->insertItem( tr("Ordered List (Decimal)") ); + comboStyle->insertItem( tr("Ordered List (Alpha lower)") ); + comboStyle->insertItem( tr("Ordered List (Alpha upper)") ); + connect( comboStyle, SIGNAL( activated( int ) ), + this, SLOT( textStyle( int ) ) ); + + comboFont = new TQComboBox( TRUE, tb ); + TQFontDatabase db; + comboFont->insertStringList( db.families() ); + connect( comboFont, SIGNAL( activated( const TQString & ) ), + this, SLOT( textFamily( const TQString & ) ) ); + comboFont->lineEdit()->setText( TQApplication::font().family() ); + + comboSize = new TQComboBox( TRUE, tb ); + TQValueList<int> sizes = db.standardSizes(); + TQValueList<int>::Iterator it = sizes.begin(); + for ( ; it != sizes.end(); ++it ) + comboSize->insertItem( TQString::number( *it ) ); + connect( comboSize, SIGNAL( activated( const TQString & ) ), + this, SLOT( textSize( const TQString & ) ) ); + comboSize->lineEdit()->setText( TQString::number( TQApplication::font().pointSize() ) ); + + actionTextBold = new TQAction( tr( "Bold" ), TQPixmap( "textdrawing/textbold.png" ), tr( "&Bold" ), CTRL + Key_B, this, "textBold" ); + connect( actionTextBold, SIGNAL( activated() ), this, SLOT( textBold() ) ); + actionTextBold->addTo( tb ); + actionTextBold->addTo( menu ); + actionTextBold->setToggleAction( TRUE ); + actionTextItalic = new TQAction( tr( "Italic" ), TQPixmap( "textdrawing/textitalic.png" ), tr( "&Italic" ), CTRL + Key_I, this, "textItalic" ); + connect( actionTextItalic, SIGNAL( activated() ), this, SLOT( textItalic() ) ); + actionTextItalic->addTo( tb ); + actionTextItalic->addTo( menu ); + actionTextItalic->setToggleAction( TRUE ); + actionTextUnderline = new TQAction( tr( "Underline" ), TQPixmap( "textdrawing/textunderline.png" ), tr( "&Underline" ), CTRL + Key_U, this, "textUnderline" ); + connect( actionTextUnderline, SIGNAL( activated() ), this, SLOT( textUnderline() ) ); + actionTextUnderline->addTo( tb ); + actionTextUnderline->addTo( menu ); + actionTextUnderline->setToggleAction( TRUE ); + menu->insertSeparator(); + + TQActionGroup *grp = new TQActionGroup( this ); + grp->setExclusive( TRUE ); + connect( grp, SIGNAL( selected( TQAction* ) ), this, SLOT( textAlign( TQAction* ) ) ); + + actionAlignLeft = new TQAction( tr( "Left" ), TQPixmap( "textdrawing/textleft.png" ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" ); + actionAlignLeft->addTo( tb ); + actionAlignLeft->addTo( menu ); + actionAlignLeft->setToggleAction( TRUE ); + actionAlignCenter = new TQAction( tr( "Center" ), TQPixmap( "textdrawing/textcenter.png" ), tr( "C&enter" ), CTRL + Key_M, grp, "textCenter" ); + actionAlignCenter->addTo( tb ); + actionAlignCenter->addTo( menu ); + actionAlignCenter->setToggleAction( TRUE ); + actionAlignRight = new TQAction( tr( "Right" ), TQPixmap( "textdrawing/textright.png" ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" ); + actionAlignRight->addTo( tb ); + actionAlignRight->addTo( menu ); + actionAlignRight->setToggleAction( TRUE ); + actionAlignJustify = new TQAction( tr( "Justify" ), TQPixmap( "textdrawing/textjustify.png" ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" ); + actionAlignJustify->addTo( tb ); + actionAlignJustify->addTo( menu ); + actionAlignJustify->setToggleAction( TRUE ); + + menu->insertSeparator(); + + TQPixmap pix( 16, 16 ); + pix.fill( black ); + actionTextColor = new TQAction( tr( "Color" ), pix, tr( "&Color..." ), 0, this, "textColor" ); + connect( actionTextColor, SIGNAL( activated() ), this, SLOT( textColor() ) ); + actionTextColor->addTo( tb ); + actionTextColor->addTo( menu ); +} + +void TextEdit::load( const TQString &f ) +{ + if ( !TQFile::exists( f ) ) + return; + TQTextEdit *edit = new TQTextEdit( tabWidget ); + doConnections( edit ); + tabWidget->addTab( edit, TQFileInfo( f ).fileName() ); + + TQFile fl( f ); + fl.open( IO_ReadOnly ); + TQByteArray array = fl.readAll(); + array.resize( array.size() +1 ); + array[ (int)array.size() - 1 ] = '\0'; + TQString text = ( f.find( "bidi.txt" ) != -1 ? TQString::fromUtf8( array.data() ) : TQString::fromLatin1( array.data() ) ); + edit->setText( text ); + + edit->viewport()->setFocus(); + edit->setTextFormat( TQt::RichText ); +} + +TQTextEdit *TextEdit::currentEditor() const +{ + if ( tabWidget->currentPage() && + tabWidget->currentPage()->inherits( "TQTextEdit" ) ) + return (TQTextEdit*)tabWidget->currentPage(); + return 0; +} + +void TextEdit::doConnections( TQTextEdit *e ) +{ + connect( e, SIGNAL( currentFontChanged( const TQFont & ) ), + this, SLOT( fontChanged( const TQFont & ) ) ); + connect( e, SIGNAL( currentColorChanged( const TQColor & ) ), + this, SLOT( colorChanged( const TQColor & ) ) ); + connect( e, SIGNAL( currentAlignmentChanged( int ) ), + this, SLOT( alignmentChanged( int ) ) ); +} + +void TextEdit::fileNew() +{ + TQTextEdit *edit = new TQTextEdit( tabWidget ); + doConnections( edit ); + tabWidget->addTab( edit, tr( "noname" ) ); + tabWidget->showPage( edit ); + edit->viewport()->setFocus(); +} + +void TextEdit::fileOpen() +{ + TQString fn = TQFileDialog::getOpenFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this ); + if ( !fn.isEmpty() ) + load( fn ); +} + +void TextEdit::fileSave() +{ + if ( !currentEditor() ) + return; + TQString fn; + if ( filenames.find( currentEditor() ) == filenames.end() ) { + fileSaveAs(); + } else { + TQFile file( *filenames.find( currentEditor() ) ); + if ( !file.open( IO_WriteOnly ) ) + return; + TQTextStream ts( &file ); + ts << currentEditor()->text(); + } +} + +void TextEdit::fileSaveAs() +{ + if ( !currentEditor() ) + return; + TQString fn = TQFileDialog::getSaveFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this ); + if ( !fn.isEmpty() ) { + filenames.replace( currentEditor(), fn ); + fileSave(); + tabWidget->setTabLabel( currentEditor(), TQFileInfo( fn ).fileName() ); + } +} + +void TextEdit::filePrint() +{ + if ( !currentEditor() ) + return; +#ifndef QT_NO_PRINTER + TQPrinter printer; + printer.setFullPage(TRUE); + TQPaintDeviceMetrics screen( this ); + printer.setResolution( screen.logicalDpiY() ); + if ( printer.setup( this ) ) { + TQPainter p( &printer ); + TQPaintDeviceMetrics metrics( p.device() ); + int dpix = metrics.logicalDpiX(); + int dpiy = metrics.logicalDpiY(); + const int margin = 72; // pt + TQRect body( margin * dpix / 72, margin * dpiy / 72, + metrics.width() - margin * dpix / 72 * 2, + metrics.height() - margin * dpiy / 72 * 2 ); + TQFont font( "times", 10 ); + TQSimpleRichText richText( currentEditor()->text(), font, currentEditor()->context(), currentEditor()->styleSheet(), + currentEditor()->mimeSourceFactory(), body.height() ); + richText.setWidth( &p, body.width() ); + TQRect view( body ); + int page = 1; + do { + richText.draw( &p, body.left(), body.top(), view, colorGroup() ); + view.moveBy( 0, body.height() ); + p.translate( 0 , -body.height() ); + p.setFont( font ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) ); + if ( view.top() >= richText.height() ) + break; + printer.newPage(); + page++; + } while (TRUE); + } +#endif +} + +void TextEdit::fileClose() +{ + delete currentEditor(); + if ( currentEditor() ) + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::fileExit() +{ + qApp->tquit(); +} + +void TextEdit::editUndo() +{ + if ( !currentEditor() ) + return; + currentEditor()->undo(); +} + +void TextEdit::editRedo() +{ + if ( !currentEditor() ) + return; + currentEditor()->redo(); +} + +void TextEdit::editCut() +{ + if ( !currentEditor() ) + return; + currentEditor()->cut(); +} + +void TextEdit::editCopy() +{ + if ( !currentEditor() ) + return; + currentEditor()->copy(); +} + +void TextEdit::editPaste() +{ + if ( !currentEditor() ) + return; + currentEditor()->paste(); +} + +void TextEdit::textBold() +{ + if ( !currentEditor() ) + return; + currentEditor()->setBold( actionTextBold->isOn() ); +} + +void TextEdit::textUnderline() +{ + if ( !currentEditor() ) + return; + currentEditor()->setUnderline( actionTextUnderline->isOn() ); +} + +void TextEdit::textItalic() +{ + if ( !currentEditor() ) + return; + currentEditor()->setItalic( actionTextItalic->isOn() ); +} + +void TextEdit::textFamily( const TQString &f ) +{ + if ( !currentEditor() ) + return; + currentEditor()->setFamily( f ); + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::textSize( const TQString &p ) +{ + if ( !currentEditor() ) + return; + currentEditor()->setPointSize( p.toInt() ); + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::textStyle( int i ) +{ + if ( !currentEditor() ) + return; + if ( i == 0 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayBlock, TQStyleSheetItem::ListDisc ); + else if ( i == 1 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListDisc ); + else if ( i == 2 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListCircle ); + else if ( i == 3 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListSquare ); + else if ( i == 4 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListDecimal ); + else if ( i == 5 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListLowerAlpha ); + else if ( i == 6 ) + currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListUpperAlpha ); + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::textColor() +{ + if ( !currentEditor() ) + return; + TQColor col = TQColorDialog::getColor( currentEditor()->color(), this ); + if ( !col.isValid() ) + return; + currentEditor()->setColor( col ); + TQPixmap pix( 16, 16 ); + pix.fill( col ); + actionTextColor->setIconSet( pix ); +} + +void TextEdit::textAlign( TQAction *a ) +{ + if ( !currentEditor() ) + return; + if ( a == actionAlignLeft ) + currentEditor()->setAlignment( AlignLeft ); + else if ( a == actionAlignCenter ) + currentEditor()->setAlignment( AlignHCenter ); + else if ( a == actionAlignRight ) + currentEditor()->setAlignment( AlignRight ); + else if ( a == actionAlignJustify ) + currentEditor()->setAlignment( AlignJustify ); +} + +void TextEdit::fontChanged( const TQFont &f ) +{ + comboFont->lineEdit()->setText( f.family() ); + comboSize->lineEdit()->setText( TQString::number( f.pointSize() ) ); + actionTextBold->setOn( f.bold() ); + actionTextItalic->setOn( f.italic() ); + actionTextUnderline->setOn( f.underline() ); +} + +void TextEdit::colorChanged( const TQColor &c ) +{ + TQPixmap pix( 16, 16 ); + pix.fill( c ); + actionTextColor->setIconSet( pix ); +} + +void TextEdit::alignmentChanged( int a ) +{ + if ( ( a == AlignAuto ) || ( a & AlignLeft )) + actionAlignLeft->setOn( TRUE ); + else if ( ( a & AlignHCenter ) ) + actionAlignCenter->setOn( TRUE ); + else if ( ( a & AlignRight ) ) + actionAlignRight->setOn( TRUE ); + else if ( ( a & AlignJustify ) ) + actionAlignJustify->setOn( TRUE ); +} + +void TextEdit::editorChanged( TQWidget * ) +{ + if ( !currentEditor() ) + return; + fontChanged( currentEditor()->font() ); + colorChanged( currentEditor()->color() ); + alignmentChanged( currentEditor()->alignment() ); +} diff --git a/examples/demo/textdrawing/textedit.h b/examples/demo/textdrawing/textedit.h new file mode 100644 index 000000000..38c9c5b2d --- /dev/null +++ b/examples/demo/textdrawing/textedit.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TEXTEDIT_H +#define TEXTEDIT_H + +#include <qmainwindow.h> +#include <qmap.h> + +class TQAction; +class TQComboBox; +class TQTabWidget; +class TQTextEdit; + +class TextEdit : public TQMainWindow +{ + Q_OBJECT + +public: + TextEdit( TQWidget *parent = 0, const char *name = 0 ); + + TQTextEdit *currentEditor() const; + void load( const TQString &f ); + + +public slots: + void fileNew(); + void fileOpen(); + void fileSave(); + void fileSaveAs(); + void filePrint(); + void fileClose(); + void fileExit(); + + void editUndo(); + void editRedo(); + void editCut(); + void editCopy(); + void editPaste(); + + void textBold(); + void textUnderline(); + void textItalic(); + void textFamily( const TQString &f ); + void textSize( const TQString &p ); + void textStyle( int s ); + void textColor(); + void textAlign( TQAction *a ); + + void fontChanged( const TQFont &f ); + void colorChanged( const TQColor &c ); + void alignmentChanged( int a ); + void editorChanged( TQWidget * ); + + +private: + void setupFileActions(); + void setupEditActions(); + void setupTextActions(); + void doConnections( TQTextEdit *e ); + + TQAction *actionTextBold, + *actionTextUnderline, + *actionTextItalic, + *actionTextColor, + *actionAlignLeft, + *actionAlignCenter, + *actionAlignRight, + *actionAlignJustify; + TQComboBox *comboStyle, + *comboFont, + *comboSize; + TQTabWidget *tabWidget; + TQMap<TQTextEdit*, TQString> filenames; + +}; + + +#endif diff --git a/examples/demo/textdrawing/textitalic.png b/examples/demo/textdrawing/textitalic.png Binary files differnew file mode 100644 index 000000000..68e2b44ce --- /dev/null +++ b/examples/demo/textdrawing/textitalic.png diff --git a/examples/demo/textdrawing/textjustify.png b/examples/demo/textdrawing/textjustify.png Binary files differnew file mode 100644 index 000000000..1c6e5b952 --- /dev/null +++ b/examples/demo/textdrawing/textjustify.png diff --git a/examples/demo/textdrawing/textleft.png b/examples/demo/textdrawing/textleft.png Binary files differnew file mode 100644 index 000000000..30b05019e --- /dev/null +++ b/examples/demo/textdrawing/textleft.png diff --git a/examples/demo/textdrawing/textright.png b/examples/demo/textdrawing/textright.png Binary files differnew file mode 100644 index 000000000..73f1cad5d --- /dev/null +++ b/examples/demo/textdrawing/textright.png diff --git a/examples/demo/textdrawing/textunderline.png b/examples/demo/textdrawing/textunderline.png Binary files differnew file mode 100644 index 000000000..3477ccb33 --- /dev/null +++ b/examples/demo/textdrawing/textunderline.png diff --git a/examples/demo/textdrawing/undo.png b/examples/demo/textdrawing/undo.png Binary files differnew file mode 100644 index 000000000..d5b6c1634 --- /dev/null +++ b/examples/demo/textdrawing/undo.png diff --git a/examples/demo/translations/demo_ar.qm b/examples/demo/translations/demo_ar.qm Binary files differnew file mode 100644 index 000000000..fa1da4727 --- /dev/null +++ b/examples/demo/translations/demo_ar.qm diff --git a/examples/demo/translations/demo_ar.ts b/examples/demo/translations/demo_ar.ts new file mode 100644 index 000000000..5f0a3701a --- /dev/null +++ b/examples/demo/translations/demo_ar.ts @@ -0,0 +1,1492 @@ +<!DOCTYPE TS><TS> +<context> + <name>BookForm</name> + <message> + <source>Book</source> + <translation type="obsolete">كتاب</translation> + </message> + <message> + <source>Surname</source> + <translation type="obsolete">لقب</translation> + </message> + <message> + <source>surname</source> + <translation type="obsolete">لقب</translation> + </message> + <message> + <source>Forename</source> + <translation type="obsolete">إسم</translation> + </message> + <message> + <source>forename</source> + <translation type="obsolete">إسم</translation> + </message> + <message> + <source>surname ASC</source> + <translation type="obsolete">لقب</translation> + </message> + <message> + <source>forename ASC</source> + <translation type="obsolete">إسم</translation> + </message> + <message> + <source>(default)</source> + <translation type="obsolete">(Ø¥ÙØªØ±Ø§Ø¶ÙŠ)</translation> + </message> + <message> + <source>author</source> + <translation type="obsolete">مؤلّÙ</translation> + </message> + <message> + <source>Title</source> + <translation type="obsolete">عنوان</translation> + </message> + <message> + <source>title</source> + <translation type="obsolete">عنوان</translation> + </message> + <message> + <source>Price</source> + <translation type="obsolete">سعر</translation> + </message> + <message> + <source>price</source> + <translation type="obsolete">سعر</translation> + </message> + <message> + <source>Notes</source> + <translation type="obsolete">Ù…Ù„Ø§ØØ¸Ø§Øª</translation> + </message> + <message> + <source>notes</source> + <translation type="obsolete">Ù…Ù„Ø§ØØ¸Ø§Øª</translation> + </message> + <message> + <source>title ASC</source> + <translation type="obsolete">عنوان</translation> + </message> + <message> + <source>book</source> + <translation type="obsolete">كتاب</translation> + </message> + <message> + <source>&Connect...</source> + <translation type="obsolete">&وصل...</translation> + </message> + <message> + <source>&Edit Books</source> + <translation type="obsolete">ت&ØØ±ÙŠØ± الكتب</translation> + </message> +</context> +<context> + <name>ConnectDialog</name> + <message> + <source>Connect...</source> + <translation>وصل...</translation> + </message> + <message> + <source>Connection settings</source> + <translation>إعدادات الوصل</translation> + </message> + <message> + <source>Database Name:</source> + <translation>إسم قاعدة البيانات:</translation> + </message> + <message> + <source>&Username:</source> + <translation>إسم المست&عمل:</translation> + </message> + <message> + <source>&Password:</source> + <translation>&كلمة السّر:</translation> + </message> + <message> + <source>&Hostname:</source> + <translation>إسم الم&ضيÙ:</translation> + </message> + <message> + <source>P&ort:</source> + <translation>Ù…&Ù†ÙØ°:</translation> + </message> + <message> + <source>Default</source> + <translation>Ø¥ÙØªØ±Ø§Ø¶ÙŠ</translation> + </message> + <message> + <source>D&river</source> + <translation>&قائد</translation> + </message> + <message> + <source>&OK</source> + <translation>&مواÙقة</translation> + </message> + <message> + <source>&Cancel</source> + <translation>Ø¥&لغاء</translation> + </message> +</context> +<context> + <name>DnDDemo</name> + <message> + <source>copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished">نسخ</translation> + </message> + <message> + <source>cut</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cut</source> + <translation type="unfinished">قصّ</translation> + </message> + <message> + <source>paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Paste</source> + <translation type="unfinished">تلصيق</translation> + </message> + <message> + <source>raise</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Raise</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>lower</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Lower</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>new</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New</source> + <translation type="unfinished">جديد</translation> + </message> + <message> + <source>load</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save</source> + <translation type="unfinished">ØÙظ</translation> + </message> + <message> + <source>undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Undo</source> + <translation type="unfinished">تراجع</translation> + </message> + <message> + <source>redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Redo</source> + <translation type="unfinished">إعادة</translation> + </message> + <message> + <source>delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>help</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>home</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Home</source> + <translation type="unfinished">منزل</translation> + </message> + <message> + <source>Actions</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DnDDemoBase</name> + <message> + <source>Form1</source> + <translation>استمارة1</translation> + </message> +</context> +<context> + <name>EditBookForm</name> + <message> + <source>Edit Books</source> + <translation type="obsolete">ØªØØ±ÙŠØ± الكتب</translation> + </message> + <message> + <source>title ASC</source> + <translation type="obsolete">عنوان</translation> + </message> + <message> + <source>(default)</source> + <translation type="obsolete">(Ø¥ÙØªØ±Ø§Ø¶ÙŠ)</translation> + </message> + <message> + <source>book</source> + <translation type="obsolete">كتاب</translation> + </message> + <message> + <source>Price</source> + <translation type="obsolete">سعر</translation> + </message> + <message> + <source>Title</source> + <translation type="obsolete">عنوان</translation> + </message> + <message> + <source>title</source> + <translation type="obsolete">عنوان</translation> + </message> + <message> + <source>price</source> + <translation type="obsolete">سعر</translation> + </message> + <message> + <source>&Insert</source> + <translation type="obsolete">Ø¥&دراج</translation> + </message> + <message> + <source>&Update</source> + <translation type="obsolete">ØªØØ¯&يث</translation> + </message> + <message> + <source>&Delete</source> + <translation type="obsolete">&ØØ°Ù</translation> + </message> + <message> + <source>&Close</source> + <translation type="obsolete">Ø¥&غلاق</translation> + </message> + <message> + <source>|< &First</source> + <translation type="obsolete">|< ال&أوّل</translation> + </message> + <message> + <source><< &Prev</source> + <translation type="obsolete"><< ال&سّابق</translation> + </message> + <message> + <source>&Next >></source> + <translation type="obsolete">ال&تّالي >></translation> + </message> + <message> + <source>&Last >|</source> + <translation type="obsolete">الأ&خير >|</translation> + </message> + <message> + <source>Author</source> + <translation type="obsolete">مؤلّÙ</translation> + </message> + <message> + <source>author_view</source> + <translation type="obsolete">منظر المؤلّÙ</translation> + </message> + <message> + <source>name</source> + <translation type="obsolete">إسم</translation> + </message> +</context> +<context> + <name>FigureEditor</name> + <message> + <source>Drag the nodes around!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Frame</name> + <message> + <source>Qt Demo Collection</source> + <translation>مجموعة عرض Qt</translation> + </message> + <message> + <source>&Exit</source> + <translation>&خروج</translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation>تØÙƒÙ‘Ù…+Q</translation> + </message> + <message> + <source>&File</source> + <translation>&ملÙÙ‘</translation> + </message> + <message> + <source>St&yle</source> + <translation>&طراز</translation> + </message> + <message> + <source>Demo Categories</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Widgets</source> + <translation type="unfinished">ويدجت</translation> + </message> + <message> + <source>Drag and Drop</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>SQL Explorer</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Graph Drawing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Display</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>3D Demo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fractal landscape</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>OpenGL info</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Richtext Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Help Browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Internationalization</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Asteroids</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GLLandscape</name> + <message> + <source>Wireframe</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Flat shaded</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Smooth shaded</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Landscape</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GLLandscapeViewer</name> + <message> + <source>Qt/OpenGL example</source> + <translation>مثال عن Qt/OpenGL</translation> + </message> + <message> + <source>X-rotation</source> + <translation>دوران سيني</translation> + </message> + <message> + <source>Y-rotation</source> + <translation>دوران صادي</translation> + </message> + <message> + <source>Z-rotation</source> + <translation>دوران عيني</translation> + </message> + <message> + <source>Rendering mode</source> + <translation>نمط الارجاع</translation> + </message> + <message> + <source>&Wireframe</source> + <translation>ع&لبة التّوصيلات</translation> + </message> + <message> + <source>Fl&at shaded</source> + <translation>تظليل Ù…&ستوي</translation> + </message> + <message> + <source>&Smooth shaded</source> + <translation>تظليل Ø£&ملس</translation> + </message> + <message> + <source>&Landscape</source> + <translation>Ù…&نظر</translation> + </message> + <message> + <source>&Fractalize</source> + <translation>&كسر</translation> + </message> + <message> + <source>&Reset grid</source> + <translation>Ø¥&عادة وضع الشّبكة</translation> + </message> + <message> + <source>&Animate</source> + <translation>ت&ØØ±ÙŠÙƒ</translation> + </message> + <message> + <source>Zoom</source> + <translation>تكبير</translation> + </message> + <message> + <source>Size</source> + <translation>ØØ¬Ù…</translation> + </message> +</context> +<context> + <name>GLWorkspace</name> + <message> + <source>&Scene</source> + <translation>Ù…&شهد</translation> + </message> + <message> + <source>&New</source> + <translation>&جديد</translation> + </message> + <message> + <source>New</source> + <translation>جديد</translation> + </message> + <message> + <source>Wirebox</source> + <translation>علبة التّوصيلات</translation> + </message> + <message> + <source>&Wirebox</source> + <translation>ع&لبة التّوصيلات</translation> + </message> + <message> + <source>Gear</source> + <translation>ترس</translation> + </message> + <message> + <source>&Gears</source> + <translation>ت&روس</translation> + </message> + <message> + <source>Texture</source> + <translation>ØØ¨ÙƒØ©</translation> + </message> + <message> + <source>&Texture</source> + <translation>&ØØ¨ÙƒØ©</translation> + </message> + <message> + <source>&Print</source> + <translation>&طبع</translation> + </message> + <message> + <source>Print</source> + <translation>طبع</translation> + </message> + <message> + <source>Window Size</source> + <translation>ØØ¬Ù… Ø§Ù„Ù†Ù‘Ø§ÙØ°Ø©</translation> + </message> + <message> + <source>&Window Size</source> + <translation>ØØ¬Ù… ال&Ù†Ù‘Ø§ÙØ°Ø©</translation> + </message> + <message> + <source>Low Resolution</source> + <translation>تمييز Ù…Ù†Ø®ÙØ¶</translation> + </message> + <message> + <source>&Low Resolution</source> + <translation>تمييز من&Ø®ÙØ¶</translation> + </message> + <message> + <source>Medium Resolution</source> + <translation>تمييز متوسّط</translation> + </message> + <message> + <source>&Medium Resolution</source> + <translation>تمييز مت&وسّط</translation> + </message> + <message> + <source>High Resolution</source> + <translation>تمييز عالي</translation> + </message> + <message> + <source>&High Resolution</source> + <translation>تمييز &عالي</translation> + </message> + <message> + <source>Setup</source> + <translation>إعداد</translation> + </message> + <message> + <source>&Setup...</source> + <translation>إع&داد...</translation> + </message> + <message> + <source>Close</source> + <translation>إغلاق</translation> + </message> + <message> + <source>&Close</source> + <translation>Ø¥&غلاق</translation> + </message> + <message> + <source>WireBox</source> + <translation type="obsolete">علبة التّوصيلات</translation> + </message> + <message> + <source>Nurbs</source> + <translation>نرب</translation> + </message> +</context> +<context> + <name>HelpWindow</name> + <message> + <source>&New Window</source> + <translation>Ù†Ø§ÙØ°Ø© &جديدة</translation> + </message> + <message> + <source>&Open File</source> + <translation>&ÙØªØ ملÙÙ‘</translation> + </message> + <message> + <source>&Print</source> + <translation>&طبع</translation> + </message> + <message> + <source>&Backward</source> + <translation>لل&وراء</translation> + </message> + <message> + <source>&Forward</source> + <translation>لل&أمام</translation> + </message> + <message> + <source>&Home</source> + <translation>Ù…&نزل</translation> + </message> + <message> + <source>Add Bookmark</source> + <translation>Ø¥Ø¶Ø§ÙØ© مؤشّر</translation> + </message> + <message> + <source>&File</source> + <translation>&ملÙÙ‘</translation> + </message> + <message> + <source>&Go</source> + <translation>Ø¥&ذهب</translation> + </message> + <message> + <source>History</source> + <translation>تاريخ</translation> + </message> + <message> + <source>Bookmarks</source> + <translation>مؤشّرات</translation> + </message> + <message> + <source>Backward</source> + <translation>للوراء</translation> + </message> + <message> + <source>Forward</source> + <translation>للأمام</translation> + </message> + <message> + <source>Home</source> + <translation>منزل</translation> + </message> +</context> +<context> + <name>I18nDemo</name> + <message> + <source>Close the current window.</source> + <translation>إغلاق Ø§Ù„Ù†Ù‘Ø§ÙØ°Ø© الجارية.</translation> + </message> + <message> + <source>Close</source> + <translation>إغلاق</translation> + </message> + <message> + <source>Close all opened windows.</source> + <translation>إغلاق جميع Ø§Ù„Ù†Ù‘ÙˆØ§ÙØ° Ø§Ù„Ù…ÙØªÙˆØØ©.</translation> + </message> + <message> + <source>Close All</source> + <translation>إغلاق الجميع</translation> + </message> + <message> + <source>Tile opened windows.</source> + <translation>تطويب Ø§Ù„Ù†Ù‘ÙˆØ§ÙØ° Ø§Ù„Ù…ÙØªÙˆØØ©.</translation> + </message> + <message> + <source>Tile</source> + <translation>تطويب</translation> + </message> + <message> + <source>Cascade opened windows.</source> + <translation>تشليل Ø§Ù„Ù†Ù‘ÙˆØ§ÙØ° Ø§Ù„Ù…ÙØªÙˆØØ©.</translation> + </message> + <message> + <source>Cascade</source> + <translation>تشليل</translation> + </message> + <message> + <source>--language--</source> + <translation>--اللّغة--</translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p></source> + <translation type="obsolete"><h3>ØÙˆÙ„ Qt</h3><p>هذا البرنامج يستعمل Qt إصدار %1ØŒ طقم أدوات C++ لتطوير البرامج البيانية على جميع المنصّات من شركة ترولتك. Qt توÙّر إمكانية ØÙ…Ù„ Ù†ÙØ³ المصدر إلى ويندوز95\98\NT\2000 ØŒ لينكس، سولاريس، HP-UX Ùˆ العديد من الإصدارات الأخرى ليونيكس مع X11. أنظر <tt>http://www.trolltech.com/qt/</tt> للمزيد من المعلومات.</p></translation> + </message> + <message> + <source>&New</source> + <translation type="unfinished">&جديد</translation> + </message> + <message> + <source>&Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11.</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KAstTopLevel</name> + <message> + <source>Score</source> + <translation>ØØ§ØµÙ„</translation> + </message> + <message> + <source>Level</source> + <translation>مستوى</translation> + </message> + <message> + <source>Ships</source> + <translation>مركبات</translation> + </message> + <message> + <source>Fuel</source> + <translation>وقود</translation> + </message> + <message> + <source>Press N to start playing</source> + <translation>إضغط على N لبدأ اللّعب</translation> + </message> + <message> + <source>Ship Destroyed. Press L to launch.</source> + <translation>دمّرت المركبة، إضغط على L للإطلاق.</translation> + </message> + <message> + <source>Game Over!</source> + <translation>انتهت اللّعبة!</translation> + </message> +</context> +<context> + <name>KAsteroidsView</name> + <message> + <source>QCanvas demo</source> + <translation>عرض QCanvas</translation> + </message> + <message> + <source>This game has been implemented using the QCanvas class. +The QCanvas class is not part of the Professional Edition. Please +contact Trolltech if you want to upgrade to the Enterprise Edition.</source> + <translation>تمّ إنجاز هذه اللّعبة باستعمال ÙØµÙŠÙ„Ø© QCanvas. +ÙØµÙŠÙ„Ø© QCanvas ليست جزء من Ø§Ù„ØªÙ‘ØØ±ÙŠØ±Ø© Ø§Ù„Ø§ØØªØ±Ø§Ùية. ØªÙØ¶Ù‘Ù„ +بالإتّصال بترولتك إن أردت التّرÙيع إلى ØªØØ±ÙŠØ±Ø© الشّركات.</translation> + </message> + <message> + <source>Error: Cannot read sprite images</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PrintPreview</name> + <message> + <source>Print Preview</source> + <translation>مراجعة الطّبع</translation> + </message> + <message> + <source>Preview</source> + <translation>مراجعة</translation> + </message> + <message> + <source>TextLabel1</source> + <translation>علامة النّص 1</translation> + </message> + <message> + <source>Modify</source> + <translation>تعديل</translation> + </message> + <message> + <source>&Invert Colors</source> + <translation>&عكس الألوان</translation> + </message> + <message> + <source>&Mirror</source> + <translation>Ù…&رآة</translation> + </message> + <message> + <source>&Flip</source> + <translation>&قلب</translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &left</source> + <translation>دوران ب 90° للي&سار</translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &right</source> + <translation>دوران ب 90° للي&مين</translation> + </message> + <message> + <source>&Help</source> + <translation>مساع&دة</translation> + </message> + <message> + <source>&Print</source> + <translation>&طبع</translation> + </message> + <message> + <source>&Discard</source> + <translation>&نبذ</translation> + </message> +</context> +<context> + <name>SqlEx</name> + <message> + <source>Form1</source> + <translation>استمارة1</translation> + </message> + <message> + <source>Tables</source> + <translation>جداول</translation> + </message> + <message> + <source>Type</source> + <translation>طراز</translation> + </message> + <message> + <source>Retquired</source> + <translation>مطلوب</translation> + </message> + <message> + <source>SQL Query</source> + <translation>استÙهام SQL</translation> + </message> + <message> + <source>&Submit</source> + <translation>&بعث</translation> + </message> + <message> + <source>C&lear</source> + <translation>&Ù…ØÙˆ</translation> + </message> + <message> + <source>Press "Connect" to open a database</source> + <translation>إضغط على "وصل" Ù„ÙØªØ قاعدة بيانات</translation> + </message> + <message> + <source>&Connect...</source> + <translation>&وصل...</translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <source>&File</source> + <translation>&ملÙÙ‘</translation> + </message> + <message> + <source>New</source> + <translation>جديد</translation> + </message> + <message> + <source>&New...</source> + <translation>&جديد...</translation> + </message> + <message> + <source>Open</source> + <translation>ÙØªØ</translation> + </message> + <message> + <source>&Open...</source> + <translation>&ÙØªØ...</translation> + </message> + <message> + <source>Save</source> + <translation>ØÙظ</translation> + </message> + <message> + <source>&Save...</source> + <translation>ØÙ&ظ...</translation> + </message> + <message> + <source>Save As</source> + <translation>ØÙظ ØªØØª</translation> + </message> + <message> + <source>Save &As...</source> + <translation>ØÙظ &ØªØØª...</translation> + </message> + <message> + <source>Print</source> + <translation>طبع</translation> + </message> + <message> + <source>&Print...</source> + <translation>طب&ع...</translation> + </message> + <message> + <source>Close</source> + <translation>إغلاق</translation> + </message> + <message> + <source>&Close</source> + <translation>Ø¥&غلاق</translation> + </message> + <message> + <source>&Edit</source> + <translation>ت&ØØ±ÙŠØ±</translation> + </message> + <message> + <source>Undo</source> + <translation>تراجع</translation> + </message> + <message> + <source>&Undo</source> + <translation>&تراجع</translation> + </message> + <message> + <source>Redo</source> + <translation>إعادة</translation> + </message> + <message> + <source>&Redo</source> + <translation>إعا&دة</translation> + </message> + <message> + <source>Cut</source> + <translation>قصّ</translation> + </message> + <message> + <source>&Cut</source> + <translation>&قصّ</translation> + </message> + <message> + <source>Copy</source> + <translation>نسخ</translation> + </message> + <message> + <source>C&opy</source> + <translation>&نسخ</translation> + </message> + <message> + <source>Paste</source> + <translation>تلصيق</translation> + </message> + <message> + <source>&Paste</source> + <translation>ت&لصيق</translation> + </message> + <message> + <source>For&mat</source> + <translation>&طراز</translation> + </message> + <message> + <source>Standard</source> + <translation>قياسي</translation> + </message> + <message> + <source>Bullet List (Disc)</source> + <translation>قائمة مطّية (قرص)</translation> + </message> + <message> + <source>Bullet List (Circle)</source> + <translation>قائمة مطّية (دائرة)</translation> + </message> + <message> + <source>Bullet List (Square)</source> + <translation>قائمة مطّية (مربّع)</translation> + </message> + <message> + <source>Ordered List (Decimal)</source> + <translation>قائمة مرتّبة (عشرية)</translation> + </message> + <message> + <source>Ordered List (Alpha lower)</source> + <translation>قائمة مرتّبة (Ø£Ù„Ù Ù„Ù„ØªØØª)</translation> + </message> + <message> + <source>Ordered List (Alpha upper)</source> + <translation>قائمة مرتّبة (أل٠للÙوق)</translation> + </message> + <message> + <source>Bold</source> + <translation>بيّن</translation> + </message> + <message> + <source>&Bold</source> + <translation>&بيّن</translation> + </message> + <message> + <source>Italic</source> + <translation>مائل</translation> + </message> + <message> + <source>&Italic</source> + <translation>ما&ئل</translation> + </message> + <message> + <source>Underline</source> + <translation>تسطير</translation> + </message> + <message> + <source>&Underline</source> + <translation>تسطي&ر</translation> + </message> + <message> + <source>Left</source> + <translation>يسار</translation> + </message> + <message> + <source>&Left</source> + <translation>ÙŠ&سار</translation> + </message> + <message> + <source>Center</source> + <translation>توسيط</translation> + </message> + <message> + <source>C&enter</source> + <translation>ت&وسيط</translation> + </message> + <message> + <source>Right</source> + <translation>يمين</translation> + </message> + <message> + <source>&Right</source> + <translation>&يمين</translation> + </message> + <message> + <source>Justify</source> + <translation>ضبط الهامش</translation> + </message> + <message> + <source>&Justify</source> + <translation>ضبط ال&هامش</translation> + </message> + <message> + <source>Color</source> + <translation>لون</translation> + </message> + <message> + <source>&Color...</source> + <translation>&لون...</translation> + </message> + <message> + <source>noname</source> + <translation>دون إسم</translation> + </message> + <message> + <source>HTML-Files (*.htm *.html);;All Files (*)</source> + <translation>ملÙّات (html htm);;جميع الملÙّات (*)</translation> + </message> +</context> +<context> + <name>WidgetsBase</name> + <message> + <source>Widgets</source> + <translation>ويدجت</translation> + </message> + <message> + <source>Applix</source> + <translation>أبليكس</translation> + </message> + <message> + <source>Binary</source> + <translation>ثنائي</translation> + </message> + <message> + <source>Core</source> + <translation>نواة</translation> + </message> + <message> + <source>Deb</source> + <translation>Deb</translation> + </message> + <message> + <source>Document</source> + <translation>وثيقة</translation> + </message> + <message> + <source>Pdf</source> + <translation>Pdf</translation> + </message> + <message> + <source>Readme</source> + <translation>إقرأني</translation> + </message> + <message> + <source>Shellscript</source> + <translation>سلسلة البرنامج الوسيطي</translation> + </message> + <message> + <source>Recycled</source> + <translation>مسترجع</translation> + </message> + <message> + <source>Video</source> + <translation>Ùيديو</translation> + </message> + <message> + <source><p><h1><b><font size="5" >Richtext </h1> +</p><p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation type="obsolete"><p><h1><b><font size="5" >نصّ غنيّ</h1> +</p><p>Qt تدعم النّصوص الغنيّة المقاسة، كالعنوان Ø§Ù„Ø¢Ù†ÙØŒ النّصوص <i><font >المائلة</font></i>ØŒ <b><font >البيّنة </font></b>Ùˆ <u><font >المسطّرة</font></u>ØŒ كما تدعم النّصوص الملوّنة كذلك. هذا <font color="#ff0000" >Ø£ØÙ…ر</font>ØŒ بينما هذا <font color="#00bb00" >أخضر</font>ØŒ Ùˆ هذا <font color="#0000ff" >أزرق</font>. +</p> +<> </></translation> + </message> + <message> + <source>Iconview</source> + <translation>منظر بالإيقونات</translation> + </message> + <message> + <source>Item 1</source> + <translation>البند 1</translation> + </message> + <message> + <source>Item 2</source> + <translation>البند 2</translation> + </message> + <message> + <source>Item 3</source> + <translation>البند 3</translation> + </message> + <message> + <source>Item 4</source> + <translation>البند 4</translation> + </message> + <message> + <source>Item 5</source> + <translation>البند 5</translation> + </message> + <message> + <source>Item 6</source> + <translation>البند 6</translation> + </message> + <message> + <source>Item 7</source> + <translation>البند 7</translation> + </message> + <message> + <source>Item 8</source> + <translation>البند 8</translation> + </message> + <message> + <source>Item 9</source> + <translation>البند 9</translation> + </message> + <message> + <source>Item 10</source> + <translation>البند 10</translation> + </message> + <message> + <source>Item 11</source> + <translation>البند 11</translation> + </message> + <message> + <source>Item 12</source> + <translation>البند 12</translation> + </message> + <message> + <source>Item 13</source> + <translation>البند 13</translation> + </message> + <message> + <source>Item 14</source> + <translation>البند 14</translation> + </message> + <message> + <source>Item 15</source> + <translation>البند 15</translation> + </message> + <message> + <source>Item 16</source> + <translation>البند 16</translation> + </message> + <message> + <source>Item 17</source> + <translation>البند 17</translation> + </message> + <message> + <source>Table</source> + <translation>جدول</translation> + </message> + <message> + <source>Tables</source> + <translation>جداول</translation> + </message> + <message> + <source>are</source> + <translation>تكون</translation> + </message> + <message> + <source>easy</source> + <translation>سهل</translation> + </message> + <message> + <source>with</source> + <translation>مع</translation> + </message> + <message> + <source>Qt</source> + <translation>Qt</translation> + </message> + <message> + <source>6</source> + <translation type="obsolete">6</translation> + </message> + <message> + <source>7</source> + <translation type="obsolete">7</translation> + </message> + <message> + <source>8</source> + <translation type="obsolete">8</translation> + </message> + <message> + <source>9</source> + <translation type="obsolete">9</translation> + </message> + <message> + <source>10</source> + <translation type="obsolete">10</translation> + </message> + <message> + <source>11</source> + <translation type="obsolete">11</translation> + </message> + <message> + <source>12</source> + <translation type="obsolete">12</translation> + </message> + <message> + <source>4</source> + <translation type="obsolete">4</translation> + </message> + <message> + <source>5</source> + <translation type="obsolete">5</translation> + </message> + <message> + <source>13</source> + <translation type="obsolete">13</translation> + </message> + <message> + <source>Listview</source> + <translation>منظر بالقائمة</translation> + </message> + <message> + <source>Things</source> + <translation>أشياء</translation> + </message> + <message> + <source>Text</source> + <translation>نصّ</translation> + </message> + <message> + <source>Stuff</source> + <translation>ØØ§Ø¬Ø©</translation> + </message> + <message> + <source>Airbrush</source> + <translation>ÙØ±Ø´Ø§Ø© هوائية</translation> + </message> + <message> + <source>What stuff?</source> + <translation>أيّ ØØ§Ø¬Ø©ØŸ</translation> + </message> + <message> + <source>Eraser</source> + <translation>Ù…Ù…ØØ§Ø©</translation> + </message> + <message> + <source>Here?</source> + <translation>هنا؟</translation> + </message> + <message> + <source>Pixmap item</source> + <translation>بند لخريطة عناصر الصّورة</translation> + </message> + <message> + <source>Nothing</source> + <translation>لا شيء</translation> + </message> + <message> + <source>Nothing Again</source> + <translation>لا شيء مجدّدا</translation> + </message> + <message> + <source>Pixmap subitem 1</source> + <translation>بند ØªØØªÙŠ Ù„Ø®Ø±ÙŠØ·Ø© عناصر الصّورة 1</translation> + </message> + <message> + <source>Subitem</source> + <translation>بند ØªØØªÙŠ</translation> + </message> + <message> + <source>Pixmap subitem 2 </source> + <translation>بند ØªØØªÙŠ Ù„Ø®Ø±ÙŠØ·Ø© عناصر الصّورة 2</translation> + </message> + <message> + <source>Group box</source> + <translation>علبة المجموعة</translation> + </message> + <message> + <source>Pick a base color:</source> + <translation>اختر لونا قاعديّا:</translation> + </message> + <message> + <source>&Reset colors</source> + <translation>Ø¥&عادة وضع الألوان</translation> + </message> + <message> + <source>pale green</source> + <translation>أخضر Ø´Ø§ØØ¨</translation> + </message> + <message> + <source>deep sky blue</source> + <translation>أزرق سماوي عميق</translation> + </message> + <message> + <source>steel blue</source> + <translation>أزرق Ùولاذي</translation> + </message> + <message> + <source>powder blue</source> + <translation>أزرق مسØÙˆÙ‚ÙŠ</translation> + </message> + <message> + <source>sandy brown</source> + <translation>بنّي رملي</translation> + </message> + <message> + <source>dark orange</source> + <translation>برتقالي داكن</translation> + </message> + <message> + <source>indian red</source> + <translation>Ø£ØÙ…ر هندي</translation> + </message> + <message> + <source>hot pink</source> + <translation>وردي ØØ§Ø±Ù‘</translation> + </message> + <message> + <source>Enter a color name and hit return:</source> + <translation>أدخل إسم لون Ùˆ إظغط على عودة:</translation> + </message> + <message> + <source>Color test area</source> + <translation>منطقة تجربة اللّون</translation> + </message> + <message> + <source>Check boxes</source> + <translation>علب Ø§Ù„ÙØØµ</translation> + </message> + <message> + <source>Apples</source> + <translation>تÙّاØ</translation> + </message> + <message> + <source>Banana</source> + <translation>موزة</translation> + </message> + <message> + <source>Orange</source> + <translation>برتقالي</translation> + </message> + <message> + <source>Radio buttons</source> + <translation>أزرار إذاعية</translation> + </message> + <message> + <source>Sprite</source> + <translation>شبØ</translation> + </message> + <message> + <source>Farris</source> + <translation>ÙØ§Ø±ÙŠØ³</translation> + </message> + <message> + <source>Solo</source> + <translation>ÙˆØÙŠØ¯</translation> + </message> + <message> + <source>Date/Time editors</source> + <translation>Ø§Ù„Ù…ØØ±Ù‘رات تاريخ\زمن</translation> + </message> + <message> + <source>DateTime string goes here!</source> + <translation>السّلسلة تاريخ\زمن تأتي هنا!</translation> + </message> + <message> + <source><h1><b><font size="4" >Richtext </h1> +<p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation type="obsolete"><p><h1><b><font size="4" >نصّ غنيّ</h1> +</p><p>Qt تدعم النّصوص الغنيّة المقاسة، كالعنوان Ø§Ù„Ø¢Ù†ÙØŒ النّصوص <i><font >المائلة</font></i>ØŒ <b><font >البيّنة </font></b>Ùˆ <u><font >المسطّرة</font></u>ØŒ كما تدعم النّصوص الملوّنة كذلك. هذا <font color="#ff0000" >Ø£ØÙ…ر</font>ØŒ بينما هذا <font color="#00bb00" >أخضر</font>ØŒ Ùˆ هذا <font color="#0000ff" >أزرق</font>. +</p> +<> </></translation> + </message> + <message> + <source>Check Boxes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apple</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cherry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Radio Buttons</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Whisky</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wine</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Water</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Date/Time Editors</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Group Box</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter a color and hit return:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head><meta name="qrichtext" content="1" /></head><body style="font-size:8pt;font-family:MS Shell Dlg"> +<p style="margin-top:16px"><span style="font-size:12pt;font-weight:600">Rich Text</span></p> +<p>Qt supports rich text. This is <span style="font-style:italic">italics</span>, this is <span style="font-weight:600">bold</span>, this is <span style="text-decoration:underline">underlined</span>, this is <span style="color:#ff0000">red</span>, this is <span style="color:#00ff00">green</span>, and this is <span style="color:#0000ff">blue</span>.</p> +</body></html> +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Icon View</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List View</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Standard paint tool</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Inbox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>143 messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>(5 new)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Local</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Draft #1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><html><head><meta name="qrichtext" content="1" /></head><body style="font-size:8pt;font-family:MS Shell Dlg"> +<p style="margin-top:18px"><span style="font-size:9pt;font-weight:600">Richtext </span></p> +<p>Qt supports formatted rich text, such as the heading above, <span style="font-style:italic">emphasized</span>, <span style="font-weight:600">bold </span>and <span style="text-decoration:underline">underlined </span>text, as well as colored text. This is <span style="color:#ff0000">red</span>, while this is <span style="color:#00bb00">green</span>, and this is <span style="color:#0000ff">blue</span>. </p> +</body></html> +</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/demo/translations/demo_de.qm b/examples/demo/translations/demo_de.qm Binary files differnew file mode 100644 index 000000000..bc1d3d8ab --- /dev/null +++ b/examples/demo/translations/demo_de.qm diff --git a/examples/demo/translations/demo_de.ts b/examples/demo/translations/demo_de.ts new file mode 100644 index 000000000..5b7e6b577 --- /dev/null +++ b/examples/demo/translations/demo_de.ts @@ -0,0 +1,1183 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>BookForm</name> + <message encoding="UTF-8"> + <source>Book</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Surname</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>surname</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Forename</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>forename</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>surname ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>forename ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>(default)</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>author</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Notes</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>notes</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>book</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Connect...</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Edit Books</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>ConnectDialog</name> + <message encoding="UTF-8"> + <source>Connect...</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Connection settings</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Database Name:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Username:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Password:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>P&ort:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>D&river</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&OK</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>DnDDemoBase</name> + <message encoding="UTF-8"> + <source>Form1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>EditBookForm</name> + <message encoding="UTF-8"> + <source>Edit Books</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>(default)</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>book</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Insert</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Update</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Delete</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>|< &First</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source><< &Prev</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Next >></source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Last >|</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Author</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>author_view</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Frame</name> + <message> + <source>Qt Demo Collection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Exit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation>&Datei</translation> + </message> + <message> + <source>St&yle</source> + <translation>St&yle</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>GLLandscapeViewer</name> + <message encoding="UTF-8"> + <source>Qt/OpenGL example</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>X-rotation</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Y-rotation</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Z-rotation</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Rendering mode</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Wireframe</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Fl&at shaded</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Smooth shaded</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Landscape</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Fractalize</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Reset grid</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Animate</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Size</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GLWorkspace</name> + <message> + <source>&Scene</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&New</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wirebox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Wirebox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Gear</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Gears</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Texture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Texture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Window Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Low Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Low Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Medium Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Medium Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>High Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&High Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Setup...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>WireBox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Nurbs</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>HelpWindow</name> + <message> + <source>&New Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Open File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Backward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Forward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Home</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished">&Datei</translation> + </message> + <message> + <source>&Go</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>History</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bookmarks</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Backward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Home</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>I18nDemo</name> + <message> + <source>Close the current window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close all opened windows.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tile opened windows.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cascade opened windows.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cascade</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>--language--</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KAstTopLevel</name> + <message> + <source>Score</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ships</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fuel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Press N to start playing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ship Destroyed. Press L to launch.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Game Over!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KAsteroidsView</name> + <message> + <source>QCanvas demo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This game has been implemented using the QCanvas class. +The QCanvas class is not part of the Professional Edition. Please +contact Trolltech if you want to upgrade to the Enterprise Edition.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>PrintPreview</name> + <message encoding="UTF-8"> + <source>Print Preview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>TextLabel1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Modify</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Invert Colors</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Mirror</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Flip</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &left</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &right</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Help</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Print</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Discard</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>SqlEx</name> + <message encoding="UTF-8"> + <source>Form1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Tables</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Retquired</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>SQL Query</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Submit</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>C&lear</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Press "Connect" to open a database</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Connect...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <source>&File</source> + <translation type="unfinished">&Datei</translation> + </message> + <message> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&New...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Open...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Save...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save As</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save &As...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cut</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Cut</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C&opy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>For&mat</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Standard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bullet List (Disc)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bullet List (Circle)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bullet List (Square)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ordered List (Decimal)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ordered List (Alpha lower)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ordered List (Alpha upper)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bold</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Bold</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Italic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Italic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Underline</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Underline</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Center</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C&enter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Justify</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Justify</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Color...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>noname</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HTML-Files (*.htm *.html);;All Files (*)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>WidgetsBase</name> + <message encoding="UTF-8"> + <source>Widgets</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Applix</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Binary</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Core</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Deb</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Document</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pdf</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Readme</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Shellscript</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Recycled</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Video</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source><p><h1><b><font size="5" >Richtext </h1> +</p><p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Iconview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 2</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 3</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 4</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 5</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 6</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 7</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 8</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 9</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 10</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 11</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 12</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 13</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 14</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 15</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 16</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 17</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Table</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Tables</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>are</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>easy</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>with</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Qt</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>6</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>7</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>9</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>10</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>11</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>12</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>4</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>5</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>13</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Listview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Things</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Text</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Stuff</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Airbrush</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>What stuff?</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Eraser</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Here?</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap item</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Nothing</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Nothing Again</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap subitem 1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Subitem</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap subitem 2 </source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Group box</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pick a base color:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Reset colors</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>pale green</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>deep sky blue</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>steel blue</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>powder blue</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>sandy brown</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>dark orange</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>indian red</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>hot pink</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Enter a color name and hit return:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Color test area</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Check boxes</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Apples</source> + <translation>Äpfel</translation> + </message> + <message encoding="UTF-8"> + <source>Banana</source> + <translation>Banane</translation> + </message> + <message encoding="UTF-8"> + <source>Orange</source> + <translation>Orange</translation> + </message> + <message encoding="UTF-8"> + <source>Radio buttons</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Sprite</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Farris</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Solo</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Date/Time editors</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>DateTime string goes here!</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source><h1><b><font size="4" >Richtext </h1> +<p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/demo/translations/demo_fr.qm b/examples/demo/translations/demo_fr.qm Binary files differnew file mode 100644 index 000000000..6bd22c41d --- /dev/null +++ b/examples/demo/translations/demo_fr.qm diff --git a/examples/demo/translations/demo_fr.ts b/examples/demo/translations/demo_fr.ts new file mode 100644 index 000000000..82bdc1910 --- /dev/null +++ b/examples/demo/translations/demo_fr.ts @@ -0,0 +1,1183 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>BookForm</name> + <message encoding="UTF-8"> + <source>Book</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Surname</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>surname</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Forename</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>forename</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>surname ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>forename ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>(default)</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>author</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Notes</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>notes</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>book</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Connect...</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Edit Books</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>ConnectDialog</name> + <message encoding="UTF-8"> + <source>Connect...</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Connection settings</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Database Name:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Username:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Password:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>P&ort:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>D&river</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&OK</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>DnDDemoBase</name> + <message encoding="UTF-8"> + <source>Form1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>EditBookForm</name> + <message encoding="UTF-8"> + <source>Edit Books</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title ASC</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>(default)</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>book</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>title</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>price</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Insert</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Update</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Delete</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>|< &First</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source><< &Prev</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Next >></source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Last >|</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Author</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>author_view</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Frame</name> + <message> + <source>Qt Demo Collection</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Exit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>St&yle</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>GLLandscapeViewer</name> + <message encoding="UTF-8"> + <source>Qt/OpenGL example</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>X-rotation</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Y-rotation</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Z-rotation</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Rendering mode</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Wireframe</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Fl&at shaded</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Smooth shaded</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Landscape</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Fractalize</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Reset grid</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Animate</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Size</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GLWorkspace</name> + <message> + <source>&Scene</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&New</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wirebox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Wirebox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Gear</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Gears</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Texture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Texture</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Window Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Low Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Low Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Medium Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Medium Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>High Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&High Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Setup...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>WireBox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Nurbs</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>HelpWindow</name> + <message> + <source>&New Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Open File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Backward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Forward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Home</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Go</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>History</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bookmarks</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Backward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forward</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Home</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>I18nDemo</name> + <message> + <source>Close the current window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close all opened windows.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close All</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tile opened windows.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Tile</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cascade opened windows.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cascade</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>--language--</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KAstTopLevel</name> + <message> + <source>Score</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ships</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fuel</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Press N to start playing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ship Destroyed. Press L to launch.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Game Over!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KAsteroidsView</name> + <message> + <source>QCanvas demo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This game has been implemented using the QCanvas class. +The QCanvas class is not part of the Professional Edition. Please +contact Trolltech if you want to upgrade to the Enterprise Edition.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>PrintPreview</name> + <message encoding="UTF-8"> + <source>Print Preview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Preview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>TextLabel1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Modify</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Invert Colors</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Mirror</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Flip</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &left</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &right</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Help</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Print</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Discard</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>SqlEx</name> + <message encoding="UTF-8"> + <source>Form1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Tables</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Retquired</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>SQL Query</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Submit</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>C&lear</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Press "Connect" to open a database</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Connect...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&New...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Open...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Save...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save As</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save &As...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Print...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cut</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Cut</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C&opy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>For&mat</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Standard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bullet List (Disc)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bullet List (Circle)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bullet List (Square)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ordered List (Decimal)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ordered List (Alpha lower)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ordered List (Alpha upper)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Bold</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Bold</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Italic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Italic</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Underline</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Underline</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Center</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>C&enter</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Justify</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Justify</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Color</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Color...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>noname</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>HTML-Files (*.htm *.html);;All Files (*)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context encoding="UTF-8"> + <name>WidgetsBase</name> + <message encoding="UTF-8"> + <source>Widgets</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Applix</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Binary</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Core</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Deb</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Document</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pdf</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Readme</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Shellscript</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Recycled</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Video</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source><p><h1><b><font size="5" >Richtext </h1> +</p><p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Iconview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 2</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 3</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 4</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 5</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 6</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 7</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 8</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 9</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 10</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 11</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 12</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 13</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 14</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 15</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 16</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Item 17</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Table</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Tables</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>are</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>easy</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>with</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Qt</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>6</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>7</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>9</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>10</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>11</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>12</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>4</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>5</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>13</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Listview</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Things</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Text</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Stuff</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Airbrush</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>What stuff?</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Eraser</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Here?</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap item</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Nothing</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Nothing Again</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap subitem 1</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Subitem</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap subitem 2 </source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Group box</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Pick a base color:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>&Reset colors</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>pale green</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>deep sky blue</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>steel blue</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>powder blue</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>sandy brown</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>dark orange</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>indian red</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>hot pink</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Enter a color name and hit return:</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Color test area</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Check boxes</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Apples</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Banana</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Orange</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Radio buttons</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Sprite</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Farris</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Solo</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>Date/Time editors</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source>DateTime string goes here!</source> + <translation type="unfinished"></translation> + </message> + <message encoding="UTF-8"> + <source><h1><b><font size="4" >Richtext </h1> +<p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/demo/translations/demo_he.qm b/examples/demo/translations/demo_he.qm Binary files differnew file mode 100644 index 000000000..34478f16b --- /dev/null +++ b/examples/demo/translations/demo_he.qm diff --git a/examples/demo/translations/demo_he.ts b/examples/demo/translations/demo_he.ts new file mode 100644 index 000000000..112414a09 --- /dev/null +++ b/examples/demo/translations/demo_he.ts @@ -0,0 +1,1189 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>BookForm</name> + <message encoding="UTF-8"> + <source>Book</source> + <translation>ספר</translation> + </message> + <message encoding="UTF-8"> + <source>Surname</source> + <translation>×©× ×ž×©×¤×—×”</translation> + </message> + <message encoding="UTF-8"> + <source>surname</source> + <translation>×©× ×ž×©×¤×—×”</translation> + </message> + <message encoding="UTF-8"> + <source>Forename</source> + <translation>×©× ×¤×¨×˜×™</translation> + </message> + <message encoding="UTF-8"> + <source>forename</source> + <translation>×©× ×¤×¨×˜×™</translation> + </message> + <message encoding="UTF-8"> + <source>surname ASC</source> + <translation>×©× ×ž×©×¤×—×” ASC</translation> + </message> + <message encoding="UTF-8"> + <source>forename ASC</source> + <translation>×©× ×¤×¨×˜×™ ASC</translation> + </message> + <message encoding="UTF-8"> + <source>(default)</source> + <translation>(ברירת מחדל)</translation> + </message> + <message encoding="UTF-8"> + <source>author</source> + <translation>מחבר</translation> + </message> + <message encoding="UTF-8"> + <source>Title</source> + <translation>כותרת</translation> + </message> + <message encoding="UTF-8"> + <source>title</source> + <translation>כותרת</translation> + </message> + <message encoding="UTF-8"> + <source>Price</source> + <translation>מחיר</translation> + </message> + <message encoding="UTF-8"> + <source>price</source> + <translation>מחיר</translation> + </message> + <message encoding="UTF-8"> + <source>Notes</source> + <translation>הערות</translation> + </message> + <message encoding="UTF-8"> + <source>notes</source> + <translation>הערות</translation> + </message> + <message encoding="UTF-8"> + <source>title ASC</source> + <translation>כותרת ASC</translation> + </message> + <message encoding="UTF-8"> + <source>book</source> + <translation>ספר</translation> + </message> + <message encoding="UTF-8"> + <source>&Connect...</source> + <translation>&התחברות...</translation> + </message> + <message encoding="UTF-8"> + <source>&Edit Books</source> + <translation>&ערוך ספרי×</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>ConnectDialog</name> + <message encoding="UTF-8"> + <source>Connect...</source> + <translation>התחברות...</translation> + </message> + <message encoding="UTF-8"> + <source>Connection settings</source> + <translation>הגדרות התחברות</translation> + </message> + <message encoding="UTF-8"> + <source>Database Name:</source> + <translation>×©× ×ž×¡×“ ×”× ×ª×•× ×™×:</translation> + </message> + <message encoding="UTF-8"> + <source>&Username:</source> + <translation>&×©× ×ž×©×ª×ž×©:</translation> + </message> + <message encoding="UTF-8"> + <source>&Password:</source> + <translation>&סיסמה:</translation> + </message> + <message encoding="UTF-8"> + <source>&Hostname:</source> + <translation>×©× &מ×רח:</translation> + </message> + <message encoding="UTF-8"> + <source>P&ort:</source> + <translation>&יצי××”:</translation> + </message> + <message encoding="UTF-8"> + <source>Default</source> + <translation>ברירת מחדל</translation> + </message> + <message encoding="UTF-8"> + <source>D&river</source> + <translation>מ&× ×”×œ התקן</translation> + </message> + <message encoding="UTF-8"> + <source>&OK</source> + <translation>&×ישור</translation> + </message> + <message encoding="UTF-8"> + <source>&Cancel</source> + <translation>&ביטול</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>DnDDemoBase</name> + <message encoding="UTF-8"> + <source>Form1</source> + <translation>טופס1</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>EditBookForm</name> + <message encoding="UTF-8"> + <source>Edit Books</source> + <translation>ערוך ספרי×</translation> + </message> + <message encoding="UTF-8"> + <source>title ASC</source> + <translation>כותרת ASC</translation> + </message> + <message encoding="UTF-8"> + <source>(default)</source> + <translation>(ברירת מחדל)</translation> + </message> + <message encoding="UTF-8"> + <source>book</source> + <translation>ספר</translation> + </message> + <message encoding="UTF-8"> + <source>Price</source> + <translation>מחיר</translation> + </message> + <message encoding="UTF-8"> + <source>Title</source> + <translation>כותרת</translation> + </message> + <message encoding="UTF-8"> + <source>title</source> + <translation>כותרת</translation> + </message> + <message encoding="UTF-8"> + <source>price</source> + <translation>מחיר</translation> + </message> + <message encoding="UTF-8"> + <source>&Insert</source> + <translation>×”&וסף</translation> + </message> + <message encoding="UTF-8"> + <source>&Update</source> + <translation>&עדכן</translation> + </message> + <message encoding="UTF-8"> + <source>&Delete</source> + <translation>&מחק</translation> + </message> + <message encoding="UTF-8"> + <source>&Close</source> + <translation>&סגור</translation> + </message> + <message encoding="UTF-8"> + <source>|< &First</source> + <translation>|< ×”&ר×שון</translation> + </message> + <message encoding="UTF-8"> + <source><< &Prev</source> + <translation><< הקו&ד×</translation> + </message> + <message encoding="UTF-8"> + <source>&Next >></source> + <translation>×”&×‘× >></translation> + </message> + <message encoding="UTF-8"> + <source>&Last >|</source> + <translation>×”×&חרון >|</translation> + </message> + <message encoding="UTF-8"> + <source>Author</source> + <translation>מחבר</translation> + </message> + <message encoding="UTF-8"> + <source>author_view</source> + <translation>תצוגת_מחבר</translation> + </message> + <message encoding="UTF-8"> + <source>name</source> + <translation>ש×</translation> + </message> +</context> +<context> + <name>Frame</name> + <message> + <source>Qt Demo Collection</source> + <translation>×וסף ההדגמות של Qt</translation> + </message> + <message> + <source>&Exit</source> + <translation>&יצי××”</translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation>Ctrl+Q</translation> + </message> + <message> + <source>&File</source> + <translation>&קובץ</translation> + </message> + <message> + <source>St&yle</source> + <translation>&×¡×’× ×•×Ÿ</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>GLLandscapeViewer</name> + <message encoding="UTF-8"> + <source>Qt/OpenGL example</source> + <translation>הדגמה של Qt/OpenGL</translation> + </message> + <message encoding="UTF-8"> + <source>X-rotation</source> + <translation>סיבוב על ציר X</translation> + </message> + <message encoding="UTF-8"> + <source>Y-rotation</source> + <translation>סיבוב על ציר Y</translation> + </message> + <message encoding="UTF-8"> + <source>Z-rotation</source> + <translation>סיבוב על ציר Z</translation> + </message> + <message encoding="UTF-8"> + <source>Rendering mode</source> + <translation>מצב הצגה</translation> + </message> + <message encoding="UTF-8"> + <source>&Wireframe</source> + <translation>&רשת</translation> + </message> + <message encoding="UTF-8"> + <source>Fl&at shaded</source> + <translation>&שטוח</translation> + </message> + <message encoding="UTF-8"> + <source>&Smooth shaded</source> + <translation>&חלק</translation> + </message> + <message encoding="UTF-8"> + <source>&Landscape</source> + <translation>&×¤× ×™ שטח</translation> + </message> + <message encoding="UTF-8"> + <source>&Fractalize</source> + <translation>&Fractalize</translation> + </message> + <message encoding="UTF-8"> + <source>&Reset grid</source> + <translation>&×פס רשת</translation> + </message> + <message encoding="UTF-8"> + <source>&Animate</source> + <translation>&×”× ×¤×©</translation> + </message> + <message encoding="UTF-8"> + <source>Zoom</source> + <translation>התקרבות</translation> + </message> + <message encoding="UTF-8"> + <source>Size</source> + <translation>גודל</translation> + </message> +</context> +<context> + <name>GLWorkspace</name> + <message> + <source>&Scene</source> + <translation>ס&×¦×™× ×”</translation> + </message> + <message> + <source>&New</source> + <translation>&חדש</translation> + </message> + <message> + <source>New</source> + <translation>חדש</translation> + </message> + <message> + <source>Wirebox</source> + <translation>תיבה</translation> + </message> + <message> + <source>&Wirebox</source> + <translation>&תיבה</translation> + </message> + <message> + <source>Gear</source> + <translation>גלגלי ×©×™× ×™×™×</translation> + </message> + <message> + <source>&Gears</source> + <translation>&גלגלי ×©×™× ×™×™×</translation> + </message> + <message> + <source>Texture</source> + <translation>טקסטורה</translation> + </message> + <message> + <source>&Texture</source> + <translation>&טקסטורה</translation> + </message> + <message> + <source>&Print</source> + <translation>×”&דפס</translation> + </message> + <message> + <source>Print</source> + <translation>הדפס</translation> + </message> + <message> + <source>Window Size</source> + <translation>גודל החלון</translation> + </message> + <message> + <source>&Window Size</source> + <translation>&גודל החלון</translation> + </message> + <message> + <source>Low Resolution</source> + <translation>רזולוציה × ×ž×•×›×”</translation> + </message> + <message> + <source>&Low Resolution</source> + <translation>רזולוציה &× ×ž×•×›×”</translation> + </message> + <message> + <source>Medium Resolution</source> + <translation>רזולוציה ×‘×™× ×•× ×™×ª</translation> + </message> + <message> + <source>&Medium Resolution</source> + <translation>רזולוציה &×‘×™× ×•× ×™×ª</translation> + </message> + <message> + <source>High Resolution</source> + <translation>רזולוציה גבוהה</translation> + </message> + <message> + <source>&High Resolution</source> + <translation>רזולוציה &גבוהה</translation> + </message> + <message> + <source>Setup</source> + <translation>הגדרות</translation> + </message> + <message> + <source>&Setup...</source> + <translation>&הגדרות...</translation> + </message> + <message> + <source>Close</source> + <translation>סגור</translation> + </message> + <message> + <source>&Close</source> + <translation>&סגור</translation> + </message> + <message> + <source>WireBox</source> + <translation>תיבה</translation> + </message> + <message> + <source>Nurbs</source> + <translation>עקומות</translation> + </message> +</context> +<context> + <name>HelpWindow</name> + <message> + <source>&New Window</source> + <translation>&חלון חדש</translation> + </message> + <message> + <source>&Open File</source> + <translation>&פתח קובץ</translation> + </message> + <message> + <source>&Print</source> + <translation>×”&דפס</translation> + </message> + <message> + <source>&Backward</source> + <translation>&×חורה</translation> + </message> + <message> + <source>&Forward</source> + <translation>×§&דימה</translation> + </message> + <message> + <source>&Home</source> + <translation>×”&ביתה</translation> + </message> + <message> + <source>Add Bookmark</source> + <translation>הוסף ×¡×™×ž× ×™×”</translation> + </message> + <message> + <source>&File</source> + <translation>&קובץ</translation> + </message> + <message> + <source>&Go</source> + <translation>&מעבר</translation> + </message> + <message> + <source>History</source> + <translation>היסטוריה</translation> + </message> + <message> + <source>Bookmarks</source> + <translation>×¡×™×ž× ×™×•×ª</translation> + </message> + <message> + <source>Backward</source> + <translation>×חורה</translation> + </message> + <message> + <source>Forward</source> + <translation>קדימה</translation> + </message> + <message> + <source>Home</source> + <translation>הביתה</translation> + </message> +</context> +<context> + <name>I18nDemo</name> + <message> + <source>Close the current window.</source> + <translation>סגירת החלון ×”× ×•×›×—×™.</translation> + </message> + <message> + <source>Close</source> + <translation>סגור</translation> + </message> + <message> + <source>Close all opened windows.</source> + <translation>סגירת כל ×”×—×œ×•× ×•×ª הפתוחי×.</translation> + </message> + <message> + <source>Close All</source> + <translation>סגור הכל</translation> + </message> + <message> + <source>Tile opened windows.</source> + <translation>פרישת ×”×—×œ×•× ×•×ª הפתוחי×.</translation> + </message> + <message> + <source>Tile</source> + <translation>פרוש</translation> + </message> + <message> + <source>Cascade opened windows.</source> + <translation>סידור כל ×”×—×œ×•× ×•×ª ×”×¤×ª×•×—×™× ×‘×¦×•×¨×” מדורגת.</translation> + </message> + <message> + <source>Cascade</source> + <translation>דרג</translation> + </message> + <message> + <source>--language--</source> + <translation>--שפה--</translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p></source> + <translation><div dir=rtl><h3>×ודות Qt</h3></div><p dir=rtl>×ª×•×›× ×™×ª זו עושה שימוש ב-Qt מרובת פלטפורמות גירסה %1, ערכת כלי ממשק משתמש גרפי ל-++C מ-Qt .Trolltech מספקת × ×™×™×“×•×ª קוד מקור יחיד בין Windows 95/98/NT/2000, Linux, Solaris, HP-UX וגירס×ות רבות × ×•×¡×¤×•×ª של ×™×•× ×™×§×¡ ×¢× X11.</p><p dir=rtl>עיין ב-<tt>http://www.trolltech.com/qt/</tt> למידע × ×•×¡×£.</p></translation> + </message> +</context> +<context> + <name>KAstTopLevel</name> + <message> + <source>Score</source> + <translation>× ×™×§×•×“</translation> + </message> + <message> + <source>Level</source> + <translation>שלב</translation> + </message> + <message> + <source>Ships</source> + <translation>×¡×¤×™× ×•×ª</translation> + </message> + <message> + <source>Fuel</source> + <translation>דלק</translation> + </message> + <message> + <source>Press N to start playing</source> + <translation>הקש N כדי להתחיל לשחק</translation> + </message> + <message> + <source>Ship Destroyed. Press L to launch.</source> + <translation>×”×¡×¤×™× ×” הושמדה. הקש L לשיגור.</translation> + </message> + <message> + <source>Game Over!</source> + <translation>המשחק הסתיי×!</translation> + </message> +</context> +<context> + <name>KAsteroidsView</name> + <message> + <source>QCanvas demo</source> + <translation>הדגמה של QCanvas</translation> + </message> + <message> + <source>This game has been implemented using the QCanvas class. +The QCanvas class is not part of the Professional Edition. Please +contact Trolltech if you want to upgrade to the Enterprise Edition.</source> + <translation>משחק ×–×” ×™×•×©× ×‘×מצעות המחלקה QCanvas. +המחלקה QCanvas ××™× ×” חלק מהמהדורה המקצועית. ×× × +צור קשר ×¢× Trolltech ×× ×‘×¨×¦×•× ×š לשדרג למהדורה העסקית.</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>PrintPreview</name> + <message encoding="UTF-8"> + <source>Print Preview</source> + <translation>תצוגה ×œ×¤× ×™ הדפסה</translation> + </message> + <message encoding="UTF-8"> + <source>Preview</source> + <translation>תצוגה מקדימה</translation> + </message> + <message encoding="UTF-8"> + <source>TextLabel1</source> + <translation>תווית טקסט 1</translation> + </message> + <message encoding="UTF-8"> + <source>Modify</source> + <translation>×©× ×”</translation> + </message> + <message encoding="UTF-8"> + <source>&Invert Colors</source> + <translation>&הפוך צבעי×</translation> + </message> + <message encoding="UTF-8"> + <source>&Mirror</source> + <translation>×”&פוך ×ופקית</translation> + </message> + <message encoding="UTF-8"> + <source>&Flip</source> + <translation>הפוך ×&× ×›×™×ª</translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &left</source> + <translation>סובב 90° &שמ×לה</translation> + </message> + <message encoding="UTF-8"> + <source>Rotate 90° &right</source> + <translation>סובב 90° &×™×ž×™× ×”</translation> + </message> + <message encoding="UTF-8"> + <source>&Help</source> + <translation>&עזרה</translation> + </message> + <message encoding="UTF-8"> + <source>&Print</source> + <translation>×”&דפס</translation> + </message> + <message encoding="UTF-8"> + <source>&Discard</source> + <translation>&ביטול</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>SqlEx</name> + <message encoding="UTF-8"> + <source>Form1</source> + <translation>טופס1</translation> + </message> + <message encoding="UTF-8"> + <source>Tables</source> + <translation>טבל×ות</translation> + </message> + <message encoding="UTF-8"> + <source>Type</source> + <translation>סוג</translation> + </message> + <message encoding="UTF-8"> + <source>Retquired</source> + <translation>× ×“×¨×©</translation> + </message> + <message encoding="UTF-8"> + <source>SQL Query</source> + <translation>ש×ילתת SQL</translation> + </message> + <message encoding="UTF-8"> + <source>&Submit</source> + <translation>&שלח</translation> + </message> + <message encoding="UTF-8"> + <source>C&lear</source> + <translation>&× ×§×”</translation> + </message> + <message encoding="UTF-8"> + <source>Press "Connect" to open a database</source> + <translation>לחץ על "התחברות" כדי לפתוח מסד × ×ª×•× ×™×</translation> + </message> + <message encoding="UTF-8"> + <source>&Connect...</source> + <translation>&התחברות...</translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <source>&File</source> + <translation>&קובץ</translation> + </message> + <message> + <source>New</source> + <translation>חדש</translation> + </message> + <message> + <source>&New...</source> + <translation>&חדש...</translation> + </message> + <message> + <source>Open</source> + <translation>פתח</translation> + </message> + <message> + <source>&Open...</source> + <translation>&פתיחה...</translation> + </message> + <message> + <source>Save</source> + <translation>שמור</translation> + </message> + <message> + <source>&Save...</source> + <translation>&שמירה...</translation> + </message> + <message> + <source>Save As</source> + <translation>שמירה בש×</translation> + </message> + <message> + <source>Save &As...</source> + <translation>שמירה &בש×...</translation> + </message> + <message> + <source>Print</source> + <translation>הדפס</translation> + </message> + <message> + <source>&Print...</source> + <translation>×”&דפסה...</translation> + </message> + <message> + <source>Close</source> + <translation>סגור</translation> + </message> + <message> + <source>&Close</source> + <translation>&סגור</translation> + </message> + <message> + <source>&Edit</source> + <translation>&עריכה</translation> + </message> + <message> + <source>Undo</source> + <translation>בטל</translation> + </message> + <message> + <source>&Undo</source> + <translation>&בטל</translation> + </message> + <message> + <source>Redo</source> + <translation>בצע שוב</translation> + </message> + <message> + <source>&Redo</source> + <translation>בצע &שוב</translation> + </message> + <message> + <source>Cut</source> + <translation>גזור</translation> + </message> + <message> + <source>&Cut</source> + <translation>&גזור</translation> + </message> + <message> + <source>Copy</source> + <translation>העתק</translation> + </message> + <message> + <source>C&opy</source> + <translation>×”×¢&תק</translation> + </message> + <message> + <source>Paste</source> + <translation>הדבק</translation> + </message> + <message> + <source>&Paste</source> + <translation>×”&דבק</translation> + </message> + <message> + <source>For&mat</source> + <translation>×¢×™&צוב</translation> + </message> + <message> + <source>Standard</source> + <translation>×¡×˜× ×“×¨×˜×™</translation> + </message> + <message> + <source>Bullet List (Disc)</source> + <translation>רשימת ×ª×‘×œ×™×˜×™× ×ž×œ××™×</translation> + </message> + <message> + <source>Bullet List (Circle)</source> + <translation>רשימת ×ª×‘×œ×™×˜×™× ×¢×’×•×œ×™×</translation> + </message> + <message> + <source>Bullet List (Square)</source> + <translation>רשימת ×ª×‘×œ×™×˜×™× ×ž×¨×•×‘×¢×™×</translation> + </message> + <message> + <source>Ordered List (Decimal)</source> + <translation>רשימה מסודרת לפי מספרי×</translation> + </message> + <message> + <source>Ordered List (Alpha lower)</source> + <translation>רשימה מסודרת לפי ×ותיות ×§×˜× ×•×ª</translation> + </message> + <message> + <source>Ordered List (Alpha upper)</source> + <translation>רשימה מסודרת לפי ×ותיות רישיות</translation> + </message> + <message> + <source>Bold</source> + <translation>מודגש</translation> + </message> + <message> + <source>&Bold</source> + <translation>&מודגש</translation> + </message> + <message> + <source>Italic</source> + <translation>× ×˜×•×™</translation> + </message> + <message> + <source>&Italic</source> + <translation>&× ×˜×•×™</translation> + </message> + <message> + <source>Underline</source> + <translation>קו תחתי</translation> + </message> + <message> + <source>&Underline</source> + <translation>&קו תחתי</translation> + </message> + <message> + <source>Left</source> + <translation>שמ×לה</translation> + </message> + <message> + <source>&Left</source> + <translation>שמ×&לה</translation> + </message> + <message> + <source>Center</source> + <translation>מרכז</translation> + </message> + <message> + <source>C&enter</source> + <translation>מ&רכז</translation> + </message> + <message> + <source>Right</source> + <translation>×™×ž×™× ×”</translation> + </message> + <message> + <source>&Right</source> + <translation>&×™×ž×™× ×”</translation> + </message> + <message> + <source>Justify</source> + <translation>יישר</translation> + </message> + <message> + <source>&Justify</source> + <translation>×™×™&שר</translation> + </message> + <message> + <source>Color</source> + <translation>צבע</translation> + </message> + <message> + <source>&Color...</source> + <translation>&צבע...</translation> + </message> + <message> + <source>noname</source> + <translation>×œ×œ× ×©×</translation> + </message> + <message> + <source>HTML-Files (*.htm *.html);;All Files (*)</source> + <translation>קבצי htm *.html) HTML.*);;כל ×”×§×‘×¦×™× (*)</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>WidgetsBase</name> + <message encoding="UTF-8"> + <source>Widgets</source> + <translation>פריטי×</translation> + </message> + <message encoding="UTF-8"> + <source>Applix</source> + <translation>Applix</translation> + </message> + <message encoding="UTF-8"> + <source>Binary</source> + <translation>קובץ ×‘×™× ×¨×™</translation> + </message> + <message encoding="UTF-8"> + <source>Core</source> + <translation>ליבה</translation> + </message> + <message encoding="UTF-8"> + <source>Deb</source> + <translation>Deb</translation> + </message> + <message encoding="UTF-8"> + <source>Document</source> + <translation>מסמך</translation> + </message> + <message encoding="UTF-8"> + <source>Pdf</source> + <translation>Pdf</translation> + </message> + <message encoding="UTF-8"> + <source>Readme</source> + <translation>Readme</translation> + </message> + <message encoding="UTF-8"> + <source>Shellscript</source> + <translation>תסריט מעטפת</translation> + </message> + <message encoding="UTF-8"> + <source>Recycled</source> + <translation>ממוחזר</translation> + </message> + <message encoding="UTF-8"> + <source>Video</source> + <translation>ויד×ו</translation> + </message> + <message encoding="UTF-8"> + <source><p><h1><b><font size="5" >Richtext </h1> +</p><p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation><p><h1><b><font size="5" >טקסט עשיר </h1> +</p><p dir="rtl">Qt תומך בטקסט עשיר מעוצב, כמו בכותרת לעיל, טקסט <i><font >× ×˜×•×™</font></i>, <b><font >מודגש </font></b>ו<u><font >קו תחתי</font></u>, וכן טקסט ×¦×‘×¢×•× ×™. זהו <font color="#ff0000" >×דו×</font>, בעוד שזהו <font color="#00bb00" >ירוק</font>, וזהו <font color="#0000ff" >כחול</font>. </p> +<> </></translation> + </message> + <message encoding="UTF-8"> + <source>Iconview</source> + <translation>תצוגת סמלי×</translation> + </message> + <message encoding="UTF-8"> + <source>Item 1</source> + <translation>פריט 1</translation> + </message> + <message encoding="UTF-8"> + <source>Item 2</source> + <translation>פריט 2</translation> + </message> + <message encoding="UTF-8"> + <source>Item 3</source> + <translation>פריט 3</translation> + </message> + <message encoding="UTF-8"> + <source>Item 4</source> + <translation>פריט 4</translation> + </message> + <message encoding="UTF-8"> + <source>Item 5</source> + <translation>פריט 5</translation> + </message> + <message encoding="UTF-8"> + <source>Item 6</source> + <translation>פריט 6</translation> + </message> + <message encoding="UTF-8"> + <source>Item 7</source> + <translation>פריט 7</translation> + </message> + <message encoding="UTF-8"> + <source>Item 8</source> + <translation>פריט 8</translation> + </message> + <message encoding="UTF-8"> + <source>Item 9</source> + <translation>פריט 9</translation> + </message> + <message encoding="UTF-8"> + <source>Item 10</source> + <translation>פריט 10</translation> + </message> + <message encoding="UTF-8"> + <source>Item 11</source> + <translation>פריט 11</translation> + </message> + <message encoding="UTF-8"> + <source>Item 12</source> + <translation>פריט 12</translation> + </message> + <message encoding="UTF-8"> + <source>Item 13</source> + <translation>פריט 13</translation> + </message> + <message encoding="UTF-8"> + <source>Item 14</source> + <translation>פריט 14</translation> + </message> + <message encoding="UTF-8"> + <source>Item 15</source> + <translation>פריט 15</translation> + </message> + <message encoding="UTF-8"> + <source>Item 16</source> + <translation>פריט 16</translation> + </message> + <message encoding="UTF-8"> + <source>Item 17</source> + <translation>פריט 17</translation> + </message> + <message encoding="UTF-8"> + <source>Table</source> + <translation>טבלה</translation> + </message> + <message encoding="UTF-8"> + <source>Tables</source> + <translation>טבל×ות</translation> + </message> + <message encoding="UTF-8"> + <source>are</source> + <translation>הן</translation> + </message> + <message encoding="UTF-8"> + <source>easy</source> + <translation>עסק</translation> + </message> + <message encoding="UTF-8"> + <source>with</source> + <translation>פשוט</translation> + </message> + <message encoding="UTF-8"> + <source>Qt</source> + <translation>×¢×</translation> + </message> + <message encoding="UTF-8"> + <source>6</source> + <translation>Qt</translation> + </message> + <message encoding="UTF-8"> + <source>7</source> + <translation>7</translation> + </message> + <message encoding="UTF-8"> + <source>8</source> + <translation>8</translation> + </message> + <message encoding="UTF-8"> + <source>9</source> + <translation>9</translation> + </message> + <message encoding="UTF-8"> + <source>10</source> + <translation>10</translation> + </message> + <message encoding="UTF-8"> + <source>11</source> + <translation>11</translation> + </message> + <message encoding="UTF-8"> + <source>12</source> + <translation>12</translation> + </message> + <message encoding="UTF-8"> + <source>4</source> + <translation>4</translation> + </message> + <message encoding="UTF-8"> + <source>5</source> + <translation>5</translation> + </message> + <message encoding="UTF-8"> + <source>13</source> + <translation>13</translation> + </message> + <message encoding="UTF-8"> + <source>Listview</source> + <translation>תצוגת רשימה</translation> + </message> + <message encoding="UTF-8"> + <source>Things</source> + <translation>דברי×</translation> + </message> + <message encoding="UTF-8"> + <source>Text</source> + <translation>טקסט</translation> + </message> + <message encoding="UTF-8"> + <source>Stuff</source> + <translation>×¢× ×™×™× ×™×</translation> + </message> + <message encoding="UTF-8"> + <source>Airbrush</source> + <translation>מברשת ×וויר</translation> + </message> + <message encoding="UTF-8"> + <source>What stuff?</source> + <translation>××™×–×” ×¢× ×™×™× ×™×?</translation> + </message> + <message encoding="UTF-8"> + <source>Eraser</source> + <translation>מחק</translation> + </message> + <message encoding="UTF-8"> + <source>Here?</source> + <translation>×›×ן?</translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap item</source> + <translation>פריט ×ª×ž×•× ×”</translation> + </message> + <message encoding="UTF-8"> + <source>Nothing</source> + <translation>כלו×</translation> + </message> + <message encoding="UTF-8"> + <source>Nothing Again</source> + <translation>שוב כלו×</translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap subitem 1</source> + <translation>פריט ×ž×©× ×” של ×ª×ž×•× ×” 1</translation> + </message> + <message encoding="UTF-8"> + <source>Subitem</source> + <translation>פריט ×ž×©× ×”</translation> + </message> + <message encoding="UTF-8"> + <source>Pixmap subitem 2 </source> + <translation>פריט ×ž×©× ×” של ×ª×ž×•× ×” 2</translation> + </message> + <message encoding="UTF-8"> + <source>Group box</source> + <translation>תיבת קבוצה</translation> + </message> + <message encoding="UTF-8"> + <source>Pick a base color:</source> + <translation>בחר צבע בסיסי:</translation> + </message> + <message encoding="UTF-8"> + <source>&Reset colors</source> + <translation>&×פס צבעי×</translation> + </message> + <message encoding="UTF-8"> + <source>pale green</source> + <translation>ירוק בהיר</translation> + </message> + <message encoding="UTF-8"> + <source>deep sky blue</source> + <translation>כחול ×©×ž×™×™× ×›×”×”</translation> + </message> + <message encoding="UTF-8"> + <source>steel blue</source> + <translation>כחול פלדה</translation> + </message> + <message encoding="UTF-8"> + <source>powder blue</source> + <translation>כחול ×בקתי</translation> + </message> + <message encoding="UTF-8"> + <source>sandy brown</source> + <translation>×—×•× ×—×•×œ</translation> + </message> + <message encoding="UTF-8"> + <source>dark orange</source> + <translation>×›×ª×•× ×›×”×”</translation> + </message> + <message encoding="UTF-8"> + <source>indian red</source> + <translation>××“×•× ××™× ×“×™×× ×™</translation> + </message> + <message encoding="UTF-8"> + <source>hot pink</source> + <translation>ורוד ×—×</translation> + </message> + <message encoding="UTF-8"> + <source>Enter a color name and hit return:</source> + <translation>הקלד ×©× ×©×œ צבע והקש על Return:</translation> + </message> + <message encoding="UTF-8"> + <source>Color test area</source> + <translation>×יזור לבדיקת הצבע</translation> + </message> + <message encoding="UTF-8"> + <source>Check boxes</source> + <translation>תיבות סימון</translation> + </message> + <message encoding="UTF-8"> + <source>Apples</source> + <translation>תפוחי×</translation> + </message> + <message encoding="UTF-8"> + <source>Banana</source> + <translation>×‘× × ×”</translation> + </message> + <message encoding="UTF-8"> + <source>Orange</source> + <translation>תפוז</translation> + </message> + <message encoding="UTF-8"> + <source>Radio buttons</source> + <translation>כפתורי בחירה</translation> + </message> + <message encoding="UTF-8"> + <source>Sprite</source> + <translation>ספרייט</translation> + </message> + <message encoding="UTF-8"> + <source>Farris</source> + <translation>קולה</translation> + </message> + <message encoding="UTF-8"> + <source>Solo</source> + <translation>פ×× ×˜×”</translation> + </message> + <message encoding="UTF-8"> + <source>Date/Time editors</source> + <translation>עורכי ת×ריך\שעה</translation> + </message> + <message encoding="UTF-8"> + <source>DateTime string goes here!</source> + <translation>מקומה של מחרוזת הת×ריך והשעה</translation> + </message> + <message encoding="UTF-8"> + <source><h1><b><font size="4" >Richtext </h1> +<p>Qt supports formatted rich text, such as the heading above, <i><font >emphasized</font></i>, <b><font >bold </font></b>and <u><font >underlined </font></u>text, as well as colored text. This is <font color="#ff0000" >red</font>, while this is <font color="#00bb00" >green</font>, and this is <font color="#0000ff" >blue</font>. </p> +<> </> +</source> + <translation><div><h1><b><font size="4" >טקסט עשיר </h1></div> +<p>Qt תומך בטקסט עשיר מעוצב, כמו בכותרת לעיל, טקסט <i><font >× ×˜×•×™</font></i>, <b><font >מודגש </font></b>ו<u><font >קו תחתי </font></u>,וכן טקסט ×¦×‘×¢×•× ×™. זהו <font color="#ff0000" >×דו×</font>, בעוד שזהו <font color="#00bb00" >ירוק</font>, וזהו <font color="#0000ff" >כחול</font>. </p> +<> </></translation> + </message> +</context> +</TS> diff --git a/examples/demo/widgets/widgetsbase.ui b/examples/demo/widgets/widgetsbase.ui new file mode 100644 index 000000000..bf61dfd34 --- /dev/null +++ b/examples/demo/widgets/widgetsbase.ui @@ -0,0 +1,1269 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>WidgetsBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>WidgetsBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>626</width> + <height>575</height> + </rect> + </property> + <property name="caption"> + <string>Widgets</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="TQLabel"> + <property name="name"> + <cstring>PixmapLabel1</cstring> + </property> + <property name="frameShape"> + <enum>Panel</enum> + </property> + <property name="margin"> + <number>1</number> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer1_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Check Boxes</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox" row="0" column="0"> + <property name="name"> + <cstring>CheckBox1</cstring> + </property> + <property name="text"> + <string>Apple</string> + </property> + </widget> + <widget class="TQCheckBox" row="1" column="0"> + <property name="name"> + <cstring>CheckBox2</cstring> + </property> + <property name="text"> + <string>Banana</string> + </property> + </widget> + <widget class="TQCheckBox" row="2" column="0"> + <property name="name"> + <cstring>CheckBox3</cstring> + </property> + <property name="text"> + <string>Cherry</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup2</cstring> + </property> + <property name="title"> + <string>Radio Buttons</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton" row="1" column="0"> + <property name="name"> + <cstring>RadioButton3</cstring> + </property> + <property name="text"> + <string>Whisky</string> + </property> + </widget> + <widget class="TQRadioButton" row="2" column="0"> + <property name="name"> + <cstring>RadioButton4</cstring> + </property> + <property name="text"> + <string>Wine</string> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="0"> + <property name="name"> + <cstring>RadioButton2</cstring> + </property> + <property name="text"> + <string>Water</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Date/Time Editors</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="AnalogClock" row="0" column="0" rowspan="3" colspan="1"> + <property name="name"> + <cstring>clock</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>75</width> + <height>75</height> + </size> + </property> + </widget> + <widget class="TQDateEdit" row="1" column="1"> + <property name="name"> + <cstring>dateEdit</cstring> + </property> + <property name="date"> + <date> + <year>2000</year> + <month>1</month> + <day>1</day> + </date> + </property> + </widget> + <widget class="TQTimeEdit" row="2" column="1"> + <property name="name"> + <cstring>timeEdit</cstring> + </property> + <property name="time"> + <time> + <hour>0</hour> + <minute>0</minute> + <second>0</second> + </time> + </property> + <property name="autoAdvance"> + <bool>true</bool> + </property> + <property name="maxValue"> + <time> + <hour>23</hour> + <minute>59</minute> + <second>59</second> + </time> + </property> + <property name="minValue"> + <time> + <hour>0</hour> + <minute>0</minute> + <second>0</second> + </time> + </property> + </widget> + <widget class="TQLabel" row="0" column="1"> + <property name="name"> + <cstring>dateTimeLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>2</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </grid> + </widget> + </hbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>groupBox</cstring> + </property> + <property name="title"> + <string>Group Box</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLCDNumber" row="0" column="3" rowspan="3" colspan="1"> + <property name="name"> + <cstring>lcdDisplay</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="numDigits"> + <number>2</number> + </property> + <property name="segmentStyle"> + <enum>Filled</enum> + </property> + </widget> + <widget class="TQSlider" row="2" column="2"> + <property name="name"> + <cstring>slider</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="tickmarks"> + <enum>Left</enum> + </property> + <property name="tickInterval"> + <number>5</number> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>Pick a base color:</string> + </property> + </widget> + <widget class="TQPushButton" row="2" column="0"> + <property name="name"> + <cstring>pushButton</cstring> + </property> + <property name="cursor"> + <cursor>0</cursor> + </property> + <property name="text"> + <string>&Reset colors</string> + </property> + </widget> + <widget class="TQComboBox" row="1" column="0"> + <item> + <property name="text"> + <string>pale green</string> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>deep sky blue</string> + </property> + <property name="pixmap"> + <pixmap>image2</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>steel blue</string> + </property> + <property name="pixmap"> + <pixmap>image3</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>powder blue</string> + </property> + <property name="pixmap"> + <pixmap>image4</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>sandy brown</string> + </property> + <property name="pixmap"> + <pixmap>image5</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>dark orange</string> + </property> + <property name="pixmap"> + <pixmap>image6</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>indian red</string> + </property> + <property name="pixmap"> + <pixmap>image7</pixmap> + </property> + </item> + <property name="name"> + <cstring>buttonColorBox</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="1" column="1"> + <property name="name"> + <cstring>lineEdit</cstring> + </property> + <property name="frameShape"> + <enum>LineEditPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="text"> + <string>hot pink</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="1"> + <property name="name"> + <cstring>TextLabel1_2_2</cstring> + </property> + <property name="text"> + <string>Enter a color and hit return:</string> + </property> + </widget> + <widget class="TQSpinBox" row="1" column="2"> + <property name="name"> + <cstring>spinBox</cstring> + </property> + </widget> + <widget class="TQProgressBar" row="0" column="2"> + <property name="name"> + <cstring>progressBar</cstring> + </property> + </widget> + <widget class="TQLabel" row="2" column="1"> + <property name="name"> + <cstring>colorTest</cstring> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="text"> + <string>Color test area</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQListBox"> + <item> + <property name="text"> + <string>Applix</string> + </property> + <property name="pixmap"> + <pixmap>image8</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Binary</string> + </property> + <property name="pixmap"> + <pixmap>image9</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Core</string> + </property> + <property name="pixmap"> + <pixmap>image10</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Deb</string> + </property> + <property name="pixmap"> + <pixmap>image11</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Document</string> + </property> + <property name="pixmap"> + <pixmap>image12</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Pdf</string> + </property> + <property name="pixmap"> + <pixmap>image13</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Readme</string> + </property> + <property name="pixmap"> + <pixmap>image14</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Shellscript</string> + </property> + <property name="pixmap"> + <pixmap>image15</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Recycled</string> + </property> + <property name="pixmap"> + <pixmap>image16</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Video</string> + </property> + <property name="pixmap"> + <pixmap>image17</pixmap> + </property> + </item> + <property name="name"> + <cstring>ListBox3</cstring> + </property> + <property name="columnMode"> + <enum>Variable</enum> + </property> + <property name="rowMode"> + <enum>FitToHeight</enum> + </property> + </widget> + <widget class="TQTextEdit"> + <property name="name"> + <cstring>TextEdit1</cstring> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + <property name="text"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style="font-size:8pt;font-family:MS Shell Dlg"> +<p style="margin-top:16px"><span style="font-size:12pt;font-weight:600">Rich Text</span></p> +<p>TQt supports rich text. This is <span style="font-style:italic">italics</span>, this is <span style="font-weight:600">bold</span>, this is <span style="text-decoration:underline">underlined</span>, this is <span style="color:#ff0000">red</span>, this is <span style="color:#00ff00">green</span>, and this is <span style="color:#0000ff">blue</span>.</p> +</body></html> +</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQTabWidget"> + <property name="name"> + <cstring>TabWidget2</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Icon View</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQIconView" row="0" column="0"> + <item> + <property name="text"> + <string>Item 1</string> + </property> + <property name="pixmap"> + <pixmap>image18</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 2</string> + </property> + <property name="pixmap"> + <pixmap>image19</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 3</string> + </property> + <property name="pixmap"> + <pixmap>image20</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 4</string> + </property> + <property name="pixmap"> + <pixmap>image21</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 5</string> + </property> + <property name="pixmap"> + <pixmap>image22</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 6</string> + </property> + <property name="pixmap"> + <pixmap>image23</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 7</string> + </property> + <property name="pixmap"> + <pixmap>image24</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 8</string> + </property> + <property name="pixmap"> + <pixmap>image25</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 9</string> + </property> + <property name="pixmap"> + <pixmap>image26</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 10</string> + </property> + <property name="pixmap"> + <pixmap>image27</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 11</string> + </property> + <property name="pixmap"> + <pixmap>image28</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 12</string> + </property> + <property name="pixmap"> + <pixmap>image29</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 13</string> + </property> + <property name="pixmap"> + <pixmap>image30</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 14</string> + </property> + <property name="pixmap"> + <pixmap>image31</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 15</string> + </property> + <property name="pixmap"> + <pixmap>image32</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 16</string> + </property> + <property name="pixmap"> + <pixmap>image33</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 17</string> + </property> + <property name="pixmap"> + <pixmap>image34</pixmap> + </property> + </item> + <property name="name"> + <cstring>IconView1</cstring> + </property> + <property name="arrangement"> + <enum>LeftToRight</enum> + </property> + <property name="resizeMode"> + <enum>Adjust</enum> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>List View</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListView" row="0" column="0"> + <column> + <property name="text"> + <string>Things</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Text</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Comment</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <item> + <property name="text"> + <string>Airbrush</string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string>Standard paint tool</string> + </property> + <property name="pixmap"> + <pixmap>image35</pixmap> + </property> + <property name="pixmap"> + <pixmap>image36</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + <item> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string>Eraser</string> + </property> + <property name="text"> + <string>Standard paint tool</string> + </property> + <property name="pixmap"> + <pixmap>image37</pixmap> + </property> + <property name="pixmap"> + <pixmap>image36</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Inbox</string> + </property> + <property name="text"> + <string>143 messages</string> + </property> + <property name="text"> + <string>(5 new)</string> + </property> + <property name="pixmap"> + <pixmap>image38</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <item> + <property name="text"> + <string>Local</string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <item> + <property name="text"> + <string>Draft #1</string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image39</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + </item> + <item> + <property name="text"> + <string>Server</string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + </item> + <property name="name"> + <cstring>ListView3</cstring> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>AllColumns</enum> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Table</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTable" row="0" column="0"> + <column> + <property name="text"> + <string>Tables</string> + </property> + </column> + <column> + <property name="text"> + <string>are</string> + </property> + </column> + <column> + <property name="text"> + <string>easy</string> + </property> + </column> + <column> + <property name="text"> + <string>with</string> + </property> + </column> + <column> + <property name="text"> + <string>TQt</string> + </property> + </column> + <row> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image40</pixmap> + </property> + </row> + <row> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image39</pixmap> + </property> + </row> + <row> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image41</pixmap> + </property> + </row> + <property name="name"> + <cstring>Table1</cstring> + </property> + <property name="numRows"> + <number>13</number> + </property> + <property name="numCols"> + <number>12</number> + </property> + </widget> + </grid> + </widget> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>AnalogClock</class> + <header location="local">../aclock/aclock.h</header> + <sizehint> + <width>75</width> + <height>75</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>0</hordata> + <verdata>3</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image42</pixmap> + <slot access="public" specifier="">setTime(const TQTime &)</slot> + <slot access="public" specifier="">setTime(const TQTime &)</slot> + <slot access="public" specifier="">setTime(const TQTime&)</slot> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="30595">789cdd9c595323bb96a8dfcfafd871f476a2438d8d6d70dcb80f66c68027663afa4153667a66b00da6e3fef7bbb406d906ea14b54f45c7eede15b9cd47662a25ad594af3effff8e3ae73f1c73ffefd6f2f3333ebbb3f5c619efff8879f8fc7cbfff8cffffb5f7ffb7b696beb8f78d4b62b7f94fffe6f7ffbbb5afce1fe505bf81f722ff16e6463844b78de5c24c6f36ace5ce1fbbb89e9fe7761badfae98ee9f31efd2fdd626c6f3fe5298efef333bba3eb4894bdc7f7fc5ccfdb113e45d199f9926a6fe8d85b9fd3c31f5afc3cced994962ba5f09f3fd2631dddf66e6f1199b98ee6f08d3fd4e27a6f15784cbd47ec1cce3b7c3c4d4de9e30b5e7ab89f17c3613a6f60c3f4fe62fdc24a6f61e9945be2fcc3c9e70c92cfdb98f5c4af2cb34339fcf4e13e379ab84a9bfa1462cfdc92bc23c3f2f89e9fe4b611ecf8899fb9bcbf52c1f77c0ccfd57723ff7cfb488cbfc7c3b6096f1d3f9345e734e2cd72bc72cd75b66799e61e6fb0b9c8f726a3fbf4b4cf3571566fdd2ccdc5e5e4d4cfa72c42cf268106f4bff5e99f979999ce7f6fc3e723d5def99e5fa9dc4a41f1566d1ef4b66b14f6abf5ee1f61cca77bb94ae1f324b7f7b89a9fd7b62b95f85c478def1f515e93f9dafcbfd7e4e2cf767e3c478be6809b37f5b32f378dd2c31d9f385305daf9e99f9f96e3f31f55f58e6a39b98fa8ffa5f29c9f5454f98ede18a99ef572ba6f1dd09b37e305765be7462eaff1b7395e7e35998ee2fde99eb3c1ed4cf8aa9f2fcf8217395fd499399af5779621a5f5798ed6f425c2bf1f8d0bf54cba25fe68959e2c11171d5b33dd484cb75ecef1d71adc4cfdb16e6f19c24a6f35361f21785308f3fcc99f97939c6c7aa91fe29c5ccf2c8e979309eed12b6ef99b93d739698da3b15a6e7bbc0ccf3a5eac23cdfd25e9daecf67ccdcbfa223ccd7df2626fde809f3fd34df6687e7c7b8c4e44fbbc2747db6c7ccfd0f289f5a59ec2353c4b5fa36ca233f61e6e7872d616eef5c98ae37cfc4e9f94b61befe30315e1f8e98797eed6362badf09b37c5f99593f33b9becef3732dccf383e3af99646f19b1e87fd821de2951ffb36be62af52fbf15267db00fccfc3cbd2b4ccff3ef89a9bd3b61ba3fbb498ce7d59299e56d478969be9bc2d47e78484ced7b616ebf4dbccbf39f9f0b73be81f6b1b35de3f90b678969fe9e85f9fe1633f7a758104b7fcc03b1b41fb2c4d83fdf16a6fe996d6696673e4e4ce37915e6eb0f98793e0b254ce70bf44f3b56f43fbf2696f68a6766bedeee314bffdf12e3f54eaee7f92cf689eb3c9fd95298aeb7afc2ec2f50bebbdba2cf66c02cfa5267167b9e12ef56d91f1e0bb33e5c11a7e71d0bd3f37c8b59f4f39099e74bf585f97c2731c907f3a95d9bf4e55598e533606679f909b3f8ffb230db779198e4d915ae627d627ac4d29fc232f37cabc7c4243f1abf353c7e9398c7bf9598ae1f33f37c14e789c9dfa07d4238e7f361c42cf6bb9d98e6e74c98f5b1ce2cfe6f22ccfda909d3786dbabe6ab03f97c4a24fa125ccf1232396f1fa1233f7d76789491f9e852b349efbc4f83cdb66362cef3d613a9ff798033fcf09f37c49fb81da77e7c4b6ccfe6321ccfab24c4cf71f0bb37cc7cc35ceef1e12933d5c08b33ddf301bf6f73631e9ab13667f8ef978dd893f0c87c4c93f05669ecfacc7ccf20ab789717e02e983ab97e87cae13e3f9ec9e99e3952a84d95edf84e97e759e18eff787c2353c9fbd30b3bee5bbc4223fd3666679e40d6299df629418afd73561badece13933e72ff65fe434f98f32d69bf46f3a7af84b93f5e98da5727cc2c2fb39b98e2c79b30b5afd3f59ccf1d0bf3f32e85e9794eae0fd4be7e4d4cfef55d98db6f24a6fcfd4898ed5d25a6f6abc48ef55b4f1253fbfbc25c2fdc25a6f963f939d66f779f98f455eee7f95565669e1f85f99849fea69830737ccae7c4224f759618e5e98c30e95bb6cdccf20a7561badfdf27267d7c1266ff55656679b94298edc90bb3bedd08b33f3a4d4cf63415667b0acc2c4f5f24267f301066fb4ee779bea57f2ccfd04f4cfde90ab3ff1b0bf3f89b89b17fa64c9ce43f4f4cf21f0bb37ebd24a6f3c7c2acbf178969fedf84d99fbf26a678e98479fed2f3a87f5afac7faa5f3c4f47c25ccfd7389e9bc3c9fed39bc2626fd6f08b3ff61fd736ccfba9998da1b08f3f39e12933e6f09737c90feb1bcd57d62b28f8e30d73f3631e547e8df8c937c287b27369cff79cd2cf9d79d30f95b77c8ccfdf1c7c21c2f0e1293feec08733ca8108bbe170fc2acdfbbc26c7f9789291e979859ff0a9f98ec6f294cf7178fc4a26f619998e6a325ccf9fd7662ea5f10e6f83b4c4cf24eedb3becd12537f1ac2d41ff7c6ccfae59689497e7561ceaf6b89295e9484a93fba9d98f255791efb2797aee7f8ac98c55f1e09b3fe0d1393bfef0a537fd4696292ef9630e7c70789a93f37c2d41f7d9798ec51da137fd517e6f9b94b4cfd1d09b33f6f0a73fdb09b98e4c7e3f3ec7f544998e3e58330db03c6175b91fcdecd8945bfed9330e51be13a31e5038e59fc659d58e24dfece2cf2d863e6f92d66c4224fb710667f7b92989eb764e6fe6583c4a42fa7c2ac0f6789c99e47c26c6f9dc4d4fe0133cfbf1d0bb37fde4e4cfd75c29cef1789a93f323ec9bfae1253fcb821f6e2df771293bc2d33db4386fa67bde4f796e6cb4bfccc8f84693cf98330c94bbd33737fb39230dbefae305defa83f5efc81c999597feda930cbf73c313d9faff7922f607f5d55ea8d62482cfecd8d13d3f32f89933fda4d4cf1b124ccf7378559be07c2341ef3c22cfe63204cfaadaaccec2fb2a930c7b7e7c4249f9130e7cb1933c72b7b9398fc5d21ccf9b2494cf96e5998fd7320f6925f1c2626fbde16667fb69798ecbdce2cf5d34d62f2779930e7973bc23c7f3933c7f3fc2931f5f75a98aef734df5ee4616f996b3cff4de19d6d6cff8499fd817d11a6fbb39098f4450b73bcdb12a6f6f25a628bfa21d7f37c678bc4940f968539bf9924267fdf13e6f87e2dccfdbb10e6fc77264cfd51e97aea4f714c2cf254878949df3261ce471689c9de2ac21c2fabc26cff6789c9feb684391eb798251f5c24a6fc6c2accfaf49c98ce2f85d91f9e27267b48f7737cda1326fb323bcc921f961253fb5e989f1f1293beef0bf3fac77b62f2075698ed95e5e3a5fe2b12d3f364be593fd441629a6f9c3f5f15fdca2acce29f6e8559fffa8951deb92796786bcf84b95e1b24267f3415e6f5981361d6f727618ebf37c2f47c27edb1fc6c2d31f983be30e73793c4347ff23c969fb94e4cf1e74d98edbb9598ecfb5598fb5b4a4cfd95f18b3e6c25a6f32fc2349ea210de253e6466fd711789697c6d61d61f9b98e42de367fd312789299e778439df6c2526fb4fe739bfbb4d4cf9dd9130dbdb5662d297d41f1abfae0ab37ea5fbd95f6c33b3fe9adbc4341e234ce3edce12d3f99130d753c3c4a48fe7c29c4f5c24267bde13e67c3fddcff54dba9ec6935f1207f66fbe9b98fa7320ccf656494ce71f85d9bf9c2526fbb815e6fea5f678bdec8199f5dfcc13937fa5fe07d1cf7027ccf3df4f8cf3ef7366c987cb89495fd279f6bf9930d76fbbc2dcfe5362926f5798f43b0c98251f90feb0fc32698fe5e5cf13537f647c22af3c31d997f48fe5e747c26c8f9dc4942f3685a9ff3e9da7fe677562919fdd1766fb3a4e4cfd7b1266fb7a484cf97210e67ab79998f42db5cff6759498ecaf224ce3f1a78969fc17c21c9fa57f529f5e25267d9c09737ee01253bd6384d97fef09737e504e4cfab023ccebc167ccac4f19ce47a8a5785e12e6eb0db3a957f0fc31b3c8774f98c7db16667d9b0b93be6557c275877c2b6cb07ddb2496f92f6e8579fe5f1353be712fccfad417a6f9b63e31e5671d61ea4f7e9818cfab1a33c723ff26ccf3631293fce5f96cdfbe2c4cfd711561b6ef19b3c403793efb73ff28ccfa3e17e6fe4a7fa47ec1781982f8ff9c9e0ffa66707ef31d666edf5e0bf3f56d616abf3bd34a1badfeeca7b6dac1f1f1f36707ddbb76fcabfd40d928ed7ff311be71c4eb329dc3f19b9e4b71f75f9e937ced48bfc773f62732fd4d32899fbf452eb92e707ed70ffafdef96f74fe5f23be624c9c17c3ed6cfb3ac5676d3d7ee773cff37dacb473bf09f64f4a3ebddda3d7f057b59f34d3f920d1f9fecea2f672f5ffba8cff34d722a3ed8d75fcd5e06e2b3e073a847a839e3680bf8b3459bc023fe1e3ec7f1e9fc39fc8bd98bd7133d859e4559c8e70846f5a89fd826c6fa190e0bfca85fe2cf38eac0d7fe75ec65063df4d43be4a99ea31dc4112ef42bfe8e7a1dfdd61b1c2f7a89237ae751fd95ecc5a3b6444d1ba065d3efe69a62cc6b94156ad8b36ee83d1cc91b6be23e9cfb0bd90bcc7dae0f6014b1d78770704e86bdb7d8e368376ffa481fc3284e502e512653bceff477f9b2df229726f4a8893d8abd3e831e9feb0bddd26dddd15dddd397705ce96b7da36ff59dbe87df3fe82d944bbcaff4bb7cd96fb197035d861e29b0ea6d5d819e56754defe85d5d575a296594550e0eabbc0a2a53b92a545f0dd4503fa8910e6afcdf1a5f28764bfc5e8fed123316fa5d4d745b4dd5a37a52cfd0eb173553733ce66ab176c4dfcde0ecab7a534bf5ae1a6a4f1fab7dd0baf0e1191ffddb4ffddd77ec059ed08463a00e58f729871aab4375a48ed5899eaa53d55467ea5c5da816f4b68d7d9eab0e7f76550f8e051eab11c5e3525de95d75ad6ed4adbad30b75af1ef404da7e51fb6a0b46f80e722badd5456a3db7f813f682b15a95e39cc968d4368ca4a25f55153e6b6a47edaabaf2d05c472d8c523d63a0f73de8f5fab1c04ffc07e7bbc6e2a8e2788c71c69ba0df4c065edc83871fa1cf73a0b5cae4fa3b39c577ed85e5c2a3a13b4d8c0da6307d5d330333342392018e640cc7047ada49b2893fa34ccc348e84ff532223f3689eccb3793133b0b793380a98a9d8e39843bcafcbe35fb4976ccd5ee8689a39ccd7420dcdab79334bd417ec39ceb5c861fec581b231ef3c949e5166621a660f47f462f6cd01c8e7d01ca1b78e716a0ab23afe153ff6337b89b29003387ad15773624e4dd39c997318c104fad480ff4fb8b751d3d6e522f622238a5ac69a88c7050cac81f269e9ba699b8e3a8567c368d4911e99ee8f72ef3f175f926665e07d0b75628e55c3f4a081479c51ec0df6d0aef9ad55ef57f6b33ad75dd90efc1747f30ebf07eb3197e6ca5c9b1be8e1047a38c0bc20fb4e5efd1d7b89162f3231b7f0d98791dc81df8dbad5313659fb02e51065d24b76a3d6ecc3a07c7a660ffe35503e5df8c471456fc0a39f997bf360b64c09ec666e6e4df9ab9ae74fda8bf80fb19bbe6e9b6d887ed1922d5bc0047a3549b622beaaf7e1dfca96baf4892359b02c5776363715b09caaa981c597cdcea7b584fc53ffbe1f5fa2878c998a37bbe604645207a7223e094663158dc08ab6181cdd5c7c17c69b19fb396b2dd8fa6a7c5d6bd3753403e4a95bd659af4e6dc07c6d8eda66f4c466ffa2bdc47812b3c057b4936d6571240dd479b480289338069b838f52f25b35b385ed1b6d5acad90148f2d2688e9ef0cf0ed966ba186b66d1d6503b0dced04c793b32d7766cd76249f4d4e8adff7c3e36828c3efa94a85d773c9269940ac88434ab6bc51e504b6c01fecddba97db44ff6d9be186f67766e17f6d5bed9a5a9407c243975ed3bd9bd516c3f0adbe9e2681b760fe2d7315775b1fe194a8cf9e8dbbe6d2faf763fd685f6c01e82c5cf29b6a758bea0f9457b895aa4a10f47f6d89ed853db54437ba62fc083d7ecb9deb217ba6d5bb66d3bb66b7bb61fdbb29731e2707becdd8029860eed95bd86d104ce9e6245b7aa77f2cf72f999bdd81b6861694af6d6dec17c46992894c9bd6ac7a8021339018d419d52cff6c16ed9922ddb6d5bb1555bd3439889580dc72a3a1e2f76c7ccec2ec8ab0ef9db25f96ca763844a1e206a5d1b5a9b39e58cb3309a58c1c51aa86fba1fd7a27fc95e06f6c6397deb3cc493458aed31168a07865ed83ea480c1652e7785836a0b46317603b45acaa74bb8fed2447e36476ee8466eec2631dac6d6a0dd2efa36cb917601630129bba97b744f588fbe613efdb8e6bb36d6dfbe155f208b504df78c4fed905f8a76021683f6e25ee273ddcccdddc2bd46db726fdd191e4b98c3583de75d5aab19609c8ab95d5077eedd35dc9e69bb7d77809a8b728178c5f983b198355cba43bde58e5cac498fb1bafe621dee07f6b29983c2b8dd89aa4166b1445fd94e56b2601b69e3484e5dd39dd98a3b7717eec4b5f4dcb551b7a3c5ce53ee10ebfb58496718cf5fd581da721d184d176d674e76471934fac649f489aee72e4d612b209b67acb63fd656f9677bc18372d2a1bb8a3d00df55a8235b73d7ee0633c7559602b316ed26ca04b2dc6777ab1afa08e5b0de16d51d31cf7e74773092813e70f7b15ae8ce78f575ea1edc962bb9721c0de403ef1c9be6eca1c77106ddb6ab804cc0ea6186861bed675fd80be91dc7783cbbc027572142d6d4aeabc57c9e231965f0ecc7207e38b7e3208ae26ac42bdcf7d1c7345d5d4f303bdd866b46ead4c33441b9d35007deea4390d5b98fafe668ce4337b2d0c83ef8cce7bed0257504a3c9e311e3de462dfa955c1cb2d77355f17dbdf003d35775a84f6274ec611cec609d42b947db0fedccedba23b04abfa9c3c9de2af0f42b900bf8303ff2633f31977eaa6f740b6a15f4b0eace3ffa27ffcc9ad625ed95bc0eb4ecc0bf802df6f5d8cf68edad4beba492276edacb4aef025aeb04350cb20698ef1a46950ecf59876340d4ea999ffb857f05ffb2cf2b44039e89f5357ec83e54097edff06f7ee9df712de0d23a1f6bfd13bbefeee1be637debf7dc7e8cb31c67ba2bb9a8b9dff707906df641c324beacf2c47f2217b8e229f1c89cfa43947e5bea77ce8b418ffd913ff627fa88d7ba78958fdb5be5b607ee0434e9cd9ffaa63fc38812bdc88b2bbb913ff717bae4fb90679d806c5afe0867adc7768347948cd1beed3b906d4edddbfafe4d94cb0fec85c6bb8feb8fb1f60e90ddb520a249cdd8e67a651cdb078da8bb05f8171757fb7c176c6bc1ebc3e1c37afe026c63cf377c2f563c314bf130227fe5aff58debc04c945cd5dfa85390cd2d663752ddb06ca2c7f177fe1e46fe80f998655bd958aff92817f62f4fb42e6cbaa0df5bd1fb632639e7fa24962c71ae96bee4cb66178cbfcaf5e6583fa6b89c43ad439131ae9d55a027db5126d6fa0a8ca50a99c24c595f031fd65177a0655011fb1dbf6b305743d94f52cc899eade5ebe6143a1ead9f464335af93fc6c23be88bd389c570ff37506b6f0842d77576b29b4ea0079d7831b426cbf080a63bae13594676eab883528b7b9d437c1809dc048526d43b9fd8b5dba51881115641b5cf021f0fa81d4395da96b4216f2506cf8b04ff5cba7381af3e2128efd4257d533645d46d656242b8fd668b7423f0c56759ff816acd50ff469940b68840b435b0a238ceddd94e773d51535d595c3d81b906f490fc3244cc3235ae722c5ff09e600edf0e44f2033ca310a07add6e5b2662f6123c638cc04e3cfe721ae41ce5336df4d733a835cb8e4fa6089a5359f45edcc7529bc981db21fd70933bb448ba7b5b386546531f6e2885c988705e45930dfe1d554210b28620ebbb69e139f1c6b8017fde22e308f18ff582ea2e3bcb3e0c8a78537bd831e74259331ca680175dfb12d8765187cb10779a0cbbe0bf5208c240cdd6378c791cc627c92da8433c9183f66b61f1a61cfc5da350ffbba1b0e4c0b3d738fe319cdc202fcf821f84cca5457ef0d7cb49790743cfedc002d239d6cf96bd45e999f1e575c51c34eecb6b6ee0df577730ff2146af426ae063e40cfc8a3a74a9a7361c98d63e6d50a4721ee0dc458310e27e194d74556eb9d0b5aa5094d883153caefc4bed31a91c845de4fa1b98d3542bcb20f39561d5aeda4352f92cb145a3d0be7e08d69efd16cc413f202e085c3459885166957aa4b14e5c258ffa838e7a16ddff425e4000dd4fb43530b1dac93e62952c23fa7e358202f1bfa015bbfac117d8c2f2bb9e4682f8fa0eb25f8ec84eec65a3dc905f262bbb4cdd083fa44711cdedccf9f826c1f7cd33c07f2b013ce4657d51659f6dc9cdba51fdb8bf0aafb90e57888aa109dcdf307b9f4280a842bf76816b4739b8eec47f60287c3fa3aee75f57557a9d50a2bc6e371d4315b846bf7083e658ef5895de92cdadb48bf84a11f87561c49b8e1f50dcb5a463a837996390fb7be61a376d11a728c450ee6be853195ab3c5ae381ffcf4c25dcb922468c1863f879832fea97b0eec7607e32c8167bb45291d620592e46877b7be696ae0db9ebf443fc0dfa389cf86678885e0346d2654fb4b9de1ffd523f6c81164ec0ae32bd8f6b3d587386b7508ab128adf32c521c380aa7a18c7259f9b1afea4a27b1947df75cf783c7353d69533c72dbb44c535f401d9f736b0355814c9476ec14e40a0d7f86ebb3b1765bad144d6515305a8a3b08dba10236179fbd0f7aff44edc0c88ef48d69f173db29fb47efed6e431575a88f7dcd3fd52f228f97241bf2116ffada0e36f596bd64dc2f3901e91690e3c2b5fe86ea4fac5d96b694e2c984fd9559ad63c6750ad50bb5b013766d39aeb2625d1347f36a62bd091a6aaa3896e49195ec11b8505713acc85e203757ec3bbf920b8f95b3f6f8dec495a21d1fb254910b8cc5cec03b521d1ff57c027229412efcee4790ad8c683d22adf5f758265d5aeb8cba9fe94c65c69d050df2cfb0527bd2d3cc46bb3127995bd387791a09d89769c648b029970d7b913c4ce41277b7f7a3dedb17b697c5865c607e745cef9a8046c5d58827a8db8fe2ce9c09a19e79c8566660a77b947facfbaeb4d2da002f7b60975908fd2c73f759eeeecd5c0f402eef6a1f7cda35ca85ec545668638cd2ba0679759ce917cec5bfa85f24978a63e5554e17f516abb00debc7cf4bbbd05bd1d749dd9e6550699dfa465660566d31c64f4d23f65a64227b64c071257d6e46309a7e36004f53852a3aee50417e6eba6ecbb65147bb5cbb48be1c23f48ce5627f602fe27f5cb2178befaf1c43ed1236ec857e8e6b93aff6026a7bca1306a0ef2fe6102aad1ef5c1926dc8da7f6fed7e59d3efa25780e8920dd569d452b2393d56fba6948d421beba4779a45acc8e0ee6c0c3901d98b5ab3edcf727169acf8ee50283464e32ae3ea6bbae6cb40ef2056b7c11b3741c3c6309ffbd1776593e8496371432be4bc462c3e6ca1646f997cfb042bbb56d8caa66a0499655cf5807c019edbca1ee35a39e74bab7c61a6aeb227f2636b7b765fd52f2bb94ca06507f1b5a1efb367cc5853dd8d313856793ddbd2fbe08360e4e0cb1e21323e50a5c5ebf65dae3de6293aacd657da6ab53bd1b67db39d4df516faa59837f4dda3aac7f525be66657533d7855aa79ce2bed8f95775a54d7e6c1cf75ca0f57646ef1c50fd15338ff884b857ea4ddb1d51250d1ab2e54926efd90c7bdd263f463e19578b454e8bb4ee4595760733b2c76c0e9ab58018b530dd7017abfeb84e4dba99e2ff2c7bcddef4f1fabbb53fa8f7fd9abd908cdeed45b6a40a9de7b69b765d5ed4a33dc01a126276f69e3530efa2ff2cda82652d5fb0476b7005b6b67796aacbcb6c0f624a5c67793727aa0f125e4895ac6455666e1e33985da8511566976beb799bf1e5c3dad8535cbb847abf961d58e825ed8ac44a99d7c8c0e76687d911d49d01bdf245760c5e74e62f7d957c8f1d1aaa861579ac50c3f9ede2ac8cd31acb42d628d5a579ce9e400f4edcc2dd404d3361bdece02c2cb2d3e8c542dd8fc09eecaabf5fdacb7a0dbd8f6f885462ceea5fb326afbeaef61f177187c2f6ec33d4fb8d787d76e69bd64509c219cc88ad6559449d7a0c3bd9b96aa10cbaa8591ff6ff31ffbc044dbb70a32ce0ba12565f2c9778751be6ef2de4590b47b26e2bff5c2ef17d87107517e4f390b5396b5f1b4db47edbb7f5ace3dee3ca138ca8e54a5937b4314a627491fac4e8ac975d6657d9757c37036745a5fdccd51a68bc4f6737d96d761765a83a602f5390ce94eb9d0e68c27df6001e6998e4d2ff627d4cd62c452e52619575499d665b694781bc6b43f25c7591955c03d7ee833ec9ca6e6463ee41eb5b52339e832e6edbb23bcb2a90a5b53622aeecf5b3d6822655b35ab693bc9dec20d29eccb92f65bb6637abe3acc7fe524ef671bf325f5f97e7589343cd5ed6cfeed1df912d73f6816b2958e75dba89db8b76a562e57a622f20d3dfc6fc784176a21c9476b3587f066db7b33e8ea6cd75ea6a5702e41c3f2def21dbf833ef43e35e75fcb9edefec6e5c51027d59c9e5edd37af2fa5af2ea28e5caecf887dc64d7e8572caf3ce00e967977d107b7627e94c7b5fa899ee5ce9e3bc89171857b865ab8f48d1cda35b779c8b26c9067616ba34e95f5af45f40a9841533c99ae7240f61eda2ef33c2f62ed99ea588772f9d25ebedaa3859f2ff23e58e30c3c93c4e1e86f799fc42ceddc6de13e48ac5df68375a57c6007308e01e40637f9906d903ce8563ecac7b26f9476cf794429b758edea9286bd43b5b36fdbba426b4471fd0d66678235b0fdb43ef64ff62bd5be5b9867b834eee05f28d97da32c646146ae1b66fa3caea2aafb389a7cea9bf96368e48ffaca1b3dc89fb0668cf956cc27b6f267b02ac810f297d812eed92e3efc9bf39eb4f0ccf6f3996e416e3cc5f79df9bd9cafe2fe4ff62b9d3fcfe7797c42c35ca0475d60ce451a31b745fe6adbfe51bfd9f804c8cff2b77c99bfe78d7c2fc4b779a136c963a5a56034fbf9813dc80f4df4dfb3756d93deafad55cef9881eee323f32377ae1aa711d747defed17df87b1a1c88ff313dc4d325cef8b4fa31eccf253ffa46fc133c79d8b92d9d5a3bc09754603df15f798e90c20036dc2685e41ce8dfc0c24ddc23df44d8dda904efa9ce5e79063045dce2f300288bffd13fbfb59666afec0299cb7f15adc460f8def7e3ce62dbf97b7d5a99ec6bfc38175fb18ea923b77c5d96a29efc068e2ee858218b1953df96bcc8e1ab8def64936525dc7dfe4ddbc179cabe697b816baaa5dfec4fe7e80a7e757f9755ab5936c9ef3aa986bda3e58e7abbe3505eebf7bac39e3d3e28a4f337fca6f4026201f57c59ae739bc6521bfcdef7875f58b7fbcb63987faf3599f43ef69df60b0b1bff3a97ef9d9fe3ed8c03cbfcfb6759df7b47aeb7b23d10759dc5df647be973f041f4ee23b2c6ea9bd3aa11ddcbc83a3332897b80636ceb7f2525eceb7316e7d612f68937026afe4d5bc16dea42258b397fcd7edc5b5dd896b83cdece4bba642f198f71ee61c43b1d68c6f49e06a5cf0f750dbb4a1fe7bc11586b88f5fe19d43c8bd753fafc737b7605a6f39c67f69293c2aa8d60a655be1ad30b8c3b55ab3fcf49da76fbecf3fccb250f85161fd5c24c3362bfb985dd6f1e89d94db2e5ce1ad77672e2f027d0f469d16993d7043739af54dafc8fd5188fbec5391b2f49eeaaeb503e36451a846cc1f70ddcea6b892633568be6f2ffaa5e8c3e734af1703f31077fa29d2e11b12f2eef4fa9b6cf074e5ccd0ded9477b5c0c8b517ca73f1f15e362923f165388bc97724ff28b9f25b3f6aeb969411d7b6266e03526e04d64cd48a5ef397d3bbee87ed60a83e2515be78aa7e299722a18492365899447bf73f5d9466f0b110eeadfb81f0619a78da33bc7a882a3e0f769681d607dad65b12113924b9cb1cbecb0783145ca1757dfffcb7f25bee4f5285da8e540ba50c942beebf7b147edd57abd5aad047e5c73597dd2a81b285393eac6ceda39cb95fda65cba981d5c668fd99be96eecefafef7f7fef7d4bb0567c83aaed076651cc8a79b188199a6a438ed658edc3a743d1cac58a4162efabba58468c32c1f7b6d66cc57e964bacf070d7cf16af30ababf761d672c8efda4bf1668edd32cbe21e98072917cbeccdee99a15a7df340f67c453ef2f6472fd9d1c6bbb09c9d507df255b4fff4ce39e4a3a0b3c57bd1f8f1f72fbe135fc02b2f753f2c7147ef42976d66c7c59ebd720af29a6837638e9e1d95de4f969e43b53c847fb48ed145ddc7359ab4d736e5eb78b729afac6c67633d0046632e8bfd30d4ef6bfbd5bf1c5f8a037b63766d8c560b532e0e8ba3e218a2e1bd9d172754736ec845764cd6de88df9863f17bb25a24ab80f318e38b53fcd6c9073f06b1bf6f1bb65334e1b9abb5bcd57edcf7ed65f3e03dcdd02fce6cc91dba1eae06aebd21b5e16165d78165c6156f57ea15f67ff11dde59deb5cf79ad78e69d9bf4f62f3c0e32e5e2bcb888eb3eee6ead5f1bfbd7dffcbed88777b6e30a3678c5636ff266fe5c4c8b167e6784f28eeec64836d65c7055a9b136629219ea4f7e9ef7f479e8db96ede20ae8105767e6d18f9b7d73a53bf836dc24ed0f7dfabef377bf2fb6714c715d33661527a0bfeda2ed33ffe26afc1d18aaa195512e8667a9457964f1f7f0cf66a760376d7c9359bbfda2931fd983e062d50bd94ad7f7a2eec673344ebf95b7f1fdfea7f8cec5c7daf717e2cbea58af17f05b86f11d485bc9ebd9ae7b2c86febde899735cc99a7f90cb475fc5df1bb3dadfd92554bf2da8b4e21e29e4d0855137f6c4f7f01d895968db86dfd21d18c9deda3be35f7d9fecdbdfaf5c9f0b7edff8052aae7a8cbf59069eba6f20590bbb85f3efe1c936f0cdf0cfdf7ea37c6da65e4c256b1697c595dd2dae35bdb555ce2ff3a841435b31b3e2c68e407c51262db49325bf67e3711d66e33be9bf125f3ecd017e2b17df9d7cc66fa71db90b5f40ae74e1cfcd6971eb4fec8b3d0ccde22e5c990a44d5f8c2f439c8e0281bab2bd70d59b61fea45d3ccb25dc8bf8b984b43a57591e3fe63cc85b15a7b2b5e219eec47df051c6532c74a6cbad19f7c532e3fb597b5bf3142ef46f0bbe08fb88618d7c78efccc8e6dadb80fda0f204778d147a6e486aa11ee8a07770b3ddfcae77656f8ecc98dec2ed858295463050db1eb0d3e87dc53ac47f1e767b0c7b23b7647f8067c7c8760405e87be3ff627ede58bbf218215f0543f29dcd18e6fa7d13e7ffc397a4988a8f1cd36c8785c11caa1aa2676db75ecb69a84aaadc45d2a182daf40f01e977cfb1adff5c4378aa7f816f07bfc5407b8361adf697ee7d5fb4d5ff6fdf8f2e1efbffcd0c759ea19bfaf22ef798dd7be1bb9f9f761d6bf2fb9f97bf7412f36eefb513f7fc15e7efcf75df08d0ecaa9f133ceed7ced90d17dfa4c6bf69b7b299beb2cffec6f636cf02f7d1ff90bd96cac85c8dc85d44bd220facefefa7debf15adecb5ce51436bd6bf0d5df025ad795c4df8e2ff997f2f11fe2eeeadce6df4a08b81efff2e93e6977b506b95a5b59bdf3b9fe9e8ddbd0894f31e69bf958fe51361b72f9c1df48fa2a3e6fc8b0bf7ad7e3e3733ec6b6b51a7f9d37dafda65c8a2fe67f5d665ffd7d988ff7177a7d3fc189bc36f7503efaa60fb6f15926bf56efc7cfa6febc47b39a936ce3bbb1b287183fe9af46ac7d0358ceaf1f9ffc163d6f53ae6bcf4d7281eb8a6d5cefff157bd99cd32fbe23a3d59a2f8a73eef85b3b9bdf67fe4a869ffdd3badd7c96fd4a4e701d8c64432edfcd917f256ffba8f3df3dffa3e77d6943ebbeeffbf1e57fc4f19bfefed85fe2f37f955cfedffff9dbff07a3ba6ff8</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c4b54c4e4bb44c067113a1dc3408570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e00eaba6126</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c24d4a4d4b03711321dc642308570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e0083ae60d7</data> + </image> + <image name="image3"> + <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c43531b4304c32017193c1dc44183711ca354d4a019b8306708b292301b85862120c22c492136170e8a8c3e23722c2a5d69a0b00768563b9</data> + </image> + <image name="image4"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d3249354a35037113e15cb0623d34805b4c1909c0c512936010490c0e868e3a2c7e23225c6aadb90090db60e2</data> + </image> + <image name="image5"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d334b343533027113c1dc3418570f0de01653460270b1c424184488c18512878e3a2c7e23225c6aadb9002a2160a0</data> + </image> + <image name="image6"> + <data format="XPM.GZ" length="409">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022630543251d2e253d856405bffcbc54105b19c856360003103711c44d4bb3488170f5d0006e31652400174b8483a12d86c56f44844bad351700a36a5d2f</data> + </image> + <image name="image7"> + <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c44d4e314d314d04719341dc1453183711c63533029b8306708b292301b85862120c22c4921293132118bf3a98aa6402eae8611e16bf11112eb5d65c0046af6444</data> + </image> + <image name="image8"> + <data format="XPM.GZ" length="2093">789c6dd3594f1b311007f0773e45c4bca16ad8d3c9aaea03f751ae7043d507afed25014220249050f5bbd79e995d550b321be5c7fc333ee2acae74ae4f0e3b2bab4baf533d1d9a8e19e84967c5ce46a3c5afdf3ffe2c2dc7aae3ff8aa4932c7f5b5aee4f3ba673347e720178e40171149938229fb0c3204fc4191b34b91706d9890d1bd78293280cf2b538135f928bc42405b9084ee3c6e3da694c1eb1d3489c928b344b290f20ee49fda331f7db0acee22ccab8fe4cd6599669f293b827de0ece933ccae9b06048d679c14668ccf91db1650306ab44c58af337e25cf22f64ad0ac5be175bf120b89b2adb4dc90fec6e2c3e0eeea5fef8d90b72d9cb7b25f95d5c487dd898ea40fd8bac888b8cea966c8aa230e479b0ce0aabb9de63eb980d77c165562625d713b16203dd97d2eab8cbf359712eeb89c55ae63f103b99dfb09b7ef47d9abce9f728967eb0106bf1bc319f47b7b6cc77c12e139e0fdec54a5c8ab5e6f5bcd596f5ccc48eeb40f7c9589fe7fa5b63aebfb24d525af254acd8d8af6d72f2a1581bae3f8a9d98fad9dc38cbf92bb6556ca0df8f75a65eef886d13f97c29f683ea74ff9db2f57c4eec9c22cfd82ee13ceada5c07bacfce99fa3c1ed856ee0718b196fd2ab193fd668db97ecef6f3717db331af977e2f55582fd723b6abf797d796cfdf8aebf3a9c45af6f3b3b6ec775f5cefffae76c53e6557b27f3c23574d7e835d2592df132bf1b47145de156ba9af37e67a25aed8fd290f84f6e0ffb7321a4b798c97e5542be3b092718703ff4aa94f7d2a1ce23da51ef09152a32ffa3ce19832439fbac767cef8acf5098b2fbea27184137cf5efa638c3377caffbf8fadc3f618e057ee01abd5bc70ddcf4a966aed08bfa6ce136eef85ebbb887fbf8130ffe5f8fcf0cf0108ff0d8f73cc13e9ee2199ee3452b637d8f4bbcf21daef1c677b9c508e35626f17b7af64fea671c6386392aecb6323dbfda0210b7014043890a0cd8f67ac0a1810aee60801318c23d3cc063eb0c5f60044f508575c0189e7de20526ed73865798c20cdee01d2f600e0b98c0c7a7ef62f4d558fefb7de91f96a1f1b4</data> + </image> + <image name="image9"> + <data format="XPM.GZ" length="1160">789c55d14b6fe2301007f03b9f222237b46a378418a2d51e4aa12db450e8936ab507c78f82cba33c135aed77df8c67129284837f337f7b1c715e7326a381533baf6c777c37138e98f28d5393fbc5e2f8e7efefef4ad5634efa0b7cc7abfea854cf1ce10c574b05eb79ba767dcfffe9dbd612d8e08d4683035d60c08330b09c01196792594e814d9fc9a60f34c8a687dc005b512b6c592e724640090c45188602380646927b4ddbbd2506b8f78ac8c306f08ba870af40462cb2dd37a008b2a306443a6a42e4c8d79c367c9311077590511d07bd1019724de438f789a8b8ed3e5bca88231f90a21e49e02391213f884a584640a9e0052aa062522906fc44aa3a767946ec8e2c95a06bdc23651d2fd927729c7b4d5422005e22d3932df739eda02e50a783f0923d22c3f090c8317ccc88b74a88f409ef19b5e50552d327b42d7516de21751dc377c4743730ce88dd554e0d3c103976b7396d571335f22c7ddcec49d7798da7ff3117ae740b3505bbdea73a2d9e725acfb4361f5ace0b3963b45e98d9725ecc4db55e7dae37e59cd1dbdd7e5dca697d8893e3d7bc34f7105fb42f3be5f3e2249976af4ae7c5a66dccf54d21179bc4f4bab3fe6d217707a574f6a0904b86bd6ebf7f3f1a9f6a0f8f4fcf2f9dd7c9f8ed549b9f9eeabf5f95ff44891e85</data> + </image> + <image name="image10"> + <data format="XPM.GZ" length="2478">789c6dd5d96eeb361006e0fb3c8591b90b8a39962cc9128a5e64df176771724ed10b8aa4b3da4e6c673de8bb979af9a9a4a7b5c2001fe6e7909465fbdb4ae7eae4b0b3f26d69be308b5bdbb13766d65971cfe3f1fb9f7ffdf1736939293acd5f18e9f26f4bcb8345c7768ea613df807b01d49557637a6a5d8a09cee0477119cd43b844fd05b6f06be3a4db7a1a9dc87abca76e2ef1059ca9e9415cb69e344ebb894dd55e9d66308babe04a3c864b35a7b085df1bf792d4f612f15cddebaae91ace50afc455b0cedf854bd4cf5bebfaeb8db3a46733ed3752675d35f7c526cbe08dd646bc0f97a8bfb5d6fa266cd5641ae769de45fd2c3a97379f7fc039bcd35af31f62d3d60d5ca19ec04e4db2df228de632bad0f9cfea22818f5bebfc1bb12972d45fe14aebbc0e3be4e5fcfd5e11fbdf47f77be227753f5193dc9f7eddcfd1ef21ba5f8bbb7085f92fadb57edab8ec9579a9f51371ddfa08aee0b5d63a7fab719595aecac40375955756f63713dbd261be575795d6791b76c84b3f9355e84f8770ec3f519bdc88499e6f13e6237fa036589f2fa335cf53d8185d4fce57877eda9f64ffb53389de1f5a83713fe81e36d84f017bec7f5f5da7e87f0b176a76d1b5ce1fc3a67692bf6a6cf376fd3d38ae7f091b78d85af3cfd1388f53d729f6770117f0366c707f0ea3757f740e7b9c479e6feb629ee6adb55ec31ef34fd536c5f9cee042cd196c6c2e9ec1de6a5e3eaf2eb7f1fec9f7b3f3ce38fd7eb7b087e5f3e60be77d21aed53e55933cdfdedb789e5db54bb1df5538be1f0bd8ebfec8aa7dea74bfdf5bebfa577081f50f60e3b52edfb7a3a2fd3dda513b9c9feed43ed5f3730e1bf48b753f52afaa47292cfb1d8d627f1ea9eb14bf67a41e45dfc2e1a53f9e83055318e6d7aba90c16312339c3355b0c17e435a5eba2cf35dff02dae3bbe0fff25f5d98747fcc0639ef0941f25f5c43349cdf53c92780e99177ee5377ee70f5ee5b5905ae70dcd48974ddee2ed30d6798777798ff7f920e40ef9087d9abd1cf3090ff834ece28ccff982877cc957fc3da43efbfc089dbb612461ad34647a61ed8c732ebe64fae1ac65189b5c11f390880cd564c97d66c8d348aeeb90d823e21eddd02dddd1fd97cc43488dc398d0941ee929e46634a7053d7f66c26a437aa1d7b046d3e385dee89d3e6895d6be6642aff5709a61486cd0266dd136edd02eedfd3bc386f6e9800e43fd888e438f5d3aa1c17f32a77446e7611f17e468489734a0ab5f333cffbf6bf9efdf97fe019b6f35ae</data> + </image> + <image name="image11"> + <data format="XPM.GZ" length="2013">789c6dd45953db301007f0f77c8a4cf68de92cb1632bf174fac07d26249c814e1f6449ce45127201a1d3ef5e49bb364d0ae2981ffa5bbb920cbb3be56ebb59ded92d2d9672395065d597f3f28e5e8dc7eb9fbf7efc2e550251b69f8d7a39ac7c2b553acbb22ab7a613e380330ba805b56a2df07e738e641445d21b9c63192731f9d55948a105b9ef5caf095daf794fc9f5807de4dc481b4983bc2a9c7a0f9c1355b51fde9a9c2489f23e714ea362fed85b179e93c306f7bf20e7fdc2982c83baaf07c08eb99f902d93c8fb9a6db8fe13391592ac72a7941f39abb8e8e7b970c3d793e450717f8fe4e2bc9be45873bf2b72d16f9fcdfdc2922dd98bc2749ef5dcbc9f2e390d693f30670bdedf215bd27ec0df87d2b588fbdb2b9cf8f9295904c2bf4c78c68ee97d80177212703f37ec98ebcfc8a9a4f384095985a9f6f92bb650b1f73b5b2a9ae7f595610f9d751c5523eaf78e5cccfbfbd7a69ef07952de4829e97c3ec85a6afa7b48d9865d73364272bfb824a721dfff393b7f1f22b20eb97ec2369af663721be17d403621d793b979bee56decfdf8f5e099ac0c9f5f8facb91f40769e37b9f93c05dbb01fc8b63ef9b230f5d3600bea0752b6e4fed68529bfcf3664c89c3351d40fc8263f9f3837d7afb20519468569fd0e3bafdf66e7e7d9cb9d916fc96ef8f5fcff972c2b9ebf67e7cf5f90b390f38a2d787f93dc59e67dca96ec8c9d913b4b1a08db837ebf959198f297b2d294daca18cc78f4b06fbffbd4466680431ce1338e7162e7a7f8e253b3cf8c4d8c708e0b3bdccf25ae6cea15df3632239b7ac7b5adf2817b36b58f077888479f193cc613dbcfa9ad7686e7e89e78c70bbcb4a9cfccc8f73cc4a65d658d2d9bb9c23676f0fa8bcc0ddeda4ec776dd3bbcc707ecfe9769e1a3ad33b6ab3cd9f92a06186ef433b0990c6bb65ad326229b8851607d6b5f2e73810d4c780d61af03363227202105856dd02e010632e841ffdf8c3b4518c010463ee1aeb407cf30deca004c600a2f3083397661014b18c36a3b83b3af46e5cff7d25fb0bce65f</data> + </image> + <image name="image12"> + <data format="XPM.GZ" length="1310">789c5dd14b53e2401007f03b9f2205376a4bc96b92d4d61e001510414454d4dac364262320aff010d1daefbed3d39d00261ce6d7fd4fcf4c715eb686bd8e553e2fac377c33169618f1955596dbd96cfffaf7cf77a168334bff986bd9c55f85e29925acee629ec07aaad725d7762bae692d801ef73c8f039740df71432702b60db92b305c42fa916fc27320e34c32c3113070990c5ce00419d8c80f601887516838cb19039f8091174681e163460c778912799bd3843b8622b2b19be6345d498c22011c13257207e45e24b907ac0063c96d3cc603d1c7c9d7441e99f02531c1510219b3d87443a0f0b351cf441a15103992e534e1bb8cb85103193bb8914f64c82d91e3be2e31e1a6eb19ca98236da470620974880cf94e4c84e10a287d4d1f786398648c91f0021360c2649230e0069938d8e519b1fb62a847e1a98648e9e01506448ea7ea1169df2ba49e6cf895d36cd4022abd115ea1496418be27720c5f64c453d5897485b78cca706fa89483ec13751f58cb88dd754e05ac1239763f739aae222ae4997e4ad9a3d7798debff988b922c1dd512f8ea6da474f190534a8ed5e45dc9e9694ecd26f305d596e92a5d426dbdd97e9ce47672f7b9ffda4e8fe72955add52f2e7fe6e4eeaa7192d3a97ab3754db5767ad36957d36e7a9bf6ee8e72b57efdbed9ea0d1e8ee6f5eb8f4ffa1d3e1fe52035180c5f2a879aedb89edf6041253cd4a687a7f8ef77e13f3e1c3a3b</data> + </image> + <image name="image13"> + <data format="XPM.GZ" length="2702">789c6dd6d952eb381006e07b9e2245df51537de245725ca7e6821dc296b0c3d45cc8b64c026401c23a35ef7e64f52f9f01a60ca13ed469b55a8ae0c74ae77270d059f9b1f4b4308b71d92947e6b1b3523d4f26ef7ffdfde73f4bcb91ee345f49b7132fffb1b43c5c74cacee16c6a1bf0dc8112379844deef8d5393a6a9f1a6c6caa85c79d36b631dc7ddb8ebc7dfbc8daeb48c3f36ce12a5949f8c2ec55a696fbe85ab2cf19e8ab3484c3bde45eb41e35e9229f8d8bb70f349fe13710ff1bc0be73df16bebc2c7dbc679dad63711670af5bf8b433eeac37926efdf80ab3cf53e12e7919817dea50af55d8bdb7c5d58215f24ce23a997185679e9f355702ea687c66e7bbaa9df2f3a15e70aebdd0c467d87621319f13aac609fdf94aa2bfb4d4371dbaf2bb8427ed81823f5ad352e52d5957e722e0efb4d637116497f79206eeb8bc526f4ef3918f56dc3b610fbf35354712fce7d7c2a0ee793cfc43ac2fc23715ea17f883711fa7f00a37f34870dea89608bf74fc5458cfa08d6e847198c7ab7605354de4fb015b36a5cbae388fa358cf3c307629d4bff0c89dbfa2f60d46f1836584fde5ae2d782d1ff425cc4585f0fd6387f3bb0c17a505f6165bdb4292ee352f9f80d58c37ebde5effd49c4ed7d70292e62e4cfe070bece83d1af6b7119a39f37c1321f295823be0f9b523c83ad98fcfd55a9a494fb8feec4aac27df722d6393ebff76213d6bf272e63f82358d6c38fc1a8af86433d27b0ad64fc595cc56246be4a63dcdf6f95552a91f32ff5d80cf5b1d46f7be13eb880c37d75262e713ef9050ef56cc1e80faf8bdbf917ade5efc7043670015bd8dfb7d6455bedbd2db631c64d30c68f602d26ff79b2368b707e3271bbbe5571dbdf040efb732eaec2f9da87c3793a0d967a08f95c07249fd4676dd88fe3d652ff3018f51fc2dacaf81e6c61fff9aa755b7f2ccec37d3b13db18fdefc206f9c7b0adc50fe2e6f1f6ebab6b172ff38dc4758cf11bd8d4b5770dd7e2e1421ea6af8ffcfe4b8ce102dfa55325515f622cd77cc323f73ae65bf7eaa3bee5a9f98eef79e27e4e79e6a3e65f621ef8919f78c1cffcc2af2eea8ddfff1bc31fee31bcca6bbcce1bbcc95bbccd3bbcfb29a6cf7bbccf072ecb211f390d78c8c72eaa8de1133772ca677cce177ce96abf7231d7dce528c470cc09a7ac5873c63dceb94fcc03223254480c9554b9c7524d3734a231ddd21dddd384a634a379c8430ff4484fb4a06737e78c5ee895dee89d3e6895d67ed743ebb4419bb445dbee75c745ec529ff6689f0e3eadaba2433ae22b1ad0908ee9844ee98ccee9e2730fe992aee89aba14514c85cb724e09a5dffa7c4d8a3465d47331b961f7cf207d8b99ffdfb3fcefcfa55fcb6370f5</data> + </image> + <image name="image14"> + <data format="XPM.GZ" length="2782">789c6dd5d952ec361006e07b9e628abea3527dc69b6c572a17ecfb32ec90ca852c79180e3b33aca7f2ee91bb7f99840a06aa3ed46ab5dad2f06361707eb03b58f831379dd9d9b51bb8897d1e2cf897bbbb8f3ffffae3d7dc7c6206dd77560cd2f9dfe6e647b3811bec3ddcb71de82c8086c3244f6bf1ae3a1b1656bc03574626d3a9b81abaa4129fabfbf97beab42a34fe511df2a9977b6bfe6d3847fe2bd8191967e4cf5dd988b17ee1eb5ce2c76a93c05b9d9361e2b41eaed47985f93b30f2d17b7495891fd4455169fc36ece1ad685d8fcfd4fdfaafe2b0ff2c11bfa9fbfa4fd4a6ae9db8803d7cdc391d96b5d57c129fd669ecefbe3a1b66babf4fb529b0fe3d1ceb9b76ce9210aff5dca98b02fdfd50c7f5f81df656eaa115719d3bbc2f17adef8b5b755194d23f4ed5a6403f315e259a8f479df3c4c4fe3ec0b15e592fb7799eeb7a17b083973a176919fb97ab2bdfe87c12dba2d67ab9569789d6c3ab708df536d475dd78c93fe96c52e3f1bee4bc1a6bbcf68bbcba8efb5957dbc415e29f9dcb2cccd7f59ed465025fa8abd8ef1bd8c3729ecb26e627995f8578f46b536d5bac77206ec2b8e65feaadf1576a9be8fe3883e3fc52dda44ec78f6003cb79aef3c6788d97fdd7ae8efd3f5487f93a7e0f1bd8c0adce27a9d7e6753cef33759c4ff27eacb3898e531e8dfb50c01696fc4d6e5bf46f51ddb45a3fc1ce78fdbc93f3d0789be0fe1fc3f1bcbec016f7a9815bd433523706efdf45e3fc3daa5decd79bdaa7ade96ce53e84cb14d7cf60ac6f3d6c61d75be337a351dfadba49b53edbc006fddd87add667096e51ff9adaa7e8cf4734eab562df589cc7126e918fd52ec5fd79860d7c0d5b9c87388ef7c35a7fe80ffa75071b5d9f5fe0564d52af6f1dce2fb1ba9fdfc02df6f3a96e4d2b66f9ff1484fdb28d467ef97fd186fcd86faaf6a9ee978e608bfd0da351cf656f1ddf8063bd87bd75fc46ddc6fa93de5a1ff2755f122fe363d3af3753b7b8bfb41e8dfb3685711ec9c216fb2518fde5ebe8b18ecbe7d978dc8f0fd5e354c7791736e3b178028fd5a3993e4cdf1ffdfbb718cb0d7e5c90d7a8ffc4b43ce62b9ec873cd3fc36f89fa8ae11bbee53bbee7077e94a8277e96a8698ce119bff02bbff13b7ff0272f86d1a510b5cc2b318657798dd779238c6cf2166ff34ea86997f7789f0f3486477cc8477ccc277c1a22b6f88ccff9822f79c84988d2989433ceb96013f29421e2942baec3d6892c351a438e3cb5340ea35d4cc8445734a16bfa4937741bf3d01ddd4b1d13cee881cfe9919ee899a634a3975833bdd21bbdd3077dd2222dd132add02aadd13a6dd0e6d7de698bb66927acb14b7bb44f0734a2c3107144c75f3121ea844ee98ccee942222e694809a594fd3ba67b5f94534186ca307e149e942aaabfc758a6674be1f3baa1dbf0b9eda9b6edf7189efedf33fff7ef73ff00aa8c7a59</data> + </image> + <image name="image15"> + <data format="XPM.GZ" length="2366">789c6dd5c95223471006e03b4fa1206f8423a7777587c307f6556cb3c08cc387eaea12abd000629df0bb3b3bf3af0e07b60a019ff2afaaec52233ead8cce8f27a3954f4b8f0bb7b8f2237fe91e462bddd36cf6f6e75f7ffc5a5a4eab51ff9534a36cf9b7a5e593c5c88f0ee777a107050125fae8cddfe002aed4b5b8d67c07d766de803d7cd43b4d129fdafcd29c1666f2eaba1f5affda3b4b529f59fed0dc0ff53a5c98e946dd881bad17700dcf7be7699ee4a9e65bb830f39abac9eb5cf3f4027bf8b97791e6beb0f9ce5c2430c18599757ee1c44e9dc3353ce95d66852ff5f079d55c26700697b0ae5fbab2296d7edabbcacaaeb2fa177395c2ef7009efa95dd55436ff19eeccf4d07b9c57588fde065bfe327a9c6b7d6a1ea7a8df45a3feaa6e639d6ea3adce677009df0f6ed50f70036b3f753eee6acb1f98e576312fd46d5dd696df851bd49f066b9df47c9aa28efbed9b9bb429d47a3f37be691aaf7eeced0a973aad93f6ebbc0bceea9bbddba2cd5a9bff19aecca4fdb49d4b6d3f7a824beb8fae6187fd7fc001fb7b735c8f93c19dfa1576663ae9edcb61bf0d38ee770c3bf868b0e57f465b3fc4e636b37ee810aed0df0eec70bd07703c1face7335faa67706526fd7bf0d2bfe569cfec335ccf3e1caff71676de7c030758cfb32bbbacb3f5b7d4c1c7fe56e1006f9abbd8df15ec3afd3ce4160e66d2fb215432dffa9b99e37cba80637f6338583f1ca243a5de36870cfbb968ab939e6f907e713eebe60ef71b6dc3381f5ac0f17e98c301d7d79803ce874f07dbfec77085feb66079e87afa7939edafcfaef7ca1c32bb5eba8bc6f95fc215f6fb0e3bac7f0ec7f3b8889e9a6bf574a89f98a719ea53581ef6cfcc06d3c761af7fc8386ef1f4a2ce521f3281a718177c29df3565f70a5ff30ddff26c582788efe4d9a7e676ff8bef653c0ce39117fc24af3ef30b32aff2fb23bff13baff21aaff3066f4a6e8bb779877787cc9eecb0cf073c91cc211f49e68d8ff9844f256599cffc45d6dd939e6565fecadf247326f573fece3f9049a49a72c6b9ac5270c99566c65c73438ccc26af1291a3960bf2d451e084a67441977445d73143247b1474439e8f2848e6956e69467734a79f96a17b5949067e2692b8a7077a94c4829eb0ce849e65bc4857677c26bbbcd21bbdd32aadd13a6d58e65fefc5a97471419bb2c6166d4b6287763f66688ff6e9802674286ffa111dd32e9dfc679df9ff8de5bf7f5ffa07d6011b20</data> + </image> + <image name="image16"> + <data format="XPM.GZ" length="2814">789c6dd55953e3381007f0773e458a7ea3b67ae24bb66a6b1fb8ef23dcb0b50fb264738600098130b5df7d15f55f6686dac930533ffaaf6e5976c53f967a9747fbbda51f0be38999dcd99ebd35afbd25f7361ccefefee7af9f0b8b89eacdff66652f5dfc63617130e9d9dec1e8a99983ae3d28e96755d20f1ec016de17e7b65f05ef05575dfe128ef9cfce92bf12e7393c9c3bed170ef965b12ad0ff22586755aa838fc48513f3b6b82a643d6fc15ad6f3cbdc5992f5b324ac3f16e7fd54e63d89ab44f6c3a7700167b043bf9368cc9b066b1de76fc21ad7b331779ee416f39d5817d83feada61de4ab0c9f3dc84fc81b84c72595fcf5da4d1dc8735ea2be24a63bd15eb22937939ece037b189fba16053e842d64b7fa312e9c747e232913aa773abd418eca709364a2ba92fc34e4cebe22a41fd7eee3253aecc829fc56502ef06d7a52bebe0557155a0df211ceb85d834629a3fdc5465ddfa75b14d5578f8e936d8f7ab64de21ace1cfced2ef0d8efdc2f3a3739de83c38dc5f6dfd03608395b856a82762abd02f3c4f26d70ef907b1298ce4cfc47583fabbd82af8186ea43f85fec69a44eaa4a2a51f6dc205ea256c30efa2b3d46fe046ccadb84ee181d82af4afe6ae739f977e1fd1b5d4d7c4752a66e46b050fc5b11f4fc40ed76bc2f3593b93e0fe9ec3b87f34830dcec3c0383f3a15d70afbb7d1d8dfb8b30bf3c2f5dba29b57c098675ad8c04d67c9ef46633f8fe23ac5f53838decf03d8c87e4c0de3fce9355af6c7b04d6d113c8315bc031b18f31dee8709d76f5d1defb78663dd886d2af3680ae37c6835da8aefe038efa6b3ec770437c8cbf93997c2e1fbda15b1ce65b40bfde859ec527804c7f9e1fbdf357ebdccd7e298e77358617d031b17de7f5cc30dbc266e309fc3fbaf514d8aba896e54382f0ef6f3719eb9d8e179a733d8e0fcd268d92fedc0d83f3d889bb8ffebce32ff12f67f82c7e216fba1f0fe6a55d7ff43dcc4f3de8ec679bcc3f17c0836e8c77023e6bbe856eae1fbbc6dbbfa95b84da5ce7bb06adbe05bb8150f26f261fafe91df7fcb18aef163bd9ca47ecb34dcf20ddf86cf1ddffb7f43ea2bc30f7ef5230ff9894721f51cfe77fc1233fcca639ef01b4ff99d3f78e6ab9f3eb5cc2b31c3abbcc6ebbcc19bbcc5dbbcc3bbbee71eeff3011f4a868f78c0c73e31e5133ee5333ee70b3ff192aff8daa724d3e78453ce38e78215977e52e5d76b7ff1444632549325e77f1a6a43e2956ee896eee89e1ee8b1cb0ce98946f44c2f3ca3571ad384de684aeff441b3b867faa4655ae111adfa1e6bb44e1bb4495bb44d3bb4fb75edb447fb7440877444033aa6133af53d76e88ccebf323e7541977445d7d4a7242452ca28a7e2d78c3fa51552545245da27cefc27376ce85b868ca1a9a9fd1bc7d1a37f8bb486cccdf70cbffcdf67f1df3f17fe031c788805</data> + </image> + <image name="image17"> + <data format="XPM.GZ" length="2862">789c65d4c96ee4361006e0bb9fa2e1ba19418d76890872f0bedbdddedd410ed4e66eef4bb7edf620ef1eaaeaa7e24c207b069ff9932c2ed28f95c1d5f070b0f263e96d6667d36a504deceb60a59e3f3c2cfefceb8f9f4bcb6136e87e9260102dffb6b43c9a0daac1d1d363d381460e1406611206e2545cb874d1d9d69da3200ab4dd56621305da4ed79de3302ab49d17ea3888436997feb1890be443efc888af3a2761ef2d7512a879ec9dc8789cc309ac79eb6ca5ff3b5ce8fcb6e99c4609d6672d5c845a4f0657da9fe1d4d7affd6d5245da9fd469a0e6144e51ff9b77ac9e786bbd740b1bd4efc733a9cc6fdbce5994a65a9f2dbd31df056cb45ecb62d71fed315cc3893a0bb19e356fecd7096c32b91cbc09d799b64b3d799ca5e83f867dfe15aef358fca1ce433812975988fd36b0c17eddc035f6a7f0d6fda06d753f5e05637efa80ebbc94fd90f10a571fd66fe15ae7e707b5efcf721f8bd2b753a2ce43d4b7a72e42ecc7339c6a3d54f596f9e9cebb10f3103685d6bfd15bf3725e26c9fd7e9ca90b83f516706d1271a336a1dacafd3255817af91cf6f76f556d501f4f61632ab1dc2ff7baf8fb1bc146fb73a036befe03b8b65a8fd46bab02e767a76a83fbc6a7deb8efefbd753f5f6177c1a57d5d6d53abf5cd3b976e7edcbf176f8cf7a8b64da9fb21ef57591bd4c333b50db11f9bde78df57e114f7ed0bb6babf740a3770d95beb1ba9cb089ec099d6c335dc94b558c6af526b71dff77bebfc536fdd0fdaf5c6f9bfc10dfa6f7823ffa4f6f5d08eb79e170de10cf7f913b6d8ef636fad9fe4bc2bb71eeccfbdba8ab09e1d38c3fb907ba3ddc0b6527fc20d2ce755bbf9701e27de584fd05be75ff7c6fb7f0837dace77ea2ac27d7a52d7519d8aa5febaf1ed3487338c3783adee0fefc10d7ca3ee1ec91f756eb2be7d4d5d47f0be37dee76dd8efe7b137f218af89747c6ebd9b4cf2f27e374d13e17bf3e88df55df7d6fe727f5ad71fe77de98dfe0b6f3d0fba8033b45bd8627e821b35bf78b7da2edfd7b6eddbafd46d84768633351ff66ec597b0859fe1563d9ae9c3f4eba37fd76f3e975c71cd0db77c83df89cb4c35a5f78eeff89e1ff8919ff819cf0bbfba7f25a5ef1acf78ceef6eacefa90ffe94d442bf2ffcc5ab2eb1e6c65aef531b2eb5c95bc86cf38e4becf21eefbbff0f903ae4233ee6213223d772e2463be5333ee70b377e97bae42bbe7629cd8c39e090238e39e19433ceb960e3964e64a9d48cdb9931555453432dddd084a6744b77744f0ff4484f3e23a9677aa1577aa319cdddf34e1ff4490bfafa37e35239add21aadd3861b67d3fd6ed136edd0eef78c8cb547fb7440877444c734a4119dd0e92f1972a9333aa70bba74892b97bda6f1ff32ad8c15b8ba428a28a68452cafe9b716bc95daa706318cb96acb5a57ebbbe8db390676cdd77dab6f6c64eecd4de2efffdfbd23faf5c83f3</data> + </image> + <image name="image18"> + <data format="XPM.GZ" length="5374">789cb5975b53e34a0ec7dfe75350a3b7a92d9dd8b11dbb4eed0381e17e09b710d8da07b5ed90102081844bd8daef7ed492da5c86b3557b9b9ed4cc2fddfa4bad56abe1b71f2b83defeca8fdfbecd17b418972be5881e567e548fb7b7cbbffdfdaffff8f6bd1daff0dfa8e8acc4dffff2edfbd162a55c3998ded51ed031404bfe08af1a27ca70a79cb43231867be32423e19972daea38e1abc0795bf8c63855c696729616a5706e5c181f08e7ec30177b32ce95c9e6933c11ff34554ed354e2c348b953b94a78c373d46a9591eeef41d90f61324e946953b9d137fbacd2fde29e72a77089f0ae71a50cb70dabff33e53c323e354ecb54d62f958ba8503db5cffd10ffb97292c41a5f6c9c1b6bfc79567524bfb4aedca9ec3cb695833edd18a7c63f1bd6fccbfab81595aa8fa5b21fb2bea39c56ed48f854394b8d41996a523de522cee342e62f943b455b793f70a2f663e5bc325e2a179132d4ca145552bfb06a5c5bfe77945d6ce7f3e4b91db55b165faa1cfc414799f5b59e87c645a5e7532a37fe5e955d66e7590917ed5cf703997211eaf152996ab527892f617dabaf893291ae873de5322b459fe4be24e4e254e3ab8cb33a137db96f699c94e6ef5a39dc078a94833d9d1867ca28fb4f1b3dba532ec9eaf3dcb856c623cf59ecc8f623f16654c6763f32e3acd6f92dcf9d36df3fade75e60aba74be532b6fa5d33ce94311176653dd4f86e95ab58f383278187439997fde7de5eeb7f57b9223d4f927ac85d64f50c0fca79a4f1d3a1e722c90bf5ef4a63bb5f0e958b4819526597e5e28f0ae132b7fbe74099d7eb7c669c1a1f1917d62f73e5a007a7ca95d50fa6812d1f72fe944489ddaf44b9284cff2cb0e9af1957c67de53a36fd8bc0aa0f6de1b2d13f57ce43fc7de3e0af540efad455ae6ad27e73dcb0f607d30bfed0e66bb2f314ff2ea1d4f2313526cbf720b0f6331819d7b6fe39b0f53b9bafad3f90bc5fae6ae69db28b8db71b96785d98cfcc5fa15c87fb830d6bfdef1ad75aaf20ef499936ef49a11cf4e9ded8f471ab619d7f0eacf9c44763d279780a6cf3b1716df3725fca2acaad1faa7dc5fd5dced79172b37e1058f5a0ab5c5abc80816dfea2619d1f1b5bbcf0d8b0ce2781ad7fcb7eab342ab59fe25239d863bf61ad9f993119ef07b6febf6e6cf5462f816d5edebfaa0ef3b8086cf353e5caea05260d6bff991bdb7b000d5bffdc37b67e4af2bed459bbb4f7665339fcbc0107ca2eec6f4db9d15f04b67e6cf6411fd61bd6f87ac6a1fe40b9b6fe092eb0f5c757e561acf50b6781ed7e0e1a96fb0992bfba0ef1c2b572e3ef4539f8c3bbc0ea0fbbc699f14ec3da8f82bdbd3778635ceb7d03a9ef61d6b17e8487ca8d7ddb38d83f07b6f773686c7a386e58d78f94433e70621ceeb79cc7709824767ec7ca6965efed4360fbf9f948997fbcd3fe38372eac9f55c695f5979e7251d97d3b0c6cfdb456a6d4f27fa9ecc8ea25522e433db694ab90ef57e5667ff7c6b63fac03db7bb36a3cd4f33f5afc77e3ffa3818084ee3fd7c0122bac71c8e3df5079af81576c3f62fbf1bf5241a7e32b0dbcc6095bde88cae8cf34f016ef70ca63f6a61334380bba87118f7bfef8887e51c1075698f358f098e1a3ae68349ef0195f782c25d2252bbc7ed6c055ecb2fd9ac4b18e3ffdda370ddc60bf2fac62dfb24afdab0a677c938757d13866b8e55798c6367bf0513436ac32fa9859dec78e28ece21eeeb3fd3a7b5c060d3ce0f587ac30fca0b1fc9859d6e8b1c6111ee3099ee219f659e74dc3b187bb8f71c8ee6f58c3bee37df82876f11c07788197d8c208e30f1a77bca28bed4f1a635668f3f78effdfe6287aac91608a1976388e1c0be0e344173400786df7bd06902974c1fbe8c94e7228a1821a86d8822b18b1c6b8d1e8f12a1fcb12c8a2d8e06c78851d99e9c1b53f1398c00debdcf2e706ee60ca51ccde69f42c9631677895631889f5fb1836a5ba66ec7f06f7acf0e0e3f075661a9bec4763e94a5ed47ff75d0c3d98c302e71cc9233cc1330f1fc5f2bd865fc5eb5e2c1ef9185b0cb060fb092ce11556390f5dc9c512d654c35703ac9bca35fc840dd8842dfea6d7e461ae3b816dd8815dd8e37f7d0cefea432a6a9f57facf011c420f8ee0184e6022114875fb1870ca319cc219f4e19ce319701c8fef35e002e7e271032ea10511c4d086c4ab400a197420e71b3265ffa750101210115732956f1a12c95cf6bc49155cf26fe343bae2dc4d684463baa609aba438a31bb6bea53bfe774a33baff74f71defce677d8b1e684e0b7aa4277aa6175ad22bad5297d6a0837d5aa79fb0cd0a1bb4c91ae5470daf422f3865ef279cd113baa22dda668d1db6dfe5cf1eed93e376bdcebb98d2011dd22f7dcc723263ab2768730c3d3a8227e6255b1fb3c6099d7a0d5671fe17571e67bf6a888aafdd3ef5e99c06e4cf6f411774492d8a389e98dabe26f8db180694bcddad4f6f838381f4a7be7dbce205c7b0c36fb068f89a6085ecebbede64c559f5c8c7fbe55d7428a742ee29d796c38f3df28b778e730553f686d2ebbc5fe433e021d9283fbe2d5f6b041d07307524778263619cba2fecff5c23e87c1e5faffc9fbcfbfffcfddb1f4bcc6304</data> + </image> + <image name="image19"> + <data format="XPM.GZ" length="2127">789c95d44d73da3818c0f17b3e0513df323b2d7ec59e9d3dd88eeb80430a69094977f6204b328a3010c020a0b3df7d253d625b3a21d9351cf80d7fc9aff2c7abd6e3a0dfbafa78b16e50f38c5b98a155eb8a6c66b3fd9f7ffdf1fde2d2755af21b382dfbf2b78bcb0f2ddcba5bcca9facde56fabad37455f336ce376a8d851b443dbb335b1a26bbb6d57cff34533723d3752bc33c440a4e8d99ee7e9b8d4449248d1320c819f157dc76ffb8ee227c5c0f149a0790b0c7ce0574d24a9c74e0d23605bb1e376fc8eab38d62c3b51a754740c09f09b62e88676a8e307cd328c42fdef8b21013e29465e48224ff11918d9c047431fb8d1c49258f1de30022e0c09f05a117911417a2c03221b3830f481074d2ca9c7760d113030a44057b1f4102df5d83eb0748013c30038d7249244b13144c09d21052e15b15f52ec2b6640ec0053c300586812493df6c61001678614b856243ea6448fad80c4010e0d03e048934aeae759182260624881b52295290d14732075805bc300186bca94eab13d4304a48614b852ac645ae9b17b60e5003dc300686b5692952231ac801fded94e1a0ba94ff9568309a1d5843d5ba575aee17c3a25b49ecdd9e2c542679a2563b25ad17addb00d7ebdd98a9daee85e5493037ead913b8b935457b110cd353e6d9075acb675c6d8a77c2b6ebaa70d26cc2a8f554f14b7795257fdbb5f9a7c79c0f858b1cfdb3a1119c33f379cecb76931305539cdf25a0c8bfb2f278d3c97b82e32a8beeee4aee441df9fcec3a6641ff7f24cce8ff1aece733112938731ffb9c998ba2a7274d52c9b91c885a8d78f4fdfc69cff38779eca485ee19548442dd49ee25df7c0364f6d75bea6b1e54c63a233f9e989753a9f34937e77f1324696b9cedcd617586572db564d3613d53a6bfaddcd8373bc17dc4ed24c656a1b0feb2adfe6c32acd26ee60f1effde2855727c5326bdcc1f3e3741cf7621a27a359b19b777fdc539f679ea8864dc01e0ed7ec76dcdbef7bb9a86eb2e6f4bef35def663960bbf5925dab8393d5a82a7e79e639efc8b2c94749c1f499ca1d0e5f5d179ca77652a76ca0aa557e66edc86a5feb074e5667d7d7712e59bdb106392fe45cf2b8de5ca766ae77d6b23eae77d7bbacfec33b81ffeff7c6b9e6efdf2ffe0193880354</data> + </image> + <image name="image20"> + <data format="XPM.GZ" length="5054">789c9d975b5322491085dfe75718936f131bb974030dc4c63e78c70b2a828a6eec43d217c52b228ab2b1ff7dab2b4f96ca30bb1b634beb67569d3a95555dd9fefa6d6570d459f9f6eb97a7a94c47e94a7a2593956fd9f3dddddb1f7ffefed797afd578c57d478dc64afcf5972f5fbbd39574e5e0e13e2f81c90155fc57c972024e2b4d1fbf308e34de578e2b71cbc705dcac469e53705af571e929b732a9954c236589943902d725f5bc05ce95e94c79180fb5fd333819669eefc1b93281d3187c659cd67d7be324d538e69f0ae21570ae713e50ce62f02658326dff1a58f33955cee33cf1fc084ec07760c9b5fdb57211832fc149a1ed33b01485e721b85026d56b365bcdaa675d8f66c8e7213847fede9443fe26e01cf3bf51b6fc700ece75bec42547151b4fba8187befd39385396a9722b427cd57333aa45babf364aae45b54a4df7cf9a67a9d56ae2791ddc04ef969cc4f54c59f63c4b3dabfbcd2dfbca4904ee04d6f607e03ae2d78155bf5972a39ad431dea931da3f07f6711a805b60fffc348689f9b90bace31f1a273e4e37ca0df377648c785172b36a716a836dfc29d8c6ef1a27ca7ebce6b05187de1cdc024fc0f023c7c60ddd4f35e566a47af25072abd6347fb3c03ade35b80ede3386de11b805de0aecf7078d3da7a1ff061871ae8233c4778da1b71658f59e955b11d83f3f6e3b59fb2765b73f753f6f82cdef4360edbf6a8cf66f60f813ef47528b73076ccf8b8033c4e3c0da7fac2cf04371609dbfcfdfb066fde545d9da731158f5e660f3bb1358e36cdcd2f3610f2ccae2f7db3013d1f6543546fc129cb7fc79237ebdd2bae4186fdb58db937ffed2cce2f4aa3c8cc1eb8175bc477002bfc682f126e01cf5645f394df4bc235f8fb2baf5e71a18f3e163b0f9bf524e639c9f2d30f4f80c2cca42609cafe2fd67791a233faf81557f0b9c806f8dd5bf6460013f19eb792d2330ea9df8e72f4f42fb1b30f2411563f8df56ceac3e76c0899eff6471417ddc3446bd7b02e75aefe845398f95c5e73bcf33abd77570827ade34c6fa3402eb7c8660cbef6a60f593806dfe6bc6a85f7363d4abbe728efa4fa781b57f618cf93d04d67a7c0b4ec02fc6a8e75d30eab9f8f78f2209f3cbc0980f5d80e1577265f3c33db0d5dfc418f33906633da81558d7e3126ceb736b0cbf3b81753e27ca45acef1b043ff6fe417efd8ac2fc50648cf1cfc1b65f7ac688ef07d6f11a60f8e3b631fcf5950bbc3fd14e609dcf1b3881ff8131de97c66001cf02ebfbd3088cf7a7ee94a93bfdf9cb6b0a0f997e5ec76ba49c71cec5cfaac0c7255f398dd1ff51f9de317c5cf38dd7f80f95b23fdf2ed510bee37b68fc50c5f77fe0b1bb96fb78e449d058aae2fa3fb9c8d87f96fb98f2f3078d0515efe02528cc7ee0e395df3e697c5071fde7aedf7b64ccabbcc6ebfeb3f1c1c7266f2d6840c5296c73db91a9cc788777798ff77d663a652bf838e0433e5ad0e8fa391c738ffb9f7c9cf0a9d338e381fbbdc3e77c011f158e38fe4ea3ca35ae73c28d4f3e4eb8e9345ace9df3410c8d9488c4692e68d09052ca167d504e45e9832e3ffba02b1a2dd1b8a6d4f9e8b911677e4d663ea303ba29f341b7dec75df0714f420fdf698ce9113ec66165474e63f2231ff4f44961c62f34f13eca7c8c3f5c039a2ecd47e9e339f4f63b895e6846aff03178d7a0379a9b0f5a5df0b1e6f7a01fc98df5c64f34a575e4c3f5f47f2b3f63efc3e7831e16f2b1612dddbdefee9b34371fbe67f87cf0f1bce063cbb7edbbfbadbb37689bdaf4aaf970fd764a6dfc0cf9a0dd857cecb99eedb27779d13e759cc6017c9882aa1c061f47c107f1b9f3d1752bd5a063ead13127d4e76d3aa103cd07eda847a770ea94db211f7b960fff649dd3190ddc5af5b847e7d4a70baa50613e7cef5b8ab8ea721453d53d712defa3663ef07c9a4a9d126a50d369781f8e2f9d46cb65b24ab1b0cb448bcf847c3e6a968f704e781511194a4a4dc9d487e452b8d9bbf1e552ae4a0519c9c865abf431f9e8e35d45aeb9e3fe1fb8915bb92b7dc8bd3c7055c6f228137972794a5cbedace57998ff97b3ede5564ea549ee54566f25afa907b9acb9bcce5d1395b9535c99d46990ba7e2f6527bd1c7c28cd6e94436682a9b4e614b32d996b6ec8870e13c955fbb6e97169ff3b130a33d97dd82da4e615fae654f3a72e0fc95d7350df492433992ee328d0f5eeee4588e38929edb81238edc1e5af673a9065458bacee9b9f4fdb9fac34bcfe4a555ed822fe4a4bcff5bed447df9fbb72fff000126f975</data> + </image> + <image name="image21"> + <data format="XPM.GZ" length="6974">789c9596c97223390e86eff5148ec2ad6282ad4c2953993131072f927797f76d620e00336579b76cc9b6dc31ef3e14f123db2ecbdd3da562a93e91047f8020c8df7e2c9cee6e2ffcf8eddbd398c7977ec10ff971e14735b9bd9dfefb3ffffafddbf776ba10fea6657721fdfe8f6fdff7c60b7e61e7feae9e014d02502bfe99314be4a2d551f6db60df2a62ffeb8c9396f5d306b850968172d249e2784a2217d6cf3abe08fd6a7f0d5c28d3c18cd356584f794939317d37c63a5e1ec185aec727ca6927d57e9d5fa6d0e3b7c018ef378c313e9d713bb1f1f264acfdbe02dbfc1763cc3f007b8cdf6cb88cbcaedc6e294bcfb89d44f6914b9bcfd17e27e9b43ab19f63bc3adce9b4e37c77032e3a1ced1b7b65399c7196760a1dcf6f60aff6dc9572d6ca6272f81a9c2973cc8f2cd857bdfc6c0cbd6de5305ed7bb0797cadc0257e06cc6791af4ab3f57ca19fce7457095c7f5dd50394f94290567ca12f7230ffe62feb17296215e5370a5fec89a720ebd6e609c2bc35e5e82cfc095b2c47ce9b673f82727c6d0b30a36fdcbc6dd7664f477136589f9d1952efc73022ebb12f51fcdb86837fef5959b788dc119f24994bb09fcdd025bbcf6234b17fef339187afd52c3daaff3a530bd97e00cfe907111f5ca05b804f7c19532c7fd2c3b590be76b47d9ecc9b8619d3f01231eee40b94cca4eb45746f6d62fd7e04a99e2790bc705f5879ec0a82f4cc6a827bbca65027b2fe0ac507d6760f847f13cb1377b542b67a8575228db788e7aa4d39ce7dc98a33fee165c88fa972817967f77caa5f94bca9ca87defc099c64756c0acf665195cb38ff6614f52651945ae3a05f45c83bd54d1bf52394f34df9cceaf8a52fbfdb37209bdde1b637f1f94d9e27b0b66e83d520e7a22d32138d778b81530434f77c63e2becfcdc834b9f45be0457cabea7ccc82fbf0cae11bf4563e8992a4b8a7c8be7d78778a83e7e54b6f53d290be2ed5f957daa7add03987d648ef95cfda1ff42b92c2bd55f832b65ffa0ec73ec5717cc1a1f89f955d54d7ddb075755bcefdd8b723751e65be5d2e2e59543c18cfd9e956d3d8ef1acf3702023bbb1b2d5232995433dd3fd9f28fb5cc77b015b7c30df231ffda3b1fae39f94ab147c0fce552f45ffeaba5de8fb846ec0f65e6163ad376e4d39cba0b706977a5fd29572b7d4f3ebb6958b12f75f47b94c908f5330ee17c678ce747f1dd697bcd678de29d7a9f6fb5b70aef1a6188f41dee8bf36d6f7803b52cea0c775954d2fed36acf198822bf873ae5c26ea3ffd540ef91fcf276f2a8be97951f6a80f6e43b9c27e49ae1cf4c7fd900ccc3a5f3ae0e061b40f7d8354e341f1bc0d06e139a97a5b60ec273be52cd3facc87c6fa9ea16b30fc7585729e60fe9331c65b3fee4b3a31463ccec095c69b1e95bb19e2d736863d0fb6f8af1aab3db70b46fc69cf18efd51563dcc70363d48354393c8fd5ffb631de1fdbc638df5b60e8a58131f2f3d418f57868acfbe3fa60f3e7d518ef892b63dcafe760f3efb261f5af678cf3f6d318ef9b3363ac0f7d25fc7579c3fade1e19e33ede33d6f9548133e443698cfd367bf67e79341e0c226760ec1f5f802bbcb727c6782ff78de18fe9aba0efc678a0fe21df18e7cf6d36acf5651f8cf706211eccc8cf7b30ce2b1d35acfb81fd9714efaf96b1d65f3a36d6fb88614f72bddffc5bc35a8f2f8c711f2f1b235e88bf30f67fad613dcf99b1dae3c218fbfd64acf688c135ec8d1a567b4363dcdf5363d4a74439944b7d7f358cfbba6b8cf5049cc3fe8331dea76fc6b8af860d6bfd6363d4bb6763d4370263fffc9531f4540d6b7c6c7dbbcf4f8dd59eeb806be8b96c58f7f7d658ef474e8da1cf19431fea4f85face4bc6782fad1a63feb131f61fe7b9ca510f9d31f6db1b637f6c7e8ef7e2b531de23cbc6b82fea86d57fe473c5fa7ef60363bd4f65d158c7cbab31f49a7f35cedf8eb1c69b9e1b567be7c63a9f91efcdfdbd62ace79b7a0deb7ac89f3ad7f710dd19637cbf611dbf0e668cbf30d6f3ee9e8d51ef6d3df30ffed7d04fdbc6187f688cf188cf007a19fb39b0fc6d1b43ef4ec33ade98d1bfd9b09e2fe4eb6c465c6fd470ecdf1bcf3e8e1c3b71de55ae760377e186eed25db96b77e36ec3f75d68f71fbf75dedef89d0d710f6e34a73d7ef1fb7c1ba3b99fa72f7ebf72633771cf6ef4cec64bb4fff9f33af7d7876061eadedca25b7a6763f98bf556e6feaa1a7a6ec9f5dfd958fd3f74ac050deb6ec36dbabedbfa1b3a3ec7633b6ad8713fddaedbfb6063df1d8435573eb4c35f78d68ea2866377122c6c85cfe93b1b677f2b1ee7d0d0520d2e71e9071b7f1d8f76d4d07159d4d077b9ebbae29d8dea2fe351ce34902372bbc46e8b843c55547fb0f1a73a68e0a67441c36029c6812ee98aaea9a69b7736067f160fbaa521ddd13d3db89446ae1f343c062b4f34a6c9071d9ff7c55a8f424ed30bbdba34ee454ed3a0e18d1669e9c379f9420785bca1a0857ad4a7555a8b1a7cd0b01e2c6cfc72e606f3e2419b41c356f8dea61dfa196cecd25e8cc33aedd3c1a7733b9c6b614487f83ea2633aa1533aa3f3e0458b92cf679fd25f75c499eda0a313be33caa94b0595ec9898596832a77e0ce758d87123f6a1852b89077cc143bee42bbee61bbefdc2c61ffb72183ce8f11df5f93e5878e0113ff2138f79c2cffcc2af3ce5b7793678f1b386597ef1122ff30af7b8cfabbcc6ebbcc19bbcc5db5fd8403c78e6c1cfd07683963ddee7033ee4233ee6139a84d9a7a19df1f95c1bad391a124eb9cd1dce380ff3bb6176c1a53821e1af75bcd33012112f95d4e1df815cc8502ee54aaee5466edda1dccdb321f71f35c8838ce4519e66ebcb980b99c8b3bcc8ab4c6947de645196e6da38d0bd9065eac98af4684213e9cbaaacc9ba6cc8a66cc9b6ecc84fd9953dd997832f744043a88123390ceb1fc9b19cc8a99cc9b9b4dcab24b35c097d331de91c1bed593c24e4a464a1e5a175839e424aefa8ef89363dbb911734efabcf367c0d0dbda0a71f468573ec2f42966dd18e0f39ec2fd1ae663afcf53c1dfe26ea081afc6d6877a105effc831ff9c7f01d2aa21f43c324b467ff32676f5f82dad7b0e6d4bd7a7287fe2d78b0483dbf14dab25fe17d59f4bdd0fafe3a58589dab63cdbff8f5d836e4c06f86cf46a0d064490eb405da6afebfddd8f8ef3fbffd0fc8a6e071</data> + </image> + <image name="image22"> + <data format="XPM.GZ" length="4574">789c9d97595323371080dff9152efa8d4af57ac633634fa5f2600c2cb01ce63e5279d01cc636f8c0366048e5bfa7d5dd12c61c45c22cc767499f5a2da9edfdb156b96cef57d67eac4c6766d6cb2b79d74c2a6bc5c360f0fce75f7ffcbdb25a0b2bf42f88ea9570f5b795d5a35925af1c8c86a505a4fe15a8f2976573a31c29f7854d994596e196b9611fe699722e6c7ac25928fd4d47b80ccb84f9de725075fd61dd71c0f3e19d7010099b52b84c747c2edca12f1edfb01ca6611ea6dc5e58ae05615e0bd8d715ae5585cd403952e6f96a29318f8742b9218c1de55cd80c2d47412d8fc4df148eaac266ac1c697b9dd9101bf6e7ca0d619c2be7da7e61390ea33ce6cd42e5b8aa3c548e85e15a383705ef2754954be553e1221436bc7fb171e331f12cf19c2ba7caa572210c7bc2ce87c67212c64522be33e124103623e558188e857d7cbf1ccbfec2aeb0f343ddb1b69f2827da7ee558da91d79798244d24de48d8cfb729ecfd5b8e753cafaf5eab07f51af38b722c0c67c2ce67d0b1c6b721ece3d5f13e3ebe5ff58c7c19f3a972aabcab5c08c38eb0f7cd95d507cfca46fd7cbe1bb57ad190f847c28d401842e558b926ec7d6365e7cb9833ea2ff115caa9301c2817ca32df6b7c2d65f541d3b3e4ff5ed9e5efc9b39c2fae3f69d42852ae27f82c9c06ca27cab1304c84fd7c46d9f97b9ec5cfe72fcd697cce0ccaa9f258b910862361ef03cfb29e4098ea9df8793e13a58591784361d70e6dc71da96f9972a2ed43c7d28e9c1f931b63249e81b0f77595753c068e757c4dd9e87c1c7f16654956f0f844d9086355d8fb22c7321e7e2aeb7e62dbb1b6a7cc85f73d2a9779ccf31b617f9f51d8f9e0c6b1c67fa45c2a1f7a96f703ce5f1ee7a1f8615b3911c67bcfb2de3b65238cd7c23efe8eb29b8fdfeff2a270f52416f6f19e3bd6fe07ca3a1e1e3d73bc980a7774fff1ca33b71bdecf22a67a25ebd9574e8471a2ace711a7c2eefd16636517ffb1b09b0f0e3d4b3c5bca89f20373e9d68b3b8ed5bf2eece603edefd7b3a9ac3eb85436eae7f3634f93f6dff62ced1bcada1f787de5ab7f5fd9f56f29bbfea5b2fbbcc0f5a4f3ea6f28bb782e95b5ffd1ecff3c0868e4af8f1c9861bef0149f384aecf0ef9b65078fea527b46f3f4b08fb778675ffb349a019ab70eea3dc4118ef11e2738c519fd7cc0477cc2f9b2059fc9ffc27f35171d6c78a471ebd8c20ddca4678bbe7fe236eee0eea28522fc4511dce0dedb7ca8614ae3f7d5708087d8c6237a8ee955e32c784286535ae5199ee3c5abc31b2ea9778be3b8c26bac628021d630c2985eeb8a855631224342cf1ceb6f1c238ea1459606fd3cc614d01a00c090a78a3164ea78c13d9af10272ac43e11c58d01c3dce430b4a8e65133a70035d72f4c8d2a3580ea00fb7b2d3b486a18d018ad77c501473b8a3dc6dd0778bb3189363004330308231dcc3042398d2dc9a558aa129e763c1915114d6b0010f94cd6378a46c0614c113cce1195ea009403901587f7f46bc03c861f7e28af2d0818ecd264ca045860dd8842db200fc846db8fdc2d1a37361e7b759b0797031ecc02efc823dfaddc323d8ff2a0e38c0091ce2158fee421b8e348663388153729c516ecff1e9ab38e082e2bca435d8f360f7a2a9315cc13554c931267b0bcfbf88a3a09bf568b301760d938518ace19af231a1bd9dd25ce1670ece481fa7700836934f50234744793855c39c5618d309fff0fe2e38e690d0096d531c2d729c419d56609f393d0332b4a081d9570eb6ec424a67b4cde77b4cbbb963907eb76c0cd0a7b3f9491d59bafba7068ca1b3d4a6b340f7047a26a33cc494096bd8331f5a966b101458400a539af780eebcbd2353ec9bc2aed5d01b28d59e77968f6aa1b9c10b3ad5dba64b156cc8d5313337a667fae6966e6c7fd9b2900f5fa7b158acc96e37c97d47773521cb522c0b0e5fa73fca9b5a06d87c1fcbbbb5509db6b5e953cb1dddf9a558fcf978a61bc31160f333c3522cdea2677dbc58a7bf7e38960eedb5b7c867717a16ea3451f95f2cf279ff6d9d466386df88a549965b6b91ff63bdadd3df799cc58cf04ef3716e6330e3ef1a5e2d7061eeddbe2cd6e9ef5b6066ebdaea3fbfaffc0bcb04b0de</data> + </image> + <image name="image23"> + <data format="XPM.GZ" length="5502">789c8d97d952e34a1286effb2988cebb8e893cb62cc9529c980b838166315ed899988bd46230e00530ebc4bcfb4955fe250ccd99e9ae96cde7aacafc7329c9fee3c7dad9a0b7f6e38f6f0f4b594ef2b5fc4aeed77e148fd3e9ebbffefdcfff7cfbde0ad6f47fd088d682effff8f67db85ccbd70ee6b3b2025e2850c3fd73fc52735231790e8df9ce71e2990ec089eda75ecd36ff00ceb17f5071b3b267eb9760ccd3b17135dcfa99e3da3ea7359bbd39d8ef6f1bfbfdb40f0e9bb69ec00958c039fc5dd56cf39715070dcfb4675c0dc7093834e6cc711ac01fed7a0e52c73be004dc00e7e056c5ad6690b79a8e7f1ab71ae01370083e739cfa79cec13ede028c7869db73cbf9e3b2e250ed215f31380fcd7ed3386c18f3d8b1b4902f8a8cc33014c721383116175f148479e49a4f8e8ca38631af3b9610f593d0b3f9932de3a8017b9be0c8f6d346cde61ff6a214dc0517e0fb8ae3208a908f1b706af1c8d233d677c0456cfede8ce326f8d5b1c4516ceb1fc129f8195c188bebd7762b2eda2d377f6bdc6e1acb1b3802bb7ab4b3187a6408f67a26c6ed26faf1ba66575f7906c31ea535678e9fc02938001760771e92566d6fe0d9e2e1237084fe9fd46cebb73d239e47700a6ed6ecfcc90d18fea5f09c98fea9b1b6b3f10c1c81dd794db2a469fd4d637004ee7b4e2cbe393835e6045c809dbf344c52ec3f041769e8e6dbc669d3982ec011e65dfed33c29707e6e8dd326fa3bf70c7f31384a7367af04fb7e24cf36cf21b83016771ef5f8f97cb68cbd7d3900439f3c8153e82fc0382ff2e019fe22cf62f1c1be348d89c111e65d7d25177f5e72b03f2fa79ec5ec076001df804bdc5fb63c63dedd1fb3504aeb273ef09c99ffbe711618d3263836169b2fd49ecd67c659007b0d708cf373e7392b1c2fc062cc3d70692c4e5f1e79fb121867b1e9975bcfd0730dc67e3ef49c478e9f8cf57161f18d3c637e0f1c1b67eef99617827e97045cdafeccfc69bce89f0cecfd5f18e731fced7bce2dfe11588c791b5ca25f763ddb7ce6ea5944b5bf0b700c3ef46cf9ca266041fe7a35dbfa1d30fa21bbf28c7cbe1ae7a87f760946beb371cd56af1918f5cc0acfc8ef39d8c7f7e819fd0e3d455cb8f5e29e3745e9ed672518f66402467db3bc665b9f191701f27b0d8e514ff10c7fbb6029dcf73b1a824b6376df17cab840fee8085c96b19b3f352e03f4f7c0b3cd67ee7c971a0ff24d605f8f73b0cfffbe71817e942be332809e2518f37c52b3d5833d97b67e0b8c7ea373cf987f0597c6e2eecfe3b8d673665cf87a8f3c43df2918f6a50b463d64cf58f5dbfa75b0cfff5dcde6ffd2b3e54f080c7ddcf13cb6fc6f1a8f7dbd1f3c235fc79e51af37cfd83f04c7c6e29ef7e371ad7703ecf5bed46c7a4fc0e81f597886fe2918fd22c735dbfab1b1ea33ee80a187bb60d44b4acf98dfa879ecea2be031e2bdf76cf3c3e5af83898533ceb9e092c75fad781f5fdbe04bbed26bc2d77cc3b73ce5cbff6f83673ce705df7db8267ccf0fbce4477ee2677ef9343fe7d9aa0dfde49e5ff9cd5d6fdcd1f70eafeb671bdce54ddee26dfea91617bcc3bbbcc7fbdcd371c07d1e7cb031e4111fe2eae9eb915a38e6133ee5333ee70b6e70d35909b8c521471c739b134e3fd878e31eb1ce4744fa3a21e173ca28a7824a1ad3255dd184aee98617744b533766a4d17fb271c801a91fbaa305dd5719a5075aea1ebd56073dea78a2677d7da697cf3a38560da15a58f088e6eae956d7bdd21b75685dc7860e7befeae7aa46635a7cce076daa963eb78855cb962a22daa69f3a763076698f89f6555f8f0e54cb9c3fe950efba9b0f747795b516b7a9af360634fcf5d2884655663ee978550db1cba7e69c0e35e76dcdda3655f5f965d0310f758df6c9a7587a5a37cda846d3d32bd0cc1cd289fafccac69ebe0e2b2dbfd4a5a7165a74aa7938d4389e346f3f2b1d9a3dbd74c7bd7edaa5bebe9f39db4ecbbb0d3aa74dbad041da3b81c6d3a70b8da6f1373a9a9ab7c1bb96957c04ae7f83aa369a933e05d4321dd4818611748414515c558cafa85ddbe868655d4e5d2433dd176834c9d73ab48a23ed80535d95beeb10d6de9a6b7c6d579baa4baa8cec381ddd6ab5e544ffee547f0be910c9247fb741e79a812dd5d2af7a4b7312d14c8abfd3a1df054b19cba55cc964c5c64077579d15aacf394e95d751e563dffcebb5affd3e956bb9915b99ca6cc5c61107eab73a8db3eaec6a8502997fa5031ac6ba7f217772ffc146bfca92de17aa0eadf2325dc947df74d0a994aae14196f2284ff22c2ff2ba6a43cf49755fa93a7c2a6faae159cfec271daaa0e3342c74accb8674576de85d2ea815cc38a1b94676ab2715f9a02eef6b0696eeba954dd9926df9a93676566abbab91a4f2e6bae2495fab7bc7a37650ad4315ac6ad8d3fd5dd997de071ba7dadd7a62b52a95955b8da6ab770b5f97912ad8540d07d0d097810c6524872bf9186a55a7ae2766aeae7d5a97233a361dd070ac0a4e5441a5e154359cc9b95c7cb0d1aa6aabd9d43cb85c6c48436da80e9783a65e816a684143f51b2c96b6242b396dc9911fbabb7aadce558f06d030550595867445433be3771b5f3de7c83dd7e868258a7567a1ab5918a98276461967f26ee3eb519d812ccb72f7eb699c5dca6b76954d745c67379248a2bfb17ec3c6ef8cff6de377c7f7fffef9ed2f80c853d6</data> + </image> + <image name="image24"> + <data format="XPM.GZ" length="1947">789cc5d45b6fda301407f0773e4544ded0d4921b249af6405ba0a5e5da8b264d7b706c877b82038442b5ef3e1f1f9785d2292f936683949ffcf7c1b1432e2bc6f741d7a85c96d61bb29952834e486a54d876b9dcfff8f9edad54766c437ebcaa6195bf94ca1706357a49cce1da94d7665535e044d345f6157d491f986afac81b4d8a7c025ad52ab5d4dc29123a30d4749144d1870ebc05da558bda6af415091db8d674915da01338be1300ef811ef1028f001f8035bb66d56ce0005877ea5edd015e29869221f00ee83b75e6abd1a662e87bbe1a1d6906c8474d867c0106aecf0217b8410616926a7ac8992295a4c0966680bcd664c86720710346d4dc399258c885a687dc2b524935f7a049905b4d8e64c0d0253c547397c8d046b6356bc886229364c04c9320634d8eec00a91772ea013992da48a15943f61499a49a9b6812e44e93238740e651ced4dc08c96ce458b3865c297249f5785f14b4ff98318fedf38c494828378447d158f65cee98994ccd199d2f96314fa26835862e528cbd67d674335f6cb7592c44b293215909be279957ba3fc87745838bddeebd8eec3ccd65ccabeb837c9d641986c6ba523cc9676e9af32d447892afa316745cb319ce5a87761ceb1f5355ccd335cbd094dcdeed3b1d5da7737fbcf9fcfe440fe674d311aa8a0c74cff60742e35edb4cfb6a9b07ac75dcea93b348f96a37943de18dedfecf699c9e97897793c4cb51eec03e9e29ac6528da8f7f39535d298a92ac918f9c3f3fe970280e2791f3cc534ff07941a6cf45f65c90317b22a3451921962f4519b981a3e24cbb30b3e28d665126ea14d6b9f8f0e7fa3473defe59e6d7d7d26f4dc4ad2c</data> + </image> + <image name="image25"> + <data format="XPM.GZ" length="3709">789ca596db5222491086ef7d0ac2bc333672a09b6ee8d8d80bd119150795f130cc6cec451f4505e58cb0b1efbe59995935c880ab3ba61df291957ffd9555d5e187bd52e7a255dafbb0339ec493bbb49476e351692f9bf6fb8b3ffffae3ef9d5ddf2bd16fe497bcdddf7676db93525a3a7b7acc0d201040997f0c436c388cc328e4c170e73866ce0cd7925a54f3b9de779c30df2867ca9ee1ba6f19f62dd7a5fe5ab85e51be540e94af9813cb30742cfa15e5481816ca99e69f0c47d520f32bcc5f846d1ea696a32af35238aa687ddbb2e607ca81307e624ec38a1f71be2b6cf3008e531e7fa11c299f2b67c230331c571ddf5a8e456f2e1c57348f96258f67ca81729939b50c8563a99f28c73abee558f27de55c39359c542de367cb89d49f0a279e72a41c2a7f67ce2c43cf71c6fcac1cebf8a663cee3a172ae5c379c068e3f5a4e03e603e1d413865c39541e336796f1c4b1f8b9578e35df702cf3ed2be7ca35c35960191e2c6752bf14ce3ce58572a8cce72bcba34a55eedb48d8e58f1dcbfdfda61c6bbeea58f243e55cf9abe13c8c8240eef7a3b0cdc393e53ce4f147c2b9a7dc510e95a53e8f22d1c350d8e59f1d8b7ea21c6b7eee58fcf1792bc22853bd409846487e66b990faa970e129f3fba928e28ad6c7ca41c0fdc4443809e57d86a972acefb35c38f5f4fd73a71cebfba0ab9cebfd2f1ccb7de809679ef2ad72a8fc6059efdbbdb2bd7f13615a51c13c568e9547ca85707bf26bf1ba06c2cb58cdbc4563bd7e55e7a5de668d9f67deacb55d637dcc666faf696cabdfe6f0bf7afa7f7dbc759736696ccebf25ac0655c69860ca4ff63e15d1208514732cf096a2a04fc97b54e47f15f26015ba147744d9b633f6b3ba6a24a4708f0fd823855c57b4fd818d1a29cd6d14cc2a62f2d0c7c7579ecd1a09b9e89117a3f0b47d159bc3f9e8b18b140744431cb918e304a738c3393ed3f7435ce012f7b181071487f8911e703ecc7e985dfd4434a28a391e511c534d034f687c134ff133b6f00ccff102dbf8052ff10aaff166c547977bf1951586a4d0a1793ba4f2cda91ce0778a169655a5821efaa6372bfb627bf18c55aa9e63406be860488ac75863f7758cc84d0b102f008c06c42b1aa9ebc5982a86ac3183445764bc981e1c9a15418a67a4423e40cfb3f3617b31a739ab5437e72e762886c44bac41ce5d89c84701b7d0c56bb87ba1916a2f66704fe38d86e987f150350af000396934a1077d590badc4b7e7c4f9905e74a87b4b78a4da108fe04914284c570f756fca74240630b42e567c985e1c91db06552c48c5542f60a41ec6ac401d85097774fac385d3b0bd68d27cfb3032c1f3d7a80f63faae4e1ab22705cc6825d73f5c380dd38b2a8d69e221d5347817ccd3e03ea8075698f3aefaebef31aa37bd58d05a239ef180ea4eccc327ab69154c37e19676f552cec59a06d0ac3486469e428f2a4c5d139ef9f329f46937cc9938a768d33ad6de734ea341634cc70b3acb2d8e32df8e339efb82fa38008001dd929bd55eac681cc0021674f2a6b0a49928cc5f5852ff2b145730a4d9f7a90b3e64eb0a2b3ede159bdfebbf12bbfffcbef32f7804b985</data> + </image> + <image name="image26"> + <data format="XPM.GZ" length="6238">789c9597596f23cb0d85dfe75718c3b78ba0aed4da5a08f220dbb22deffba2200f644bf22e5b9b653bc87f0fbb7858e399892e90a929599f587dea90c5d6f2e71f6bd7c7076b7ffcf96d36e7f97db156dcf174ed8fc1e2f9f9e39ffffac7bfbf7daf656bfa3f6b54d7b2ef7ffbf63dbcae156b872fe3610972a14095f8af64ea38e7b5c89fcea3515c5f07d7b17edf19f149e4dce3d24b9cc7f5e7ce583f04e7888f9d11cfc005e2e28cf87dc9d58a5f2f357051357f77ce585f352e478c0f9d11af80eb16979bc8b9b2edffe48cf57d708ef899b3c5e919ecfb5f959c55aa85ad976be7ccfc7c3863fda5713962fcded9e23c00c34f68466e6775ac0f89db317e06ce8d69cf19d76f955cab7a3c1c828b5a35ae3f75467ebbc635f8a177b0fb7989dcf6ebc5d6b76b15e33006d78db970865e0fecfdb051725df56be6ef199c1bcb03b830a62367a9475e3aa37e2fc6f50ae23bced8ff0decf9c4f3af73bd5237bf67e0ba31b59d4d8fc5197adb60e4c30c869ff0587223533d8efc00ce8d6901f6fa9f1837dcef16b801bdd82f0dd56fc49b9f2e8c1b15e3700b6e203e77865e17dc865f020fa01fefafa6eed730bf2370db989fc103ec374c6cf9cc8c9b55ec3705bbffd8df4d6e569be66f046e80abceb87e130cbf21f653abd66c37cddf0d78604cc7ceb87e62dc723f15b0fb694596e6a015df1f8318b7aac6f40a763f7d709b8b588fe08c7a8ec1038bd38633fa3dde6fb9fab1faf101b8817cd8b9259109dc36a643f000fdbdee0c7f2fc639f2e5d89fb9fab37cf8128c7a9dcc9dedf3819f8cf3aaedc7f17e6bd773d423ac83dbb65ee2fb4dbbc8abe89789b3e9cb12dcc0fed5c4515f0ab0fb6b26b6f81378807a549c738b6f19b7ddefba33f2794b6cf52370a36df77307dc3696580fbd9de147dec1e80f0989cd4f6eecfa7c08f6f3db76b678d877b6fdc25562eba70f30fc845a628b7f8207f0ff9ed8faedc098ab32887c036e148de83fdeff5cd6cbeaf368cc55d3a33c71d40ba7607dcb89d7c7f727513f389f7563467ebceb0c7f3b6086fe7562f37beb6cfad4020f8d79692c19f68fef4f3260c6f9bf8187a8cfb533d6778c25c37e4d67e8f712dbf55be0a6b1c4f793a2c143e477652c19f6177013fbdd26b6fd1a60c6e7c70378682cf1fe2a06827a848e33eeef2bb0af1f1b1719f4eec14de370e28cf38efd38d0fd509fccb8688217ced06b248efdc3a760f7534f1ce3a1ed5c4496d8df8361817ce4c019e79b25b6fa5c3a43ff018c7cb99ed8fcdc190f32cb2f54c1eef7d6d9e27c92d8fc5e3a0f2c1ecf77d82cbc5f4689ad3e4367d47f6a3cf0fea924b6f5afce388fa3c4569f6730fa83379cb1fe3cb1e5d375463efb892d1ff8d78f1b8bcf135bfcd3789859be62fa43df4f3ec0380fd97446fc2cb1e9ed3863bf5a62cb6f1bece7d577463f72628b5f389b3f82de30837ff81bf2b019394b6cbf77e2e7dd48f383df4f67f859389b7ea883bd9eedc4e667e48cfe98258efb8529d8eb3b7786fe5b625bbf7436ff7c031e22feee8cfcf6125bbc613cca906ffcfe341a0dd11fb2e38c7c5a609c173d3ae37e39486cd79333eacf609c1ff97e7e7eaf892dff8533ea354d1cfdf2b9f108f5e7cdc416cf9d91ff4662cbffda7914e3827c467e3e93c4b6beef6c7a5424b6b8efdf84de0c8cf3e23d67f8e925b6ebd37abb3eec26b6ef9317e011e2ddc4317e320f1438888e42c740c7308cc26db80bf73a1ec26378d2f1ac631c5ec2ebaf236a5298846998857958e87cc358ea780f1f3a3f4327ac878db019ba616ba5c62c6c871d5dd1d3673e67cae5dc0d7b613f1ce8b3f2f9e10a0d09471adf0ec75f54665f544ec2695498a993b3bfd0e8459573a8ccc2053c74c365b88ad1f2f9f5ca5c6e54a31fd7554235a9ec46952cd4421d0ab3d008cd151aade8a31755f298d78f5ab49187a9ec5158a151c0877b398f0aa58f3d22e2a4300bef247fa1117d501177cfe31999c22029947349c3df5562cf8f4a1f7a7d3f65b41fcfe8846ef555f750ce2509ddd1fd0a8d1e14ec6455851e743e7ef130830fd5a0a7df7219ba0f2af4b1cca8a77d95c7f3d88c5d61b317dea28f677aa2f12f3e5e568e579ad0946634a705bdd192decb7ad0477cfcfc49a313c70badebdcf8f27743353655a34b5bb44d3bd4a35dda2b33518d7dfa749598cb880ee8908e92968f757571ac2eba74028d53d5f8a03375715e6a984af4714197e198aee89a6ea80fa5d24b4535aaaab19532395517c8248e4ef2714719d5a84e0d6a528b72ed8a3eb5a9c3415d549968aedfa4857a5cd01e0fd4c590c63f14a071afdf8e4754e35bbee37b7ee0477ee2671ef30b3c7d1de5b958269d9f6a7ac1af3ce1294fc39c673ce7055df39bea2c29e777fee04feee86347ffaec7feb8d38a767ee98f07de500d1b9baad5e5056ff136efa8a72d1dcb387b3a77a38ff15785a4f11afa3cd14eedf39efe5df23e1ff0211ff1b1baba55bae3139dfb7c1aebf9938269f099e6725eba2895745cf0255f6965ae79379419bea9b79b38fbbf2bc0c72357522e7ba1cb55ceb856feeee226b7a2bb4d9db9cef6ef0ad078528dd287ced095c01521619ed3838814fa9b666299ea3c90e12a0d19b982ee5c7a9a0a512decf0426ee5ceb3d47bf251eeffb7863c943e44ef737992e7783693f29386bbe15cc6eae405759ac8ab4c5669c854f45d58e65161024f0b59e829d7e54d96653ea5b2fa5895cb982b54c8bb7cc8a3d745e76698ca6754e9c83ab7cad75463958f0dd994ae6cea75e73f54e2b3bed6a4af55d992ed524576a4b7426357f6645f6b728c8921073a0ee5488ee5444ee54cce75af8b15b91ceaa7d7967e729c852605b9d47125d772237da9e86355472635fd95a7bf3356f9f8fdd5ff6f7cffcfdfbffd1765b20a0d</data> + </image> + <image name="image27"> + <data format="XPM.GZ" length="3277">789c8d955b53e25810c7dffd149479b3b67a7227a9ad7d60c60b33a38c78c5d9da87e424082828c845666abffbfebb4fb302826a3cc61fe7f4bfaf099ff62aadd393cadea79da77136ee9a8ae964a3ca5e31e9f7e77ffff3d7ef9dddc0afe0378e2bfeee1f3bbbcd71c5541a0f8392811c80e3ca8f705539b4ecd8fd842fd9cf948df21766cf758d67ed7f5af642e533e1046ccf17ca8972c9ecbb7c09fbcaa172229cfac64f8573e6c0f34de009ef5b0e5ce5483954fe269c82adfd0173e8856168f76f85337026dc514e9407ca46998be7447e682229263d588e5ce527e54879229c81adfd77e542f99e39f6a322b6e71f2dc79ef29d7016a7b13dff8bb91a54bd6a205c538e94a7c2393817ee2917cacfcc49502d127bbe6e19edb0fc43384fa2c49e9f2ba7cae7cc69987a6928dc508e94dbc2066c842f9553e543e542f982390bd322b3f6c67216297f1636607b7ea45c2a1f31e76156e6f6fccc721e2bbbc205b8100e944be5636613e5a589845b968daf7caa1c2b7f152ec0d67ea89c297bcaa5f20d731199b2b0f65dcb85af7ca21c2bf7854bb07d3eaf954be52be612bb652ccf2759e64bf66361ec96f67c5339534e99db71db6fdbf3a1b0fcd897c3472e72c8d9bcf3be066c33f99b93611d2ad6b5ded3804d496dfcbda50e75a94777744ffd5595ed1a3676280c603da0077a84fd23ee431aade6b54d03a79ee0bba431ee13ac47f8679529cdb0f74cf31795373438fa89c4c0f73b5cbfa8866c783d239acf0b954d1af48532da87ef311dc0f2908eb0a650a8c3ba8e08ea50f88afbb76d1a88a003fb07c4f19d8ee904cbc0e7881a5098d30f2c43a7d82fb6e7028d89d4624e4de43e85e23e9d6175d09f7359175875c4b53117e97f0effb7f0d584cf09aaeae8c5f3d1a04be465e3ea2223675d03e77a52ff0962b842ddc6a88b7651542e607f210a06f5b84696e5068d1a62e00e720c03565889f152ac39863eb5a43eafe2c0b93399c363d46182ff9db53ab1c211146e709fbeccd98b063efb2933f08c5ed4b80e6b0a2eac5da81fa30eb54d738a333c033d2c839307ebcf15f667aad0220f916cd668c8fcf570ea92fc5751b042200aa788a34fe1a659a708dde02b40efd715d83a402f5ae8e8357a1663f51653b6a451a0170d4c8fbba8f7ff0a2df13fc4d545ad5ced4d8daa6bb9eccb0c72ff67b8274b5361fddf88420cebfbc5d4ade6824fced1353b83475069b00aae53cd7f883af611438a33c5729e2b1a1e2c17fd77e17591bfa719f4a50e295675b386cee84c6258aeffc2ff9543b0e72bc41c6f799f426324d6ee4afe0bffb1c4c70a57fc66de92cb107e3df5df7af1af197431c139bacf4a77f6497b1d87e3c0628e9af611c195fa6f4af431bc07c4cf125799e768eb77037f6fc0ff35ac03f19f2296b9c41f22c3a56e6faba93e55297c1fa26ab1f8bf80cfb168ccb67dc7ad6a884a13b540ddc56e8867b890ff67d0fda086a8cc256bd630788738f219bf533facc116aa756967755b0dded2588aa77cdbf23d8df77daf68fcfbe7ce7f0d107249</data> + </image> + <image name="image28"> + <data format="XPM.GZ" length="1617">789c8592cd8eda301080ef3c45c4dc50b50b496883aa3e42ab1e2b553d0cc624c6eb21216177a1eabbd7bf210d31b538f863be8cc7e3795e243fbe7f4d16cfb3b6c34eb08455784a16bbb352979fbfbefc9ecdb334d1bfb44856f30fb3f953c2926f47e2660f7a0f4bbb0cbe194c37e97255187c3798add23cb5d1d663e1f0ec9139bc58dc84e8c1a38f563d6e0c760eb3a5433498afb2dce13660660b161e0b1755015d942c62c09347e67067709de6cbcc7efbe2d167963dda28b38801b9c7c2611330b7df5e0d7e4c73e6f0e870bd76b8b78801eb1ed160e971e3f0d5e0a72ce0d3c402bdc27eda01c02d223c7000d88eefcb6d055107c441b217869c471d50c4f89e315e46cf02c1253bd692498a3b8dce52d71c9be8bda0924ae7d1d5a8b8c38951cd45d39f34e134a890e3e1d6c1a97a4ed4944363e4d8d0f015ee1d201a45ef1c68094792cb387438e3750543a33bc0c84125fb3732c6b9d23784713dafe54de904e99723b8bbd74dd1fdc616793b7686d59a7eeb4c3cee80e448fae5f8a8e67f9c664b9c6a7ae0c09bd079de09c7fd193ad4888b22757de8208956f866c51c526d7b8dcf3cb8c314c4e7b9223f21fd5f13f36c7b3b5c13f32cc76374e79064583d76eca8fee7aca935fff379f617c93e5058</data> + </image> + <image name="image29"> + <data format="XPM.GZ" length="3613">789ccd955b53db4a0cc7dff91419f68d39a3c6d7d873e63c242df40a855ea19d3eacbd6bec5cc1242da1d3ef5ead249b1c92703aa50f874d20bf68f597b4d29a477b9dd3e3c3cedea39dabb99e5779272f75ddd9338bc964f9f9cb3fdf777603bf83afa4d7f177ffdad93d9977f2ced16c6a1d8042505dfa21fee4d84bb2d84b1c2bb7590569900429d9878e432fec861ed9cf897598849aec81e3c80ff38882a94be6a82bbc108e8481584769c4fe5ec386f37bd7b08d697f2e6c64ff3173ee33ab91e3d88fbd98f4612a1c097799f35898f28f35da59af104e853f0a1be1d0712f884d2fa0788ab9e731c3857024fc9e38eb7996eb39138e7a19f997c2a9f085b0618623c749907809c79b1067499ab03d66365af8c4711a26260d69bf664e3d61439ca7519a134f8553e1cab10e53a3693fe4ccda635633e148ecaf99ad2f7c459ca39df46026ac9915d9b350db8cf747cc992f7c201c0b9f121b64437c23ac85b5b015a6faf228b379443c67ce7d6635148ec59e121b64f25785b016b6c256b8766ca2dc1af61736bef0ab86a5df563816fb3362dbe6f786b9cd6fcc8cfbd9df6fb8288897c25aec89b015a6f9b7e8cdf70516ccd617be168e850f5b66ff0f0d176cef3117cdfee7c4b63dbf4be6d6bf2fac85c7c256f82973d1eca7797624f15eb6ccf596cc85cf7695b5ccf6817093ef13e2a2bd8f8f999348eec75be6669ee11b73dbbf17c24dbfbe32b7f5ed33174d3f2a612d9c0917cc27f387ad3fa901aa59bfabf17bbeab1a0f53f8731adb6af9d5335a3dd3357f0d19adfc7e9ddbdeae46c44f062c14700e2554a463b6ebfc7b3e24f7218c608cde254c608a4a19b2fb3bdbacb33e63b8ef826257924146f94ce0126aacee6a5de5ae062acc61815e53f1770a157c856f98d5355a96aeaaffa8e506fa12ff1cbd07f8eee3e7c7f004bfddc70afbeb2a6b1a0718ab2fb5b81c4afcfd149ec1737881dfbc8457707857654de308ab6695b128bc8663388137f016f37807efe1c3dd5cd6343ec22976d5a99c61fd19697c822ee69281073e9df4182df5adca9a4600214418a7c6ee34b311438f72f0e594f7b14709a48dca7a5f947bdd288dbb16d8515451197a7bad82d398a075899ddea2014395c38532cae2ae84545673e05562264b55b0caa61953e73055a5aad4904e66d2cedaedaaf0bc4658efcd660d5219c1195633c3484b3cbf1233b9ab52c2428dd51077a9cdcf53aca850133545158bf1ae316ab932fb6e0df03b0bb59a6dd3a05cf04cf0d69fd2ecbb5e8f319b6aa59a31aa5b9ca7ad1a7cf75065869dd658f9124fd16533907c2aba3fb5babc4f839f04a8720073acbbc61ef5f17c07b72aea0aa3ccefd76874705a0aca6441cf9492b2a9955623ece096be6cd44949c14d97c5139aa142a9169b67ec5e9d84fa31c2b989d464db9dfb059d0dcffaffdbffec0769fcf87be7270982f4fa</data> + </image> + <image name="image30"> + <data format="XPM.GZ" length="6366">789ced984973e3c81185effd2b189db70e470e011220100e1fb4ef1bb56bc2872c00242591d4be4ef8bf3b51f90ad39aa6a65bed091f1c664549fc9085572fb30a2552bf7c699dec6eb5befcf2e9ee5eeecf8b563192dbd697f2613279f9f59ffff8edd3e74ed6eaf45a71d46ec59ffff6e9f3de7dab686d5f4dab1af85881dafe55b3bb0277c1d79e33e5ccf3149c19f36ecd51bb5d44367e645cb79a6913dc35968ee7ac6efefe5570612cfd9ae376043d69376cf11563bd62f7371cdbf865cf79dc35a68d8673cf97e0cc985fc105e2173577a2b8e8449ed9b8d336e613cf7927ebd8fdb7e0027c537337eab6bb7ebcec83bb16775eaf2b81250a8cf17be0cc98a7e0a22bde8f1f9fc4dd0c7eaec045e21757ae8d93b68de70a9c589c1e3dab3efc16c61ab7f104ce8d25ae398d93d2d84d8cd308eceb954a1aa5367f064ec067e01c9cd7dceb047655c336df12b8048f8c7b1178c1b3eb25bd8ecf67059cf79ce76570692c0735679dc0fc68ec62d3e307700afd3bcf2ecb33afcf6bc622183f6fec629bdff97ae55d1d6ff30dc1a5319d19e749def58cb8201fba01231f4ec182fcbcffbcc8511fea05b6b8b8c079e1e387e012f11d6389a037d7b0f97b0527a84f02ae503f3f9f6e97b03e5bc6cdfcabc612d9fc3c0c2c96ef2e58ac9e14c6439fcac08817c62e463dfdf9219a8fc5c5f48aa0ef4a70622c3760c1fc8be00aeb7162aceb67f9ee832b5b1f3e6bd8e723be3eaef66f7e16c19558bc3276b131b5c121df4960d4e7c8588f1be303708a7cc4739987fd3b367629d63706073f93c0c8bf0cec8c8b864b7fff33b8427dd68d8b14f591c0960f6f81c5d8f9f3b348c2fe914330f68f1c83b19e726faceb69bc06c67c720e0ef93c07863fe815a8af0c02239f2770f03b0a5c249e3b60d483e1679082c760d487e16730005f04363d67f132e4eb8681915f178cf517362e309fdc0686bf49c396cf29b8029bdfb24c91ef088cfdc7997115f2cfc1582f5e0757c877ce7810839fc0d0e76b70d82ffef9289332acc73c18f3d3b57115f6ff7960dc5f8143bd7be0b01ea70ddbfc7be0e0b7dfb0c5178c0731eaf70c46fd9cdf1f65a5cf9bd5fbd1b88cf17c5c80f1bcc965c3e63f03877c93862dde0787fcf7029b5fba0b0c7f65e0d27fde22f35f35f5da098c7a5d81512f7a69d8e2c82fd48fa60d5b7dbae030ff867153afcd866d3ce60ff5e3c5c0a58dc7fc033176fe3ca9523dbfac7e2918e79324609c777204c67923a7c6cd7a6c376ce31fc0617de603e3f9990387f3edaa61ab0ffc34ebd30d8cfde40257a98f778c43fd45025bbd08fe2a3caf740b16f051c3363ffc87fa13356cf56d1b37f58f03a3de87e050ffa586edf3fa1d58c097e0017810d8f273966f15d6c78d03a3be27c64d7d37c078dee4c538d443a6e0705ee5e090ff5260f34f6be0709e8d0323bed5b0f98f8c433dc8356cf16d70a8c73218f5107fde0d74bdec7e7902c38f1018f3b35fef817fd5bc77ffd7b5ff861e13d35fa7a76ac28e8b9fd37c47af6ee5cff8fca31e573cf06a431e799fd5c734bfd1233ee70bedbf6b7ec8e75b3dbdf352b5c6e8a639f13ea77cf5537ad7aaf475ffdae70ddf7e444fd7f48eeff9811ff9497f5b7fe617ac8f789faffcfa01bd399ed7fea48af3bca04a8b3ac3122f6bff5db3e4155efdbe1e5fe95d73bca67d9d377893b7b46debb5257dbfa3ea0b6f7ceef2ee77f46e784fd5fabccf077ce895b6f5dd916a6fe8d5be46fb3ad3d73e8ff9f83d3d3ed1bb4ff98cdb1c71cc1df5167357db29279c728f33edb9f6be8e7853cfd97abac58884843be438a2fa555049150db45734d43ea273229d2daa470445ba98a5479734d671424e7526aa34a52b6dd774a34ad7da4abaa53bbad7f8d88f79d01153557b9c9d2fafeaa8277ad6bb6ee945db2bcdd13c2da8d2022deaf5312dd132add02aadf931f56c0bb44e1bb3f46893b6685bdb0eedaace1ef5b5edd3011deab523d53ad67e42a73ca433556d6b744f67eb53347b7d799762ea50575b42a9eaf42853dea69c8e85e949cb2ae2f4fb5ea9dfd006329491c6138a79e5bdfda2ab11c9b95cc8a5f6ba8d65a2196a93a9bebfa21355aa6424d77223b77247ab72f16deddeee3fd57c947b79904779529d27f5f62c2ff22a73322f0bb2284bb22c2bfa7355fba3accd7e46de9e0774a13eefd5d3ba2a6da8d2a66cc9b6ecc8aedcc99ef4b5efcb811ccad1acda7dabe73537d4e7b19ca8ceb61cc9a9f633551b4a5bd522cd37d62bc7d2f9513dffb4aca8cfae7e1f4f24959e64aa9349eed8911cd4ff46995dbbf7f5bce6aafa3c74ce15fa3bd26faffafdd59512bb811bbad1c7f5ea261d8adcb97a4cd5af3677e12eebf7efdff1fdbfe7badb6b9fe33a4b3751edc3d927d58fead5cd8dd4e7b0f6f967b5fb713daf39f53e87ee4fff2e7decf38bbbfef604fd4ff4bedffeaff73faef7afbf7ffa37f568f0ff</data> + </image> + <image name="image31"> + <data format="XPM.GZ" length="3549">789c95955d53db381486eff9151974c7eca8fe4cecd9d90b680b4d29064ada023b7b614b3604484220a1a59dfdef7b74ce6bc78424bb5b35110fb21ebd3a52c29b9dcef9c95167e7cdd6e32c9f0d4dc75ce70f9d1d3b1f8d9efffceb8f5f5bdb61d0a1ff49d809b67fdbda3e9d754c279b8c4b075a11288fff3956537004ae1cfb9e6bcc253812d681e3d00fbdd067f6c091b0ba11ce73f1699f39a5f194390427e02ed8807b8e233f3491f823e1c81356b970e20792cf8263611d33e75114e5cc0938015f808db01a0937f3bf3a8e83c8c45c3c7d2e1c7bc2ca081779c079d515b814d6a7cc799cc6b2de17b0155677c24589fa9d38ee06b1edca7a67c2dd18fc8d392716df009c823f832df8d2712fecf9bd90f988b9e8c5bd82f93dd882df394ec2244ef879a5844d80bc63619b633f7cbe4991a409cf57f7c2b6c4f3939a91ffbbe3344a6c1a318f84531ffc81d9d4f751df0ba7716a9853702aac34d862fca7e39cae8797303f830deeeb4cb8b9bf07c2a9cd65fd7de1dc07ff00c7e047661378b81f137082f31e830df8ae669c6f25dc7c5e8e85c92ff93f8273f0145c82f97e155133ff165c7f9e1e84f3b290bc4fc245007e0bee823f315b62cbf51c3a367189f55451339e9f335b531a79fe56b8aafdbb8e6d6c4a1b3397c236005f83bb60febcda9258be8f0ec139380797e03dc7253d5d769987c26520acd85f75aba092f13eb80bce982be28ab900e76003ae844f67ab9a565aad1e596eeb1c64c875f1df3c1b1c8536fcfa57cf6a07a77006ab4bee377ad63a0cb74a5fe96b32994d795639e8e921efe286e7deeabbcd79d63824c508bdd1633d214bb9ba3eaf1da885b47bf64cf503bd3fea1959e6e459cab3d2e1663d359eefbca7a9fe41efcffa2759765f7a961d34b247e30f54c9b7d46acf3bfd9edef7f5018d7da0b6cb79fae279e980e123199ef4a1fed4b2187d444dee8cf3143a13cb4b07eee6319f8121c794fb137d0a4ba13feb33760c1686b60319f6a9b993b494c555f20bcffeda588cfe46868273ec2def8538e331e739a60a5e63deb9bee0d99718ad775170f5e75ad50ee243faada77decf998e75f34092ef9f7322eed90e6ccdb39f83316f098af43ee8d8ed816f3cf83d678803371a7dc38b89a5993c33dd7e5993d6a6290f3a8c7337a5e912171f7b671f4695cfc5eb39ed7e41ef0fc7a5c6ae1ee48e3e054c58b1c2ffb41e3729c35b570b5c65ed8d96ff6297d86deb5b316f71b83a11469cb91b265b1ce224741f7417656739fcf7497cedc2cee183b52de5ff6aa2efde64e3a76e32e45abb5ce853c4af36965ad3c190c354b352987522ae7b50f1677acf6b4f2f8f4caa81619d6f7b9e714aa5046597e7ede76b43c079ca78f5ad475724637bf541539ae3807b795df41afebe3fa4c5df32e866a48ef46d13713b96e5639161ed4c7ad2f396865754bb3afe875877eb4cef12a4f9f32f0b7961aab09bd0cb7b1ba773b5aef58ae0fef44a9a99a724d37d663431e398764712eebffbe6ca88fe24c8a0c1397e3ff381acf5283e3efdfb7fe0120af7f9a</data> + </image> + <image name="image32"> + <data format="XPM.GZ" length="4574">789cddd6db52db481006e07b9ec295be4b6d752c5996a5dada0b20844338271cb7f662743006e313d880d9da77df56f73f0a4e2061b357bb210af531d3fff48c2c91776f1ba7fb3b8db7ef966ea76e7a9937f29ebb69bc2d6683c1fcf73f7efb73e94d2b6cc8df20ea34c237bf2cbd399836f2c6ee68585660125053ffa81d1cc1993a112795a9696e2566a7f38366d8c4f80446bdebd6b6f98577a0e3b402fbbc529d84898dbb0b38872fcd2d5f3f36473e3f839147981fb731deab1c36ebfa3bd8e75fd5b6f9d7e6a889f923d8afd7f746fdb0b6ad7f626e17989f9be3147958af13c0c7e604e36ea04ea304fd8c61dfdfc43bb4fa4d731cd87a7c08a770ec8df56ee002b6fe52df0f5fc2383fdef2c6f808f679fbe6b48dfe74bc15d4fdad9afd7adc31d7f507b0ef67684eb11e65b5ed7c77cdce615c3f5f2de907eb0570012f9b7d3daf9b5d80bc39ec60fdfc45553fe635735284a9d67f30d7f55bb03f9f356f5b9f5318f97ce46d7934306731f6a3cf43e43a7ebdb63909b09f433845fda9772b50bf37a701c63f7a63fc16c6f930e63b7f3e1b30fae36db8441e9ba55fdbff9e37f28e61bfdf7d6ff4dfae6df97abfdb61a788acbfaed9f7cf2db39ca77907461e1fd4b6f15d7316b6cc098c7e39f4c67e22d8d7efc1d82f3faa9def8f7be624889c3a82db663a37e7a19d379fc00ed6e72d0eebfac09c95e8b769f6f389e012f5e7b5adff07b5cbcab6e59d998b18e3d5cb9f3a2d57b6f59701a5e6bafec85c84387f07c7d8ef29ec607d7f76b20c79fcd93b36df9bf3d0faa147b3e499636fd4cf2a27ad7afe06ec2ccfb1b9aed7f74722eb755aea1d731ec209ec629bbf0e63be237381f3227d9ee5751a7732f5b577a2e6a9b98891a7fb4df3bc4c348ff5f97251ee30ff135ca691ce6f990b67667d5fbb3c0fe1391cc383dab9d6cfcc05e6d3198c7cd6f75526fd61febdb90c9d8debfb57b6eb7d0bc7f0436dad677dfe243eccdb6a7dbf166d6f0ae118e393da858eebf35194655cd8fc3e5c16f6ff0f3ddf32aeddf72e63f58ab91b625c7f5f95653d5e9abba199b6614950ebf977636f1ec3ae6bf5fafbb7db1577d5cb70d77c30fd775fffa50c2676fefa990ccea432e7824beef205f7d4d9eb3374ed4bbee2be245ccbd5d7a4010fab9e7e9ca1eb8d78cc13bee15b9ef28ceff85ebe3f884b9ef3e39714cbf87a9fbafe32aff0aa54ddf37b5ee30f72adcbb5215e95944dd9172d642cec517ad8d2848fb2f6b654eff02eeff1be5cbb7c203f9969cadcd7f83ef8d0f752f7f0893fcbba477ccc277cca67729d7393030eb9855e22aba9fb68735ce54a0f1d24249c121391a38c72deb28b0a2aa92b3933d96569bbf17dd005f5e852be5ff198fa744d034ef944ea8734a2f197cf074d2ad30dddd2946674f7551f13b97743eed33d3dc8fa737aa465993dfae6ac8856e4e7abf45e7ab9a9c6ea3ed6a4fa03add3867c0d346168eb3ff7b9d1944dda924f1d7de9833ed236ede8fabbb42709fb92907d5bbf907220f7ed691f87f4893e4b75957044c7550fdf7902aa7359a113e9e4691fa7d2c799d4cfe95cee45f3e51efcb948c6883617fa0828a4164592d2962baeeed17733aadd4caa137f725f62ea50223da44e02e9dcb17d5e5ece708e56163f1ff21fb59c2e9f5e72b70f5fea45120a57baee4206d97be1b9eb858c0b572e3e73ffec4b127aeed2f57e3e434ef38eeedcd5d7ef8f7fd443df5dbbfe6bde632f260cdcd00d169f80d767c8f9921bb971f57d71e475195a3fa9fe7dee19fc7186553e5ffd7367fabfcff8ebd7a5bf01ac66b48c</data> + </image> + <image name="image33"> + <data format="XPM.GZ" length="1812">789cad924d6fe2301086effc8a88b9a1554b480254ab3dd0967e51567b5c69b507c74e4a20e1237c53ed7f5fcf0c4e61a97d5a0b053ff293d79e71ae1bdecf1f43af715d5baec42a939e1c89d26ba87551ec7ffdfef65eab072d4fff42dff3eb5f6af52b4f7adf67d304e7a0e7d0a481f88a18f84133207378c490718018fa6133247c2114a10c05e21362d40a65d442bc2714d14d44abcf889da0ad3a01e22363c7673c207683aedf25dc238a50f82244ec21ca284ef8907d46d99611e29250c976eb06716190cf7c67502ac4f11185df455c196479522145ed105524139625a36a35091f0813251475f2f68809a3404cf5e0332715d2bb23839c1c1be4123283dce76985d4c9ad41eeb3aa905653839d18f1cd20373637c88d5d5728110b8331adce0c729fe70615e1a642aab73498a6f48d59061cff1d0e08f83f4eec7440afe25d034d3f7540240090bea5fa9908b0e48cb2f1242ff2c9381b5972b4344df3d97c96a753b09f1916c5bc9c174b70d405abf5a6dcac570e07b67aaf8dde6b6bdd0b926cb7c8d7f9629725d6da85ae7aabb6fa293eaf1d4a80fd017a71cfda43286feff6877b70dc9756faa838eed4a438eebd4ab9b27e631f2927e3dc818743ff423977b4f2f874a19c395a797e19bcfeab9c3a9432185e28278e2de5c4b1a67c38f694ca71a418c79572749c29ecb853d871a7b0e34ed1ce9fafb5bf980e8315</data> + </image> + <image name="image34"> + <data format="XPM.GZ" length="5630">789cad96594f633b12c7dffb53a0aeb7d6a86ece9a73349a07f69d242c09309a873a4b420849c8c27a35df7dcaaeb29b25ba4d5f0d6e68fd62fbef7f2d36fcf163edb27dbcf6e38f6f8b252d87e55a7943f3b51fd5c378fcf2effffcebcf6fdfa3788dff0579ba167effc7b7ef9de55ab976329dd4061018a061bf2c93722c0c4be1308e02cb57ca59945b0e859346b3304c5dcb99db8f7dcf999d3f55ce84e141d8ebed08478d58ce3bf44c960f94e3c4060337ca9930baf5a5f29167bb1f757fdc1026dd1f67a9f08b30c71359fd48380df2d8f29d709e9789e557cf956552ae8429331c341aa5c48b5d617ffe83b23b7f53d8e5138e85d3242f2dc7cab9f289703320e1b6701614e2178429103f5858ceccb0e70d85933c93785bc2cd5cf73f096789f2b36789f745380f84d1e6336c045a5f5c3a0e6c3f14a05c0ad3ad701a64d23f23e54418d685b380e4fc33e544e22d6cbec39c15a55faf859344f20989b0d3a347e54aea4977c24dcd2fa170a6f1d344b9d2fc9e3bd67c6c08e79a6fb2fd16055143ee0b6e082795f65347b81968fd326557dfd4b1c6db54ce8569acecfc9c0afbfce49e65be1026aaa45fb72d9b78ed7abc16a65ae669cf701c44a5debfb170eef4361d4bbcd81076fba1142ec2cabe2f706199f24afa834098fbd1ae2facbf248cca50ea371126ed27982a27b29e6cfed230d3fc90cd574aa9d61b9f9473e58572a51c0897ea8f2c3723370f73e16620f5a24439513e14ceb5ffa01226d2f86cbd9a05af97fe1d2ae7cabbca95f2967091ea7b315526655bcf2c72eb29742cf7153785f93a8bbf63e544e7757d49122f9e39ae53cba7cab530d9f72e2bdc7eb8f52c7e17cab93066ca95cecf8439bfb65e68ef5b1e677adff0593877ef292a6b3fd240d8e51323e1a2d6f7b52fecf4e15e3955ae3d4bbcbbc255aaf1ee7896799bffbcccddfdef29e7eab7e9d9ce63ae5ce97ad12f8b507f1f3484cb50dfdb3d61771ed9fc53ecf6e3a563e967bc1726bdcff8a0ecde83aeb0af67ac5c6b3f978e255e180857daef85cd37954e0fe79ec54f4f998469a65cebbc7d3f8ad8f348b808f53d182ba7caa970e9de179b9fa272f3547b967ebf5226dddff12cf96c29d7bafe55b8d4f78d48b80ab5dee7caae1f1265d27ad8df9765e2f4f0cab1d4134f844bad2f0e9453adf79e67f1b325ecf20d3d653d0f02e55afb6f5fb8a6bef87df1dcb77ad67f59b9f3e148d99d77a94c3affe859e65bcaeefec8793e1f64ff1eaa123f3f72acf7b72d5ce97da35859ef1b3d296b3c64ef5755fbf97dcf32bfadacf5c263cf327fadacfd0c97c2b5d6930acfb2ded6a74efdfe0d65771f2e1c6b3fcc849d1e4e94f57da07bcf529f75e17e28f5217b5f3858f79e4c3dcb79cfcaee7d1d7a16bd5b6597afcab1d65ffcd6ee3c7cf52cfd60fdf453b71fef1cabbfa5b0df5f29a73a6fdfcf7edff3c2b3d5c75259fb0f6be5be7067f97b03e1f367ab74109056adf5b35fd2c1024bacb0e6f5fdcf3bf8d3c117756e70c8e3d6abbdf16655465fd401ab23e3eead37ab32363a58ffa6ce102738556fe2e5deea80f8fce9ec173a13559aa9977b9cb38ef134c7c5671d394175965661aa0a3f558c9707fd7ec427feec9907fcd4e14f5ef015d7d5ef867a99aef022df8fd6cb266ee136d23b9d1ddcc53ddcb76a07788847decb31cf9eacf062545ad8c68e28f9b84ef18cd5f6789cb3da0576596bc3fa1b630f2f3f7859b0ca15abb4f927bcd3b9c60606ac1562843126985a6f47d8e41d19ffcc59c37b01b45eda9ffdf0174181d750420535f4318201ab5dc00d0ce196f399bfcb8b7869c38875e06ddd59e98e958cda18263065b57b98b1d221cc450916b0840758b0e6181e75981ea00f3a4ff00c2ff00aebb0c16393b5a6b005dbec680776596b097bb00f0770c81e5a9cfb011cc1e30a3fc770022d6843074ee1ccaa9dc30574a10797ac7505d7d0c00402aec121eb18ad16eb7cf063954288208604526842063937feb9f1c6e176f96f9702fad0e7bf5a2aaee5c80caae188eaf77e6ccd66d4a701ddd0906e690419ddd1d878a3897ae3bcd114eee99eebd8a319cd6c677df24373d659d092c7801eacdaa3f1c66a6fbd4de98975e6dc933d8e6ef4d18f7534312a7cbf6fe919a7acf6a26aefbcd12bf7bcf493e9515aa133639521adcb5d677f1b3c06b4f9d11b6db152132f39b2de2a3fbcf35914f876ceacca36ed988efbe06d976bb6c55dfdc0e3934e67497b46e1a70a1ed33e6becd0018c4cdf796f875c33f36a6cf1cd5ba57344c75c8336efdfa613de2f5e5ad4322a3c73426d126fdc7fa6b7d9d3a7fcd8d8fa48744a67bcabad2a07ecc6a80ce8dca860872ef88ecc8d8ebd252bfc785f5d56eb520fafe8d228bcf17245d7bc7b243796dd6faef6f3d91b9fd8712ae2851ab403b714705d421edd5fe9bcf5663cd015e72de2ff63fed93391b14a42a75fd37997b794fbc568f568dff881213529fb1d9d7779cb39fb7981460917c55fe4f92bdef84532359b17bfccf357bc1585d0dfd7793ffe6f3afffde7b7ff01db83b1d6</data> + </image> + <image name="image35"> + <data format="XPM.GZ" length="827">789c6dd1cd6a84301007f0bb4f119c9b14775d2d084b1f614b8f85d243cc8731eb76a1dd1e4ae9bb77c6980f57070ff9f3cb243aee0af6fa7262c52efbbaf1db209830fc9315f2fb72f9797b7ffacdf2c381e15335acca1fb2bc64823d5f3f14ad01d7b09f8ae299625dd5fb7ada2929b6b557eb625bb5354543910bceb9a038cc51b9d853ec1aaeba86624751487f9476517021290a8af2d1eb48516b1fb98bfe5ee522d5f439eb0228b70578079b82203685407a01ac25ccf780c2820504d1ba870524626001f73d11ee7a128862b027852066301674027e3a48f60cba8f1065c096c15a144915a40484de38c07984194c2f4737d1763a30998e761d7e7e5e7c47b83dcc0de68e149ca8758713395abb82494659c6ff16e5ef98fd03965bb80f</data> + </image> + <image name="image36"> + <data format="XPM.GZ" length="2269">789cadd4d76edb301406e07b3f8510de05c51f4bd644d18becd1ec9d14bda048da597696338bbe7b299e23c676560dc44a8c7ce6e11994e2a9c9e070732d989c6adcf665ff5405ea44de0493faaedb7dfaf5fbc79fc6441405f6276b05d1c4b7c6c4563f50c1fa65cf544069219aeee56c9c73cbdcf98c1db32fc8ad3871c920d92a91cefbe4bc90aab2d0e4222c63b7becb4e4aed3ccfd62a71f1ae7ed8f4f9cfd9395b78533d458e9b29ad37c96992972e1fd845e1ea8b92adc9d823d7fd629d6cfba5fe36d875bf07ec82fac5269bfbc71c591ae5e2459b5c469ad633b28a349d7fd7398f9b348f9064df2fcd97676141fd1d9365c8f572b6e1fc05d9e74fd9a9499db72b47febc84206709e5171db24ca87f44649572be7be722567cde6b645f3f21fbf8c5caad304952ba5f1d72a6791e4dce4349f763a5721c9686f7b7c8ba9e67d559faf962b236867c443611fbb072f212bfc0aefbfb59398dfc7a9f5d9fd7acb3f4fdb8fb99b74ac9f32eb3ebf967c84af2fec7caf6b8eafd616d5eef392bdfcf095bb22f2b4be5f7df92b5e4f9a62b97b19f7fcb597b3f91fd79dc54568989da54ffc1f965fdb9b24e8ce4f51d67e37dc736ec6befb6f35265937a9f92db11fbaa72dbbde8cbe8ffafaf8a8718335ea21c2b5e41c38c95bf8dceeb1a1fe43fc1a9ad71f65e3cce71e17fbb367f0f97b81aad3114dfc3b58da0eb06b7e8e3cefe3534c740fc3d1ef088273c631a3398c51ce6b1e0760cd418885fc41296b1829f58b5b16b58c706366d8d2d37877915bf8d1d9b77177bd8b791f3367e170738c4118ed1ac2b0cc45fd8f810115a88912045861c45152df0663fe7420889a690a2144a689b3b1bce3d1c2f0c4a7bd17b0925daa3b93fbebfa2339afbb3e76734f727cfcfabdc9fe41fef79966f7dfa75ff8fefc6fffddef807271766bc</data> + </image> + <image name="image37"> + <data format="XPM.GZ" length="751">789c6dd0dd0a823014c0f17b9f62e89d84a62218d123145d06d1859ee3ac0b0bca2e227af776f6a1db7488eccf0fc6d9d2989d8e7b16a7c16ba8871b30b8d64f16e3bbef3fe7cbee1b8479cec4b76159b80ac284013b3cee2ded1bb18fd67251d626ab82b2a3ac0aa3a0b2ca38a7e494501a8d5442ae142939871c4aca56252d3983b7a2ba11ff05890088e62240d24c2410f9a241902723f862817b9a0dce040ed8826d6b8125c8b926099320bd952405a3a07a46411a8c68106440cb08bc33a06409a420e21c8ce00cf4698a1c301310b9304e8de8c174531f92f0b70dfee366b514</data> + </image> + <image name="image38"> + <data format="XPM.GZ" length="2910">789c8dd6594fe3481000e0777e4544bda1554d7cdb1aed03e10a10eec030b3da8776b79d03128e041258ed7f9f72557504885d91c6e08faebeab87f9b6d1ba3e3d6a6d7c5b9bcdcd7c645b76681e5b1bee693279f9ebef3fff595b0fc3167d0541d40ad7ff585b3f9bb76cebf86e5a35c02e01dafc690cf7eab89d73fd8577c0f53855db40ea17e2a02d862776be6a1fa97375eaadfd056adfdf481cb443a9df53dba8603b7118c786bd54e7092f0e77c4519c48fda6382bca987dbdb263cb7af3bcb0e2ddc6417bd5dea8f354fca2b659c4de16c7b1baadb6b9f85c9cb4f392f7e7569d14329f637196e87cb6d47e7e736f9bb07fa89dfaa7384fd4969dd37c653f40ede79b8873a7ebed884de0a4fd893a719c1f30681cb6433d0fe8ab633d9f521c591def519c3963d9cfdebaff67623f5fb86417d41f9f2f6caa73f585da8a7126a6f1e43cf61b474168a3807d294e9d91f126623f3ef07aa322ca259f604fedf3eb409c05dafea1711c94a9ec07fe525755ca7e12db507dca3664893f6a9c84b49fb25eceaf344c9cec170cc569a0fba72e7c3edc884da5e7c1fb9b9a3491f503e74b1665899c2ff07e642559f28def13a54320f9080b75a2e6f3c94bb2c4a3ba50f37d2ae2dc49bec2545cf8fcbd15fbfd00be8f85a57a3e7f0075a13e533b35ef97890b3d2f78151bbfff95d8ef2ff07d30d624925f30561bf5b9bad2fceb895d584b7bbe6f656c2acd87137119aa7bea54cde75f3a329f07d46aa33e54576ace379b9446f3fb406c43f5913ad5fbfa2a76a9ce8fff7db18eeaa5bf6db5511b75a5f7376eec125be9fded8b5da8f976a74eb57e20aefc7ef0fd7595f3f99da98de69b53fbfcb3e2ca687bcecf8aae9b9e4fa5f6f9301357fe7e84ea547da83675cd1eab2b75c1ae9adfb073b551d76a8d07fe7b56a7b5ae0fef5696feaed8fc913f86ef0b021a7a4ab4e83ed67d1a6fb0c21a0738c4d197e201c77883b738c1e917fbbfc37b7cc0c72ff63fa3fee7f884cfb8f8bf785ce20bf55d5279c54dece0166ee30eeee21e763f8ddfa7160778883d3cc2638a3ec1533cc373bcf88ff82ef6a9c5255ee10fbcc69ff88ba2db1860f8593c461853e9f318579868df29669863e15bbc89ef02028081b219032cf79d82838a9efa633c0c60082318c30d6650e1126ea9efa079078705d43091163e9e7a1fc214ee68f44c5bdccb3ba919e3e16d3c453fc2b0993f8cb1cf7df66146adfa306f6648bf99d0184f6fe287549ea92c9afe286e092ff456c2825665e0151e640df2ff33d8840e972d6ab14dd1083bb0a4d11cf7b1cb757bd0c1aec4e31574b974a8ff98fa7ce607f81d294eeb7d3cbd5d3585e225f2f9ddcf0eafccd0c8beff825637a3f9eeebbcde972d38a0d51e426f154f2ba393edc33695970fcf11adf598ca98f6cecfc7500f07d4430d3daa7dff9cd0ee9cd2c99fc174157f4efbfc4a4ff3597e78a6b4570b2a2318493c65c305ed68f36c429f9ecb0f3ffbf436a0ef03daff7fbfaffd065501ab27</data> + </image> + <image name="image39"> + <data format="XPM.GZ" length="2061">789c75d4dd4fdb301000f077fe8a887b43d3914f27d6b40718fb1e8cb2c180690f8e9dd0022dd0a65098f6bfcfb93b5763ed3055f5c397f3f96cb2bd159d1eee475bdb1bb3ce74231bd9a199465b6e3e1e3ffef8f9ead7c666a222ffabe328dd7cb1b139e8221b1ddc4c9a1e587a4052f911931f7aa7716c63f62776128bf7c8dabb227fef9d25a94d79fe889dc559423eed9d9b3ccf0d39ed5da49995f901d9e495b862177141c522887541cf83eb5d664a8c27bdabac28324d3e24d7de9c2feeadf3522b8ed764ab9dcec9af7bfbf22ad9dfc7a5797f3371e847c22e13a94fb1755165545fb3744df359ef3aafd39ad6835bb2334949f3508be5793c131bae0f5a76ad0cd77bdcdb16a5937e2cd8cb7c97e250cf83d888ef97e6faf260596fceae53712756da92a7e2c69091f66b5de972eef79760c5fd31ec2ae17998b16bc3cf03b26d5a3bf29d58b1f1436f57a822e5f37dcf2e251f5eb26de30a32d5ef1a9dc8fae76c975a9a07102b8977623f68def66e9435725e13b693f3c3b15859ae6f286e1a4596e79b544cfd6a9a52cb7dfacaf6fde4fc376c2bfd84113bac07466ca43fc360de0fde2ecdf574c1b2bfcfec26e5fd21add7aad2493d3b6c5d48bfdeb1437df8466cf8fc719fbdacef82dda4bc3e8cc5d25fb8161be9ef9538f46b11dcb277c9ad7f1d717df7e2427c2dd6f2ff78152cef2faea7d589b8655b25f77d220ef7ff2e58f6fb2d58cebb1637127fc076e17e3e8ac3793cb1433ff0ad38dc9782dd2ad9ef48ec7ff8e53ce810fe330cd67fc55874cf3ffeaf0db678f157cc104734c2f725455ce1f5b33c3cc7df631f31e923f0e6591e2b9f11defa883b8a98e26c6d9e0ee77e957b8ec08735f52cf0119f7007777dc46bdc1b746bf6f506dfe23b7c8f1ff0237eeae756f27cc67d3cc02f788803dcc3a37f62b89eaff80d8ff104bfe3299eadc4f47b3ac718134cbd323ff235790a54586285da1f0280817a350f5870d0400b1730f41123b85ccd0357700d638998c00ddcfe1be3f3dfc11466d0c11ceee10116b058c973b46e50ccef971b7f008068e53b</data> + </image> + <image name="image40"> + <data format="XPM.GZ" length="920">789c65d24d6fa3301006e07b7e058a6f5195168c09a8ea21a54ddbc3aef6b8d26a0ff61892b84d68f3d9b0daff5ecf8c51a83220e4e7f5d84682eb51f4fbd78f68743dd8eef46e09112cf4261ad9fd6a75faf3f7eedf60186791bfe5248a875783e13882e867b3ae70ecfc58dc5021353229923c29902610980229e30424ed73cf9437cc39b190b9a4e60a99ea344f35b246aa442995209f9099ce6c46b30fc8899cc41389dc072ae6333297799c131f0315f39d683c0d721a58300f8196f9892cd2222e52e4315031b744f004e429d0321ba44e75aca9f92350313744f0a4e645a066be0656cc1dd2a4ba32b476cd3409731998312dd17a5a24046ae62ab062ce90a020e10ffa46b49001cd96c8da17cfb61d41215f3ad635fd27bec4f85c5da6cd6526405cf68135fdacaaaa7a0e8ba5e8f7b9d7b7d5ba69d6a6bfd6bd2f3e36db6627fafbb9fde178fc3cb9b67f86db4f5d7bb82f858fbb6cec1e1e5d39f3d7b9cf874fcfb3b66d67a29fb565d9bee0e39cf994fadcf85b76b19f5fec53d73fb78bf1fdfedf0ebe004832d18d</data> + </image> + <image name="image41"> + <data format="XPM.GZ" length="499">789c6590cb8a02311045f7fd15a16bd788da0e0e8af8098a4b415cd4237166a1828f8588ff6e95d571da9ed08b9c937b4975065558af16a11a14e70b5e7e39f00f9e4225d7fdfeb6d9ceef45597f07fda6a12e7b45d90f1c96c743b43de81e86af65488e93da511c79e4980c275f39bc73cc6136e4713e45c794786c180d53caa7fdce6a3b807f0e90a0e380855cbe1d44a68e83489265e3223309356d77da131611fa731642d4aa4b77897622a85595084d2e813611b5ad43be5c64d09f302b98bbe6741c93ef3bdc69145bf34568bf42e33edfea312b9e47677099</data> + </image> + <image name="image42"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </image> +</images> +<connections> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>lcdDisplay</receiver> + <slot>display(int)</slot> + </connection> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>progressBar</receiver> + <slot>setProgress(int)</slot> + </connection> + <connection> + <sender>dateEdit</sender> + <signal>valueChanged(const TQDate&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateDateTimeString()</slot> + </connection> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>spinBox</receiver> + <slot>setValue(int)</slot> + </connection> + <connection> + <sender>spinBox</sender> + <signal>valueChanged(int)</signal> + <receiver>slider</receiver> + <slot>setValue(int)</slot> + </connection> + <connection> + <sender>spinBox</sender> + <signal>valueChanged(int)</signal> + <receiver>progressBar</receiver> + <slot>setProgress(int)</slot> + </connection> + <connection> + <sender>spinBox</sender> + <signal>valueChanged(int)</signal> + <receiver>lcdDisplay</receiver> + <slot>display(int)</slot> + </connection> + <connection> + <sender>buttonColorBox</sender> + <signal>activated(const TQString&)</signal> + <receiver>WidgetsBase</receiver> + <slot>setColor(const TQString&)</slot> + </connection> + <connection> + <sender>lineEdit</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateColorTest(const TQString&)</slot> + </connection> + <connection> + <sender>lineEdit</sender> + <signal>returnPressed()</signal> + <receiver>WidgetsBase</receiver> + <slot>setColor()</slot> + </connection> + <connection> + <sender>timeEdit</sender> + <signal>valueChanged(const TQTime&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateDateTimeString()</slot> + </connection> + <connection> + <sender>timeEdit</sender> + <signal>valueChanged(const TQTime&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateClock()</slot> + </connection> + <connection> + <sender>pushButton</sender> + <signal>clicked()</signal> + <receiver>WidgetsBase</receiver> + <slot>resetColors()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">widgetsbase.ui.h</include> +</includes> +<slots> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot>resetColors()</slot> + <slot access="protected">setColor( const TQString & color )</slot> + <slot>setColor()</slot> + <slot>updateClock()</slot> + <slot access="protected">updateColorTest( const TQString & color )</slot> + <slot access="protected">updateDateTimeString()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/widgets/widgetsbase.ui.h b/examples/demo/widgets/widgetsbase.ui.h new file mode 100644 index 000000000..94caf5df0 --- /dev/null +++ b/examples/demo/widgets/widgetsbase.ui.h @@ -0,0 +1,66 @@ +#include <qobjectlist.h> + +void WidgetsBase::init() +{ + timeEdit->setTime( TQTime::currentTime() ); + dateEdit->setDate( TQDate::currentDate() ); +} + +void WidgetsBase::destroy() +{ + +} + +void WidgetsBase::resetColors() +{ + groupBox->setPalette( palette(), FALSE ); + TQObjectList *chldn = groupBox->queryList(); + if ( chldn ) { + for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) { + if(obj->isWidgetType()) { + TQWidget *w = (TQWidget *)obj; + if(!w->isTopLevel()) + w->setPalette(palette(), FALSE); + } + } + } +} + +void WidgetsBase::setColor( const TQString & color ) +{ + groupBox->setPalette( TQColor( color ), FALSE ); + TQObjectList *chldn = groupBox->queryList(); + if ( chldn ) { + for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) { + if(obj->isWidgetType()) { + TQWidget *w = (TQWidget *)obj; + if(!w->isTopLevel()) + w->setPalette(TQColor(color), FALSE); + } + } + } +} + +void WidgetsBase::setColor() +{ + setColor( lineEdit->text() ); +} + +void WidgetsBase::updateClock() +{ + clock->setTime( timeEdit->time() ); +} + +void WidgetsBase::updateColorTest( const TQString & color ) +{ + colorTest->setPalette( TQColor( color ), TRUE); +} + +void WidgetsBase::updateDateTimeString() +{ + TQDateTime dt; + dt.setDate( dateEdit->date() ); + dt.setTime( timeEdit->time() ); + dateTimeLabel->setText( dt.toString() ); +} + diff --git a/examples/demo/widgets/widgetsbase_pro.ui b/examples/demo/widgets/widgetsbase_pro.ui new file mode 100644 index 000000000..ec0c46069 --- /dev/null +++ b/examples/demo/widgets/widgetsbase_pro.ui @@ -0,0 +1,1158 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>WidgetsBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>WidgetsBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>718</width> + <height>574</height> + </rect> + </property> + <property name="caption"> + <string>Widgets</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListBox" row="2" column="0"> + <item> + <property name="text"> + <string>Applix</string> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Binary</string> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Core</string> + </property> + <property name="pixmap"> + <pixmap>image2</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Deb</string> + </property> + <property name="pixmap"> + <pixmap>image3</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Document</string> + </property> + <property name="pixmap"> + <pixmap>image4</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Pdf</string> + </property> + <property name="pixmap"> + <pixmap>image5</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Readme</string> + </property> + <property name="pixmap"> + <pixmap>image6</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Shellscript</string> + </property> + <property name="pixmap"> + <pixmap>image7</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Recycled</string> + </property> + <property name="pixmap"> + <pixmap>image8</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Video</string> + </property> + <property name="pixmap"> + <pixmap>image9</pixmap> + </property> + </item> + <property name="name"> + <cstring>ListBox3</cstring> + </property> + </widget> + <widget class="TQTextEdit" row="2" column="1"> + <property name="name"> + <cstring>TextEdit1</cstring> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + <property name="text"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style="font-size:8pt;font-family:MS Shell Dlg"> +<p style="margin-top:18px"><span style="font-size:9pt;font-weight:600">Richtext </span></p> +<p>TQt supports formatted rich text, such as the heading above, <span style="font-style:italic">emphasized</span>, <span style="font-weight:600">bold </span>and <span style="text-decoration:underline">underlined </span>text, as well as colored text. This is <span style="color:#ff0000">red</span>, while this is <span style="color:#00bb00">green</span>, and this is <span style="color:#0000ff">blue</span>. </p> +</body></html> +</string> + </property> + </widget> + <widget class="TQTabWidget" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>TabWidget2</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Iconview</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQIconView" row="0" column="0"> + <item> + <property name="text"> + <string>Item 1</string> + </property> + <property name="pixmap"> + <pixmap>image10</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 2</string> + </property> + <property name="pixmap"> + <pixmap>image11</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 3</string> + </property> + <property name="pixmap"> + <pixmap>image12</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 4</string> + </property> + <property name="pixmap"> + <pixmap>image13</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 5</string> + </property> + <property name="pixmap"> + <pixmap>image14</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 6</string> + </property> + <property name="pixmap"> + <pixmap>image15</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 7</string> + </property> + <property name="pixmap"> + <pixmap>image16</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 8</string> + </property> + <property name="pixmap"> + <pixmap>image17</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 9</string> + </property> + <property name="pixmap"> + <pixmap>image18</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 10</string> + </property> + <property name="pixmap"> + <pixmap>image19</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 11</string> + </property> + <property name="pixmap"> + <pixmap>image20</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 12</string> + </property> + <property name="pixmap"> + <pixmap>image21</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 13</string> + </property> + <property name="pixmap"> + <pixmap>image22</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 14</string> + </property> + <property name="pixmap"> + <pixmap>image23</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 15</string> + </property> + <property name="pixmap"> + <pixmap>image24</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 16</string> + </property> + <property name="pixmap"> + <pixmap>image25</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Item 17</string> + </property> + <property name="pixmap"> + <pixmap>image26</pixmap> + </property> + </item> + <property name="name"> + <cstring>IconView1</cstring> + </property> + <property name="arrangement"> + <enum>LeftToRight</enum> + </property> + <property name="resizeMode"> + <enum>Adjust</enum> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Listview</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListView" row="0" column="0"> + <column> + <property name="text"> + <string>Things</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Text</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Stuff</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <item> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string>Airbrush</string> + </property> + <property name="text"> + <string>What stuff?</string> + </property> + <property name="pixmap"> + <pixmap>image27</pixmap> + </property> + <property name="pixmap"> + <pixmap>image28</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + <item> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string>Eraser</string> + </property> + <property name="text"> + <string>Here?</string> + </property> + <property name="pixmap"> + <pixmap>image29</pixmap> + </property> + <property name="pixmap"> + <pixmap>image28</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Pixmap item</string> + </property> + <property name="text"> + <string>Nothing</string> + </property> + <property name="text"> + <string>Nothing Again</string> + </property> + <property name="pixmap"> + <pixmap>image30</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <item> + <property name="text"> + <string>Pixmap subitem 1</string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <item> + <property name="text"> + <string>Subitem</string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image31</pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + </item> + <item> + <property name="text"> + <string>Pixmap subitem 2 </string> + </property> + <property name="text"> + <string></string> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + <property name="pixmap"> + <pixmap></pixmap> + </property> + </item> + </item> + <property name="name"> + <cstring>ListView3</cstring> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>AllColumns</enum> + </property> + </widget> + </grid> + </widget> + </widget> + <widget class="TQGroupBox" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>groupBox</cstring> + </property> + <property name="title"> + <string>Group box</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLCDNumber" row="0" column="3" rowspan="3" colspan="1"> + <property name="name"> + <cstring>lcdDisplay</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="numDigits"> + <number>2</number> + </property> + <property name="segmentStyle"> + <enum>Filled</enum> + </property> + </widget> + <widget class="TQSlider" row="2" column="2"> + <property name="name"> + <cstring>slider</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="tickmarks"> + <enum>Left</enum> + </property> + <property name="tickInterval"> + <number>5</number> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>Pick a base color:</string> + </property> + </widget> + <widget class="TQPushButton" row="2" column="0"> + <property name="name"> + <cstring>pushButton</cstring> + </property> + <property name="cursor"> + <cursor>0</cursor> + </property> + <property name="text"> + <string>&Reset colors</string> + </property> + </widget> + <widget class="TQComboBox" row="1" column="0"> + <item> + <property name="text"> + <string>pale green</string> + </property> + <property name="pixmap"> + <pixmap>image32</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>deep sky blue</string> + </property> + <property name="pixmap"> + <pixmap>image33</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>steel blue</string> + </property> + <property name="pixmap"> + <pixmap>image34</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>powder blue</string> + </property> + <property name="pixmap"> + <pixmap>image35</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>sandy brown</string> + </property> + <property name="pixmap"> + <pixmap>image36</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>dark orange</string> + </property> + <property name="pixmap"> + <pixmap>image37</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>indian red</string> + </property> + <property name="pixmap"> + <pixmap>image38</pixmap> + </property> + </item> + <property name="name"> + <cstring>buttonColorBox</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="1" column="1"> + <property name="name"> + <cstring>lineEdit</cstring> + </property> + <property name="frameShape"> + <enum>LineEditPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="text"> + <string>hot pink</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="1"> + <property name="name"> + <cstring>TextLabel1_2_2</cstring> + </property> + <property name="text"> + <string>Enter a color name and hit return:</string> + </property> + </widget> + <widget class="TQSpinBox" row="1" column="2"> + <property name="name"> + <cstring>spinBox</cstring> + </property> + </widget> + <widget class="TQProgressBar" row="0" column="2"> + <property name="name"> + <cstring>progressBar</cstring> + </property> + </widget> + <widget class="TQLabel" row="2" column="1"> + <property name="name"> + <cstring>colorTest</cstring> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="text"> + <string>Color test area</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout9</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>PixmapLabel1</cstring> + </property> + <property name="frameShape"> + <enum>Panel</enum> + </property> + <property name="margin"> + <number>1</number> + </property> + <property name="pixmap"> + <pixmap>image39</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Check boxes</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox" row="0" column="0"> + <property name="name"> + <cstring>CheckBox1</cstring> + </property> + <property name="text"> + <string>Apples</string> + </property> + </widget> + <widget class="TQCheckBox" row="1" column="0"> + <property name="name"> + <cstring>CheckBox2</cstring> + </property> + <property name="text"> + <string>Banana</string> + </property> + </widget> + <widget class="TQCheckBox" row="2" column="0"> + <property name="name"> + <cstring>CheckBox3</cstring> + </property> + <property name="text"> + <string>Orange</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup2</cstring> + </property> + <property name="title"> + <string>Radio buttons</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton" row="1" column="0"> + <property name="name"> + <cstring>RadioButton3</cstring> + </property> + <property name="text"> + <string>Sprite</string> + </property> + </widget> + <widget class="TQRadioButton" row="2" column="0"> + <property name="name"> + <cstring>RadioButton4</cstring> + </property> + <property name="text"> + <string>Farris</string> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="0"> + <property name="name"> + <cstring>RadioButton2</cstring> + </property> + <property name="text"> + <string>Solo</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Date/Time editors</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="AnalogClock" row="0" column="0" rowspan="3" colspan="1"> + <property name="name"> + <cstring>clock</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>100</height> + </size> + </property> + </widget> + <widget class="TQDateEdit" row="1" column="1"> + <property name="name"> + <cstring>dateEdit</cstring> + </property> + <property name="date"> + <date> + <year>2000</year> + <month>1</month> + <day>1</day> + </date> + </property> + </widget> + <widget class="TQTimeEdit" row="2" column="1"> + <property name="name"> + <cstring>timeEdit</cstring> + </property> + <property name="time"> + <time> + <hour>0</hour> + <minute>0</minute> + <second>0</second> + </time> + </property> + <property name="autoAdvance"> + <bool>true</bool> + </property> + <property name="maxValue"> + <time> + <hour>23</hour> + <minute>59</minute> + <second>59</second> + </time> + </property> + <property name="minValue"> + <time> + <hour>0</hour> + <minute>0</minute> + <second>0</second> + </time> + </property> + </widget> + <widget class="TQLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>dateTimeLabel</cstring> + </property> + <property name="text"> + <string>DateTime string goes here!</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </grid> + </widget> + </hbox> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>AnalogClock</class> + <header location="local">../aclock/aclock.h</header> + <sizehint> + <width>75</width> + <height>75</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>0</hordata> + <verdata>3</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image40</pixmap> + <slot access="public" specifier="">setTime(const TQTime &)</slot> + <slot access="public" specifier="">setTime(const TQTime &)</slot> + <slot access="public" specifier="">setTime(const TQTime&)</slot> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="2093">789c6dd3594f1b311007f0773e45c4bca16ad8d3c9aaea03f751ae7043d507afed25014220249050f5bbd79e995d550b321be5c7fc333ee2acae74ae4f0e3b2bab4baf533d1d9a8e19e84967c5ce46a3c5afdf3ffe2c2dc7aae3ff8aa4932c7f5b5aee4f3ba673347e720178e40171149938229fb0c3204fc4191b34b91706d9890d1bd78293280cf2b538135f928bc42405b9084ee3c6e3da694c1eb1d3489c928b344b290f20ee49fda331f7db0acee22ccab8fe4cd6599669f293b827de0ece933ccae9b06048d679c14668ccf91db1650306ab44c58af337e25cf22f64ad0ac5be175bf120b89b2adb4dc90fec6e2c3e0eeea5fef8d90b72d9cb7b25f95d5c487dd898ea40fd8bac888b8cea966c8aa230e479b0ce0aabb9de63eb980d77c165562625d713b16203dd97d2eab8cbf359712eeb89c55ae63f103b99dfb09b7ef47d9abce9f728967eb0106bf1bc319f47b7b6cc77c12e139e0fdec54a5c8ab5e6f5bcd596f5ccc48eeb40f7c9589fe7fa5b63aebfb24d525af254acd8d8af6d72f2a1581bae3f8a9d98fad9dc38cbf92bb6556ca0df8f75a65eef886d13f97c29f683ea74ff9db2f57c4eec9c22cfd82ee13ceada5c07bacfce99fa3c1ed856ee0718b196fd2ab193fd668db97ecef6f3717db331af977e2f55582fd723b6abf797d796cfdf8aebf3a9c45af6f3b3b6ec775f5cefffae76c53e6557b27f3c23574d7e835d2592df132bf1b47145de156ba9af37e67a25aed8fd290f84f6e0ffb7321a4b798c97e5542be3b092718703ff4aa94f7d2a1ce23da51ef09152a32ffa3ce19832439fbac767cef8acf5098b2fbea27184137cf5efa638c3377caffbf8fadc3f618e057ee01abd5bc70ddcf4a966aed08bfa6ce136eef85ebbb887fbf8130ffe5f8fcf0cf0108ff0d8f73cc13e9ee2199ee3452b637d8f4bbcf21daef1c677b9c508e35626f17b7af64fea671c6386392aecb6323dbfda0210b7014043890a0cd8f67ac0a1810aee60801318c23d3cc063eb0c5f60044f508575c0189e7de20526ed73865798c20cdee01d2f600e0b98c0c7a7ef62f4d558fefb7de91f96a1f1b4</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="1160">789c55d14b6fe2301007f03b9f222237b46a378418a2d51e4aa12db450e8936ab507c78f82cba33c135aed77df8c67129284837f337f7b1c715e7326a381533baf6c777c37138e98f28d5393fbc5e2f8e7efefef4ad5634efa0b7cc7abfea854cf1ce10c574b05eb79ba767dcfffe9dbd612d8e08d4683035d60c08330b09c01196792594e814d9fc9a60f34c8a687dc005b512b6c592e724640090c45188602380646927b4ddbbd2506b8f78ac8c306f08ba870af40462cb2dd37a008b2a306443a6a42e4c8d79c367c9311077590511d07bd1019724de438f789a8b8ed3e5bca88231f90a21e49e02391213f884a584640a9e0052aa062522906fc44aa3a767946ec8e2c95a06bdc23651d2fd927729c7b4d5422005e22d3932df739eda02e50a783f0923d22c3f090c8317ccc88b74a88f409ef19b5e50552d327b42d7516de21751dc377c4743730ce88dd554e0d3c103976b7396d571335f22c7ddcec49d7798da7ff3117ae740b3505bbdea73a2d9e725acfb4361f5ace0b3963b45e98d9725ecc4db55e7dae37e59cd1dbdd7e5dca697d8893e3d7bc34f7105fb42f3be5f3e2249976af4ae7c5a66dccf54d21179bc4f4bab3fe6d217707a574f6a0904b86bd6ebf7f3f1a9f6a0f8f4fcf2f9dd7c9f8ed549b9f9eeabf5f95ff44891e85</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="2478">789c6dd5d96eeb361006e0fb3c8591b90b8a39962cc9128a5e64df176771724ed10b8aa4b3da4e6c673de8bb979af9a9a4a7b5c2001fe6e7909465fbdb4ae7eae4b0b3f26d69be308b5bdbb13766d65971cfe3f1fb9f7ffdf1736939293acd5f18e9f26f4bcb8345c7768ea613df807b01d49557637a6a5d8a09cee0477119cd43b844fd05b6f06be3a4db7a1a9dc87abca76e2ef1059ca9e9415cb69e344ebb894dd55e9d66308babe04a3c864b35a7b085df1bf792d4f612f15cddebaae91ace50afc455b0cedf854bd4cf5bebfaeb8db3a46733ed3752675d35f7c526cbe08dd646bc0f97a8bfb5d6fa266cd5641ae769de45fd2c3a97379f7fc039bcd35af31f62d3d60d5ca19ec04e4db2df228de632bad0f9cfea22818f5bebfc1bb12972d45fe14aebbc0e3be4e5fcfd5e11fbdf47f77be227753f5193dc9f7eddcfd1ef21ba5f8bbb7085f92fadb57edab8ec9579a9f51371ddfa08aee0b5d63a7fab719595aecac40375955756f63713dbd261be575795d6791b76c84b3f9355e84f8770ec3f519bdc88499e6f13e6237fa036589f2fa335cf53d8185d4fce57877eda9f64ffb53389de1f5a83713fe81e36d84f017bec7f5f5da7e87f0b176a76d1b5ce1fc3a67692bf6a6cf376fd3d38ae7f091b78d85af3cfd1388f53d729f6770117f0366c707f0ea3757f740e7b9c479e6feb629ee6adb55ec31ef34fd536c5f9cee042cd196c6c2e9ec1de6a5e3eaf2eb7f1fec9f7b3f3ce38fd7eb7b087e5f3e60be77d21aed53e55933cdfdedb789e5db54bb1df5538be1f0bd8ebfec8aa7dea74bfdf5bebfa577081f50f60e3b52edfb7a3a2fd3dda513b9c9feed43ed5f3730e1bf48b753f52afaa47292cfb1d8d627f1ea9eb14bf67a41e45dfc2e1a53f9e83055318e6d7aba90c16312339c3355b0c17e435a5eba2cf35dff02dae3bbe0fff25f5d98747fcc0639ef0941f25f5c43349cdf53c92780e99177ee5377ee70f5ee5b5905ae70dcd48974ddee2ed30d6798777798ff7f920e40ef9087d9abd1cf3090ff834ece28ccff982877cc957fc3da43efbfc089dbb612461ad34647a61ed8c732ebe64fae1ac65189b5c11f390880cd564c97d66c8d348aeeb90d823e21eddd02dddd1fd97cc43488dc398d0941ee929e46634a7053d7f66c26a437aa1d7b046d3e385dee89d3e6895d6be6642aff5709a61486cd0266dd136edd02eedfd3bc386f6e9800e43fd888e438f5d3aa1c17f32a77446e7611f17e468489734a0ab5f333cffbf6bf9efdf97fe019b6f35ae</data> + </image> + <image name="image3"> + <data format="XPM.GZ" length="2013">789c6dd45953db301007f0f77c8a4cf68de92cb1632bf174fac07d26249c814e1f6449ce45127201a1d3ef5e49bb364d0ae2981ffa5bbb920cbb3be56ebb59ded92d2d9672395065d597f3f28e5e8dc7eb9fbf7efc2e550251b69f8d7a39ac7c2b553acbb22ab7a613e380330ba805b56a2df07e738e641445d21b9c63192731f9d55948a105b9ef5caf095daf794fc9f5807de4dc481b4983bc2a9c7a0f9c1355b51fde9a9c2489f23e714ea362fed85b179e93c306f7bf20e7fdc2982c83baaf07c08eb99f902d93c8fb9a6db8fe13391592ac72a7941f39abb8e8e7b970c3d793e450717f8fe4e2bc9be45873bf2b72d16f9fcdfdc2922dd98bc2749ef5dcbc9f2e390d693f30670bdedf215bd27ec0df87d2b588fbdb2b9cf8f9295904c2bf4c78c68ee97d80177212703f37ec98ebcfc8a9a4f384095985a9f6f92bb650b1f73b5b2a9ae7f595610f9d751c5523eaf78e5cccfbfbd7a69ef07952de4829e97c3ec85a6afa7b48d9865d73364272bfb824a721dfff393b7f1f22b20eb97ec2369af663721be17d403621d793b979bee56decfdf8f5e099ac0c9f5f8facb91f40769e37b9f93c05dbb01fc8b63ef9b230f5d3600bea0752b6e4fed68529bfcf3664c89c3351d40fc8263f9f3837d7afb20519468569fd0e3bafdf66e7e7d9cb9d916fc96ef8f5fcff972c2b9ebf67e7cf5f90b390f38a2d787f93dc59e67dca96ec8c9d913b4b1a08db837ebf959198f297b2d294daca18cc78f4b06fbffbd4466680431ce1338e7162e7a7f8e253b3cf8c4d8c708e0b3bdccf25ae6cea15df3632239b7ac7b5adf2817b36b58f077888479f193cc613dbcfa9ad7686e7e89e78c70bbcb4a9cfccc8f73cc4a65d658d2d9bb9c23676f0fa8bcc0ddeda4ec776dd3bbcc707ecfe9769e1a3ad33b6ab3cd9f92a06186ef433b0990c6bb65ad326229b8851607d6b5f2e73810d4c780d61af03363227202105856dd02e010632e841ffdf8c3b4518c010463ee1aeb407cf30deca004c600a2f3083397661014b18c36a3b83b3af46e5cff7d25fb0bce65f</data> + </image> + <image name="image4"> + <data format="XPM.GZ" length="1310">789c5dd14b53e2401007f03b9f2205376a4bc96b92d4d61e001510414454d4dac364262320aff010d1daefbed3d39d00261ce6d7fd4fcf4c715eb686bd8e553e2fac377c33169618f1955596dbd96cfffaf7cf77a168334bff986bd9c55f85e29925acee629ec07aaad725d7762bae692d801ef73c8f039740df71432702b60db92b305c42fa916fc27320e34c32c3113070990c5ce00419d8c80f601887516838cb19039f8091174681e163460c778912799bd3843b8622b2b19be6345d498c22011c13257207e45e24b907ac0063c96d3cc603d1c7c9d7441e99f02531c1510219b3d87443a0f0b351cf441a15103992e534e1bb8cb85103193bb8914f64c82d91e3be2e31e1a6eb19ca98236da470620974880cf94e4c84e10a287d4d1f786398648c91f0021360c2649230e0069938d8e519b1fb62a847e1a98648e9e01506448ea7ea1169df2ba49e6cf895d36cd4022abd115ea1496418be27720c5f64c453d5897485b78cca706fa89483ec13751f58cb88dd754e05ac1239763f739aae222ae4997e4ad9a3d7798debff988b922c1dd512f8ea6da474f190534a8ed5e45dc9e9694ecd26f305d596e92a5d426dbdd97e9ce47672f7b9ffda4e8fe72955add52f2e7fe6e4eeaa7192d3a97ab3754db5767ad36957d36e7a9bf6ee8e72b57efdbed9ea0d1e8ee6f5eb8f4ffa1d3e1fe52035180c5f2a879aedb89edf6041253cd4a687a7f8ef77e13f3e1c3a3b</data> + </image> + <image name="image5"> + <data format="XPM.GZ" length="2702">789c6dd6d952eb381006e07b9e2245df51537de245725ca7e6821dc296b0c3d45cc8b64c026401c23a35ef7e64f52f9f01a60ca13ed469b55a8ae0c74ae77270d059f9b1f4b4308b71d92947e6b1b3523d4f26ef7ffdfde73f4bcb91ee345f49b7132fffb1b43c5c74cacee16c6a1bf0dc8112379844deef8d5393a6a9f1a6c6caa85c79d36b631dc7ddb8ebc7dfbc8daeb48c3f36ce12a5949f8c2ec55a696fbe85ab2cf19e8ab3484c3bde45eb41e35e9229f8d8bb70f349fe13710ff1bc0be73df16bebc2c7dbc679dad63711670af5bf8b433eeac37926efdf80ab3cf53e12e7919817dea50af55d8bdb7c5d58215f24ce23a997185679e9f355702ea687c66e7bbaa9df2f3a15e70aebdd0c467d87621319f13aac609fdf94aa2bfb4d4371dbaf2bb8427ed81823f5ad352e52d5957e722e0efb4d637116497f79206eeb8bc526f4ef3918f56dc3b610fbf35354712fce7d7c2a0ee793cfc43ac2fc23715ea17f883711fa7f00a37f34870dea89608bf74fc5458cfa08d6e847198c7ab7605354de4fb015b36a5cbae388fa358cf3c307629d4bff0c89dbfa2f60d46f1836584fde5ae2d782d1ff425cc4585f0fd6387f3bb0c17a505f6165bdb4292ee352f9f80d58c37ebde5effd49c4ed7d70292e62e4cfe070bece83d1af6b7119a39f37c1321f295823be0f9b523c83ad98fcfd55a9a494fb8feec4aac27df722d6393ebff76213d6bf272e63f82358d6c38fc1a8af86433d27b0ad64fc595cc56246be4a63dcdf6f95552a91f32ff5d80cf5b1d46f7be13eb880c37d75262e713ef9050ef56cc1e80faf8bdbf917ade5efc7043670015bd8dfb7d6455bedbd2db631c64d30c68f602d26ff79b2368b707e3271bbbe5571dbdf040efb732eaec2f9da87c3793a0d967a08f95c07249fd4676dd88fe3d652ff3018f51fc2dacaf81e6c61fff9aa755b7f2ccec37d3b13db18fdefc206f9c7b0adc50fe2e6f1f6ebab6b172ff38dc4758cf11bd8d4b5770dd7e2e1421ea6af8ffcfe4b8ce102dfa55325515f622cd77cc323f73ae65bf7eaa3bee5a9f98eef79e27e4e79e6a3e65f621ef8919f78c1cffcc2af2eea8ddfff1bc31fee31bcca6bbcce1bbcc95bbccd3bbcfb29a6cf7bbccf072ecb211f390d78c8c72eaa8de1133772ca677cce177ce96abf7231d7dce528c470cc09a7ac5873c63dceb94fcc03223254480c9554b9c7524d3734a231ddd21dddd384a634a379c8430ff4484fb4a06737e78c5ee895dee89d3e6895d67ed743ebb4419bb445dbee75c745ec529ff6689f0e3eadaba2433ae22b1ad0908ee9844ee98ccee9e2730fe992aee89aba14514c85cb724e09a5dffa7c4d8a3465d47331b961f7cf207d8b99ffdfb3fcefcfa55fcb6370f5</data> + </image> + <image name="image6"> + <data format="XPM.GZ" length="2782">789c6dd5d952ec361006e07b9e628abea3527dc69b6c572a17ecfb32ec90ca852c79180e3b33aca7f2ee91bb7f99840a06aa3ed46ab5dad2f06361707eb03b58f831379dd9d9b51bb8897d1e2cf897bbbb8f3ffffae3d7dc7c6206dd77560cd2f9dfe6e647b3811bec3ddcb71de82c8086c3244f6bf1ae3a1b1656bc03574626d3a9b81abaa4129fabfbf97beab42a34fe511df2a9977b6bfe6d3847fe2bd8191967e4cf5dd988b17ee1eb5ce2c76a93c05b9d9361e2b41eaed47985f93b30f2d17b7495891fd4455169fc36ece1ad685d8fcfd4fdfaafe2b0ff2c11bfa9fbfa4fd4a6ae9db8803d7cdc391d96b5d57c129fd669ecefbe3a1b66babf4fb529b0fe3d1ceb9b76ce9210aff5dca98b02fdfd50c7f5f81df656eaa115719d3bbc2f17adef8b5b755194d23f4ed5a6403f315e259a8f479df3c4c4fe3ec0b15e592fb7799eeb7a17b083973a176919fb97ab2bdfe87c12dba2d67ab9569789d6c3ab708df536d475dd78c93fe96c52e3f1bee4bc1a6bbcf68bbcba8efb5957dbc415e29f9dcb2cccd7f59ed465025fa8abd8ef1bd8c3729ecb26e627995f8578f46b536d5bac77206ec2b8e65feaadf1576a9be8fe3883e3fc52dda44ec78f6003cb79aef3c6788d97fdd7ae8efd3f5487f93a7e0f1bd8c0adce27a9d7e6753cef33759c4ff27eacb3898e531e8dfb50c01696fc4d6e5bf46f51ddb45a3fc1ce78fdbc93f3d0789be0fe1fc3f1bcbec016f7a9815bd433523706efdf45e3fc3daa5decd79bdaa7ade96ce53e84cb14d7cf60ac6f3d6c61d75be337a351dfadba49b53edbc006fddd87add667096e51ff9adaa7e8cf4734eab562df589cc7126e918fd52ec5fd79860d7c0d5b9c87388ef7c35a7fe80ffa75071b5d9f5fe0564d52af6f1dce2fb1ba9fdfc02df6f3a96e4d2b66f9ff1484fdb28d467ef97fd186fcd86faaf6a9ee978e608bfd0da351cf656f1ddf8063bd87bd75fc46ddc6fa93de5a1ff2755f122fe363d3af3753b7b8bfb41e8dfb3685711ec9c216fb2518fde5ebe8b18ecbe7d978dc8f0fd5e354c7791736e3b178028fd5a3993e4cdf1ffdfbb718cb0d7e5c90d7a8ffc4b43ce62b9ec873cd3fc36f89fa8ae11bbee53bbee7077e94a8277e96a8698ce119bff02bbff13b7ff0272f86d1a510b5cc2b318657798dd779238c6cf2166ff34ea86997f7789f0f3486477cc8477ccc277c1a22b6f88ccff9822f79c84988d2989433ceb96013f29421e2942baec3d6892c351a438e3cb5340ea35d4cc8445734a16bfa4937741bf3d01ddd4b1d13cee881cfe9919ee899a634a3975833bdd21bbdd3077dd2222dd132add02aadd13a6dd0e6d7de698bb66927acb14b7bb44f0734a2c3107144c75f3121ea844ee98ccee942222e694809a594fd3ba67b5f94534186ca307e149e942aaabfc758a6674be1f3baa1dbf0b9eda9b6edf7189efedf33fff7ef73ff00aa8c7a59</data> + </image> + <image name="image7"> + <data format="XPM.GZ" length="2366">789c6dd5c95223471006e03b4fa1206f8423a7777587c307f6556cb3c08cc387eaea12abd000629df0bb3b3bf3af0e07b60a019ff2afaaec52233ead8cce8f27a3954f4b8f0bb7b8f2237fe91e462bddd36cf6f6e75f7ffc5a5a4eab51ff9534a36cf9b7a5e593c5c88f0ee777a107050125fae8cddfe002aed4b5b8d67c07d766de803d7cd43b4d129fdafcd29c1666f2eaba1f5affda3b4b529f59fed0dc0ff53a5c98e946dd881bad17700dcf7be7699ee4a9e65bb830f39abac9eb5cf3f4027bf8b97791e6beb0f9ce5c2430c18599757ee1c44e9dc3353ce95d66852ff5f079d55c26700697b0ae5fbab2296d7edabbcacaaeb2fa177395c2ef7009efa95dd55436ff19eeccf4d07b9c57588fde065bfe327a9c6b7d6a1ea7a8df45a3feaa6e639d6ea3adce677009df0f6ed50f70036b3f753eee6acb1f98e576312fd46d5dd696df851bd49f066b9df47c9aa28efbed9b9bb429d47a3f37be691aaf7eeced0a973aad93f6ebbc0bceea9bbddba2cd5a9bff19aecca4fdb49d4b6d3f7a824beb8fae6187fd7fc001fb7b735c8f93c19dfa1576663ae9edcb61bf0d38ee770c3bf868b0e57f465b3fc4e636b37ee810aed0df0eec70bd07703c1face7335faa67706526fd7bf0d2bfe569cfec335ccf3e1caff71676de7c030758cfb32bbbacb3f5b7d4c1c7fe56e1006f9abbd8df15ec3afd3ce4160e66d2fb215432dffa9b99e37cba80637f6338583f1ca243a5de36870cfbb968ab939e6f907e713eebe60ef71b6dc3381f5ac0f17e98c301d7d79803ce874f07dbfec77085feb66079e87afa7939edafcfaef7ca1c32bb5eba8bc6f95fc215f6fb0e3bac7f0ec7f3b8889e9a6bf574a89f98a719ea53581ef6cfcc06d3c761af7fc8386ef1f4a2ce521f3281a718177c29df3565f70a5ff30ddff26c582788efe4d9a7e676ff8bef653c0ce39117fc24af3ef30b32aff2fb23bff13baff21aaff3066f4a6e8bb779877787cc9eecb0cf073c91cc211f49e68d8ff9844f256599cffc45d6dd939e6565fecadf247326f573fece3f9049a49a72c6b9ac5270c99566c65c73438ccc26af1291a3960bf2d451e084a67441977445d73143247b1474439e8f2848e6956e69467734a79f96a17b5949067e2692b8a7077a94c4829eb0ce849e65bc4857677c26bbbcd21bbdd32aadd13a6d58e65fefc5a97471419bb2c6166d4b6287763f66688ff6e9802674286ffa111dd32e9dfc679df9ff8de5bf7f5ffa07d6011b20</data> + </image> + <image name="image8"> + <data format="XPM.GZ" length="2814">789c6dd55953e3381007f0773e458a7ea3b67ae24bb66a6b1fb8ef23dcb0b50fb264738600098130b5df7d15f55f6686dac930533ffaaf6e5976c53f967a9747fbbda51f0be38999dcd99ebd35afbd25f7361ccefefee7af9f0b8b89eacdff66652f5dfc63617130e9d9dec1e8a99983ae3d28e96755d20f1ec016de17e7b65f05ef05575dfe128ef9cfce92bf12e7393c9c3bed170ef965b12ad0ff22586755aa838fc48513f3b6b82a643d6fc15ad6f3cbdc5992f5b324ac3f16e7fd54e63d89ab44f6c3a7700167b043bf9368cc9b066b1de76fc21ad7b331779ee416f39d5817d83feada61de4ab0c9f3dc84fc81b84c72595fcf5da4d1dc8735ea2be24a63bd15eb22937939ece037b189fba16053e842d64b7fa312e9c747e232913aa773abd418eca709364a2ba92fc34e4cebe22a41fd7eee3253aecc829fc56502ef06d7a52bebe0557155a0df211ceb85d834629a3fdc5465ddfa75b14d5578f8e936d8f7ab64de21ace1cfced2ef0d8efdc2f3a3739de83c38dc5f6dfd03608395b856a82762abd02f3c4f26d70ef907b1298ce4cfc47583fabbd82af8186ea43f85fec69a44eaa4a2a51f6dc205ea256c30efa2b3d46fe046ccadb84ee181d82af4afe6ae739f977e1fd1b5d4d7c4752a66e46b050fc5b11f4fc40ed76bc2f3593b93e0fe9ec3b87f34830dcec3c0383f3a15d70afbb7d1d8dfb8b30bf3c2f5dba29b57c098675ad8c04d67c9ef46633f8fe23ac5f53838decf03d8c87e4c0de3fce9355af6c7b04d6d113c8315bc031b18f31dee8709d76f5d1defb78663dd886d2af3680ae37c6835da8aefe038efa6b3ec770437c8cbf93997c2e1fbda15b1ce65b40bfde859ec527804c7f9e1fbdf357ebdccd7e298e77358617d031b17de7f5cc30dbc266e309fc3fbaf514d8aba896e54382f0ef6f3719eb9d8e179a733d8e0fcd268d92fedc0d83f3d889bb8ffebce32ff12f67f82c7e216fba1f0fe6a55d7ff43dcc4f3de8ec679bcc3f17c0836e8c77023e6bbe856eae1fbbc6dbbfa95b84da5ce7bb06adbe05bb8150f26f261fafe91df7fcb18aef163bd9ca47ecb34dcf20ddf86cf1ddffb7f43ea2bc30f7ef5230ff9894721f51cfe77fc1233fcca639ef01b4ff99d3f78e6ab9f3eb5cc2b31c3abbcc6ebbcc19bbcc5dbbcc3bbbee71eeff3011f4a868f78c0c73e31e5133ee5333ee70b3ff192aff8daa724d3e78453ce38e78215977e52e5d76b7ff1444632549325e77f1a6a43e2956ee896eee89e1ee8b1cb0ce98946f44c2f3ca3571ad384de684aeff441b3b867faa4655ae111adfa1e6bb44e1bb4495bb44d3bb4fb75edb447fb7440877444033aa6133af53d76e88ccebf323e7541977445d7d4a7242452ca28a7e2d78c3fa51552545245da27cefc27376ce85b868ca1a9a9fd1bc7d1a37f8bb486cccdf70cbffcdf67f1df3f17fe031c788805</data> + </image> + <image name="image9"> + <data format="XPM.GZ" length="2862">789c65d4c96ee4361006e0bb9fa2e1ba19418d76890872f0bedbdddedd410ed4e66eef4bb7edf620ef1eaaeaa7e24c207b069ff9932c2ed28f95c1d5f070b0f263e96d6667d36a504deceb60a59e3f3c2cfefceb8f9f4bcb6136e87e9260102dffb6b43c9a0daac1d1d363d381460e1406611206e2545cb874d1d9d69da3200ab4dd56621305da4ed79de3302ab49d17ea3888436997feb1890be443efc888af3a2761ef2d7512a879ec9dc8789cc309ac79eb6ca5ff3b5ce8fcb6e99c4609d6672d5c845a4f0657da9fe1d4d7affd6d5245da9fd469a0e6144e51ff9b77ac9e786bbd740b1bd4efc733a9cc6fdbce5994a65a9f2dbd31df056cb45ecb62d71fed315cc3893a0bb19e356fecd7096c32b91cbc09d799b64b3d799ca5e83f867dfe15aef358fca1ce433812975988fd36b0c17eddc035f6a7f0d6fda06d753f5e05637efa80ebbc94fd90f10a571fd66fe15ae7e707b5efcf721f8bd2b753a2ce43d4b7a72e42ecc7339c6a3d54f596f9e9cebb10f3103685d6bfd15bf3725e26c9fd7e9ca90b83f516706d1271a336a1dacafd3255817af91cf6f76f556d501f4f61632ab1dc2ff7baf8fb1bc146fb73a036befe03b8b65a8fd46bab02e767a76a83fbc6a7deb8efefbd753f5f6177c1a57d5d6d53abf5cd3b976e7edcbf176f8cf7a8b64da9fb21ef57591bd4c333b50db11f9bde78df57e114f7ed0bb6babf740a3770d95beb1ba9cb089ec099d6c335dc94b558c6af526b71dff77bebfc536fdd0fdaf5c6f9bfc10dfa6f7823ffa4f6f5d08eb79e170de10cf7f913b6d8ef636fad9fe4bc2bb71eeccfbdba8ab09e1d38c3fb907ba3ddc0b6527fc20d2ce755bbf9701e27de584fd05be75ff7c6fb7f0837dace77ea2ac27d7a52d7519d8aa5febaf1ed3487338c3783adee0fefc10d7ca3ee1ec91f756eb2be7d4d5d47f0be37dee76dd8efe7b137f218af89747c6ebd9b4cf2f27e374d13e17bf3e88df55df7d6fe727f5ad71fe77de98dfe0b6f3d0fba8033b45bd8627e821b35bf78b7da2edfd7b6eddbafd46d84768633351ff66ec597b0859fe1563d9ae9c3f4eba37fd76f3e975c71cd0db77c83df89cb4c35a5f78eeff89e1ff8919ff819cf0bbfba7f25a5ef1acf78ceef6eacefa90ffe94d442bf2ffcc5ab2eb1e6c65aef531b2eb5c95bc86cf38e4becf21eefbbff0f903ae4233ee6213223d772e2463be5333ee70b377e97bae42bbe7629cd8c39e090238e39e19433ceb960e3964e64a9d48cdb9931555453432dddd084a6744b77744f0ff4484f3e23a9677aa1577aa319cdddf34e1ff4490bfafa37e35239add21aadd3861b67d3fd6ed136edd0eef78c8cb547fb7440877444c734a4119dd0e92f1972a9333aa70bba74892b97bda6f1ff32ad8c15b8ba428a28a68452cafe9b716bc95daa706318cb96acb5a57ebbbe8db390676cdd77dab6f6c64eecd4de2efffdfbd23faf5c83f3</data> + </image> + <image name="image10"> + <data format="XPM.GZ" length="5374">789cb5975b53e34a0ec7dfe75350a3b7a92d9dd8b11dbb4eed0381e17e09b710d8da07b5ed90102081844bd8daef7ed492da5c86b3557b9b9ed4cc2fddfa4bad56abe1b71f2b83defeca8fdfbecd17b418972be5881e567e548fb7b7cbbffdfdaffff8f6bd1daff0dfa8e8acc4dffff2edfbd162a55c3998ded51ed031404bfe08af1a27ca70a79cb43231867be32423e19972daea38e1abc0795bf8c63855c696729616a5706e5c181f08e7ec30177b32ce95c9e6933c11ff34554ed354e2c348b953b94a78c373d46a9591eeef41d90f61324e946953b9d137fbacd2fde29e72a77089f0ae71a50cb70dabff33e53c323e354ecb54d62f958ba8503db5cffd10ffb97292c41a5f6c9c1b6bfc79567524bfb4aedca9ec3cb695833edd18a7c63f1bd6fccbfab81595aa8fa5b21fb2bea39c56ed48f854394b8d41996a523de522cee342e62f943b455b793f70a2f663e5bc325e2a179132d4ca145552bfb06a5c5bfe77945d6ce7f3e4b91db55b165faa1cfc414799f5b59e87c645a5e7532a37fe5e955d66e7590917ed5cf703997211eaf152996ab527892f617dabaf893291ae873de5322b459fe4be24e4e254e3ab8cb33a137db96f699c94e6ef5a39dc078a94833d9d1867ca28fb4f1b3dba532ec9eaf3dcb856c623cf59ecc8f623f16654c6763f32e3acd6f92dcf9d36df3fade75e60aba74be532b6fa5d33ce94311176653dd4f86e95ab58f383278187439997fde7de5eeb7f57b9223d4f927ac85d64f50c0fca79a4f1d3a1e722c90bf5ef4a63bb5f0e958b4819526597e5e28f0ae132b7fbe74099d7eb7c669c1a1f1917d62f73e5a007a7ca95d50fa6812d1f72fe944489ddaf44b9284cff2cb0e9af1957c67de53a36fd8bc0aa0f6de1b2d13f57ce43fc7de3e0af540efad455ae6ad27e73dcb0f607d30bfed0e66bb2f314ff2ea1d4f2313526cbf720b0f6331819d7b6fe39b0f53b9bafad3f90bc5fae6ae69db28b8db71b96785d98cfcc5fa15c87fb830d6bfdef1ad75aaf20ef499936ef49a11cf4e9ded8f471ab619d7f0eacf9c44763d279780a6cf3b1716df3725fca2acaad1faa7dc5fd5dced79172b37e1058f5a0ab5c5abc80816dfea2619d1f1b5bbcf0d8b0ce2781ad7fcb7eab342ab59fe25239d863bf61ad9f993119ef07b6febf6e6cf5462f816d5edebfaa0ef3b8086cf353e5caea05260d6bff991bdb7b000d5bffdc37b67e4af2bed459bbb4f7665339fcbc0107ca2eec6f4db9d15f04b67e6cf6411fd61bd6f87ac6a1fe40b9b6fe092eb0f5c757e561acf50b6781ed7e0e1a96fb0992bfba0ef1c2b572e3ef4539f8c3bbc0ea0fbbc699f14ec3da8f82bdbd3778635ceb7d03a9ef61d6b17e8487ca8d7ddb38d83f07b6f773686c7a386e58d78f94433e70621ceeb79cc7709824767ec7ca6965efed4360fbf9f948997fbcd3fe38372eac9f55c695f5979e7251d97d3b0c6cfdb456a6d4f27fa9ecc8ea25522e433db694ab90ef57e5667ff7c6b63fac03db7bb36a3cd4f33f5afc77e3ffa3818084ee3fd7c0122bac71c8e3df5079af81576c3f62fbf1bf5241a7e32b0dbcc6095bde88cae8cf34f016ef70ca63f6a61334380bba87118f7bfef8887e51c1075698f358f098e1a3ae68349ef0195f782c25d2252bbc7ed6c055ecb2fd9ac4b18e3ffdda370ddc60bf2fac62dfb24afdab0a677c938757d13866b8e55798c6367bf0513436ac32fa9859dec78e28ece21eeeb3fd3a7b5c060d3ce0f587ac30fca0b1fc9859d6e8b1c6111ee3099ee219f659e74dc3b187bb8f71c8ee6f58c3bee37df82876f11c07788197d8c208e30f1a77bca28bed4f1a635668f3f78effdfe6287aac91608a1976388e1c0be0e344173400786df7bd06902974c1fbe8c94e7228a1821a86d8822b18b1c6b8d1e8f12a1fcb12c8a2d8e06c78851d99e9c1b53f1398c00debdcf2e706ee60ca51ccde69f42c9631677895631889f5fb1836a5ba66ec7f06f7acf0e0e3f075661a9bec4763e94a5ed47ff75d0c3d98c302e71cc9233cc1330f1fc5f2bd865fc5eb5e2c1ef9185b0cb060fb092ce11556390f5dc9c512d654c35703ac9bca35fc840dd8842dfea6d7e461ae3b816dd8815dd8e37f7d0cefea432a6a9f57facf011c420f8ee0184e6022114875fb1870ca319cc219f4e19ce319701c8fef35e002e7e271032ea10511c4d086c4ab400a197420e71b3265ffa750101210115732956f1a12c95cf6bc49155cf26fe343bae2dc4d684463baa609aba438a31bb6bea53bfe774a33baff74f71defce677d8b1e684e0b7aa4277aa6175ad22bad5297d6a0837d5aa79fb0cd0a1bb4c91ae5470daf422f3865ef279cd113baa22dda668d1db6dfe5cf1eed93e376bdcebb98d2011dd22f7dcc723263ab2768730c3d3a8227e6255b1fb3c6099d7a0d5671fe17571e67bf6a888aafdd3ef5e99c06e4cf6f411774492d8a389e98dabe26f8db180694bcddad4f6f838381f4a7be7dbce205c7b0c36fb068f89a6085ecebbede64c559f5c8c7fbe55d7428a742ee29d796c38f3df28b778e730553f686d2ebbc5fe433e021d9283fbe2d5f6b041d07307524778263619cba2fecff5c23e87c1e5faffc9fbcfbfffcfddb1f4bcc6304</data> + </image> + <image name="image11"> + <data format="XPM.GZ" length="2127">789c95d44d73da3818c0f17b3e0513df323b2d7ec59e9d3dd88eeb80430a69094977f6204b328a3010c020a0b3df7d253d625b3a21d9351cf80d7fc9aff2c7abd6e3a0dfbafa78b16e50f38c5b98a155eb8a6c66b3fd9f7ffdf1fde2d2755af21b382dfbf2b78bcb0f2ddcba5bcca9facde56fabad37455f336ce376a8d851b443dbb335b1a26bbb6d57cff34533723d3752bc33c440a4e8d99ee7e9b8d4449248d1320c819f157dc76ffb8ee227c5c0f149a0790b0c7ce0574d24a9c74e0d23605bb1e376fc8eab38d62c3b51a754740c09f09b62e88676a8e307cd328c42fdef8b21013e29465e48224ff11918d9c047431fb8d1c49258f1de30022e0c09f05a117911417a2c03221b3830f481074d2ca9c7760d113030a44057b1f4102df5d83eb0748013c30038d7249244b13144c09d21052e15b15f52ec2b6640ec0053c300586812493df6c61001678614b856243ea6448fad80c4010e0d03e048934aeae759182260624881b52295290d14732075805bc300186bca94eab13d4304a48614b852ac645ae9b17b60e5003dc300686b5692952231ac801fded94e1a0ba94ff9568309a1d5843d5ba575aee17c3a25b49ecdd9e2c542679a2563b25ad17addb00d7ebdd98a9daee85e5493037ead913b8b935457b110cd353e6d9075acb675c6d8a77c2b6ebaa70d26cc2a8f554f14b7795257fdbb5f9a7c79c0f858b1cfdb3a1119c33f379cecb76931305539cdf25a0c8bfb2f278d3c97b82e32a8beeee4aee441df9fcec3a6641ff7f24cce8ff1aece733112938731ffb9c998ba2a7274d52c9b91c885a8d78f4fdfc69cff38779eca485ee19548442dd49ee25df7c0364f6d75bea6b1e54c63a233f9e989753a9f34937e77f1324696b9cedcd617586572db564d3613d53a6bfaddcd8373bc17dc4ed24c656a1b0feb2adfe6c32acd26ee60f1effde2855727c5326bdcc1f3e3741cf7621a27a359b19b777fdc539f679ea8864dc01e0ed7ec76dcdbef7bb9a86eb2e6f4bef35def663960bbf5925dab8393d5a82a7e79e639efc8b2c94749c1f499ca1d0e5f5d179ca77652a76ca0aa557e66edc86a5feb074e5667d7d7712e59bdb106392fe45cf2b8de5ca766ae77d6b23eae77d7bbacfec33b81ffeff7c6b9e6efdf2ffe0193880354</data> + </image> + <image name="image12"> + <data format="XPM.GZ" length="5054">789c9d975b5322491085dfe75718936f131bb974030dc4c63e78c70b2a828a6eec43d217c52b228ab2b1ff7dab2b4f96ca30bb1b634beb67569d3a95555dd9fefa6d6570d459f9f6eb97a7a94c47e94a7a2593956fd9f3dddddb1f7ffefed797afd578c57d478dc64afcf5972f5fbbd39574e5e0e13e2f81c90155fc57c972024e2b4d1fbf308e34de578e2b71cbc705dcac469e53705af571e929b732a9954c236589943902d725f5bc05ce95e94c79180fb5fd333819669eefc1b93281d3187c659cd67d7be324d538e69f0ae21570ae713e50ce62f02658326dff1a58f33955cee33cf1fc084ec07760c9b5fdb57211832fc149a1ed33b01485e721b85026d56b365bcdaa675d8f66c8e7213847fede9443fe26e01cf3bf51b6fc700ece75bec42547151b4fba8187befd39385396a9722b427cd57333aa45babf364aae45b54a4df7cf9a67a9d56ae2791ddc04ef969cc4f54c59f63c4b3dabfbcd2dfbca4904ee04d6f607e03ae2d78155bf5972a39ad431dea931da3f07f6711a805b60fffc348689f9b90bace31f1a273e4e37ca0df377648c785172b36a716a836dfc29d8c6ef1a27ca7ebce6b05187de1cdc024fc0f023c7c60ddd4f35e566a47af25072abd6347fb3c03ade35b80ede3386de11b805de0aecf7078d3da7a1ff061871ae8233c4778da1b71658f59e955b11d83f3f6e3b59fb2765b73f753f6f82cdef4360edbf6a8cf66f60f813ef47528b73076ccf8b8033c4e3c0da7fac2cf04371609dbfcfdfb066fde545d9da731158f5e660f3bb1358e36cdcd2f3610f2ccae2f7db3013d1f6543546fc129cb7fc79237ebdd2bae4186fdb58db937ffed2cce2f4aa3c8cc1eb8175bc477002bfc682f126e01cf5645f394df4bc235f8fb2baf5e71a18f3e163b0f9bf524e639c9f2d30f4f80c2cca42609cafe2fd67791a233faf81557f0b9c806f8dd5bf6460013f19eb792d2330ea9df8e72f4f42fb1b30f2411563f8df56ceac3e76c0899eff6471417ddc3446bd7b02e75aefe845398f95c5e73bcf33abd77570827ade34c6fa3402eb7c8660cbef6a60f593806dfe6bc6a85f7363d4abbe728efa4fa781b57f618cf93d04d67a7c0b4ec02fc6a8e75d30eab9f8f78f2209f3cbc0980f5d80e1577265f3c33db0d5dfc418f33906633da81558d7e3126ceb736b0cbf3b81753e27ca45acef1b043ff6fe417efd8ac2fc50648cf1cfc1b65f7ac688ef07d6f11a60f8e3b631fcf5950bbc3fd14e609dcf1b3881ff8131de97c66001cf02ebfbd3088cf7a7ee94a93bfdf9cb6b0a0f997e5ec76ba49c71cec5cfaac0c7255f398dd1ff51f9de317c5cf38dd7f80f95b23fdf2ed510bee37b68fc50c5f77fe0b1bb96fb78e449d058aae2fa3fb9c8d87f96fb98f2f3078d0515efe02528cc7ee0e395df3e697c5071fde7aedf7b64ccabbcc6ebfeb3f1c1c7266f2d6840c5296c73db91a9cc788777798ff77d663a652bf838e0433e5ad0e8fa391c738ffb9f7c9cf0a9d338e381fbbdc3e77c011f158e38fe4ea3ca35ae73c28d4f3e4eb8e9345ace9df3410c8d9488c4692e68d09052ca167d504e45e9832e3ffba02b1a2dd1b8a6d4f9e8b911677e4d663ea303ba29f341b7dec75df0714f420fdf698ce9113ec66165474e63f2231ff4f44961c62f34f13eca7c8c3f5c039a2ecd47e9e339f4f63b895e6846aff03178d7a0379a9b0f5a5df0b1e6f7a01fc98df5c64f34a575e4c3f5f47f2b3f63efc3e7831e16f2b1612dddbdefee9b34371fbe67f87cf0f1bce063cbb7edbbfbadbb37689bdaf4aaf970fd764a6dfc0cf9a0dd857cecb99eedb27779d13e759cc6017c9882aa1c061f47c107f1b9f3d1752bd5a063ead13127d4e76d3aa103cd07eda847a770ea94db211f7b960fff649dd3190ddc5af5b847e7d4a70baa50613e7cef5b8ab8ea721453d53d712defa3663ef07c9a4a9d126a50d369781f8e2f9d46cb65b24ab1b0cb448bcf847c3e6a968f704e781511194a4a4dc9d487e452b8d9bbf1e552ae4a0519c9c865abf431f9e8e35d45aeb9e3fe1fb8915bb92b7dc8bd3c7055c6f228137972794a5cbedace57998ff97b3ede5564ea549ee54566f25afa907b9acb9bcce5d1395b9535c99d46990ba7e2f6527bd1c7c28cd6e94436682a9b4e614b32d996b6ec8870e13c955fbb6e97169ff3b130a33d97dd82da4e615fae654f3a72e0fc95d7350df492433992ee328d0f5eeee4588e38929edb81238edc1e5af673a9065458bacee9b9f4fdb9fac34bcfe4a555ed822fe4a4bcff5bed447df9fbb72fff000126f975</data> + </image> + <image name="image13"> + <data format="XPM.GZ" length="7166">789c9597c97223390e86eff5148ec6ad6282ad9494a9cc98988357c9bbe5dd9e9803c04c59de2d4b5ea48e79f7a1881f597659d5dd532a96eb1309f0270882f4efdf97ce0f7697befffe6d3ce1c9b55ff2437e5efa5ebedcdf4ffffd9f7ffdf1edb7567369feb7512c357ffbc7b7dffa9325bfb4f7f850cd81a601a811ffcc990791f3465bd95f807d238ffdab734e1ad64f7be05c596e95937612c7531a39b77ede570efdeaff189c2bd3f99c9b8d309f725739317d4fc63a5edec1b9cec78972b3ddd4fe5ee4a2093dfe1c8cf1fed458c77b9a732bb1f1323546ff23d8ec7bc698ef12ec31feace622f28972aba12c3bc6ad24f2307261f6bc32e776d26eb4633fef46e676bb15eddd1d386f73f4ff06f6ca12e39136dbb98ee775b0577fee46396da43139fc133855e659e4e05ff5f2b2b1eaf5ac1cc6eb7c2fe042995370897e37e7ac19f4eb7a1e9453ac9f37c06516e77743e52c51a60c9c2acb75e4b05ed83794d314f15a0397ba1ed957cea0d70d8c33e5125c80e12f2b95a53fe74e2bc3faa46d0c3d7b60d3bf6edc6945de54ee24ca7218593a589f1370d191a83fe653deaad7b7ad5cc76b0a4e914f57ca9d04eb3d025bbce279cea583f5731b0cbd7eaf66edef2be7a6f7019c623d649c47bd72072ec0bbe05299637fd14e1b385f27cae64f6635abfd3218f170185f24453bfa8b7a0b6fe743c858e773f7e0bcf0b1df2b9b3f790297ca14f586e365f5eccd58fd9131ea1397c65a8fdcad31477dee41b9532acb99729160fe55709aebfa3330e247317fd8db7c74a59ca21eba47e5e03faecf5d2be789b2c778f3c7b1de48d007ce9473cbef897261f1a99439d1f1fe1a9c6afc651bcc58df26b8d2f9c35514599ae098df526689e6abbb52ce4b2923eb7c659128fb2e18fafc8331f2e555992d9ecf6086bea672983f325d8033d1fdd900b3ce270773f6695d1f8ec1a54f234f953b893293728ef3cb23b0ed87572e0a1deffbca8cfcf6fbe00af1dd3186fe75656922df633efb32e4a39ebf5765ab077ea81cea899edf3765d3e76f9405fbe537957d13f17f02b38f4c315fcbb495ebfd4f8f607b0f54c67a9edd96729ae23ebb01177a1fb97de54e89fbe45cb98e5f014ef5bcf2a1725160bf5899b9d4782e2bfb0cf90e3d9e753cc5f74159d57a1f8df57e75babe2a2d908f89720efd7ca0cc8cfdbb55b6f928e64f9585e790d6b363e5dcf2a309b6fa766facf19547b0d5b767e522adb2d82fca5c613c2b4ba6fd1ef3fb4ce3e5efc0b6bfeb609c47bf6aacf1f16bca65133c0367aa9fe2fd50556dec3f5f2887fd8df1225d4fd529500f5bca79a97addb27281fbd74f95aba6f6fb777056c6f728471e645982f74da16cfee9a466cdc7357089f9b794f304f9770a467df72bca45a2e7878e95c3f9d3fd19280bf65b568c35df240557ca847e8ffae676944b8b77a91cd6a7f9e3c1acebf502ae743f19eb1b342b8d878e1fa429dec70f605bbf53ce12ec0f83f11ea0c458e3412d70a9f94f2fca9d14f7496a8cfdadc016ff6d63f5e70ec1883f9d1ae33dbe698cf7c68d31de3b6de5f0fc57fbd79ad53e37463dde03432f0d8d35bf5c0f6c7a07356bbcc818f15935567bba03973ade5d2a17d0e7f29a55dfadb1c64bce8d513fad1ffbc1ce18efa70e18f1a426b8447cdf8c717e0e8df13e7c3546fe8e8c35bfdc8532e33cb8dd9a55cf1918ef0f6a18e3fd7204ae10cf9d9a359ecfc6b0bfac59df2fc85f69c27e52b3daf78df15ecc8db59e39e4ab6438df669fe97de8b76bd6f3f66c8cfbbe673c18442ec18cf9c7c6f87db530c6fc2fc6b0177085fdba31467dd932c6f9c77e7b7b7f3cd5acf75bc718f5a63446bdd900633d7e5cb3fa3f32867dcb58eb89437c3deb7efb1763f5c7c39a554fdd8ffbe0d518f759afe698df7c6dac7a1df2d757f8fd323386fe49cdfa1eef1a63bd6bc6d00f2e9b88f7a631f4768db1fe8eb1da13ea6189fce02b63d4eb7363bc370f8c519f778d71df0e6a8efdb265acf9e156c08cf7eac818f5a066f54f66cfa8f76363f8437e9795faa36b63bcff4c2fee735aae59efdf7763dce73363c4a7b6d7f918f5dbee67191b0f743fea7e1d2f382f5586fe59cd7a5e909f15a3bf5bb3ae0ff5b7825e3a34d6f848c358c7fb7be581e919d5acfa8fc1d81fea1863fcb8661d0f7d03e8a3fd9a553fead1dc22da4f6a8efdfdc9fce3c8b113e75de92a3770576ee8aedd8dbb7577ee3efc7c08edf1f34fb5eb4f3ef810f7e4460bdaf32fbe5fec63ec260b3e2f0bbf1d072dafeecdbdbb8f3ea6c1f7a2d1b385df3e050fcb6ec5adbab50f3ed67fa16363e1b7aaa1ebd65cef838fcdff43c756d0b0ed76dcaeebb9bdbfa1e36b3cf6a38603d77787eee8938f637712e6dcf8d44e7fe2793b8b1acedd45f0b0173e971f7c34fe563c126868aa06d772ed4f3efe3a1e69d490b94ed4d073b92bc87df051fe553c88e61a8849dc2179b747255534a0ab4f3efe54070ddd325dd30ddd6a1ce88eeee981aee8f1838fc19fc5839e82f5889e69ecda3471bda0e1855ee98dde69fa49c7d77d41a3192d073f2bb4eada712f725a0b1ad66983ba9fcecb2f74502fb4cdf0bf53daa26dda891aaaa0613778d8fbe9cc0d16c583f6e980fae1e7211dd171f07142a7310ebb7446e75fceedf0ab0eda0fed22f899ffbca40625d4a4901161156d4abf9e7dca7ed6112d3b211679f052b06362e6f08b0d87cb8607345d503f7ed231f730ff86af421bf235dff02ddff13d3ff0233ff1e8173e7eeccb6958c1013ff39883377ee1577ee3779ef28c97798557798dd717f9e08d1f3a4c43a87913ee728f37798bb7798777798ff7f980fb7cf80b1f88071f85761cda09cdf894cff89c2ff8921b9cd0345837436b717ba18f54757cd2907187732ec409d15498fb22e2a5944a16c65475fcd0e026722543b9969bf0efaddcc9bd3cc8a33cc9489e652c93453ee4c58d3f6a905779937799cee79759987f59566455d6649d8e6443bad25be8e344f74236654bb66587e6f6bbb227fb72207d39942339961339953339970bb95caca3d6d0082d09f337a5256d4925938ee45278e7463c74a3b90e4f5f7d789ec7c34b683eb432b4ca0ffc951ffa6bdaf237d2f0b76eeceffc7d6c0ffe71818fa7a02268087746ac3b7e142c9e698bfbaeeb83423f896de45fe63afceb421d6f51c75c43b8fffc34b459b058f62b7e3558afd1be5f878e8dd0ba7e414c7925a8dd0c736eb959503ef6db61053b7ed7ef85b6ef0ff82cc4a01fda61d0d0f5470b751cfb9e3f89ed542efd59f89c060a4d7a72a92dd079fdff8bdac77ffff9ed7f861313dc</data> + </image> + <image name="image14"> + <data format="XPM.GZ" length="4574">789c9d97595323371080dff9152efa8d4af57ac633634fa5f2600c2cb01ce63e5279d01cc636f8c0366048e5bfa7d5dd12c61c45c22cc767499f5a2da9edfdb156b96cef57d67eac4c6766d6cb2b79d74c2a6bc5c360f0fce75f7ffcbdb25a0b2bf42f88ea9570f5b795d5a35925af1c8c86a505a4fe15a8f2976573a31c29f7854d994596e196b9611fe699722e6c7ac25928fd4d47b80ccb84f9de725075fd61dd71c0f3e19d7010099b52b84c747c2edca12f1edfb01ca6611ea6dc5e58ae05615e0bd8d715ae5585cd403952e6f96a29318f8742b9218c1de55cd80c2d47412d8fc4df148eaac266ac1c697b9dd9101bf6e7ca0d619c2be7da7e61390ea33ce6cd42e5b8aa3c548e85e15a383705ef2754954be553e1221436bc7fb171e331f12cf19c2ba7caa572210c7bc2ce87c67212c64522be33e124103623e558188e857d7cbf1ccbfec2aeb0f343ddb1b69f2827da7ee558da91d79798244d24de48d8cfb729ecfd5b8e753cafaf5eab07f51af38b722c0c67c2ce67d0b1c6b721ece3d5f13e3ebe5ff58c7c19f3a972aabcab5c08c38eb0f7cd95d507cfca46fd7cbe1bb57ad190f847c28d401842e558b926ec7d6365e7cb9833ea2ff115caa9301c2817ca32df6b7c2d65f541d3b3e4ff5ed9e5efc9b39c2fae3f69d42852ae27f82c9c06ca27cab1304c84fd7c46d9f97b9ec5cfe72fcd697cce0ccaa9f258b910862361ef03cfb29e4098ea9df8793e13a58591784361d70e6dc71da96f9972a2ed43c7d28e9c1f931b63249e81b0f77595753c068e757c4dd9e87c1c7f16654956f0f844d9086355d8fb22c7321e7e2aeb7e62dbb1b6a7cc85f73d2a9779ccf31b617f9f51d8f9e0c6b1c67fa45c2a1f7a96f703ce5f1ee7a1f8615b3911c67bcfb2de3b65238cd7c23efe8eb29b8fdfeff2a270f52416f6f19e3bd6fe07ca3a1e1e3d73bc980a7774fff1ca33b71bdecf22a67a25ebd9574e8471a2ace711a7c2eefd16636517ffb1b09b0f0e3d4b3c5bca89f20373e9d68b3b8ed5bf2eece603edefd7b3a9ac3eb85436eae7f3634f93f6dff62ced1bcada1f787de5ab7f5fd9f56f29bbfea5b2fbbcc0f5a4f3ea6f28bb782e95b5ffd1ecff3c0868e4af8f1c9861bef0149f384aecf0ef9b65078fea527b46f3f4b08fb778675ffb349a019ab70eea3dc4118ef11e2738c519fd7cc0477cc2f9b2059fc9ffc27f35171d6c78a471ebd8c20ddca4678bbe7fe236eee0eea28522fc4511dce0dedb7ca8614ae3f7d5708087d8c6237a8ee955e32c784286535ae5199ee3c5abc31b2ea9778be3b8c26bac628021d630c2985eeb8a855631224342cf1ceb6f1c238ea1459606fd3cc614d01a00c090a78a3164ea78c13d9af10272ac43e11c58d01c3dce430b4a8e65133a70035d72f4c8d2a3580ea00fb7b2d3b486a18d018ad77c501473b8a3dc6dd0778bb3189363004330308231dcc3042398d2dc9a558aa129e763c1915114d6b0010f94cd6378a46c0614c113cce1195ea009403901587f7f46bc03c861f7e28af2d0818ecd264ca045860dd8842db200fc846db8fdc2d1a37361e7b759b0797031ecc02efc823dfaddc323d8ff2a0e38c0091ce2158fee421b8e348663388153729c516ecff1e9ab38e082e2bca435d8f360f7a2a9315cc13554c931267b0bcfbf88a3a09bf568b301760d938518ace19af231a1bd9dd25ce1670ece481fa7700836934f50234744793855c39c5618d309fff0fe2e38e690d0096d531c2d729c419d56609f393d0332b4a081d9570eb6ec424a67b4cde77b4cbbb963907eb76c0cd0a7b3f9491d59bafba7068ca1b3d4a6b340f7047a26a33cc494096bd8331f5a966b101458400a539af780eebcbd2353ec9bc2aed5d01b28d59e77968f6aa1b9c10b3ad5dba64b156cc8d5313337a667fae6966e6c7fd9b2900f5fa7b158acc96e37c97d47773521cb522c0b0e5fa73fca9b5a06d87c1fcbbbb5509db6b5e953cb1dddf9a558fcf978a61bc31160f333c3522cdea2677dbc58a7bf7e38960eedb5b7c867717a16ea3451f95f2cf279ff6d9d466386df88a549965b6b91ff63bdadd3df799cc58cf04ef3716e6330e3ef1a5e2d7061eeddbe2cd6e9ef5b6066ebdaea3fbfaffc0bcb04b0de</data> + </image> + <image name="image15"> + <data format="XPM.GZ" length="5502">789c8d97d952e34a1286effb2988cebb8e893cb62cc9529c980b838166315ed899988bd46230e00530ebc4bcfb4955fe250ccd99e9ae96cde7aacafc7329c9fee3c7dad9a0b7f6e38f6f0f4b594ef2b5fc4aeed77e148fd3e9ebbffefdcfff7cfbde0ad6f47fd088d682effff8f67db85ccbd70ee6b3b2025e2850c3fd73fc52735231790e8df9ce71e2990ec089eda75ecd36ff00ceb17f5071b3b267eb9760ccd3b17135dcfa99e3da3ea7359bbd39d8ef6f1bfbfdb40f0e9bb69ec00958c039fc5dd56cf39715070dcfb4675c0dc7093834e6cc711ac01fed7a0e52c73be004dc00e7e056c5ad6690b79a8e7f1ab71ae01370083e739cfa79cec13ede028c7869db73cbf9e3b2e250ed215f31380fcd7ed3386c18f3d8b1b4902f8a8cc33014c721383116175f148479e49a4f8e8ca38631af3b9610f593d0b3f9932de3a8017b9be0c8f6d346cde61ff6a214dc0517e0fb8ae3208a908f1b706af1c8d233d677c0456cfede8ce326f8d5b1c4516ceb1fc129f8195c188bebd7762b2eda2d377f6bdc6e1acb1b3802bb7ab4b3187a6408f67a26c6ed26faf1ba66575f7906c31ea535678e9fc02938001760771e92566d6fe0d9e2e1237084fe9fd46cebb73d239e47700a6ed6ecfcc90d18fea5f09c98fea9b1b6b3f10c1c81dd794db2a469fd4d637004ee7b4e2cbe393835e6045c809dbf344c52ec3f041769e8e6dbc669d3982ec011e65dfed33c29707e6e8dd326fa3bf70c7f31384a7367af04fb7e24cf36cf21b83016771ef5f8f97cb68cbd7d3900439f3c8153e82fc0382ff2e019fe22cf62f1c1be348d89c111e65d7d25177f5e72b03f2fa79ec5ec076001df804bdc5fb63c63dedd1fb3504aeb273ef09c99ffbe711618d3263836169b2fd49ecd67c659007b0d708cf373e7392b1c2fc062cc3d70692c4e5f1e79fb121867b1e9975bcfd0730dc67e3ef49c478e9f8cf57161f18d3c637e0f1c1b67eef99617827e97045cdafeccfc69bce89f0cecfd5f18e731fced7bce2dfe11588c791b5ca25f763ddb7ce6ea5944b5bf0b700c3ef46cf9ca266041fe7a35dbfa1d30fa21bbf28c7cbe1ae7a87f760946beb371cd56af1918f5cc0acfc8ef39d8c7f7e819fd0e3d455cb8f5e29e3745e9ed672518f66402467db3bc665b9f191701f27b0d8e514ff10c7fbb6029dcf73b1a824b6376df17cab840fee8085c96b19b3f352e03f4f7c0b3cd67ee7c971a0ff24d605f8f73b0cfffbe71817e942be332809e2518f37c52b3d5833d97b67e0b8c7ea373cf987f0597c6e2eecfe3b8d673665cf87a8f3c43df2918f6a50b463d64cf58f5dbfa75b0cfff5dcde6ffd2b3e54f080c7ddcf13cb6fc6f1a8f7dbd1f3c235fc79e51af37cfd83f04c7c6e29ef7e371ad7703ecf5bed46c7a4fc0e81f597886fe2918fd22c735dbfab1b1ea33ee80a187bb60d44b4acf98dfa879ecea2be031e2bdf76cf3c3e5af83898533ceb9e092c75fad781f5fdbe04bbed26bc2d77cc3b73ce5cbff6f83673ce705df7db8267ccf0fbce4477ee2677ef9343fe7d9aa0dfde49e5ff9cd5d6fdcd1f70eafeb671bdce54ddee26dfea91617bcc3bbbcc7fbdcd371c07d1e7cb031e4111fe2eae9eb915a38e6133ee5333ee70b6e70d35909b8c521471c739b134e3fd878e31eb1ce4744fa3a21e173ca28a7824a1ad3255dd184aee98617744b533766a4d17fb271c801a91fbaa305dd5719a5075aea1ebd56073dea78a2677d7da697cf3a38560da15a58f088e6eae956d7bdd21b75685dc7860e7befeae7aa46635a7cce076daa963eb78855cb962a22daa69f3a763076698f89f6555f8f0e54cb9c3fe950efba9b0f747795b516b7a9af360634fcf5d2884655663ee978550db1cba7e69c0e35e76dcdda3655f5f965d0310f758df6c9a7587a5a37cda846d3d32bd0cc1cd289fafccac69ebe0e2b2dbfd4a5a7165a74aa7938d4389e346f3f2b1d9a3dbd74c7bd7edaa5bebe9f39db4ecbbb0d3aa74dbad041da3b81c6d3a70b8da6f1373a9a9ab7c1bb96957c04ae7f83aa369a933e05d4321dd4818611748414515c558cafa85ddbe868655d4e5d2433dd176834c9d73ab48a23ed80535d95beeb10d6de9a6b7c6d579baa4baa8cec381ddd6ab5e544ffee547f0be910c9247fb741e79a812dd5d2af7a4b7312d14c8abfd3a1df054b19cba55cc964c5c64077579d15aacf394e95d751e563dffcebb5affd3e956bb9915b99ca6cc5c61107eab73a8db3eaec6a8502997fa5031ac6ba7f217772ffc146bfca92de17aa0eadf2325dc947df74d0a994aae14196f2284ff22c2ff2ba6a43cf49755fa93a7c2a6faae159cfec271daaa0e3342c74accb8674576de85d2ea815cc38a1b94676ab2715f9a02eef6b0696eeba954dd9926df9a93676566abbab91a4f2e6bae2495fab7bc7a37650ad4315ac6ad8d3fd5dd997de071ba7dadd7a62b52a95955b8da6ab770b5f97912ad8540d07d0d097810c6524872bf9186a55a7ae2766aeae7d5a97233a361dd070ac0a4e5441a5e154359cc9b95c7cb0d1aa6aabd9d43cb85c6c48436da80e9783a65e816a684143f51b2c96b6242b396dc9911fbabb7aadce558f06d030550595867445433be3771b5f3de7c83dd7e868258a7567a1ab5918a98276461967f26ee3eb519d812ccb72f7eb699c5dca6b76954d745c67379248a2bfb17ec3c6ef8cff6de377c7f7fffef9ed2f80c853d6</data> + </image> + <image name="image16"> + <data format="XPM.GZ" length="1947">789cc5d45b6fda301407f0773e4544ded0d4921b249af6405ba0a5e5da8b264d7b706c877b82038442b5ef3e1f1f9785d2292f936683949ffcf7c1b1432e2bc6f741d7a85c96d61bb29952834e486a54d876b9dcfff8f9edad54766c437ebcaa6195bf94ca1706357a49cce1da94d7665535e044d345f6157d491f986afac81b4d8a7c025ad52ab5d4dc29123a30d4749144d1870ebc05da558bda6af415091db8d674915da01338be1300ef811ef1028f001f8035bb66d56ce0005877ea5edd015e29869221f00ee83b75e6abd1a662e87bbe1a1d6906c8474d867c0106aecf0217b8410616926a7ac8992295a4c0966680bcd664c86720710346d4dc399258c885a687dc2b524935f7a049905b4d8e64c0d0253c547397c8d046b6356bc886229364c04c9320634d8eec00a91772ea013992da48a15943f61499a49a9b6812e44e93238740e651ced4dc08c96ce458b3865c297249f5785f14b4ff98318fedf38c494828378447d158f65cee98994ccd199d2f96314fa26835862e528cbd67d674335f6cb7592c44b293215909be279957ba3fc87745838bddeebd8eec3ccd65ccabeb837c9d641986c6ba523cc9676e9af32d447892afa316745cb319ce5a87761ceb1f5355ccd335cbd094dcdeed3b1d5da7737fbcf9fcfe440fe674d311aa8a0c74cff60742e35edb4cfb6a9b07ac75dcea93b348f96a37943de18dedfecf699c9e97897793c4cb51eec03e9e29ac6528da8f7f39535d298a92ac918f9c3f3fe970280e2791f3cc534ff07941a6cf45f65c90317b22a3451921962f4519b981a3e24cbb30b3e28d665126ea14d6b9f8f0e7fa3473defe59e6d7d7d26f4dc4ad2c</data> + </image> + <image name="image17"> + <data format="XPM.GZ" length="3709">789ca596db5222491086ef7d0ac2bc333672a09b6ee8d8d80bd119150795f130cc6cec451f4505e58cb0b1efbe59995935c880ab3ba61df291957ffd9555d5e187bd52e7a255dafbb0339ec493bbb49476e351692f9bf6fb8b3ffffae3ef9d5ddf2bd16fe497bcdddf7676db93525a3a7b7acc0d201040997f0c436c388cc328e4c170e73866ce0cd7925a54f3b9de779c30df2867ca9ee1ba6f19f62dd7a5fe5ab85e51be540e94af9813cb30742cfa15e5481816ca99e69f0c47d520f32bcc5f846d1ea696a32af35238aa687ddbb2e607ca81307e624ec38a1f71be2b6cf3008e531e7fa11c299f2b67c230331c571ddf5a8e456f2e1c57348f96258f67ca81729939b50c8563a99f28c73abee558f27de55c39359c542de367cb89d49f0a279e72a41c2a7f67ce2c43cf71c6fcac1cebf8a663cee3a172ae5c379c068e3f5a4e03e603e1d413865c39541e336796f1c4b1f8b9578e35df702cf3ed2be7ca35c35960191e2c6752bf14ce3ce58572a8cce72bcba34a55eedb48d8e58f1dcbfdfda61c6bbeea58f243e55cf9abe13c8c8240eef7a3b0cdc393e53ce4f147c2b9a7dc510e95a53e8f22d1c350d8e59f1d8b7ea21c6b7eee58fcf1792bc22853bd409846487e66b990faa970e129f3fba928e28ad6c7ca41c0fdc4443809e57d86a972acefb35c38f5f4fd73a71cebfba0ab9cebfd2f1ccb7de809679ef2ad72a8fc6059efdbbdb2bd7f13615a51c13c568e9547ca85707bf26bf1ba06c2cb58cdbc4563bd7e55e7a5de668d9f67deacb55d637dcc666faf696cabdfe6f0bf7afa7f7dbc759736696ccebf25ac0655c69860ca4ff63e15d1208514732cf096a2a04fc97b54e47f15f26015ba147744d9b633f6b3ba6a24a4708f0fd823855c57b4fd818d1a29cd6d14cc2a62f2d0c7c7579ecd1a09b9e89117a3f0b47d159bc3f9e8b18b140744431cb918e304a738c3393ed3f7435ce012f7b181071487f8911e703ecc7e985dfd4434a28a391e511c534d034f687c134ff133b6f00ccff102dbf8052ff10aaff166c547977bf1951586a4d0a1793ba4f2cda91ce0778a169655a5821efaa6372bfb627bf18c55aa9e63406be860488ac75863f7758cc84d0b102f008c06c42b1aa9ebc5982a86ac3183445764bc981e1c9a15418a67a4423e40cfb3f3617b31a739ab5437e72e762886c44bac41ce5d89c84701b7d0c56bb87ba1916a2f66704fe38d86e987f150350af000396934a1077d590badc4b7e7c4f9905e74a87b4b78a4da108fe04914284c570f756fca74240630b42e567c985e1c91db06552c48c5542f60a41ec6ac401d85097774fac385d3b0bd68d27cfb3032c1f3d7a80f63faae4e1ab22705cc6825d73f5c380dd38b2a8d69e221d5347817ccd3e03ea8075698f3aefaebef31aa37bd58d05a239ef180ea4eccc327ab69154c37e19676f552cec59a06d0ac3486469e428f2a4c5d139ef9f329f46937cc9938a768d33ad6de734ea341634cc70b3acb2d8e32df8e339efb82fa38008001dd929bd55eac681cc0021674f2a6b0a49928cc5f5852ff2b145730a4d9f7a90b3e64eb0a2b3ede159bdfebbf12bbfffcbef32f7804b985</data> + </image> + <image name="image18"> + <data format="XPM.GZ" length="6238">789c9597596f23cb0d85dfe75718c3b78ba0aed4da5a08f220dbb22deffba2200f644bf22e5b9b653bc87f0fbb7858e399892e90a929599f587dea90c5d6f2e71f6bd7c7076b7ffcf96d36e7f97db156dcf174ed8fc1e2f9f9e39ffffac7bfbf7daf656bfa3f6b54d7b2ef7ffbf63dbcae156b872fe3610972a14095f8af64ea38e7b5c89fcea3515c5f07d7b17edf19f149e4dce3d24b9cc7f5e7ce583f04e7888f9d11cfc005e2e28cf87dc9d58a5f2f357051357f77ce585f352e478c0f9d11af80eb16979bc8b9b2edffe48cf57d708ef899b3c5e919ecfb5f959c55aa85ad976be7ccfc7c3863fda5713962fcded9e23c00c34f68466e6775ac0f89db317e06ce8d69cf19d76f955cab7a3c1c828b5a35ae3f75467ebbc635f8a177b0fb7989dcf6ebc5d6b76b15e33006d78db970865e0fecfdb051725df56be6ef199c1bcb03b830a62367a9475e3aa37e2fc6f50ae23bced8ff0decf9c4f3af73bd5237bf67e0ba31b59d4d8fc5197adb60e4c30c869ff0587223533d8efc00ce8d6901f6fa9f1837dcef16b801bdd82f0dd56fc49b9f2e8c1b15e3700b6e203e77865e17dc865f020fa01fefafa6eed730bf2370db989fc103ec374c6cf9cc8c9b55ec3705bbffd8df4d6e569be66f046e80abceb87e130cbf21f653abd66c37cddf0d78604cc7ceb87e62dc723f15b0fb694596e6a015df1f8318b7aac6f40a763f7d709b8b588fe08c7a8ec1038bd38633fa3dde6fb9fab1faf101b8817cd8b9259109dc36a643f000fdbdee0c7f2fc639f2e5d89fb9fab37cf8128c7a9dcc9dedf3819f8cf3aaedc7f17e6bd773d423ac83dbb65ee2fb4dbbc8abe89789b3e9cb12dcc0fed5c4515f0ab0fb6b26b6f81378807a549c738b6f19b7ddefba33f2794b6cf52370a36df77307dc3696580fbd9de147dec1e80f0989cd4f6eecfa7c08f6f3db76b678d877b6fdc25562eba70f30fc845a628b7f8207f0ff9ed8faedc098ab32887c036e148de83fdeff5cd6cbeaf368cc55d3a33c71d40ba7607dcb89d7c7f727513f389f7563467ebceb0c7f3b6086fe7562f37beb6cfad4020f8d79692c19f68fef4f3260c6f9bf8187a8cfb533d6778c25c37e4d67e8f712dbf55be0a6b1c4f793a2c143e477652c19f6177013fbdd26b6fd1a60c6e7c70378682cf1fe2a06827a848e33eeef2bb0af1f1b1719f4eec14de370e28cf38efd38d0fd509fccb8688217ced06b248efdc3a760f7534f1ce3a1ed5c4496d8df8361817ce4c019e79b25b6fa5c3a43ff018c7cb99ed8fcdc190f32cb2f54c1eef7d6d9e27c92d8fc5e3a0f2c1ecf77d82cbc5f4689ad3e4367d47f6a3cf0fea924b6f5afce388fa3c4569f6730fa83379cb1fe3cb1e5d375463efb892d1ff8d78f1b8bcf135bfcd3789859be62fa43df4f3ec0380fd97446fc2cb1e9ed3863bf5a62cb6f1bece7d577463f72628b5f389b3f82de30837ff81bf2b019394b6cbf77e2e7dd48f383df4f67f859389b7ea883bd9eedc4e667e48cfe98258efb8529d8eb3b7786fe5b625bbf7436ff7c031e22feee8cfcf6125bbc613cca906ffcfe341a0dd11fb2e38c7c5a609c173d3ae37e39486cd79333eacf609c1ff97e7e7eaf892dff8533ea354d1cfdf2b9f108f5e7cdc416cf9d91ff4662cbffda7914e3827c467e3e93c4b6beef6c7a5424b6b8efdf84de0c8cf3e23d67f8e925b6ebd37abb3eec26b6ef9317e011e2ddc4317e320f1438888e42c740c7308cc26db80bf73a1ec26378d2f1ac631c5ec2ebaf236a5298846998857958e87cc358ea780f1f3a3f4327ac878db019ba616ba5c62c6c871d5dd1d3673e67cae5dc0d7b613f1ce8b3f2f9e10a0d09471adf0ec75f54665f544ec2695498a993b3bfd0e8459573a8ccc2053c74c365b88ad1f2f9f5ca5c6e54a31fd7554235a9ec46952cd4421d0ab3d008cd151aade8a31755f298d78f5ab49187a9ec5158a151c0877b398f0aa58f3d22e2a4300bef247fa1117d501177cfe31999c22029947349c3df5562cf8f4a1f7a7d3f65b41fcfe8846ef555f750ce2509ddd1fd0a8d1e14ec6455851e743e7ef130830fd5a0a7df7219ba0f2af4b1cca8a77d95c7f3d88c5d61b317dea28f677aa2f12f3e5e568e579ad0946634a705bdd192decb7ad0477cfcfc49a313c70badebdcf8f27743353655a34b5bb44d3bd4a35dda2b33518d7dfa749598cb880ee8908e92968f757571ac2eba74028d53d5f8a03375715e6a984af4714197e198aee89a6ea80fa5d24b4535aaaab19532395517c8248e4ef2714719d5a84e0d6a528b72ed8a3eb5a9c3415d549968aedfa4857a5cd01e0fd4c590c63f14a071afdf8e4754e35bbee37b7ee0477ee2671ef30b3c7d1de5b958269d9f6a7ac1af3ce1294fc39c673ce7055df39bea2c29e777fee04feee86347ffaec7feb8d38a767ee98f07de500d1b9baad5e5056ff136efa8a72d1dcb387b3a77a38ff15785a4f11afa3cd14eedf39efe5df23e1ff0211ff1b1baba55bae3139dfb7c1aebf9938269f099e6725eba2895745cf0255f6965ae79379419bea9b79b38fbbf2bc0c72357522e7ba1cb55ceb856feeee226b7a2bb4d9db9cef6ef0ad078528dd287ced095c01521619ed3838814fa9b666299ea3c90e12a0d19b982ee5c7a9a0a512decf0426ee5ceb3d47bf251eeffb7863c943e44ef737992e7783693f29386bbe15cc6eae405759ac8ab4c5669c854f45d58e65161024f0b59e829d7e54d96653ea5b2fa5895cb982b54c8bb7cc8a3d745e76698ca6754e9c83ab7cad75463958f0dd994ae6cea75e73f54e2b3bed6a4af55d992ed524576a4b7426357f6645f6b728c8921073a0ee5488ee5444ee54cce75af8b15b91ceaa7d7967e729c852605b9d47125d772237da9e86355472635fd95a7bf3356f9f8fdd5ff6f7cffcfdfbffd1765b20a0d</data> + </image> + <image name="image19"> + <data format="XPM.GZ" length="3277">789c8d955b53e25810c7dffd149479b3b67a7227a9ad7d60c60b33a38c78c5d9da87e424082828c845666abffbfebb4fb302826a3cc61fe7f4bfaf099ff62aadd393cadea79da77136ee9a8ae964a3ca5e31e9f7e77ffff3d7ef9dddc0afe0378e2bfeee1f3bbbcd71c5541a0f8392811c80e3ca8f705539b4ecd8fd842fd9cf948df21766cf758d67ed7f5af642e533e1046ccf17ca8972c9ecbb7c09fbcaa172229cfac64f8573e6c0f34de009ef5b0e5ce5483954fe269c82adfd0173e8856168f76f85337026dc514e9407ca46998be7447e682229263d588e5ce527e54879229c81adfd77e542f99e39f6a322b6e71f2dc79ef29d7016a7b13dff8bb91a54bd6a205c538e94a7c2393817ee2917cacfcc49502d127bbe6e19edb0fc43384fa2c49e9f2ba7cae7cc69987a6928dc508e94dbc2066c842f9553e543e542f982390bd322b3f6c67216297f1636607b7ea45c2a1f31e76156e6f6fccc721e2bbbc205b8100e944be5636613e5a589845b968daf7caa1c2b7f152ec0d67ea89c297bcaa5f20d731199b2b0f65dcb85af7ca21c2bf7854bb07d3eaf954be52be612bb652ccf2759e64bf66361ec96f67c5339534e99db71db6fdbf3a1b0fcd897c3472e72c8d9bcf3be066c33f99b93611d2ad6b5ded3804d496dfcbda50e75a94777744ffd5595ed1a3676280c603da0077a84fd23ee431aade6b54d03a79ee0bba431ee13ac47f8679529cdb0f74cf31795373438fa89c4c0f73b5cbfa8866c783d239acf0b954d1af48532da87ef311dc0f2908eb0a650a8c3ba8e08ea50f88afbb76d1a88a003fb07c4f19d8ee904cbc0e7881a5098d30f2c43a7d82fb6e7028d89d4624e4de43e85e23e9d6175d09f7359175875c4b53117e97f0effb7f0d584cf09aaeae8c5f3d1a04be465e3ea2223675d03e77a52ff0962b842ddc6a88b7651542e607f210a06f5b84696e5068d1a62e00e720c03565889f152ac39863eb5a43eafe2c0b93399c363d46182ff9db53ab1c211146e709fbeccd98b063efb2933f08c5ed4b80e6b0a2eac5da81fa30eb54d738a333c033d2c839307ebcf15f667aad0220f916cd668c8fcf570ea92fc5751b042200aa788a34fe1a659a708dde02b40efd715d83a402f5ae8e8357a1663f51653b6a451a0170d4c8fbba8f7ff0a2df13fc4d545ad5ced4d8daa6bb9eccb0c72ff67b8274b5361fddf88420cebfbc5d4ade6824fced1353b83475069b00aae53cd7f883af611438a33c5729e2b1a1e2c17fd77e17591bfa719f4a50e295675b386cee84c6258aeffc2ff9543b0e72bc41c6f799f426324d6ee4afe0bffb1c4c70a57fc66de92cb107e3df5df7af1af197431c139bacf4a77f6497b1d87e3c0628e9af611c195fa6f4af431bc07c4cf125799e768eb77037f6fc0ff35ac03f19f2296b9c41f22c3a56e6faba93e55297c1fa26ab1f8bf80cfb168ccb67dc7ad6a884a13b540ddc56e8867b890ff67d0fda086a8cc256bd630788738f219bf533facc116aa756967755b0dded2588aa77cdbf23d8df77daf68fcfbe7ce7f0d107249</data> + </image> + <image name="image20"> + <data format="XPM.GZ" length="1617">789c8592cd8eda301080ef3c45c4dc50b50b496883aa3e42ab1e2b553d0cc624c6eb21216177a1eabbd7bf210d31b538f863be8cc7e3795e243fbe7f4d16cfb3b6c34eb08455784a16bbb352979fbfbefc9ecdb334d1bfb44856f30fb3f953c2926f47e2660f7a0f4bbb0cbe194c37e97255187c3798add23cb5d1d663e1f0ec9139bc58dc84e8c1a38f563d6e0c760eb3a5433498afb2dce13660660b161e0b1755015d942c62c09347e67067709de6cbcc7efbe2d167963dda28b38801b9c7c2611330b7df5e0d7e4c73e6f0e870bd76b8b78801eb1ed160e971e3f0d5e0a72ce0d3c402bdc27eda01c02d223c7000d88eefcb6d055107c441b217869c471d50c4f89e315e46cf02c1253bd692498a3b8dce52d71c9be8bda0924ae7d1d5a8b8c38951cd45d39f34e134a890e3e1d6c1a97a4ed4944363e4d8d0f015ee1d201a45ef1c68094792cb387438e3750543a33bc0c84125fb3732c6b9d23784713dafe54de904e99723b8bbd74dd1fdc616793b7686d59a7eeb4c3cee80e448fae5f8a8e67f9c664b9c6a7ae0c09bd079de09c7fd193ad4888b22757de8208956f866c51c526d7b8dcf3cb8c314c4e7b9223f21fd5f13f36c7b3b5c13f32cc76374e79064583d76eca8fee7aca935fff379f617c93e5058</data> + </image> + <image name="image21"> + <data format="XPM.GZ" length="3613">789ccd955b53db4a0cc7dff91419f68d39a3c6d7d873e63c242df40a855ea19d3eacbd6bec5cc1242da1d3ef5ead249b1c92703aa50f874d20bf68f597b4d29a477b9dd3e3c3cedea39dabb99e5779272f75ddd9338bc964f9f9cb3fdf777603bf83afa4d7f177ffdad93d9977f2ced16c6a1d8042505dfa21fee4d84bb2d84b1c2bb7590569900429d9878e432fec861ed9cf897598849aec81e3c80ff38882a94be6a82bbc108e8481584769c4fe5ec386f37bd7b08d697f2e6c64ff3173ee33ab91e3d88fbd98f4612a1c097799f35898f28f35da59af104e853f0a1be1d0712f884d2fa0788ab9e731c3857024fc9e38eb7996eb39138e7a19f997c2a9f085b0618623c749907809c79b1067499ab03d66365af8c4711a26260d69bf664e3d61439ca7519a134f8553e1cab10e53a3693fe4ccda635633e148ecaf99ad2f7c459ca39df46026ac9915d9b350db8cf747cc992f7c201c0b9f121b64437c23ac85b5b015a6faf228b379443c67ce7d6635148ec59e121b64f25785b016b6c256b8766ca2dc1af61736bef0ab86a5df563816fb3362dbe6f786b9cd6fcc8cfbd9df6fb8288897c25aec89b015a6f9b7e8cdf70516ccd617be168e850f5b66ff0f0d176cef3117cdfee7c4b63dbf4be6d6bf2fac85c7c256f82973d1eca7797624f15eb6ccf596cc85cf7695b5ccf6817093ef13e2a2bd8f8f999348eec75be6669ee11b73dbbf17c24dbfbe32b7f5ed33174d3f2a612d9c0917cc27f387ad3fa901aa59bfabf17bbeab1a0f53f8731adb6af9d5335a3dd3357f0d19adfc7e9ddbdeae46c44f062c14700e2554a463b6ebfc7b3e24f7218c608cde254c608a4a19b2fb3bdbacb33e63b8ef826257924146f94ce0126aacee6a5de5ae062acc61815e53f1770a157c856f98d5355a96aeaaffa8e506fa12ff1cbd07f8eee3e7c7f004bfddc70afbeb2a6b1a0718ab2fb5b81c4afcfd149ec1737881dfbc8457707857654de308ab6695b128bc8663388137f016f37807efe1c3dd5cd6343ec22976d5a99c61fd19697c822ee69281073e9df4182df5adca9a4600214418a7c6ee34b311438f72f0e594f7b14709a48dca7a5f947bdd288dbb16d8515451197a7bad82d398a075899ddea2014395c38532cae2ae84545673e05562264b55b0caa61953e73055a5aad4904e66d2cedaedaaf0bc4658efcd660d5219c1195633c3484b3cbf1233b9ab52c2428dd51077a9cdcf53aca850133545158bf1ae316ab932fb6e0df03b0bb59a6dd3a05cf04cf0d69fd2ecbb5e8f319b6aa59a31aa5b9ca7ad1a7cf75065869dd658f9124fd16533907c2aba3fb5babc4f839f04a8720073acbbc61ef5f17c07b72aea0aa3ccefd76874705a0aca6441cf9492b2a9955623ece096be6cd44949c14d97c5139aa142a9169b67ec5e9d84fa31c2b989d464db9dfb059d0dcffaffdbffec0769fcf87be7270982f4fa</data> + </image> + <image name="image22"> + <data format="XPM.GZ" length="6366">789ced984973e3c81185effd2b189db70e470e011220100e1fb4ef1bb56bc2872c00242591d4be4ef8bf3b51f90ad39aa6a65bed091f1c664549fc9085572fb30a2552bf7c699dec6eb5befcf2e9ee5eeecf8b563192dbd697f2613279f9f59ffff8edd3e74ed6eaf45a71d46ec59ffff6e9f3de7dab686d5f4dab1af85881dafe55b3bb0277c1d79e33e5ccf3149c19f36ecd51bb5d44367e645cb79a6913dc35968ee7ac6efefe5570612cfd9ae376043d69376cf11563bd62f7371cdbf865cf79dc35a68d8673cf97e0cc985fc105e2173577a2b8e8449ed9b8d336e613cf7927ebd8fdb7e0027c537337eab6bb7ebcec83bb16775eaf2b81250a8cf17be0cc98a7e0a22bde8f1f9fc4dd0c7eaec045e21757ae8d93b68de70a9c589c1e3dab3efc16c61ab7f104ce8d25ae398d93d2d84d8cd308eceb954a1aa5367f064ec067e01c9cd7dceb047655c336df12b8048f8c7b1178c1b3eb25bd8ecf67059cf79ce76570692c0735679dc0fc68ec62d3e307700afd3bcf2ecb33afcf6bc622183f6fec629bdff97ae55d1d6ff30dc1a5319d19e749def58cb8201fba01231f4ec182fcbcffbcc8511fea05b6b8b8c079e1e387e012f11d6389a037d7b0f97b0527a84f02ae503f3f9f6e97b03e5bc6cdfcabc612d9fc3c0c2c96ef2e58ac9e14c6439fcac08817c62e463dfdf9219a8fc5c5f48aa0ef4a70622c3760c1fc8be00aeb7162aceb67f9ee832b5b1f3e6bd8e723be3eaef66f7e16c19558bc3276b131b5c121df4960d4e7c8588f1be303708a7cc4739987fd3b367629d63706073f93c0c8bf0cec8c8b864b7fff33b8427dd68d8b14f591c0960f6f81c5d8f9f3b348c2fe914330f68f1c83b19e726faceb69bc06c67c720e0ef93c07863fe815a8af0c02239f2770f03b0a5c249e3b60d483e1679082c760d487e16730005f04363d67f132e4eb8681915f178cf517362e309fdc0686bf49c396cf29b8029bdfb24c91ef088cfdc7997115f2cfc1582f5e0757c877ce7810839fc0d0e76b70d82ffef9289332acc73c18f3d3b57115f6ff7960dc5f8143bd7be0b01ea70ddbfc7be0e0b7dfb0c5178c0731eaf70c46fd9cdf1f65a5cf9bd5fbd1b88cf17c5c80f1bcc965c3e63f03877c93862dde0787fcf7029b5fba0b0c7f65e0d27fde22f35f35f5da098c7a5d81512f7a69d8e2c82fd48fa60d5b7dbae030ff867153afcd866d3ce60ff5e3c5c0a58dc7fc033176fe3ca9523dbfac7e2918e79324609c777204c67923a7c6cd7a6c376ce31fc0617de603e3f9990387f3edaa61ab0ffc34ebd30d8cfde40257a98f778c43fd45025bbd08fe2a3caf740b16f051c3363ffc87fa13356cf56d1b37f58f03a3de87e050ffa586edf3fa1d58c097e0017810d8f273966f15d6c78d03a3be27c64d7d37c078dee4c538d443a6e0705ee5e090ff5260f34f6be0709e8d0323bed5b0f98f8c433dc8356cf16d70a8c73218f5107fde0d74bdec7e7902c38f1018f3b35fef817fd5bc77ffd7b5ff861e13d35fa7a76ac28e8b9fd37c47af6ee5cff8fca31e573cf06a431e799fd5c734bfd1233ee70bedbf6b7ec8e75b3dbdf352b5c6e8a639f13ea77cf5537ad7aaf475ffdae70ddf7e444fd7f48eeff9811ff9497f5b7fe617ac8f789faffcfa01bd399ed7fea48af3bca04a8b3ac3122f6bff5db3e4155efdbe1e5fe95d73bca67d9d377893b7b46debb5257dbfa3ea0b6f7ceef2ee77f46e784fd5fabccf077ce895b6f5dd916a6fe8d5be46fb3ad3d73e8ff9f83d3d3ed1bb4ff98cdb1c71cc1df5167357db29279c728f33edb9f6be8e7853cfd97abac58884843be438a2fa555049150db45734d43ea273229d2daa470445ba98a5479734d671424e7526aa34a52b6dd774a34ad7da4abaa53bbad7f8d88f79d01153557b9c9d2fafeaa8277ad6bb6ee945db2bcdd13c2da8d2022deaf5312dd132add02aadf931f56c0bb44e1bb3f46893b6685bdb0eedaace1ef5b5edd3011deab523d53ad67e42a73ca433556d6b744f67eb53347b7d799762ea50575b42a9eaf42853dea69c8e85e949cb2ae2f4fb5ea9dfd006329491c6138a79e5bdfda2ab11c9b95cc8a5f6ba8d65a2196a93a9bebfa21355aa6424d77223b77247ab72f16deddeee3fd57c947b79904779529d27f5f62c2ff22a73322f0bb2284bb22c2bfa7355fba3accd7e46de9e0774a13eefd5d3ba2a6da8d2a66cc9b6ecc8aedcc99ef4b5efcb811ccad1acda7dabe73537d4e7b19ca8ceb61cc9a9f633551b4a5bd522cd37d62bc7d2f9513dffb4aca8cfae7e1f4f24959e64aa9349eed8911cd4ff46995dbbf7f5bce6aafa3c74ce15fa3bd26faffafdd59512bb811bbad1c7f5ea261d8adcb97a4cd5af3677e12eebf7efdff1fdbfe7badb6b9fe33a4b3751edc3d927d58fead5cd8dd4e7b0f6f967b5fb713daf39f53e87ee4fff2e7decf38bbbfef604fd4ff4bedffeaff73faef7afbf7ffa37f568f0ff</data> + </image> + <image name="image23"> + <data format="XPM.GZ" length="3549">789c95955d53db381486eff9151974c7eca8fe4cecd9d90b680b4d29064ada023b7b614b3604484220a1a59dfdef7b74ce6bc78424bb5b35110fb21ebd3a52c29b9dcef9c95167e7cdd6e32c9f0d4dc75ce70f9d1d3b1f8d9efffceb8f5f5bdb61d0a1ff49d809b67fdbda3e9d754c279b8c4b075a11288fff3956537004ae1cfb9e6bcc253812d681e3d00fbdd067f6c091b0ba11ce73f1699f39a5f194390427e02ed8807b8e233f3491f823e1c81356b970e20792cf8263611d33e75114e5cc0938015f808db01a0937f3bf3a8e83c8c45c3c7d2e1c7bc2ca081779c079d515b814d6a7cc799cc6b2de17b0155677c24589fa9d38ee06b1edca7a67c2dd18fc8d392716df009c823f832df8d2712fecf9bd90f988b9e8c5bd82f93dd882df394ec2244ef879a5844d80bc63619b633f7cbe4991a409cf57f7c2b6c4f3939a91ffbbe3344a6c1a318f84531ffc81d9d4f751df0ba7716a9853702aac34d862fca7e39cae8797303f830deeeb4cb8b9bf07c2a9cd65fd7de1dc07ff00c7e047661378b81f137082f31e830df8ae669c6f25dc7c5e8e85c92ff93f8273f0145c82f97e155133ff165c7f9e1e84f3b290bc4fc245007e0bee823f315b62cbf51c3a367189f55451339e9f335b531a79fe56b8aafdbb8e6d6c4a1b3397c236005f83bb60febcda9258be8f0ec139380797e03dc7253d5d769987c26520acd85f75aba092f13eb80bce982be28ab900e76003ae844f67ab9a565aad1e596eeb1c64c875f1df3c1b1c8536fcfa57cf6a07a77006ab4bee377ad63a0cb74a5fe96b32994d795639e8e921efe286e7deeabbcd79d63824c508bdd1633d214bb9ba3eaf1da885b47bf64cf503bd3fea1959e6e459cab3d2e1663d359eefbca7a9fe41efcffa2759765f7a961d34b247e30f54c9b7d46acf3bfd9edef7f5018d7da0b6cb79fae279e980e123199ef4a1fed4b2187d444dee8cf3143a13cb4b07eee6319f8121c794fb137d0a4ba13feb33760c1686b60319f6a9b993b494c555f20bcffeda588cfe46868273ec2def8538e331e739a60a5e63deb9bee0d99718ad775170f5e75ad50ee243faada77decf998e75f34092ef9f7322eed90e6ccdb39f83316f098af43ee8d8ed816f3cf83d678803371a7dc38b89a5993c33dd7e5993d6a6290f3a8c7337a5e912171f7b671f4695cfc5eb39ed7e41ef0fc7a5c6ae1ee48e3e054c58b1c2ffb41e3729c35b570b5c65ed8d96ff6297d86deb5b316f71b83a11469cb91b265b1ce224741f7417656739fcf7497cedc2cee183b52de5ff6aa2efde64e3a76e32e45abb5ce853c4af36965ad3c190c354b352987522ae7b50f1677acf6b4f2f8f4caa81619d6f7b9e714aa5046597e7ede76b43c079ca78f5ad475724637bf541539ae3807b795df41afebe3fa4c5df32e866a48ef46d13713b96e5639161ed4c7ad2f396865754bb3afe875877eb4cef12a4f9f32f0b7961aab09bd0cb7b1ba773b5aef58ae0fef44a9a99a724d37d663431e398764712eebffbe6ca88fe24c8a0c1397e3ff381acf5283e3efdfb7fe0120af7f9a</data> + </image> + <image name="image24"> + <data format="XPM.GZ" length="4574">789cddd6db52db481006e07b9ec295be4b6d752c5996a5dada0b20844338271cb7f662743006e313d880d9da77df56f73f0a4e2061b357bb210af531d3fff48c2c91776f1ba7fb3b8db7ef966ea76e7a9937f29ebb69bc2d6683c1fcf73f7efb73e94d2b6cc8df20ea34c237bf2cbd399836f2c6ee68585660125053ffa81d1cc1993a112795a9696e2566a7f38366d8c4f80446bdebd6b6f98577a0e3b402fbbc529d84898dbb0b38872fcd2d5f3f36473e3f839147981fb731deab1c36ebfa3bd8e75fd5b6f9d7e6a889f923d8afd7f746fdb0b6ad7f626e17989f9be3147958af13c0c7e604e36ea04ea304fd8c61dfdfc43bb4fa4d731cd87a7c08a770ec8df56ee002b6fe52df0f5fc2383fdef2c6f808f679fbe6b48dfe74bc15d4fdad9afd7adc31d7f507b0ef67684eb11e65b5ed7c77cdce615c3f5f2de907eb0570012f9b7d3daf9b5d80bc39ec60fdfc45553fe635735284a9d67f30d7f55bb03f9f356f5b9f5318f97ce46d7934306731f6a3cf43e43a7ebdb63909b09f433845fda9772b50bf37a701c63f7a63fc16c6f930e63b7f3e1b30fae36db8441e9ba55fdbff9e37f28e61bfdf7d6ff4dfae6df97abfdb61a788acbfaed9f7cf2db39ca77907461e1fd4b6f15d7316b6cc098c7e39f4c67e22d8d7efc1d82f3faa9def8f7be624889c3a82db663a37e7a19d379fc00ed6e72d0eebfac09c95e8b769f6f389e012f5e7b5adff07b5cbcab6e59d998b18e3d5cb9f3a2d57b6f59701a5e6bafec85c84387f07c7d8ef29ec607d7f76b20c79fcd93b36df9bf3d0faa147b3e499636fd4cf2a27ad7afe06ec2ccfb1b9aed7f74722eb755aea1d731ec209ec629bbf0e63be237381f3227d9ee5751a7732f5b577a2e6a9b98891a7fb4df3bc4c348ff5f97251ee30ff135ca691ce6f990b67667d5fbb3c0fe1391cc383dab9d6cfcc05e6d3198c7cd6f75526fd61febdb90c9d8debfb57b6eb7d0bc7f0436dad677dfe243eccdb6a7dbf166d6f0ae118e393da858eebf35194655cd8fc3e5c16f6ff0f3ddf32aeddf72e63f58ab91b625c7f5f95653d5e9abba199b6614950ebf977636f1ec3ae6bf5fafbb7db1577d5cb70d77c30fd775fffa50c2676fefa990ccea432e7824beef205f7d4d9eb3374ed4bbee2be245ccbd5d7a4010fab9e7e9ca1eb8d78cc13bee15b9ef28ceff85ebe3f884b9ef3e39714cbf87a9fbafe32aff0aa54ddf37b5ee30f72adcbb5215e95944dd9172d642cec517ad8d2848fb2f6b654eff02eeff1be5cbb7c203f9969cadcd7f83ef8d0f752f7f0893fcbba477ccc277cca67729d7393030eb9855e22aba9fb68735ce54a0f1d24249c121391a38c72deb28b0a2aa92b3933d96569bbf17dd005f5e852be5ff198fa744d034ef944ea8734a2f197cf074d2ad30dddd2946674f7551f13b97743eed33d3dc8fa737aa465993dfae6ac8856e4e7abf45e7ab9a9c6ea3ed6a4fa03add3867c0d346168eb3ff7b9d1944dda924f1d7de9833ed236ede8fabbb42709fb92907d5bbf907220f7ed691f87f4893e4b75957044c7550fdf7902aa7359a113e9e4691fa7d2c799d4cfe95cee45f3e51efcb948c6883617fa0828a4164592d2962baeeed17733aadd4caa137f725f62ea50223da44e02e9dcb17d5e5ece708e56163f1ff21fb59c2e9f5e72b70f5fea45120a57baee4206d97be1b9eb858c0b572e3e73ffec4b127aeed2f57e3e434ef38eeedcd5d7ef8f7fd443df5dbbfe6bde632f260cdcd00d169f80d767c8f9921bb971f57d71e475195a3fa9fe7dee19fc7186553e5ffd7367fabfcff8ebd7a5bf01ac66b48c</data> + </image> + <image name="image25"> + <data format="XPM.GZ" length="1812">789cad924d6fe2301086effc8a88b9a1554b480254ab3dd0967e51567b5c69b507c74e4a20e1237c53ed7f5fcf0c4e61a97d5a0b053ff293d79e71ae1bdecf1f43af715d5baec42a939e1c89d26ba87551ec7ffdfef65eab072d4fff42dff3eb5f6af52b4f7adf67d304e7a0e7d0a481f88a18f84133207378c490718018fa6133247c2114a10c05e21362d40a65d442bc2714d14d44abcf889da0ad3a01e22363c7673c207683aedf25dc238a50f82244ec21ca284ef8907d46d99611e29250c976eb06716190cf7c67502ac4f11185df455c196479522145ed105524139625a36a35091f0813251475f2f68809a3404cf5e0332715d2bb23839c1c1be4123283dce76985d4c9ad41eeb3aa905653839d18f1cd20373637c88d5d5728110b8331adce0c729fe70615e1a642aab73498a6f48d59061cff1d0e08f83f4eec7440afe25d034d3f7540240090bea5fa9908b0e48cb2f1242ff2c9381b5972b4344df3d97c96a753b09f1916c5bc9c174b70d405abf5a6dcac570e07b67aaf8dde6b6bdd0b926cb7c8d7f9629725d6da85ae7aabb6fa293eaf1d4a80fd017a71cfda43286feff6877b70dc9756faa838eed4a438eebd4ab9b27e631f2927e3dc818743ff423977b4f2f874a19c395a797e19bcfeab9c3a9432185e28278e2de5c4b1a67c38f694ca71a418c79572749c29ecb853d871a7b0e34ed1ce9fafb5bf980e8315</data> + </image> + <image name="image26"> + <data format="XPM.GZ" length="5630">789cad96594f633b12c7dffb53a0aeb7d6a86ece9a73349a07f69d242c09309a873a4b420849c8c27a35df7dcaaeb29b25ba4d5f0d6e68fd62fbef7f2d36fcf163edb27dbcf6e38f6f8b252d87e55a7943f3b51fd5c378fcf2effffcebcf6fdfa3788dff0579ba167effc7b7ef9de55ab976329dd4061018a061bf2c93722c0c4be1308e02cb57ca59945b0e859346b3304c5dcb99db8f7dcf999d3f55ce84e141d8ebed08478d58ce3bf44c960f94e3c4060337ca9930baf5a5f29167bb1f757fdc1026dd1f67a9f08b30c71359fd48380df2d8f29d709e9789e557cf956552ae8429331c341aa5c48b5d617ffe83b23b7f53d8e5138e85d3242f2dc7cab9f289703320e1b6701614e2178429103f5858ceccb0e70d85933c93785bc2cd5cf73f096789f2b36789f745380f84d1e6336c045a5f5c3a0e6c3f14a05c0ad3ad701a64d23f23e54418d685b380e4fc33e544e22d6cbec39c15a55faf859344f20989b0d3a347e54aea4977c24dcd2fa170a6f1d344b9d2fc9e3bd67c6c08e79a6fb2fd16055143ee0b6e082795f65347b81968fd326557dfd4b1c6db54ce8569acecfc9c0afbfce49e65be1026aaa45fb72d9b78ed7abc16a65ae669cf701c44a5debfb170eef4361d4bbcd81076fba1142ec2cabe2f706199f24afa834098fbd1ae2facbf248cca50ea371126ed27982a27b29e6cfed230d3fc90cd574aa9d61b9f9473e58572a51c0897ea8f2c3723370f73e16620f5a24439513e14ceb5ffa01226d2f86cbd9a05af97fe1d2ae7cabbca95f2967091ea7b315526655bcf2c72eb29742cf7153785f93a8bbf63e544e7757d49122f9e39ae53cba7cab530d9f72e2bdc7eb8f52c7e17cab93066ca95cecf8439bfb65e68ef5b1e677adff0593877ef292a6b3fd240d8e51323e1a2d6f7b52fecf4e15e3955ae3d4bbcbbc255aaf1ee7896799bffbcccddfdef29e7eab7e9d9ce63ae5ce97ad12f8b507f1f3484cb50dfdb3d61771ed9fc53ecf6e3a563e967bc1726bdcff8a0ecde83aeb0af67ac5c6b3f978e255e180857daef85cd37954e0fe79ec54f4f998469a65cebbc7d3f8ad8f348b808f53d182ba7caa970e9de179b9fa272f3547b967ebf5226dddff12cf96c29d7bafe55b8d4f78d48b80ab5dee7caae1f1265d27ad8df9765e2f4f0cab1d4134f844bad2f0e9453adf79e67f1b325ecf20d3d653d0f02e55afb6f5fb8a6bef87df1dcb77ad67f59b9f3e148d99d77a94c3affe859e65bcaeefec8793e1f64ff1eaa123f3f72acf7b72d5ce97da35859ef1b3d296b3c64ef5755fbf97dcf32bfadacf5c263cf327fadacfd0c97c2b5d6930acfb2ded6a74efdfe0d65771f2e1c6b3fcc849d1e4e94f57da07bcf529f75e17e28f5217b5f3858f79e4c3dcb79cfcaee7d1d7a16bd5b6597afcab1d65ffcd6ee3c7cf52cfd60fdf453b71fef1cabbfa5b0df5f29a73a6fdfcf7edff3c2b3d5c75259fb0f6be5be7067f97b03e1f367ab74109056adf5b35fd2c1024bacb0e6f5fdcf3bf8d3c117756e70c8e3d6abbdf16655465fd401ab23e3eead37ab32363a58ffa6ce102738556fe2e5deea80f8fce9ec173a13559aa9977b9cb38ef134c7c5671d394175965661aa0a3f558c9707fd7ec427feec9907fcd4e14f5ef015d7d5ef867a99aef022df8fd6cb266ee136d23b9d1ddcc53ddcb76a07788847decb31cf9eacf062545ad8c68e28f9b84ef18cd5f6789cb3da0576596bc3fa1b630f2f3f7859b0ca15abb4f927bcd3b9c60606ac1562843126985a6f47d8e41d19ffcc59c37b01b45eda9ffdf0174181d750420535f4318201ab5dc00d0ce196f399bfcb8b7869c38875e06ddd59e98e958cda18263065b57b98b1d221cc450916b0840758b0e6181e75981ea00f3a4ff00c2ff00aebb0c16393b5a6b005dbec680776596b097bb00f0770c81e5a9cfb011cc1e30a3fc770022d6843074ee1ccaa9dc30574a10797ac7505d7d0c00402aec121eb18ad16eb7cf063954288208604526842063937feb9f1c6e176f96f9702fad0e7bf5a2aaee5c80caae188eaf77e6ccd66d4a701ddd0906e690419ddd1d878a3897ae3bcd114eee99eebd8a319cd6c677df24373d659d092c7801eacdaa3f1c66a6fbd4de98975e6dc933d8e6ef4d18f7534312a7cbf6fe919a7acf6a26aefbcd12bf7bcf493e9515aa133639521adcb5d677f1b3c06b4f9d11b6db152132f39b2de2a3fbcf35914f876ceacca36ed988efbe06d976bb6c55dfdc0e3934e67497b46e1a70a1ed33e6becd0018c4cdf796f875c33f36a6cf1cd5ba57344c75c8336efdfa613de2f5e5ad4322a3c73426d126fdc7fa6b7d9d3a7fcd8d8fa48744a67bcabad2a07ecc6a80ce8dca860872ef88ecc8d8ebd252bfc785f5d56eb520fafe8d228bcf17245d7bc7b243796dd6faef6f3d91b9fd8712ae2851ab403b714705d421edd5fe9bcf5663cd015e72de2ff63fed93391b14a42a75fd37997b794fbc568f568dff881213529fb1d9d7779cb39fb7981460917c55fe4f92bdef84532359b17bfccf357bc1585d0dfd7793ffe6f3afffde7b7ff01db83b1d6</data> + </image> + <image name="image27"> + <data format="XPM.GZ" length="827">789c6dd1cd6a84301007f0bb4f119c9b14775d2d084b1f614b8f85d243cc8731eb76a1dd1e4ae9bb77c6980f57070ff9f3cb243aee0af6fa7262c52efbbaf1db209830fc9315f2fb72f9797b7ffacdf2c381e15335acca1fb2bc64823d5f3f14ad01d7b09f8ae299625dd5fb7ada2929b6b557eb625bb5354543910bceb9a038cc51b9d853ec1aaeba86624751487f9476517021290a8af2d1eb48516b1fb98bfe5ee522d5f439eb0228b70578079b82203685407a01ac25ccf780c2820504d1ba870524626001f73d11ee7a128862b027852066301674027e3a48f60cba8f1065c096c15a144915a40484de38c07984194c2f4737d1763a30998e761d7e7e5e7c47b83dcc0de68e149ca8758713395abb82494659c6ff16e5ef98fd03965bb80f</data> + </image> + <image name="image28"> + <data format="XPM.GZ" length="2269">789cadd4d76edb301406e07b3f8510de05c51f4bd644d18becd1ec9d14bda048da597696338bbe7b299e23c676560dc44a8c7ce6e11994e2a9c9e070732d989c6adcf665ff5405ea44de0493faaedb7dfaf5fbc79fc6441405f6276b05d1c4b7c6c4563f50c1fa65cf544069219aeee56c9c73cbdcf98c1db32fc8ad3871c920d92a91cefbe4bc90aab2d0e4222c63b7becb4e4aed3ccfd62a71f1ae7ed8f4f9cfd9395b78533d458e9b29ad37c96992972e1fd845e1ea8b92adc9d823d7fd629d6cfba5fe36d875bf07ec82fac5269bfbc71c591ae5e2459b5c469ad633b28a349d7fd7398f9b348f9064df2fcd97676141fd1d9365c8f572b6e1fc05d9e74fd9a9499db72b47febc84206709e5171db24ca87f44649572be7be722567cde6b645f3f21fbf8c5caad304952ba5f1d72a6791e4dce4349f763a5721c9686f7b7c8ba9e67d559faf962b236867c443611fbb072f212bfc0aefbfb59398dfc7a9f5d9fd7acb3f4fdb8fb99b74ac9f32eb3ebf967c84af2fec7caf6b8eafd616d5eef392bdfcf095bb22f2b4be5f7df92b5e4f9a62b97b19f7fcb597b3f91fd79dc54568989da54ffc1f965fdb9b24e8ce4f51d67e37dc736ec6befb6f35265937a9f92db11fbaa72dbbde8cbe8ffafaf8a8718335ea21c2b5e41c38c95bf8dceeb1a1fe43fc1a9ad71f65e3cce71e17fbb367f0f97b81aad3114dfc3b58da0eb06b7e8e3cefe3534c740fc3d1ef088273c631a3398c51ce6b1e0760cd418885fc41296b1829f58b5b16b58c706366d8d2d37877915bf8d1d9b77177bd8b791f3367e170738c4118ed1ac2b0cc45fd8f810115a88912045861c45152df0663fe7420889a690a2144a689b3b1bce3d1c2f0c4a7bd17b0925daa3b93fbebfa2339afbb3e76734f727cfcfabdc9fe41fef79966f7dfa75ff8fefc6fffddef807271766bc</data> + </image> + <image name="image29"> + <data format="XPM.GZ" length="751">789c6dd0dd0a823014c0f17b9f62e89d84a62218d123145d06d1859ee3ac0b0bca2e227af776f6a1db7488eccf0fc6d9d2989d8e7b16a7c16ba8871b30b8d64f16e3bbef3fe7cbee1b8479cec4b76159b80ac284013b3cee2ded1bb18fd67251d626ab82b2a3ac0aa3a0b2ca38a7e494501a8d5442ae142939871c4aca56252d3983b7a2ba11ff05890088e62240d24c2410f9a241902723f862817b9a0dce040ed8826d6b8125c8b926099320bd952405a3a07a46411a8c68106440cb08bc33a06409a420e21c8ce00cf4698a1c301310b9304e8de8c174531f92f0b70dfee366b514</data> + </image> + <image name="image30"> + <data format="XPM.GZ" length="2910">789c8dd6594fe3481000e0777e4544bda1554d7cdb1aed03e10a10eec030b3da8776b79d03128e041258ed7f9f72557504885d91c6e08faebeab87f9b6d1ba3e3d6a6d7c5b9bcdcd7c645b76681e5b1bee693279f9ebef3fff595b0fc3167d0541d40ad7ff585b3f9bb76cebf86e5a35c02e01dafc690cf7eab89d73fd8577c0f53855db40ea17e2a02d862776be6a1fa97375eaadfd056adfdf481cb443a9df53dba8603b7118c786bd54e7092f0e77c4519c48fda6382bca987dbdb263cb7af3bcb0e2ddc6417bd5dea8f354fca2b659c4de16c7b1baadb6b9f85c9cb4f392f7e7569d14329f637196e87cb6d47e7e736f9bb07fa89dfaa7384fd4969dd37c653f40ede79b8873a7ebed884de0a4fd893a719c1f30681cb6433d0fe8ab633d9f521c591def519c3963d9cfdebaff67623f5fb86417d41f9f2f6caa73f585da8a7126a6f1e43cf61b474168a3807d294e9d91f126623f3ef07aa322ca259f604fedf3eb409c05dafea1711c94a9ec07fe525755ca7e12db507dca3664893f6a9c84b49fb25eceaf344c9cec170cc569a0fba72e7c3edc884da5e7c1fb9b9a3491f503e74b1665899c2ff07e642559f28def13a54320f9080b75a2e6f3c94bb2c4a3ba50f37d2ae2dc49bec2545cf8fcbd15fbfd00be8f85a57a3e7f0075a13e533b35ef97890b3d2f78151bbfff95d8ef2ff07d30d624925f30561bf5b9bad2fceb895d584b7bbe6f656c2acd87137119aa7bea54cde75f3a329f07d46aa33e54576ace379b9446f3fb406c43f5913ad5fbfa2a76a9ce8fff7db18eeaa5bf6db5511b75a5f7376eec125be9fded8b5da8f976a74eb57e20aefc7ef0fd7595f3f99da98de69b53fbfcb3e2ca687bcecf8aae9b9e4fa5f6f9301357fe7e84ea547da83675cd1eab2b75c1ae9adfb073b551d76a8d07fe7b56a7b5ae0fef5696feaed8fc913f86ef0b021a7a4ab4e83ed67d1a6fb0c21a0738c4d197e201c77883b738c1e917fbbfc37b7cc0c72ff63fa3fee7f884cfb8f8bf785ce20bf55d5279c54dece0166ee30eeee21e763f8ddfa7160778883d3cc2638a3ec1533cc373bcf88ff82ef6a9c5255ee10fbcc69ff88ba2db1860f8593c461853e9f318579868df29669863e15bbc89ef02028081b219032cf79d82838a9efa633c0c60082318c30d6650e1126ea9efa079078705d43091163e9e7a1fc214ee68f44c5bdccb3ba919e3e16d3c453fc2b0993f8cb1cf7df66146adfa306f6648bf99d0184f6fe287549ea92c9afe286e092ff456c2825665e0151e640df2ff33d8840e972d6ab14dd1083bb0a4d11cf7b1cb757bd0c1aec4e31574b974a8ff98fa7ce607f81d294eeb7d3cbd5d3585e225f2f9ddcf0eafccd0c8beff825637a3f9eeebbcde972d38a0d51e426f154f2ba393edc33695970fcf11adf598ca98f6cecfc7500f07d4430d3daa7dff9cd0ee9cd2c99fc174157f4efbfc4a4ff3597e78a6b4570b2a2318493c65c305ed68f36c429f9ecb0f3ffbf436a0ef03daff7fbfaffd065501ab27</data> + </image> + <image name="image31"> + <data format="XPM.GZ" length="2061">789c75d4dd4fdb301000f077fe8a887b43d3914f27d6b40718fb1e8cb2c180690f8e9dd0022dd0a65098f6bfcfb93b5763ed3055f5c397f3f96cb2bd159d1eee475bdb1bb3ce74231bd9a199465b6e3e1e3ffef8f9ead7c666a222ffabe328dd7cb1b139e8221b1ddc4c9a1e587a4052f911931f7aa7716c63f62776128bf7c8dabb227fef9d25a94d79fe889dc559423eed9d9b3ccf0d39ed5da49995f901d9e495b862177141c522887541cf83eb5d664a8c27bdabac28324d3e24d7de9c2feeadf3522b8ed764ab9dcec9af7bfbf22ad9dfc7a5797f3371e847c22e13a94fb1755165545fb3744df359ef3aafd39ad6835bb2334949f3508be5793c131bae0f5a76ad0cd77bdcdb16a5937e2cd8cb7c97e250cf83d888ef97e6faf260596fceae53712756da92a7e2c69091f66b5de972eef79760c5fd31ec2ae17998b16bc3cf03b26d5a3bf29d58b1f1436f57a822e5f37dcf2e251f5eb26de30a32d5ef1a9dc8fae76c975a9a07102b8977623f68def66e9435725e13b693f3c3b15859ae6f286e1a4596e79b544cfd6a9a52cb7dfacaf6fde4fc376c2bfd84113bac07466ca43fc360de0fde2ecdf574c1b2bfcfec26e5fd21add7aad2493d3b6c5d48bfdeb1437df8466cf8fc719fbdacef82dda4bc3e8cc5d25fb8161be9ef9538f46b11dcb277c9ad7f1d717df7e2427c2dd6f2ff78152cef2faea7d589b8655b25f77d220ef7ff2e58f6fb2d58cebb1637127fc076e17e3e8ac3793cb1433ff0ad38dc9782dd2ad9ef48ec7ff8e53ce810fe330cd67fc55874cf3ffeaf0db678f157cc104734c2f725455ce1f5b33c3cc7df631f31e923f0e6591e2b9f11defa883b8a98e26c6d9e0ee77e957b8ec08735f52cf0119f7007777dc46bdc1b746bf6f506dfe23b7c8f1ff0237eeae756f27cc67d3cc02f788803dcc3a37f62b89eaff80d8ff104bfe3299eadc4f47b3ac718134cbd323ff235790a54586285da1f0280817a350f5870d0400b1730f41123b85ccd0357700d638998c00ddcfe1be3f3dfc11466d0c11ceee10116b058c973b46e50ccef971b7f008068e53b</data> + </image> + <image name="image32"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c4b54c4e4bb44c067113a1dc3408570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e00eaba6126</data> + </image> + <image name="image33"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c24d4a4d4b03711321dc642308570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e0083ae60d7</data> + </image> + <image name="image34"> + <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c43531b4304c32017193c1dc44183711ca354d4a019b8306708b292301b85862120c22c492136170e8a8c3e23722c2a5d69a0b00768563b9</data> + </image> + <image name="image35"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d3249354a35037113e15cb0623d34805b4c1909c0c512936010490c0e868e3a2c7e23225c6aadb90090db60e2</data> + </image> + <image name="image36"> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d334b343533027113c1dc3418570f0de01653460270b1c424184488c18512878e3a2c7e23225c6aadb9002a2160a0</data> + </image> + <image name="image37"> + <data format="XPM.GZ" length="409">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022630543251d2e253d856405bffcbc54105b19c856360003103711c44d4bb3488170f5d0006e31652400174b8483a12d86c56f44844bad351700a36a5d2f</data> + </image> + <image name="image38"> + <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c44d4e314d314d04719341dc1453183711c63533029b8306708b292301b85862120c22c4921293132118bf3a98aa6402eae8611e16bf11112eb5d65c0046af6444</data> + </image> + <image name="image39"> + <data format="XPM.GZ" length="29843">789cdd5c59532bc9727ebfbf62e2d6db0d4759486c0a871f9000b16a6107871f6aebd68ad006420eff7767e5526a01678633f78463ec39d1233ebabb2ab372cf2af1affff8eda17df9db3ffef56fb3b999f7dc6fae6ba6bffdc32f46a3f7fff8cf7fffafbffd7dab54fa2d5e3bfb7bbf95fffe2f7ffbbb5afce67e5325fc0f7127e1fd888d12bc85f7cd59c2785fcd196ff3fbed84e9fd37c1f4be5d244cefcf18efd3fba69a30def78782f9fdc0d8d1f381e7df62fafd1163a6c7f610ef0b7f669830d1d717cce3bb8489be16631ecf0c12a6f7b5605e9ffd84e9fd2663e1cf244cef2f05f3fcdb0913ff6dc165baef1933ff364f98c67b174ce3f94ec2783f5405d3788ab1ac5f384898c61b3116f94e19333f81e9df127a6e22de4af20b2dc67c3f1b264ce3ef09267ac33961a1275f0aa6fb6e9830be6f9b82891fd363ccf46665c1fcfe8c31d3afae18337d86e72ff3fc36632cfc5f224efc9a53c2f2bcb28ce579c358e6538cf9fd1ce55d4ee3e7d38491bfec4430ebd72e631e2f7f4f98f445de1779bc12ae087d82657d02631ecf8f1157d3f38eb13c7f9630c9afc458f4bbcd58ecb34b789bc773d71157b6d2f35dc642ef65c234fe1d61795ff984f1be3b622cf4a3fd5512bde69931df7765c63cbecf09cbf8a19c30decff704f3fabf32e6f1dd2861b2f70bc1f4bc9a3096f9a709137f2bc6b25eaf0993fc7722dede127e94662cebc5f765bcae12ccf6f4ce989f57d70913ffa782d9fff0fd1d5e0f5d4d98f87b63bcc3f4ee09a6f7f37bc6559607bd6fd27ad1fb6647ec799ff10ed9733662ccefab2c6192f7a1607e3f27bcbbc5f3a37fde29277e036199cf1e30f6bcbea782cb555cbf8cf0ee16cfd716cce35712a6fb5dc1e47ff20e635e8f6019f37c16e3cd8e81f9e9fe24619287174ce3e734be91f9f237c1952d1c6f9f31cf674e12a6e7bd608e1f55c6bc9e4ade97f5dc124ccf6715c64c5f2eef7b8e2f270913fd75c1fc7e89f01eaf9fb109d37a5c08e6e733c6423fca6777bd9e6dc6d50aca2b778c79fe702c98c71b0ba6e70de334ff5c303fdf4d189f0f43c63cbf1d244cef6bc12cff5bc6acbf614730afcfb1607ade117f69fd4dce98f9d1fb8485de702198f8c9968c7788de7c2298f4c31bc62cefac2f98f9b94d98e6db134cf4f961c234df81601a3f7b4f18ef2ba187f5c3761326fa5f04d3f8e128615aef1bc13cfe94f0bee87f2698e943fbdeab883cb25dc12ccf3bc6c28f62ccf4b99660a6e72161e2772e98f5e79e709aff2961bcef5782897e23f7859e8784697c23989f3f60cceb9d1f0aa6fb01f563cfcafafb6dc64cbf6f254cf4bc0ae6f177080bfda12298c7bb4a18dfb7e9fe36deef1ac6bcde612698f57f9c30d12fe331bdf68d31d36b1609e3f36e20989ecf69fd6c95e59f39c1f4bc9d0a66fa51defb15e1370c080bbfd94230f1176a82893fffc898e5114e1326795d0aa6e733799fed47e58299be9960b68f73c13cdf246183f3ed3366fa6d8b70e2b72698f97d67ccf4da15639e5f7505f3fdf384e93edae37e924fde66ccf23034bf95f7f323c64c9f1a274cf1d312364cafe908667a2f1226fde0f10dd39fef244cf2c17854dd16fecd2d635e3f37672cfa3f13ccf2eb278cefeb5dc12c3f4fd8707c725a30ebe33d63f6fffe52308def2a09937c468269fc709830cad79e3136f4bc7f164cf7f321e3c0f39704f37a087d81f97f276ccb1c6f9c60d6f7fd84e9fd9160961fcf6777395f3b4f98e2d55230e73f2f8c0dcf779530d9675b303d9fa13d549de89b7b662cfa3d14ccfabf12bc83fd89fc98b0e88bbf612cf65765cceb197a8c03fb970bc1f47c4eebe784ffbc9930e9c78e607adebe248cf475991f599ff02698d7e74130cdafaf0573fc7082697cd560cceb69b613a678772798c6d7270953feb910ccf35d09e6f57e651c389f7f4b98e2fd4a308f7f9030d52775c19caf3c244ce3f37c8ef54f3f274ce3d705733d749f30ad9f62ccfae72e1226fed37d7e7f8bb1e81bda9749f668278c45de33c1a44fea9db0c83fdb16ccf2384b98ec755730bdef6e18eff2fbc70993fe3505b37f3f4b18c7f34e308d674b8c59bece08667ff62098f5f35630fb9771c234fe9e601a3fbb62ccf2773b0993fec8f32c7f5f4a98e423f4b3fcfd56c2444f5b30dba716ccfc2f1246facc23e1a42f8b84495f4682591f6709d3fd8660d6f7cb8469fd83608e37bd84e9feb560a66f2761a44f337fa28f3a4f98e65782993e9730dd5f0ae6fcca274cf6f22298f547d683ed5f9f254ce3f505f37c938429df7812ccfe9ef5cfb1bcd543c2644f321ecbdb3d254cfe1ef305e3245ee5b4bec91fba2c61bcef8e19333f6a2f615aef86607e7f2998f4d3bc3066fd563dc11c0f647ed1e7d784f1beda66ccfc8584797db712a6f87c2f98fd432361b29f8160b64f4b58f4d5761226ff732398ebd32c61ba3f11ccf5f763c294ff9c08e6f5eb274cfad213ccf66e12267a4782995eb92ffa7b9430e94b5930eb532d61d28f84397ea6e739ff7a104cf4ea66c224bf95609677bacffef38e31ebbb6f244cf409bda2ef8384291ec978acefea2461f2474f82391ebc274cf4dd0a26faf47dc2a46f82255e9e264cfe725730dbcf79c244bfd0cbfe310f82395fbc4d98eeb37e7ad6275512ccf1fd5230d773682f36c5177bc598edc33412467eb20163f6dff65930ebd36dc264ef75c1345eb79b30dd5f09dec5fb9edf17fdcf54c2648f2782397eec264cf2ea08e6f8762398f3bb17c1acdfe384c9fed3f3444f5e66ccfaaf0e13267aee0473bf659630f5739e04733d3b17ccf9db96608e1fe93efbc303c6e2cf5f13267f2ef48b7e4f13a6fbef8239be5d244cf5a7d0c7fa1dd698e83b16ccf6374998e80b82d99fce12a6f85c612cfa5f4a98e8f38299fe9030e96f4d30d35f4e98fcef9e60ee47a4f7997ea157fcf373c2a47f39612ff9433761a22f13ccf9623d61f21fd782393f58635adf1663f67796f4c58bfe67645f5efcaf3b13ccf76f05933e661dc632deb160ae3f2e1226fff42c98f3cfba60b6479f30cdef18b33ed9ad84c97f58c1ec2f4709537c96f9589fcc55c2b41ee97df637a70993becc0573bd769d30c94bd6c7ec122e31967c749530d15b13ccfa651326f9f604737c3a4a98e2a5ac17eb973e4e98fc4b4b30fbffbb8469bd0f05133f7a3b61926f9a9fe4db652cfa686e12267a8d60e2a7334f98ee0f0573fe769f30e94b4330c7b39384291e5404b33f9f264cebcdf2f652dfd712a6f90f05b3bd5412a6fb2f82d99ecf13267dbd13ccfa722d98e6578f8c593fcd3461f2c7a80f6e47f427d413a678fc2898d6db6d3366f9da878449fe4a30eb6b59308fb72b98e5a713a67c8a9f17f9e4e782593e09b3ff784b98e6f782d9ff5613267bb914ccf5e869c234ff8160f61f178c253e2d05b3fe1f264cf3f705b3fe3f264cfe55e8e3f8a52b0993bc7605b33daf31dd3f662cf56a2361d297b9608ef7f709137d428fe463c22ffb97ec2861eab738c11caf9e194b3f0cfdab037bdcb3789ff427d9436e13267b7814ccfc2d12a6fbfb82399fb84998ecff4df07e05f12a619cdf8d194b7e769430f1130473be96254cfe4709a6f9c32261a2cf08dec3f9d50e63f6dfbe2f98f39366c254df3e08e67cbc2398f339a147fc6b4d30d71bb29e6c3f994e98d6678f7090f5c7fcc783fe54b771be13c6122f0e188bff6d0be6fb3dc1347e67ae95365afdd94f6db583ebe3e71f5df46ee1fa67e9405928ed7ff115be71c5e7329dc3f58be6a538f74faf495eb8d2eff19efd0399fe2299c4cf5f22975c77717d8b17fdfe57cbfb0fe5f22bd624c9c17cbe8af759566bbbe969f72be6ff85f6f2d10efc2719fde8795778e7af602f05dff423d9f0f5c9aefe72f6f2b58ffabcde24a7ee07fbfaabd94b5f7c167c0ef4103567146d017fb6681378c5dfc3e728cece9f83bf98bd78fdacc7405994857c0e81ab173d619b18e9295c16f08b9ec59f91ebc0cffe75ec650e147aa20ef1582fd00e2287affa0d7f475447bfb5846ba6df91a31573f557b2178fda1235ad8f964dbf5b688a316f5156a861537da06bc8c99235b10ef7fe42f6026b9feb43e022527d0417e76448bd458aa3dd2cf5b16e0017272897289331be77faab7cd92f91cb195074861445aacf81e20b7d099437754bb775475fc175ad6ff4adbed3f7fa017effa89f502ef1bdd2aff265bfc45e0ef51650a4c0aacbba02946eeb1dbdabf7f4beae2aad9432cac26594535e0595a95c75554ff5f5a302eb57c3ffd5f842b15be27731b64bcc78d52b35d24df5acc6ea454d80eaa99aa9395e73b5285cf17733b8fbaaded452bdab953ad00d156d287c98e3a37ffb437ff71d7b8119cee0eaab3aeb3ee5502375a88ed4b16ae8b13a51a7ea4c9dab0b7509d43691e6b96af1675b75e05ae0b5e6285e57ea5aefa91b75abeed4bd7e550fea513fc3d83355534fc0e10ae4562ad445aa985bfc097bc158adb6e29a0937aa0c9c54f49bda86cf1db5abf6d43ec8a20ad42fe2e04601f51da0ba782df013ffc1fdb631c855e447196b9cf17aa98ec08b7bf0f043f4790eb4568137fc4e4ef15d7b61b93037f4a689b1c10493e91d939baee9910c90933e5c03a0b49564137f46999861e484ff69919119996733362f6602f67612b980958a14c71c625594c73f692f59c15ee83a3353adcc4cf5cddc2ccc2bea0b528e6b2d72987f71a16ccc1bf1023f6933304bf38e1c4dcdca1c807c6aa68ede3ac6a9b15e9ac39ff1637f642f511672018e5ef4cd1c9963d33027e6143818004d4bf8ff80a98d9a56948bd88b7014b58c3511af33e06c89f239d7fbe6c25caa13981bb8019d1b9ae68f72ef3f175f926665e07dbbaa610ed5cab474d58c7045911aa4d014fcd69afab5fdacefb5d7b603ff22376ff07bb01ed3361d7365ae81c267a0b08f7941f69dbcfa3bf6122d5e64626ee0b3079cdc82ad47dd6a1993ac7d81728832e924bbd105fb50289f8e79877f4b944f1b3e91afe80d98fb99b933f7a0bd0f60370b73631ebfaa79fea4bd88ff10bbe9e9a67982e8172dd9b0050c80aa41b215f1559d0fffd6b6d4a64fe464c1b25cdbd9dc94c072b64c192c7ecb543ef512f24ff47d3fbe440f193395d8103c0299ec98dde493801bb3c736b0cfdaa290bbb9f82e8c3733f673c654c1d6d7fcb54d353d472b409efad26aabd4893598af2d50db8c7eb6f6c7b2f996bdc47812b3c037b4932765909325ea3c5a409449e4c13af0515a7eab66713f4f55cdb9b23603495e41049acb3f9bb3cdb431d6cca2ada1762a5ca19972b66bae54cd9a82dd56e8fa27f2b12164f4d1a744edba654e86512a6a617bacf7fb6c0fa825d6837f73b66f07766847f6d9383bb62f7662a776664183802b9253db2ec8ee31d6c471348ed3466e5fed1bc4af065775b1fe19488cf9e8dbbe6d2f6f7619eb42fb6e5760f1738aed29962f687dd15e227d55a0e1c0d66cdd1eda23d5b7c7fa123c78d936f4933dd14d7b6acfecb9bdb097203318cb3663c4e1f1d8bb01a618dab52ddb066e02674fb1a25bd73bf967b9fc91bdd80e8cf06e1eec95bd86f58c32d128931bd58c51055672001a833aa526f6d6ded97bfb601fed932dd92d3d809588d570aca2e33553076662cb20af0ae46f57e4b3ed768c50c90344ad6bc26833bb6377a152686005176ba09e697eec45ff94bdf46dc7eee93bbb0ff16491627b8c85e281810a1bccaead3a302e072aa567c0c5c839b45acaa74bd87f39433c35f5b8f7e23297c7681b478371dbe8db0c47da05f00252765dd7737dac4797984fbf147cd746ffed5bf1e518ae5337c0595be497a29d80c5a0bdb8f8e9ddc83d9b2d3746db2a77e6f182f92d56cf79877a357d8c5331b70b901797dd8b9b980b37759805915cc0d371fe005cc5ace1cacdf593f16e01356903abeb2ffa703fb097cd1c14f876af6a07328b57f495cd64250bb6912672f2e6966e629fdcbb5bb95777a017ae86ba1d2d7691728758dfc74a3ac378fea6eaeac9d5819b43b49d39d91d65d0e81b07d127ba23776c827d02d94cb1dafe585be59fed052fca4907ae112900dfd5554776cb9db853cc1cd7590aac5ab49b2813c872c7ee4cada02aae6de8b2d41d31cf7e71e7c0495f1fba8b582d74e6dc7d1dbb4bdd724dd78adc403ef0c6b169ce1eba1f57d0b55d076402560f2b34d8183ffbc25e48ef38c6e3dd579cf90a226459edb9eb98cf7324a30c5efc58d55877e36ecd117623dee0bd8f3ee6ccdde967cc4ecbf0cc509db87bf7e01ef581aabb277d04b2ba7025b785d1a7bd91b771bee0caaee2b6dd8e2ea923e0268f578c7b1bb5e857727188bd5ea88adbd5af6ecf646adff4303a76300eb6b04e210fdc74fb760c9c78b04abfa9c3c9de200b710d900bf83057f5206ed3f646df821c4fc8c3aa7b0f6aea3d6b5a9bb457f23ad0b2990f608b607b3ea3de5b87faa492276edacb5aef025aeb336a18640db0de3b18555abc662d8e0151ab673ef75ddf03ff52e70e519f57a2d8e387ec4395e0f707beef077e88bd802babfd086afd13bb7417f05e43dff967378d7196e34c7b2d1735f763ff02d9660f344ce2cb3a4ffc1db9c013938487e6d84f50fa4da9df392f063df6533ff37358df55aa9e7cd2df756e7be85e4193966ad72ffc2b4694e845a6aee5827ff34b5d72bb90679d806cdefd1457adc3768317ea42d5affc01649b63552eeedf44b9fcc05e88df3af61f33904d80ecee14229ad48c4dae57fa717cd0887db305fec5c56e9faf816dbd727f387ce8e7bf826d1cf891afc78a276629fe10d6fac81feb5b57879528b92bdf5027209b13cc6ea4ba61d9448fe34ffd19707e8ef998655bd9e8d77c940bfb9709f5854d13f4fb227a7fcc24e75c9f28b31f7931affed237cdb636c005d59b23fd92e2720eb50e45c6d83bab0025ad281353f56de0a50399c24c197f053eac0eb1e63056c4fedaee9a76e406653f4831277ab64b7f033a728bd64fdc50cdeb243fdb882f622f0ed7d5c37a9d832dbce0c8ed752f85bb0e557beb3cc4f6956f604c37dc4399f258dd5883f298effad6df819d0027a9b6a1dc7e6ae72e40563142d9defb07ffc8fd03a973da52d7f82758d9d2860ffb54bf7c8aa3312f2e21ef977a5b4d20eb52d25b91ac3c5aa3bdf35bbebcaefbc4b760ad7ea84fa35c40239cafd87bbfed487724cfe7aa2b6aaa6bf91df708f22de981dff57b7e1fad7391e2ff007380a6affa3964463946e1a055512e057b091b31c66126187fbe801b2e6af83a8fe5359d412e7cef2c5862a9e0b3689c852e05652a643fae1e8c9da3c553ef6c99aa32c31cd9000c419e05eb1d3cf8dec39855723f4dfa376dac019ec1abaf308f18fd582ea2e3bcb3e0c8a785a077d183ae65d247192da0eeabd98790f9f2177b90877acbd7a01e044e7cc5f5428e9ccc627c92da8433c9183f66304d37f440cfe26a3eea76e89b73f4cc1df661b40a0bf0e331b7a04c757d6ee0a3bd84a4e3f1e703d032d2c9637f8cda2bebd3e18a2b6a58dd3e42195b46fddddc833c851afd0cbb8191b2017af45449732e2cb971ccbccec3308cf405c68a51780e63ee8bac738b057569428c3163caefc4be538f48e422e753686d638d109fec418eb50fa3b652cf8be4328451277a1bbc31ed3d9a8d78425e00bc7098061366a45da92ed1940b23477b71cdc3dccef415acf701ea3d546d618175d23c45ca98ff6f475e202ff36e8fad5f7a441fe3cb5a2e39dacb0be87a093e5be175a3574f7281bcd8ceed517883fa44711cdedccf1f836c1ffdc28cc3123dec80b3d175b545963d37a776eeb53d095ef720cbf11055213a9bf107b974280a8477d73333dab94d57f6237b81cb617d1df7ba7abaadf4bac38af1b81f75ccfab0723df0290bac4fec5a67d1de867ae62b5e8759e4241c707fc3b09691ce609e654e43cd8fa07a56dc438eb1c84162f68e3195ab3ceaf1c0ff67a614eacec48811630ccfd7ffa27e09453f06eb9341b6d8a14e45ea41b25c54351c421d5f7335c85dc71fe26fd08df0ec17e1287a0de0a4cd9e68b3df1ffd5208c7c1f85db0ab4cd79578916908a1116351eaf32c521c9886713841b9acfdd85775a59358cabe7ba17bfe017b7a32a678e4a639370d7d09757ccea3f555053251dab15310d146fe15fbb3b1765b778a86a9ebba1773df706a5ec0e6e2dc75d0fb098da3a3afba35e73c6f3365ffe8bddd5938431dea21adf9a7fa45e4314bb2211fb1d43736dbd45bf69271bfe408a4db851c179e85c88ff527d62eeff63ec59301fb2bb5ee63c63e85ea84f370112eed43ecb2625d13b97953714cd050b385bc248fac648fc086a61a614536533193e9fea0de77c22b67edf1dcc4b5a21d1fb254910bf062c7e01da98e8f7afe0c7229412ebc7255c856b6a91f917afd1d96499b7b9da0fba115daa1e326fe16e49f61a536d1e37015edc61c85eb823ecc1327605fa61123c1a65c36ec45f230914bdcddae47bdb7cf6c2f8b0db9c0fae81db0d867d0a8d88d9840dd7e1477e68c0fcd70e3e28ee4ccbc53fe51f45da9d3ba845a7166e7e1d66f853b7711eedd8599c258b01aaa063eed06e542762a1ddab83abb7ac7513c99712efe45fd22b954e495bb9c2eea2d56611bd68f9f5776a29fa2af93ba3ddc4156bfeb47e101b36a83317e6896916a9189ec91018e9df4b9e901378fe1093ccd1554d171870af273886d2d7b863a4ab9db3ce5cb31428f592ef607f622fec7257bb1787ea501b58bdfb017fa39f626a7f6046a7bca13faa0ef3353834aab4e34a007eda4de7fa7f0bef4f4dbe81520ba84923a895a4a36a747aa661ec256a03ae98d56112b32783b942127207b5105dbfe2c179778c5b343bea4df5d50dcebc1b5155f067a07b1ba09def80c346c04eb598fbe2b5430ab374653879c7bc4e2c3164af696c9b70fb0b2bb04bfbcad62bf38763d205f80798fc34eec9573beb4ce1766ea3aec921f2becd97d55bface5f20c233b88af07fa21ec61c69aea6ea403f22b5fb7a7ba0e3e0838075ff60291f1882a2deedbb7b9f698a7e8b0eeaf34d57a77a26983790adbfa09fd52cc1b7aaea7f6637f899f595bddcc1dbac0f1a5586f7d5557dae4c74671cf05466f867dca8cb0fe8a99479c21ee953a73613c55d2a0214f5ea14cde02d65ab8e24441fc8cdd6291d322f5bda8d26e614636c8b479c814d8feab69867aacfa639f9a7433c5ff596632ab1bc5b3b53fa8f77dc15e48462b7b9239aad0796ddb69d765aac6f61d6b4888d999cf02e65db49767d0160c6bf9823dda922bb0c2de59aa2eafb20c624aecb3accc91ea82841752252be9cacccd28cb41b3dfd15e36fa799bf1e5436f6c127b9750ef97ddd2427649bb22b152e61e19f8dcac9bf5a0ee0ce8952f33a839d4cc1f7a8ea636c75c1877bda3c70ae7b8be6d5c957eeab12ca447a9ae200fddd5cd6c00b5d829d4343dd6cb16aec2221b462f1662ffa1947aa3d487f96c2fc51aba8e27442a3167f5bd6cc4ddd7f5fee322ee50d84b3b827aff203e9f41fe65759420dca18cb8cab2883a350a17d9585da20cdaa8591ff6ff31ffbc024d7b017bb8c5be12565f2c97f87413d6efcd55b3097252b495df974b3cef10a2ee827c1eb32967ed056ea2f543615bc966ba1c3b4fc0d1b16b66a0f9182531ba487da2aad9227bcddeb2653c9b81aba2d37ee6ba071ae36b357bcf56d94194a16a81bd0c413a43ae775aa009b5ac0e1e6990e4d2fba23f263d4b918b54585b1a7c7f76987614c8bb2e25cf5517eaccbd60ef3ee893ecc80598c4727f4b6ac653d0c563fbe0265903b2b4cb8d882b7bfdacb5a04927d9697696bc9dec20d29ecca9bfcccecd767681ab1ee9a59cece37e655eeccb73acc9a166dfd253d7f3a764cb9c7d602f05ebbc2b97bb49b42bc8c5c6fac49e40a67f8af9f182ec44d9ec3298587ffa5bfb181e919b26d7a9eb5d099033aed43e7902e0a0637bdc8b1bb20c9bfed496634709f4652d97e5a77e72b197bcbe4a59d354fcb96f664bf42b863b0fb88365dedc3056ea313fca5a3a9e2f9a676ddb704d3bc70ef70cb570ee4759472b73935d85bbf064cbe178a34e95fed7227a05cca0299e0cd73920af4ad5ceb3ebec26d69ea98e75aaf6237bf96a8f167ebecca235cec033491c8efe96f749ccab7dd12ddc0789b54bddee81dddcd90cf8c82037b8cdeed906c9833ed9fbec41f68dd2ee397394728bf5ae2e69d81b543b537ba62bd4238afd37589d47ac81eda7fed8ef9d85a981e71fab2af65ecf94ecbe5116b2303d77188cbe885d54f510b9c99efc222b856e56d2d7ee11a2e929d68c31df8af9c453b6052a021942568e23e19eede2c3bf39ef490b9ed9905520d39d81264fb8b7bfee897e92cbefec573aff966d673bb1a76cced0a32e30e7228d985b9fedda336ff5d25a98e1508fb2bd6c3fabc24415c8dec7b136c9313e0337757567df21f458b0aa5951db84fa42af72ce57f48c6d3b31d7fad55dc53e6871efed27cfc3585fca6dee7037894ee8ac7d1a5130cbbd771ab27edcb928996d3dcc03d4190778569c329d3e64a067c0cd9baab9173f37e3185bb9a3f7512eeb9c7cc1e367906304bd95e71801c4dffe89fdfd7067cafec5eee0baf50b711b3d349efd18e55dff9cf7d4891ebb2b6bb06e1f415d72ee1a9cad96f2c84ddcbd5010239ec2ae3fc6ec6889fdb64fb291ea3afe261fe4437fefaef211f642d7b5cb9fd8dff70d33cb9ff371eada4936cf7955cc356d00eb9cea3b1370ffdd63cd1967ebe36ec669fe023201f9b82bac7962afe5369fe453eeae7ef18f7b9b73a83f634fd3f1be417f637fe753fdf247fbfb60030b7b941deb7dded3ea14f746d09fe2991d3ff5f57ce61fc2339e61a969af1ab4839bf7913b8372893db0513ecf17f96bfe8671eb0b7b419b843bf9327fcf5721484550b097fce7edc5d5dcabab81cd1c645553a278cc7b0f738ea1586be229899929f9477f06b54dec97ccb0c310f7f12bbc7308b9b7eee5b578722bafe7138ef15f5a0a7305d1353fb4a720c70c77b8d63dcb4fdf79fae679fe41b883985bcd8f7c2e92619b957dcc36eb78f44edab5f3e3bc61959b38959fd0f760d489f3f6dd79731c1e4d2b3ff553c8bbe6d433e31e2dff5f649eec06e2647ea656317fc0be9d4d7125c76ad07cdf5ef42c3f87cf715ecb2fcc7ddce9a748872724e4ec74f1241bccaeace9da6b3bb0b5fc326fc633fdf63e6fe5edac947720f25ec93bc92f7e964ce1acb939873ab66e26e0359e5d434bcf48a5ef397d3bbee85e36f1e5ec465bbb67ebf915e554f1346eca12298f7ee3eab389de7616b7882096ce20dfb46617ae538c2ac8059fa7a13e40b1d7b2d89009c599b862575937bf06cf22f9e2fafb7ff9cfc497bc16a50bb51c48172a59c877fd18296aaefbf56add09fcd873597f12d74b94a94a7563ab70cf7065bf2997366607576127b3a6b9b1bf5fdcfffede794bb0563c4155737be09de7f98d6bc50c4d3521475baef7e1d3a5a973b1c620b1b7755d2c1ca34cf0dc56c156cc67b9c40a0f77fd4c7e0babba3e0f53c821bf6b2ff99d39d4b57017f7c0dc8eb6d95366ed9be9aaf5370f64cf57e423a73f3ac98e36cec2727642f5c957d1fed39973c8474167f3fbfce1c7dfbff84e7c01edaae91ef8c4b8a3b7d25bd6aa5afe685b7607f29a68377d8e9e2d95ce270be5907a410244f509f61f0cf568d25edb909fe3dda67cb9b69d8d7e007063daf993afe85561bffaa7e38b0eb663b6ed12f0ab79cc4bf9565e8668f8605ff28adbdc8b5ff7e4a587b2d10f4eab3e4f56beee02ce638ccfb7f15b271ffc988b7ee4d59e43d6df28f4f2d6fb71dfb797cd8bf734fd963db5f76eee8eb01b583821b5e16165d78165c6156f3bf5fcc9ffc533bcb37c6047f92abfe29d9b74fa173c3c64caf94ebe1bfb3eeebc40d7c6fef537bf2ff6e1cc3676b07bbae11ef3906de59d7c0fbf334279477b83938d9e0b769596058e4966a43f593ed417b84278a2d4e6d89d99473f6e56a603155f034f9f660579fcf479cb4fb219635f7309167402fadbccf75dc50777cddf81a11a1a1eb4db763b9e5b4e5e9afa65f19fc98660374dcc7caa6e9a57edc4befbfb58f586d0d5be1e7537de233efd45dec3f3fd9378e6e263edfb13f1657d15eb05fc96613c03699ff25a76ee7af9a51f769539c54ed6fc835c3efa2afede98d9f5a7760ed5ef31545a718f1472e890a95b5bf7753c23310b73fbea2f740b38a915ce8c7ff57db26f7fbfb2b8167cde780615572dc6df70079eba678255e1323ff6435fb5af7832fcf3b7df285f9ba9a92965a32ea439b6dc7558c7bf42a535821a3ed303fb64265d6fbb4aa14cded14edef99c8dc73eccc677d27f26be7c5a03fc562e9e9d9ce2b7d38edccaed40ae74e9dfcc7137f8b97db6abf0d2cdc23be4cd53cc614e4106d35056d7eed03f657968ea8a9964e7be04b9918b155c9e67cd985bc55c38566b99cd6f219e3c45df0538ca648195d878839e7c532e7f682f85bf31426723f82cf80bf610637fecc8670a72836eee6fdd1ee40833d09a07e7d52ad455cf9d8566b79b6ddb71de08bb2ed8b26e66369cc50adad5604da67ac094623d8a3f4ff5329bb885f178023e9e21e893d7a1ef8ffd497bf9e26f8860053cd693a8bf9d793c9d46fbfcf1e7e82521a2e6b0d690f138134ec2991ad94757b78f6a14ceec53dca5026eb903e16a69dc919cf5c413c5633c05bc8a9faa8ebdd178a679c5ddfb4d5ff6fdf8f2e1efbffcd0c759a28ccfabc839af51e1bb919b7f1fa6f87dc9cddfbb0f7ab1f1de8fe8fc097bf9f1df77c1131d9453e3675cdb45e112ee3e7da69efde65eca669fe5f7fe36c606fea9ef237f219b8d5e88ac5d48549206d177f68bef15e3b59ccb5ce714369d35f8ea6f01157525e16fc797fc4bf9f80f71777d6ff36f2504ecc7cf3ebd27e3ae7b90ebdecafacc67f19c8ddbd0894f31e69bf958fe51361b72f9c1df48fa2a3e6fc8b0b73eebf1719e8fb1ad50e317f1c6b8df944bf78bf52fcaecabbf0ff3f1fdae2eee273891d7e61eca47dff4c1363ecbe4e7eafdf879a63fefd1acd724dbf86eacec21c64ffaab11856f00cbfde2f5c96fd17c9b722dcc9be402cf757bd8efff197bd95cd32fbe23a355c117c53577fcad9dcdef337f25c3cffea968379f65bf96133c079c6cc8e5bb39f2cfe46d1f75febbf77f34df973654f47ddf8f2fff27ae5ff4f7c7fe129fffafe4f2dffff6b7ff0140588b33</data> + </image> + <image name="image40"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </image> +</images> +<connections> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>lcdDisplay</receiver> + <slot>display(int)</slot> + </connection> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>progressBar</receiver> + <slot>setProgress(int)</slot> + </connection> + <connection> + <sender>dateEdit</sender> + <signal>valueChanged(const TQDate&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateDateTimeString()</slot> + </connection> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>spinBox</receiver> + <slot>setValue(int)</slot> + </connection> + <connection> + <sender>spinBox</sender> + <signal>valueChanged(int)</signal> + <receiver>slider</receiver> + <slot>setValue(int)</slot> + </connection> + <connection> + <sender>spinBox</sender> + <signal>valueChanged(int)</signal> + <receiver>progressBar</receiver> + <slot>setProgress(int)</slot> + </connection> + <connection> + <sender>spinBox</sender> + <signal>valueChanged(int)</signal> + <receiver>lcdDisplay</receiver> + <slot>display(int)</slot> + </connection> + <connection> + <sender>buttonColorBox</sender> + <signal>activated(const TQString&)</signal> + <receiver>WidgetsBase</receiver> + <slot>setColor(const TQString&)</slot> + </connection> + <connection> + <sender>lineEdit</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateColorTest(const TQString&)</slot> + </connection> + <connection> + <sender>lineEdit</sender> + <signal>returnPressed()</signal> + <receiver>WidgetsBase</receiver> + <slot>setColor()</slot> + </connection> + <connection> + <sender>timeEdit</sender> + <signal>valueChanged(const TQTime&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateDateTimeString()</slot> + </connection> + <connection> + <sender>timeEdit</sender> + <signal>valueChanged(const TQTime&)</signal> + <receiver>WidgetsBase</receiver> + <slot>updateClock()</slot> + </connection> + <connection> + <sender>pushButton</sender> + <signal>clicked()</signal> + <receiver>WidgetsBase</receiver> + <slot>resetColors()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">widgetsbase_pro.ui.h</include> +</includes> +<slots> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot>resetColors()</slot> + <slot access="protected">setColor( const TQString & color )</slot> + <slot>setColor()</slot> + <slot>updateClock()</slot> + <slot access="protected">updateColorTest( const TQString & color )</slot> + <slot access="protected">updateDateTimeString()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/demo/widgets/widgetsbase_pro.ui.h b/examples/demo/widgets/widgetsbase_pro.ui.h new file mode 100644 index 000000000..729b1ab3e --- /dev/null +++ b/examples/demo/widgets/widgetsbase_pro.ui.h @@ -0,0 +1,64 @@ +#include <qobjectlist.h> + +void WidgetsBase::init() +{ + timeEdit->setTime( TQTime::currentTime() ); + dateEdit->setDate( TQDate::currentDate() ); +} + +void WidgetsBase::destroy() +{ + +} + +void WidgetsBase::resetColors() +{ + groupBox->setPalette( palette(), FALSE ); + if(TQObjectList *chldn = groupBox->queryList()) { + for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) { + if(obj->isWidgetType()) { + TQWidget *w = (TQWidget *)obj; + if(!w->isTopLevel()) + w->setPalette(palette(), FALSE); + } + } + } +} + +void WidgetsBase::setColor( const TQString & color ) +{ + groupBox->setPalette( TQColor( color ), FALSE ); + if(TQObjectList *chldn = groupBox->queryList()) { + for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) { + if(obj->isWidgetType()) { + TQWidget *w = (TQWidget *)obj; + if(!w->isTopLevel()) + w->setPalette(TQColor(color), FALSE); + } + } + } +} + +void WidgetsBase::setColor() +{ + setColor( lineEdit->text() ); +} + +void WidgetsBase::updateClock() +{ + clock->setTime( timeEdit->time() ); +} + +void WidgetsBase::updateColorTest( const TQString & color ) +{ + colorTest->setPalette( TQColor( color ) ); +} + +void WidgetsBase::updateDateTimeString() +{ + TQDateTime dt; + dt.setDate( dateEdit->date() ); + dt.setTime( timeEdit->time() ); + dateTimeLabel->setText( dt.toString() ); +} + diff --git a/examples/desktop/README b/examples/desktop/README new file mode 100644 index 000000000..dcbb7a125 --- /dev/null +++ b/examples/desktop/README @@ -0,0 +1,12 @@ +The desktop demo contains three routines, each of which draws simple +shapes on the desktop. + +"desktop -rotate" rotates a shaded square. Some nice color work. + +"desktop -poly" draws qix-like moving shapes. + +"desktop -shadetext" and "-troll" draw pretty shaded text on the +desktop; "-shadewidget" and "-trollwidget" use the background as a +widget. The latter can be used to make animated background widgets +that work efficiently, which is very cool but possibly not very +useful. diff --git a/examples/desktop/desktop.cpp b/examples/desktop/desktop.cpp new file mode 100644 index 000000000..34c548ca7 --- /dev/null +++ b/examples/desktop/desktop.cpp @@ -0,0 +1,347 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qimage.h> +#include <qbitmap.h> +#include <qpainter.h> +#include <qapplication.h> +#include <qdropsite.h> +#include <qdragobject.h> +#include <stdio.h> + + +static double seed = 0.353535353535; +static const int KINDA_RAND_MAX = 32767; + +static int kindaRand() +{ + seed = seed*147; + seed = seed - (double) ((int) seed); + return (int) ( seed*(KINDA_RAND_MAX + 1) ); +} + +static int velocity( int i ) // change velocity +{ + const int velmax = 15; + const int velmin = 4; + if ( i == 1 || i == 2 ) + i = (kindaRand()&0x7fff % velmax)/3 + velmin; + else + i = (kindaRand()&0x7fff % velmax) + velmin; + return i; +} + +// +// Draw polygon on desktop. +// + +void poly() +{ + TQWidget *d = TQApplication::desktop(); + d->setBackgroundColor( TQt::white ); // white desktop + + const int maxpoints = 5; + const int maxcurves = 8; + static int xvel[maxpoints]; + static int yvel[maxpoints]; + int head = 0; + int tail = -maxcurves + 2; + TQPointArray *a = new TQPointArray[ maxcurves ]; + register TQPointArray *p; + TQRect r = d->rect(); // desktop rectangle + + int i; + for ( i=0; i<maxcurves; i++ ) + a[i].resize( maxpoints ); + p = &a[0]; + for ( i=0; i<maxpoints; i++ ) { // setup first polygon points + p->setPoint( i, (kindaRand()&0x7fff) % r.width(), + (kindaRand()&0x7fff) % r.height() ); + xvel[i] = velocity(i); + yvel[i] = velocity(i); + } + + TQPainter paint; + paint.begin( d ); // start painting desktop + + for ( int ntimes=0; ntimes<2000; ntimes++ ) { + paint.setBrush( TQColor(kindaRand()%360, 180, 255, TQColor::Hsv) ); + paint.drawPolygon( a[head] ); + if ( ++tail >= maxcurves ) + tail = 0; + + int minx=r.left(), maxx=r.right(); + int miny=r.top(), maxy=r.bottom(); + int x, y; + p = &a[head]; + if ( ++head >= maxcurves ) + head = 0; + for ( i=0; i<maxpoints; i++ ) { // calc new curve + p->point( i, &x, &y ); + x += xvel[i]; + y += yvel[i]; + if ( x >= maxx ) { + x = maxx - (x - maxx + 1); + xvel[i] = -velocity(i); + } + if ( x <= minx ) { + x = minx + (minx - x + 1); + xvel[i] = velocity(i); + } + if ( y >= maxy ) { + y = maxy - (y - maxy + 1); + yvel[i] = -velocity(i); + } + if ( y <= miny ) { + y = miny + (miny - y + 1); + yvel[i] = velocity(i); + } + a[head].setPoint( i, x, y ); + } + } + paint.end(); // painting done + delete[] a; +} + + +// +// Rotate pattern on desktop. +// + +void rotate() +{ + int i; + const int w = 64; + const int h = 64; + TQImage image( w, h, 8, 128 ); // create image + for ( i=0; i<128; i++ ) // build color table + image.setColor( i, qRgb(i,0,0) ); + for ( int y=0; y<h; y++ ) { // set image pixels + uchar *p = image.scanLine(y); + for ( int x=0; x<w; x++ ) + *p++ = (x+y)%128; + } + + TQPixmap pm; + pm = image; // convert image to pixmap + pm.setOptimization( TQPixmap::BestOptim ); // rotation will be faster + + TQWidget *d = TQApplication::desktop(); // w = desktop widget + + for ( i=0; i<=360; i += 2 ) { + TQWMatrix m; + m.rotate( i ); // rotate coordinate system + TQPixmap rpm = pm.xForm( m ); // rpm = rotated pixmap + d->setBackgroundPixmap( rpm ); // set desktop pixmap + d->update(); // repaint desktop + } +} + +// +// Generates a marble-like pattern in pm. +// + +void generateStone( TQPixmap *pm, + const TQColor &c1, const TQColor &c2, const TQColor &c3 ) +{ + TQPainter p; + TQPen p1 ( c1, 0 ); + TQPen p2 ( c2, 0 ); + TQPen p3 ( c3, 0 ); + + p.begin( pm ); + for( int i = 0 ; i < pm->width() ; i++ ) + for( int j = 0 ; j < pm->height() ; j++ ) { + int r = kindaRand(); + if ( r < KINDA_RAND_MAX / 3 ) + p.setPen( p1 ); + else if ( r < KINDA_RAND_MAX / 3 * 2 ) + p.setPen( p2 ); + else + p.setPen( p3 ); + p.drawPoint( i,j ); + } + p.end(); +} + +void drawShadeText( TQPainter *p, int x, int y, const char *text, + const TQColor &topColor, const TQColor &bottomColor, + int sw = 2 ) +{ + if ( !p->isActive() ) + return; + + p->setPen( bottomColor ); + p->drawText( x+sw, y+sw, text ); + p->setPen( topColor ); + p->drawText( x, y, text ); +} + +// NOTE: desktop drag/drop is experimental + +class DesktopWidget : public TQWidget, private TQDropSite +{ +public: + DesktopWidget( const char *s, TQWidget *parent=0, const char *name=0 ); + ~DesktopWidget(); + void paintEvent( TQPaintEvent * ); + + void dragEnterEvent( TQDragEnterEvent *e ) + { + if ( TQImageDrag::canDecode(e) ) + e->accept(); + } + + void dragLeaveEvent( TQDragLeaveEvent * ) + { + } + + void dragMoveEvent( TQDragMoveEvent *e ) + { + e->accept(); + } + + void dropEvent( TQDropEvent * e ) + { + TQPixmap pmp; + if ( TQImageDrag::decode( e, pmp ) ) { + setBackgroundPixmap( pmp ); + update(); + } + } + +private: + TQPixmap *pm; + TQString text; +}; + +DesktopWidget::DesktopWidget( const char *s, TQWidget *parent, const char *name ) + : TQWidget( parent, name, WType_Desktop | WPaintDesktop), + TQDropSite(this) +{ + text = s; + pm = 0; +} + +DesktopWidget::~DesktopWidget() +{ + delete pm; +} + +void DesktopWidget::paintEvent( TQPaintEvent * ) +{ + TQColor c1 = backgroundColor(); + TQColor c2 = c1.light(104); + TQColor c3 = c1.dark(106); + if ( !pm ) { + pm = new TQPixmap( 64, 64 ); + generateStone( pm, c1, c2, c3 ); + setBackgroundPixmap( *pm ); + update(); + } + TQRect br = fontMetrics().boundingRect( text ); + TQPixmap offscreen( br.width(), br.height() ); + int x = width()/2 - br.width()/2; + int y = height()/2 - br.height()/2; + offscreen.fill( this, x, y ); + TQPainter p; + p.begin( &offscreen ); + drawShadeText( &p, -br.x(), -br.y(), text, c2, c3, 3 ); + p.end(); + bitBlt( this, x, y, &offscreen ); +} + +void desktopWidget( const char *s = "Trolltech" ) +{ + DesktopWidget *t = new DesktopWidget(s); + t->update(); + qApp->exec(); + delete t; +} + +void desktopText( const char *s = "Trolltech" ) +{ + const int border = 20; + + TQColor c1 = qApp->palette().inactive().background(); + TQColor c2 = c1.light(104); + TQColor c3 = c1.dark(106); + + TQPixmap pm(10,10); + + TQPainter p; + p.begin( &pm ); + TQRect r = p.fontMetrics().boundingRect( s ); + p.end(); + + int appWidth = qApp->desktop()->width(); + int appHeight = qApp->desktop()->height(); + if ( r.width() > appWidth - border*2 ) + r.setWidth( appWidth - border*2 ); + if ( r.height() > appHeight - border*2 ) + r.setHeight( appHeight - border*2 ); + + pm.resize( r.size() + TQSize( border*2, border*2 ) ); + generateStone( &pm, c1, c2, c3 ); + p.begin( &pm ); + drawShadeText( &p, -r.x() + border, -r.y() + border, s, c2, c3 ); + p.end(); + + qApp->desktop()->setBackgroundPixmap( pm ); +} + +// +// The program starts here. +// + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + + if ( argc > 1 ) { + TQFont f( "charter", 96, TQFont::Black ); + f.setStyleHint( TQFont::Times ); + app.setFont( f ); + } + + bool validOptions = FALSE; + + if ( argc == 2 ) { + validOptions = TRUE; + if ( strcmp(argv[1],"-poly") == 0 ) + poly(); + else if ( strcmp(argv[1],"-rotate") == 0 ) + rotate(); + else if ( strcmp(argv[1],"-troll") == 0 ) + desktopText(); + else if ( strcmp(argv[1],"-trollwidget") == 0 ) + desktopWidget(); + else + validOptions = FALSE; + } + if ( argc == 3 ) { + validOptions = TRUE; + if ( strcmp(argv[1],"-shadetext") == 0 ) + desktopText( argv[2] ); + else if ( strcmp(argv[1],"-shadewidget") == 0 ) + desktopWidget( argv[2] ); + else + validOptions = FALSE; + } + if ( !validOptions ) { + fprintf( stderr, "Usage:\n\tdesktop -poly" + "\n\tdesktop -rotate" + "\n\tdesktop -troll" + "\n\tdesktop -trollwidget" + "\n\tdesktop -shadetext <text>" + "\n\tdesktop -shadewidget <text>\n" ); + rotate(); + } + return 0; +} diff --git a/examples/desktop/desktop.doc b/examples/desktop/desktop.doc new file mode 100644 index 000000000..3a7df648e --- /dev/null +++ b/examples/desktop/desktop.doc @@ -0,0 +1,20 @@ + +/* +*/ +/*! \page desktop-example.html + + \ingroup examples + \title Painting on the Desktop + + The desktop demo contains three routines, each of which draws + something on the desktop. It does some nice stuff with QPainter, + and also demonstrates how one can treat the desktop as a widget like + any other. + + <hr> + + Implementation: + + \include desktop/desktop.cpp +*/ + diff --git a/examples/desktop/desktop.pro b/examples/desktop/desktop.pro new file mode 100644 index 000000000..851401087 --- /dev/null +++ b/examples/desktop/desktop.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = desktop + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = desktop.cpp diff --git a/examples/dirview/dirview.cpp b/examples/dirview/dirview.cpp new file mode 100644 index 000000000..ce5e96b9c --- /dev/null +++ b/examples/dirview/dirview.cpp @@ -0,0 +1,532 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "dirview.h" + +#include <qdir.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qpixmap.h> +#include <qevent.h> +#include <qpoint.h> +#include <qmessagebox.h> +#include <qdragobject.h> +#include <qmime.h> +#include <qstrlist.h> +#include <qstringlist.h> +#include <qapplication.h> +#include <qheader.h> + +static const char* folder_closed_xpm[]={ + "16 16 9 1", + "g c #808080", + "b c #c0c000", + "e c #c0c0c0", + "# c #000000", + "c c #ffff00", + ". c None", + "a c #585858", + "f c #a0a0a4", + "d c #ffffff", + "..###...........", + ".#abc##.........", + ".#daabc#####....", + ".#ddeaabbccc#...", + ".#dedeeabbbba...", + ".#edeeeeaaaab#..", + ".#deeeeeeefe#ba.", + ".#eeeeeeefef#ba.", + ".#eeeeeefeff#ba.", + ".#eeeeefefff#ba.", + ".##geefeffff#ba.", + "...##gefffff#ba.", + ".....##fffff#ba.", + ".......##fff#b##", + ".........##f#b##", + "...........####."}; + +static const char* folder_open_xpm[]={ + "16 16 11 1", + "# c #000000", + "g c #c0c0c0", + "e c #303030", + "a c #ffa858", + "b c #808080", + "d c #a0a0a4", + "f c #585858", + "c c #ffdca8", + "h c #dcdcdc", + "i c #ffffff", + ". c None", + "....###.........", + "....#ab##.......", + "....#acab####...", + "###.#acccccca#..", + "#ddefaaaccccca#.", + "#bdddbaaaacccab#", + ".eddddbbaaaacab#", + ".#bddggdbbaaaab#", + "..edgdggggbbaab#", + "..#bgggghghdaab#", + "...ebhggghicfab#", + "....#edhhiiidab#", + "......#egiiicfb#", + "........#egiibb#", + "..........#egib#", + "............#ee#"}; + +static const char * folder_locked[]={ + "16 16 10 1", + "h c #808080", + "b c #ffa858", + "f c #c0c0c0", + "e c #c05800", + "# c #000000", + "c c #ffdca8", + ". c None", + "a c #585858", + "g c #a0a0a4", + "d c #ffffff", + "..#a#...........", + ".#abc####.......", + ".#daa#eee#......", + ".#ddf#e##b#.....", + ".#dfd#e#bcb##...", + ".#fdccc#daaab#..", + ".#dfbbbccgfg#ba.", + ".#ffb#ebbfgg#ba.", + ".#ffbbe#bggg#ba.", + ".#fffbbebggg#ba.", + ".##hf#ebbggg#ba.", + "...###e#gggg#ba.", + ".....#e#gggg#ba.", + "......###ggg#b##", + ".........##g#b##", + "...........####."}; + +static const char * pix_file []={ + "16 16 7 1", + "# c #000000", + "b c #ffffff", + "e c #000000", + "d c #404000", + "c c #c0c000", + "a c #ffffc0", + ". c None", + "................", + ".........#......", + "......#.#a##....", + ".....#b#bbba##..", + "....#b#bbbabbb#.", + "...#b#bba##bb#..", + "..#b#abb#bb##...", + ".#a#aab#bbbab##.", + "#a#aaa#bcbbbbbb#", + "#ccdc#bcbbcbbb#.", + ".##c#bcbbcabb#..", + "...#acbacbbbe...", + "..#aaaacaba#....", + "...##aaaaa#.....", + ".....##aa#......", + ".......##......."}; + +TQPixmap *folderLocked = 0; +TQPixmap *folderClosed = 0; +TQPixmap *folderOpen = 0; +TQPixmap *fileNormal = 0; + +/***************************************************************************** + * + * Class Directory + * + *****************************************************************************/ + +Directory::Directory( Directory * parent, const TQString& filename ) + : TQListViewItem( parent ), f(filename), + showDirsOnly( parent->showDirsOnly ), + pix( 0 ) +{ + p = parent; + readable = TQDir( fullName() ).isReadable(); + + if ( !readable ) + setPixmap( folderLocked ); + else + setPixmap( folderClosed ); +} + + +Directory::Directory( TQListView * parent, const TQString& filename ) + : TQListViewItem( parent ), f(filename), + showDirsOnly( ( (DirectoryView*)parent )->showDirsOnly() ), + pix( 0 ) +{ + p = 0; + readable = TQDir( fullName() ).isReadable(); +} + + +void Directory::setPixmap( TQPixmap *px ) +{ + pix = px; + setup(); + widthChanged( 0 ); + invalidateHeight(); + repaint(); +} + + +const TQPixmap *Directory::pixmap( int i ) const +{ + if ( i ) + return 0; + return pix; +} + +void Directory::setOpen( bool o ) +{ + if ( o ) + setPixmap( folderOpen ); + else + setPixmap( folderClosed ); + + if ( o && !childCount() ) { + TQString s( fullName() ); + TQDir thisDir( s ); + if ( !thisDir.isReadable() ) { + readable = FALSE; + setExpandable( FALSE ); + return; + } + + listView()->setUpdatesEnabled( FALSE ); + const TQFileInfoList * files = thisDir.entryInfoList(); + if ( files ) { + TQFileInfoListIterator it( *files ); + TQFileInfo * fi; + while( (fi=it.current()) != 0 ) { + ++it; + if ( fi->fileName() == "." || fi->fileName() == ".." ) + ; // nothing + else if ( fi->isSymLink() && !showDirsOnly ) { + FileItem *item = new FileItem( this, fi->fileName(), + "Symbolic Link" ); + item->setPixmap( fileNormal ); + } + else if ( fi->isDir() ) + (void)new Directory( this, fi->fileName() ); + else if ( !showDirsOnly ) { + FileItem *item + = new FileItem( this, fi->fileName(), + fi->isFile()?"File":"Special" ); + item->setPixmap( fileNormal ); + } + } + } + listView()->setUpdatesEnabled( TRUE ); + } + TQListViewItem::setOpen( o ); +} + + +void Directory::setup() +{ + setExpandable( TRUE ); + TQListViewItem::setup(); +} + + +TQString Directory::fullName() +{ + TQString s; + if ( p ) { + s = p->fullName(); + s.append( f.name() ); + s.append( "/" ); + } else { + s = f.name(); + } + return s; +} + + +TQString Directory::text( int column ) const +{ + if ( column == 0 ) + return f.name(); + else if ( readable ) + return "Directory"; + else + return "Unreadable Directory"; +} + +/***************************************************************************** + * + * Class DirectoryView + * + *****************************************************************************/ + +DirectoryView::DirectoryView( TQWidget *parent, const char *name, bool sdo ) + : TQListView( parent, name ), dirsOnly( sdo ), oldCurrent( 0 ), + dropItem( 0 ), mousePressed( FALSE ) +{ + autoopen_timer = new TQTimer( this ); + if ( !folderLocked ) { + folderLocked = new TQPixmap( folder_locked ); + folderClosed = new TQPixmap( folder_closed_xpm ); + folderOpen = new TQPixmap( folder_open_xpm ); + fileNormal = new TQPixmap( pix_file ); + } + + connect( this, SIGNAL( doubleClicked( TQListViewItem * ) ), + this, SLOT( slotFolderSelected( TQListViewItem * ) ) ); + connect( this, SIGNAL( returnPressed( TQListViewItem * ) ), + this, SLOT( slotFolderSelected( TQListViewItem * ) ) ); + + setAcceptDrops( TRUE ); + viewport()->setAcceptDrops( TRUE ); + + connect( autoopen_timer, SIGNAL( timeout() ), + this, SLOT( openFolder() ) ); +} + +void DirectoryView::slotFolderSelected( TQListViewItem *i ) +{ + if ( !i || !showDirsOnly() ) + return; + + Directory *dir = (Directory*)i; + emit folderSelected( dir->fullName() ); +} + +void DirectoryView::openFolder() +{ + autoopen_timer->stop(); + if ( dropItem && !dropItem->isOpen() ) { + dropItem->setOpen( TRUE ); + dropItem->repaint(); + } +} + +static const int autoopenTime = 750; + + +void DirectoryView::contentsDragEnterEvent( TQDragEnterEvent *e ) +{ + if ( !TQUriDrag::canDecode(e) ) { + e->ignore(); + return; + } + + oldCurrent = currentItem(); + + TQListViewItem *i = itemAt( contentsToViewport(e->pos()) ); + if ( i ) { + dropItem = i; + autoopen_timer->start( autoopenTime ); + } +} + + +void DirectoryView::contentsDragMoveEvent( TQDragMoveEvent *e ) +{ + if ( !TQUriDrag::canDecode(e) ) { + e->ignore(); + return; + } + + TQPoint vp = contentsToViewport( ( (TQDragMoveEvent*)e )->pos() ); + TQListViewItem *i = itemAt( vp ); + if ( i ) { + setSelected( i, TRUE ); + e->accept(); + if ( i != dropItem ) { + autoopen_timer->stop(); + dropItem = i; + autoopen_timer->start( autoopenTime ); + } + switch ( e->action() ) { + case TQDropEvent::Copy: + break; + case TQDropEvent::Move: + e->acceptAction(); + break; + case TQDropEvent::Link: + e->acceptAction(); + break; + default: + ; + } + } else { + e->ignore(); + autoopen_timer->stop(); + dropItem = 0; + } +} + +void DirectoryView::contentsDragLeaveEvent( TQDragLeaveEvent * ) +{ + autoopen_timer->stop(); + dropItem = 0; + + setCurrentItem( oldCurrent ); + setSelected( oldCurrent, TRUE ); +} + +void DirectoryView::contentsDropEvent( TQDropEvent *e ) +{ + autoopen_timer->stop(); + + if ( !TQUriDrag::canDecode(e) ) { + e->ignore(); + return; + } + + TQListViewItem *item = itemAt( contentsToViewport(e->pos()) ); + if ( item ) { + + TQStrList lst; + + TQUriDrag::decode( e, lst ); + + TQString str; + + switch ( e->action() ) { + case TQDropEvent::Copy: + str = "Copy"; + break; + case TQDropEvent::Move: + str = "Move"; + e->acceptAction(); + break; + case TQDropEvent::Link: + str = "Link"; + e->acceptAction(); + break; + default: + str = "Unknown"; + } + + str += "\n\n"; + + e->accept(); + + for ( uint i = 0; i < lst.count(); ++i ) { + TQString filename = TQDir::convertSeparators(TQUriDrag::uriToLocalFile(lst.at(i))); + str += filename + "\n"; + } + str += TQString( "\nTo\n\n %1" ) + .arg( TQDir::convertSeparators(fullPath(item)) ); + + TQMessageBox::information( this, "Drop target", str, "Not implemented" ); + } else + e->ignore(); + +} + + +TQString DirectoryView::fullPath(TQListViewItem* item) +{ + TQString fullpath = item->text(0); + while ( (item=item->parent()) ) { + if ( item->parent() ) + fullpath = item->text(0) + "/" + fullpath; + else + fullpath = item->text(0) + fullpath; + } +#ifdef Q_WS_WIN + if (fullpath.length() > 2 && fullpath[1] != ':') { + TQDir dir(fullpath); + fullpath = dir.currentDirPath().left(2) + fullpath; + } +#endif + + return fullpath; +} + +void DirectoryView::contentsMousePressEvent( TQMouseEvent* e ) +{ + TQListView::contentsMousePressEvent(e); + TQPoint p( contentsToViewport( e->pos() ) ); + TQListViewItem *i = itemAt( p ); + if ( i ) { + // if the user clicked into the root decoration of the item, don't try to start a drag! + if ( p.x() > header()->cellPos( header()->mapToActual( 0 ) ) + + treeStepSize() * ( i->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() || + p.x() < header()->cellPos( header()->mapToActual( 0 ) ) ) { + presspos = e->pos(); + mousePressed = TRUE; + } + } +} + +void DirectoryView::contentsMouseMoveEvent( TQMouseEvent* e ) +{ + if ( mousePressed && ( presspos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) { + mousePressed = FALSE; + TQListViewItem *item = itemAt( contentsToViewport(presspos) ); + if ( item ) { + TQString source = fullPath(item); + if ( TQFile::exists(source) ) { + TQUriDrag* ud = new TQUriDrag(viewport()); + ud->setFileNames( source ); + if ( ud->drag() ) + TQMessageBox::information( this, "Drag source", + TQString("Delete ") + TQDir::convertSeparators(source), "Not implemented" ); + } + } + } +} + +void DirectoryView::contentsMouseReleaseEvent( TQMouseEvent * ) +{ + mousePressed = FALSE; +} + +void DirectoryView::setDir( const TQString &s ) +{ + TQListViewItemIterator it( this ); + ++it; + for ( ; it.current(); ++it ) { + it.current()->setOpen( FALSE ); + } + + TQStringList lst( TQStringList::split( "/", s ) ); + TQListViewItem *item = firstChild(); + TQStringList::Iterator it2 = lst.begin(); + for ( ; it2 != lst.end(); ++it2 ) { + while ( item ) { + if ( item->text( 0 ) == *it2 ) { + item->setOpen( TRUE ); + break; + } + item = item->itemBelow(); + } + } + + if ( item ) + setCurrentItem( item ); +} + +void FileItem::setPixmap( TQPixmap *p ) +{ + pix = p; + setup(); + widthChanged( 0 ); + invalidateHeight(); + repaint(); +} + + +const TQPixmap *FileItem::pixmap( int i ) const +{ + if ( i ) + return 0; + return pix; +} diff --git a/examples/dirview/dirview.doc b/examples/dirview/dirview.doc new file mode 100644 index 000000000..82a599996 --- /dev/null +++ b/examples/dirview/dirview.doc @@ -0,0 +1,35 @@ + +/* +*/ +/*! \page dirview-example.html + + \ingroup examples + \title A Directory Browser + + This example program demonstrates how to use a listview and + listview items to build a multi-column hierarchical, memory- and + CPU-efficient directory browser. It also demonstrates how to use + Drag&Drop in a listview. + + <hr> + + Header file: + + \include dirview/dirview.h + + <hr> + + And here is the main implementation file. Note the way the program + scans subdirectories only when it has to. This allows the program + to handle very large file systems efficiently. The same technique + can be used in any other trees. + + \include dirview/dirview.cpp + + <hr> + + Main: + + \include dirview/main.cpp +*/ + diff --git a/examples/dirview/dirview.h b/examples/dirview/dirview.h new file mode 100644 index 000000000..b4e49b5a2 --- /dev/null +++ b/examples/dirview/dirview.h @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef DIRVIEW_H +#define DIRVIEW_H + +#include <qlistview.h> +#include <qstring.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qtimer.h> + +class TQWidget; +class TQDragEnterEvent; +class TQDragMoveEvent; +class TQDragLeaveEvent; +class TQDropEvent; + +class FileItem : public TQListViewItem +{ +public: + FileItem( TQListViewItem *parent, const TQString &s1, const TQString &s2 ) + : TQListViewItem( parent, s1, s2 ), pix( 0 ) {} + + const TQPixmap *pixmap( int i ) const; +#if !defined(Q_NO_USING_KEYWORD) + using TQListViewItem::setPixmap; +#endif + void setPixmap( TQPixmap *p ); + +private: + TQPixmap *pix; + +}; + +class Directory : public TQListViewItem +{ +public: + Directory( TQListView * parent, const TQString& filename ); + Directory( Directory * parent, const TQString& filename, const TQString &col2 ) + : TQListViewItem( parent, filename, col2 ), pix( 0 ) {} + Directory( Directory * parent, const TQString& filename ); + + TQString text( int column ) const; + + TQString fullName(); + + void setOpen( bool ); + void setup(); + + const TQPixmap *pixmap( int i ) const; +#if !defined(Q_NO_USING_KEYWORD) + using TQListViewItem::setPixmap; +#endif + void setPixmap( TQPixmap *p ); + +private: + TQFile f; + Directory * p; + bool readable; + bool showDirsOnly; + TQPixmap *pix; + +}; + +class DirectoryView : public TQListView +{ + Q_OBJECT + +public: + DirectoryView( TQWidget *parent = 0, const char *name = 0, bool sdo = FALSE ); + bool showDirsOnly() { return dirsOnly; } + +public slots: + void setDir( const TQString & ); + +signals: + void folderSelected( const TQString & ); + +protected slots: + void slotFolderSelected( TQListViewItem * ); + void openFolder(); + +protected: + void contentsDragEnterEvent( TQDragEnterEvent *e ); + void contentsDragMoveEvent( TQDragMoveEvent *e ); + void contentsDragLeaveEvent( TQDragLeaveEvent *e ); + void contentsDropEvent( TQDropEvent *e ); + void contentsMouseMoveEvent( TQMouseEvent *e ); + void contentsMousePressEvent( TQMouseEvent *e ); + void contentsMouseReleaseEvent( TQMouseEvent *e ); + +private: + TQString fullPath(TQListViewItem* item); + bool dirsOnly; + TQListViewItem *oldCurrent; + TQListViewItem *dropItem; + TQTimer* autoopen_timer; + TQPoint presspos; + bool mousePressed; + +}; + +#endif diff --git a/examples/dirview/dirview.pro b/examples/dirview/dirview.pro new file mode 100644 index 000000000..fe711169b --- /dev/null +++ b/examples/dirview/dirview.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = dirview + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = dirview.h +SOURCES = dirview.cpp \ + main.cpp diff --git a/examples/dirview/main.cpp b/examples/dirview/main.cpp new file mode 100644 index 000000000..00f712729 --- /dev/null +++ b/examples/dirview/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qfileinfo.h> +#include <qdir.h> +#include "dirview.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + + DirectoryView mw; + + mw.addColumn( "Name" ); + mw.addColumn( "Type" ); + mw.setTreeStepSize( 20 ); + + const TQFileInfoList* roots = TQDir::drives(); + TQPtrListIterator<TQFileInfo> i(*roots); + TQFileInfo* fi; + while ( (fi = *i) ) { + ++i; + Directory * root = new Directory( &mw, fi->filePath() ); + if ( roots->count() <= 1 ) + root->setOpen( TRUE ); // be interesting + } + + mw.resize( 400, 400 ); + mw.setCaption( "TQt Example - Directory Browser" ); + mw.setAllColumnsShowFocus( TRUE ); + a.setMainWidget( &mw ); + mw.show(); + + return a.exec(); +} diff --git a/examples/distributor/distributor.doc b/examples/distributor/distributor.doc new file mode 100644 index 000000000..addcacecd --- /dev/null +++ b/examples/distributor/distributor.doc @@ -0,0 +1,41 @@ +/*! \page distributor-example.html + \ingroup examples + + \title Qt Distribution Example + + This example program modifies the hard-coded paths that are + compiled into the Qt library. + + When distributing the Qt library, the final installation prefix is + very rarely the same as the prefix used when doing development. + You can use the code from this example to modify the following + hard-coded paths in Qt library: + + \list + + \i Prefix - Normally, all other paths are relative to the \e + Prefix. + + \i Binaries - Location of binaries distributed with Qt (for + example, \e{Qt Assistant}). + + \i Documentation - Location of the Qt documentation. + + \i Headers - Location of the Qt headers. + + \i Libraries - Location of addition libraries distributed with Qt + (for example, the \e tqui library). + + \i Plugins - Location of the Qt plugins. + + \i Data - Location of applicaton specific data for all programs + distributed with Qt. + + \endlist + + <hr> + + Implementation: + + \include distributor/distributor.ui.h +*/ diff --git a/examples/distributor/distributor.pro b/examples/distributor/distributor.pro new file mode 100644 index 000000000..81d0ec5c0 --- /dev/null +++ b/examples/distributor/distributor.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +LANGUAGE = C++ +TARGET = distributor + +CONFIG += qt warn_on + +REQUIRES = full-config + +SOURCES += main.cpp +FORMS = distributor.ui diff --git a/examples/distributor/distributor.ui b/examples/distributor/distributor.ui new file mode 100644 index 000000000..8deff8107 --- /dev/null +++ b/examples/distributor/distributor.ui @@ -0,0 +1,427 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>Distributor</class> +<widget class="TQWizard"> + <property name="name"> + <cstring>Distributor</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>522</width> + <height>422</height> + </rect> + </property> + <property name="caption"> + <string>TQt Distribution Wizard</string> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>selectLibrary</cstring> + </property> + <attribute name="title"> + <string><b>Select TQt Library File</b></string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="2" column="0"> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + <widget class="TQLineEdit" row="1" column="0"> + <property name="name"> + <cstring>libFilename</cstring> + </property> + <property name="frameShape"> + <enum>LineEditPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>libBrowseButton</cstring> + </property> + <property name="text"> + <string>&Browse...</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string><p>Enter the filename of the TQt library to modify, or use the <i>Browse</i> button to browse for the library.</p> +<p>This wizard will allow you to modify the installation paths stored in the library.</p></string> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>modifyPaths</cstring> + </property> + <attribute name="title"> + <string><b>Modify Installation Paths</b></string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="11" column="1"> + <property name="name"> + <cstring>spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>prefixBuddy</cstring> + </property> + <property name="text"> + <string>Installation &Prefix</string> + </property> + <property name="buddy" stdset="0"> + <cstring>prefixPath</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="8" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>libPath</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQLineEdit" row="1" column="1"> + <property name="name"> + <cstring>prefixPath</cstring> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQLineEdit" row="9" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>plgPath</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQPushButton" row="1" column="2"> + <property name="name"> + <cstring>prefixBrowseButton</cstring> + </property> + <property name="text"> + <string>&Browse...</string> + </property> + </widget> + <widget class="TQLineEdit" row="10" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>datPath</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQLabel" row="0" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string><p>Enter the new <i>Installation Prefix</i> for the selected TQt library, or use the <i>Browse</i> button to browse for the desired directory.</p> +<p>Use the <i>Next</i> button to review your choices and perform the modification.</p></string> + </property> + </widget> + <widget class="Line" row="2" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="TQLineEdit" row="6" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>docPath</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQLineEdit" row="7" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>hdrPath</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQLabel" row="3" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string><p>The various paths below are set automatically according to the chosen <i>Installation Prefix</i>. Uncheck the <i>Set paths from Installation Prefix</i> box to enter custom values.</p></string> + </property> + </widget> + <widget class="TQLineEdit" row="5" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>binPath</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maxLength"> + <number>255</number> + </property> + </widget> + <widget class="TQCheckBox" row="4" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>autoSet</cstring> + </property> + <property name="text"> + <string>Set paths from Installation Prefix</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLabel" row="6" column="0"> + <property name="name"> + <cstring>docBuddy</cstring> + </property> + <property name="text"> + <string>Documentation</string> + </property> + </widget> + <widget class="TQLabel" row="10" column="0"> + <property name="name"> + <cstring>datBuddy</cstring> + </property> + <property name="text"> + <string>Data</string> + </property> + </widget> + <widget class="TQLabel" row="7" column="0"> + <property name="name"> + <cstring>hdrBuddy</cstring> + </property> + <property name="text"> + <string>Headers</string> + </property> + </widget> + <widget class="TQLabel" row="8" column="0"> + <property name="name"> + <cstring>libBuddy</cstring> + </property> + <property name="text"> + <string>Libraries</string> + </property> + </widget> + <widget class="TQLabel" row="9" column="0"> + <property name="name"> + <cstring>plgBuddy</cstring> + </property> + <property name="text"> + <string>Plugins</string> + </property> + </widget> + <widget class="TQLabel" row="5" column="0"> + <property name="name"> + <cstring>binBuddy</cstring> + </property> + <property name="text"> + <string>Binaries</string> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>verifyMods</cstring> + </property> + <attribute name="title"> + <string><b>Verify Modifications</b></string> + </attribute> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="text"> + <string><p><b>Current Library File:</b> %1</p> +<table border=0> + <tr><td><b>New Installation Prefix:</b></td><td>%2</td></tr> + <tr><td></td><td></td></tr> + <tr><td><b>Binaries Path:</b></td><td>%3</td></tr> + <tr><td><b>Documentation Path:</b></td><td>%4</td></tr> + <tr><td><b>Headers Path:</b></td><td>%5</td></tr> + <tr><td><b>Libraries Path:</b></td><td>%6</td></tr> + <tr><td><b>Plugins Path:</b></td><td>%7</td></tr> + <tr><td><b>Data Path:</b></td><td>%8</td></tr> +</table> +<p>Please verify that these options are correct. Press the <i>Finish</i> button to apply these modifications to the TQt library. Use the <i>Back</i> button to make corrections. Use the <i>Cancel</i> button to abort.</p></string> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop</set> + </property> + </widget> + </hbox> + </widget> +</widget> +<connections> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>binPath</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>docPath</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>hdrPath</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>libPath</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>plgPath</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>datPath</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>libFilename</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>Distributor</receiver> + <slot>checkLibFilename(const TQString&)</slot> + </connection> + <connection> + <sender>libBrowseButton</sender> + <signal>clicked()</signal> + <receiver>Distributor</receiver> + <slot>browseLibFilename()</slot> + </connection> + <connection> + <sender>prefixPath</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>Distributor</receiver> + <slot>checkInstallationPrefix(const TQString&)</slot> + </connection> + <connection> + <sender>prefixBrowseButton</sender> + <signal>clicked()</signal> + <receiver>Distributor</receiver> + <slot>browseInstallationPrefix()</slot> + </connection> + <connection> + <sender>autoSet</sender> + <signal>toggled(bool)</signal> + <receiver>Distributor</receiver> + <slot>toggleAutoSet(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>libFilename</tabstop> + <tabstop>libBrowseButton</tabstop> + <tabstop>prefixPath</tabstop> + <tabstop>prefixBrowseButton</tabstop> + <tabstop>autoSet</tabstop> + <tabstop>binPath</tabstop> + <tabstop>docPath</tabstop> + <tabstop>hdrPath</tabstop> + <tabstop>libPath</tabstop> + <tabstop>plgPath</tabstop> + <tabstop>datPath</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">distributor.ui.h</include> +</includes> +<variables> + <variable access="private">TQTimer *timer;</variable> +</variables> +<slots> + <slot>checkLibFilename( const TQString & filename )</slot> + <slot>browseLibFilename()</slot> + <slot>checkLibData()</slot> + <slot>checkInstallationPrefix( const TQString &filename )</slot> + <slot>browseInstallationPrefix()</slot> + <slot>toggleAutoSet( bool autoset )</slot> + <slot>accept()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> + <function>showPage( TQWidget * page )</function> +</functions> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/distributor/distributor.ui.h b/examples/distributor/distributor.ui.h new file mode 100644 index 000000000..c927cda5e --- /dev/null +++ b/examples/distributor/distributor.ui.h @@ -0,0 +1,383 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** TQt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + +#include <qapplication.h> +#include <qcursor.h> +#include <qeventloop.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qfileinfo.h> +#include <qlineedit.h> +#include <qmessagebox.h> +#include <qpushbutton.h> +#include <qtimer.h> + + +void Distributor::init() +{ + timer = new TQTimer( this ); + connect( timer, SIGNAL(timeout()), SLOT(checkLibData()) ); + + cancelButton()->setAutoDefault( FALSE ); + backButton()->setAutoDefault( FALSE ); + + setNextEnabled( selectLibrary, FALSE ); + + setHelpEnabled( selectLibrary, FALSE ); + setHelpEnabled( modifyPaths, FALSE ); + setHelpEnabled( verifyMods, FALSE ); + + setFinishEnabled( verifyMods, TRUE ); +} + +void Distributor::showPage( TQWidget *page ) +{ + if ( page == selectLibrary ) { + nextButton()->setDefault( TRUE ); + libFilename->setFocus(); + } else if ( page == modifyPaths ) { + nextButton()->setDefault( TRUE ); + prefixPath->selectAll(); + prefixPath->setFocus(); + } else if ( page == verifyMods ) { + finishButton()->setDefault( TRUE ); + finishButton()->setFocus(); + + TQString labeltext = + tr("<p><b>Current Library File:</b> %1</p>" + "<table border=0>" + "<tr><td><b>New Installation Prefix:</b></td><td>%2</td></tr>" + "<tr><td></td><td></td></tr>" + "<tr><td><b>Binaries Path:</b></td><td>%3</td></tr>" + "<tr><td><b>Documentation Path:</b></td><td>%4</td></tr>" + "<tr><td><b>Headers Path:</b></td><td>%5</td></tr>" + "<tr><td><b>Libraries Path:</b></td><td>%6</td></tr>" + "<tr><td><b>Plugins Path:</b></td><td>%7</td></tr>" + "<tr><td><b>Data Path:</b></td><td>%8</td></tr>" + "</table>" + "<p>Please verify that these options are correct. Press the " + "<i>Finish</i> button to apply these modifications to the TQt " + "library. Use the <i>Back</i> button to make corrections. Use " + "the <i>Cancel</i> button to abort.</p>") + .arg( libFilename->text() ) + .arg( prefixPath->text() ) + .arg( binPath->text() ) + .arg( docPath->text() ) + .arg( hdrPath->text() ) + .arg( libPath->text() ) + .arg( plgPath->text() ) + .arg( datPath->text() ); + textLabel4->setText( labeltext ); + } + + TQWizard::showPage( page ); +} + +void Distributor::checkLibFilename( const TQString &filename ) +{ + setNextEnabled( selectLibrary, FALSE ); + + TQFileInfo fileinfo( filename ); + if ( ! filename.isEmpty() && fileinfo.exists() && + fileinfo.isReadable() && fileinfo.isWritable() && + fileinfo.isFile() && !fileinfo.isSymLink() ) + timer->start( 500, TRUE ); +} + +void Distributor::browseLibFilename() +{ + TQString filename = + TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + libFilename->setText( filename ); +} + +static char *find_pattern( char *h, const char *n, ulong hlen ) +{ + if ( ! h || ! n || hlen == 0 ) + return 0; + +#ifdef Q_OS_UNIX + size_t nlen; +#else + ulong nlen; +#endif + + char nc = *n++; + nlen = strlen( n ); + char hc; + + do { + do { + hc = *h++; + if ( hlen-- < 1 ) + return 0; + } while ( hc != nc ); + + if ( nlen > hlen ) + return 0; + } while ( qstrncmp( h, n, nlen ) != 0 ); + return h + nlen; +} + +void Distributor::checkLibData() +{ + struct step { + const char *key; + TQCString value; + bool done; + } steps[7]; + + steps[0].key = "qt_nstpath="; + steps[0].done = FALSE; + + steps[1].key = "qt_binpath="; + steps[1].done = FALSE; + + steps[2].key = "qt_docpath="; + steps[2].done = FALSE; + + steps[3].key = "qt_hdrpath="; + steps[3].done = FALSE; + + steps[4].key = "qt_libpath="; + steps[4].done = FALSE; + + steps[5].key = "qt_plgpath="; + steps[5].done = FALSE; + + steps[6].key = "qt_datpath="; + steps[6].done = FALSE; + + uint completed = 0; + uint total_steps = sizeof(steps) / sizeof(step); + + TQFile file( libFilename->text() ); + if ( file.open( IO_ReadOnly ) ) { + TQApplication::setOverrideCursor( WaitCursor ); + + // instead of reading in the entire file, do the search in chunks + char data[60000]; + ulong offset = 0; + + while ( ! file.atEnd() && completed < total_steps ) { + TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput ); + + ulong len = file.readBlock( data, sizeof(data) ); + if ( len < 267 ) { + // not enough room to make any modifications... stop + break; + } + + for ( uint x = 0; x < total_steps; ++x ) { + if ( steps[x].done ) continue; + + char *s = find_pattern( data, steps[x].key, len ); + if ( s ) { + ulong where = s - data; + if ( len - where < 256 ) { + // not enough space left to write the full + // path... move the file pointer back to just + // before the pattern and continue + offset += where - 11; + file.at( offset ); + len = file.readBlock( data, sizeof(data) ); + --x; // retry the current step + continue; + } + + steps[x].value = s; + steps[x].done = TRUE; + + ++completed; + } + } + + // move to the new read position + offset += len - 11; + file.at( offset ); + } + + file.close(); + + TQApplication::restoreOverrideCursor(); + } + + if ( completed == total_steps ) { + setNextEnabled( selectLibrary, TRUE ); + + TQString prefix = TQFile::decodeName( steps[0].value ); + prefixPath->setText( prefix ); + + TQString def_bin = prefix + TQString::fromLatin1( "/bin" ); + TQString def_doc = prefix + TQString::fromLatin1( "/doc" ); + TQString def_hdr = prefix + TQString::fromLatin1( "/include" ); + TQString def_lib = prefix + TQString::fromLatin1( "/lib" ); + TQString def_plg = prefix + TQString::fromLatin1( "/plugins" ); + TQString def_dat = prefix; + + TQString bin = TQFile::decodeName( steps[1].value ); + TQString doc = TQFile::decodeName( steps[2].value ); + TQString hdr = TQFile::decodeName( steps[3].value ); + TQString lib = TQFile::decodeName( steps[4].value ); + TQString plg = TQFile::decodeName( steps[5].value ); + TQString dat = TQFile::decodeName( steps[6].value ); + + autoSet->setChecked( def_bin == bin && + def_doc == doc && + def_hdr == hdr && + def_lib == lib && + def_plg == plg && + def_dat == dat ); + + if ( ! autoSet->isChecked() ) { + binPath->setText( bin ); + docPath->setText( doc ); + hdrPath->setText( hdr ); + libPath->setText( lib ); + plgPath->setText( plg ); + datPath->setText( dat ); + } + } +} + +void Distributor::checkInstallationPrefix( const TQString &prefix ) +{ + if ( autoSet->isChecked() ) { + binPath->setText( prefix + TQString::fromLatin1( "/bin" ) ); + docPath->setText( prefix + TQString::fromLatin1( "/doc" ) ); + hdrPath->setText( prefix + TQString::fromLatin1( "/include" ) ); + libPath->setText( prefix + TQString::fromLatin1( "/lib" ) ); + plgPath->setText( prefix + TQString::fromLatin1( "/plugins" ) ); + datPath->setText( prefix ); + } +} + +void Distributor::browseInstallationPrefix() +{ + TQString prefix = + TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + prefixPath->setText( prefix ); +} + + +void Distributor::toggleAutoSet( bool autoset ) +{ + if ( autoset ) checkInstallationPrefix( prefixPath->text() ); +} + +void Distributor::accept() +{ + struct step { + const char *key; + TQCString value; + bool done; + } steps[7]; + + steps[0].key = "qt_nstpath="; + steps[0].value = TQFile::encodeName( prefixPath->text() ); + steps[0].done = FALSE; + + steps[1].key = "qt_binpath="; + steps[1].value = TQFile::encodeName( binPath->text() ); + steps[1].done = FALSE; + + steps[2].key = "qt_docpath="; + steps[2].value = TQFile::encodeName( docPath->text() ); + steps[2].done = FALSE; + + steps[3].key = "qt_hdrpath="; + steps[3].value = TQFile::encodeName( hdrPath->text() ); + steps[3].done = FALSE; + + steps[4].key = "qt_libpath="; + steps[4].value = TQFile::encodeName( libPath->text() ); + steps[4].done = FALSE; + + steps[5].key = "qt_plgpath="; + steps[5].value = TQFile::encodeName( plgPath->text() ); + steps[5].done = FALSE; + + steps[6].key = "qt_datpath="; + steps[6].value = TQFile::encodeName( datPath->text() ); + steps[6].done = FALSE; + + uint completed = 0; + uint total_steps = sizeof(steps) / sizeof(step); + + TQFile file( libFilename->text() ); + if ( file.open( IO_ReadWrite ) ) { + TQApplication::setOverrideCursor( WaitCursor ); + + // instead of reading in the entire file, do the search in chunks + char data[60000]; + ulong offset = 0; + + while ( ! file.atEnd() && completed < total_steps ) { + TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput ); + + ulong len = file.readBlock( data, sizeof(data) ); + if ( len < 267 ) { + // not enough room to make any modifications... stop + break; + } + + uint completed_save = completed; + for ( uint x = 0; x < total_steps; ++x ) { + if ( steps[x].done ) continue; + + char *s = find_pattern( data, steps[x].key, len ); + if ( s ) { + ulong where = s - data; + if ( len - where < 256 ) { + // not enough space left to write the full + // path... move the file pointer back to just + // before the pattern and continue + offset += where - 11; + file.at( offset ); + len = file.readBlock( data, sizeof(data) ); + --x; // retry the current step + continue; + } + + qstrcpy( s, steps[x].value ); + steps[x].done = TRUE; + + ++completed; + } + } + + if ( completed != completed_save ) { + // something changed... move file pointer back to + // where the data was read and write the new data + file.at( offset ); + file.writeBlock( data, len ); + } + + // move to the new read position + offset += len - 11; + file.at( offset ); + } + + file.close(); + + TQApplication::restoreOverrideCursor(); + } + + if ( completed != total_steps ) { + TQMessageBox::information( this, + tr("TQt Distribution Wizard"), + tr("<p><h3>Modifications failed.</h3></p>" + "<p>Please make sure that you have permission " + "to write the selected file, and that the library " + "is properly built.</p>") ); + return; + } + + TQWizard::accept(); +} diff --git a/examples/distributor/main.cpp b/examples/distributor/main.cpp new file mode 100644 index 000000000..2a8a30cbe --- /dev/null +++ b/examples/distributor/main.cpp @@ -0,0 +1,11 @@ +#include <qapplication.h> +#include "distributor.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + Distributor w; + w.show(); + a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) ); + return a.exec(); +} diff --git a/examples/dragdrop/dragdrop.doc b/examples/dragdrop/dragdrop.doc new file mode 100644 index 000000000..25d3170aa --- /dev/null +++ b/examples/dragdrop/dragdrop.doc @@ -0,0 +1,14 @@ +/*! \page dragdrop-example.html + + \ingroup examples + \title Drag and Drop + + This program demonstrates Qt's drag and drop functionality. + + See $QTDIR/examples/dragdrop for the source code. + +*/ + + + + diff --git a/examples/dragdrop/dragdrop.pro b/examples/dragdrop/dragdrop.pro new file mode 100644 index 000000000..e560fbf96 --- /dev/null +++ b/examples/dragdrop/dragdrop.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = dragdrop + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = dropsite.h \ + secret.h +SOURCES = dropsite.cpp \ + main.cpp \ + secret.cpp diff --git a/examples/dragdrop/dropsite.cpp b/examples/dragdrop/dropsite.cpp new file mode 100644 index 000000000..a1df3de21 --- /dev/null +++ b/examples/dragdrop/dropsite.cpp @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Drop site example implementation +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "dropsite.h" +#include "secret.h" +#include <qevent.h> +#include <qpixmap.h> +#include <qdragobject.h> +#include <qimage.h> +#include <qdir.h> + + +DropSite::DropSite( TQWidget * parent, const char * name ) + : TQLabel( parent, name ) +{ + setAcceptDrops(TRUE); +} + + +DropSite::~DropSite() +{ + // nothing necessary +} + + +void DropSite::dragMoveEvent( TQDragMoveEvent *e ) +{ + // Check if you want the drag at e->pos()... + // Give the user some feedback - only copy is possible + e->acceptAction( e->action() == TQDropEvent::Copy ); +} + + +void DropSite::dragEnterEvent( TQDragEnterEvent *e ) +{ + // Check if you want the drag... + if ( SecretDrag::canDecode( e ) + || TQTextDrag::canDecode( e ) + || TQImageDrag::canDecode( e ) + || TQUriDrag::canDecode( e ) ) + { + e->accept(); + } + + + // Give the user some feedback... + TQString t; + const char *f; + for( int i=0; (f=e->format( i )); i++ ) { + if ( *(f) ) { + if ( !t.isEmpty() ) + t += "\n"; + t += f; + } + } + emit message( t ); + setBackgroundColor(white); +} + +void DropSite::dragLeaveEvent( TQDragLeaveEvent * ) +{ + // Give the user some feedback... + emit message(""); + setBackgroundColor(lightGray); +} + + +void DropSite::dropEvent( TQDropEvent * e ) +{ + setBackgroundColor(lightGray); + + // Try to decode to the data you understand... + TQStrList strings; + if ( TQUriDrag::decode( e, strings ) ) { + TQString m("Full URLs:\n"); + for (const char* u=strings.first(); u; u=strings.next()) + m = m + " " + u + '\n'; + TQStringList files; + if ( TQUriDrag::decodeLocalFiles( e, files ) ) { + m += "Files:\n"; + for (TQStringList::Iterator i=files.begin(); i!=files.end(); ++i) + m = m + " " + TQDir::convertSeparators(*i) + '\n'; + } + setText( m ); + setMinimumSize( minimumSize().expandedTo( sizeHint() ) ); + return; + } + + TQString str; + if ( TQTextDrag::decode( e, str ) ) { + setText( str ); + setMinimumSize( minimumSize().expandedTo( sizeHint() ) ); + return; + } + + TQPixmap pm; + if ( TQImageDrag::decode( e, pm ) ) { + setPixmap( pm ); + setMinimumSize( minimumSize().expandedTo( sizeHint() ) ); + return; + } + + if ( SecretDrag::decode( e, str ) ) { + setText( str ); + setMinimumSize( minimumSize().expandedTo( sizeHint() ) ); + return; + } +} + +DragMoviePlayer::DragMoviePlayer( TQDragObject* p ) : + TQObject(p), + dobj(p), + movie("trolltech.gif" ) +{ + movie.connectUpdate(this,SLOT(updatePixmap(const TQRect&))); +} + +void DragMoviePlayer::updatePixmap( const TQRect& ) +{ + dobj->setPixmap(movie.framePixmap()); +} + +void DropSite::mousePressEvent( TQMouseEvent * /*e*/ ) +{ + TQDragObject *drobj; + if ( pixmap() ) { + drobj = new TQImageDrag( pixmap()->convertToImage(), this ); +#if 1 + TQPixmap pm; + pm.convertFromImage(pixmap()->convertToImage().smoothScale( + pixmap()->width()/3,pixmap()->height()/3)); + drobj->setPixmap(pm,TQPoint(-5,-7)); +#else + // Try it. + (void)new DragMoviePlayer(drobj); +#endif + } else { + drobj = new TQTextDrag( text(), this ); + } + drobj->dragCopy(); +} + + +void DropSite::backgroundColorChange( const TQColor & ) +{ + // Reduce flicker by using repaint() rather than update() + repaint(); +} diff --git a/examples/dragdrop/dropsite.h b/examples/dragdrop/dropsite.h new file mode 100644 index 000000000..0179c5497 --- /dev/null +++ b/examples/dragdrop/dropsite.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Drop site example implementation +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef DROPSITE_H +#define DROPSITE_H + +#include <qlabel.h> +#include <qmovie.h> +#include "qdropsite.h" + +class TQDragObject; + +class DropSite: public TQLabel +{ + Q_OBJECT +public: + DropSite( TQWidget * parent = 0, const char * name = 0 ); + ~DropSite(); + +signals: + void message( const TQString& ); + +protected: + void dragEnterEvent( TQDragEnterEvent * ); + void dragMoveEvent( TQDragMoveEvent * ); + void dragLeaveEvent( TQDragLeaveEvent * ); + void dropEvent( TQDropEvent * ); + void backgroundColorChange( const TQColor& ); + + // this is a normal even + void mousePressEvent( TQMouseEvent * ); +}; + +class DragMoviePlayer : public TQObject { + Q_OBJECT + TQDragObject* dobj; + TQMovie movie; +public: + DragMoviePlayer(TQDragObject*); +private slots: + void updatePixmap( const TQRect& ); +}; + + +#endif diff --git a/examples/dragdrop/main.cpp b/examples/dragdrop/main.cpp new file mode 100644 index 000000000..539c8251a --- /dev/null +++ b/examples/dragdrop/main.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Ritual main() for TQt applications +** +** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "dropsite.h" +#include "secret.h" +#include <qlayout.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qpixmap.h> + +static void addStuff( TQWidget * parent, bool image, bool secret = FALSE ) +{ + TQVBoxLayout * tll = new TQVBoxLayout( parent, 10 ); + DropSite * d = new DropSite( parent ); + d->setFrameStyle( TQFrame::Sunken + TQFrame::WinPanel ); + tll->addWidget( d ); + if ( image ) { + TQPixmap stuff; + if ( !stuff.load( "trolltech.bmp" ) ) { + stuff = TQPixmap(20,20); + stuff.fill(TQt::green); + } + d->setPixmap( stuff ); + } else { + d->setText("Drag and Drop"); + } + d->setFont(TQFont("Helvetica",18)); + if ( secret ) { + SecretSource *s = new SecretSource( 42, parent ); + tll->addWidget( s ); + } + + TQLabel * format = new TQLabel( "\n\n\n\nNone\n\n\n\n", parent ); + tll->addWidget( format ); + tll->activate(); + parent->resize( parent->sizeHint() ); + + TQObject::connect( d, SIGNAL(message(const TQString&)), + format, SLOT(setText(const TQString&)) ); +} + + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + + TQWidget mw; + addStuff( &mw, TRUE ); + mw.setCaption( "TQt Example - Drag and Drop" ); + mw.show(); + + TQWidget mw2; + addStuff( &mw2, FALSE ); + mw2.setCaption( "TQt Example - Drag and Drop" ); + mw2.show(); + + TQWidget mw3; + addStuff( &mw3, TRUE, TRUE ); + mw3.setCaption( "TQt Example - Drag and Drop" ); + mw3.show(); + + TQObject::connect(qApp,SIGNAL(lastWindowClosed()),qApp,SLOT(tquit())); + return a.exec(); +} diff --git a/examples/dragdrop/secret.cpp b/examples/dragdrop/secret.cpp new file mode 100644 index 000000000..c90e52816 --- /dev/null +++ b/examples/dragdrop/secret.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Custom MIME type implementation example +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "secret.h" +#include <qevent.h> + + +//create the object withe the secret byte +SecretDrag::SecretDrag( uchar secret, TQWidget * parent, const char * name ) + : TQStoredDrag( "secret/magic", parent, name ) +{ + TQByteArray data(1); + data[0]= secret; + setEncodedData( data ); +} + + +bool SecretDrag::canDecode( TQDragMoveEvent* e ) +{ + return e->provides( "secret/magic" ); +} + +//decode it into a string +bool SecretDrag::decode( TQDropEvent* e, TQString& str ) +{ + TQByteArray payload = e->data( "secret/magic" ); + if ( payload.size() ) { + e->accept(); + TQString msg; + msg.sprintf("The secret number is %d", payload[0] ); + str = msg; + return TRUE; + } + return FALSE; +} + + +SecretSource::SecretSource( int secret, TQWidget *parent, const char * name ) + : TQLabel( "Secret", parent, name ) +{ + setBackgroundColor( blue.light() ); + setFrameStyle( Box | Sunken ); + setMinimumHeight( sizeHint().height()*2 ); + setAlignment( AlignCenter ); + mySecret = secret; +} + +SecretSource::~SecretSource() +{ +} + +/* XPM */ +static const char * picture_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"X c #FFFF00", +" ..... ", +" ..XXXXX.. ", +" .XXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XX..XXX..XX. ", +".XXXXXXXXXXXXX. ", +".XX...XXX...XX. ", +".XXX..XXX..XXX. ", +".XXXXXXXXXXXXX. ", +".XXXXXX.XXXXXX. ", +" .XX.XX.XX.XX. ", +" .XXX..X..XXX. ", +" .XXXXXXXXX. ", +" ..XXXXX.. ", +" ..... ", +" "}; + +void SecretSource::mousePressEvent( TQMouseEvent * /*e*/ ) +{ + SecretDrag *sd = new SecretDrag( mySecret, this ); + sd->setPixmap(TQPixmap(picture_xpm),TQPoint(8,8)); + sd->dragCopy(); + mySecret++; +} diff --git a/examples/dragdrop/secret.h b/examples/dragdrop/secret.h new file mode 100644 index 000000000..5b027db81 --- /dev/null +++ b/examples/dragdrop/secret.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Custom MIME type implementation example +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef SECRETDRAG_H +#define SECRETDRAG_H + +#include <qdragobject.h> +#include <qlabel.h> + +class SecretDrag: public TQStoredDrag { +public: + SecretDrag( uchar, TQWidget * parent = 0, const char * name = 0 ); + ~SecretDrag() {}; + + static bool canDecode( TQDragMoveEvent* e ); + static bool decode( TQDropEvent* e, TQString& s ); +}; + + +class SecretSource: public TQLabel +{ +public: + SecretSource( int secret, TQWidget *parent = 0, const char * name = 0 ); + ~SecretSource(); + +protected: + void mousePressEvent( TQMouseEvent * ); +private: + int mySecret; +}; + +#endif diff --git a/examples/dragdrop/trolltech.bmp b/examples/dragdrop/trolltech.bmp Binary files differnew file mode 100644 index 000000000..220861e2e --- /dev/null +++ b/examples/dragdrop/trolltech.bmp diff --git a/examples/dragdrop/trolltech.gif b/examples/dragdrop/trolltech.gif Binary files differnew file mode 100644 index 000000000..f674369ef --- /dev/null +++ b/examples/dragdrop/trolltech.gif diff --git a/examples/drawdemo/README b/examples/drawdemo/README new file mode 100644 index 000000000..273004043 --- /dev/null +++ b/examples/drawdemo/README @@ -0,0 +1,2 @@ +The drawdemo program demonstrates several drawing functions and printer +output. diff --git a/examples/drawdemo/drawdemo.cpp b/examples/drawdemo/drawdemo.cpp new file mode 100644 index 000000000..63211057e --- /dev/null +++ b/examples/drawdemo/drawdemo.cpp @@ -0,0 +1,312 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qwidget.h> +#include <qpainter.h> +#include <qprinter.h> +#include <qpushbutton.h> +#include <qradiobutton.h> +#include <qbuttongroup.h> +#include <qapplication.h> +#include <math.h> + +// +// First we define the functionality our demo should present +// to the user. You might add different demo-modes if you wish so. +// + +// +// This function draws a color wheel. +// The coordinate system x=(0..500), y=(0..500) spans the paint device. +// + +void drawColorWheel( TQPainter *p ) +{ + TQFont f( "times", 18, TQFont::Bold ); + p->setFont( f ); + p->setPen( TQt::black ); + p->setWindow( 0, 0, 500, 500 ); // defines coordinate system + + for ( int i=0; i<36; i++ ) { // draws 36 rotated rectangles + + TQWMatrix matrix; + matrix.translate( 250.0F, 250.0F ); // move to center + matrix.shear( 0.0F, 0.3F ); // twist it + matrix.rotate( (float)i*10 ); // rotate 0,10,20,.. degrees + p->setWorldMatrix( matrix ); // use this world matrix + + TQColor c; + c.setHsv( i*10, 255, 255 ); // rainbow effect + p->setBrush( c ); // solid fill with color c + p->drawRect( 70, -10, 80, 10 ); // draw the rectangle + + TQString n; + n.sprintf( "H=%d", i*10 ); + p->drawText( 80+70+5, 0, n ); // draw the hue number + } +} + + +// +// This function draws a few lines of text using different fonts. +// + +void drawFonts( TQPainter *p ) +{ + static const char *fonts[] = { "Helvetica", "Courier", "Times", 0 }; + static int sizes[] = { 10, 12, 18, 24, 36, 0 }; + int f = 0; + int y = 0; + while ( fonts[f] ) { + int s = 0; + while ( sizes[s] ) { + TQFont font( fonts[f], sizes[s] ); + p->setFont( font ); + TQFontMetrics fm = p->fontMetrics(); + y += fm.ascent(); + p->drawText( 10, y, "Quartz Glyph Job Vex'd Cwm Finks" ); + y += fm.descent(); + s++; + } + f++; + } +} + + +// +// This function draws some shapes +// + +void drawShapes( TQPainter *p ) +{ + TQBrush b1( TQt::blue ); + TQBrush b2( TQt::green, TQt::Dense6Pattern ); // green 12% fill + TQBrush b3( TQt::NoBrush ); // void brush + TQBrush b4( TQt::CrossPattern ); // black cross pattern + + p->setPen( TQt::red ); + p->setBrush( b1 ); + p->drawRect( 10, 10, 200, 100 ); + p->setBrush( b2 ); + p->drawRoundRect( 10, 150, 200, 100, 20, 20 ); + p->setBrush( b3 ); + p->drawEllipse( 250, 10, 200, 100 ); + p->setBrush( b4 ); + p->drawPie( 250, 150, 200, 100, 45*16, 90*16 ); +} + + +typedef void (*draw_func)(TQPainter*); + +struct DrawThing { + draw_func f; + const char *name; +}; + +// +// All previously implemented functions are collected +// in the following "table". +// If you implement different functionality, your new draw +// function must be assigned here with a function pointer and +// description. +// Leave the zeros at the end, they will be used +// as markers referring to the end of the array. +// + +DrawThing ourDrawFunctions[] = { +// name of the function, title presented to the user + { drawColorWheel, "Draw color wheel" }, + { drawFonts, "Draw fonts" }, + { drawShapes, "Draw shapes" }, + { 0, 0 } }; + + + +class DrawView : public TQWidget +{ + Q_OBJECT +public: + DrawView(); + ~DrawView(); +public slots: + void updateIt( int ); + void printIt(); +protected: + void drawIt( TQPainter * ); + void paintEvent( TQPaintEvent * ); + void resizeEvent( TQResizeEvent * ); +private: + TQPrinter *printer; + TQButtonGroup *bgroup; + TQPushButton *print; + int drawindex; + int maxindex; +}; + + +// +// Construct the DrawView with buttons. +// + +DrawView::DrawView() +{ + setCaption( "TQt Draw Demo Application" ); + setBackgroundMode(PaletteBase); + + // Create a button group to contain all buttons + bgroup = new TQButtonGroup( this ); + bgroup->resize( 200, 200 ); + connect( bgroup, SIGNAL(clicked(int)), SLOT(updateIt(int)) ); + + // Calculate the size for the radio buttons + int maxwidth = 80; + int maxheight = 10; + int i; + const char *n; + TQFontMetrics fm = bgroup->fontMetrics(); + + // Find out the longest function description. + // Here we make use of the last "0,0"-entry in the + // ourDrawFunctions-array. + for ( i=0; (n=ourDrawFunctions[i].name) != 0; i++ ) { + int w = fm.width( n ); + maxwidth = TQMAX(w,maxwidth); // TQMAX is a macro defined in qglobal.h + // and returns the biggest of to values. + // Due to its macro nature one should use it with care and with + // constant parameters only. + } + + maxwidth = maxwidth + 30; // allow 30 pixels for radiobuttons + + for ( i=0; (n=ourDrawFunctions[i].name) != 0; i++ ) { + TQRadioButton *rb = new TQRadioButton( n, bgroup ); + rb->setGeometry( 10, i*30+10, maxwidth, 30 ); + + maxheight += 30; + + if ( i == 0 ) + rb->setChecked( TRUE ); + } + + maxheight += 10; // maxheight is now 10 pixels upper margin + // plus number_of_drawfunctions * 30 + // plus 10 pixels lower margin + + drawindex = 0; // draw first thing + maxindex = i; + + maxwidth += 20; // add some margin, this results in the + // final width of bgroup + + bgroup->resize( maxwidth, maxheight ); // resize bgroup to its final size + // when no printersupport is provided + + +// If -- at compile time -- printer support will be disabled, +// we won't set up printing functionality. + +#ifndef QT_NO_PRINTER + + printer = new TQPrinter; + + // Create and setup the print button + print = new TQPushButton( "Print...", bgroup ); + print->resize( 80, 30 ); + print->move( maxwidth/2 - print->width()/2, maxindex*30+20 ); + connect( print, SIGNAL(clicked()), SLOT(printIt()) ); + + // Resize bgroup to its final size when printersupport is given. + bgroup->resize( maxwidth, print->y()+print->height()+10 ); + +#endif + + resize( 640,300 ); +} + +// +// Clean up. +// +DrawView::~DrawView() +{ +#ifndef QT_NO_PRINTER + delete printer; +#endif +} + +// +// Called when a radio button is clicked. +// + +void DrawView::updateIt( int index ) +{ + if ( index < maxindex ) { + drawindex = index; + update(); + } +} + +// +// Calls the drawing function as specified by the radio buttons. +// + +void DrawView::drawIt( TQPainter *p ) +{ + (*ourDrawFunctions[drawindex].f)(p); +} + +// +// Called when the print button is clicked. +// + +void DrawView::printIt() +{ + if ( printer->setup( this ) ) { + TQPainter paint; + if( !paint.begin( printer ) ) + return; + drawIt( &paint ); + } +} + +// +// Called when the widget needs to be updated. +// + +void DrawView::paintEvent( TQPaintEvent * ) +{ + TQPainter paint( this ); + drawIt( &paint ); +} + +// +// Called when the widget has been resized. +// Moves the button group to the upper right corner +// of the widget. + +void DrawView::resizeEvent( TQResizeEvent * ) +{ + bgroup->move( width()-bgroup->width(), 0 ); +} + + +// +// Create and display our widget. +// + +#include "drawdemo.moc" + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + DrawView draw; + app.setMainWidget( &draw ); + draw.setCaption("TQt Example - Drawdemo"); + draw.show(); + return app.exec(); +} diff --git a/examples/drawdemo/drawdemo.doc b/examples/drawdemo/drawdemo.doc new file mode 100644 index 000000000..f25bd7ee6 --- /dev/null +++ b/examples/drawdemo/drawdemo.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page drawdemo-example.html + + \ingroup examples + \title Draw Demo + + This example demonstrates several drawing functions and printer output. + You can easily add you own drawing functions. + + <hr> + + Implementation: + + \include drawdemo/drawdemo.cpp +*/ + diff --git a/examples/drawdemo/drawdemo.pro b/examples/drawdemo/drawdemo.pro new file mode 100644 index 000000000..92d70c542 --- /dev/null +++ b/examples/drawdemo/drawdemo.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = drawdemo + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = drawdemo.cpp diff --git a/examples/drawlines/README b/examples/drawlines/README new file mode 100644 index 000000000..2a7c577c6 --- /dev/null +++ b/examples/drawlines/README @@ -0,0 +1,3 @@ +The connect program connects points with lines. Drag the mouse +inside the widget and release it. It was inspired by an example in a +Windows book. diff --git a/examples/drawlines/connect.cpp b/examples/drawlines/connect.cpp new file mode 100644 index 000000000..cfd785ba7 --- /dev/null +++ b/examples/drawlines/connect.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qwidget.h> +#include <qpainter.h> +#include <qapplication.h> +#include <stdlib.h> + + +const int MAXPOINTS = 2000; // maximum number of points +const int MAXCOLORS = 40; + + +// +// ConnectWidget - draws connected lines +// + +class ConnectWidget : public TQWidget +{ +public: + ConnectWidget( TQWidget *parent=0, const char *name=0 ); + ~ConnectWidget(); +protected: + void paintEvent( TQPaintEvent * ); + void mousePressEvent( TQMouseEvent *); + void mouseReleaseEvent( TQMouseEvent *); + void mouseMoveEvent( TQMouseEvent *); +private: + TQPoint *points; // point array + TQColor *colors; // color array + int count; // count = number of points + bool down; // TRUE if mouse down +}; + + +// +// Constructs a ConnectWidget. +// + +ConnectWidget::ConnectWidget( TQWidget *parent, const char *name ) + : TQWidget( parent, name, WStaticContents ) +{ + setBackgroundColor( white ); // white background + count = 0; + down = FALSE; + points = new TQPoint[MAXPOINTS]; + colors = new TQColor[MAXCOLORS]; + for ( int i=0; i<MAXCOLORS; i++ ) // init color array + colors[i] = TQColor( rand()&255, rand()&255, rand()&255 ); +} + +ConnectWidget::~ConnectWidget() +{ + delete[] points; // cleanup + delete[] colors; +} + + +// +// Handles paint events for the connect widget. +// + +void ConnectWidget::paintEvent( TQPaintEvent * ) +{ + TQPainter paint( this ); + for ( int i=0; i<count-1; i++ ) { // connect all points + for ( int j=i+1; j<count; j++ ) { + paint.setPen( colors[rand()%MAXCOLORS] ); // set random pen color + paint.drawLine( points[i], points[j] ); // draw line + } + } +} + + +// +// Handles mouse press events for the connect widget. +// + +void ConnectWidget::mousePressEvent( TQMouseEvent * ) +{ + down = TRUE; + count = 0; // start recording points + erase(); // erase widget contents +} + + +// +// Handles mouse release events for the connect widget. +// + +void ConnectWidget::mouseReleaseEvent( TQMouseEvent * ) +{ + down = FALSE; // done recording points + update(); // draw the lines +} + + +// +// Handles mouse move events for the connect widget. +// + +void ConnectWidget::mouseMoveEvent( TQMouseEvent *e ) +{ + if ( down && count < MAXPOINTS ) { + TQPainter paint( this ); + points[count++] = e->pos(); // add point + paint.drawPoint( e->pos() ); // plot point + } +} + + +// +// Create and display a ConnectWidget. +// + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + ConnectWidget connect; +#ifndef QT_NO_WIDGET_TOPEXTRA // for TQt/Embedded minimal build + connect.setCaption( "TQt Example - Draw lines"); +#endif + a.setMainWidget( &connect ); + connect.show(); + return a.exec(); +} diff --git a/examples/drawlines/drawlines.doc b/examples/drawlines/drawlines.doc new file mode 100644 index 000000000..f0abeec3b --- /dev/null +++ b/examples/drawlines/drawlines.doc @@ -0,0 +1,20 @@ + +/* +*/ +/*! \page drawlines-example.html + + \ingroup examples + \title Connect the Points + + This example shows very simple mouse-based user interaction and + painting without any world transform matrix or other advanced + features. Run the program, click the button, move the mouse, + release the button, and watch the lines get drawn. + + <hr> + + Implementation: + + \include drawlines/connect.cpp +*/ + diff --git a/examples/drawlines/drawlines.pro b/examples/drawlines/drawlines.pro new file mode 100644 index 000000000..7c4eeb8c1 --- /dev/null +++ b/examples/drawlines/drawlines.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = drawlines + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + + +HEADERS = +SOURCES = connect.cpp diff --git a/examples/examples.pro b/examples/examples.pro new file mode 100644 index 000000000..b9fe09ff2 --- /dev/null +++ b/examples/examples.pro @@ -0,0 +1,123 @@ +TEMPLATE = subdirs + +unix:!embedded:!mac:CONFIG += x11 + +SUBDIRS = aclock \ + action \ + action/toggleaction \ + addressbook \ + application \ + buttongroups \ + checklists \ + cursor \ + customlayout \ + dclock \ + demo \ + dirview \ + distributor \ + dragdrop \ + drawdemo \ + drawlines \ + extension \ + fonts \ + forever \ + gridview \ + hello \ + helpdemo \ + helpviewer \ + i18n \ + layout \ + life \ + lineedits \ + listboxcombo \ + listbox \ + listviews \ + menu \ + movies \ + picture \ + popup \ + process \ + progress \ + progressbar \ + qdir \ + qfd \ + qmag \ + qtl \ + qwerty \ + rangecontrols \ + richtext \ + rot13 \ + scribble \ + scrollview \ + showimg \ + splitter \ + tabdialog \ + tetrix \ + textedit \ + themes \ + tictac \ + tooltip \ + toplevel \ + tux \ + widgets \ + wizard \ + xform + +thread:SUBDIRS += thread/prodcons \ + thread/semaphores + +canvas:SUBDIRS += canvas +canvas:table:SUBDIRS += chart + +opengl:SUBDIRS += opengl/box \ + opengl/gear \ + opengl/glpixmap \ + opengl/overlay \ + opengl/sharedbox \ + opengl/texture + +x11:nas:SUBDIRS += sound +mac|win32:SUBDIRS += sound + +iconview:SUBDIRS += fileiconview \ + iconview \ + iconview/simple_dd + + +network:SUBDIRS += network/archivesearch \ + network/clientserver/client \ + network/clientserver/server \ + network/ftpclient \ + network/httpd \ + network/infoprotocol/infoclient \ + network/infoprotocol/infoserver \ + network/infoprotocol/infourlclient \ + network/mail \ + network/networkprotocol \ + network/remotecontrol + +workspace:SUBDIRS+= mdi + +table:SUBDIRS += table/statistics \ + table/small-table-demo \ + regexptester \ + table/bigtable \ + helpsystem + +tablet:SUBDIRS += tablet + +sql:SUBDIRS += sql + +xml:SUBDIRS += xml/outliner \ + xml/tagreader \ + xml/tagreader-with-features + +embedded:SUBDIRS += launcher + +embedded:SUBDIRS -= showimg + +win32:SUBDIRS += trayicon +embedded:SUBDIRS += trayicon + +x11:SUBDIRS += biff \ + desktop diff --git a/examples/extension/dialogform.ui b/examples/extension/dialogform.ui new file mode 100644 index 000000000..edb70c76c --- /dev/null +++ b/examples/extension/dialogform.ui @@ -0,0 +1,206 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>DialogForm</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>DialogForm</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>288</width> + <height>145</height> + </rect> + </property> + <property name="caption"> + <string>Dialog</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>sessionsCheckBox</cstring> + </property> + <property name="text"> + <string>Save/Restore &Sessions</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>loggingCheckBox</cstring> + </property> + <property name="text"> + <string>&Log Activities</string> + </property> + </widget> + </vbox> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>detailsPushButton</cstring> + </property> + <property name="text"> + <string>&Details >>></string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>okPushButton</cstring> + </property> + <property name="text"> + <string>OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>cancelPushButton</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>okPushButton</sender> + <signal>clicked()</signal> + <receiver>DialogForm</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>cancelPushButton</sender> + <signal>clicked()</signal> + <receiver>DialogForm</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>detailsPushButton</sender> + <signal>clicked()</signal> + <receiver>DialogForm</receiver> + <slot>toggleDetails()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">extension.h</include> + <include location="local" impldecl="in implementation">dialogform.ui.h</include> +</includes> +<variables> + <variable>bool extensionShown;</variable> +</variables> +<slots> + <slot>toggleDetails()</slot> +</slots> +<functions> + <function access="private">init()</function> +</functions> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/extension/dialogform.ui.h b/examples/extension/dialogform.ui.h new file mode 100644 index 000000000..d6f873f33 --- /dev/null +++ b/examples/extension/dialogform.ui.h @@ -0,0 +1,24 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions use TQt Designer which will +** update this file, preserving your code. Create an init() function in place +** of a constructor, and a destroy() function in place of a destructor. +*****************************************************************************/ + +void DialogForm::init() +{ + extensionShown = FALSE; + setExtension( new Extension( this ) ); + setOrientation( Vertical ); +} + + +void DialogForm::toggleDetails() +{ + extensionShown = !extensionShown; + showExtension( extensionShown ); + TQString text = tr( "&Details " ); + text += TQString( extensionShown ? "<<<" : ">>>" ); + detailsPushButton->setText( text ); +} diff --git a/examples/extension/extension.doc b/examples/extension/extension.doc new file mode 100644 index 000000000..98b4a3373 --- /dev/null +++ b/examples/extension/extension.doc @@ -0,0 +1,41 @@ +/*! + \page extension-dialog-example.html + + \ingroup step-by-step-examples + + + \title An Extension Dialog Example + + This example demonstrates how to create an extension dialog. + + Essentially all that is necessary is to create a standard dialog + and then create a QWidget form to be used as the extension. See + the article in \link http://doc.trolltech.com/qq/ Qt + Quarterly\endlink issue #3. + + + <hr> + + + Project file: + + \include extension/extension.pro + + <hr> + + <hr> + + Implementation: + + \include extension/mainform.ui.h + \include extension/dialogform.ui.h + \include extension/extension.ui.h + + <hr> + + Main: + + \include extension/main.cpp + + +*/ diff --git a/examples/extension/extension.pro b/examples/extension/extension.pro new file mode 100644 index 000000000..7cc65985a --- /dev/null +++ b/examples/extension/extension.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +LANGUAGE = C++ + +CONFIG += qt warn_on release + +REQUIRES = full-config nocrosscompiler + +SOURCES += main.cpp +FORMS = mainform.ui \ + dialogform.ui \ + extension.ui +DBFILE = extension.db diff --git a/examples/extension/extension.ui b/examples/extension/extension.ui new file mode 100644 index 000000000..32dcc48b7 --- /dev/null +++ b/examples/extension/extension.ui @@ -0,0 +1,114 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>Extension</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>Extension</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>258</width> + <height>128</height> + </rect> + </property> + <property name="caption"> + <string>Extension</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>Log &File</string> + </property> + <property name="buddy" stdset="0"> + <cstring>logfileLineEdit</cstring> + </property> + </widget> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>logfileLineEdit</cstring> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>browsePushButton</cstring> + </property> + <property name="text"> + <string>&Browse...</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Log What?</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>logActionsCheckBox</cstring> + </property> + <property name="text"> + <string>&Actions</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>logErrorsCheckBox</cstring> + </property> + <property name="text"> + <string>&Errors</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<includes> + <include location="local" impldecl="in implementation">extension.ui.h</include> +</includes> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/extension/extension.ui.h b/examples/extension/extension.ui.h new file mode 100644 index 000000000..e43b8f3fd --- /dev/null +++ b/examples/extension/extension.ui.h @@ -0,0 +1,7 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions use TQt Designer which will +** update this file, preserving your code. Create an init() function in place +** of a constructor, and a destroy() function in place of a destructor. +*****************************************************************************/ diff --git a/examples/extension/main.cpp b/examples/extension/main.cpp new file mode 100644 index 000000000..608ef06a6 --- /dev/null +++ b/examples/extension/main.cpp @@ -0,0 +1,11 @@ +#include <qapplication.h> +#include "mainform.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + MainForm *w = new MainForm; + w->show(); + a.connect( &a, SIGNAL( lastWindowClosed() ), w, SLOT( tquit() ) ); + return a.exec(); +} diff --git a/examples/extension/mainform.ui b/examples/extension/mainform.ui new file mode 100644 index 000000000..db156785b --- /dev/null +++ b/examples/extension/mainform.ui @@ -0,0 +1,74 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>MainForm</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>MainForm</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>284</width> + <height>120</height> + </rect> + </property> + <property name="caption"> + <string>Main Form</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>optionsPushButton</cstring> + </property> + <property name="text"> + <string>&Options...</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>tquitPushButton</cstring> + </property> + <property name="text"> + <string>&Quit</string> + </property> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>optionsPushButton</sender> + <signal>clicked()</signal> + <receiver>MainForm</receiver> + <slot>optionsDlg()</slot> + </connection> + <connection> + <sender>tquitPushButton</sender> + <signal>clicked()</signal> + <receiver>MainForm</receiver> + <slot>tquit()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">mainform.ui.h</include> +</includes> +<variables> + <variable>bool log_errors;</variable> + <variable>bool log_warnings;</variable> + <variable>bool log_actions;</variable> + <variable>bool logging;</variable> + <variable>bool sessions;</variable> + <variable>TQString log_filename;</variable> +</variables> +<slots> + <slot>optionsDlg()</slot> + <slot>tquit()</slot> +</slots> +<functions> + <function access="private">init()</function> +</functions> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/extension/mainform.ui.h b/examples/extension/mainform.ui.h new file mode 100644 index 000000000..82fc700d0 --- /dev/null +++ b/examples/extension/mainform.ui.h @@ -0,0 +1,46 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions use TQt Designer which will +** update this file, preserving your code. Create an init() function in place +** of a constructor, and a destroy() function in place of a destructor. +*****************************************************************************/ +#include "dialogform.h" +#include "extension.h" +#include <qapplication.h> +#include <qcheckbox.h> +#include <qlineedit.h> + +void MainForm::init() +{ + sessions = FALSE; + logging = FALSE; + log_filename = TQString::null; + log_errors = TRUE; + log_actions = TRUE; +} + +void MainForm::optionsDlg() +{ + DialogForm *dlg = new DialogForm( this, "dialog", TRUE ); + Extension *ext = (Extension*)dlg->extension()->qt_cast( "Extension" ); + if ( !ext ) + return; + dlg->sessionsCheckBox->setChecked( sessions ); + dlg->loggingCheckBox->setChecked( logging ); + ext->logfileLineEdit->setText( log_filename ); + ext->logErrorsCheckBox->setChecked( log_errors ); + + if ( dlg->exec() ) { + sessions = dlg->sessionsCheckBox->isChecked(); + logging = dlg->loggingCheckBox->isChecked(); + log_filename = ext->logfileLineEdit->text(); + log_errors = ext->logErrorsCheckBox->isChecked(); + } +} + + +void MainForm::tquit() +{ + TQApplication::exit( 0 ); +} diff --git a/examples/fileiconview/fileiconview.doc b/examples/fileiconview/fileiconview.doc new file mode 100644 index 000000000..0bce6c406 --- /dev/null +++ b/examples/fileiconview/fileiconview.doc @@ -0,0 +1,44 @@ +/* +*/ +/*! \page fileiconview-example.html + + \ingroup examples + \title Simple Filemanager + + This example implements a simple and not fully functional file manager using + a widget derived from QIconView to display the current directory. + To display the directory tree the + widget written in the <a href="dirview-example.html">dirview</a> example is + used. + + <hr> + + Header file of the file icon view: + + \include fileiconview/qfileiconview.h + + <hr> + + Implementation of the file icon view: + + \include fileiconview/qfileiconview.cpp + + <hr> + + Header file of the main window: + + \include fileiconview/mainwindow.h + + <hr> + + Implementation of the main window: + + \include fileiconview/mainwindow.cpp + + <hr> + + Main: + + \include fileiconview/main.cpp +*/ + diff --git a/examples/fileiconview/fileiconview.pro b/examples/fileiconview/fileiconview.pro new file mode 100644 index 000000000..48e972d7c --- /dev/null +++ b/examples/fileiconview/fileiconview.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +TARGET = fileiconview + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = iconview full-config + +HEADERS = mainwindow.h \ + qfileiconview.h \ + ../dirview/dirview.h +SOURCES = main.cpp \ + mainwindow.cpp \ + qfileiconview.cpp \ + ../dirview/dirview.cpp diff --git a/examples/fileiconview/main.cpp b/examples/fileiconview/main.cpp new file mode 100644 index 000000000..916ab1d1f --- /dev/null +++ b/examples/fileiconview/main.cpp @@ -0,0 +1,26 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "mainwindow.h" +#include "qfileiconview.h" + +#include <qapplication.h> + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + FileMainWindow mw; + mw.resize( 680, 480 ); + a.setMainWidget( &mw ); + mw.fileView()->setDirectory( "/" ); + mw.show(); + return a.exec(); +} diff --git a/examples/fileiconview/mainwindow.cpp b/examples/fileiconview/mainwindow.cpp new file mode 100644 index 000000000..c237f9aa6 --- /dev/null +++ b/examples/fileiconview/mainwindow.cpp @@ -0,0 +1,228 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "mainwindow.h" +#include "qfileiconview.h" +#include "../dirview/dirview.h" + +#include <qsplitter.h> +#include <qprogressbar.h> +#include <qlabel.h> +#include <qstatusbar.h> +#include <qtoolbar.h> +#include <qcombobox.h> +#include <qpixmap.h> +#include <qtoolbutton.h> +#include <qdir.h> +#include <qfileinfo.h> + +static const char* cdtoparent_xpm[]={ + "15 13 3 1", + ". c None", + "* c #000000", + "a c #ffff99", + "..*****........", + ".*aaaaa*.......", + "***************", + "*aaaaaaaaaaaaa*", + "*aaaa*aaaaaaaa*", + "*aaa***aaaaaaa*", + "*aa*****aaaaaa*", + "*aaaa*aaaaaaaa*", + "*aaaa*aaaaaaaa*", + "*aaaa******aaa*", + "*aaaaaaaaaaaaa*", + "*aaaaaaaaaaaaa*", + "***************"}; + +static const char* newfolder_xpm[] = { + "15 14 4 1", + " c None", + ". c #000000", + "+ c #FFFF00", + "@ c #FFFFFF", + " . ", + " ", + " . ", + " . . ", + " .... . . . ", + " .+@+@. . . ", + ".......... . .", + ".@+@+@+@+@.. ", + ".+@+@+@+@+. . ", + ".@+@+@+@+@. . ", + ".+@+@+@+@+. ", + ".@+@+@+@+@. ", + ".+@+@+@+@+. ", + "........... "}; + +FileMainWindow::FileMainWindow() + : TQMainWindow() +{ + setup(); +} + +void FileMainWindow::show() +{ + TQMainWindow::show(); +} + +void FileMainWindow::setup() +{ + TQSplitter *splitter = new TQSplitter( this ); + + dirlist = new DirectoryView( splitter, "dirlist", TRUE ); + dirlist->addColumn( "Name" ); + dirlist->addColumn( "Type" ); + Directory *root = new Directory( dirlist, "/" ); + root->setOpen( TRUE ); + splitter->setResizeMode( dirlist, TQSplitter::KeepSize ); + + fileview = new TQtFileIconView( "/", splitter ); + fileview->setSelectionMode( TQIconView::Extended ); + + setCentralWidget( splitter ); + + TQToolBar *toolbar = new TQToolBar( this, "toolbar" ); + setRightJustification( TRUE ); + + (void)new TQLabel( tr( " Path: " ), toolbar ); + + pathCombo = new TQComboBox( TRUE, toolbar ); + pathCombo->setAutoCompletion( TRUE ); + toolbar->setStretchableWidget( pathCombo ); + connect( pathCombo, SIGNAL( activated( const TQString & ) ), + this, SLOT ( changePath( const TQString & ) ) ); + + toolbar->addSeparator(); + + TQPixmap pix; + + pix = TQPixmap( cdtoparent_xpm ); + upButton = new TQToolButton( pix, "One directory up", TQString::null, + this, SLOT( cdUp() ), toolbar, "cd up" ); + + pix = TQPixmap( newfolder_xpm ); + mkdirButton = new TQToolButton( pix, "New Folder", TQString::null, + this, SLOT( newFolder() ), toolbar, "new folder" ); + + connect( dirlist, SIGNAL( folderSelected( const TQString & ) ), + fileview, SLOT ( setDirectory( const TQString & ) ) ); + connect( fileview, SIGNAL( directoryChanged( const TQString & ) ), + this, SLOT( directoryChanged( const TQString & ) ) ); + connect( fileview, SIGNAL( startReadDir( int ) ), + this, SLOT( slotStartReadDir( int ) ) ); + connect( fileview, SIGNAL( readNextDir() ), + this, SLOT( slotReadNextDir() ) ); + connect( fileview, SIGNAL( readDirDone() ), + this, SLOT( slotReadDirDone() ) ); + + setDockEnabled( DockLeft, FALSE ); + setDockEnabled( DockRight, FALSE ); + + label = new TQLabel( statusBar() ); + statusBar()->addWidget( label, 2, TRUE ); + progress = new TQProgressBar( statusBar() ); + statusBar()->addWidget( progress, 1, TRUE ); + + connect( fileview, SIGNAL( enableUp() ), + this, SLOT( enableUp() ) ); + connect( fileview, SIGNAL( disableUp() ), + this, SLOT( disableUp() ) ); + connect( fileview, SIGNAL( enableMkdir() ), + this, SLOT( enableMkdir() ) ); + connect( fileview, SIGNAL( disableMkdir() ), + this, SLOT( disableMkdir() ) ); +} + +void FileMainWindow::setPathCombo() +{ + TQString dir = caption(); + int i = 0; + bool found = FALSE; + for ( i = 0; i < pathCombo->count(); ++i ) { + if ( pathCombo->text( i ) == dir) { + found = TRUE; + break; + } + } + + if ( found ) + pathCombo->setCurrentItem( i ); + else { + pathCombo->insertItem( dir ); + pathCombo->setCurrentItem( pathCombo->count() - 1 ); + } + +} + +void FileMainWindow::directoryChanged( const TQString &dir ) +{ + setCaption( dir ); + setPathCombo(); +} + +void FileMainWindow::slotStartReadDir( int dirs ) +{ + label->setText( tr( " Reading Directory..." ) ); + progress->reset(); + progress->setTotalSteps( dirs ); +} + +void FileMainWindow::slotReadNextDir() +{ + int p = progress->progress(); + progress->setProgress( ++p ); +} + +void FileMainWindow::slotReadDirDone() +{ + label->setText( tr( " Reading Directory Done." ) ); + progress->setProgress( progress->totalSteps() ); +} + +void FileMainWindow::cdUp() +{ + TQDir dir = fileview->currentDir(); + dir.cd( ".." ); + fileview->setDirectory( dir ); +} + +void FileMainWindow::newFolder() +{ + fileview->newDirectory(); +} + +void FileMainWindow::changePath( const TQString &path ) +{ + if ( TQFileInfo( path ).exists() ) + fileview->setDirectory( path ); + else + setPathCombo(); +} + +void FileMainWindow::enableUp() +{ + upButton->setEnabled( TRUE ); +} + +void FileMainWindow::disableUp() +{ + upButton->setEnabled( FALSE ); +} + +void FileMainWindow::enableMkdir() +{ + mkdirButton->setEnabled( TRUE ); +} + +void FileMainWindow::disableMkdir() +{ + mkdirButton->setEnabled( FALSE ); +} diff --git a/examples/fileiconview/mainwindow.h b/examples/fileiconview/mainwindow.h new file mode 100644 index 000000000..0d79fd61e --- /dev/null +++ b/examples/fileiconview/mainwindow.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef MAINWIN_H +#define MAINWIN_H + +#include <qmainwindow.h> + +class TQtFileIconView; +class DirectoryView; +class TQProgressBar; +class TQLabel; +class TQComboBox; +class TQToolButton; + +class FileMainWindow : public TQMainWindow +{ + Q_OBJECT + +public: + FileMainWindow(); + + TQtFileIconView *fileView() { return fileview; } + DirectoryView *dirList() { return dirlist; } + + void show(); + +protected: + void setup(); + void setPathCombo(); + + TQtFileIconView *fileview; + DirectoryView *dirlist; + TQProgressBar *progress; + TQLabel *label; + TQComboBox *pathCombo; + TQToolButton *upButton, *mkdirButton; + +protected slots: + void directoryChanged( const TQString & ); + void slotStartReadDir( int dirs ); + void slotReadNextDir(); + void slotReadDirDone(); + void cdUp(); + void newFolder(); + void changePath( const TQString &path ); + void enableUp(); + void disableUp(); + void enableMkdir(); + void disableMkdir(); + +}; + +#endif diff --git a/examples/fileiconview/qfileiconview.cpp b/examples/fileiconview/qfileiconview.cpp new file mode 100644 index 000000000..2f7950f77 --- /dev/null +++ b/examples/fileiconview/qfileiconview.cpp @@ -0,0 +1,835 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "qfileiconview.h" +#include <qpainter.h> +#include <qstringlist.h> +#include <qpixmap.h> +#include <qmime.h> +#include <qstrlist.h> +#include <qdragobject.h> +#include <qmessagebox.h> +#include <qevent.h> +#include <qpopupmenu.h> +#include <qcursor.h> +#include <qapplication.h> +#include <qwmatrix.h> + +#include <stdlib.h> + +static const char * file_icon[]={ + "32 32 17 1", + "# c #000000", + "a c #ffffff", + "j c #808080", + "n c #a0a0a4", + "g c #c0c0c0", + "m c #004000", + "o c #000000", + "l c #004040", + "k c #404000", + "i c #c0c000", + "h c #ffff00", + "b c #ffffc0", + "e c #ff8000", + "f c #c05800", + "c c #ffa858", + "d c #ffdca8", + ". c None", + "................................", + "................................", + "................................", + "................................", + ".............#....###...........", + "...###......#a##.#aba##.........", + "..#cdb#....#aaaa#aaaaaa##.......", + "..#ecdb#..#aaaa#aaaaaaaba##.....", + "..#fecdb##aaaa#aaaaaaaaaaab##...", + "...#fecdb#aaa#aaaaaaabaabaaaa##.", + "....#fecdb#a#baaaaa#baaaaaabaaa#", + ".....#fecdb#aaaaab#a##baaaaaaa#.", + ".....##fecdb#bbba#aaaa##baaab#..", + "....#bb#fecdb#ba#aaaaaaa##aa#...", + "...#bbbb#fecdb##aaabaaaaaa##....", + "..#bbbb#b#fecdb#aaaaaaabaaaa##..", + ".#bbbb#bbb#fecdg#aaaaaaaaaaaba#.", + "#hhbb#bbbbb#fegg#iiaaaaaaaaaaaa#", + "#jhhhklibbbk#ggj#aaiiaaaaaaaaa#j", + ".#mjhhhkmikab####aaabiiaaaaaa#j.", + "...##jhhhmaaibbaaiibaaaiiaab#n..", + ".....##j#baaaiiabaaiibaabaa#n...", + "......##baibaabiibaaaiiabb#j....", + "......#bbbbiiaabbiiaaaaabon.....", + ".....#bbbbbbbiiabbaiiaab#n......", + ".....#jbbbbbbbbiibaabba#n.......", + "......##jbbbbbbbbiiaabmj........", + "........##jbbbbbbbbbb#j.........", + "..........##nbbbbbbbmj..........", + "............##jbbbb#j...........", + "..............#mjj#n............", + "................##n............."}; + +static const char * folder_icon[]={ + "32 32 11 1", + "# c #000000", + "b c #c0c000", + "d c #585858", + "a c #ffff00", + "i c #400000", + "h c #a0a0a4", + "e c #000000", + "c c #ffffff", + "f c #303030", + "g c #c0c0c0", + ". c None", + "...###..........................", + "...#aa##........................", + ".###baaa##......................", + ".#cde#baaa##....................", + ".#cccdeebaaa##..##f.............", + ".#cccccdeebaaa##aaa##...........", + ".#cccccccdeebaaaaaaaa##.........", + ".#cccccccccdeebababaaa#.........", + ".#cccccgcgghhebbbbbbbaa#........", + ".#ccccccgcgggdebbbbbbba#........", + ".#cccgcgcgcgghdeebiebbba#.......", + ".#ccccgcggggggghdeddeeba#.......", + ".#cgcgcgcggggggggghghdebb#......", + ".#ccgcggggggggghghghghd#b#......", + ".#cgcgcggggggggghghghhd#b#......", + ".#gcggggggggghghghhhhhd#b#......", + ".#cgcggggggggghghghhhhd#b#......", + ".#ggggggggghghghhhhhhhdib#......", + ".#gggggggggghghghhhhhhd#b#......", + ".#hhggggghghghhhhhhhhhd#b#......", + ".#ddhhgggghghghhhhhhhhd#b#......", + "..##ddhhghghhhhhhhhhhhdeb#......", + "....##ddhhhghhhhhhhhhhd#b#......", + "......##ddhhhhhhhhhhhhd#b#......", + "........##ddhhhhhhhhhhd#b#......", + "..........##ddhhhhhhhhd#b#......", + "............##ddhhhhhhd#b###....", + "..............##ddhhhhd#b#####..", + "................##ddhhd#b######.", + "..................##dddeb#####..", + "....................##d#b###....", + "......................####......"}; + + +static const char * link_icon[]={ + "32 32 12 1", + "# c #000000", + "h c #a0a0a4", + "b c #c00000", + "d c #585858", + "i c #400000", + "c c #ffffff", + "e c #000000", + "g c #c0c0c0", + "a c #ff0000", + "f c #303030", + "n c white", + ". c None", + "...###..........................", + "...#aa##........................", + ".###baaa##......................", + ".#cde#baaa##....................", + ".#cccdeebaaa##..##f.............", + ".#cccccdeebaaa##aaa##...........", + ".#cccccccdeebaaaaaaaa##.........", + ".#cccccccccdeebababaaa#.........", + ".#cccccgcgghhebbbbbbbaa#........", + ".#ccccccgcgggdebbbbbbba#........", + ".#cccgcgcgcgghdeebiebbba#.......", + ".#ccccgcggggggghdeddeeba#.......", + ".#cgcgcgcggggggggghghdebb#......", + ".#ccgcggggggggghghghghd#b#......", + ".#cgcgcggggggggghghghhd#b#......", + ".#gcggggggggghghghhhhhd#b#......", + ".#cgcggggggggghghghhhhd#b#......", + ".#ggggggggghghghhhhhhhdib#......", + ".#gggggggggghghghhhhhhd#b#......", + ".#hhggggghghghhhhhhhhhd#b#......", + ".#ddhhgggghghghhhhhhhhd#b#......", + "..##ddhhghghhhhhhhhhhhdeb#......", + "############hhhhhhhhhhd#b#......", + "#nnnnnnnnnn#hhhhhhhhhhd#b#......", + "#nnnnnnnnnn#hhhhhhhhhhd#b#......", + "#nn#nn#nnnn#ddhhhhhhhhd#b#......", + "#nn##n##nnn###ddhhhhhhd#b###....", + "#nnn#####nn#..##ddhhhhd#b#####..", + "#nnnnn##nnn#....##ddhhd#b######.", + "#nnnnn#nnnn#......##dddeb#####..", + "#nnnnnnnnnn#........##d#b###....", + "############..........####......"}; + +static const char * folder_locked_icon[]={ + "32 32 12 1", + "# c #000000", + "g c #808080", + "h c #c0c0c0", + "f c #c05800", + "c c #ffffff", + "d c #585858", + "b c #ffa858", + "a c #ffdca8", + "e c #000000", + "i c #a0a0a4", + "j c #c0c0c0", + ". c None", + "...###..........................", + "...#aa##........................", + ".###baaa##......................", + ".#cde#baaa##....................", + ".#cccdeeba#######...............", + ".#cccccde##fffff##..............", + ".#cccccc##fffgggg#..............", + ".#ccccccc#ffg####a##............", + ".#ccccchc#ffg#eebbaa##..........", + ".#ccccccc#ffg#ddeebbba##........", + ".#ccchccc#ffg#ihddeebbba##......", + ".#cccccaa#ffg#ihhhddeeba##......", + ".#chchhbbaafg#ihhhihidebb#......", + ".#cchccbbbbaa#ihhihihid#b#......", + ".#chchhbb#bbbaaiihihiid#b#......", + ".#hchhcbb#fbbbafhiiiiid#b#......", + ".#chchhbb#ffgbbfihiiiid#b#......", + ".#hhhhhbb#ffg#bfiiiiiid#b#......", + ".#hhhhhbbaffg#bfiiiiiid#b#......", + ".#iihhhjbbaab#bfiiiiiid#b#......", + ".#ddiihhh#bbbabfiiiiiid#b#......", + "..##ddiih#ffbbbfiiiiiid#b#......", + "....##ddi#ffg#biiiiiiid#b#......", + "......##d#ffg#iiiiiiiid#b#......", + "........##ffg#iiiiiiiid#b#......", + ".........#ffg#iiiiiiiid#b#......", + ".........#ffg#ddiiiiiid#b###....", + ".........##fg###ddiiiid#b#####..", + "...........####.##ddiid#b######.", + "..................##dddeb#####..", + "....................##d#b###....", + "......................####......"}; + +static TQPixmap *iconFolderLockedLarge = 0; +static TQPixmap *iconFolderLarge = 0; +static TQPixmap *iconFileLarge = 0; +static TQPixmap *iconLinkLarge = 0; +static TQPixmap *iconFolderLockedSmall = 0; +static TQPixmap *iconFolderSmall = 0; +static TQPixmap *iconFileSmall = 0; +static TQPixmap *iconLinkSmall = 0; + +static void cleanup() +{ + delete iconFolderLockedLarge; + iconFolderLockedLarge = 0; + delete iconFolderLarge; + iconFolderLarge = 0; + delete iconFileLarge; + iconFileLarge = 0; + delete iconLinkLarge; + iconLinkLarge = 0; + delete iconFolderLockedSmall; + iconFolderLockedSmall = 0; + delete iconFolderSmall; + iconFolderSmall = 0; + delete iconFileSmall; + iconFileSmall = 0; + delete iconLinkSmall; + iconLinkSmall = 0; +} + +/***************************************************************************** + * + * Class TQtFileIconDrag + * + *****************************************************************************/ + +TQtFileIconDrag::TQtFileIconDrag( TQWidget * dragSource, const char* name ) + : TQIconDrag( dragSource, name ) +{ +} + +const char* TQtFileIconDrag::format( int i ) const +{ + if ( i == 0 ) + return "application/x-qiconlist"; + else if ( i == 1 ) + return "text/uri-list"; + else + return 0; +} + +TQByteArray TQtFileIconDrag::encodedData( const char* mime ) const +{ + TQByteArray a; + if ( TQString( mime ) == "application/x-qiconlist" ) { + a = TQIconDrag::encodedData( mime ); + } else if ( TQString( mime ) == "text/uri-list" ) { + TQString s = urls.join( "\r\n" ); + a.resize( s.length() ); + memcpy( a.data(), s.latin1(), s.length() ); + } + return a; +} + +bool TQtFileIconDrag::canDecode( TQMimeSource* e ) +{ + return e->provides( "application/x-qiconlist" ) || + e->provides( "text/uri-list" ); +} + +void TQtFileIconDrag::append( const TQIconDragItem &item, const TQRect &pr, + const TQRect &tr, const TQString &url ) +{ + TQIconDrag::append( item, pr, tr ); + TQString ourUrl = url; +#ifdef Q_WS_WIN + if (ourUrl.length() > 2 && ourUrl[1] != ':') { + TQDir dir(ourUrl); + ourUrl = dir.absPath(); + } +#endif + urls << TQUriDrag::localFileToUri(ourUrl); +} + +/***************************************************************************** + * + * Class TQtFileIconViewItem + * + *****************************************************************************/ + +TQtFileIconViewItem::TQtFileIconViewItem( TQtFileIconView *parent, TQFileInfo *fi ) + : TQIconViewItem( parent, fi->fileName() ), itemFileName( fi->filePath() ), + itemFileInfo( fi ), checkSetText( FALSE ) +{ + vm = TQtFileIconView::Large; + + if ( itemFileInfo->isDir() ) + itemType = Dir; + else if ( itemFileInfo->isFile() ) + itemType = File; + if ( itemFileInfo->isSymLink() ) + itemType = Link; + + viewModeChanged( ( (TQtFileIconView*)iconView() )->viewMode() ); + + if ( itemFileInfo->fileName() == "." || + itemFileInfo->fileName() == ".." ) + setRenameEnabled( FALSE ); + + checkSetText = TRUE; + + TQObject::connect( &timer, SIGNAL( timeout() ), + iconView(), SLOT( openFolder() ) ); +} + +void TQtFileIconViewItem::paintItem( TQPainter *p, const TQColorGroup &cg ) +{ + if ( itemFileInfo->isSymLink() ) { + TQFont f( p->font() ); + f.setItalic( TRUE ); + p->setFont( f ); + } + + TQIconViewItem::paintItem( p, cg ); +} + +void TQtFileIconViewItem::viewModeChanged( TQtFileIconView::ViewMode m ) +{ + vm = m; + setDropEnabled( itemType == Dir && TQDir( itemFileName ).isReadable() ); + calcRect(); +} + +TQPixmap *TQtFileIconViewItem::pixmap() const +{ + switch ( itemType ) { + case Dir: + { + if ( !TQDir( itemFileName ).isReadable() ) { + if ( vm == TQtFileIconView::Small ) + return iconFolderLockedSmall; + else + return iconFolderLockedLarge; + } else { + if ( vm == TQtFileIconView::Small ) + return iconFolderSmall; + else + return iconFolderLarge; + } + } + case Link: + { + if ( vm == TQtFileIconView::Small ) + return iconLinkSmall; + else + return iconLinkLarge; + } + default: + { + if ( vm == TQtFileIconView::Small ) + return iconFileSmall; + else + return iconFileLarge; + } + } +} + +TQtFileIconViewItem::~TQtFileIconViewItem() +{ + delete itemFileInfo; +} + +void TQtFileIconViewItem::setText( const TQString &text ) +{ + if ( checkSetText ) { + if ( text == "." || text == "." || text.isEmpty() ) + return; + TQDir dir( itemFileInfo->dir() ); + if ( dir.rename( itemFileInfo->fileName(), text ) ) { + itemFileName = itemFileInfo->dirPath( TRUE ) + "/" + text; + delete itemFileInfo; + itemFileInfo = new TQFileInfo( itemFileName ); + TQIconViewItem::setText( text ); + } + } else { + TQIconViewItem::setText( text ); + } +} + +bool TQtFileIconViewItem::acceptDrop( const TQMimeSource *e ) const +{ + if ( type() == Dir && e->provides( "text/uri-list" ) && + dropEnabled() ) + return TRUE; + + return FALSE; +} + +void TQtFileIconViewItem::dropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & ) +{ + timer.stop(); + + if ( !TQUriDrag::canDecode( e ) ) { + e->ignore(); + return; + } + + TQStringList lst; + TQUriDrag::decodeLocalFiles( e, lst ); + + TQString str; + if ( e->action() == TQDropEvent::Copy ) + str = "Copy\n\n"; + else + str = "Move\n\n"; + for ( uint i = 0; i < lst.count(); ++i ) + str += TQString( " %1\n" ).arg( lst[i] ); + str += TQString( "\n" + "To\n\n" + " %1" ).arg( filename() ); + + TQMessageBox::information( iconView(), e->action() == TQDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" ); + if ( e->action() == TQDropEvent::Move ) + TQMessageBox::information( iconView(), "Remove" , str, "Not Implemented" ); + e->acceptAction(); +} + +void TQtFileIconViewItem::dragEntered() +{ + if ( type() != Dir || + type() == Dir && !TQDir( itemFileName ).isReadable() ) + return; + + ( (TQtFileIconView*)iconView() )->setOpenItem( this ); + timer.start( 1500 ); +} + +void TQtFileIconViewItem::dragLeft() +{ + if ( type() != Dir || + type() == Dir && !TQDir( itemFileName ).isReadable() ) + return; + + timer.stop(); +} + +/***************************************************************************** + * + * Class TQtFileIconView + * + *****************************************************************************/ + +TQtFileIconView::TQtFileIconView( const TQString &dir, TQWidget *parent, const char *name ) + : TQIconView( parent, name ), viewDir( dir ), newFolderNum( 0 ) +{ + if ( !iconFolderLockedLarge ) { + qAddPostRoutine( cleanup ); + TQWMatrix m; + m.scale( 0.6, 0.6 ); + TQPixmap iconpix( folder_locked_icon ); + iconFolderLockedLarge = new TQPixmap( folder_locked_icon ); + iconpix = iconpix.xForm( m ); + iconFolderLockedSmall = new TQPixmap( iconpix ); + iconpix = TQPixmap( folder_icon ); + iconFolderLarge = new TQPixmap( folder_icon ); + iconpix = iconpix.xForm( m ); + iconFolderSmall = new TQPixmap( iconpix ); + iconpix = TQPixmap( file_icon ); + iconFileLarge = new TQPixmap( file_icon ); + iconpix = iconpix.xForm( m ); + iconFileSmall = new TQPixmap( iconpix ); + iconpix = TQPixmap( link_icon ); + iconLinkLarge = new TQPixmap( link_icon ); + iconpix = iconpix.xForm( m ); + iconLinkSmall = new TQPixmap( iconpix ); + } + + vm = Large; + + setGridX( 75 ); + setResizeMode( Adjust ); + setWordWrapIconText( FALSE ); + + connect( this, SIGNAL( doubleClicked( TQIconViewItem * ) ), + this, SLOT( itemDoubleClicked( TQIconViewItem * ) ) ); + connect( this, SIGNAL( returnPressed( TQIconViewItem * ) ), + this, SLOT( itemDoubleClicked( TQIconViewItem * ) ) ); + connect( this, SIGNAL( dropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ), + this, SLOT( slotDropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ) ); + connect( this, SIGNAL( contextMenuRequested( TQIconViewItem *, const TQPoint & ) ), + this, SLOT( slotRightPressed( TQIconViewItem * ) ) ); + + setHScrollBarMode( AlwaysOff ); + setVScrollBarMode( Auto ); + + setAutoArrange( TRUE ); + setSorting( TRUE ); + openItem = 0; +} + +void TQtFileIconView::openFolder() +{ + if ( !openItem ) + return; + if ( openItem->type() != TQtFileIconViewItem::Dir || + openItem->type() == TQtFileIconViewItem::Dir && + !TQDir( openItem->itemFileName ).isReadable() ) + return; + + openItem->timer.stop(); + setDirectory( openItem->itemFileName ); +} + +void TQtFileIconView::setDirectory( const TQString &dir ) +{ + viewDir = TQDir( dir ); + readDir( viewDir ); +} + +void TQtFileIconView::setDirectory( const TQDir &dir ) +{ + viewDir = dir; + readDir( viewDir ); +} + +void TQtFileIconView::newDirectory() +{ + setAutoArrange( FALSE ); + selectAll( FALSE ); + if ( viewDir.mkdir( TQString( "New Folder %1" ).arg( ++newFolderNum ) ) ) { + TQFileInfo *fi = new TQFileInfo( viewDir, TQString( "New Folder %1" ).arg( newFolderNum ) ); + TQtFileIconViewItem *item = new TQtFileIconViewItem( this, new TQFileInfo( *fi ) ); + item->setKey( TQString( "000000%1" ).arg( fi->fileName() ) ); + delete fi; + repaintContents( contentsX(), contentsY(), contentsWidth(), contentsHeight(), FALSE ); + ensureItemVisible( item ); + item->setSelected( TRUE, TRUE ); + setCurrentItem( item ); + repaintItem( item ); + qApp->processEvents(); + item->rename(); + } + setAutoArrange( TRUE ); +} + +TQDir TQtFileIconView::currentDir() +{ + return viewDir; +} + +static bool isRoot( const TQString &s ) +{ +#if defined(Q_OS_UNIX) + if ( s == "/" ) + return TRUE; +#elif defined(Q_OS_WIN32) + TQString p = s; + if ( p.length() == 3 && + p.right( 2 ) == ":/" ) + return TRUE; + if ( p[ 0 ] == '/' && p[ 1 ] == '/' ) { + int slashes = p.contains( '/' ); + if ( slashes <= 3 ) + return TRUE; + if ( slashes == 4 && p[ (int)p.length() - 1 ] == '/' ) + return TRUE; + } +#endif + + return FALSE; +} + +void TQtFileIconView::readDir( const TQDir &dir ) +{ + if ( !dir.isReadable() ) + return; + + if ( isRoot( dir.absPath() ) ) + emit disableUp(); + else + emit enableUp(); + + clear(); + + emit directoryChanged( dir.absPath() ); + + const TQFileInfoList *filist = dir.entryInfoList( TQDir::DefaultFilter, TQDir::DirsFirst | TQDir::Name ); + + emit startReadDir( filist->count() ); + + TQFileInfoListIterator it( *filist ); + TQFileInfo *fi; + bool allowRename = FALSE, allowRenameSet = FALSE; + while ( ( fi = it.current() ) != 0 ) { + ++it; + if ( fi && fi->fileName() == ".." && ( fi->dirPath() == "/" || fi->dirPath().isEmpty() ) ) + continue; + emit readNextDir(); + TQtFileIconViewItem *item = new TQtFileIconViewItem( this, new TQFileInfo( *fi ) ); + if ( fi->isDir() ) + item->setKey( TQString( "000000%1" ).arg( fi->fileName() ) ); + else + item->setKey( fi->fileName() ); + if ( !allowRenameSet ) { + if ( !TQFileInfo( fi->absFilePath() ).isWritable() || + item->text() == "." || item->text() == ".." ) + allowRename = FALSE; + else + allowRename = TRUE; + if ( item->text() == "." || item->text() == ".." ) + allowRenameSet = FALSE; + else + allowRenameSet = TRUE; + } + item->setRenameEnabled( allowRename ); + } + + if ( !TQFileInfo( dir.absPath() ).isWritable() ) + emit disableMkdir(); + else + emit enableMkdir(); + + emit readDirDone(); +} + +void TQtFileIconView::itemDoubleClicked( TQIconViewItem *i ) +{ + TQtFileIconViewItem *item = ( TQtFileIconViewItem* )i; + + if ( item->type() == TQtFileIconViewItem::Dir ) { + viewDir = TQDir( item->filename() ); + readDir( viewDir ); + } else if ( item->type() == TQtFileIconViewItem::Link && + TQFileInfo( TQFileInfo( item->filename() ).readLink() ).isDir() ) { + viewDir = TQDir( TQFileInfo( item->filename() ).readLink() ); + readDir( viewDir ); + } +} + +TQDragObject *TQtFileIconView::dragObject() +{ + if ( !currentItem() ) + return 0; + + TQPoint orig = viewportToContents( viewport()->mapFromGlobal( TQCursor::pos() ) ); + TQtFileIconDrag *drag = new TQtFileIconDrag( viewport() ); + drag->setPixmap( *currentItem()->pixmap(), + TQPoint( currentItem()->pixmapRect().width() / 2, currentItem()->pixmapRect().height() / 2 ) ); + for ( TQtFileIconViewItem *item = (TQtFileIconViewItem*)firstItem(); item; + item = (TQtFileIconViewItem*)item->nextItem() ) { + if ( item->isSelected() ) { + TQIconDragItem id; + id.setData( TQCString( item->filename() ) ); + drag->append( id, + TQRect( item->pixmapRect( FALSE ).x() - orig.x(), + item->pixmapRect( FALSE ).y() - orig.y(), + item->pixmapRect().width(), item->pixmapRect().height() ), + TQRect( item->textRect( FALSE ).x() - orig.x(), + item->textRect( FALSE ).y() - orig.y(), + item->textRect().width(), item->textRect().height() ), + TQString( item->filename() ) ); + } + } + + return drag; +} + +void TQtFileIconView::keyPressEvent( TQKeyEvent *e ) +{ + if ( e->key() == Key_N && + ( e->state() & ControlButton ) ) + newDirectory(); + else + TQIconView::keyPressEvent( e ); +} + +void TQtFileIconView::slotDropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & ) +{ + if ( openItem ) + openItem->timer.stop(); + if ( !TQUriDrag::canDecode( e ) ) { + e->ignore(); + return; + } + + TQStringList lst; + TQUriDrag::decodeLocalFiles( e, lst ); + + TQString str; + if ( e->action() == TQDropEvent::Copy ) + str = "Copy\n\n"; + else + str = "Move\n\n"; + for ( uint i = 0; i < lst.count(); ++i ) + str += TQString( " %1\n" ).arg( TQDir::convertSeparators(lst[i]) ); + str += TQString( "\n" + "To\n\n" + " %1" ).arg( viewDir.absPath() ); + + TQMessageBox::information( this, e->action() == TQDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" ); + if ( e->action() == TQDropEvent::Move ) + TQMessageBox::information( this, "Remove" , TQDir::convertSeparators(lst.join("\n")), "Not Implemented" ); + e->acceptAction(); + openItem = 0; +} + +void TQtFileIconView::viewLarge() +{ + setViewMode( Large ); +} + +void TQtFileIconView::viewSmall() +{ + setViewMode( Small ); +} + +void TQtFileIconView::viewBottom() +{ + setItemTextPos( Bottom ); +} + +void TQtFileIconView::viewRight() +{ + setItemTextPos( Right ); +} + +void TQtFileIconView::flowEast() +{ + setHScrollBarMode( AlwaysOff ); + setVScrollBarMode( Auto ); + setArrangement( LeftToRight ); +} + +void TQtFileIconView::flowSouth() +{ + setVScrollBarMode( AlwaysOff ); + setHScrollBarMode( Auto ); + setArrangement( TopToBottom ); +} + +void TQtFileIconView::sortAscending() +{ + sort( TRUE ); +} + +void TQtFileIconView::sortDescending() +{ + sort( FALSE ); +} + +void TQtFileIconView::itemTextTruncate() +{ + setWordWrapIconText( FALSE ); +} + +void TQtFileIconView::itemTextWordWrap() +{ + setWordWrapIconText( TRUE ); +} + +void TQtFileIconView::slotRightPressed( TQIconViewItem *item ) +{ + if ( !item ) { // right pressed on viewport + TQPopupMenu menu( this ); + + menu.insertItem( "&Large view", this, SLOT( viewLarge() ) ); + menu.insertItem( "&Small view", this, SLOT( viewSmall() ) ); + menu.insertSeparator(); + menu.insertItem( "Text at the &bottom", this, SLOT( viewBottom() ) ); + menu.insertItem( "Text at the &right", this, SLOT( viewRight() ) ); + menu.insertSeparator(); + menu.insertItem( "Arrange l&eft to right", this, SLOT( flowEast() ) ); + menu.insertItem( "Arrange t&op to bottom", this, SLOT( flowSouth() ) ); + menu.insertSeparator(); + menu.insertItem( "&Truncate item text", this, SLOT( itemTextTruncate() ) ); + menu.insertItem( "&Wordwrap item text", this, SLOT( itemTextWordWrap() ) ); + menu.insertSeparator(); + menu.insertItem( "Arrange items in &grid", this, SLOT( arrangeItemsInGrid() ) ); + menu.insertSeparator(); + menu.insertItem( "Sort &ascending", this, SLOT( sortAscending() ) ); + menu.insertItem( "Sort &descending", this, SLOT( sortDescending() ) ); + + menu.setMouseTracking( TRUE ); + menu.exec( TQCursor::pos() ); + } else { // on item + TQPopupMenu menu( this ); + + int RENAME_ITEM = menu.insertItem( "Rename Item" ); + int REMOVE_ITEM = menu.insertItem( "Remove Item" ); + + menu.setMouseTracking( TRUE ); + int id = menu.exec( TQCursor::pos() ); + + if ( id == -1 ) + return; + + if ( id == RENAME_ITEM && item->renameEnabled() ) { + item->rename(); + } else if ( id == REMOVE_ITEM ) { + delete item; + TQMessageBox::information( this, "Not implemented!", "Deleting files not implemented yet,\n" + "The item has only been removed from the view! " ); + } + } +} + +void TQtFileIconView::setViewMode( ViewMode m ) +{ + if ( m == vm ) + return; + + vm = m; + TQtFileIconViewItem *item = (TQtFileIconViewItem*)firstItem(); + for ( ; item; item = (TQtFileIconViewItem*)item->nextItem() ) + item->viewModeChanged( vm ); + + arrangeItemsInGrid(); +} diff --git a/examples/fileiconview/qfileiconview.h b/examples/fileiconview/qfileiconview.h new file mode 100644 index 000000000..4a2e4b118 --- /dev/null +++ b/examples/fileiconview/qfileiconview.h @@ -0,0 +1,170 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQTFILEICONVIEW_H +#define TQTFILEICONVIEW_H + + +#include <qiconset.h> +#include <qstring.h> +#include <qfileinfo.h> +#include <qdir.h> +#include <qtimer.h> +#include <qiconview.h> + +class TQtFileIconView; +class TQDragObject; +class TQResizeEvent; + +/***************************************************************************** + * + * Class TQtFileIconDrag + * + *****************************************************************************/ + +class TQtFileIconDrag : public TQIconDrag +{ + Q_OBJECT + +public: + TQtFileIconDrag( TQWidget * dragSource, const char* name = 0 ); + + const char* format( int i ) const; + TQByteArray encodedData( const char* mime ) const; + static bool canDecode( TQMimeSource* e ); + void append( const TQIconDragItem &item, const TQRect &pr, const TQRect &tr, const TQString &url ); + +private: + TQStringList urls; + +}; + +/***************************************************************************** + * + * Class TQtFileIconView + * + *****************************************************************************/ +class TQtFileIconViewItem; +class TQtFileIconView : public TQIconView +{ + Q_OBJECT + +public: + TQtFileIconView( const TQString &dir, TQWidget *parent = 0, const char *name = 0 ); + + enum ViewMode { Large, Small }; + + void setViewMode( ViewMode m ); + ViewMode viewMode() const { return vm; } + void setOpenItem( TQtFileIconViewItem *i ) { + openItem = i; + } + +public slots: + void setDirectory( const TQString &dir ); + void setDirectory( const TQDir &dir ); + void newDirectory(); + TQDir currentDir(); + +signals: + void directoryChanged( const TQString & ); + void startReadDir( int dirs ); + void readNextDir(); + void readDirDone(); + void enableUp(); + void disableUp(); + void enableMkdir(); + void disableMkdir(); + +protected slots: + void itemDoubleClicked( TQIconViewItem *i ); + void slotDropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & ); + + void viewLarge(); + void viewSmall(); + void viewBottom(); + void viewRight(); + void flowEast(); + void flowSouth(); + void itemTextTruncate(); + void itemTextWordWrap(); + void sortAscending(); + void sortDescending(); + void arrangeItemsInGrid() { + TQIconView::arrangeItemsInGrid( TRUE ); + } + + void slotRightPressed( TQIconViewItem *item ); + void openFolder(); + +protected: + void readDir( const TQDir &dir ); + virtual TQDragObject *dragObject(); + + virtual void keyPressEvent( TQKeyEvent *e ); + + TQDir viewDir; + int newFolderNum; + TQSize sz; + TQPixmap pix; + ViewMode vm; + TQtFileIconViewItem *openItem; + +}; + +/***************************************************************************** + * + * Class TQtFileIconViewItem + * + *****************************************************************************/ + +class TQtFileIconViewItem : public TQIconViewItem +{ + friend class TQtFileIconView; + +public: + enum ItemType { + File = 0, + Dir, + Link + }; + + TQtFileIconViewItem( TQtFileIconView *parent, TQFileInfo *fi ); + + virtual ~TQtFileIconViewItem(); + + ItemType type() const + { return itemType; } + TQString filename() const { return itemFileName; } + + virtual bool acceptDrop( const TQMimeSource *e ) const; + + virtual void setText( const TQString &text ); + virtual TQPixmap *pixmap() const; + + virtual void dragEntered(); + virtual void dragLeft(); + + void viewModeChanged( TQtFileIconView::ViewMode m ); + void paintItem( TQPainter *p, const TQColorGroup &cg ); + +protected: + virtual void dropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & ); + + TQString itemFileName; + TQFileInfo *itemFileInfo; + ItemType itemType; + bool checkSetText; + TQTimer timer; + TQtFileIconView::ViewMode vm; + +}; + + +#endif diff --git a/examples/fonts/fonts.pro b/examples/fonts/fonts.pro new file mode 100644 index 000000000..8659474bd --- /dev/null +++ b/examples/fonts/fonts.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +CONFIG += ordered + +SUBDIRS = simple-qfont-demo diff --git a/examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp b/examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp new file mode 100644 index 000000000..2e9f8d3a6 --- /dev/null +++ b/examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp @@ -0,0 +1,14 @@ + +#include "viewer.h" + +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + Viewer * textViewer = new Viewer(); + textViewer->setCaption( "TQt Example - Simple TQFont Demo" ); + app.setMainWidget( textViewer ); + textViewer->show(); + return app.exec(); +} diff --git a/examples/fonts/simple-qfont-demo/simple-qfont-demo.doc b/examples/fonts/simple-qfont-demo/simple-qfont-demo.doc new file mode 100644 index 000000000..8b0a3657e --- /dev/null +++ b/examples/fonts/simple-qfont-demo/simple-qfont-demo.doc @@ -0,0 +1,28 @@ +/*! \page simple-font-demo-example.html + + \ingroup qfont-examples + + \title A simple demonstration of QFont member functions + + This example demonstrates the use of various + QFont member functions. + + <hr> + + The main window API (viewer.h): + + \include fonts/simple-qfont-demo/viewer.h + + <hr> + + The main window implementation (viewer.cpp): + + \include fonts/simple-qfont-demo/viewer.cpp + + <hr> + + main() program (simple-qfont-demo.cpp): + + \include fonts/simple-qfont-demo/simple-qfont-demo.cpp + +*/ diff --git a/examples/fonts/simple-qfont-demo/simple-qfont-demo.pro b/examples/fonts/simple-qfont-demo/simple-qfont-demo.pro new file mode 100644 index 000000000..a85e83ce4 --- /dev/null +++ b/examples/fonts/simple-qfont-demo/simple-qfont-demo.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = fontdemo + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = viewer.h +SOURCES = simple-qfont-demo.cpp \ + viewer.cpp diff --git a/examples/fonts/simple-qfont-demo/viewer.cpp b/examples/fonts/simple-qfont-demo/viewer.cpp new file mode 100644 index 000000000..505cd42b3 --- /dev/null +++ b/examples/fonts/simple-qfont-demo/viewer.cpp @@ -0,0 +1,160 @@ + +#include "viewer.h" +#include <qstring.h> +#include <qstringlist.h> +#include <qtextview.h> +#include <qpushbutton.h> +#include <qlayout.h> + +Viewer::Viewer() + :TQWidget() +{ + setFontSubstitutions(); + + TQString greeting_heb = TQString::fromUtf8( "\327\251\327\234\327\225\327\235" ); + TQString greeting_ru = TQString::fromUtf8( "\320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265" ); + TQString greeting_en( "Hello" ); + + greetings = new TQTextView( this, "textview" ); + + greetings->setText( greeting_en + "\n" + + greeting_ru + "\n" + + greeting_heb ); + + fontInfo = new TQTextView( this, "fontinfo" ); + + setDefault(); + + defaultButton = new TQPushButton( "Default", this, + "pushbutton1" ); + defaultButton->setFont( TQFont( "times" ) ); + connect( defaultButton, SIGNAL( clicked() ), + this, SLOT( setDefault() ) ); + + sansSerifButton = new TQPushButton( "Sans Serif", this, + "pushbutton2" ); + sansSerifButton->setFont( TQFont( "Helvetica", 12 ) ); + connect( sansSerifButton, SIGNAL( clicked() ), + this, SLOT( setSansSerif() ) ); + + italicsButton = new TQPushButton( "Italics", this, + "pushbutton3" ); + italicsButton->setFont( TQFont( "lucida", 12, TQFont::Bold, TRUE ) ); + connect( italicsButton, SIGNAL( clicked() ), + this, SLOT( setItalics() ) ); + + layout(); +} + +void Viewer::setDefault() +{ + TQFont font( "Bavaria" ); + font.setPointSize( 24 ); + + font.setWeight( TQFont::Bold ); + font.setUnderline( TRUE ); + + greetings->setFont( font ); + + showFontInfo( font ); +} + +void Viewer::setSansSerif() +{ + TQFont font( "Newyork", 18 ); + font.setStyleHint( TQFont::SansSerif ); + greetings->setFont( font ); + + showFontInfo( font ); +} + +void Viewer::setItalics() +{ + TQFont font( "Tokyo" ); + font.setPointSize( 32 ); + font.setWeight( TQFont::Bold ); + font.setItalic( TRUE ); + + greetings->setFont( font ); + + showFontInfo( font ); +} + +void Viewer::showFontInfo( TQFont & font ) +{ + TQFontInfo info( font ); + + TQString messageText; + messageText = "Font requested: \"" + + font.family() + "\" " + + TQString::number( font.pointSize() ) + "pt<BR>" + + "Font used: \"" + + info.family() + "\" " + + TQString::number( info.pointSize() ) + "pt<P>"; + + TQStringList substitutions = TQFont::substitutes( font.family() ); + + if ( ! substitutions.isEmpty() ){ + messageText += "The following substitutions exist for " + \ + font.family() + ":<UL>"; + + TQStringList::Iterator i = substitutions.begin(); + while ( i != substitutions.end() ){ + messageText += "<LI>\"" + (* i) + "\""; + i++; + } + messageText += "</UL>"; + } else { + messageText += "No substitutions exist for " + \ + font.family() + "."; + } + + fontInfo->setText( messageText ); +} + +void Viewer::setFontSubstitutions() +{ + TQStringList substitutes; + substitutes.append( "Times" ); + substitutes += "Mincho", + substitutes << "Arabic Newspaper" << "crox"; + + TQFont::insertSubstitutions( "Bavaria", substitutes ); + + TQFont::insertSubstitution( "Tokyo", "Lucida" ); +} + + +// For those who prefer to use TQt Designer for creating GUIs +// the following function might not be of particular interest: +// all it does is creating the widget layout. + +void Viewer::layout() +{ + TQHBoxLayout * textViewContainer = new TQHBoxLayout(); + textViewContainer->addWidget( greetings ); + textViewContainer->addWidget( fontInfo ); + + TQHBoxLayout * buttonContainer = new TQHBoxLayout(); + + buttonContainer->addWidget( defaultButton ); + buttonContainer->addWidget( sansSerifButton ); + buttonContainer->addWidget( italicsButton ); + + int maxButtonHeight = defaultButton->height(); + + if ( sansSerifButton->height() > maxButtonHeight ) + maxButtonHeight = sansSerifButton->height(); + if ( italicsButton->height() > maxButtonHeight ) + maxButtonHeight = italicsButton->height(); + + defaultButton->setFixedHeight( maxButtonHeight ); + sansSerifButton->setFixedHeight( maxButtonHeight ); + italicsButton->setFixedHeight( maxButtonHeight ); + + TQVBoxLayout * container = new TQVBoxLayout( this ); + container->addLayout( textViewContainer ); + container->addLayout( buttonContainer ); + + resize( 700, 250 ); +} diff --git a/examples/fonts/simple-qfont-demo/viewer.h b/examples/fonts/simple-qfont-demo/viewer.h new file mode 100644 index 000000000..1f72470a6 --- /dev/null +++ b/examples/fonts/simple-qfont-demo/viewer.h @@ -0,0 +1,37 @@ + +#ifndef VIEWER_H +#define VIEWER_H + + +#include <qwidget.h> +#include <qfont.h> + +class TQTextView; +class TQPushButton; + +class Viewer : public TQWidget +{ +Q_OBJECT + +public: + Viewer(); + +private slots: + void setDefault(); + void setSansSerif(); + void setItalics(); + +private: + void setFontSubstitutions(); + void layout(); + void showFontInfo( TQFont & ); + + TQTextView * greetings; + TQTextView * fontInfo; + + TQPushButton * defaultButton; + TQPushButton * sansSerifButton; + TQPushButton * italicsButton; +}; + +#endif diff --git a/examples/forever/README b/examples/forever/README new file mode 100644 index 000000000..b3fbbb679 --- /dev/null +++ b/examples/forever/README @@ -0,0 +1,4 @@ +The forever program draws filled rectangles with random color and random +position and size. + +WARNING: This program has a strobe effect. diff --git a/examples/forever/forever.cpp b/examples/forever/forever.cpp new file mode 100644 index 000000000..278572541 --- /dev/null +++ b/examples/forever/forever.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qtimer.h> +#include <qpainter.h> +#include <qapplication.h> +#include <stdlib.h> // defines rand() function + +#include "forever.h" + + +// +// Forever - a widget that draws rectangles forever. +// + +// +// Constructs a Forever widget. +// + +Forever::Forever( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + for (int a=0; a<numColors; a++) { + colors[a] = TQColor( rand()&255, + rand()&255, + rand()&255 ); + } + rectangles = 0; + startTimer( 0 ); // run continuous timer + TQTimer * counter = new TQTimer( this ); + connect( counter, SIGNAL(timeout()), + this, SLOT(updateCaption()) ); + counter->start( 1000 ); +} + + +void Forever::updateCaption() +{ + TQString s; + s.sprintf( "TQt Example - Forever - %d rectangles/second", rectangles ); + rectangles = 0; + setCaption( s ); +} + + +// +// Handles paint events for the Forever widget. +// + +void Forever::paintEvent( TQPaintEvent * ) +{ + TQPainter paint( this ); // painter object + int w = width(); + int h = height(); + if(w <= 0 || h <= 0) + return; + paint.setPen( NoPen ); // do not draw outline + paint.setBrush( colors[rand() % numColors]);// set random brush color + + TQPoint p1( rand()%w, rand()%h ); // p1 = top left + TQPoint p2( rand()%w, rand()%h ); // p2 = bottom right + + TQRect r( p1, p2 ); + paint.drawRect( r ); // draw filled rectangle +} + +// +// Handles timer events for the Forever widget. +// + +void Forever::timerEvent( TQTimerEvent * ) +{ + for ( int i=0; i<100; i++ ) { + repaint( FALSE ); // repaint, don't erase + rectangles++; + } +} + + +// +// Create and display Forever widget. +// + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); // create application object + Forever always; // create widget + always.resize( 400, 250 ); // start up with size 400x250 + a.setMainWidget( &always ); // set as main widget + always.setCaption("TQt Example - Forever"); + always.show(); // show widget + return a.exec(); // run event loop +} diff --git a/examples/forever/forever.doc b/examples/forever/forever.doc new file mode 100644 index 000000000..be5633328 --- /dev/null +++ b/examples/forever/forever.doc @@ -0,0 +1,25 @@ + +/* +*/ +/*! \page forever-example.html + + \ingroup examples + \title A Rectangle Draw "Benchmark" + + This example continuously draws rectangles in a window and + has another widget that counts the number of rectangles that + are drawn per second. + + <hr> + + Header file: + + \include forever/forever.h + + <hr> + + Implementation: + + \include forever/forever.cpp +*/ + diff --git a/examples/forever/forever.h b/examples/forever/forever.h new file mode 100644 index 000000000..480e5691c --- /dev/null +++ b/examples/forever/forever.h @@ -0,0 +1,39 @@ +/**************************************************************************** +** +** Definition of something or other +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef FOREVER_H +#define FOREVER_H + +#include <qwidget.h> + + +const int numColors = 120; + + +class Forever : public TQWidget +{ + Q_OBJECT +public: + Forever( TQWidget *parent=0, const char *name=0 ); +protected: + void paintEvent( TQPaintEvent * ); + void timerEvent( TQTimerEvent * ); +private slots: + void updateCaption(); +private: + int rectangles; + TQColor colors[numColors]; +}; + + +#endif diff --git a/examples/forever/forever.pro b/examples/forever/forever.pro new file mode 100644 index 000000000..2886d983a --- /dev/null +++ b/examples/forever/forever.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = forever + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = small-config + +HEADERS = forever.h +SOURCES = forever.cpp diff --git a/examples/gridview/gridview.cpp b/examples/gridview/gridview.cpp new file mode 100644 index 000000000..647e3cc4c --- /dev/null +++ b/examples/gridview/gridview.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qgridview.h> +#include <qpainter.h> + +// Grid size +const int numRows = 100; +const int numCols = 100; + +class MyGridView : public TQGridView +{ +public: + MyGridView() { + setNumRows( ::numRows ); + setNumCols( ::numCols ); + setCellWidth( fontMetrics().width( TQString("%1 / %2").arg(numRows()).arg(numCols()))); + setCellHeight( 2*fontMetrics().lineSpacing() ); + setCaption( tr( "TQt Example - This is a grid with 100 x 100 cells" ) ); + } + +protected: + void paintCell( TQPainter *p, int row, int col ) { + p->drawLine( cellWidth()-1, 0, cellWidth()-1, cellHeight()-1 ); + p->drawLine( 0, cellHeight()-1, cellWidth()-1, cellHeight()-1 ); + p->drawText( cellRect(), AlignCenter, TQString("%1 / %1").arg(row).arg(col) ); + } +}; + +// The program starts here. +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + + MyGridView gridview; + app.setMainWidget( &gridview ); + gridview.show(); + return app.exec(); +} diff --git a/examples/gridview/gridview.pro b/examples/gridview/gridview.pro new file mode 100644 index 000000000..f1c02488f --- /dev/null +++ b/examples/gridview/gridview.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = gridview + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = medium-config + +HEADERS = +SOURCES = gridview.cpp diff --git a/examples/hello/README b/examples/hello/README new file mode 100644 index 000000000..1d9560106 --- /dev/null +++ b/examples/hello/README @@ -0,0 +1,3 @@ +Since the classic "hello world" program is too trivial in Qt, We made +this one - it draws the words "hello world" moving around and in +rainbow colors. diff --git a/examples/hello/hello.cpp b/examples/hello/hello.cpp new file mode 100644 index 000000000..55f8356e0 --- /dev/null +++ b/examples/hello/hello.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "hello.h" +#include <qpushbutton.h> +#include <qtimer.h> +#include <qpainter.h> +#include <qpixmap.h> + + +/* + Constructs a Hello widget. Starts a 40 ms animation timer. +*/ + +Hello::Hello( const char *text, TQWidget *parent, const char *name ) + : TQWidget(parent,name), t(text), b(0) +{ + TQTimer *timer = new TQTimer(this); + connect( timer, SIGNAL(timeout()), SLOT(animate()) ); + timer->start( 40 ); + + resize( 260, 130 ); +} + + +/* + This private slot is called each time the timer fires. +*/ + +void Hello::animate() +{ + b = (b + 1) & 15; + repaint( FALSE ); +} + + +/* + Handles mouse button release events for the Hello widget. + + We emit the clicked() signal when the mouse is released inside + the widget. +*/ + +void Hello::mouseReleaseEvent( TQMouseEvent *e ) +{ + if ( rect().contains( e->pos() ) ) + emit clicked(); +} + + +/* + Handles paint events for the Hello widget. + + Flicker-free update. The text is first drawn in the pixmap and the + pixmap is then blt'ed to the screen. +*/ + +void Hello::paintEvent( TQPaintEvent * ) +{ + static int sin_tbl[16] = { + 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38}; + + if ( t.isEmpty() ) + return; + + // 1: Compute some sizes, positions etc. + TQFontMetrics fm = fontMetrics(); + int w = fm.width(t) + 20; + int h = fm.height() * 2; + int pmx = width()/2 - w/2; + int pmy = height()/2 - h/2; + + // 2: Create the pixmap and fill it with the widget's background + TQPixmap pm( w, h ); + pm.fill( this, pmx, pmy ); + + // 3: Paint the pixmap. Cool wave effect + TQPainter p; + int x = 10; + int y = h/2 + fm.descent(); + int i = 0; + p.begin( &pm ); + p.setFont( font() ); + while ( !t[i].isNull() ) { + int i16 = (b+i) & 15; + p.setPen( TQColor((15-i16)*16,255,255,TQColor::Hsv) ); + p.drawText( x, y-sin_tbl[i16]*h/800, t.mid(i,1), 1 ); + x += fm.width( t[i] ); + i++; + } + p.end(); + + // 4: Copy the pixmap to the Hello widget + bitBlt( this, pmx, pmy, &pm ); +} diff --git a/examples/hello/hello.doc b/examples/hello/hello.doc new file mode 100644 index 000000000..8c001a2b8 --- /dev/null +++ b/examples/hello/hello.doc @@ -0,0 +1,30 @@ + +/* +*/ +/*! \page hello-example.html + + \ingroup examples + \title Hello, World + + This example brings up the words "Hello, World" moving up and down, + and in different colors. + + <hr> + + Header file: + + \include hello/hello.h + + <hr> + + Implementation: + + \include hello/hello.cpp + + <hr> + + Main: + + \include hello/main.cpp +*/ + diff --git a/examples/hello/hello.h b/examples/hello/hello.h new file mode 100644 index 000000000..c519a3351 --- /dev/null +++ b/examples/hello/hello.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef HELLO_H +#define HELLO_H + +#include <qwidget.h> + + +class Hello : public TQWidget +{ + Q_OBJECT +public: + Hello( const char *text, TQWidget *parent=0, const char *name=0 ); +signals: + void clicked(); +protected: + void mouseReleaseEvent( TQMouseEvent * ); + void paintEvent( TQPaintEvent * ); +private slots: + void animate(); +private: + TQString t; + int b; +}; + +#endif diff --git a/examples/hello/hello.pro b/examples/hello/hello.pro new file mode 100644 index 000000000..de15e8ef2 --- /dev/null +++ b/examples/hello/hello.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = hello + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +HEADERS = hello.h +SOURCES = hello.cpp \ + main.cpp diff --git a/examples/hello/main.cpp b/examples/hello/main.cpp new file mode 100644 index 000000000..45e9e58e7 --- /dev/null +++ b/examples/hello/main.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "hello.h" +#include <qapplication.h> + + +/* + The program starts here. It parses the command line and builds a message + string to be displayed by the Hello widget. +*/ + +int main( int argc, char **argv ) +{ + TQApplication a(argc,argv); + TQString s; + for ( int i=1; i<argc; i++ ) { + s += argv[i]; + if ( i<argc-1 ) + s += " "; + } + if ( s.isEmpty() ) + s = "Hello, World"; + Hello h( s ); +#ifndef QT_NO_WIDGET_TOPEXTRA // for TQt/Embedded minimal build + h.setCaption( "TQt says hello" ); +#endif + TQObject::connect( &h, SIGNAL(clicked()), &a, SLOT(tquit()) ); + h.setFont( TQFont("times",32,TQFont::Bold) ); // default font + h.setBackgroundColor( TQt::white ); // default bg color + a.setMainWidget( &h ); + h.show(); + return a.exec(); +} diff --git a/examples/helpdemo/about.txt b/examples/helpdemo/about.txt new file mode 100644 index 000000000..f47564d56 --- /dev/null +++ b/examples/helpdemo/about.txt @@ -0,0 +1 @@ +About text for the demo help example. diff --git a/examples/helpdemo/doc/handbook.png b/examples/helpdemo/doc/handbook.png Binary files differnew file mode 100644 index 000000000..3bd2b928b --- /dev/null +++ b/examples/helpdemo/doc/handbook.png diff --git a/examples/helpdemo/doc/helpdemo.adp b/examples/helpdemo/doc/helpdemo.adp new file mode 100644 index 000000000..fbc0fc55d --- /dev/null +++ b/examples/helpdemo/doc/helpdemo.adp @@ -0,0 +1,27 @@ +<!DOCTYPE DCF> + +<assistantconfig version="3.2.0"> + +<profile> + <property name="name">HelpExample</property> + <property name="title">Help Example</property> + <property name="applicationicon">logo.png</property> + <property name="startpage">index.html</property> + <property name="aboutmenutext">About Help</property> + <property name="abouturl">../about.txt</property> + <property name="assistantdocs">../../../doc/html</property> +</profile> + +<DCF ref="index.html" icon="handbook.png" title="Help example"> + <section ref="./manual.html" title="How to use this Example"> + <keyword ref="./manual.html#onlydoc">Example Profile</keyword> + <keyword ref="./manual.html#lineedit">Filename</keyword> + <keyword ref="./manual.html#hide">Hide Sidebar</keyword> + <keyword ref="./manual.html#openqabutton">Open Assistant</keyword> + <keyword ref="./manual.html#closeqabutton">Close Assistant</keyword> + <keyword ref="./manual.html#displaybutton">Display</keyword> + <keyword ref="./manual.html#closebutton">Close</keyword> + </section> +</DCF> + +</assistantconfig> diff --git a/examples/helpdemo/doc/index.html b/examples/helpdemo/doc/index.html new file mode 100644 index 000000000..9f1fb212c --- /dev/null +++ b/examples/helpdemo/doc/index.html @@ -0,0 +1,41 @@ +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <title>Help example</title> + </head> + <body style="font-size:12pt;font-family:helvetica"> + <p><h2>Help example</h2></p> + + <p> + This example demonstrates how to use TQt Assistant as help system + for your own application. You can control TQt Assistant either directly + using e.g. the open button or indirectly by pressing F1. + </p> + + <p> + This example provides a context sensitive help, i.e. pressing F1 will + show the help for the item under the mouse cursor. + </p> + + <p> + In order to run TQt Assistant as a custom help tool for this + application properly you have to specify a profile. A profile + is a file format similar to the documentation content files + that assistant used up to TQt 3.1. Once such a profile has been + specified TQt Assistant can be run with the option <code>-profile</code> + and then the filename of the profile. The HelpDemo example does + this for you if you press the <i>Run TQt Assistant customized for + HelpDemo</i>. + </p> + + <p> + TQt Assistant can also display arbitrary pages with the + <i>Display</i> button or using the context help (F1), but TQt + Assistant won't be customized for this example application. + </p> + + <ul> + <li><a href="manual.html">How to use this example</a></li> + </ul> + </body> +</html> diff --git a/examples/helpdemo/doc/logo.png b/examples/helpdemo/doc/logo.png Binary files differnew file mode 100644 index 000000000..16f7d1f3a --- /dev/null +++ b/examples/helpdemo/doc/logo.png diff --git a/examples/helpdemo/doc/manual.html b/examples/helpdemo/doc/manual.html new file mode 100644 index 000000000..8410a99d5 --- /dev/null +++ b/examples/helpdemo/doc/manual.html @@ -0,0 +1,65 @@ +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <title>How to use this Example</title> + </head> + <body style="font-size:12pt;font-family:helvetica"> + <p><h2>How to use this Example</h2></p> + <p>There are three ways to get help in this example: + <ul> + <li> + Press F1. Depending where your mouse position is you get either the + help for the item under the mouse cursor or the general help for this + example. + </li> + <li> + Press the right mouse button to invoke a context menu, then click + 'Help'. The displayed help page is choose as described above. + </li> + <li> + Use the buttons to control TQt Assistant directly. For a further + explanation see below. + </li> + </ul> + + <br><br><br><br><br><br> + <p><a name="openqabutton"><h3>Open Assistant Button</h3></a></p> + <p>Click this button to open TQt Assistant. If it is already open nothing + will happen. The displayed page is the one that was last displayed.</p> + + <br><br><br><br><br><br> + <p><a name="closeqabutton"><h3>Close Assistant Button</h3></a></p> + <p>Click this button to close TQt Assistant. If it is not running nothing + will happen.</p> + + <br><br><br><br><br><br> + <p><a name="onlydoc"><h3>Run TQt Assistant customized for HelpDemo</h3></a></p> + <p>Check this item in order to run TQt Assistant as a customized help tool for + the HelpDemo example. Checking or unchecking has no effect if TQt + Assistant is already running. To apply changes you have to restart + TQt Assistant. Please see the <code>HelpDemo::setAssistantArguments()</code> + function to see how TQt Assistant can be started in customized mode. + </p> + + <br><br><br><br><br><br> + <p><a name="hide"><h3>Hide Sidebar on Startup</h3></a></p> + <p>Check this item to run TQt Assistant with the sidebar hidden. + Checking or unchecking has no effect if TQt Assistant is already running. + To apply changes you have to restart TQt Assistant.</p> + + <br><br><br><br><br><br> + <p><a name="lineedit"><h3>Filename</h3></a></p> + <p>Enter the file name of a help page you want to get displayed here. The path + can be specified as an absolute or relative path.</p> + + <br><br><br><br><br><br> + <p><a name="displaybutton"><h3>Display Button</h3></a></p> + <p>Click this button in order to get the help page which is specified in the file name + line edit displayed. If TQt Assistant is currently not open, it will be + opened automatically.</p> + + <br><br><br><br><br><br> + <p><a name="closebutton"><h3>Close Button</h3></a></p> + <p>Click this button to tquit this example application.</p> + </body> +</html> diff --git a/examples/helpdemo/helpdemo.cpp b/examples/helpdemo/helpdemo.cpp new file mode 100644 index 000000000..835d18185 --- /dev/null +++ b/examples/helpdemo/helpdemo.cpp @@ -0,0 +1,119 @@ +#include <qassistantclient.h> +#include <qmessagebox.h> +#include <qlineedit.h> +#include <qaction.h> +#include <qpopupmenu.h> +#include <qcheckbox.h> +#include <qprocess.h> +#include <qpushbutton.h> +#include <qdir.h> + +#include "helpdemo.h" + +HelpDemo::HelpDemo( TQWidget *parent, const char *name ) + : HelpDemoBase( parent, name ) +{ + leFileName->setText( "./doc/index.html" ); + assistant = new TQAssistantClient( TQDir( "../../bin" ).absPath(), this ); + widgets.insert( (TQWidget*)openTQAButton, "./doc/manual.html#openqabutton" ); + widgets.insert( (TQWidget*)closeTQAButton, "./doc/manual.html#closeqabutton" ); + widgets.insert( (TQWidget*)checkOnlyExampleDoc, "./doc/manual.html#onlydoc" ); + widgets.insert( (TQWidget*)checkHide, "./doc/manual.html#hide" ); + widgets.insert( (TQWidget*)leFileName, "./doc/manual.html#lineedit" ); + widgets.insert( (TQWidget*)displayButton, "./doc/manual.html#displaybutton" ); + widgets.insert( (TQWidget*)closeButton, "./doc/manual.html#closebutton" ); + + menu = new TQPopupMenu( this ); + + TQAction *helpAction = new TQAction( "Show Help", TQKeySequence(tr("F1")), this ); + helpAction->addTo( menu ); + + connect( helpAction, SIGNAL(activated()), this, SLOT(showHelp()) ); + connect( assistant, SIGNAL(assistantOpened()), this, SLOT(assistantOpened()) ); + connect( assistant, SIGNAL(assistantClosed()), this, SLOT(assistantClosed())); + connect( assistant, SIGNAL(error(const TQString&)), + this, SLOT(showAssistantErrors(const TQString&)) ); + closeTQAButton->setEnabled(FALSE); +} + +HelpDemo::~HelpDemo() +{ +} + +void HelpDemo::contextMenuEvent( TQContextMenuEvent *e ) +{ + TQWidget *w = lookForWidget(); + if ( menu->exec( e->globalPos() ) != -1 ) + showHelp( w ); +} + +TQWidget* HelpDemo::lookForWidget() +{ + TQPtrDictIterator<char> it( widgets ); + TQWidget *w; + while ( (w = (TQWidget*)(it.currentKey())) != 0 ) { + ++it; + if ( w->hasMouse() ) + return w; + } + return 0; +} + +void HelpDemo::showHelp() +{ + showHelp( lookForWidget() ); +} + +void HelpDemo::showHelp( TQWidget *w ) +{ + if ( w ) + assistant->showPage( TQString( widgets[w] ) ); + else + assistant->showPage( "./doc/index.html" ); +} + +void HelpDemo::setAssistantArguments() +{ + TQStringList cmdLst; + if ( checkHide->isChecked() ) + cmdLst << "-hideSidebar"; + if ( checkOnlyExampleDoc->isChecked() ) + cmdLst << "-profile" + << TQString("doc") + TQDir::separator() + TQString("helpdemo.adp"); + assistant->setArguments( cmdLst ); +} + +void HelpDemo::openAssistant() +{ + if ( !assistant->isOpen() ) + assistant->openAssistant(); +} + +void HelpDemo::closeAssistant() +{ + if ( assistant->isOpen() ) + assistant->closeAssistant(); +} + +void HelpDemo::displayPage() +{ + assistant->showPage( leFileName->text() ); +} + +void HelpDemo::showAssistantErrors( const TQString &err ) +{ + TQMessageBox::critical( this, "Assistant Error", err ); + +} + +void HelpDemo::assistantOpened() +{ + closeTQAButton->setEnabled( TRUE ); + openTQAButton->setEnabled( FALSE ); +} + +void HelpDemo::assistantClosed() +{ + closeTQAButton->setEnabled( FALSE ); + openTQAButton->setEnabled( TRUE ); +} diff --git a/examples/helpdemo/helpdemo.h b/examples/helpdemo/helpdemo.h new file mode 100644 index 000000000..c98f26528 --- /dev/null +++ b/examples/helpdemo/helpdemo.h @@ -0,0 +1,42 @@ +#ifndef HELPDEMO_H +#define HELPDEMO_H + +#include <qptrdict.h> + +#include "helpdemobase.h" + +class TQAssistantClient; +class TQPopupMenu; + +class HelpDemo : public HelpDemoBase +{ + Q_OBJECT + +public: + HelpDemo( TQWidget *parent = 0, const char *name = 0 ); + ~HelpDemo(); + +protected: + void contextMenuEvent( TQContextMenuEvent *e ); + +private slots: + void setAssistantArguments(); + void openAssistant(); + void closeAssistant(); + void displayPage(); + void showAssistantErrors( const TQString &err ); + void assistantOpened(); + void assistantClosed(); + void showHelp(); + +private: + TQWidget* lookForWidget(); + void showHelp( TQWidget *w ); + + TQPtrDict<char> widgets; + TQAssistantClient *assistant; + TQPopupMenu *menu; + +}; + +#endif diff --git a/examples/helpdemo/helpdemo.pro b/examples/helpdemo/helpdemo.pro new file mode 100644 index 000000000..ff62776dc --- /dev/null +++ b/examples/helpdemo/helpdemo.pro @@ -0,0 +1,15 @@ +TEMPLATE = app + +CONFIG += qt warn_on +LIBS += -lqassistantclient +unix { + UI_DIR = .ui + MOC_DIR = .moc + OBJECTS_DIR = .obj +} + +REQUIRES = full-config + +SOURCES += helpdemo.cpp main.cpp +HEADERS += helpdemo.h +FORMS = helpdemobase.ui diff --git a/examples/helpdemo/helpdemobase.ui b/examples/helpdemo/helpdemobase.ui new file mode 100644 index 000000000..75e4b7237 --- /dev/null +++ b/examples/helpdemo/helpdemobase.ui @@ -0,0 +1,239 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>HelpDemoBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>HelpDemoBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>315</width> + <height>346</height> + </rect> + </property> + <property name="caption"> + <string>Help Example</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget" row="3" column="0"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>301</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>closeButton</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + <property name="accel"> + <string>Alt+C</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + <widget class="TQFrame" row="1" column="0"> + <property name="name"> + <cstring>frame5</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQPushButton" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>openTQAButton</cstring> + </property> + <property name="text"> + <string>&Open Assistant</string> + </property> + <property name="accel"> + <string>Alt+L</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton" row="4" column="3"> + <property name="name"> + <cstring>displayButton</cstring> + </property> + <property name="text"> + <string>&Display</string> + </property> + <property name="accel"> + <string>Alt+D</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>checkHide</cstring> + </property> + <property name="text"> + <string>&Hide Sidebar when Opening</string> + </property> + <property name="accel"> + <string>Alt+H</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>closeTQAButton</cstring> + </property> + <property name="text"> + <string>C&lose Assistant</string> + </property> + <property name="accel"> + <string>Alt+L</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLabel" row="4" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>&Filename:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>leFileName</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="4" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>leFileName</cstring> + </property> + </widget> + <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>checkOnlyExampleDoc</cstring> + </property> + <property name="text"> + <string>Run TQt Assistant customized for HelpDemo</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + </grid> + </widget> + <widget class="TQTextEdit" row="0" column="0"> + <property name="name"> + <cstring>textEdit1</cstring> + </property> + <property name="text"> + <string><p> +This example demonstrates how TQt Assistant can be used as a help system for your application. If the button <i>"Run TQt Assistant customized for HelpDemo"</i> is checked TQt Assistant will be customized for this application. +</p></string> + </property> + <property name="wordWrap"> + <enum>WidgetWidth</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <spacer row="2" column="0"> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>31</width> + <height>30</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>closeButton</sender> + <signal>clicked()</signal> + <receiver>HelpDemoBase</receiver> + <slot>close()</slot> + </connection> + <connection> + <sender>openTQAButton</sender> + <signal>clicked()</signal> + <receiver>HelpDemoBase</receiver> + <slot>openAssistant()</slot> + </connection> + <connection> + <sender>closeTQAButton</sender> + <signal>clicked()</signal> + <receiver>HelpDemoBase</receiver> + <slot>closeAssistant()</slot> + </connection> + <connection> + <sender>displayButton</sender> + <signal>clicked()</signal> + <receiver>HelpDemoBase</receiver> + <slot>displayPage()</slot> + </connection> + <connection> + <sender>checkOnlyExampleDoc</sender> + <signal>toggled(bool)</signal> + <receiver>HelpDemoBase</receiver> + <slot>setAssistantArguments()</slot> + </connection> + <connection> + <sender>checkHide</sender> + <signal>toggled(bool)</signal> + <receiver>HelpDemoBase</receiver> + <slot>setAssistantArguments()</slot> + </connection> +</connections> +<slots> + <slot>displayPage()</slot> + <slot>openAssistant()</slot> + <slot>closeAssistant()</slot> + <slot>setAssistantArguments()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/helpdemo/main.cpp b/examples/helpdemo/main.cpp new file mode 100644 index 000000000..c044c1797 --- /dev/null +++ b/examples/helpdemo/main.cpp @@ -0,0 +1,11 @@ +#include <qapplication.h> +#include "helpdemo.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + HelpDemo help; + help.show(); + a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) ); + return a.exec(); +} diff --git a/examples/helpsystem/appicon.png b/examples/helpsystem/appicon.png Binary files differnew file mode 100644 index 000000000..a50dc9ccb --- /dev/null +++ b/examples/helpsystem/appicon.png diff --git a/examples/helpsystem/helpsystem.doc b/examples/helpsystem/helpsystem.doc new file mode 100644 index 000000000..d44808800 --- /dev/null +++ b/examples/helpsystem/helpsystem.doc @@ -0,0 +1,221 @@ +/*! + \page helpsystem-example.html + + \ingroup examples + \title Helpsystem + + This example demonstrates the different Qt classes + that can be used to provide context sensitive help + in an application. + + It uses QToolTip and QWhatsThis to provide both static and + dynamic balloon help for the widgets in the application, and + QToolTipGroup to display extended information for each tooltip + in the statusbar. QAssistantClient is used to display help + pages using Qt Assistant. + + The application has a user interface based on a + QMainWindow with a menubar, statusbar and a toolbar, and uses + a QTable as the central widget. + \quotefile helpsystem/tooltip.h + \skipto : public QToolTip + \printuntil }; + + Two QToolTip subclasses implement dynamic tooltips for + QHeader and QTable by reimplementing maybeTip(). The + constructors differ from the QToolTip constructor in having a + QHeader and a QTable respectively as the first parameter for + the constructor instead of a QWidget. This is because + we want to ensure that only headers and tables can be + passed as arguments. A QToolTipGroup can be provided as the + second argument to show tooltips in, for example a statusbar. + + \printuntil }; + + The TableToolTip class keeps a reference to the QTable + as a member for easier access of the QTable object later on. + + \quotefile helpsystem/tooltip.cpp + \skipto HeaderToolTip::HeaderToolTip + \printuntil } + + The HeaderToolTip constructor propagates the parameters + to the QToolTip constructor. + \printuntil } + + The implementation of maybeTip() uses the QHeader API + to get the section at the requested position and uses + QToolTip::tip() to display the section's label in a + tooltip. The second string is used by QToolTipGroup and will + show up in the statusbar. + + \printuntil } + + Since QTable is a QScrollView all user interaction + happens on QTable's viewport() . The TableToolTip + constructor passes the viewport() and the tooltip + group to the QToolTip constructor, and initializes the table + member with the QTable pointer itself. + \printto moveTopLeft + + The implementation of maybeTip() uses the QTable API + to get information about the cell at the requested position. + The QTable API expects contents coordinates, and since the + requested point is relative to the viewport we need to translate + the coordinates before we can use QTable's functions. + \printuntil } + \quotefile helpsystem/whatsthis.h + \skipto class WhatsThis + + We translate the cell's geometry back to viewport coordinates + so that the tooltip disappears when the mouse cursor leaves + the cell, and use QToolTip::tip() to display the cell's label + in a tooltip and to provide text for the QToolTipGroup as before. + \printuntil }; + \quotefile helpsystem/whatsthis.cpp + \skipto WhatsThis::WhatsThis + + + The WhatsThis class is a subclass of both QObject and + QWhatsThis and serves as a base class for the HeaderWhatsThis + and TableWhatsThis classes. \footnote Note that moc retquires that QObject + is the first base class. \endfootnote WhatsThis + reimplements clicked() which will be called when the user clicks + inside the "What's this?" window. It also declares a signal + linkClicked() which will be emitted when a hyperlink is clicked. + \printuntil } + + The WhatsThis constructor takes two parameters, the first is the + widget we want to provide WhatsThis for, and the second is the + one which receives the events. Normally this is the same widget, + but some widgets, like QTable, are more complex and have a + viewport() widget which receives the events. If such a widget + is passed to the constructor it will propagate the parameter to + the QWhatsThis constructor and store the QWidget pointer itself + in it's member variable to allow easier use of the QWidget API + later on. + \skipto bool WhatsThis::clicked + \printuntil } + \quotefile helpsystem/whatsthis.h + \skipto class HeaderWhatsThis + + The implementation of clicked() emits the linkClicked() signal + if a hyperlink has been clicked. + \printuntil }; + + \printuntil }; + + \quotefile helpsystem/whatsthis.cpp + \skipto HeaderWhatsThis::HeaderWhatsThis + + The HeaderWhatsThis and TableWhatsThis classes reimplement + text() to make it possible to return texts depending on the + mouse click's position. All the other functionality is + already provided by the generic WhatsThis base class. We ensure + type safety here in the same manner as in the tooltip classes. + \printuntil } + + The HeaderWhatsThis constructor propagates the parameter to the + WhatsThis constructor. + \printto TableWhatsThis::TableWhatsThis + + The implementation of text() uses the QHeader API to determine + whether we have a horizontal or a vertical header and returns + a string which states the header's orientation and section. + \footnote + Note that we have to explicitly scope the orientation + (QObject or QWhatsThis) since HeaderWhatsThis uses multiple + inheritance. \endfootnote + \printuntil } + + Since QTable is a scrollview and has a viewport() which receives + the events, we propagate the table itself and the table's + viewport() to the WhatsThis constructor. + \printuntil } + \printuntil } + \printuntil } + \printuntil } + + The implementation of text() uses the QTable API to get + information about the cell at the requested position. + The QTable API expects contents coordinates, so we need to + translate the point as shown earlier for the tooltip classes. + We use the rtti() function to figure out the item's type + and return a string accordingly. + + \quotefile helpsystem/mainwindow.h + \skipto class MainWindow + \printuntil }; + + A QMainWindow is used to create a user interface that uses the + above classes in addition to Qt Assistant to provide context + sensitive help in the application. + + The MainWindow class declares a slot called assistantSlot() + which creates an instance of Qt Assistant when it is called. + The class keeps references to the tooltip classes as members + because they are not QObjects and need to be deleted explicitly. + The class has a reference to QAssistantClient as a + member as well, to allow easier access to Qt Assistant later on. + + \quotefile helpsystem/mainwindow.cpp + \skipto MainWindow::MainWindow + \printuntil assistant + + The MainWindow constructor creates an instance of + QAssistantClient using QString::null as the first argument + so that the system path is used. + \printto QWhatsThis::whatsThisButton + + A QTable is used as the central widget and the table, the menus + and the toolbar are populated. + \printto // create + + The static function whatsThisButton() creates a QToolButton + which will enter "What's this?" mode when clicked. + \printto // set up + + A QToolTipGroup is created and will show and remove tooltips + in the statusbar as the tooltips are displayed on the widgets. + \printto // set up whats this + + The tooltips are set up. The static function add() sets up a + tooltip on the Assistant toolbutton. Tooltip objects are created + using the QToolTip subclasses, the constructor's first parameter + specifies the widget we want to add dynamic tooltips for and the + second argument specifies the QToolTipGroup they should belong + to. + \printto // connections + + The WhatsThis help is set up. The static function add() adds + What's This? help for the toolbutton which opens Assistant. + Instances of the two WhatsThis subclasses are created for the + headers and the table. What's This? help is also added for the + menu items. + \printto MainWindow::~MainWindow + + Signals and slots are connected, so that the relevant pages will + be displayed in Qt Assistant when clicking on a hyperlink or on + the assistant button. + \printuntil } + + The destructor deletes the tooltips. We need to delete the + tooltips explicitly since QToolTip is, as mentioned above, not + a subclass of QObject and the instances of QToolTip not will be + deleted when the widget is deleted. + \printuntil } + + The assistantSlot() uses applicationDirPath() to find the + location of the documentation files and shows the specified page + in Qt Assistant. + \quotefile helpsystem/main.cpp + \skipto #include + \printuntil } + + The main function is a standard implementation opening + the application main window. + + To build the example go to the helpsystem directory + (QTDIR/examples/helpsystem) run qmake to generate the makefile, + and use the make tool to build the library. +*/ diff --git a/examples/helpsystem/helpsystem.pro b/examples/helpsystem/helpsystem.pro new file mode 100644 index 000000000..5f528049a --- /dev/null +++ b/examples/helpsystem/helpsystem.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +LIBS += -lqassistantclient + +REQUIRES = full-config table + +SOURCES += main.cpp tooltip.cpp mainwindow.cpp whatsthis.cpp +HEADERS += tooltip.h mainwindow.h whatsthis.h diff --git a/examples/helpsystem/main.cpp b/examples/helpsystem/main.cpp new file mode 100644 index 000000000..43c2b73c5 --- /dev/null +++ b/examples/helpsystem/main.cpp @@ -0,0 +1,22 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "mainwindow.h" + + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + MainWindow main; + main.show(); + app.setMainWidget( &main ); + return app.exec(); +} + diff --git a/examples/helpsystem/mainwindow.cpp b/examples/helpsystem/mainwindow.cpp new file mode 100644 index 000000000..e7e4ef9a9 --- /dev/null +++ b/examples/helpsystem/mainwindow.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qassistantclient.h> +#include <qfiledialog.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qstatusbar.h> +#include <qtable.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qtooltip.h> + +#include "mainwindow.h" +#include "tooltip.h" +#include "whatsthis.h" + +MainWindow::MainWindow() +{ + statusBar(); + assistant = new TQAssistantClient( TQDir("../../bin").absPath(), this ); + + TQTable* table = new TQTable( 2, 3, this ); + setCentralWidget( table ); + + // populate table + TQStringList comboEntries; + comboEntries << "one" << "two" << "three" << "four"; + TQComboTableItem* comboItem1 = new TQComboTableItem( table, comboEntries ); + TQComboTableItem* comboItem2 = new TQComboTableItem( table, comboEntries ); + TQCheckTableItem* checkItem1 = new TQCheckTableItem( table, "Check me" ); + TQCheckTableItem* checkItem2 = new TQCheckTableItem( table, "Check me" ); + + table->setItem( 0, 0, comboItem1 ); + table->setItem( 1, 0, comboItem2 ); + + table->setItem( 1, 1, checkItem1 ); + table->setItem( 0, 1, checkItem2 ); + + table->setText( 1, 2, "Text" ); + + table->horizontalHeader()->setLabel( 0, " Combos" ); + table->horizontalHeader()->setLabel( 1, "Checkboxes" ); + table->verticalHeader()->setLabel( 0, "1" ); + table->verticalHeader()->setLabel( 1, "2" ); + + + // populate menubar + TQPopupMenu* fileMenu = new TQPopupMenu( this ); + TQPopupMenu* helpMenu = new TQPopupMenu( this ); + + menuBar()->insertItem( "&File", fileMenu ); + menuBar()->insertItem( "&Help", helpMenu ); + + int fileId = fileMenu->insertItem( "E&xit", this, SLOT(close()) ); + + int helpId = helpMenu->insertItem( "Open Assistant", this, SLOT(assistantSlot()) ); + + // populate toolbar + TQToolBar* toolbar = new TQToolBar( this ); + TQToolButton* assistantButton = new TQToolButton( toolbar ); + assistantButton->setIconSet( TQPixmap("appicon.png") ); + TQWhatsThis::whatsThisButton( toolbar ); + + //create tooltipgroup + TQToolTipGroup * tipGroup = new TQToolTipGroup( this ); + connect( tipGroup, SIGNAL(showTip(const TQString&)), statusBar(), + SLOT(message(const TQString&)) ); + connect( tipGroup, SIGNAL(removeTip()), statusBar(), SLOT(clear()) ); + + // set up tooltips + TQToolTip::add( assistantButton, tr ("Open Assistant"), tipGroup, "Opens TQt Assistant" ); + + horizontalTip = new HeaderToolTip( table->horizontalHeader(), tipGroup ); + verticalTip = new HeaderToolTip( table->verticalHeader(), tipGroup ); + + cellTip = new TableToolTip( table, tipGroup ); + + // set up whats this + TQWhatsThis::add ( assistantButton, "This is a toolbutton which opens Assistant" ); + + HeaderWhatsThis *horizontalWhatsThis = new HeaderWhatsThis( table->horizontalHeader() ); + HeaderWhatsThis *verticalWhatsThis = new HeaderWhatsThis( table->verticalHeader() ); + + TableWhatsThis *cellWhatsThis = new TableWhatsThis( table ); + + fileMenu->setWhatsThis( fileId, "Click here to exit the application" ); + helpMenu->setWhatsThis( helpId, "Click here to open Assistant" ); + + // connections + connect( assistantButton, SIGNAL(clicked()), this, SLOT(assistantSlot()) ); + connect( horizontalWhatsThis, SIGNAL(linkClicked(const TQString&)), assistant, + SLOT(showPage(const TQString&)) ); + connect( verticalWhatsThis, SIGNAL(linkClicked(const TQString&)), assistant, + SLOT(showPage(const TQString&)) ); + connect( cellWhatsThis, SIGNAL(linkClicked(const TQString&)), assistant, + SLOT(showPage(const TQString&)) ); +} + +MainWindow::~MainWindow() +{ + delete horizontalTip; + delete verticalTip; + delete cellTip; +} + +void MainWindow::assistantSlot() +{ + TQString docsPath = TQDir("../../doc").absPath(); + assistant->showPage( TQString("%1/html/qassistantclient.html").arg(docsPath) ); +} diff --git a/examples/helpsystem/mainwindow.h b/examples/helpsystem/mainwindow.h new file mode 100644 index 000000000..32c7239c8 --- /dev/null +++ b/examples/helpsystem/mainwindow.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qmainwindow.h> + +class HeaderToolTip; +class TableToolTip; +class TQAssistantClient; + +class MainWindow : public TQMainWindow +{ + Q_OBJECT +public: + MainWindow(); + ~MainWindow(); + +public slots: + void assistantSlot(); + +private: + HeaderToolTip *horizontalTip; + HeaderToolTip *verticalTip; + TableToolTip *cellTip; + TQAssistantClient *assistant; +}; diff --git a/examples/helpsystem/tooltip.cpp b/examples/helpsystem/tooltip.cpp new file mode 100644 index 000000000..407afa84a --- /dev/null +++ b/examples/helpsystem/tooltip.cpp @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qtooltip.h> +#include <qtable.h> + +#include "tooltip.h" + +HeaderToolTip::HeaderToolTip( TQHeader *header, TQToolTipGroup *group ) +: TQToolTip( header, group ) +{ +} + +void HeaderToolTip::maybeTip ( const TQPoint& p ) +{ + TQHeader *header = (TQHeader*)parentWidget(); + + int section = 0; + + if ( header->orientation() == Horizontal ) + section = header->sectionAt( header->offset() + p.x() ); + else + section = header->sectionAt( header->offset() + p.y() ); + + TQString tipString = header->label( section ); + tip( header->sectionRect( section ), tipString, "This is a section in a header" ); +} + +TableToolTip::TableToolTip( TQTable *tipTable, TQToolTipGroup *group ) +: TQToolTip( tipTable->viewport(), group ), table( tipTable ) +{ +} + + +void TableToolTip::maybeTip ( const TQPoint &p ) +{ + TQPoint cp = table->viewportToContents( p ); + int row = table->rowAt( cp.y() ); + int col = table->columnAt( cp.x() ); + + TQString tipString = table->text( row, col ); + + TQRect cr = table->cellGeometry( row, col ); + cr.moveTopLeft( table->contentsToViewport( cr.topLeft() ) ); + tip( cr, tipString, "This is a cell in a table" ); +} diff --git a/examples/helpsystem/tooltip.h b/examples/helpsystem/tooltip.h new file mode 100644 index 000000000..69c3bb74f --- /dev/null +++ b/examples/helpsystem/tooltip.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TOOLTIP_H +#define TOOLTIP_H + +#include <qtooltip.h> + + +class TQTable; +class TQHeader; + +class HeaderToolTip : public TQToolTip +{ +public: + HeaderToolTip( TQHeader *header, TQToolTipGroup *group = 0 ); + +protected: + void maybeTip ( const TQPoint &p ); +}; + +class TableToolTip : public TQToolTip +{ +public: + TableToolTip( TQTable* table, TQToolTipGroup *group = 0 ); + +protected: + void maybeTip( const TQPoint &p ); + +private: + TQTable *table; +}; + + +#endif diff --git a/examples/helpsystem/whatsthis.cpp b/examples/helpsystem/whatsthis.cpp new file mode 100644 index 000000000..b8511cbe9 --- /dev/null +++ b/examples/helpsystem/whatsthis.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qdir.h> +#include <qheader.h> +#include <qtable.h> + +#include "whatsthis.h" + +WhatsThis::WhatsThis( TQWidget *w, TQWidget *watch ) +: TQWhatsThis( watch ? watch : w ), widget( w ) +{ +} + +TQWidget *WhatsThis::parentWidget() const +{ + return widget; +} + +bool WhatsThis::clicked( const TQString &link ) +{ + if ( !link.isEmpty() ) + emit linkClicked( link ); + + return TRUE; +} + +HeaderWhatsThis::HeaderWhatsThis( TQHeader *h ) +: WhatsThis( h ) +{ +} + +TQString HeaderWhatsThis::text( const TQPoint &p ) +{ + TQHeader *header = (TQHeader*)parentWidget(); + + TQString orient; + int section; + if ( header->orientation() == TQObject::Horizontal ) { + orient = "horizontal"; + section = header->sectionAt( p.x() ); + } else { + orient = "vertical"; + section = header->sectionAt( p.y() ); + } + if( section == -1 ) + return "This is empty space."; + TQString docsPath = TQDir("../../doc").absPath(); + return TQString("This is section number %1 in the %2 <a href=%2/html/qheader.html>header</a>."). + arg(section + 1). + arg(orient). + arg(docsPath); +} + +TableWhatsThis::TableWhatsThis( TQTable *t ) +: WhatsThis( t, t->viewport() ) +{ +} + + +TQString TableWhatsThis::text( const TQPoint &p ) +{ + TQTable *table = (TQTable*)parentWidget(); + + TQPoint cp = table->viewportToContents( p ); + int row = table->rowAt( cp.y() ); + int col = table->columnAt( cp.x() ); + + if ( row == -1 || col == -1 ) + return "This is empty space."; + + TQTableItem* i = table->item( row,col ); + if ( !i ) + return "This is an empty cell."; + + TQString docsPath = TQDir("../../doc").absPath(); + + if ( TQTableItem::RTTI == i->rtti() ) { + return TQString("This is a <a href=%1/html/qtableitem.html>TQTableItem</a>."). + arg(docsPath); + } else if ( TQComboTableItem::RTTI == i->rtti() ) { + return TQString("This is a <a href=%1/html/qcombotableitem.html>TQComboTableItem</a>." + "<br>It can be used to provide multiple-choice items in a table."). + arg(docsPath); + } else if ( TQCheckTableItem::RTTI == i->rtti() ) { + return TQString("This is a <a href=%1/html/qchecktableitem.html>TQCheckTableItem</a>." + "<br>It provide <a href=%1/html/qcheckbox.html>checkboxes</a> in tables."). + arg(docsPath).arg(docsPath); + } + + return "This is a user defined table item."; +} diff --git a/examples/helpsystem/whatsthis.h b/examples/helpsystem/whatsthis.h new file mode 100644 index 000000000..d15aad421 --- /dev/null +++ b/examples/helpsystem/whatsthis.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef WHATSTHIS_H +#define WHATSTHIS_H + +#include <qwhatsthis.h> + +class TQHeader; +class TQTable; + +class WhatsThis : public TQObject, public TQWhatsThis +{ + Q_OBJECT +public: + WhatsThis( TQWidget *w, TQWidget *watch = 0 ); + + bool clicked( const TQString &link ); + TQWidget *parentWidget() const; + +signals: + void linkClicked( const TQString &link ); + +private: + TQWidget *widget; +}; + +class HeaderWhatsThis : public WhatsThis +{ +public: + HeaderWhatsThis( TQHeader *h ); + + TQString text( const TQPoint &p ); +}; + +class TableWhatsThis : public WhatsThis +{ +public: + TableWhatsThis( TQTable *t ); + + TQString text( const TQPoint &p ); +}; + +#endif diff --git a/examples/helpviewer/back.xpm b/examples/helpviewer/back.xpm new file mode 100644 index 000000000..7dc5b72cb --- /dev/null +++ b/examples/helpviewer/back.xpm @@ -0,0 +1,27 @@ +/* XPM */ +/* Drawn by Mark Donohoe for the K Desktop Environment */ +/* See http://www.kde.org */ +static char*back[]={ +"16 16 5 1", +"# c #000000", +"a c #ffffff", +"c c #808080", +"b c #c0c0c0", +". c None", +"................", +".......#........", +"......##........", +".....#a#........", +"....#aa########.", +"...#aabaaaaaaa#.", +"..#aabbbbbbbbb#.", +"...#abbbbbbbbb#.", +"...c#ab########.", +"....c#a#ccccccc.", +".....c##c.......", +"......c#c.......", +".......cc.......", +"........c.......", +"................", +"......................"}; + diff --git a/examples/helpviewer/forward.xpm b/examples/helpviewer/forward.xpm new file mode 100644 index 000000000..2ed813482 --- /dev/null +++ b/examples/helpviewer/forward.xpm @@ -0,0 +1,28 @@ +/* XPM */ +/* Drawn by Mark Donohoe for the K Desktop Environment */ +/* See http://www.kde.org */ +static char*forward[]={ +"16 16 5 1", +"# c #000000", +"a c #ffffff", +"c c #808080", +"b c #c0c0c0", +". c None", +"................", +"................", +".........#......", +".........##.....", +".........#a#....", +"..########aa#...", +"..#aaaaaaabaa#..", +"..#bbbbbbbbbaa#.", +"..#bbbbbbbbba#..", +"..########ba#c..", +"..ccccccc#a#c...", +"........c##c....", +"........c#c.....", +"........cc......", +"........c.......", +"................", +"................"}; + diff --git a/examples/helpviewer/helpviewer.doc b/examples/helpviewer/helpviewer.doc new file mode 100644 index 000000000..b3d344bdb --- /dev/null +++ b/examples/helpviewer/helpviewer.doc @@ -0,0 +1,28 @@ +/* +*/ +/*! \page helpviewer-example.html + + \ingroup examples + \title Simple HTML Help Browser + + This example implements a simple HTML help browser using + Qt's richtext capabilities. + + <hr> + + Header file: + + \include helpviewer/helpwindow.h + + <hr> + + Implementation: + + \include helpviewer/helpwindow.cpp + + <hr> + + Main: + + \include helpviewer/main.cpp +*/ diff --git a/examples/helpviewer/helpviewer.pro b/examples/helpviewer/helpviewer.pro new file mode 100644 index 000000000..580a604f6 --- /dev/null +++ b/examples/helpviewer/helpviewer.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = helpviewer + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = helpwindow.h +SOURCES = helpwindow.cpp \ + main.cpp diff --git a/examples/helpviewer/helpwindow.cpp b/examples/helpviewer/helpwindow.cpp new file mode 100644 index 000000000..4ee587989 --- /dev/null +++ b/examples/helpviewer/helpwindow.cpp @@ -0,0 +1,315 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "helpwindow.h" +#include <qstatusbar.h> +#include <qpixmap.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qiconset.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qstylesheet.h> +#include <qmessagebox.h> +#include <qfiledialog.h> +#include <qapplication.h> +#include <qcombobox.h> +#include <qevent.h> +#include <qlineedit.h> +#include <qobjectlist.h> +#include <qfileinfo.h> +#include <qfile.h> +#include <qdatastream.h> +#include <qprinter.h> +#include <qsimplerichtext.h> +#include <qpainter.h> +#include <qpaintdevicemetrics.h> + +#include <ctype.h> + +HelpWindow::HelpWindow( const TQString& home_, const TQString& _path, + TQWidget* parent, const char *name ) + : TQMainWindow( parent, name, WDestructiveClose ), + pathCombo( 0 ) +{ + readHistory(); + readBookmarks(); + + browser = new TQTextBrowser( this ); + + browser->mimeSourceFactory()->setFilePath( _path ); + browser->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + connect( browser, SIGNAL( sourceChanged(const TQString& ) ), + this, SLOT( sourceChanged( const TQString&) ) ); + + setCentralWidget( browser ); + + if ( !home_.isEmpty() ) + browser->setSource( home_ ); + + connect( browser, SIGNAL( highlighted( const TQString&) ), + statusBar(), SLOT( message( const TQString&)) ); + + resize( 640,700 ); + + TQPopupMenu* file = new TQPopupMenu( this ); + file->insertItem( tr("&New Window"), this, SLOT( newWindow() ), CTRL+Key_N ); + file->insertItem( tr("&Open File"), this, SLOT( openFile() ), CTRL+Key_O ); + file->insertItem( tr("&Print"), this, SLOT( print() ), CTRL+Key_P ); + file->insertSeparator(); + file->insertItem( tr("&Close"), this, SLOT( close() ), CTRL+Key_Q ); + file->insertItem( tr("E&xit"), qApp, SLOT( closeAllWindows() ), CTRL+Key_X ); + + // The same three icons are used twice each. + TQIconSet icon_back( TQPixmap("back.xpm") ); + TQIconSet icon_forward( TQPixmap("forward.xpm") ); + TQIconSet icon_home( TQPixmap("home.xpm") ); + + TQPopupMenu* go = new TQPopupMenu( this ); + backwardId = go->insertItem( icon_back, + tr("&Backward"), browser, SLOT( backward() ), + CTRL+Key_Left ); + forwardId = go->insertItem( icon_forward, + tr("&Forward"), browser, SLOT( forward() ), + CTRL+Key_Right ); + go->insertItem( icon_home, tr("&Home"), browser, SLOT( home() ) ); + + TQPopupMenu* help = new TQPopupMenu( this ); + help->insertItem( tr("&About"), this, SLOT( about() ) ); + help->insertItem( tr("About &TQt"), this, SLOT( aboutTQt() ) ); + + hist = new TQPopupMenu( this ); + TQStringList::Iterator it = history.begin(); + for ( ; it != history.end(); ++it ) + mHistory[ hist->insertItem( *it ) ] = *it; + connect( hist, SIGNAL( activated( int ) ), + this, SLOT( histChosen( int ) ) ); + + bookm = new TQPopupMenu( this ); + bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) ); + bookm->insertSeparator(); + + TQStringList::Iterator it2 = bookmarks.begin(); + for ( ; it2 != bookmarks.end(); ++it2 ) + mBookmarks[ bookm->insertItem( *it2 ) ] = *it2; + connect( bookm, SIGNAL( activated( int ) ), + this, SLOT( bookmChosen( int ) ) ); + + menuBar()->insertItem( tr("&File"), file ); + menuBar()->insertItem( tr("&Go"), go ); + menuBar()->insertItem( tr( "History" ), hist ); + menuBar()->insertItem( tr( "Bookmarks" ), bookm ); + menuBar()->insertSeparator(); + menuBar()->insertItem( tr("&Help"), help ); + + menuBar()->setItemEnabled( forwardId, FALSE); + menuBar()->setItemEnabled( backwardId, FALSE); + connect( browser, SIGNAL( backwardAvailable( bool ) ), + this, SLOT( setBackwardAvailable( bool ) ) ); + connect( browser, SIGNAL( forwardAvailable( bool ) ), + this, SLOT( setForwardAvailable( bool ) ) ); + + + TQToolBar* toolbar = new TQToolBar( this ); + addToolBar( toolbar, "Toolbar"); + TQToolButton* button; + + button = new TQToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar ); + connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) ); + button->setEnabled( FALSE ); + button = new TQToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar ); + connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) ); + button->setEnabled( FALSE ); + button = new TQToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar ); + + toolbar->addSeparator(); + + pathCombo = new TQComboBox( TRUE, toolbar ); + connect( pathCombo, SIGNAL( activated( const TQString & ) ), + this, SLOT( pathSelected( const TQString & ) ) ); + toolbar->setStretchableWidget( pathCombo ); + setRightJustification( TRUE ); + setDockEnabled( DockLeft, FALSE ); + setDockEnabled( DockRight, FALSE ); + + pathCombo->insertItem( home_ ); + browser->setFocus(); + +} + + +void HelpWindow::setBackwardAvailable( bool b) +{ + menuBar()->setItemEnabled( backwardId, b); +} + +void HelpWindow::setForwardAvailable( bool b) +{ + menuBar()->setItemEnabled( forwardId, b); +} + + +void HelpWindow::sourceChanged( const TQString& url ) +{ + if ( browser->documentTitle().isNull() ) + setCaption( "TQt Example - Helpviewer - " + url ); + else + setCaption( "TQt Example - Helpviewer - " + browser->documentTitle() ) ; + + if ( !url.isEmpty() && pathCombo ) { + bool exists = FALSE; + int i; + for ( i = 0; i < pathCombo->count(); ++i ) { + if ( pathCombo->text( i ) == url ) { + exists = TRUE; + break; + } + } + if ( !exists ) { + pathCombo->insertItem( url, 0 ); + pathCombo->setCurrentItem( 0 ); + mHistory[ hist->insertItem( url ) ] = url; + } else + pathCombo->setCurrentItem( i ); + } +} + +HelpWindow::~HelpWindow() +{ + history = mHistory.values(); + + TQFile f( TQDir::currentDirPath() + "/.history" ); + f.open( IO_WriteOnly ); + TQDataStream s( &f ); + s << history; + f.close(); + + bookmarks = mBookmarks.values(); + + TQFile f2( TQDir::currentDirPath() + "/.bookmarks" ); + f2.open( IO_WriteOnly ); + TQDataStream s2( &f2 ); + s2 << bookmarks; + f2.close(); +} + +void HelpWindow::about() +{ + TQMessageBox::about( this, "HelpViewer Example", + "<p>This example implements a simple HTML help viewer " + "using TQt's rich text capabilities</p>" + "<p>It's just about 400 lines of C++ code, so don't expect too much :-)</p>" + ); +} + + +void HelpWindow::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQBrowser" ); +} + +void HelpWindow::openFile() +{ +#ifndef QT_NO_FILEDIALOG + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) + browser->setSource( fn ); +#endif +} + +void HelpWindow::newWindow() +{ + ( new HelpWindow(browser->source(), "qbrowser") )->show(); +} + +void HelpWindow::print() +{ +#ifndef QT_NO_PRINTER + TQPrinter printer( TQPrinter::HighResolution ); + printer.setFullPage(TRUE); + if ( printer.setup( this ) ) { + TQPainter p( &printer ); + if( !p.isActive() ) // starting printing failed + return; + TQPaintDeviceMetrics metrics(p.device()); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + TQSimpleRichText richText( browser->text(), + TQFont(), + browser->context(), + browser->styleSheet(), + browser->mimeSourceFactory(), + view.height() ); + richText.setWidth( &p, view.width() ); + int page = 1; + do { + richText.draw( &p, margin, margin, view, colorGroup() ); + view.moveBy( 0, view.height() ); + p.translate( 0 , -view.height() ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number(page) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number(page) ); + if ( view.top() - margin >= richText.height() ) + break; + printer.newPage(); + page++; + } while (TRUE); + } +#endif +} + +void HelpWindow::pathSelected( const TQString &_path ) +{ + browser->setSource( _path ); + if ( mHistory.values().contains(_path) ) + mHistory[ hist->insertItem( _path ) ] = _path; +} + +void HelpWindow::readHistory() +{ + if ( TQFile::exists( TQDir::currentDirPath() + "/.history" ) ) { + TQFile f( TQDir::currentDirPath() + "/.history" ); + f.open( IO_ReadOnly ); + TQDataStream s( &f ); + s >> history; + f.close(); + while ( history.count() > 20 ) + history.remove( history.begin() ); + } +} + +void HelpWindow::readBookmarks() +{ + if ( TQFile::exists( TQDir::currentDirPath() + "/.bookmarks" ) ) { + TQFile f( TQDir::currentDirPath() + "/.bookmarks" ); + f.open( IO_ReadOnly ); + TQDataStream s( &f ); + s >> bookmarks; + f.close(); + } +} + +void HelpWindow::histChosen( int i ) +{ + if ( mHistory.contains( i ) ) + browser->setSource( mHistory[ i ] ); +} + +void HelpWindow::bookmChosen( int i ) +{ + if ( mBookmarks.contains( i ) ) + browser->setSource( mBookmarks[ i ] ); +} + +void HelpWindow::addBookmark() +{ + mBookmarks[ bookm->insertItem( caption() ) ] = browser->context(); +} diff --git a/examples/helpviewer/helpwindow.h b/examples/helpviewer/helpwindow.h new file mode 100644 index 000000000..19247de2e --- /dev/null +++ b/examples/helpviewer/helpwindow.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef HELPWINDOW_H +#define HELPWINDOW_H + +#include <qmainwindow.h> +#include <qtextbrowser.h> +#include <qstringlist.h> +#include <qmap.h> +#include <qdir.h> + +class TQComboBox; +class TQPopupMenu; + +class HelpWindow : public TQMainWindow +{ + Q_OBJECT +public: + HelpWindow( const TQString& home_, const TQString& path, TQWidget* parent = 0, const char *name=0 ); + ~HelpWindow(); + +private slots: + void setBackwardAvailable( bool ); + void setForwardAvailable( bool ); + + void sourceChanged( const TQString& ); + void about(); + void aboutTQt(); + void openFile(); + void newWindow(); + void print(); + + void pathSelected( const TQString & ); + void histChosen( int ); + void bookmChosen( int ); + void addBookmark(); + +private: + void readHistory(); + void readBookmarks(); + + TQTextBrowser* browser; + TQComboBox *pathCombo; + int backwardId, forwardId; + TQStringList history, bookmarks; + TQMap<int, TQString> mHistory, mBookmarks; + TQPopupMenu *hist, *bookm; + +}; + + + + + +#endif + diff --git a/examples/helpviewer/home.xpm b/examples/helpviewer/home.xpm new file mode 100644 index 000000000..9c1369d9f --- /dev/null +++ b/examples/helpviewer/home.xpm @@ -0,0 +1,27 @@ +/* XPM */ +/* Drawn by Mark Donohoe for the K Desktop Environment */ +/* See http://www.kde.org */ +static char*home[]={ +"16 16 4 1", +"# c #000000", +"a c #ffffff", +"b c #c0c0c0", +". c None", +"........... ....", +" ....##.......", +"..#...####......", +"..#..#aabb#.....", +"..#.#aaaabb#....", +"..##aaaaaabb#...", +"..#aaaaaaaabb#..", +".#aaaaaaaaabbb#.", +"###aaaaaaaabb###", +"..#aaaaaaaabb#..", +"..#aaa###aabb#..", +"..#aaa#.#aabb#..", +"..#aaa#.#aabb#..", +"..#aaa#.#aabb#..", +"..#aaa#.#aabb#..", +"..#####.######..", +"................"}; + diff --git a/examples/helpviewer/main.cpp b/examples/helpviewer/main.cpp new file mode 100644 index 000000000..20ddd2deb --- /dev/null +++ b/examples/helpviewer/main.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "helpwindow.h" +#include <qapplication.h> +#include <qdir.h> +#include <stdlib.h> + + +int main( int argc, char ** argv ) +{ + TQApplication::setColorSpec( TQApplication::ManyColor ); + TQApplication a(argc, argv); + + TQString home; + if (argc > 1) { + home = argv[1]; + } else { + // Use a hard coded path. It is only an example. + home = TQDir( "../../doc/html/index.html" ).absPath(); + } + + HelpWindow *help = new HelpWindow(home, ".", 0, "help viewer"); + help->setCaption("TQt Example - Helpviewer"); + if ( TQApplication::desktop()->width() > 400 + && TQApplication::desktop()->height() > 500 ) + help->show(); + else + help->showMaximized(); + + TQObject::connect( &a, SIGNAL(lastWindowClosed()), + &a, SLOT(tquit()) ); + + return a.exec(); +} diff --git a/examples/i18n/README b/examples/i18n/README new file mode 100644 index 000000000..2f740f45b --- /dev/null +++ b/examples/i18n/README @@ -0,0 +1,9 @@ +To add a language "XX": + + 1. Add mywidget_XX.ts to the TRANSLATIONS entry of i18n.pro. + 2. Run 'lupdate i18n.pro'. + 3. Run 'linguist mywidget_XX.ts' and translate the strings. + 4. Run 'lrelease i18n.pro'. + 5. Run './i18n XX'. + +Contributions are welcome. Send them to qt-bugs@trolltech.com. diff --git a/examples/i18n/i18n.doc b/examples/i18n/i18n.doc new file mode 100644 index 000000000..3f31627ca --- /dev/null +++ b/examples/i18n/i18n.doc @@ -0,0 +1,34 @@ +/* +*/ +/*! \page i18n-example.html + + \ingroup examples + \title Internationalization + + This example shows how to internationalize applications. Start it with + <pre># i18n de</pre> + to get a german version and with + <pre># i18n en</pre> + to get the english version. + + Refer also to <a href="i18n.html">the internationalization documentation</a>. + + <hr> + + Header file: + + \include i18n/mywidget.h + + <hr> + + Implementation: + + \include i18n/mywidget.cpp + + <hr> + + Main: + + \include i18n/main.cpp +*/ + diff --git a/examples/i18n/i18n.pro b/examples/i18n/i18n.pro new file mode 100644 index 000000000..f0b84e247 --- /dev/null +++ b/examples/i18n/i18n.pro @@ -0,0 +1,23 @@ +TEMPLATE = app +TARGET = i18n + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = mywidget.h +SOURCES = main.cpp \ + mywidget.cpp +TRANSLATIONS = mywidget_cs.ts \ + mywidget_de.ts \ + mywidget_el.ts \ + mywidget_en.ts \ + mywidget_eo.ts \ + mywidget_fr.ts \ + mywidget_it.ts \ + mywidget_jp.ts \ + mywidget_ko.ts \ + mywidget_no.ts \ + mywidget_ru.ts \ + mywidget_zh.ts diff --git a/examples/i18n/main.cpp b/examples/i18n/main.cpp new file mode 100644 index 000000000..2c9fb2fc3 --- /dev/null +++ b/examples/i18n/main.cpp @@ -0,0 +1,171 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qtranslator.h> +#include <qfileinfo.h> +#include <qmessagebox.h> +#include <qcheckbox.h> +#include <qvbox.h> +#include <qlayout.h> +#include <qbuttongroup.h> +#include <qpushbutton.h> +#include <qsignalmapper.h> +#include <qtextcodec.h> +#include <stdlib.h> + +#if defined(Q_OS_UNIX) +#include <unistd.h> +#endif + +#include "mywidget.h" + +//#define USE_I18N_FONT + +class TQVDialog : public TQDialog { +public: + TQVDialog(TQWidget *parent=0, const char *name=0, bool modal=FALSE, + WFlags f=0) : TQDialog(parent,name,modal,f) + { + TQVBoxLayout* vb = new TQVBoxLayout(this,8); + vb->setAutoAdd(TRUE); + hb = 0; + sm = new TQSignalMapper(this); + connect(sm,SIGNAL(mapped(int)),this,SLOT(done(int))); + } + void addButtons( const TQString& cancel=TQString::null, + const TQString& ok=TQString::null, + const TQString& mid1=TQString::null, + const TQString& mid2=TQString::null, + const TQString& mid3=TQString::null) + { + addButton(ok.isNull() ? TQObject::tr("OK") : ok, 1); + if ( !mid1.isNull() ) addButton(mid1,2); + if ( !mid2.isNull() ) addButton(mid2,3); + if ( !mid3.isNull() ) addButton(mid3,4); + addButton(cancel.isNull() ? TQObject::tr("Cancel") : cancel, 0); + } + + void addButton( const TQString& text, int result ) + { + if ( !hb ) + hb = new TQHBox(this); + TQPushButton *c = new TQPushButton(text, hb); + sm->setMapping(c,result); + connect(c,SIGNAL(clicked()),sm,SLOT(map())); + } + +private: + TQSignalMapper *sm; + TQHBox *hb; +}; + +MyWidget* showLang(TQString lang) +{ + + static TQTranslator *translator = 0; + + qApp->setPalette(TQPalette(TQColor(220-rand()%64,220-rand()%64,220-rand()%64))); + + lang = "mywidget_" + lang + ".qm"; + TQFileInfo fi( lang ); + + if ( !fi.exists() ) { + TQMessageBox::warning( 0, "File error", + TQString("Cannot find translation for language: "+lang+ + "\n(try eg. 'de', 'ko' or 'no')") ); + return 0; + } + if ( translator ) { + qApp->removeTranslator( translator ); + delete translator; + } + translator = new TQTranslator( 0 ); + translator->load( lang, "." ); + qApp->installTranslator( translator ); + MyWidget *m = new MyWidget; + m->setCaption("TQt Example - i18n - " + m->caption() ); + return m; +} + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + + const char* qm[]= + { "ar", "cs", "de", "el", "en", "eo", "fr", "it", "jp", "ko", "no", "ru", "zh", 0 }; + +#if defined(Q_OS_UNIX) + srand( getpid() << 2 ); +#endif + + TQString lang; + if ( argc == 2 ) + lang = argv[1]; + + if ( argc != 2 || lang == "all" ) { + TQVDialog dlg(0,0,TRUE); + TQCheckBox* qmb[sizeof(qm)/sizeof(qm[0])]; + int r; + if ( lang == "all" ) { + r = 2; + } else { + TQButtonGroup *bg = new TQButtonGroup(4,TQt::Vertical,"Choose Locales",&dlg); + TQString loc = TQTextCodec::locale(); + for ( int i=0; qm[i]; i++ ) { + qmb[i] = new TQCheckBox((const char*)qm[i],bg); + qmb[i]->setChecked( loc == qm[i] ); + } + dlg.addButtons("Cancel","OK","All"); + r = dlg.exec(); + } + if ( r ) { + TQRect screen = qApp->desktop()->availableGeometry(); + bool tight = screen.width() < 1024; + int x=screen.left()+5; + int y=screen.top()+25; + for ( int i=0; qm[i]; i++ ) { + if ( r == 2 || qmb[i]->isChecked() ) { + MyWidget* w = showLang((const char*)qm[i]); + + if( w == 0 ) exit( 0 ); + TQObject::connect(w, SIGNAL(closed()), qApp, SLOT(tquit())); + w->setGeometry(x,y,197,356); + w->show(); + if ( tight ) { + x += 8; + y += 8; + } else { + x += 205; + if ( x > 1000 ) { + x = 5; + y += 384; + } + } + } + } + } else { + exit( 0 ); + } + } else { + TQString lang = argv[1]; + TQWidget* m = showLang(lang); + app.setMainWidget( m ); + m->setCaption("TQt Example - i18n"); + m->show(); + } + +#ifdef USE_I18N_FONT + memorymanager->savePrerenderedFont(font.handle(),FALSE); +#endif + + // While we run "all", kill them all + return app.exec(); + +} diff --git a/examples/i18n/mywidget.cpp b/examples/i18n/mywidget.cpp new file mode 100644 index 000000000..94e21144e --- /dev/null +++ b/examples/i18n/mywidget.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qbuttongroup.h> +#include <qradiobutton.h> +#include <qlabel.h> +#include <qlistbox.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qaccel.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qstatusbar.h> +#include <qapplication.h> + +#include "mywidget.h" + +MyWidget::MyWidget( TQWidget* parent, const char* name ) + : TQMainWindow( parent, name ) +{ + TQVBox* central = new TQVBox(this); + central->setMargin( 5 ); + central->setSpacing( 5 ); + setCentralWidget(central); + + TQPopupMenu* file = new TQPopupMenu(this); + file->insertItem( tr("E&xit"), qApp, SLOT(tquit()), + TQAccel::stringToKey(tr("Ctrl+Q")) ); + menuBar()->insertItem( tr("&File"), file ); + + setCaption( tr( "Internationalization Example" ) ); + + TQString l; + statusBar()->message( tr("Language: English") ); + + ( void )new TQLabel( tr( "The Main Window" ), central ); + + TQButtonGroup* gbox = new TQButtonGroup( 1, TQGroupBox::Horizontal, + tr( "View" ), central ); + (void)new TQRadioButton( tr( "Perspective" ), gbox ); + (void)new TQRadioButton( tr( "Isometric" ), gbox ); + (void)new TQRadioButton( tr( "Oblique" ), gbox ); + + initChoices(central); +} + +static const char* choices[] = { + QT_TRANSLATE_NOOP( "MyWidget", "First" ), + QT_TRANSLATE_NOOP( "MyWidget", "Second" ), + QT_TRANSLATE_NOOP( "MyWidget", "Third" ), + 0 +}; + +void MyWidget::initChoices(TQWidget* parent) +{ + TQListBox* lb = new TQListBox( parent ); + for ( int i = 0; choices[i]; i++ ) + lb->insertItem( tr( choices[i] ) ); +} + +void MyWidget::closeEvent(TQCloseEvent* e) +{ + TQWidget::closeEvent(e); + emit closed(); +} diff --git a/examples/i18n/mywidget.h b/examples/i18n/mywidget.h new file mode 100644 index 000000000..964e05c49 --- /dev/null +++ b/examples/i18n/mywidget.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef MYWIDGET_H +#define MYWIDGET_H + +#include <qmainwindow.h> +#include <qstring.h> + +class MyWidget : public TQMainWindow +{ + Q_OBJECT + +public: + MyWidget( TQWidget* parent=0, const char* name = 0 ); + +signals: + void closed(); + +protected: + void closeEvent(TQCloseEvent*); + +private: + static void initChoices(TQWidget* parent); +}; + +#endif diff --git a/examples/i18n/mywidget_ar.qm b/examples/i18n/mywidget_ar.qm Binary files differnew file mode 100644 index 000000000..a8afc9d5e --- /dev/null +++ b/examples/i18n/mywidget_ar.qm diff --git a/examples/i18n/mywidget_ar.ts b/examples/i18n/mywidget_ar.ts new file mode 100644 index 000000000..837417ff5 --- /dev/null +++ b/examples/i18n/mywidget_ar.ts @@ -0,0 +1,73 @@ +<!DOCTYPE TS><TS> +<context> + <name>MyWidget</name> + <message> + <source>E&xit...</source> + <translation type="obsolete">&Esci...</translation> + </message> + <message> + <source>First</source> + <translation>Ø£Ù^Ù?</translation> + </message> + <message> + <source>Internationalization Example</source> + <translation>Ù?ثاÙ? اÙ?تدÙ^ÙSÙ?</translation> + </message> + <message> + <source>Isometric</source> + <translation>Ù?تÙ?اثÙ?</translation> + </message> + <message> + <source>Language: English</source> + <translation>اÙ?Ù?غة: اÙ?عربÙSØ©</translation> + </message> + <message> + <source>Oblique</source> + <translation>Ù?صÙ?ت</translation> + </message> + <message> + <source>Perspective</source> + <translation>Ù?Ù?ظÙ^ر</translation> + </message> + <message> + <source>Second</source> + <translation type="unfinished">ثاÙ?Ù?</translation> + </message> + <message> + <source>The Main Window</source> + <translation type="unfinished">اÙ?Ù?اÙ?ذة اÙ?رئÙSسÙSØ©</translation> + </message> + <message> + <source>Third</source> + <translation type="unfinished">ثاÙ?Ø«</translation> + </message> + <message> + <source>View</source> + <translation type="unfinished">Ù?رئÙ?</translation> + </message> + <message> + <source>E&xit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> + diff --git a/examples/i18n/mywidget_cs.qm b/examples/i18n/mywidget_cs.qm Binary files differnew file mode 100644 index 000000000..f95090d63 --- /dev/null +++ b/examples/i18n/mywidget_cs.qm diff --git a/examples/i18n/mywidget_cs.ts b/examples/i18n/mywidget_cs.ts new file mode 100644 index 000000000..4cf61f156 --- /dev/null +++ b/examples/i18n/mywidget_cs.ts @@ -0,0 +1,75 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Pohled</translation> + </message> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">&Soubor</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">&Konec</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">PrvnÃ</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">TÅ™etÃ</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Jayzk: ÄŒeský</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">Hlavnà okno</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+Q</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">NaklonÄ›ný</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Druhý</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isometrický</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">PerspektivnÃ</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Ukázka lokalizace</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>QAccel</name> + <message encoding="UTF-8"> + <source>Ctrl</source> + <translation type="obsolete">Ctrl</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_de.qm b/examples/i18n/mywidget_de.qm Binary files differnew file mode 100644 index 000000000..c251e2498 --- /dev/null +++ b/examples/i18n/mywidget_de.qm diff --git a/examples/i18n/mywidget_de.ts b/examples/i18n/mywidget_de.ts new file mode 100644 index 000000000..6533b9892 --- /dev/null +++ b/examples/i18n/mywidget_de.ts @@ -0,0 +1,75 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Ansicht</translation> + </message> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">&Datei</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">Be&enden</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Erstens</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">Drittens</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Sprache: Deutsch</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">Das Hauptfenster</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+E</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Schief</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Zweitens</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isometrisch</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Perspektivisch</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Internationalisierungsbeispiel</translation> + </message> +</context> +<context encoding="UTF-8"> + <name>QAccel</name> + <message encoding="UTF-8"> + <source>Ctrl</source> + <translation type="obsolete">Strg</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_el.qm b/examples/i18n/mywidget_el.qm Binary files differnew file mode 100644 index 000000000..15d768951 --- /dev/null +++ b/examples/i18n/mywidget_el.qm diff --git a/examples/i18n/mywidget_el.ts b/examples/i18n/mywidget_el.ts new file mode 100644 index 000000000..59fb2289a --- /dev/null +++ b/examples/i18n/mywidget_el.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">&ΑÏχείο</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+Q</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">Έ&ξοδος</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Î Ïώτο</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">ΠαÏάδειγμα διεθνοποίησης</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">ΙσομετÏική</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Γλώσσα: Ελληνικά</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Πλάγια</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Î Ïοοπτική</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">ΔεÏτεÏο</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">ΚÏÏιο παÏάθυÏο</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">ΤÏίτο</translation> + </message> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Όψη</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_en.qm b/examples/i18n/mywidget_en.qm Binary files differnew file mode 100644 index 000000000..6bd22c41d --- /dev/null +++ b/examples/i18n/mywidget_en.qm diff --git a/examples/i18n/mywidget_en.ts b/examples/i18n/mywidget_en.ts new file mode 100644 index 000000000..54c4df8ee --- /dev/null +++ b/examples/i18n/mywidget_en.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context> + <name>MyWidget</name> + <message> + <source>E&xit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Internationalization Example</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Language: English</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The Main Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>View</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Perspective</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Isometric</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Oblique</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>First</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Second</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Third</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_eo.qm b/examples/i18n/mywidget_eo.qm Binary files differnew file mode 100644 index 000000000..372cf7921 --- /dev/null +++ b/examples/i18n/mywidget_eo.qm diff --git a/examples/i18n/mywidget_eo.ts b/examples/i18n/mywidget_eo.ts new file mode 100644 index 000000000..381870dee --- /dev/null +++ b/examples/i18n/mywidget_eo.ts @@ -0,0 +1,72 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">&Dosiero</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+F</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit...</source> + <translation type="obsolete">&Fini...</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Unue</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Ekzemplo pri internaciigo</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isometria</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Lingvo: Esperanto (ĈĜĤĴŜŬĉÄĥĵÅÅ)</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Oblikva</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Perspektiva</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Due</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">La Ĉeffenestro</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">Trie</translation> + </message> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Aspekto</translation> + </message> + <message> + <source>E&xit</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_fr.qm b/examples/i18n/mywidget_fr.qm Binary files differnew file mode 100644 index 000000000..12a846409 --- /dev/null +++ b/examples/i18n/mywidget_fr.qm diff --git a/examples/i18n/mywidget_fr.ts b/examples/i18n/mywidget_fr.ts new file mode 100644 index 000000000..a029084a8 --- /dev/null +++ b/examples/i18n/mywidget_fr.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Vue</translation> + </message> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">&Fichier</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">&Quitter</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Premier</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">Troisième</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Langage : Français</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">La fenêtre principale</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+Q</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Oblique</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Second</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isométrique</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Perspective</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Exemple d'internationalisation</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_it.qm b/examples/i18n/mywidget_it.qm Binary files differnew file mode 100644 index 000000000..075bee250 --- /dev/null +++ b/examples/i18n/mywidget_it.qm diff --git a/examples/i18n/mywidget_it.ts b/examples/i18n/mywidget_it.ts new file mode 100644 index 000000000..a450deb4c --- /dev/null +++ b/examples/i18n/mywidget_it.ts @@ -0,0 +1,72 @@ +<!DOCTYPE TS><TS> +<context> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>E&xit...</source> + <translation type="obsolete">&Esci...</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Primo</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Esempio di localizzazione</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isometrica</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Lingua: Italiano</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Obliqua</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Prospettica</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Secondo</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">La Finestra Principale</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">Terzo</translation> + </message> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Vista</translation> + </message> + <message> + <source>E&xit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_jp.qm b/examples/i18n/mywidget_jp.qm Binary files differnew file mode 100644 index 000000000..8942dd7c1 --- /dev/null +++ b/examples/i18n/mywidget_jp.qm diff --git a/examples/i18n/mywidget_jp.ts b/examples/i18n/mywidget_jp.ts new file mode 100644 index 000000000..2a7345f60 --- /dev/null +++ b/examples/i18n/mywidget_jp.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">ファイル(&F)</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+Q</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">終了(&X)</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">第一行</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">国際化(i18n)ã®ä¾‹</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">ç‰è§’投影法</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">言語: 日本語</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">æ–œã‚æŠ•å½±æ³•</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">é 近法</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">第二行</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">メインウィンドウ</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">第三行</translation> + </message> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">表示方å¼</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_ko.qm b/examples/i18n/mywidget_ko.qm Binary files differnew file mode 100644 index 000000000..dccc2ba9f --- /dev/null +++ b/examples/i18n/mywidget_ko.qm diff --git a/examples/i18n/mywidget_ko.ts b/examples/i18n/mywidget_ko.ts new file mode 100644 index 000000000..acc8f9b5b --- /dev/null +++ b/examples/i18n/mywidget_ko.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">파ì¼&F</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+E</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">종료&X</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">첫번째</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">êµì œí™” ì˜ˆì œ</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isometric</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">언어 : 한êµì–´</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Oblique</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Perspective</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">ë‘번째</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">ë©”ì¸ ìœˆë„ìš°</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">세번째</translation> + </message> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">보기</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_no.qm b/examples/i18n/mywidget_no.qm Binary files differnew file mode 100644 index 000000000..2adc1361f --- /dev/null +++ b/examples/i18n/mywidget_no.qm diff --git a/examples/i18n/mywidget_no.ts b/examples/i18n/mywidget_no.ts new file mode 100644 index 000000000..341c66477 --- /dev/null +++ b/examples/i18n/mywidget_no.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Visning</translation> + </message> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">&Fil</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">&Slutt</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Første</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">Tredje</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">SprÃ¥k: Norsk</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">Hovedvinduet</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+S</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">Skjev</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Andre</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">Isometrisk</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">Perspektiv</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Internasjonaliseringseksempel</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_ru.qm b/examples/i18n/mywidget_ru.qm Binary files differnew file mode 100644 index 000000000..ebc512ecf --- /dev/null +++ b/examples/i18n/mywidget_ru.qm diff --git a/examples/i18n/mywidget_ru.ts b/examples/i18n/mywidget_ru.ts new file mode 100644 index 000000000..07070b036 --- /dev/null +++ b/examples/i18n/mywidget_ru.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">Вид</translation> + </message> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">Файл</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">Выход</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">Первый</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">Третий</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">Язык: РуÑÑкий</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">Главное окно</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">КурÑив</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">Второй</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">ИзометричеÑкий</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">ПерÑпектива</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">Пример интернациноализации</translation> + </message> + <message> + <source>Ctrl+Q</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/i18n/mywidget_zh.qm b/examples/i18n/mywidget_zh.qm Binary files differnew file mode 100644 index 000000000..a890c0961 --- /dev/null +++ b/examples/i18n/mywidget_zh.qm diff --git a/examples/i18n/mywidget_zh.ts b/examples/i18n/mywidget_zh.ts new file mode 100644 index 000000000..8b015d6d6 --- /dev/null +++ b/examples/i18n/mywidget_zh.ts @@ -0,0 +1,68 @@ +<!DOCTYPE TS><TS> +<context encoding="UTF-8"> + <name>MyWidget</name> + <message encoding="UTF-8"> + <source>View</source> + <translation type="unfinished">视图</translation> + </message> + <message encoding="UTF-8"> + <source>&File</source> + <translation type="unfinished">文件[&F]</translation> + </message> + <message encoding="UTF-8"> + <source>E&xit</source> + <translation type="unfinished">退出[&x]</translation> + </message> + <message encoding="UTF-8"> + <source>First</source> + <translation type="unfinished">第一个</translation> + </message> + <message encoding="UTF-8"> + <source>Third</source> + <translation type="unfinished">第三个</translation> + </message> + <message encoding="UTF-8"> + <source>Language: English</source> + <translation type="unfinished">è¯è¨€: ç®€ä½“ä¸æ–‡</translation> + </message> + <message encoding="UTF-8"> + <source>The Main Window</source> + <translation type="unfinished">主窗å£</translation> + </message> + <message encoding="UTF-8"> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+Q</translation> + </message> + <message encoding="UTF-8"> + <source>Oblique</source> + <translation type="unfinished">斜投影</translation> + </message> + <message encoding="UTF-8"> + <source>Second</source> + <translation type="unfinished">第二个</translation> + </message> + <message encoding="UTF-8"> + <source>Isometric</source> + <translation type="unfinished">ç‰è§’投影</translation> + </message> + <message encoding="UTF-8"> + <source>Perspective</source> + <translation type="unfinished">é€è§†æŠ•å½±</translation> + </message> + <message encoding="UTF-8"> + <source>Internationalization Example</source> + <translation type="unfinished">国际化范例</translation> + </message> +</context> +<context> + <name>QVDialog</name> + <message> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/examples/iconview/iconview.doc b/examples/iconview/iconview.doc new file mode 100644 index 000000000..5ef16a480 --- /dev/null +++ b/examples/iconview/iconview.doc @@ -0,0 +1,16 @@ +/* +*/ +/*! \page iconview-example.html + + \ingroup examples + \title Iconview + + This example implements a flexible icon view which can store + lots of icon items. It supports Drag&Drop, different selection modes, + view modes, rubberband selection, etc. + + Main: + + \include iconview/main.cpp +*/ + diff --git a/examples/iconview/iconview.pro b/examples/iconview/iconview.pro new file mode 100644 index 000000000..1d38eecf3 --- /dev/null +++ b/examples/iconview/iconview.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = iconview + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = iconview full-config + +HEADERS = +SOURCES = main.cpp diff --git a/examples/iconview/main.cpp b/examples/iconview/main.cpp new file mode 100644 index 000000000..18daafd08 --- /dev/null +++ b/examples/iconview/main.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qiconview.h> +#include <qapplication.h> +#include <qdragobject.h> +#include <qpixmap.h> +#include <qiconset.h> + +#include <qmime.h> +#include <stdio.h> + +class ListenDND : public TQObject +{ + Q_OBJECT + +public: + ListenDND( TQWidget *w ) + : view( w ) + {} + +public slots: + void dropped( TQDropEvent *mime ) { + qDebug( "Dropped Mimesource %p into the view %p", mime, view ); + qDebug( " Formats:" ); + int i = 0; + const char *str = mime->format( i ); + qDebug( " %s", str ); + while ( str ) { + qDebug( " %s", str ); + str = mime->format( ++i ); + } + }; + void moved() { + qDebug( "All selected items were moved to another widget" ); + } + +protected: + TQWidget *view; + +}; + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + TQIconView qiconview; + qiconview.setSelectionMode( TQIconView::Extended ); + + for ( unsigned int i = 0; i < 3000; i++ ) { + TQIconViewItem *item = new TQIconViewItem( &qiconview, TQString( "Item %1" ).arg( i + 1 ) ); + item->setRenameEnabled( TRUE ); + } + + qiconview.setCaption( "TQt Example - Iconview" ); + + ListenDND listen_dnd( &qiconview ); + TQObject::connect( &qiconview, SIGNAL( dropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ), + &listen_dnd, SLOT( dropped( TQDropEvent * ) ) ); + TQObject::connect( &qiconview, SIGNAL( moved() ), &listen_dnd, SLOT( moved() ) ); + + a.setMainWidget( &qiconview ); + qiconview.show(); + qiconview.resize( qiconview.sizeHint() ); + + return a.exec(); +} + +#include "main.moc" diff --git a/examples/iconview/simple_dd/main.cpp b/examples/iconview/simple_dd/main.cpp new file mode 100644 index 000000000..3093e89a9 --- /dev/null +++ b/examples/iconview/simple_dd/main.cpp @@ -0,0 +1,187 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" + +const char* red_icon[]={ +"16 16 2 1", +"r c red", +". c None", +"................", +"................", +"..rrrrrrrrrrrr..", +"..rrrrrrrrrrrr..", +"..rrrrrrrrrrrr..", +"..rrr......rrr..", +"..rrr......rrr..", +"..rrr......rrr..", +"..rrr......rrr..", +"..rrr......rrr..", +"..rrr......rrr..", +"..rrrrrrrrrrrr..", +"..rrrrrrrrrrrr..", +"..rrrrrrrrrrrr..", +"................", +"................"}; + +const char* blue_icon[]={ +"16 16 2 1", +"b c blue", +". c None", +"................", +"................", +"..bbbbbbbbbbbb..", +"..bbbbbbbbbbbb..", +"..bbbbbbbbbbbb..", +"..bbb......bbb..", +"..bbb......bbb..", +"..bbb......bbb..", +"..bbb......bbb..", +"..bbb......bbb..", +"..bbb......bbb..", +"..bbbbbbbbbbbb..", +"..bbbbbbbbbbbb..", +"..bbbbbbbbbbbb..", +"................", +"................"}; + +const char* green_icon[]={ +"16 16 2 1", +"g c green", +". c None", +"................", +"................", +"..gggggggggggg..", +"..gggggggggggg..", +"..gggggggggggg..", +"..ggg......ggg..", +"..ggg......ggg..", +"..ggg......ggg..", +"..ggg......ggg..", +"..ggg......ggg..", +"..ggg......ggg..", +"..gggggggggggg..", +"..gggggggggggg..", +"..gggggggggggg..", +"................", +"................"}; + + +// ListBox -- low level drag and drop + +DDListBox::DDListBox( TQWidget * parent, const char * name, WFlags f ) : + TQListBox( parent, name, f ) +{ + setAcceptDrops( TRUE ); + dragging = FALSE; +} + + +void DDListBox::dragEnterEvent( TQDragEnterEvent *evt ) +{ + if ( TQTextDrag::canDecode( evt ) ) + evt->accept(); +} + + +void DDListBox::dropEvent( TQDropEvent *evt ) +{ + TQString text; + + if ( TQTextDrag::decode( evt, text ) ) + insertItem( text ); +} + + +void DDListBox::mousePressEvent( TQMouseEvent *evt ) +{ + TQListBox::mousePressEvent( evt ); + dragging = TRUE; +} + + +void DDListBox::mouseMoveEvent( TQMouseEvent * ) +{ + if ( dragging ) { + TQDragObject *d = new TQTextDrag( currentText(), this ); + d->dragCopy(); // do NOT delete d. + dragging = FALSE; + } +} + + +// IconViewIcon -- high level drag and drop + + +bool DDIconViewItem::acceptDrop( const TQMimeSource *mime ) const +{ + if ( mime->provides( "text/plain" ) ) + return TRUE; + return FALSE; +} + + +void DDIconViewItem::dropped( TQDropEvent *evt, const TQValueList<TQIconDragItem>& ) +{ + TQString label; + + if ( TQTextDrag::decode( evt, label ) ) + setText( label ); +} + + +// IconView -- high level drag and drop + +TQDragObject *DDIconView::dragObject() +{ + return new TQTextDrag( currentItem()->text(), this ); +} + +void DDIconView::slotNewItem( TQDropEvent *evt, const TQValueList<TQIconDragItem>& ) +{ + TQString label; + + if ( TQTextDrag::decode( evt, label ) ) { + DDIconViewItem *item = new DDIconViewItem( this, label ); + item->setRenameEnabled( TRUE ); + } +} + + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + // Create and show the widgets + TQSplitter *split = new TQSplitter(); + DDIconView *iv = new DDIconView( split ); + (void) new DDListBox( split ); + app.setMainWidget( split ); + split->resize( 600, 400 ); + split->show(); + + // Set up the connection so that we can drop items into the icon view + TQObject::connect( + iv, SIGNAL(dropped(TQDropEvent*, const TQValueList<TQIconDragItem>&)), + iv, SLOT(slotNewItem(TQDropEvent*, const TQValueList<TQIconDragItem>&))); + + // Populate the TQIconView with icons + DDIconViewItem *item; + item = new DDIconViewItem( iv, "Red", TQPixmap( red_icon ) ); + item->setRenameEnabled( TRUE ); + item = new DDIconViewItem( iv, "Green", TQPixmap( green_icon ) ); + item->setRenameEnabled( TRUE ); + item = new DDIconViewItem( iv, "Blue", TQPixmap( blue_icon ) ); + item->setRenameEnabled( TRUE ); + + return app.exec(); +} + + diff --git a/examples/iconview/simple_dd/main.h b/examples/iconview/simple_dd/main.h new file mode 100644 index 000000000..062d47f78 --- /dev/null +++ b/examples/iconview/simple_dd/main.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qcursor.h> +#include <qsplitter.h> +#include <qlistbox.h> +#include <qiconview.h> +#include <qpixmap.h> + +class TQDragEnterEvent; +class TQDragDropEvent; + + +class DDListBox : public TQListBox +{ + Q_OBJECT +public: + DDListBox( TQWidget * parent = 0, const char * name = 0, WFlags f = 0 ); + // Low-level drag and drop + void dragEnterEvent( TQDragEnterEvent *evt ); + void dropEvent( TQDropEvent *evt ); + void mousePressEvent( TQMouseEvent *evt ); + void mouseMoveEvent( TQMouseEvent * ); +private: + int dragging; +}; + + +class DDIconViewItem : public TQIconViewItem +{ +public: + DDIconViewItem( TQIconView *parent, const TQString& text, const TQPixmap& icon ) : + TQIconViewItem( parent, text, icon ) {} + DDIconViewItem( TQIconView *parent, const TQString &text ) : + TQIconViewItem( parent, text ) {} + // High-level drag and drop + bool acceptDrop( const TQMimeSource *mime ) const; + void dropped( TQDropEvent *evt, const TQValueList<TQIconDragItem>& ); +}; + + +class DDIconView : public TQIconView +{ + Q_OBJECT +public: + DDIconView( TQWidget * parent = 0, const char * name = 0, WFlags f = 0 ) : + TQIconView( parent, name, f ) {} + // High-level drag and drop + TQDragObject *dragObject(); +public slots: + void slotNewItem( TQDropEvent *evt, const TQValueList<TQIconDragItem>& list ); +}; + diff --git a/examples/iconview/simple_dd/simple_dd.doc b/examples/iconview/simple_dd/simple_dd.doc new file mode 100644 index 000000000..257059366 --- /dev/null +++ b/examples/iconview/simple_dd/simple_dd.doc @@ -0,0 +1,29 @@ +/*! \page simple_dd-example.html + + \ingroup examples + \title Drag and Drop (Simple) + + This provides a very simple example of Qt's drag and drop + functionality. + + For a more complete example see the \link dragdrop-example.html + Drag and Drop example\endlink. + + + <hr> + + Header file: + + \include iconview/simple_dd/main.h + + <hr> + + Implementation: + + \include iconview/simple_dd/main.cpp + +*/ + + + + diff --git a/examples/iconview/simple_dd/simple_dd.pro b/examples/iconview/simple_dd/simple_dd.pro new file mode 100644 index 000000000..5ccef9c6c --- /dev/null +++ b/examples/iconview/simple_dd/simple_dd.pro @@ -0,0 +1,10 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = main.h +SOURCES = main.cpp + + diff --git a/examples/layout/layout.cpp b/examples/layout/layout.cpp new file mode 100644 index 000000000..26f2a8d14 --- /dev/null +++ b/examples/layout/layout.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qlabel.h> +#include <qcolor.h> +#include <qpushbutton.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qmultilineedit.h> +#include <qmenubar.h> +#include <qpopupmenu.h> + +class ExampleWidget : public TQWidget +{ +public: + ExampleWidget( TQWidget *parent = 0, const char *name = 0 ); + ~ExampleWidget(); +}; + +ExampleWidget::ExampleWidget( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + // Make the top-level layout; a vertical box to contain all widgets + // and sub-layouts. + TQBoxLayout *topLayout = new TQVBoxLayout( this, 5 ); + + // Create a menubar... + TQMenuBar *menubar = new TQMenuBar( this ); + menubar->setSeparator( TQMenuBar::InWindowsStyle ); + TQPopupMenu* popup; + popup = new TQPopupMenu( this ); + popup->insertItem( "&Quit", qApp, SLOT(tquit()) ); + menubar->insertItem( "&File", popup ); + + // ...and tell the layout about it. + topLayout->setMenuBar( menubar ); + + // Make an hbox that will hold a row of buttons. + TQBoxLayout *buttons = new TQHBoxLayout( topLayout ); + int i; + for ( i = 1; i <= 4; i++ ) { + TQPushButton* but = new TQPushButton( this ); + TQString s; + s.sprintf( "Button %d", i ); + but->setText( s ); + + // Set horizontal stretch factor to 10 to let the buttons + // stretch horizontally. The buttons will not stretch + // vertically, since bigWidget below will take up vertical + // stretch. + buttons->addWidget( but, 10 ); + // (Actually, the result would have been the same with a + // stretch factor of 0; if no items in a layout have non-zero + // stretch, the space is divided equally between members.) + } + + // Make another hbox that will hold a left-justified row of buttons. + TQBoxLayout *buttons2 = new TQHBoxLayout( topLayout ); + + TQPushButton* but = new TQPushButton( "Button five", this ); + buttons2->addWidget( but ); + + but = new TQPushButton( "Button 6", this ); + buttons2->addWidget( but ); + + // Fill up the rest of the hbox with stretchable space, so that + // the buttons get their minimum width and are pushed to the left. + buttons2->addStretch( 10 ); + + // Make a big widget that will grab all space in the middle. + TQMultiLineEdit *bigWidget = new TQMultiLineEdit( this ); + bigWidget->setText( "This widget will get all the remaining space" ); + bigWidget->setFrameStyle( TQFrame::Panel | TQFrame::Plain ); + + // Set vertical stretch factor to 10 to let the bigWidget stretch + // vertically. It will stretch horizontally because there are no + // widgets beside it to take up horizontal stretch. + // topLayout->addWidget( bigWidget, 10 ); + topLayout->addWidget( bigWidget ); + + // Make a grid that will hold a vertical table of TQLabel/TQLineEdit + // pairs next to a large TQMultiLineEdit. + + // Don't use hard-coded row/column numbers in TQGridLayout, you'll + // regret it when you have to change the layout. + const int numRows = 3; + const int labelCol = 0; + const int linedCol = 1; + const int multiCol = 2; + + // Let the grid-layout have a spacing of 10 pixels between + // widgets, overriding the default from topLayout. + TQGridLayout *grid = new TQGridLayout( topLayout, 0, 0, 10 ); + int row; + + for ( row = 0; row < numRows; row++ ) { + TQLineEdit *ed = new TQLineEdit( this ); + // The line edit goes in the second column + grid->addWidget( ed, row, linedCol ); + + // Make a label that is a buddy of the line edit + TQString s; + s.sprintf( "Line &%d", row+1 ); + TQLabel *label = new TQLabel( ed, s, this ); + // The label goes in the first column. + grid->addWidget( label, row, labelCol ); + } + + // The multiline edit will cover the entire vertical range of the + // grid (rows 0 to numRows) and stay in column 2. + + TQMultiLineEdit *med = new TQMultiLineEdit( this ); + grid->addMultiCellWidget( med, 0, -1, multiCol, multiCol ); + + // The labels will take the space they need. Let the remaining + // horizontal space be shared so that the multiline edit gets + // twice as much as the line edit. + grid->setColStretch( linedCol, 10 ); + grid->setColStretch( multiCol, 20 ); + + // Add a widget at the bottom. + TQLabel* sb = new TQLabel( this ); + sb->setText( "Let's pretend this is a status bar" ); + sb->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + // This widget will use all horizontal space, and have a fixed height. + + // we should have made a subclass and implemented sizePolicy there... + sb->setFixedHeight( sb->sizeHint().height() ); + + sb->setAlignment( AlignVCenter | AlignLeft ); + topLayout->addWidget( sb ); + + topLayout->activate(); +} + +ExampleWidget::~ExampleWidget() +{ + // All child widgets are deleted by TQt. + // The top-level layout and all its sub-layouts are deleted by TQt. +} + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + ExampleWidget f; + a.setMainWidget(&f); + f.setCaption("TQt Example - Layouts"); + f.show(); + + return a.exec(); +} diff --git a/examples/layout/layout.doc b/examples/layout/layout.doc new file mode 100644 index 000000000..90a7d31a3 --- /dev/null +++ b/examples/layout/layout.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page layout-example.html + + \ingroup examples + \title Layout Managers + + This example shows simple and intermediate use of Qt's layout + classes, QGridLayout, QBoxLayout etc. + + <hr> + + Implementation: + + \include layout/layout.cpp +*/ + diff --git a/examples/layout/layout.pro b/examples/layout/layout.pro new file mode 100644 index 000000000..054b31c78 --- /dev/null +++ b/examples/layout/layout.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = layout + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = +SOURCES = layout.cpp diff --git a/examples/life/life.cpp b/examples/life/life.cpp new file mode 100644 index 000000000..413a7db40 --- /dev/null +++ b/examples/life/life.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "life.h" + +#include <qpainter.h> +#include <qdrawutil.h> +#include <qcheckbox.h> +#include <qevent.h> +#include <qapplication.h> + +// The main game of life widget + +LifeWidget::LifeWidget( int s, TQWidget *parent, const char *name ) + : TQFrame( parent, name ) +{ + SCALE = s; + + maxi = maxj = 50; + setMinimumSize( MINSIZE * SCALE + 2 * BORDER, + MINSIZE * SCALE + 2 * BORDER ); + setMaximumSize( MAXSIZE * SCALE + 2 * BORDER, + MAXSIZE * SCALE + 2 * BORDER ); + setSizeIncrement( SCALE, SCALE); + + clear(); + resize( maxi * SCALE + 2 * BORDER , maxj * SCALE + 2 * BORDER ); + +} + + +void LifeWidget::clear() +{ + current = 0; + for ( int t = 0; t < 2; t++ ) + for ( int i = 0; i < MAXSIZE + 2; i++ ) + for ( int j = 0; j < MAXSIZE + 2; j++ ) + cells[t][i][j] = FALSE; + + repaint(); +} + + +// We assume that the size will never be beyond the maximum size set +// this is not in general TRUE, but in practice it's good enough for +// this program + +void LifeWidget::resizeEvent( TQResizeEvent * e ) +{ + maxi = (e->size().width() - 2 * BORDER) / SCALE; + maxj = (e->size().height() - 2 * BORDER) / SCALE; +} + + +void LifeWidget::setPoint( int i, int j ) +{ + if ( i < 1 || i > maxi || j < 1 || j > maxi ) + return; + cells[current][i][j] = TRUE; + repaint( index2pos(i), index2pos(j), SCALE, SCALE, FALSE ); +} + + +void LifeWidget::mouseHandle( const TQPoint &pos ) +{ + int i = pos2index( pos.x() ); + int j = pos2index( pos.y() ); + setPoint( i, j ); +} + + +void LifeWidget::mouseMoveEvent( TQMouseEvent *e ) +{ + mouseHandle( e->pos() ); +} + + +void LifeWidget::mousePressEvent( TQMouseEvent *e ) +{ + if ( e->button() == TQMouseEvent::LeftButton ) + mouseHandle( e->pos() ); +} + + +void LifeWidget::nextGeneration() +{ + for ( int i = 1; i <= MAXSIZE; i++ ) { + for ( int j = 1; j <= MAXSIZE; j++ ) { + int t = cells[current][i - 1][j - 1] + + cells[current][i - 1][j] + + cells[current][i - 1][j + 1] + + cells[current][i][j - 1] + + cells[current][i][j + 1] + + cells[current][i + 1][j - 1] + + cells[current][i + 1][j] + + cells[current][i + 1][j + 1]; + + cells[!current][i][j] = ( t == 3 || + t == 2 && cells[current][i][j] ); + } + } + current = !current; + repaint( FALSE ); // repaint without erase +} + + +void LifeWidget::paintEvent( TQPaintEvent * e ) +{ + int starti = pos2index( e->rect().left() ); + int stopi = pos2index( e->rect().right() ); + int startj = pos2index( e->rect().top() ); + int stopj = pos2index( e->rect().bottom() ); + + if (stopi > maxi) + stopi = maxi; + if (stopj > maxj) + stopj = maxj; + + TQPainter paint( this ); + for ( int i = starti; i <= stopi; i++ ) { + for ( int j = startj; j <= stopj; j++ ) { + if ( cells[current][i][j] ) + qDrawShadePanel( &paint, index2pos( i ), index2pos( j ), + SCALE - 1, SCALE - 1, colorGroup() ); + else if ( cells[!current][i][j] ) + erase(index2pos( i ), index2pos( j ), SCALE - 1, SCALE - 1); + } + } + drawFrame( &paint ); +} diff --git a/examples/life/life.doc b/examples/life/life.doc new file mode 100644 index 000000000..cd935cfbc --- /dev/null +++ b/examples/life/life.doc @@ -0,0 +1,27 @@ +/* +*/ +/*! \page life-example.html + + \ingroup examples + \title Conway's Game of Life + + + <hr> + + Header file: + + \include life/life.h + + <hr> + + Implementation: + + \include life/life.cpp + + <hr> + + Main: + + \include life/main.cpp +*/ + diff --git a/examples/life/life.h b/examples/life/life.h new file mode 100644 index 000000000..578044068 --- /dev/null +++ b/examples/life/life.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef LIFE_H +#define LIFE_H + +#include <qframe.h> + + +class LifeWidget : public TQFrame +{ + Q_OBJECT +public: + LifeWidget( int s = 10, TQWidget *parent = 0, const char *name = 0 ); + + void setPoint( int i, int j ); + + int maxCol() { return maxi; } + int maxRow() { return maxj; } + +public slots: + void nextGeneration(); + void clear(); + +protected: + virtual void paintEvent( TQPaintEvent * ); + virtual void mouseMoveEvent( TQMouseEvent * ); + virtual void mousePressEvent( TQMouseEvent * ); + virtual void resizeEvent( TQResizeEvent * ); + void mouseHandle( const TQPoint &pos ); + +private: + enum { MAXSIZE = 50, MINSIZE = 10, BORDER = 5 }; + + bool cells[2][MAXSIZE + 2][MAXSIZE + 2]; + int current; + int maxi, maxj; + + int pos2index( int x ) + { + return ( x - BORDER ) / SCALE + 1; + } + int index2pos( int i ) + { + return ( i - 1 ) * SCALE + BORDER; + } + + int SCALE; +}; + + +#endif // LIFE_H diff --git a/examples/life/life.pro b/examples/life/life.pro new file mode 100644 index 000000000..cc9d22fa9 --- /dev/null +++ b/examples/life/life.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = life + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = medium-config + +HEADERS = life.h \ + lifedlg.h +SOURCES = life.cpp \ + lifedlg.cpp \ + main.cpp diff --git a/examples/life/lifedlg.cpp b/examples/life/lifedlg.cpp new file mode 100644 index 000000000..1f9af427c --- /dev/null +++ b/examples/life/lifedlg.cpp @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "lifedlg.h" +#include <qapplication.h> +#include <qpushbutton.h> +#include <qlabel.h> +#include <qslider.h> +#include <qcombobox.h> +#include <qdatetime.h> +#include <stdlib.h> + +#include "patterns.cpp" + + +// A simple timer which has a pause and a setSpeed slot + +LifeTimer::LifeTimer( TQWidget *parent ) : TQTimer( parent ), interval( 500 ) +{ + start( interval ); +} + + +void LifeTimer::pause( bool stopIt ) +{ + if ( stopIt ) + stop(); + else + start( interval ); +} + + +void LifeTimer::setSpeed( int speed ) +{ + interval = MAXSPEED - speed; + if ( isActive() ) + changeInterval( interval ); +} + + +// A top-level container widget to organize the others + +LifeDialog::LifeDialog( int scale, TQWidget * parent, const char * name ) + : TQWidget( parent, name ) +{ + qb = new TQPushButton( "Quit!", this ); + cb = new TQComboBox( this, "comboBox" ); + life = new LifeWidget(scale, this); + life->move( SIDEBORDER, TOPBORDER ); + + + connect( qb, SIGNAL(clicked()), qApp, SLOT(tquit()) ); + qb->setGeometry( SIDEBORDER, SIDEBORDER, qb->sizeHint().width(), 25 ); + timer = new LifeTimer( this ); + + connect( timer, SIGNAL(timeout()), life, SLOT(nextGeneration()) ); + pb = new TQPushButton( "Pause", this ); + pb->setToggleButton( TRUE ); + connect( pb, SIGNAL(toggled(bool)), timer, SLOT(pause(bool)) ); + pb->resize( pb->sizeHint().width(), 25 ); + pb->move( width() - SIDEBORDER - pb->width(), SIDEBORDER ); + + sp = new TQLabel( "Speed:", this ); + sp->adjustSize(); + sp->move( SIDEBORDER, 45 ); + scroll = new TQSlider( 0, LifeTimer::MAXSPEED, 50, + LifeTimer::MAXSPEED / 2, + TQSlider::Horizontal, this ); + connect( scroll, SIGNAL(valueChanged(int)), + timer, SLOT(setSpeed(int)) ); + + scroll->move( sp->width() + 2 * SIDEBORDER, 45 ); + scroll->resize( 200, 15 ); + + life->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + life->show(); + + srand( TQTime(0,0,0).msecsTo(TQTime::currentTime()) ); + int sel = rand() % NPATS; + getPattern( sel ); + + cb->move( 2*SIDEBORDER + qb->width(), SIDEBORDER); + cb->insertItem( "Glider Gun " ); + cb->insertItem( "Figure Eight " ); + cb->insertItem( "Pulsar " ); + cb->insertItem( "Barber Pole P2 " ); + cb->insertItem( "Achim P5 " ); + cb->insertItem( "Hertz P4 " ); + cb->insertItem( "Tumbler " ); + cb->insertItem( "Pulse1 P4" ); + cb->insertItem( "Shining Flower P5 " ); + cb->insertItem( "Pulse2 P6 " ); + cb->insertItem( "Pinwheel, Clock P4 " ); + cb->insertItem( "Pentadecatholon " ); + cb->insertItem( "Piston " ); + cb->insertItem( "Piston2 " ); + cb->insertItem( "Switch Engine " ); + cb->insertItem( "Gears (Gear, Flywheel, Blinker) " ); + cb->insertItem( "Turbine8 " ); + cb->insertItem( "P16 " ); + cb->insertItem( "Puffer " ); + cb->insertItem( "Escort " ); + cb->insertItem( "Dart Speed 1/3 " ); + cb->insertItem( "Period 4 Speed 1/2 " ); + cb->insertItem( "Another Period 4 Speed 1/2 " ); + cb->insertItem( "Smallest Known Period 3 Spaceship Speed 1/3 " ); + cb->insertItem( "Turtle Speed 1/3 " ); + cb->insertItem( "Smallest Known Period 5 Speed 2/5 " ); + cb->insertItem( "Sym Puffer " ); + cb->insertItem( "], Near Ship, Pi Heptomino " ); + cb->insertItem( "R Pentomino " ); + cb->setAutoResize( FALSE ); + cb->setCurrentItem( sel ); + cb->show(); + connect( cb, SIGNAL(activated(int)), SLOT(getPattern(int)) ); + + TQSize s; + s = life->minimumSize(); + setMinimumSize( s.width() + 2 * SIDEBORDER, + s.height() + TOPBORDER + SIDEBORDER ); + s = life->maximumSize(); + setMaximumSize( s.width() + 2 * SIDEBORDER, + s.height() + TOPBORDER + SIDEBORDER ); + s = life->sizeIncrement(); + setSizeIncrement( s.width(), s.height() ); + + resize( TQMIN(512, qApp->desktop()->width()), + TQMIN(480, qApp->desktop()->height()) ); +} + + +void LifeDialog::resizeEvent( TQResizeEvent * e ) +{ + life->resize( e->size() - TQSize( 2 * SIDEBORDER, TOPBORDER + SIDEBORDER )); + pb->move( e->size().width() - SIDEBORDER - pb->width(), SIDEBORDER ); + scroll->resize( e->size().width() - sp->width() - 3 * SIDEBORDER, + scroll->height() ); + cb->resize( width() - 4*SIDEBORDER - qb->width() - pb->width() , 25 ); +} + + +// Adapted from xlock, see pattern.cpp for copyright info. + +void LifeDialog::getPattern( int pat ) +{ + life->clear(); + int i = pat % NPATS; + int col; + int * patptr = &patterns[i][0]; + while ( (col = *patptr++) != 127 ) { + int row = *patptr++; + col += life->maxCol() / 2; + row += life->maxRow() / 2; + life->setPoint( col, row ); + } +} diff --git a/examples/life/lifedlg.h b/examples/life/lifedlg.h new file mode 100644 index 000000000..4ff4b195c --- /dev/null +++ b/examples/life/lifedlg.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef LIFEDLG_H +#define LIFEDLG_H + +#include <qtimer.h> +#include <qwidget.h> + +class TQSlider; +class TQPushButton; +class TQLabel; +class TQComboBox; + +#include "life.h" + + +class LifeTimer : public TQTimer +{ + Q_OBJECT +public: + LifeTimer( TQWidget *parent ); + enum { MAXSPEED = 1000 }; + +public slots: + void setSpeed( int speed ); + void pause( bool ); + +private: + int interval; +}; + + +class LifeDialog : public TQWidget +{ + Q_OBJECT +public: + LifeDialog( int scale = 10, TQWidget *parent = 0, const char *name = 0 ); +public slots: + void getPattern( int ); + +protected: + virtual void resizeEvent( TQResizeEvent * e ); + +private: + enum { TOPBORDER = 70, SIDEBORDER = 10 }; + + LifeWidget *life; + TQPushButton *qb; + LifeTimer *timer; + TQPushButton *pb; + TQComboBox *cb; + TQLabel *sp; + TQSlider *scroll; +}; + + +#endif // LIFEDLG_H diff --git a/examples/life/main.cpp b/examples/life/main.cpp new file mode 100644 index 000000000..7505e0f28 --- /dev/null +++ b/examples/life/main.cpp @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "lifedlg.h" +#include <qapplication.h> +#include <stdlib.h> + +void usage() +{ + qWarning( "Usage: life [-scale scale]" ); +} + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + int scale = 10; + + for ( int i = 1; i < argc; i++ ){ + TQString arg = argv[i]; + if ( arg == "-scale" ) + scale = atoi( argv[++i] ); + else { + usage(); + exit(1); + } + } + + if ( scale < 2 ) + scale = 2; + + LifeDialog *life = new LifeDialog( scale ); + a.setMainWidget( life ); + life->setCaption("TQt Example - Life"); + life->show(); + + return a.exec(); +} diff --git a/examples/life/patterns.cpp b/examples/life/patterns.cpp new file mode 100644 index 000000000..4203adcd6 --- /dev/null +++ b/examples/life/patterns.cpp @@ -0,0 +1,383 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** + * + * Patterns for life. Adapted from xlock; original copyright notice below. + * + * Copyright (c) 1988-91 by Patrick J. Naughton. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + *****************************************************************************/ + +//#include <qglobal.h> + + +#define NUMPTS 63 +/* Patterns have < NUMPTS pts (and should have a size of <= 32x32, + the Gun is an exception) */ +static int patterns[][2 * NUMPTS + 1] = { + { /* GLIDER GUN */ + 6, -4, + 5, -3, 6, -3, + -6, -2, -5, -2, 8, -2, 9, -2, 16, -2, + -7, -1, 8, -1, 9, -1, 10, -1, 16, -1, 17, -1, + -18, 0, -17, 0, -8, 0, 8, 0, 9, 1, + -17, 1, -8, 1, 5, 1, 6, 1, + -8, 2, 6, 2, + -7, 3, + -6, 4, -5, 4, + 127 + }, + { /* FIGURE EIGHT */ + -3, -3, -2, -3, -1, -3, + -3, -2, -2, -2, -1, -2, + -3, -1, -2, -1, -1, -1, + 0, 0, 1, 0, 2, 0, + 0, 1, 1, 1, 2, 1, + 0, 2, 1, 2, 2, 2, + 127 + }, + { /* PULSAR */ + -2, -1, -1, -1, 0, -1, 1, -1, 2, -1, + -2, 0, 2, 0, + 127 + }, + { /* BARBER POLE P2 */ + -6, -6, -5, -6, + -6, -5, -4, -5, + -4, -3, -2, -3, + -2, -1, 0, -1, + 0, 1, 2, 1, + 2, 3, 4, 3, + 5, 4, + 4, 5, 5, 5, + 127 + }, + { /* ACHIM P5 */ + -6, -6, -5, -6, + -6, -5, + -4, -4, + -4, -3, -2, -3, + -2, -1, 0, -1, + 0, 1, 2, 1, + 2, 3, 3, 3, + 5, 4, + 4, 5, 5, 5, + 127 + }, + { /* HERTZ P4 */ + -2, -5, -1, -5, + -2, -4, -1, -4, + -7, -2, -6, -2, -2, -2, -1, -2, 0, -2, 1, -2, 5, -2, 6, -2, + -7, -1, -5, -1, -3, -1, 2, -1, 4, -1, 6, -1, + -5, 0, -3, 0, -2, 0, 2, 0, 4, 0, + -7, 1, -5, 1, -3, 1, 2, 1, 4, 1, 6, 1, + -7, 2, -6, 2, -2, 2, -1, 2, 0, 2, 1, 2, 5, 2, 6, 2, + -2, 4, -1, 4, + -2, 5, -1, 5, + 127 + }, + { /* TUMBLER */ + -2, -3, -1, -3, 1, -3, 2, -3, + -2, -2, -1, -2, 1, -2, 2, -2, + -1, -1, 1, -1, + -3, 0, -1, 0, 1, 0, 3, 0, + -3, 1, -1, 1, 1, 1, 3, 1, + -3, 2, -2, 2, 2, 2, 3, 2, + 127 + }, + { /* PULSE1 P4*/ + 0, -3, 1, -3, + -2, -2, 0, -2, + -3, -1, 3, -1, + -2, 0, 2, 0, 3, 0, + 0, 2, 2, 2, + 1, 3, + 127 + }, + { /* SHINING FLOWER P5 */ + -1, -4, 0, -4, + -2, -3, 1, -3, + -3, -2, 2, -2, + -4, -1, 3, -1, + -4, 0, 3, 0, + -3, 1, 2, 1, + -2, 2, 1, 2, + -1, 3, 0, 3, + 127 + }, + { /* PULSE2 P6 */ + 0, -4, 1, -4, + -4, -3, -3, -3, -1, -3, + -4, -2, -3, -2, 0, -2, 3, -2, + 1, -1, 3, -1, + 2, 0, + 1, 2, 2, 2, + 1, 3, 2, 3, + 127 + }, + { /* PINWHEEL, CLOCK P4 */ + -2, -6, -1, -6, + -2, -5, -1, -5, + -2, -3, -1, -3, 0, -3, 1, -3, + -3, -2, -1, -2, 2, -2, 4, -2, 5, -2, + -3, -1, 1, -1, 2, -1, 4, -1, 5, -1, + -6, 0, -5, 0, -3, 0, 0, 0, 2, 0, + -6, 1, -5, 1, -3, 1, 2, 1, + -2, 2, -1, 2, 0, 2, 1, 2, + 0, 4, 1, 4, + 0, 5, 1, 5, + 127 + }, + { /* PENTADECATHOLON */ + -5, 0, -4, 0, -3, 0, -2, 0, -1, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, + 127 + }, + { /* PISTON */ + 1, -3, 2, -3, + 0, -2, + -10, -1, -1, -1, + -11, 0, -10, 0, -1, 0, 9, 0, 10, 0, + -1, 1, 9, 1, + 0, 2, + 1, 3, 2, 3, + 127 + }, + { /* PISTON2 */ + -3, -5, + -14, -4, -13, -4, -4, -4, -3, -4, 13, -4, 14, -4, + -14, -3, -13, -3, -5, -3, -4, -3, 13, -3, 14, -3, + -4, -2, -3, -2, 0, -2, 1, -2, + -4, 2, -3, 2, 0, 2, 1, 2, + -14, 3, -13, 3, -5, 3, -4, 3, 13, 3, 14, 3, + -14, 4, -13, 4, -4, 4, -3, 4, 13, 4, 14, 4, + -3, 5, + 127 + }, + { /* SWITCH ENGINE */ + -12, -3, -10, -3, + -13, -2, + -12, -1, -9, -1, + -10, 0, -9, 0, -8, 0, + 13, 2, 14, 2, + 13, 3, + 127 + }, + { /* GEARS (gear, flywheel, blinker) */ + -1, -4, + -1, -3, 1, -3, + -3, -2, + 2, -1, 3, -1, + -4, 0, -3, 0, + 2, 1, + -2, 2, 0, 2, + 0, 3, + + 5, 3, + 3, 4, 4, 4, + 5, 5, 6, 5, + 4, 6, + + 8, 0, + 8, 1, + 8, 2, + 127 + }, + { /* TURBINE8 */ + -4, -4, -3, -4, -2, -4, -1, -4, 0, -4, 1, -4, 3, -4, 4, -4, + -4, -3, -3, -3, -2, -3, -1, -3, 0, -3, 1, -3, 3, -3, 4, -3, + 3, -2, 4, -2, + -4, -1, -3, -1, 3, -1, 4, -1, + -4, 0, -3, 0, 3, 0, 4, 0, + -4, 1, -3, 1, 3, 1, 4, 1, + -4, 2, -3, 2, + -4, 3, -3, 3, -1, 3, 0, 3, 1, 3, 2, 3, 3, 3, 4, 3, + -4, 4, -3, 4, -1, 4, 0, 4, 1, 4, 2, 4, 3, 4, 4, 4, + 127 + }, + { /* P16 */ + -3, -6, 1, -6, 2, -6, + -3, -5, 0, -5, 3, -5, + 3, -4, + -5, -3, -4, -3, 1, -3, 2, -3, 5, -3, 6, -3, + -6, -2, -3, -2, + -6, -1, -3, -1, + -5, 0, 5, 0, + 3, 1, 6, 1, + 3, 2, 6, 2, + -6, 3, -5, 3, -2, 3, -1, 3, 4, 3, 5, 3, + -3, 4, + -3, 5, 0, 5, 3, 5, + -2, 6, -1, 6, 3, 6, + 127 + }, + { /* PUFFER */ + 1, -9, + 2, -8, + -2, -7, 2, -7, + -1, -6, 0, -6, 1, -6, 2, -6, + -2, -2, + -1, -1, 0, -1, + 0, 0, + 0, 1, + -1, 2, + 1, 5, + 2, 6, + -2, 7, 2, 7, + -1, 8, 0, 8, 1, 8, 2, 8, + 127 + }, + { /* ESCORT */ + 3, -8, + 4, -7, + -2, -6, 4, -6, + -1, -5, 0, -5, 1, -5, 2, -5, 3, -5, 4, -5, + -5, -1, -4, -1, -3, -1, -2, -1, -1, -1, 0, -1, + 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, -1, + -6, 0, 6, 0, + 6, 1, + 5, 2, + 3, 4, + 4, 5, + -2, 6, 4, 6, + -1, 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7, + 127 + }, + { /* DART SPEED 1/3 */ + 3, -7, + 2, -6, 4, -6, + 1, -5, 2, -5, + 4, -4, + 0, -3, 4, -3, + -3, -2, 0, -2, + -4, -1, -2, -1, 1, -1, 2, -1, 3, -1, 4, -1, + -5, 0, -2, 0, + -4, 1, -2, 1, 1, 1, 2, 1, 3, 1, 4, 1, + -3, 2, 0, 2, + 0, 3, 4, 3, + 4, 4, + 1, 5, 2, 5, + 2, 6, 4, 6, + 3, 7, + 127 + }, + { /* PERIOD 4 SPEED 1/2 */ + -3, -5, + -4, -4, -3, -4, -2, -4, -1, -4, 0, -4, + -5, -3, -4, -3, 0, -3, 1, -3, 3, -3, + -4, -2, 4, -2, + -3, -1, -2, -1, 1, -1, 3, -1, + -3, 1, -2, 1, 1, 1, 3, 1, + -4, 2, 4, 2, + -5, 3, -4, 3, 0, 3, 1, 3, 3, 3, + -4, 4, -3, 4, -2, 4, -1, 4, 0, 4, + -3, 5, + 127 + }, + { /* ANOTHER PERIOD 4 SPEED 1/2 */ + -4, -7, -3, -7, -1, -7, 0, -7, 1, -7, 2, -7, 3, -7, 4, -7, + -5, -6, -4, -6, -3, -6, -2, -6, 5, -6, + -6, -5, -5, -5, + -5, -4, 5, -4, + -4, -3, -3, -3, -2, -3, 0, -3, + -2, -2, + -2, -1, + -1, 0, + -2, 1, + -2, 2, + -4, 3, -3, 3, -2, 3, 0, 3, + -5, 4, 5, 4, + -6, 5, -5, 5, + -5, 6, -4, 6, -3, 6, -2, 6, 5, 6, + -4, 7, -3, 7, -1, 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7, + 127 + }, + { /* SMALLEST KNOWN PERIOD 3 SPACESHIP SPEED 1/3 */ + 0, -8, + -1, -7, 1, -7, + -1, -6, 1, -6, + -1, -5, + -2, -3, -1, -3, + -1, -2, 1, -2, + -2, -1, 0, -1, + -2, 0, -1, 0, 0, 0, + -1, 2, 1, 2, + -1, 3, 0, 3, + 0, 4, + 0, 5, 2, 5, + 0, 6, 2, 6, + 1, 7, + 127 + }, + { /* TURTLE SPEED 1/3 */ + -4, -5, -3, -5, -2, -5, 6, -5, + -4, -4, -3, -4, 0, -4, 2, -4, 3, -4, 5, -4, 6, -4, + -2, -3, -1, -3, 0, -3, 5, -3, + -4, -2, -1, -2, 1, -2, 5, -2, + -5, -1, 0, -1, 5, -1, + -5, 0, 0, 0, 5, 0, + -4, 1, -1, 1, 1, 1, 5, 1, + -2, 2, -1, 2, 0, 2, 5, 2, + -4, 3, -3, 3, 0, 3, 2, 3, 3, 3, 5, 3, 6, 3, + -4, 4, -3, 4, -2, 4, 6, 4, + 127 + }, + { /* SMALLEST KNOWN PERIOD 5 SPEED 2/5 */ + 1, -7, 3, -7, + -2, -6, 3, -6, + -3, -5, -2, -5, -1, -5, 4, -5, + -4, -4, -2, -4, + -5, -3, -4, -3, -1, -3, 0, -3, 5, -3, + -4, -2, -3, -2, 0, -2, 1, -2, 2, -2, 3, -2, 4, -2, + -4, 2, -3, 2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 2, + -5, 3, -4, 3, -1, 3, 0, 3, 5, 3, + -4, 4, -2, 4, + -3, 5, -2, 5, -1, 5, 4, 5, + -2, 6, 3, 6, + 1, 7, 3, 7, + 127 + }, + { /* SYM PUFFER */ + 1, -4, 2, -4, 3, -4, 4, -4, + 0, -3, 4, -3, + 4, -2, + -4, -1, -3, -1, 0, -1, 3, -1, + -4, 0, -3, 0, -2, 0, + -4, 1, -3, 1, 0, 1, 3, 1, + 4, 2, + 0, 3, 4, 3, + 1, 4, 2, 4, 3, 4, 4, 4, + 127 + }, + { /* ], NEAR SHIP, PI HEPTOMINO */ + -2, -1, -1, -1, 0, -1, + 1, 0, + -2, 1, -1, 1, 0, 1, + 127 + }, + { /* R PENTOMINO */ + 0, -1, 1, -1, + -1, 0, 0, 0, + 0, 1, + 127 + } +}; + +#define NPATS (sizeof patterns / sizeof patterns[0]) diff --git a/examples/lineedits/lineedits.cpp b/examples/lineedits/lineedits.cpp new file mode 100644 index 000000000..02c310e69 --- /dev/null +++ b/examples/lineedits/lineedits.cpp @@ -0,0 +1,272 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "lineedits.h" + +#include <qlineedit.h> +#include <qcombobox.h> +#include <qframe.h> +#include <qvalidator.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qhbox.h> + +/* + * Constructor + * + * Creates child widgets of the LineEdits widget + */ + +LineEdits::LineEdits( TQWidget *parent, const char *name ) + : TQGroupBox( 0, Horizontal, "Line edits", parent, name ) +{ + setMargin( 10 ); + + TQVBoxLayout* box = new TQVBoxLayout( layout() ); + + TQHBoxLayout *row1 = new TQHBoxLayout( box ); + row1->setMargin( 5 ); + + // Create a Label + TQLabel* label = new TQLabel( "Echo Mode: ", this); + row1->addWidget( label ); + + // Create a Combobox with three items... + combo1 = new TQComboBox( FALSE, this ); + row1->addWidget( combo1 ); + combo1->insertItem( "Normal" ); + combo1->insertItem( "Password" ); + combo1->insertItem( "No Echo" ); + // ...and connect the activated() SIGNAL with the slotEchoChanged() SLOT to be able + // to react when an item is selected + connect( combo1, SIGNAL( activated( int ) ), this, SLOT( slotEchoChanged( int ) ) ); + + // insert the first LineEdit + lined1 = new TQLineEdit( this ); + box->addWidget( lined1 ); + + // another widget which is used for layouting + TQHBoxLayout *row2 = new TQHBoxLayout( box ); + row2->setMargin( 5 ); + + // and the second label + label = new TQLabel( "Validator: ", this ); + row2->addWidget( label ); + + // A second Combobox with again three items... + combo2 = new TQComboBox( FALSE, this ); + row2->addWidget( combo2 ); + combo2->insertItem( "No Validator" ); + combo2->insertItem( "Integer Validator" ); + combo2->insertItem( "Double Validator" ); + // ...and again the activated() SIGNAL gets connected with a SLOT + connect( combo2, SIGNAL( activated( int ) ), this, SLOT( slotValidatorChanged( int ) ) ); + + // and the second LineEdit + lined2 = new TQLineEdit( this ); + box->addWidget( lined2 ); + + // yet another widget which is used for layouting + TQHBoxLayout *row3 = new TQHBoxLayout( box ); + row3->setMargin( 5 ); + + // we need a label for this too + label = new TQLabel( "Alignment: ", this ); + row3->addWidget( label ); + + // A combo box for setting alignment + combo3 = new TQComboBox( FALSE, this ); + row3->addWidget( combo3 ); + combo3->insertItem( "Left" ); + combo3->insertItem( "Centered" ); + combo3->insertItem( "Right" ); + // ...and again the activated() SIGNAL gets connected with a SLOT + connect( combo3, SIGNAL( activated( int ) ), this, SLOT( slotAlignmentChanged( int ) ) ); + + // and the third lineedit + lined3 = new TQLineEdit( this ); + box->addWidget( lined3 ); + + // exactly the same for the fourth + TQHBoxLayout *row4 = new TQHBoxLayout( box ); + row4->setMargin( 5 ); + + // we need a label for this too + label = new TQLabel( "Input mask: ", this ); + row4->addWidget( label ); + + // A combo box for choosing an input mask + combo4 = new TQComboBox( FALSE, this ); + row4->addWidget( combo4 ); + combo4->insertItem( "No mask" ); + combo4->insertItem( "Phone number" ); + combo4->insertItem( "ISO date" ); + combo4->insertItem( "License key" ); + + // ...this time we use the activated( const TQString & ) signal + connect( combo4, SIGNAL( activated( int ) ), + this, SLOT( slotInputMaskChanged( int ) ) ); + + // and the fourth lineedit + lined4 = new TQLineEdit( this ); + box->addWidget( lined4 ); + + // last widget used for layouting + TQHBox *row5 = new TQHBox( this ); + box->addWidget( row5 ); + row5->setMargin( 5 ); + + // last label + (void)new TQLabel( "Read-Only: ", row5 ); + + // A combo box for setting alignment + combo5 = new TQComboBox( FALSE, row5 ); + combo5->insertItem( "False" ); + combo5->insertItem( "True" ); + // ...and again the activated() SIGNAL gets connected with a SLOT + connect( combo5, SIGNAL( activated( int ) ), this, SLOT( slotReadOnlyChanged( int ) ) ); + + // and the last lineedit + lined5 = new TQLineEdit( this ); + box->addWidget( lined5 ); + + // give the first LineEdit the focus at the beginning + lined1->setFocus(); +} + +/* + * SLOT slotEchoChanged( int i ) + * + * i contains the number of the item which the user has been chosen in the + * first Combobox. According to this value, we set the Echo-Mode for the + * first LineEdit. + */ + +void LineEdits::slotEchoChanged( int i ) +{ + switch ( i ) { + case 0: + lined1->setEchoMode( TQLineEdit::Normal ); + break; + case 1: + lined1->setEchoMode( TQLineEdit::Password ); + break; + case 2: + lined1->setEchoMode( TQLineEdit::NoEcho ); + break; + } + + lined1->setFocus(); +} + +/* + * SLOT slotValidatorChanged( int i ) + * + * i contains the number of the item which the user has been chosen in the + * second Combobox. According to this value, we set a validator for the + * second LineEdit. A validator checks in a LineEdit each character which + * the user enters and accepts it if it is valid, else the character gets + * ignored and not inserted into the lineedit. + */ + +void LineEdits::slotValidatorChanged( int i ) +{ + switch ( i ) { + case 0: + lined2->setValidator( 0 ); + break; + case 1: + lined2->setValidator( new TQIntValidator( lined2 ) ); + break; + case 2: + lined2->setValidator( new TQDoubleValidator( -999.0, 999.0, 2, + lined2 ) ); + break; + } + + lined2->setText( "" ); + lined2->setFocus(); +} + + +/* + * SLOT slotAlignmentChanged( int i ) + * + * i contains the number of the item which the user has been chosen in + * the third Combobox. According to this value, we set an alignment + * third LineEdit. + */ + +void LineEdits::slotAlignmentChanged( int i ) +{ + switch ( i ) { + case 0: + lined3->setAlignment( TQLineEdit::AlignLeft ); + break; + case 1: + lined3->setAlignment( TQLineEdit::AlignCenter ); + break; + case 2: + lined3->setAlignment( TQLineEdit::AlignRight ); + break; + } + + lined3->setFocus(); +} + +/* + * SLOT slotInputMaskChanged( const TQString &mask ) + * + * i contains the number of the item which the user has been chosen in + * the third Combobox. According to this value, we set an input mask on + * third LineEdit. + */ + +void LineEdits::slotInputMaskChanged( int i ) +{ + switch( i ) { + case 0: + lined4->setInputMask( TQString::null ); + break; + case 1: + lined4->setInputMask( "+99 99 99 99 99;_" ); + break; + case 2: + lined4->setInputMask( "0000-00-00" ); + lined4->setText( "00000000" ); + lined4->setCursorPosition( 0 ); + break; + case 3: + lined4->setInputMask( ">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#" ); + break; + } + lined4->setFocus(); +} + +/* + * SLOT slotReadOnlyChanged( int i ) + * + * i contains the number of the item which the user has been chosen in + * the fourth Combobox. According to this value, we toggle read-only. + */ + +void LineEdits::slotReadOnlyChanged( int i ) +{ + switch ( i ) { + case 0: + lined5->setReadOnly( FALSE ); + break; + case 1: + lined5->setReadOnly( TRUE ); + break; + } + + lined5->setFocus(); +} + diff --git a/examples/lineedits/lineedits.doc b/examples/lineedits/lineedits.doc new file mode 100644 index 000000000..a75f0f1b3 --- /dev/null +++ b/examples/lineedits/lineedits.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page lineedits-example.html + + \ingroup examples + \title Line Edits + + This example shows how to work with single lineedit widgets, and + how to use different echo modes and validators. + + <hr> + + Header file: + + \include lineedits/lineedits.h + + <hr> + + Implementation: + + \include lineedits/lineedits.cpp + + <hr> + + Main: + + \include lineedits/main.cpp +*/ + diff --git a/examples/lineedits/lineedits.h b/examples/lineedits/lineedits.h new file mode 100644 index 000000000..efb901551 --- /dev/null +++ b/examples/lineedits/lineedits.h @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef LINEDITS_H +#define LINEDITS_H + +#include <qgroupbox.h> + +class TQLineEdit; +class TQComboBox; + +class LineEdits : public TQGroupBox +{ + Q_OBJECT + +public: + LineEdits( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQLineEdit *lined1, *lined2, *lined3, *lined4, *lined5; + TQComboBox *combo1, *combo2, *combo3, *combo4, *combo5; + +protected slots: + void slotEchoChanged( int ); + void slotValidatorChanged( int ); + void slotAlignmentChanged( int ); + void slotInputMaskChanged( int ); + void slotReadOnlyChanged( int ); +}; + +#endif diff --git a/examples/lineedits/lineedits.pro b/examples/lineedits/lineedits.pro new file mode 100644 index 000000000..cab7c409e --- /dev/null +++ b/examples/lineedits/lineedits.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = lineedits + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = medium-config + +HEADERS = lineedits.h +SOURCES = lineedits.cpp \ + main.cpp diff --git a/examples/lineedits/main.cpp b/examples/lineedits/main.cpp new file mode 100644 index 000000000..98592107b --- /dev/null +++ b/examples/lineedits/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "lineedits.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + LineEdits lineedits; + lineedits.setCaption( "TQt Example - Lineedits" ); + a.setMainWidget( &lineedits ); + lineedits.show(); + + return a.exec(); +} diff --git a/examples/listbox/listbox.cpp b/examples/listbox/listbox.cpp new file mode 100644 index 000000000..bf4049787 --- /dev/null +++ b/examples/listbox/listbox.cpp @@ -0,0 +1,193 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "listbox.h" + +#include <qlabel.h> +#include <qradiobutton.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qlistbox.h> +#include <qbuttongroup.h> +#include <qlayout.h> +#include <qpushbutton.h> + + +ListBoxDemo::ListBoxDemo() + : TQWidget( 0, 0 ) +{ + TQGridLayout * g = new TQGridLayout( this, 2, 2, 6 ); + + g->addWidget( new TQLabel( "<b>Configuration:</b>", this ), 0, 0 ); + g->addWidget( new TQLabel( "<b>Result:</b>", this ), 0, 1 ); + + l = new TQListBox( this ); + g->addWidget( l, 1, 1 ); + l->setFocusPolicy( TQWidget::StrongFocus ); + + TQVBoxLayout * v = new TQVBoxLayout; + g->addLayout( v, 1, 0 ); + + TQRadioButton * b; + bg = new TQButtonGroup( 0 ); + + b = new TQRadioButton( "Fixed number of columns,\n" + "as many rows as needed.", + this ); + bg->insert( b ); + v->addWidget( b ); + b->setChecked( TRUE ); + connect( b, SIGNAL(clicked()), this, SLOT(setNumCols()) ); + TQHBoxLayout * h = new TQHBoxLayout; + v->addLayout( h ); + h->addSpacing( 30 ); + h->addSpacing( 100 ); + h->addWidget( new TQLabel( "Columns:", this ) ); + columns = new TQSpinBox( this ); + h->addWidget( columns ); + + v->addSpacing( 12 ); + + b = new TQRadioButton( "As many columns as fit on-screen,\n" + "as many rows as needed.", + this ); + bg->insert( b ); + v->addWidget( b ); + connect( b, SIGNAL(clicked()), this, SLOT(setColsByWidth()) ); + + v->addSpacing( 12 ); + + b = new TQRadioButton( "Fixed number of rows,\n" + "as many columns as needed.", + this ); + bg->insert( b ); + v->addWidget( b ); + connect( b, SIGNAL(clicked()), this, SLOT(setNumRows()) ); + h = new TQHBoxLayout; + v->addLayout( h ); + h->addSpacing( 30 ); + h->addSpacing( 100 ); + h->addWidget( new TQLabel( "Rows:", this ) ); + rows = new TQSpinBox( this ); + rows->setEnabled( FALSE ); + h->addWidget( rows ); + + v->addSpacing( 12 ); + + b = new TQRadioButton( "As many rows as fit on-screen,\n" + "as many columns as needed.", + this ); + bg->insert( b ); + v->addWidget( b ); + connect( b, SIGNAL(clicked()), this, SLOT(setRowsByHeight()) ); + + v->addSpacing( 12 ); + + TQCheckBox * cb = new TQCheckBox( "Variable-height rows", this ); + cb->setChecked( TRUE ); + connect( cb, SIGNAL(toggled(bool)), this, SLOT(setVariableHeight(bool)) ); + v->addWidget( cb ); + v->addSpacing( 6 ); + + cb = new TQCheckBox( "Variable-width columns", this ); + connect( cb, SIGNAL(toggled(bool)), this, SLOT(setVariableWidth(bool)) ); + v->addWidget( cb ); + + cb = new TQCheckBox( "Extended-Selection", this ); + connect( cb, SIGNAL(toggled(bool)), this, SLOT(setMultiSelection(bool)) ); + v->addWidget( cb ); + + TQPushButton *pb = new TQPushButton( "Sort ascending", this ); + connect( pb, SIGNAL( clicked() ), this, SLOT( sortAscending() ) ); + v->addWidget( pb ); + + pb = new TQPushButton( "Sort descending", this ); + connect( pb, SIGNAL( clicked() ), this, SLOT( sortDescending() ) ); + v->addWidget( pb ); + + v->addStretch( 100 ); + + int i = 0; + while( ++i <= 2560 ) + l->insertItem( TQString::fromLatin1( "Item " ) + TQString::number( i ), + i ); + columns->setRange( 1, 256 ); + columns->setValue( 1 ); + rows->setRange( 1, 256 ); + rows->setValue( 256 ); + + connect( columns, SIGNAL(valueChanged(int)), this, SLOT(setNumCols()) ); + connect( rows, SIGNAL(valueChanged(int)), this, SLOT(setNumRows()) ); +} + + +ListBoxDemo::~ListBoxDemo() +{ + delete bg; +} + + +void ListBoxDemo::setNumRows() +{ + columns->setEnabled( FALSE ); + rows->setEnabled( TRUE ); + l->setRowMode( rows->value() ); +} + + +void ListBoxDemo::setNumCols() +{ + columns->setEnabled( TRUE ); + rows->setEnabled( FALSE ); + l->setColumnMode( columns->value() ); +} + + +void ListBoxDemo::setRowsByHeight() +{ + columns->setEnabled( FALSE ); + rows->setEnabled( FALSE ); + l->setRowMode( TQListBox::FitToHeight ); +} + + +void ListBoxDemo::setColsByWidth() +{ + columns->setEnabled( FALSE ); + rows->setEnabled( FALSE ); + l->setColumnMode( TQListBox::FitToWidth ); +} + + +void ListBoxDemo::setVariableWidth( bool b ) +{ + l->setVariableWidth( b ); +} + + +void ListBoxDemo::setVariableHeight( bool b ) +{ + l->setVariableHeight( b ); +} + +void ListBoxDemo::setMultiSelection( bool b ) +{ + l->clearSelection(); + l->setSelectionMode( b ? TQListBox::Extended : TQListBox::Single ); +} + +void ListBoxDemo::sortAscending() +{ + l->sort( TRUE ); +} + +void ListBoxDemo::sortDescending() +{ + l->sort( FALSE ); +} diff --git a/examples/listbox/listbox.doc b/examples/listbox/listbox.doc new file mode 100644 index 000000000..eefc2a4d3 --- /dev/null +++ b/examples/listbox/listbox.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page listbox-example.html + + \ingroup examples + \title Listbox Example + + This example shows how to use the different modes (single columns, multiple columns, + fixed number of rows, etc.) of QListBox. + + <hr> + + Header file: + + \include listbox/listbox.h + + <hr> + + Implementation: + + \include listbox/listbox.cpp + + <hr> + + Main: + + \include listbox/main.cpp +*/ + diff --git a/examples/listbox/listbox.h b/examples/listbox/listbox.h new file mode 100644 index 000000000..62cd8c82f --- /dev/null +++ b/examples/listbox/listbox.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef LISTBOX_H +#define LISTBOX_H + + +class TQSpinBox; +class TQListBox; +class TQButtonGroup; + +#include <qwidget.h> + + +class ListBoxDemo: public TQWidget +{ + Q_OBJECT +public: + ListBoxDemo(); + ~ListBoxDemo(); + +private slots: + void setNumRows(); + void setNumCols(); + void setRowsByHeight(); + void setColsByWidth(); + void setVariableWidth( bool ); + void setVariableHeight( bool ); + void setMultiSelection( bool ); + void sortAscending(); + void sortDescending(); + +private: + TQListBox * l; + TQSpinBox * columns; + TQSpinBox * rows; + TQButtonGroup * bg; +}; + + +#endif diff --git a/examples/listbox/listbox.pro b/examples/listbox/listbox.pro new file mode 100644 index 000000000..b65571a47 --- /dev/null +++ b/examples/listbox/listbox.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = listbox + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = listbox.h +SOURCES = listbox.cpp \ + main.cpp diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp new file mode 100644 index 000000000..0e3c7ad3b --- /dev/null +++ b/examples/listbox/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "listbox.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + ListBoxDemo t; + t.setCaption( "TQt Example - Listbox" ); + a.setMainWidget( &t ); + t.show(); + + return a.exec(); +} diff --git a/examples/listboxcombo/fileopen.xpm b/examples/listboxcombo/fileopen.xpm new file mode 100644 index 000000000..880417eee --- /dev/null +++ b/examples/listboxcombo/fileopen.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *fileopen[] = { +" 16 13 5 1", +". c #040404", +"# c #808304", +"a c None", +"b c #f3f704", +"c c #f3f7f3", +"aaaaaaaaa...aaaa", +"aaaaaaaa.aaa.a.a", +"aaaaaaaaaaaaa..a", +"a...aaaaaaaa...a", +".bcb.......aaaaa", +".cbcbcbcbc.aaaaa", +".bcbcbcbcb.aaaaa", +".cbcb...........", +".bcb.#########.a", +".cb.#########.aa", +".b.#########.aaa", +"..#########.aaaa", +"...........aaaaa" +}; diff --git a/examples/listboxcombo/listboxcombo.cpp b/examples/listboxcombo/listboxcombo.cpp new file mode 100644 index 000000000..ceb06995b --- /dev/null +++ b/examples/listboxcombo/listboxcombo.cpp @@ -0,0 +1,187 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "listboxcombo.h" + +#include <qcombobox.h> +#include <qlistbox.h> +#include <qhbox.h> +#include <qpushbutton.h> +#include <qstring.h> +#include <qpixmap.h> +#include <qlabel.h> +#include <qimage.h> +#include <qpainter.h> +#include <qstyle.h> + + +class MyListBoxItem : public TQListBoxItem +{ +public: + MyListBoxItem() + : TQListBoxItem() + { + setCustomHighlighting( TRUE ); + } + +protected: + virtual void paint( TQPainter * ); + virtual int width( const TQListBox* ) const { return 100; } + virtual int height( const TQListBox* ) const { return 16; } + +}; + +void MyListBoxItem::paint( TQPainter *painter ) +{ + // evil trick: find out whether we are painted onto our listbox + bool in_list_box = listBox() && listBox()->viewport() == painter->device(); + + TQRect r ( 0, 0, width( listBox() ), height( listBox() ) ); + if ( in_list_box && isSelected() ) + painter->eraseRect( r ); + painter->fillRect( 5, 5, width( listBox() ) - 10, height( listBox() ) - 10, TQt::red ); + if ( in_list_box && isCurrent() ) + listBox()->style().drawPrimitive( TQStyle::PE_FocusRect, painter, r, listBox()->colorGroup() ); +} + +/* + * Constructor + * + * Creates child widgets of the ListBoxCombo widget + */ + +ListBoxCombo::ListBoxCombo( TQWidget *parent, const char *name ) + : TQVBox( parent, name ) +{ + setMargin( 5 ); + setSpacing( 5 ); + + unsigned int i; + TQString str; + + TQHBox *row1 = new TQHBox( this ); + row1->setSpacing( 5 ); + + // Create a multi-selection ListBox... + lb1 = new TQListBox( row1 ); + lb1->setSelectionMode( TQListBox::Multi ); + + // ...insert a pixmap item... + lb1->insertItem( TQPixmap( "qtlogo.png" ) ); + // ...and 100 text items + for ( i = 0; i < 100; i++ ) { + str = TQString( "Listbox Item %1" ).arg( i ); + if ( !( i % 4 ) ) + lb1->insertItem( TQPixmap( "fileopen.xpm" ), str ); + else + lb1->insertItem( str ); + } + + // Create a pushbutton... + TQPushButton *arrow1 = new TQPushButton( " -> ", row1 ); + // ...and connect the clicked SIGNAL with the SLOT slotLeft2Right + connect( arrow1, SIGNAL( clicked() ), this, SLOT( slotLeft2Right() ) ); + + // create an empty single-selection ListBox + lb2 = new TQListBox( row1 ); + + TQHBox *row2 = new TQHBox( this ); + row2->setSpacing( 5 ); + + TQVBox *box1 = new TQVBox( row2 ); + box1->setSpacing( 5 ); + + // Create a non-editable Combobox and a label below... + TQComboBox *cb1 = new TQComboBox( FALSE, box1 ); + label1 = new TQLabel( "Current Item: Combobox Item 0", box1 ); + label1->setMaximumHeight( label1->sizeHint().height() * 2 ); + label1->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + //...and insert 50 items into the Combobox + for ( i = 0; i < 50; i++ ) { + str = TQString( "Combobox Item %1" ).arg( i ); + if ( i % 9 ) + cb1->insertItem( str ); + else + cb1->listBox()->insertItem( new MyListBoxItem ); + } + + TQVBox *box2 = new TQVBox( row2 ); + box2->setSpacing( 5 ); + + // Create an editable Combobox and a label below... + TQComboBox *cb2 = new TQComboBox( TRUE, box2 ); + label2 = new TQLabel( "Current Item: Combobox Item 0", box2 ); + label2->setMaximumHeight( label2->sizeHint().height() * 2 ); + label2->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + // ... and insert 50 items into the Combobox + for ( i = 0; i < 50; i++ ) { + str = TQString( "Combobox Item %1" ).arg( i ); + if ( !( i % 4 ) ) + cb2->insertItem( TQPixmap( "fileopen.xpm" ), str ); + else + cb2->insertItem( str ); + } + + // Connect the activated SIGNALs of the Comboboxes with SLOTs + connect( cb1, SIGNAL( activated( const TQString & ) ), this, SLOT( slotCombo1Activated( const TQString & ) ) ); + connect( cb2, SIGNAL( activated( const TQString & ) ), this, SLOT( slotCombo2Activated( const TQString & ) ) ); +} + +/* + * SLOT slotLeft2Right + * + * Copies all selected items of the first ListBox into the + * second ListBox + */ + +void ListBoxCombo::slotLeft2Right() +{ + // Go through all items of the first ListBox + for ( unsigned int i = 0; i < lb1->count(); i++ ) { + TQListBoxItem *item = lb1->item( i ); + // if the item is selected... + if ( item->isSelected() ) { + // ...and it is a text item... + if ( item->pixmap() && !item->text().isEmpty() ) + lb2->insertItem( *item->pixmap(), item->text() ); + else if ( !item->pixmap() ) + lb2->insertItem( item->text() ); + else if ( item->text().isEmpty() ) + lb2->insertItem( *item->pixmap() ); + } + } +} + +/* + * SLOT slotCombo1Activated( const TQString &s ) + * + * Sets the text of the item which the user just selected + * in the first Combobox (and is now the value of s) to + * the first Label. + */ + +void ListBoxCombo::slotCombo1Activated( const TQString &s ) +{ + label1->setText( TQString( "Current Item: %1" ).arg( s ) ); +} + +/* + * SLOT slotCombo2Activated( const TQString &s ) + * + * Sets the text of the item which the user just selected + * in the second Combobox (and is now the value of s) to + * the second Label. + */ + +void ListBoxCombo::slotCombo2Activated( const TQString &s ) +{ + label2->setText( TQString( "Current Item: %1" ).arg( s ) ); +} diff --git a/examples/listboxcombo/listboxcombo.doc b/examples/listboxcombo/listboxcombo.doc new file mode 100644 index 000000000..f2d768ad7 --- /dev/null +++ b/examples/listboxcombo/listboxcombo.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page listboxcombo-example.html + + \ingroup examples + \title Listboxes and Comboboxes + + This example program demonstrates how to use listboxes (with single selection + and multi selection) and comboboxes (editable and non-editable). + + <hr> + + Header file: + + \include listboxcombo/listboxcombo.h + + <hr> + + Implementation: + + \include listboxcombo/listboxcombo.cpp + + <hr> + + Main: + + \include listboxcombo/main.cpp +*/ + diff --git a/examples/listboxcombo/listboxcombo.h b/examples/listboxcombo/listboxcombo.h new file mode 100644 index 000000000..b614fbd2a --- /dev/null +++ b/examples/listboxcombo/listboxcombo.h @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef LISTBOX_COMBO_H +#define LISTBOX_COMBO_H + +#include <qvbox.h> + +class TQListBox; +class TQLabel; + +class ListBoxCombo : public TQVBox +{ + Q_OBJECT + +public: + ListBoxCombo( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQListBox *lb1, *lb2; + TQLabel *label1, *label2; + +protected slots: + void slotLeft2Right(); + void slotCombo1Activated( const TQString &s ); + void slotCombo2Activated( const TQString &s ); + +}; + +#endif diff --git a/examples/listboxcombo/listboxcombo.pro b/examples/listboxcombo/listboxcombo.pro new file mode 100644 index 000000000..a75e30864 --- /dev/null +++ b/examples/listboxcombo/listboxcombo.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = listboxcombo + +CONFIG += qt warn_on release + +REQUIRES = large-config + +HEADERS = listboxcombo.h +SOURCES = listboxcombo.cpp \ + main.cpp diff --git a/examples/listboxcombo/main.cpp b/examples/listboxcombo/main.cpp new file mode 100644 index 000000000..dcfc0a8b7 --- /dev/null +++ b/examples/listboxcombo/main.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "listboxcombo.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + ListBoxCombo listboxcombo; + listboxcombo.resize( 400, 270 ); + listboxcombo.setCaption( "TQt Example - Listboxes and Comboboxes" ); + a.setMainWidget( &listboxcombo ); + listboxcombo.show(); + + return a.exec(); +} diff --git a/examples/listboxcombo/qtlogo.png b/examples/listboxcombo/qtlogo.png Binary files differnew file mode 100644 index 000000000..4e1a14726 --- /dev/null +++ b/examples/listboxcombo/qtlogo.png diff --git a/examples/listviews/listviews.cpp b/examples/listviews/listviews.cpp new file mode 100644 index 000000000..91d4a2bc8 --- /dev/null +++ b/examples/listviews/listviews.cpp @@ -0,0 +1,260 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "listviews.h" + +#include <qlabel.h> +#include <qpainter.h> +#include <qpalette.h> +#include <qobjectlist.h> +#include <qpopupmenu.h> +#include <qheader.h> +#include <qregexp.h> + +// ----------------------------------------------------------------- + +MessageHeader::MessageHeader( const MessageHeader &mh ) +{ + msender = mh.msender; + msubject = mh.msubject; + mdatetime = mh.mdatetime; +} + +MessageHeader &MessageHeader::operator=( const MessageHeader &mh ) +{ + msender = mh.msender; + msubject = mh.msubject; + mdatetime = mh.mdatetime; + + return *this; +} + +// ----------------------------------------------------------------- + +Folder::Folder( Folder *parent, const TQString &name ) + : TQObject( parent, name ), fName( name ) +{ + lstMessages.setAutoDelete( TRUE ); +} + +// ----------------------------------------------------------------- + +FolderListItem::FolderListItem( TQListView *parent, Folder *f ) + : TQListViewItem( parent ) +{ + myFolder = f; + setText( 0, f->folderName() ); + + if ( myFolder->children() ) + insertSubFolders( myFolder->children() ); +} + +FolderListItem::FolderListItem( FolderListItem *parent, Folder *f ) + : TQListViewItem( parent ) +{ + myFolder = f; + + setText( 0, f->folderName() ); + + if ( myFolder->children() ) + insertSubFolders( myFolder->children() ); +} + +void FolderListItem::insertSubFolders( const TQObjectList *lst ) +{ + Folder *f; + for ( f = ( Folder* )( ( TQObjectList* )lst )->first(); f; f = ( Folder* )( ( TQObjectList* )lst )->next() ) + (void)new FolderListItem( this, f ); +} + +// ----------------------------------------------------------------- + +MessageListItem::MessageListItem( TQListView *parent, Message *m ) + : TQListViewItem( parent ) +{ + myMessage = m; + setText( 0, myMessage->header().sender() ); + setText( 1, myMessage->header().subject() ); + setText( 2, myMessage->header().datetime().toString() ); +} + +void MessageListItem::paintCell( TQPainter *p, const TQColorGroup &cg, + int column, int width, int alignment ) +{ + TQColorGroup _cg( cg ); + TQColor c = _cg.text(); + + if ( myMessage->state() == Message::Unread ) + _cg.setColor( TQColorGroup::Text, TQt::red ); + + TQListViewItem::paintCell( p, _cg, column, width, alignment ); + + _cg.setColor( TQColorGroup::Text, c ); +} + +// ----------------------------------------------------------------- + +ListViews::ListViews( TQWidget *parent, const char *name ) + : TQSplitter( TQt::Horizontal, parent, name ) +{ + lstFolders.setAutoDelete( TRUE ); + + folders = new TQListView( this ); + folders->header()->setClickEnabled( FALSE ); + folders->addColumn( "Folder" ); + + initFolders(); + setupFolders(); + + folders->setRootIsDecorated( TRUE ); + setResizeMode( folders, TQSplitter::KeepSize ); + + TQSplitter *vsplitter = new TQSplitter( TQt::Vertical, this ); + + messages = new TQListView( vsplitter ); + messages->addColumn( "Sender" ); + messages->addColumn( "Subject" ); + messages->addColumn( "Date" ); + messages->setColumnAlignment( 1, TQt::AlignRight ); + messages->setAllColumnsShowFocus( TRUE ); + messages->setShowSortIndicator( TRUE ); + menu = new TQPopupMenu( messages ); + for( int i = 1; i <= 10; i++ ) + menu->insertItem( TQString( "Context Item %1" ).arg( i ) ); + connect(messages, SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint& , int ) ), + this, SLOT( slotRMB( TQListViewItem *, const TQPoint &, int ) ) ); + vsplitter->setResizeMode( messages, TQSplitter::KeepSize ); + + message = new TQLabel( vsplitter ); + message->setAlignment( TQt::AlignTop ); + message->setBackgroundMode( PaletteBase ); + + connect( folders, SIGNAL( selectionChanged( TQListViewItem* ) ), + this, SLOT( slotFolderChanged( TQListViewItem* ) ) ); + connect( messages, SIGNAL( selectionChanged() ), + this, SLOT( slotMessageChanged() ) ); + connect( messages, SIGNAL( currentChanged( TQListViewItem * ) ), + this, SLOT( slotMessageChanged() ) ); + + messages->setSelectionMode( TQListView::Extended ); + // some preparations + folders->firstChild()->setOpen( TRUE ); + folders->firstChild()->firstChild()->setOpen( TRUE ); + folders->setCurrentItem( folders->firstChild()->firstChild()->firstChild() ); + folders->setSelected( folders->firstChild()->firstChild()->firstChild(), TRUE ); + + messages->setSelected( messages->firstChild(), TRUE ); + messages->setCurrentItem( messages->firstChild() ); + message->setMargin( 5 ); + + TQValueList<int> lst; + lst.append( 170 ); + setSizes( lst ); +} + +void ListViews::initFolders() +{ + unsigned int mcount = 1; + + for ( unsigned int i = 1; i < 20; i++ ) { + TQString str; + str = TQString( "Folder %1" ).arg( i ); + Folder *f = new Folder( 0, str ); + for ( unsigned int j = 1; j < 5; j++ ) { + TQString str2; + str2 = TQString( "Sub Folder %1" ).arg( j ); + Folder *f2 = new Folder( f, str2 ); + for ( unsigned int k = 1; k < 3; k++ ) { + TQString str3; + str3 = TQString( "Sub Sub Folder %1" ).arg( k ); + Folder *f3 = new Folder( f2, str3 ); + initFolder( f3, mcount ); + } + } + lstFolders.append( f ); + } +} + +void ListViews::initFolder( Folder *folder, unsigned int &count ) +{ + for ( unsigned int i = 0; i < 15; i++, count++ ) { + TQString str; + str = TQString( "Message %1 " ).arg( count ); + TQDateTime dt = TQDateTime::currentDateTime(); + dt = dt.addSecs( 60 * count ); + MessageHeader mh( "Trolltech <info@trolltech.com> ", str, dt ); + + TQString body; + body = TQString( "This is the message number %1 of this application, \n" + "which shows how to use TQListViews, TQListViewItems, \n" + "TQSplitters and so on. The code should show how easy\n" + "this can be done in TQt." ).arg( count ); + Message *msg = new Message( mh, body ); + folder->addMessage( msg ); + } +} + +void ListViews::setupFolders() +{ + folders->clear(); + + for ( Folder* f = lstFolders.first(); f; f = lstFolders.next() ) + (void)new FolderListItem( folders, f ); +} + +void ListViews::slotRMB( TQListViewItem* Item, const TQPoint & point, int ) +{ + if( Item ) + menu->popup( point ); +} + + +void ListViews::slotFolderChanged( TQListViewItem *i ) +{ + if ( !i ) + return; + messages->clear(); + message->setText( "" ); + + FolderListItem *item = ( FolderListItem* )i; + + for ( Message* msg = item->folder()->firstMessage(); msg; + msg = item->folder()->nextMessage() ) + (void)new MessageListItem( messages, msg ); +} + +void ListViews::slotMessageChanged() +{ + TQListViewItem *i = messages->currentItem(); + if ( !i ) + return; + + if ( !i->isSelected() ) { + message->setText( "" ); + return; + } + + MessageListItem *item = ( MessageListItem* )i; + Message *msg = item->message(); + + TQString text; + TQString tmp = msg->header().sender(); + tmp = tmp.replace( "<", "<" ); + tmp = tmp.replace( ">", ">" ); + text = TQString( "<b><i>From:</i></b> <a href=\"mailto:info@trolltech.com\">%1</a><br>" + "<b><i>Subject:</i></b> <big><big><b>%2</b></big></big><br>" + "<b><i>Date:</i></b> %3<br><br>" + "%4" ). + arg( tmp ).arg( msg->header().subject() ). + arg( msg->header().datetime().toString() ).arg( msg->body() ); + + message->setText( text ); + + msg->setState( Message::Read ); +} diff --git a/examples/listviews/listviews.doc b/examples/listviews/listviews.doc new file mode 100644 index 000000000..6e31f78ab --- /dev/null +++ b/examples/listviews/listviews.doc @@ -0,0 +1,30 @@ +/* +*/ +/*! \page listviews-example.html + + \ingroup examples + \title Listviews + + This examples shows how to work with listviews (hierarchical and multi-column). + It also shows how to subclass listview items for special reasons. It looks + and works like the main window of a mail client. + + <hr> + + Header file: + + \include listviews/listviews.h + + <hr> + + Implementation: + + \include listviews/listviews.cpp + + <hr> + + Main: + + \include listviews/main.cpp +*/ + diff --git a/examples/listviews/listviews.h b/examples/listviews/listviews.h new file mode 100644 index 000000000..bcc5e30d9 --- /dev/null +++ b/examples/listviews/listviews.h @@ -0,0 +1,166 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef LISTVIEWS_H +#define LISTVIEWS_H + +#include <qsplitter.h> +#include <qstring.h> +#include <qobject.h> +#include <qdatetime.h> +#include <qptrlist.h> +#include <qlistview.h> + +class TQListView; +class TQLabel; +class TQPainter; +class TQColorGroup; +class TQObjectList; +class TQPopupMenu; + +// ----------------------------------------------------------------- + +class MessageHeader +{ +public: + MessageHeader( const TQString &_sender, const TQString &_subject, const TQDateTime &_datetime ) + : msender( _sender ), msubject( _subject ), mdatetime( _datetime ) + {} + + MessageHeader( const MessageHeader &mh ); + MessageHeader &operator=( const MessageHeader &mh ); + + TQString sender() { return msender; } + TQString subject() { return msubject; } + TQDateTime datetime() { return mdatetime; } + +protected: + TQString msender, msubject; + TQDateTime mdatetime; + +}; + +// ----------------------------------------------------------------- + +class Message +{ +public: + enum State { Read = 0, + Unread}; + + Message( const MessageHeader &mh, const TQString &_body ) + : mheader( mh ), mbody( _body ), mstate( Unread ) + {} + + Message( const Message &m ) + : mheader( m.mheader ), mbody( m.mbody ), mstate( m.mstate ) + {} + + MessageHeader header() { return mheader; } + TQString body() { return mbody; } + + void setState( const State &s ) { mstate = s; } + State state() { return mstate; } + +protected: + MessageHeader mheader; + TQString mbody; + State mstate; + +}; + +// ----------------------------------------------------------------- + +class Folder : public TQObject +{ + Q_OBJECT + +public: + Folder( Folder *parent, const TQString &name ); + ~Folder() + {} + + void addMessage( Message *m ) + { lstMessages.append( m ); } + + TQString folderName() { return fName; } + + Message *firstMessage() { return lstMessages.first(); } + Message *nextMessage() { return lstMessages.next(); } + +protected: + TQString fName; + TQPtrList<Message> lstMessages; + +}; + +// ----------------------------------------------------------------- + +class FolderListItem : public TQListViewItem +{ +public: + FolderListItem( TQListView *parent, Folder *f ); + FolderListItem( FolderListItem *parent, Folder *f ); + + void insertSubFolders( const TQObjectList *lst ); + + Folder *folder() { return myFolder; } + +protected: + Folder *myFolder; + +}; + +// ----------------------------------------------------------------- + +class MessageListItem : public TQListViewItem +{ +public: + MessageListItem( TQListView *parent, Message *m ); + + virtual void paintCell( TQPainter *p, const TQColorGroup &cg, + int column, int width, int alignment ); + + Message *message() { return myMessage; } + +protected: + Message *myMessage; + +}; + +// ----------------------------------------------------------------- + +class ListViews : public TQSplitter +{ + Q_OBJECT + +public: + ListViews( TQWidget *parent = 0, const char *name = 0 ); + ~ListViews() + {} + +protected: + void initFolders(); + void initFolder( Folder *folder, unsigned int &count ); + void setupFolders(); + + TQListView *messages, *folders; + TQLabel *message; + TQPopupMenu* menu; + + TQPtrList<Folder> lstFolders; + +protected slots: + void slotFolderChanged( TQListViewItem* ); + void slotMessageChanged(); + void slotRMB( TQListViewItem*, const TQPoint &, int ); + +}; + +#endif diff --git a/examples/listviews/listviews.pro b/examples/listviews/listviews.pro new file mode 100644 index 000000000..20abc71ec --- /dev/null +++ b/examples/listviews/listviews.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = listviews + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = listviews.h +SOURCES = listviews.cpp \ + main.cpp diff --git a/examples/listviews/main.cpp b/examples/listviews/main.cpp new file mode 100644 index 000000000..bba039239 --- /dev/null +++ b/examples/listviews/main.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "listviews.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + ListViews listViews; + listViews.resize( 640, 480 ); + listViews.setCaption( "TQt Example - Listview" ); + a.setMainWidget( &listViews ); + listViews.show(); + + return a.exec(); +} diff --git a/examples/mdi/application.cpp b/examples/mdi/application.cpp new file mode 100644 index 000000000..c66c1e6e9 --- /dev/null +++ b/examples/mdi/application.cpp @@ -0,0 +1,435 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "application.h" +#include <qworkspace.h> +#include <qimage.h> +#include <qpixmap.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qmovie.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qlabel.h> +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qprinter.h> +#include <qapplication.h> +#include <qpushbutton.h> +#include <qaccel.h> +#include <qtextstream.h> +#include <qtextedit.h> +#include <qpainter.h> +#include <qpaintdevicemetrics.h> +#include <qwhatsthis.h> +#include <qobjectlist.h> +#include <qvbox.h> +#include <qsimplerichtext.h> + +#include "filesave.xpm" +#include "fileopen.xpm" +#include "fileprint.xpm" + + +const char * fileOpenText = "Click this button to open a <em>new file</em>. <br><br>" +"You can also select the <b>Open command</b> from the File menu."; +const char * fileSaveText = "Click this button to save the file you are " +"editing. You will be prompted for a file name.\n\n" +"You can also select the Save command from the File menu.\n\n" +"Note that implementing this function is left as an exercise for the reader."; +const char * filePrintText = "Click this button to print the file you " +"are editing.\n\n" +"You can also select the Print command from the File menu."; + +ApplicationWindow::ApplicationWindow() + : TQMainWindow( 0, "example application main window", WDestructiveClose ) +{ + int id; + + TQPixmap openIcon, saveIcon; + + fileTools = new TQToolBar( this, "file operations" ); + addToolBar( fileTools, tr( "File Operations" ), DockTop, TRUE ); + + openIcon = TQPixmap( fileopen ); + TQToolButton * fileOpen + = new TQToolButton( openIcon, "Open File", TQString::null, + this, SLOT(load()), fileTools, "open file" ); + + saveIcon = TQPixmap( filesave ); + TQToolButton * fileSave + = new TQToolButton( saveIcon, "Save File", TQString::null, + this, SLOT(save()), fileTools, "save file" ); + +#ifndef QT_NO_PRINTER + printer = new TQPrinter( TQPrinter::HighResolution ); + TQPixmap printIcon; + + printIcon = TQPixmap( fileprint ); + TQToolButton * filePrint + = new TQToolButton( printIcon, "Print File", TQString::null, + this, SLOT(print()), fileTools, "print file" ); + TQWhatsThis::add( filePrint, filePrintText ); +#endif + + (void)TQWhatsThis::whatsThisButton( fileTools ); + + TQWhatsThis::add( fileOpen, fileOpenText ); + TQWhatsThis::add( fileSave, fileSaveText ); + + TQPopupMenu * file = new TQPopupMenu( this ); + menuBar()->insertItem( "&File", file ); + + file->insertItem( "&New", this, SLOT(newDoc()), CTRL+Key_N ); + + id = file->insertItem( openIcon, "&Open...", + this, SLOT(load()), CTRL+Key_O ); + file->setWhatsThis( id, fileOpenText ); + + id = file->insertItem( saveIcon, "&Save", + this, SLOT(save()), CTRL+Key_S ); + file->setWhatsThis( id, fileSaveText ); + id = file->insertItem( "Save &As...", this, SLOT(saveAs()) ); + file->setWhatsThis( id, fileSaveText ); +#ifndef QT_NO_PRINTER + file->insertSeparator(); + id = file->insertItem( printIcon, "&Print...", + this, SLOT(print()), CTRL+Key_P ); + file->setWhatsThis( id, filePrintText ); +#endif + file->insertSeparator(); + file->insertItem( "&Close", this, SLOT(closeWindow()), CTRL+Key_W ); + file->insertItem( "&Quit", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q ); + + windowsMenu = new TQPopupMenu( this ); + windowsMenu->setCheckable( TRUE ); + connect( windowsMenu, SIGNAL( aboutToShow() ), + this, SLOT( windowsMenuAboutToShow() ) ); + menuBar()->insertItem( "&Windows", windowsMenu ); + + menuBar()->insertSeparator(); + TQPopupMenu * help = new TQPopupMenu( this ); + menuBar()->insertItem( "&Help", help ); + + help->insertItem( "&About", this, SLOT(about()), Key_F1); + help->insertItem( "About &TQt", this, SLOT(aboutTQt())); + help->insertSeparator(); + help->insertItem( "What's &This", this, SLOT(whatsThis()), SHIFT+Key_F1); + + TQVBox* vb = new TQVBox( this ); + vb->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + ws = new TQWorkspace( vb ); + ws->setScrollBarsEnabled( TRUE ); + setCentralWidget( vb ); + + statusBar()->message( "Ready", 2000 ); +} + + +ApplicationWindow::~ApplicationWindow() +{ +#ifndef QT_NO_PRINTER + delete printer; +#endif +} + + + +MDIWindow* ApplicationWindow::newDoc() +{ + MDIWindow* w = new MDIWindow( ws, 0, WDestructiveClose ); + connect( w, SIGNAL( message(const TQString&, int) ), statusBar(), SLOT( message(const TQString&, int )) ); + w->setCaption("unnamed document"); + w->setIcon( TQPixmap("document.xpm") ); + // show the very first window in maximized mode + if ( ws->windowList().isEmpty() ) + w->showMaximized(); + else + w->show(); + return w; +} + +void ApplicationWindow::load() +{ + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) { + MDIWindow* w = newDoc(); + w->load( fn ); + } else { + statusBar()->message( "Loading aborted", 2000 ); + } +} + +void ApplicationWindow::save() +{ + MDIWindow* m = (MDIWindow*)ws->activeWindow(); + if ( m ) + m->save(); +} + + +void ApplicationWindow::saveAs() +{ + MDIWindow* m = (MDIWindow*)ws->activeWindow(); + if ( m ) + m->saveAs(); +} + + +void ApplicationWindow::print() +{ +#ifndef QT_NO_PRINTER + MDIWindow* m = (MDIWindow*)ws->activeWindow(); + if ( m ) + m->print( printer ); +#endif +} + + +void ApplicationWindow::closeWindow() +{ + MDIWindow* m = (MDIWindow*)ws->activeWindow(); + if ( m ) + m->close(); +} + +void ApplicationWindow::about() +{ + TQMessageBox::about( this, "TQt Application Example", + "This example demonstrates simple use of\n " + "TQt's Multiple Document Interface (MDI)."); +} + + +void ApplicationWindow::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQt Application Example" ); +} + + +void ApplicationWindow::windowsMenuAboutToShow() +{ + windowsMenu->clear(); + int cascadeId = windowsMenu->insertItem("&Cascade", ws, SLOT(cascade() ) ); + int tileId = windowsMenu->insertItem("&Tile", ws, SLOT(tile() ) ); + int horTileId = windowsMenu->insertItem("Tile &Horizontally", this, SLOT(tileHorizontal() ) ); + if ( ws->windowList().isEmpty() ) { + windowsMenu->setItemEnabled( cascadeId, FALSE ); + windowsMenu->setItemEnabled( tileId, FALSE ); + windowsMenu->setItemEnabled( horTileId, FALSE ); + } + windowsMenu->insertSeparator(); + TQWidgetList windows = ws->windowList(); + for ( int i = 0; i < int(windows.count()); ++i ) { + int id = windowsMenu->insertItem(windows.at(i)->caption(), + this, SLOT( windowsMenuActivated( int ) ) ); + windowsMenu->setItemParameter( id, i ); + windowsMenu->setItemChecked( id, ws->activeWindow() == windows.at(i) ); + } +} + +void ApplicationWindow::windowsMenuActivated( int id ) +{ + TQWidget* w = ws->windowList().at( id ); + if ( w ) + w->showNormal(); + w->setFocus(); +} + +void ApplicationWindow::tileHorizontal() +{ + // primitive horizontal tiling + TQWidgetList windows = ws->windowList(); + if ( !windows.count() ) + return; + + if (ws->activeWindow()) + ws->activeWindow()->showNormal(); + + int heightForEach = ws->height() / windows.count(); + int y = 0; + for ( int i = 0; i < int(windows.count()); ++i ) { + TQWidget *window = windows.at(i); + int preferredHeight = window->minimumHeight()+window->parentWidget()->baseSize().height(); + int actHeight = TQMAX(heightForEach, preferredHeight); + + window->parentWidget()->setGeometry( 0, y, ws->width(), actHeight ); + y += actHeight; + } +} + +void ApplicationWindow::closeEvent( TQCloseEvent *e ) +{ + TQWidgetList windows = ws->windowList(); + if ( windows.count() ) { + for ( int i = 0; i < int(windows.count()); ++i ) { + TQWidget *window = windows.at( i ); + if ( !window->close() ) { + e->ignore(); + return; + } + } + } + + TQMainWindow::closeEvent( e ); +} + +MDIWindow::MDIWindow( TQWidget* parent, const char* name, int wflags ) + : TQMainWindow( parent, name, wflags ) +{ + mmovie = 0; + medit = new TQTextEdit( this ); + setFocusProxy( medit ); + setCentralWidget( medit ); +} + +MDIWindow::~MDIWindow() +{ + delete mmovie; +} + +void MDIWindow::closeEvent( TQCloseEvent *e ) +{ + if ( medit->isModified() ) { + switch( TQMessageBox::warning( this, "Save Changes", + tr("Save changes to %1?").arg( caption() ), + tr("Yes"), tr("No"), tr("Cancel") ) ) { + case 0: + { + save(); + if ( !filename.isEmpty() ) + e->accept(); + else + e->ignore(); + } + break; + case 1: + e->accept(); + break; + default: + e->ignore(); + break; + } + } else { + e->accept(); + } +} + +void MDIWindow::load( const TQString& fn ) +{ + filename = fn; + TQFile f( filename ); + if ( !f.open( IO_ReadOnly ) ) + return; + + if(fn.contains(".gif")) { + TQWidget * tmp=new TQWidget(this); + setFocusProxy(tmp); + setCentralWidget(tmp); + medit->hide(); + delete medit; + TQMovie * qm=new TQMovie(fn); +#ifdef Q_WS_QWS // temporary speed-test hack + qm->setDisplayWidget(tmp); +#endif + tmp->setBackgroundMode(TQWidget::NoBackground); + tmp->show(); + mmovie=qm; + } else { + mmovie = 0; + + TQTextStream t(&f); + TQString s = t.read(); + medit->setText( s ); + f.close(); + + + } + setCaption( filename ); + emit message( TQString("Loaded document %1").arg(filename), 2000 ); +} + +void MDIWindow::save() +{ + if ( filename.isEmpty() ) { + saveAs(); + return; + } + + TQString text = medit->text(); + TQFile f( filename ); + if ( !f.open( IO_WriteOnly ) ) { + emit message( TQString("Could not write to %1").arg(filename), + 2000 ); + return; + } + + TQTextStream t( &f ); + t << text; + f.close(); + + setCaption( filename ); + + emit message( TQString( "File %1 saved" ).arg( filename ), 2000 ); +} + +void MDIWindow::saveAs() +{ + TQString fn = TQFileDialog::getSaveFileName( filename, TQString::null, this ); + if ( !fn.isEmpty() ) { + filename = fn; + save(); + } else { + emit message( "Saving aborted", 2000 ); + } +} + +void MDIWindow::print( TQPrinter* printer) +{ +#ifndef QT_NO_PRINTER + int pageNo = 1; + + if ( printer->setup(this) ) { // printer dialog + printer->setFullPage( TRUE ); + emit message( "Printing...", 0 ); + TQPainter p; + if ( !p.begin( printer ) ) + return; // paint on printer + TQPaintDeviceMetrics metrics( p.device() ); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + TQSimpleRichText richText( TQStyleSheet::convertFromPlainText(medit->text()), + TQFont(), + medit->context(), + medit->styleSheet(), + medit->mimeSourceFactory(), + view.height() ); + richText.setWidth( &p, view.width() ); + int page = 1; + do { + richText.draw( &p, margin, margin, view, colorGroup() ); + view.moveBy( 0, view.height() ); + p.translate( 0 , -view.height() ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) ); + if ( view.top() - margin >= richText.height() ) + break; + TQString msg( "Printing (page " ); + msg += TQString::number( ++pageNo ); + msg += ")..."; + emit message( msg, 0 ); + printer->newPage(); + page++; + } while (TRUE); + } +#endif +} diff --git a/examples/mdi/application.h b/examples/mdi/application.h new file mode 100644 index 000000000..d0108df35 --- /dev/null +++ b/examples/mdi/application.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef APPLICATION_H +#define APPLICATION_H + +#include <qmainwindow.h> +#include <qptrlist.h> + +class TQTextEdit; +class TQToolBar; +class TQPopupMenu; +class TQWorkspace; +class TQPopupMenu; +class TQMovie; + +class MDIWindow: public TQMainWindow +{ + Q_OBJECT +public: + MDIWindow( TQWidget* parent, const char* name, int wflags ); + ~MDIWindow(); + + void load( const TQString& fn ); + void save(); + void saveAs(); + void print( TQPrinter* ); + +protected: + void closeEvent( TQCloseEvent * ); + +signals: + void message(const TQString&, int ); + +private: + TQTextEdit* medit; + TQMovie * mmovie; + TQString filename; +}; + + +class ApplicationWindow: public TQMainWindow +{ + Q_OBJECT +public: + ApplicationWindow(); + ~ApplicationWindow(); + +protected: + void closeEvent( TQCloseEvent * ); + +private slots: + MDIWindow* newDoc(); + void load(); + void save(); + void saveAs(); + void print(); + void closeWindow(); + void tileHorizontal(); + + void about(); + void aboutTQt(); + + void windowsMenuAboutToShow(); + void windowsMenuActivated( int id ); + +private: + TQPrinter *printer; + TQWorkspace* ws; + TQToolBar *fileTools; + TQPopupMenu* windowsMenu; +}; + + +#endif diff --git a/examples/mdi/document.xpm b/examples/mdi/document.xpm new file mode 100644 index 000000000..c08f63e92 --- /dev/null +++ b/examples/mdi/document.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char * document_xpm[] = { +"12 16 6 1", +" c #040404", +". c None", +"X c white", +"o c #808304", +"O c black", +"+ c #f3f7f3", +" .....", +" XXXXX ....", +" XXXXX X ...", +" XXXXX XX ..", +" XooXX O.", +" X+XXX+XXXO.", +" XXXXXXXXXO.", +" XoooXooXXO.", +" XXXXXXXXXO.", +" XXXXXXXXXO.", +" XoXXoooXXO.", +" XXXXXXXXXO.", +"OXXXXXXXXXO.", +"OXXXXXXXXXO.", +"OOOOOOOOOOO.", +"............"}; diff --git a/examples/mdi/fileopen.xpm b/examples/mdi/fileopen.xpm new file mode 100644 index 000000000..880417eee --- /dev/null +++ b/examples/mdi/fileopen.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *fileopen[] = { +" 16 13 5 1", +". c #040404", +"# c #808304", +"a c None", +"b c #f3f704", +"c c #f3f7f3", +"aaaaaaaaa...aaaa", +"aaaaaaaa.aaa.a.a", +"aaaaaaaaaaaaa..a", +"a...aaaaaaaa...a", +".bcb.......aaaaa", +".cbcbcbcbc.aaaaa", +".bcbcbcbcb.aaaaa", +".cbcb...........", +".bcb.#########.a", +".cb.#########.aa", +".b.#########.aaa", +"..#########.aaaa", +"...........aaaaa" +}; diff --git a/examples/mdi/fileprint.xpm b/examples/mdi/fileprint.xpm new file mode 100644 index 000000000..6ada912fa --- /dev/null +++ b/examples/mdi/fileprint.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static const char *fileprint[] = { +" 16 14 6 1", +". c #000000", +"# c #848284", +"a c #c6c3c6", +"b c #ffff00", +"c c #ffffff", +"d c None", +"ddddd.........dd", +"dddd.cccccccc.dd", +"dddd.c.....c.ddd", +"ddd.cccccccc.ddd", +"ddd.c.....c....d", +"dd.cccccccc.a.a.", +"d..........a.a..", +".aaaaaaaaaa.a.a.", +".............aa.", +".aaaaaa###aa.a.d", +".aaaaaabbbaa...d", +".............a.d", +"d.aaaaaaaaa.a.dd", +"dd...........ddd" +}; diff --git a/examples/mdi/filesave.xpm b/examples/mdi/filesave.xpm new file mode 100644 index 000000000..bd6870f47 --- /dev/null +++ b/examples/mdi/filesave.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *filesave[] = { +" 14 14 4 1", +". c #040404", +"# c #808304", +"a c #bfc2bf", +"b c None", +"..............", +".#.aaaaaaaa.a.", +".#.aaaaaaaa...", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".#.aaaaaaaa.#.", +".##........##.", +".############.", +".##.........#.", +".##......aa.#.", +".##......aa.#.", +".##......aa.#.", +"b............." +}; diff --git a/examples/mdi/main.cpp b/examples/mdi/main.cpp new file mode 100644 index 000000000..1bda1da23 --- /dev/null +++ b/examples/mdi/main.cpp @@ -0,0 +1,22 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "application.h" + +int main( int argc, char ** argv ) { + TQApplication a( argc, argv ); + ApplicationWindow * mw = new ApplicationWindow(); + a.setMainWidget(mw); + mw->setCaption( "TQt Example - Multiple Documents Interface (MDI)" ); + mw->show(); + a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) ); + int res = a.exec(); + return res; +} diff --git a/examples/mdi/mdi.doc b/examples/mdi/mdi.doc new file mode 100644 index 000000000..7f97702a5 --- /dev/null +++ b/examples/mdi/mdi.doc @@ -0,0 +1,28 @@ +/* +*/ +/*! \page mdi-example.html + + \ingroup examples + \title An MDI Application + + This example program is just like the application example, except + that it provides a Multiple Document Interface (MDI). + + <hr> + + Header file: + + \include mdi/application.h + + <hr> + + Implementation: + + \include mdi/application.cpp + + <hr> + + Main: + + \include mdi/main.cpp +*/ diff --git a/examples/mdi/mdi.pro b/examples/mdi/mdi.pro new file mode 100644 index 000000000..e0a081a32 --- /dev/null +++ b/examples/mdi/mdi.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = mdi + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = workspace full-config + +HEADERS = application.h +SOURCES = application.cpp \ + main.cpp diff --git a/examples/menu/menu.cpp b/examples/menu/menu.cpp new file mode 100644 index 000000000..f71b8152d --- /dev/null +++ b/examples/menu/menu.cpp @@ -0,0 +1,355 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "menu.h" +#include <qcursor.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qmessagebox.h> +#include <qpixmap.h> +#include <qpainter.h> + +/* XPM */ +static const char * p1_xpm[] = { +"16 16 3 1", +" c None", +". c #000000000000", +"X c #FFFFFFFF0000", +" ", +" ", +" .... ", +" .XXXX. ", +" .............. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .............. ", +" "}; + +/* XPM */ +static const char * p2_xpm[] = { +"16 16 3 1", +" c None", +". c #000000000000", +"X c #FFFFFFFFFFFF", +" ", +" ...... ", +" .XXX.X. ", +" .XXX.XX. ", +" .XXX.XXX. ", +" .XXX..... ", +" .XXXXXXX. ", +" .XXXXXXX. ", +" .XXXXXXX. ", +" .XXXXXXX. ", +" .XXXXXXX. ", +" .XXXXXXX. ", +" .XXXXXXX. ", +" ......... ", +" ", +" "}; + +/* XPM */ +static const char * p3_xpm[] = { +"16 16 3 1", +" c None", +". c #000000000000", +"X c #FFFFFFFFFFFF", +" ", +" ", +" ......... ", +" ........... ", +" ........ .. ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ...XXXXX... ", +" ...XXXXX... ", +" ...XXXXX... ", +" ...XXXXX... ", +" ......... ", +" ", +" "}; + + +/* + Auxiliary class to provide fancy menu items with different + fonts. Used for the "bold" and "underline" menu items in the options + menu. + */ +class MyMenuItem : public TQCustomMenuItem +{ +public: + MyMenuItem( const TQString& s, const TQFont& f ) + : string( s ), font( f ){}; + ~MyMenuItem(){} + + void paint( TQPainter* p, const TQColorGroup& /*cg*/, bool /*act*/, bool /*enabled*/, int x, int y, int w, int h ) + { + p->setFont ( font ); + p->drawText( x, y, w, h, AlignLeft | AlignVCenter | DontClip | ShowPrefix, string ); + } + + TQSize sizeHint() + { + return TQFontMetrics( font ).size( AlignLeft | AlignVCenter | ShowPrefix | DontClip, string ); + } +private: + TQString string; + TQFont font; +}; + + +MenuExample::MenuExample( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + TQPixmap p1( p1_xpm ); + TQPixmap p2( p2_xpm ); + TQPixmap p3( p3_xpm ); + TQPopupMenu *print = new TQPopupMenu( this ); + Q_CHECK_PTR( print ); + print->insertTearOffHandle(); + print->insertItem( "&Print to printer", this, SLOT(printer()) ); + print->insertItem( "Print to &file", this, SLOT(file()) ); + print->insertItem( "Print to fa&x", this, SLOT(fax()) ); + print->insertSeparator(); + print->insertItem( "Printer &Setup", this, SLOT(printerSetup()) ); + + TQPopupMenu *file = new TQPopupMenu( this ); + Q_CHECK_PTR( file ); + file->insertItem( p1, "&Open", this, SLOT(open()), CTRL+Key_O ); + file->insertItem( p2, "&New", this, SLOT(news()), CTRL+Key_N ); + file->insertItem( p3, "&Save", this, SLOT(save()), CTRL+Key_S ); + file->insertItem( "&Close", this, SLOT(closeDoc()), CTRL+Key_W ); + file->insertSeparator(); + file->insertItem( "&Print", print, CTRL+Key_P ); + file->insertSeparator(); + file->insertItem( "E&xit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + TQPopupMenu *edit = new TQPopupMenu( this ); + Q_CHECK_PTR( edit ); + int undoID = edit->insertItem( "&Undo", this, SLOT(undo()) ); + int redoID = edit->insertItem( "&Redo", this, SLOT(redo()) ); + edit->setItemEnabled( undoID, FALSE ); + edit->setItemEnabled( redoID, FALSE ); + + TQPopupMenu* options = new TQPopupMenu( this ); + Q_CHECK_PTR( options ); + options->insertTearOffHandle(); + options->setCaption("Options"); + options->insertItem( "&Normal Font", this, SLOT(normal()) ); + options->insertSeparator(); + + options->polish(); // adjust system settings + TQFont f = options->font(); + f.setBold( TRUE ); + boldID = options->insertItem( new MyMenuItem( "Bold", f ) ); + options->setAccel( CTRL+Key_B, boldID ); + options->connectItem( boldID, this, SLOT(bold()) ); + f = font(); + f.setUnderline( TRUE ); + underlineID = options->insertItem( new MyMenuItem( "Underline", f ) ); + options->setAccel( CTRL+Key_U, underlineID ); + options->connectItem( underlineID, this, SLOT(underline()) ); + + isBold = FALSE; + isUnderline = FALSE; + options->setCheckable( TRUE ); + + + TQPopupMenu *help = new TQPopupMenu( this ); + Q_CHECK_PTR( help ); + help->insertItem( "&About", this, SLOT(about()), CTRL+Key_H ); + help->insertItem( "About &TQt", this, SLOT(aboutTQt()) ); + + // If we used a TQMainWindow we could use its built-in menuBar(). + menu = new TQMenuBar( this ); + Q_CHECK_PTR( menu ); + menu->insertItem( "&File", file ); + menu->insertItem( "&Edit", edit ); + menu->insertItem( "&Options", options ); + menu->insertSeparator(); + menu->insertItem( "&Help", help ); + menu->setSeparator( TQMenuBar::InWindowsStyle ); + + + TQLabel *msg = new TQLabel( this ); + Q_CHECK_PTR( msg ); + msg->setText( "A context menu is available.\n" + "Invoke it by right-clicking or by" + " pressing the 'context' button." ); + msg->setGeometry( 0, height() - 60, width(), 60 ); + msg->setAlignment( AlignCenter ); + + label = new TQLabel( this ); + Q_CHECK_PTR( label ); + label->setGeometry( 20, rect().center().y()-20, width()-40, 40 ); + label->setFrameStyle( TQFrame::Box | TQFrame::Raised ); + label->setLineWidth( 1 ); + label->setAlignment( AlignCenter ); + + connect( this, SIGNAL(explain(const TQString&)), + label, SLOT(setText(const TQString&)) ); + + setMinimumSize( 100, 80 ); + setFocusPolicy( TQWidget::ClickFocus ); +} + + +void MenuExample::contextMenuEvent( TQContextMenuEvent * ) +{ + TQPopupMenu* contextMenu = new TQPopupMenu( this ); + Q_CHECK_PTR( contextMenu ); + TQLabel *caption = new TQLabel( "<font color=darkblue><u><b>" + "Context Menu</b></u></font>", this ); + caption->setAlignment( TQt::AlignCenter ); + contextMenu->insertItem( caption ); + contextMenu->insertItem( "&New", this, SLOT(news()), CTRL+Key_N ); + contextMenu->insertItem( "&Open...", this, SLOT(open()), CTRL+Key_O ); + contextMenu->insertItem( "&Save", this, SLOT(save()), CTRL+Key_S ); + TQPopupMenu *submenu = new TQPopupMenu( this ); + Q_CHECK_PTR( submenu ); + submenu->insertItem( "&Print to printer", this, SLOT(printer()) ); + submenu->insertItem( "Print to &file", this, SLOT(file()) ); + submenu->insertItem( "Print to fa&x", this, SLOT(fax()) ); + contextMenu->insertItem( "&Print", submenu ); + contextMenu->exec( TQCursor::pos() ); + delete contextMenu; +} + + +void MenuExample::open() +{ + emit explain( "File/Open selected" ); +} + + +void MenuExample::news() +{ + emit explain( "File/New selected" ); +} + +void MenuExample::save() +{ + emit explain( "File/Save selected" ); +} + + +void MenuExample::closeDoc() +{ + emit explain( "File/Close selected" ); +} + + +void MenuExample::undo() +{ + emit explain( "Edit/Undo selected" ); +} + + +void MenuExample::redo() +{ + emit explain( "Edit/Redo selected" ); +} + + +void MenuExample::normal() +{ + isBold = FALSE; + isUnderline = FALSE; + TQFont font; + label->setFont( font ); + menu->setItemChecked( boldID, isBold ); + menu->setItemChecked( underlineID, isUnderline ); + emit explain( "Options/Normal selected" ); +} + + +void MenuExample::bold() +{ + isBold = !isBold; + TQFont font; + font.setBold( isBold ); + font.setUnderline( isUnderline ); + label->setFont( font ); + menu->setItemChecked( boldID, isBold ); + emit explain( "Options/Bold selected" ); +} + + +void MenuExample::underline() +{ + isUnderline = !isUnderline; + TQFont font; + font.setBold( isBold ); + font.setUnderline( isUnderline ); + label->setFont( font ); + menu->setItemChecked( underlineID, isUnderline ); + emit explain( "Options/Underline selected" ); +} + + +void MenuExample::about() +{ + TQMessageBox::about( this, "TQt Menu Example", + "This example demonstrates simple use of TQt menus.\n" + "You can cut and paste lines from it to your own\n" + "programs." ); +} + + +void MenuExample::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQt Menu Example" ); +} + + +void MenuExample::printer() +{ + emit explain( "File/Printer/Print selected" ); +} + +void MenuExample::file() +{ + emit explain( "File/Printer/Print To File selected" ); +} + +void MenuExample::fax() +{ + emit explain( "File/Printer/Print To Fax selected" ); +} + +void MenuExample::printerSetup() +{ + emit explain( "File/Printer/Printer Setup selected" ); +} + + +void MenuExample::resizeEvent( TQResizeEvent * ) +{ + label->setGeometry( 20, rect().center().y()-20, width()-40, 40 ); +} + + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + MenuExample m; + m.setCaption("TQt Examples - Menus"); + a.setMainWidget( &m ); + m.show(); + return a.exec(); +} diff --git a/examples/menu/menu.doc b/examples/menu/menu.doc new file mode 100644 index 000000000..a7ed69bb4 --- /dev/null +++ b/examples/menu/menu.doc @@ -0,0 +1,25 @@ +/* +*/ +/*! \page menu-example.html + + \ingroup examples + \title Using menus + + This example demonstrates a menu bar with pull-down menus, + sub-menus and custom menu items. It also demonstrates a pop-up + context menu. + + + <hr> + + Header file: + + \include menu/menu.h + + <hr> + + Implementation: + + \include menu/menu.cpp +*/ + diff --git a/examples/menu/menu.h b/examples/menu/menu.h new file mode 100644 index 000000000..d42acd497 --- /dev/null +++ b/examples/menu/menu.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef MENU_H +#define MENU_H + +#include <qwidget.h> +#include <qmenubar.h> +#include <qlabel.h> + + +class MenuExample : public TQWidget +{ + Q_OBJECT +public: + MenuExample( TQWidget *parent=0, const char *name=0 ); + +public slots: + void open(); + void news(); + void save(); + void closeDoc(); + void undo(); + void redo(); + void normal(); + void bold(); + void underline(); + void about(); + void aboutTQt(); + void printer(); + void file(); + void fax(); + void printerSetup(); + +protected: + void resizeEvent( TQResizeEvent * ); + +signals: + void explain( const TQString& ); + +private: + void contextMenuEvent ( TQContextMenuEvent * ); + + + TQMenuBar *menu; + TQLabel *label; + bool isBold; + bool isUnderline; + int boldID, underlineID; +}; + + +#endif // MENU_H diff --git a/examples/menu/menu.pro b/examples/menu/menu.pro new file mode 100644 index 000000000..cc61a24c3 --- /dev/null +++ b/examples/menu/menu.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = menu + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = menu.h +SOURCES = menu.cpp diff --git a/examples/movies/fire.mng b/examples/movies/fire.mng Binary files differnew file mode 100644 index 000000000..c6695c836 --- /dev/null +++ b/examples/movies/fire.mng diff --git a/examples/movies/main.cpp b/examples/movies/main.cpp new file mode 100644 index 000000000..5aaea565f --- /dev/null +++ b/examples/movies/main.cpp @@ -0,0 +1,291 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qfiledialog.h> +#include <qpushbutton.h> +#include <qlabel.h> +#include <qpainter.h> +#include <qmessagebox.h> +#include <qmovie.h> +#include <qvbox.h> + + +class MovieScreen : public TQFrame { + Q_OBJECT + TQMovie movie; + TQString filename; + TQSize sh; + +public: + MovieScreen(const char* fname, TQMovie m, TQWidget* p=0, const char* name=0, WFlags f=0) : + TQFrame(p, name, f), + sh(100,100) + { + setCaption(fname); + filename = fname; + movie = m; + + // Set a frame around the movie. + setFrameStyle(TQFrame::WinPanel|TQFrame::Sunken); + + // No background needed, since we draw on the whole widget. + movie.setBackgroundColor(backgroundColor()); + setBackgroundMode(NoBackground); + + // Get the movie to tell use when interesting things happen. + movie.connectUpdate(this, SLOT(movieUpdated(const TQRect&))); + movie.connectResize(this, SLOT(movieResized(const TQSize&))); + movie.connectStatus(this, SLOT(movieStatus(int))); + + setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Expanding)); + } + + TQSize sizeHint() const + { + return sh; + } + +protected: + + // Draw the contents of the TQFrame - the movie and on-screen-display + void drawContents(TQPainter* p) + { + // Get the current movie frame. + TQPixmap pm = movie.framePixmap(); + + // Get the area we have to draw in. + TQRect r = contentsRect(); + + if ( !pm.isNull() ) { + // Only rescale is we need to - it can take CPU! + if ( r.size() != pm.size() ) { + TQWMatrix m; + m.scale((double)r.width()/pm.width(), + (double)r.height()/pm.height()); + pm = pm.xForm(m); + } + + // Draw the [possibly scaled] frame. movieUpdated() below calls + // repaint with only the changed area, so clipping will ensure we + // only do the minimum amount of rendering. + // + p->drawPixmap(r.x(), r.y(), pm); + } + + + // The on-screen display + + const char* message = 0; + + if (movie.paused()) { + message = "PAUSED"; + } else if (movie.finished()) { + message = "THE END"; + } else if (movie.steps() > 0) { + message = "FF >>"; + } + + if (message) { + // Find a good font size... + p->setFont(TQFont("Helvetica", 24)); + + TQFontMetrics fm = p->fontMetrics(); + if ( fm.width(message) > r.width()-10 ) + p->setFont(TQFont("Helvetica", 18)); + + fm = p->fontMetrics(); + if ( fm.width(message) > r.width()-10 ) + p->setFont(TQFont("Helvetica", 14)); + + fm = p->fontMetrics(); + if ( fm.width(message) > r.width()-10 ) + p->setFont(TQFont("Helvetica", 12)); + + fm = p->fontMetrics(); + if ( fm.width(message) > r.width()-10 ) + p->setFont(TQFont("Helvetica", 10)); + + // "Shadow" effect. + p->setPen(black); + p->drawText(1, 1, width()-1, height()-1, AlignCenter, message); + p->setPen(white); + p->drawText(0, 0, width()-1, height()-1, AlignCenter, message); + } + } + +public slots: + void restart() + { + movie.restart(); + repaint(); + } + + void togglePause() + { + if ( movie.paused() ) + movie.unpause(); + else + movie.pause(); + repaint(); + } + + void step() + { + movie.step(); + repaint(); + } + + void step10() + { + movie.step(10); + repaint(); + } + +private slots: + void movieUpdated(const TQRect& area) + { + if (!isVisible()) + show(); + + // The given area of the movie has changed. + + TQRect r = contentsRect(); + + if ( r.size() != movie.framePixmap().size() ) { + // Need to scale - redraw whole frame. + repaint( r ); + } else { + // Only redraw the changed area of the frame + repaint( area.x()+r.x(), area.y()+r.x(), + area.width(), area.height() ); + } + } + + void movieResized(const TQSize& size) + { + // The movie changed size, probably from its initial zero size. + + int fw = frameWidth(); + sh = TQSize( size.width() + fw*2, size.height() + fw*2 ); + updateGeometry(); + if ( parentWidget() && parentWidget()->isHidden() ) + parentWidget()->show(); + } + + void movieStatus(int status) + { + // The movie has sent us a status message. + + if (status < 0) { + TQString msg; + msg.sprintf("Could not play movie \"%s\"", (const char*)filename); + TQMessageBox::warning(this, "movies", msg); + parentWidget()->close(); + } else if (status == TQMovie::Paused || status == TQMovie::EndOfMovie) { + repaint(); // Ensure status text is displayed + } + } +}; + +class MoviePlayer : public TQVBox { + MovieScreen* movie; +public: + MoviePlayer(const char* fname, TQMovie m, TQWidget* p=0, const char* name=0, WFlags f=0) : + TQVBox(p,name,f) + { + movie = new MovieScreen(fname, m, this); + TQHBox* hb = new TQHBox(this); + TQPushButton* btn; + btn = new TQPushButton("<<", hb); + connect(btn, SIGNAL(clicked()), movie, SLOT(restart())); + btn = new TQPushButton("||", hb); + connect(btn, SIGNAL(clicked()), movie, SLOT(togglePause())); + btn = new TQPushButton(">|", hb); + connect(btn, SIGNAL(clicked()), movie, SLOT(step())); + btn = new TQPushButton(">>|", hb); + connect(btn, SIGNAL(clicked()), movie, SLOT(step10())); + } +}; + + +// A TQFileDialog that chooses movies. +// +class MovieStarter: public TQFileDialog { + Q_OBJECT +public: + MovieStarter(const char *dir); + +public slots: + void startMovie(const TQString& filename); + // TQDialog's method - normally closes the file dialog. + // We want it left open, and we want Cancel to tquit everything. + void done( int r ); +}; + + +MovieStarter::MovieStarter(const char *dir) + : TQFileDialog(dir, "*.gif *.mng") +{ + //behave as in getOpenFilename + setMode( ExistingFile ); + // When a file is selected, show it as a movie. + connect(this, SIGNAL(fileSelected(const TQString&)), + this, SLOT(startMovie(const TQString&))); +} + + +void MovieStarter::startMovie(const TQString& filename) +{ + if ( filename ) // Start a new movie - have it delete when closed. + (new MoviePlayer( filename, TQMovie(filename), 0, 0, + WDestructiveClose))->show(); +} + +void MovieStarter::done( int r ) +{ + if (r != Accepted) + qApp->tquit(); // end on Cancel + setResult( r ); + + // And don't hide. +} + + +int main(int argc, char **argv) +{ + TQApplication a(argc, argv); + + if (argc > 1) { + // Commandline mode - show movies given on the command line + // + bool gui=TRUE; + for (int arg=1; arg<argc; arg++) { + if ( TQString(argv[arg]) == "-i" ) + gui = !gui; + else if ( gui ) + (void)new MoviePlayer(argv[arg], TQMovie(argv[arg]), 0, 0, + TQt::WDestructiveClose); + else + (void)new MovieScreen(argv[arg], TQMovie(argv[arg]), 0, 0, + TQt::WDestructiveClose); + } + TQObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit())); + } else { + // "GUI" mode - open a chooser for movies + // + MovieStarter* fd = new MovieStarter("."); + fd->show(); + } + + // Go! + return a.exec(); +} + +#include "main.moc" diff --git a/examples/movies/movies.doc b/examples/movies/movies.doc new file mode 100644 index 000000000..d2b6b9bae --- /dev/null +++ b/examples/movies/movies.doc @@ -0,0 +1,19 @@ +/* +*/ +/*! \page movies-example.html + + \ingroup examples + \title Movies or the Story of the Animated GIF file + + The Movies example displays MNG and animated GIF files using the QMovie and + QLabel classes. + + The movies will only read an animated GIF if GIF reading was enabled when Qt was built. + + <hr> + + Main: + + \include movies/main.cpp +*/ + diff --git a/examples/movies/movies.pro b/examples/movies/movies.pro new file mode 100644 index 000000000..39c017f5e --- /dev/null +++ b/examples/movies/movies.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = movies + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp diff --git a/examples/movies/trolltech.gif b/examples/movies/trolltech.gif Binary files differnew file mode 100644 index 000000000..f674369ef --- /dev/null +++ b/examples/movies/trolltech.gif diff --git a/examples/network/archivesearch/archivedialog.ui b/examples/network/archivesearch/archivedialog.ui new file mode 100644 index 000000000..3d3e67a90 --- /dev/null +++ b/examples/network/archivesearch/archivedialog.ui @@ -0,0 +1,137 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>ArchiveDialog</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>ArchiveDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>673</width> + <height>561</height> + </rect> + </property> + <property name="caption"> + <string>TQt-interest Archive Search Tool</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>myTextLabel</cstring> + </property> + <property name="text"> + <string>Search phrase</string> + </property> + </widget> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>myLineEdit</cstring> + </property> + </widget> + </hbox> + </widget> + <widget class="TQSplitter"> + <property name="name"> + <cstring>splitter1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <widget class="TQListView"> + <column> + <property name="text"> + <string>Matching documents</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>myListView</cstring> + </property> + </widget> + <widget class="TQTextBrowser"> + <property name="name"> + <cstring>myTextBrowser</cstring> + </property> + </widget> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>mySpacer</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>281</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>myPushButton</cstring> + </property> + <property name="text"> + <string>&Quit</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<includes> + <include location="global" impldecl="in declaration">qhttp.h</include> + <include location="global" impldecl="in declaration">qurl.h</include> + <include location="global" impldecl="in declaration">qmessagebox.h</include> + <include location="global" impldecl="in declaration">qapplication.h</include> + <include location="global" impldecl="in declaration">qcursor.h</include> + <include location="global" impldecl="in declaration">qregexp.h</include> + <include location="local" impldecl="in implementation">archivedialog.ui.h</include> +</includes> +<variables> + <variable access="private">TQHttp articleSearcher;</variable> + <variable access="private">TQHttp articleFetcher;</variable> +</variables> +<slots> + <slot specifier="non virtual">fetch( TQListViewItem * it )</slot> + <slot specifier="non virtual">fetchDone( bool error )</slot> + <slot specifier="non virtual">search()</slot> + <slot specifier="non virtual">searchDone( bool error )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/archivesearch/archivedialog.ui.h b/examples/network/archivesearch/archivedialog.ui.h new file mode 100644 index 000000000..e5b70cb10 --- /dev/null +++ b/examples/network/archivesearch/archivedialog.ui.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** TQt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + +void ArchiveDialog::init() +{ + connect(&articleSearcher, SIGNAL(done(bool)), this, SLOT(searchDone(bool))); + connect(&articleFetcher, SIGNAL(done(bool)), this, SLOT(fetchDone(bool))); + connect(myListView, SIGNAL(selectionChanged(TQListViewItem*)), this, SLOT(fetch(TQListViewItem*))); + connect(myLineEdit, SIGNAL(returnPressed()), this, SLOT(search())); + connect(myListView, SIGNAL(returnPressed(TQListViewItem*)), this, SLOT(fetch(TQListViewItem*))); + connect(myPushButton, SIGNAL(clicked()), this, SLOT(close())); +} + +void ArchiveDialog::fetch( TQListViewItem *it ) +{ + TQUrl u(it->text(1)); + articleFetcher.setHost(u.host()); + articleFetcher.get(it->text(1)); +} + +void ArchiveDialog::fetchDone( bool error ) +{ + if (error) { + TQMessageBox::critical(this, "Error fetching", + "An error occurred when fetching this document: " + + articleFetcher.errorString(), + TQMessageBox::Ok, TQMessageBox::NoButton); + } else { + myTextBrowser->setText(articleFetcher.readAll()); + } +} + +void ArchiveDialog::search() +{ + if (articleSearcher.state() == TQHttp::HostLookup + || articleSearcher.state() == TQHttp::Connecting + || articleSearcher.state() == TQHttp::Sending + || articleSearcher.state() == TQHttp::Reading) { + articleSearcher.abort(); + } + + if (myLineEdit->text() == "") { + TQMessageBox::critical(this, "Empty query", + "Please type a search string.", + TQMessageBox::Ok, TQMessageBox::NoButton); + } else { + TQApplication::setOverrideCursor(TQCursor(TQt::WaitCursor)); + + articleSearcher.setHost("lists.trolltech.com"); + + TQHttpRequestHeader header("POST", "/qt-interest/search.php"); + header.setValue("Host", "lists.trolltech.com"); + header.setContentType("application/x-www-form-urlencoded"); + + TQString encodedTopic = myLineEdit->text(); + TQUrl::encode(encodedTopic); + TQString searchString = "qt-interest=on&search=" + encodedTopic; + + articleSearcher.request(header, searchString.utf8()); + } + +} + +void ArchiveDialog::searchDone( bool error ) +{ + if (error) { + TQMessageBox::critical(this, "Error searching", + "An error occurred when searching: " + + articleSearcher.errorString(), + TQMessageBox::Ok, TQMessageBox::NoButton); + } else { + TQString result(articleSearcher.readAll()); + + TQRegExp rx("<a href=\"(http://lists\\.trolltech\\.com/qt-interest/.*)\">(.*)</a>"); + rx.setMinimal(TRUE); + int pos = 0; + while (pos >= 0) { + pos = rx.search(result, pos); + if (pos > -1) { + pos += rx.matchedLength(); + new TQListViewItem(myListView, rx.cap(2), rx.cap(1)); + } + } + } + + TQApplication::restoreOverrideCursor(); +} diff --git a/examples/network/archivesearch/archivesearch.doc b/examples/network/archivesearch/archivesearch.doc new file mode 100644 index 000000000..e4589cceb --- /dev/null +++ b/examples/network/archivesearch/archivesearch.doc @@ -0,0 +1,25 @@ +/* +*/ + +/*! \page archivesearch-example.html + + \ingroup network-examples + + \title A qt-interest mail archive search + + This example does a search on the qt-interest mailinglist archives. It uses + QHttp to issue the search command and to fetch the results. The GUI parts + were done using \link designer-manual.book Qt Designer\endlink. + + <hr> + + The implementation of the HTTP requests (archivedialog.ui.h): + + \include network/archivesearch/archivedialog.ui.h + + <hr> + + Main (main.cpp): + + \include network/archivesearch/main.cpp +*/ diff --git a/examples/network/archivesearch/archivesearch.pro b/examples/network/archivesearch/archivesearch.pro new file mode 100644 index 000000000..1423814c3 --- /dev/null +++ b/examples/network/archivesearch/archivesearch.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = network full-config + +HEADERS += archivedialog.ui.h +INTERFACES += archivedialog.ui +SOURCES += main.cpp diff --git a/examples/network/archivesearch/main.cpp b/examples/network/archivesearch/main.cpp new file mode 100644 index 000000000..c08a00031 --- /dev/null +++ b/examples/network/archivesearch/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "archivedialog.h" +#include <qapplication.h> + +int main(int argc, char **argv) +{ + TQApplication a( argc, argv ); + ArchiveDialog ad; + ad.show(); + + TQObject::connect( &a, SIGNAL(lastWindowClosed()), + &a, SLOT(tquit()) ); + + return a.exec(); +} diff --git a/examples/network/clientserver/client/client.cpp b/examples/network/clientserver/client/client.cpp new file mode 100644 index 000000000..d76b59a9d --- /dev/null +++ b/examples/network/clientserver/client/client.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qsocket.h> +#include <qapplication.h> +#include <qvbox.h> +#include <qhbox.h> +#include <qtextview.h> +#include <qlineedit.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qtextstream.h> + + +class Client : public TQVBox +{ + Q_OBJECT +public: + Client( const TQString &host, Q_UINT16 port ) + { + // GUI layout + infoText = new TQTextView( this ); + TQHBox *hb = new TQHBox( this ); + inputText = new TQLineEdit( hb ); + TQPushButton *send = new TQPushButton( tr("Send") , hb ); + TQPushButton *close = new TQPushButton( tr("Close connection") , this ); + TQPushButton *tquit = new TQPushButton( tr("Quit") , this ); + + connect( send, SIGNAL(clicked()), SLOT(sendToServer()) ); + connect( close, SIGNAL(clicked()), SLOT(closeConnection()) ); + connect( tquit, SIGNAL(clicked()), qApp, SLOT(tquit()) ); + + // create the socket and connect various of its signals + socket = new TQSocket( this ); + connect( socket, SIGNAL(connected()), + SLOT(socketConnected()) ); + connect( socket, SIGNAL(connectionClosed()), + SLOT(socketConnectionClosed()) ); + connect( socket, SIGNAL(readyRead()), + SLOT(socketReadyRead()) ); + connect( socket, SIGNAL(error(int)), + SLOT(socketError(int)) ); + + // connect to the server + infoText->append( tr("Trying to connect to the server\n") ); + socket->connectToHost( host, port ); + } + + ~Client() + { + } + +private slots: + void closeConnection() + { + socket->close(); + if ( socket->state() == TQSocket::Closing ) { + // We have a delayed close. + connect( socket, SIGNAL(delayedCloseFinished()), + SLOT(socketClosed()) ); + } else { + // The socket is closed. + socketClosed(); + } + } + + void sendToServer() + { + // write to the server + TQTextStream os(socket); + os << inputText->text() << "\n"; + inputText->setText( "" ); + } + + void socketReadyRead() + { + // read from the server + while ( socket->canReadLine() ) { + infoText->append( socket->readLine() ); + } + } + + void socketConnected() + { + infoText->append( tr("Connected to server\n") ); + } + + void socketConnectionClosed() + { + infoText->append( tr("Connection closed by the server\n") ); + } + + void socketClosed() + { + infoText->append( tr("Connection closed\n") ); + } + + void socketError( int e ) + { + infoText->append( tr("Error number %1 occurred\n").arg(e) ); + } + +private: + TQSocket *socket; + TQTextView *infoText; + TQLineEdit *inputText; +}; + + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + Client client( argc<2 ? "localhost" : argv[1], 4242 ); + app.setMainWidget( &client ); + client.show(); + return app.exec(); +} + +#include "client.moc" diff --git a/examples/network/clientserver/client/client.pro b/examples/network/clientserver/client/client.pro new file mode 100644 index 000000000..bc3b9e9ad --- /dev/null +++ b/examples/network/clientserver/client/client.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = client + +CONFIG += qt warn_on release + +REQUIRES = network full-config + +HEADERS = +SOURCES = client.cpp diff --git a/examples/network/clientserver/clientserver.doc b/examples/network/clientserver/clientserver.doc new file mode 100644 index 000000000..67b72a5da --- /dev/null +++ b/examples/network/clientserver/clientserver.doc @@ -0,0 +1,35 @@ +/* +*/ + +/*! \page clientserver-example.html + + \ingroup network-examples + + \title A small client-server example + + This example shows how two programs can communicate using sockets. + + Two simple example programs are provided, a client program and a + server program. Both use the QSocket class, and the server also uses + QServerSocket class. + + The server listens on port number 4242 and accepts incoming connections. + It sends back every line it receives from the client, prepended with + the line number. + + The client tries to connect to the server on the host specified on the + command line or to localhost if no command line arguments are + specified. You can send single lines to the server. + + <hr> + + Implementation server (server.cpp): + + \include network/clientserver/server/server.cpp + + <hr> + + Implementation client (client.cpp): + + \include network/clientserver/client/client.cpp +*/ diff --git a/examples/network/clientserver/server/server.cpp b/examples/network/clientserver/server/server.cpp new file mode 100644 index 000000000..f80adda84 --- /dev/null +++ b/examples/network/clientserver/server/server.cpp @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qsocket.h> +#include <qserversocket.h> +#include <qapplication.h> +#include <qvbox.h> +#include <qtextview.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qtextstream.h> + +#include <stdlib.h> + + +/* + The ClientSocket class provides a socket that is connected with a client. + For every client that connects to the server, the server creates a new + instance of this class. +*/ +class ClientSocket : public TQSocket +{ + Q_OBJECT +public: + ClientSocket( int sock, TQObject *parent=0, const char *name=0 ) : + TQSocket( parent, name ) + { + line = 0; + connect( this, SIGNAL(readyRead()), + SLOT(readClient()) ); + connect( this, SIGNAL(connectionClosed()), + SLOT(deleteLater()) ); + setSocket( sock ); + } + + ~ClientSocket() + { + } + +signals: + void logText( const TQString& ); + +private slots: + void readClient() + { + TQTextStream ts( this ); + while ( canReadLine() ) { + TQString str = ts.readLine(); + emit logText( tr("Read: '%1'\n").arg(str) ); + + ts << line << ": " << str << endl; + emit logText( tr("Wrote: '%1: %2'\n").arg(line).arg(str) ); + + line++; + } + } + +private: + int line; +}; + + +/* + The SimpleServer class handles new connections to the server. For every + client that connects, it creates a new ClientSocket -- that instance is now + responsible for the communication with that client. +*/ +class SimpleServer : public TQServerSocket +{ + Q_OBJECT +public: + SimpleServer( TQObject* parent=0 ) : + TQServerSocket( 4242, 1, parent ) + { + if ( !ok() ) { + qWarning("Failed to bind to port 4242"); + exit(1); + } + } + + ~SimpleServer() + { + } + + void newConnection( int socket ) + { + ClientSocket *s = new ClientSocket( socket, this ); + emit newConnect( s ); + } + +signals: + void newConnect( ClientSocket* ); +}; + + +/* + The ServerInfo class provides a small GUI for the server. It also creates the + SimpleServer and as a result the server. +*/ +class ServerInfo : public TQVBox +{ + Q_OBJECT +public: + ServerInfo() + { + SimpleServer *server = new SimpleServer( this ); + + TQString itext = tr( + "This is a small server example.\n" + "Connect with the client now." + ); + TQLabel *lb = new TQLabel( itext, this ); + lb->setAlignment( AlignHCenter ); + infoText = new TQTextView( this ); + TQPushButton *tquit = new TQPushButton( tr("Quit") , this ); + + connect( server, SIGNAL(newConnect(ClientSocket*)), + SLOT(newConnect(ClientSocket*)) ); + connect( tquit, SIGNAL(clicked()), qApp, + SLOT(tquit()) ); + } + + ~ServerInfo() + { + } + +private slots: + void newConnect( ClientSocket *s ) + { + infoText->append( tr("New connection\n") ); + connect( s, SIGNAL(logText(const TQString&)), + infoText, SLOT(append(const TQString&)) ); + connect( s, SIGNAL(connectionClosed()), + SLOT(connectionClosed()) ); + } + + void connectionClosed() + { + infoText->append( tr("Client closed connection\n") ); + } + +private: + TQTextView *infoText; +}; + + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + ServerInfo info; + app.setMainWidget( &info ); + info.show(); + return app.exec(); +} + +#include "server.moc" diff --git a/examples/network/clientserver/server/server.pro b/examples/network/clientserver/server/server.pro new file mode 100644 index 000000000..0a845b5fe --- /dev/null +++ b/examples/network/clientserver/server/server.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = server + +CONFIG += qt warn_on release + +REQUIRES = network full-config + +HEADERS = +SOURCES = server.cpp diff --git a/examples/network/ftpclient/README b/examples/network/ftpclient/README new file mode 100644 index 000000000..8b1bd7e5d --- /dev/null +++ b/examples/network/ftpclient/README @@ -0,0 +1,3 @@ +This example is a small ftp client. It shows how to use the QFtp class. + +This example needs the network extension. diff --git a/examples/network/ftpclient/connectdialog.ui b/examples/network/ftpclient/connectdialog.ui new file mode 100644 index 000000000..ff0a30a63 --- /dev/null +++ b/examples/network/ftpclient/connectdialog.ui @@ -0,0 +1,244 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ConnectDialog</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>ConnectDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>384</width> + <height>165</height> + </rect> + </property> + <property name="caption"> + <string>Choose host to connect to</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQFrame"> + <property name="name"> + <cstring>Frame3</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>&Remote Host:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>host</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel5</cstring> + </property> + <property name="text"> + <string>&Username:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>username</cstring> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel6</cstring> + </property> + <property name="text"> + <string>&Password:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>password</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="2" column="1"> + <property name="name"> + <cstring>password</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="echoMode"> + <enum>Password</enum> + </property> + </widget> + <widget class="TQLineEdit" row="1" column="1"> + <property name="name"> + <cstring>username</cstring> + </property> + <property name="text"> + <string>anonymous</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>Layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>host</cstring> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="text"> + <string>P&ort:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>port</cstring> + </property> + </widget> + <widget class="TQSpinBox"> + <property name="name"> + <cstring>port</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maxValue"> + <number>1000</number> + </property> + <property name="value"> + <number>21</number> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer5</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>31</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>OK</string> + </property> + <property name="accel"> + <number>0</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + <property name="accel"> + <number>0</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>ConnectDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>ConnectDialog</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>host</tabstop> + <tabstop>port</tabstop> + <tabstop>username</tabstop> + <tabstop>password</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> +</tabstops> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/ftpclient/ftpclient.doc b/examples/network/ftpclient/ftpclient.doc new file mode 100644 index 000000000..13be19168 --- /dev/null +++ b/examples/network/ftpclient/ftpclient.doc @@ -0,0 +1,24 @@ +/* +*/ + +/*! \page ftpclient-example.html + + \ingroup network-examples + + \title An FTP client + + This example implements a FTP client. It uses QFtp to perform its FTP + commands. The GUI parts are done in the Designer. + + <hr> + + The implementation of the FTP commands (ftpmainwindow.ui.h): + + \include network/ftpclient/ftpmainwindow.ui.h + + <hr> + + Main (main.cpp): + + \include network/ftpclient/main.cpp +*/ diff --git a/examples/network/ftpclient/ftpclient.pro b/examples/network/ftpclient/ftpclient.pro new file mode 100644 index 000000000..eb71f134f --- /dev/null +++ b/examples/network/ftpclient/ftpclient.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = ftpclient + +CONFIG += qt warn_on release + +REQUIRES = network full-config nocrosscompiler + +HEADERS = ftpviewitem.h +SOURCES = main.cpp \ + ftpviewitem.cpp +FORMS = ftpmainwindow.ui \ + connectdialog.ui +IMAGES = images/file.png \ + images/folder.png diff --git a/examples/network/ftpclient/ftpmainwindow.ui b/examples/network/ftpclient/ftpmainwindow.ui new file mode 100644 index 000000000..338aa139b --- /dev/null +++ b/examples/network/ftpclient/ftpmainwindow.ui @@ -0,0 +1,280 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>FtpMainWindow</class> +<widget class="TQMainWindow"> + <property name="name"> + <cstring>FtpMainWindow</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>480</height> + </rect> + </property> + <property name="caption"> + <string>Ftp client example</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQListView" row="1" column="0" rowspan="1" colspan="2"> + <column> + <property name="text"> + <string>Name</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Size</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Last Modified</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>remoteView</cstring> + </property> + <property name="showSortIndicator"> + <bool>true</bool> + </property> + </widget> + <widget class="TQComboBox" row="0" column="1"> + <property name="name"> + <cstring>remotePath</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + <property name="duplicatesEnabled"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel4</cstring> + </property> + <property name="text"> + <string>&Remote Path:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>remotePath</cstring> + </property> + </widget> + </grid> +</widget> +<menubar> + <property name="name"> + <cstring>menubar</cstring> + </property> + <item text="&File" name="fileMenu"> + <action name="fileConnectAction"/> + <action name="fileDownloadAction"/> + <action name="fileUploadAction"/> + <action name="fileRemoveAction"/> + <separator/> + <action name="fileExitAction"/> + </item> +</menubar> +<toolbars> + <toolbar dock="2"> + <property name="name"> + <cstring>toolBar</cstring> + </property> + <property name="label"> + <string>Tools</string> + </property> + <action name="fileConnectAction"/> + <action name="fileDownloadAction"/> + <action name="fileUploadAction"/> + <action name="fileRemoveAction"/> + </toolbar> +</toolbars> +<actions> + <action> + <property name="name"> + <cstring>fileDownloadAction</cstring> + </property> + <property name="iconSet"> + <iconset>image0</iconset> + </property> + <property name="text"> + <string>Download...</string> + </property> + <property name="accel"> + <number>0</number> + </property> + </action> + <action> + <property name="name"> + <cstring>fileExitAction</cstring> + </property> + <property name="text"> + <string>Exit</string> + </property> + <property name="menuText"> + <string>E&xit</string> + </property> + <property name="accel"> + <number>0</number> + </property> + </action> + <action> + <property name="name"> + <cstring>fileRemoveAction</cstring> + </property> + <property name="iconSet"> + <iconset>image1</iconset> + </property> + <property name="text"> + <string>Remove</string> + </property> + </action> + <action> + <property name="name"> + <cstring>fileUploadAction</cstring> + </property> + <property name="iconSet"> + <iconset>image2</iconset> + </property> + <property name="text"> + <string>Upload...</string> + </property> + </action> + <action> + <property name="name"> + <cstring>fileConnectAction</cstring> + </property> + <property name="iconSet"> + <iconset>image3</iconset> + </property> + <property name="text"> + <string>Connect...</string> + </property> + </action> +</actions> +<images> + <image name="image0"> + <data format="XPM.GZ" length="2477">789c95944953e3301046eff9152e74a3a61ac79bec9a9a03fbbeef4ccdc1926d92400224619d9aff3eeaafc719b640f02387477f96a5b6e49969ef6467d39b9e690c86f9b06d3ddbcafbde7471dbed3efefcf5e377632a083cf797265e30f5ad31b53bf4acb775d52b594839513e2ef86ced710a9faf3d95fa8e7814c621fc066e7c2379056ffa0cea47f066e06b83fa101e30a8afc1331d86325e0c370c7c573cd4b1c5fd863df019d41378c4c0f7e186819f8f1cf7530eaf18789f3df4433f8d313eea61938177e1b8e0182fd40ceedf80e74191c8789138833c8d5ce6b3557b22be5d7b26ebd770cbc0176a97feab01bc60e0d7f08a417ee491f4678e9ddb13a33fcac271a17e0ad78e0ceec35306f9367b1c30a81f8c5ce6b72e9e04f27cd582270cea4db8d6718c7e29ecb73865e05770c3209fc12d030fd993c821e3219f6807fa4b67f08c81a33f3ad56926ebc77c74c9c05378c5c003f634303a95f59dc04387f4a782733be47d3f8d5ccec761edb9e457e0b943d6730caff2dcc8fc57d9315d99ff235c3b24ff00b70e995f092fb332c77ea465f6dc77c8f37af0cc21fd5a849bdc5899ef12dc3a64bc7b78e1102fe0a5431cfbc3440cbc3b729c0fba835b07f61fe13c9a8a81ef8997612a7ec96e7d067e010f18bc7fa9470cead86f78fd721ed17f5b31a8dfb2171103c7f7a4c81c72de3af08a411d5e860c7c13aead95f5a99e380347bf4b6e38f693c27cf1b990f9e27b5165bef6258ffe55b8e4e33a39e3f3a46a26c9534e862c15545245e713e45bd4a60e5dd02575a94757742dcf199bbfa13e0d6848b77447f7f4408ff4c4778ccdcfd21ccdd3022dd2122dd38afbad7e925fa375daa0cd09f35bb44d3bb44b7b13e6f7e9800ee9888e913f71e9d30fd7abe88c7c6a52e03a1a5244f1cb7ebe7d3b9490a69432f72fa572655ee6955585a354953a7ffe14d552ede76ff855bea32ed4a5ea7ebe7ffee57bea4a5dab9bd729d51f937733a28e1a7c21cfd8d7a949f2aa5fa7fea7c7e7395df3c17adf1dffdd3cdf51f366d66ff393f2e5fc9fef8dbfa8437f7d</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="721">789ca590c10ac2300c86ef7b8ab2de866c3a0f1ec447503c0ae2214d237a5041e741c477b749376d3bf5e29f16fae7234d4855a8d572ae8a2abb34d0ec51e10eceaab0d7c3e1b6deccee595ed7ca9d891ae5832c2f15aac5e948fcd6eead8722b6c4d68c39d85ab196832db2b5c4c116d81275b586ed56245d3eea3fa25bc504004a6d44a8e31a87003d318c20f8ad43961140d4c733eb5a31080909b28802428224cc5d9d10d79d1100f5894101a64f240fd023922757863169f3c6503cc12befc748f6e6b72363f467f3a274076f2524d47752fe268f69f604fb43a540</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="2461">789cd594496fdb301046effe1542780b8a89ac8d128a1eb22fcdbe27450f1425c58e633b5eb216fdefe57c1319718bd6ceb17af1e1851fa5e190d2d2a27779b8e72d2e354663336e5bcfb6ccd05b2c1ebadd976fdfbffc682c0481e7fed2d80b163e35168ec69ef5f6fbbd92859413e5e3822fd71ea7f0d5da53193f148fc238645703f6a6cf60fc1cde0c7c9d637c040f188cefc0331d86984f313c67e047e2a18e2de6e7ec81cf603c81470cfc049e33f0d6c4319f647ec5c087eca11ffa698cfb1b78938177e1b8e03770cd60fe2edc044522f78bc419e469e252cf7eed89f841ed99ac5fc32d035fab5dfaada4de8281dfc32b06f941ed91f467859ddb13a33fcac27161fc0aae1d19dc87a70cf26df63860307e3a71a9efab7812c8f315fa1d270cc69b70ade318fd52385f71cac0fbf09c413e835b061eb2279143ee87f526da81fed2353c63e0385f3ad56926eb47fdba64e029bc62e0017b1ae43a95f55dc24387f407fb8d76c87ebf4e5cde87b3da8de4b7e0c621ebb98057c6e452ff363bca95fa5fe0da21f967b875487d15bccc4a83f3489becc677c8f3d03f9339a45febf0dce456eadd805b87dcef095e38c44b78e9102fd8f38881f7268ef7831ee1d681f347384f79c5c08fc5cb3015c7fb637d067e070f18ecbf78c460fc168e038071acdf560cc61fd88b88818fe19943de37cc2f2a06e31df63264e07b706dadac4ff5c41938fa5172c3719e14e6e37321e703df872af3b52f79f4abc2251fd3f9f97b9e54cdac3c19f7cbc9524125557443ad5979479b6ea94377d4a51ef5e99e06f29ce93c9235431ad1981ee8919ee8995ee89567bccf731d9359cbb442abb446ebb4419bb4e57edbd3f93afd56ff32edd057daa5bdd979d83e1dd0211dd1f19cf9133aa5333aa70be42f5dfaea5ffd777dbf269f9a14b88e8614513cddcf3f778712d29452e6fea59451f9745e5955384a55a99bf74f512dd57ebfc3bfe56f5547dda9eeecf3f396efa9beba5783b9f3ae22eaa8e107f28cfd0ff32337a366343b3f2f1fcefffcdcf80560e77be9</data> + </image> + <image name="image3"> + <data format="XPM.GZ" length="2878">789c8d95476fe4381085effe150dd7cd58d44854c6600fce394ff0cc620f2425b5533bb4dba1bdd8ff3eac57526381757bac671bf8c0c7122b88feb434383bda1f2c7d5a7898d8c9851ff8733b1e2cd58fa3d1f4afbffffc6761d19841f889e3786016ff58583c9e0cfce0e0f6a611600a40111e611af56c4aacaff45ceafab372e2335ddf574e932c01df835de4749d74bf8b6d5181c7c2e12c69a1fe536513150eeb4fe032c9330f46bcb88aab22833f063b11f84039293aff2ab83565a9f14b611389b07e39630b7e04db2c4d359f23b013818733d6f8ebe0dad4899ec7825b11d65f84932828c6fab8e752fd053816c18ffc1323c27a35639c9f182c4f0a46be499a651def823311f8109c8b106f076c4d9de37c1c298bc0d98c35dfbd9e2b7dff96729176f537602f02aff6acf3c177e0366953ad37e6233522b00327411aef1b38844f311ffc1d5c8ae05f06573649753ed09fd48ac027c2592c02a31f991121def18cf5bcdbcab949b45f0f1d575a0f42fe28a7e6bf0196a700e37bc97211e29d818ba25be71c5c8ac029d88bb01ff5c99acc74f5d5f3b4595beafe9fc2791aa4f16fc145909e0ffdccad088cfcf25604f63d179a3ff22bcaa2acb41f9be02a48eb710e6e44e004dc8ac03f844be38a52e37d052741983f6ec1d22e3dffeb8cb57f6b3d57fabe939eadeec7794a1ba4f3f705dc5aeb903f217e150569bd6ec02648f7633eab3c48e7790a9604755eaec06590f274c67a1e7caf950fd2fa0d7bb63acf0db8a91aabdf33e6c14641fa7e9cc75641dadf1a2c4f8d75e46f9d755eeb83fbc3fa20ad2fee535b0729ebfe264819fd74a9083c9ab17eef389fcb83743ed14f272fd47ae23e753e48cf83efcfb522f0a1729394cad7c23e1281513f6f44e00b30061aef9b8043f619e687743f0a08567f2d02633e7cebdb5aef03cc771d05697cdcc7752a02237e5d05697f717f3789088cfbaf29bcefea83fba20d4f55ea3fbb8f6bbe9fa9d747fc6cd9b1e79a1b6e79f801ff395ff0255ff1358ff8866ff94edf33d77fcf637ee0093ff2133ff30b4ff95576ccf52f07adf02aaff13a6ff066f8dd9aef879b789b7778f7f7fecebdc7fb7cc087bff377ee233ee6133ee52ff07f0dee6f6fe70bbfea3b9ff18f50d19f1c713caf9e5d97c46f38e19433ceb9e0f22d3f57c4c165f44cb2373cf6bf1deefd61c591a79a9ad0a1ce3d7f7e78482d0de99c1d5da89b2ee7fbb90a1578a12b5ea76b44275ea1d1fb7ebaa29bf0f796eee89ec6f4f061ff841ee9899edff3d30b4d3bff2b2dd30aadd21aadbf976fa8cd066d22fe166dd30eedbeed9ed587688ff6c9f1331d840e257d77e6f9b1e3908ed8d0319dccabfdfffb4ba7f39d9dffdfcf0bbf00b514c1b3</data> + </image> +</images> +<connections> + <connection> + <sender>fileExitAction</sender> + <signal>activated()</signal> + <receiver>FtpMainWindow</receiver> + <slot>close()</slot> + </connection> + <connection> + <sender>fileDownloadAction</sender> + <signal>activated()</signal> + <receiver>FtpMainWindow</receiver> + <slot>downloadFile()</slot> + </connection> + <connection> + <sender>fileRemoveAction</sender> + <signal>activated()</signal> + <receiver>FtpMainWindow</receiver> + <slot>removeFile()</slot> + </connection> + <connection> + <sender>fileUploadAction</sender> + <signal>activated()</signal> + <receiver>FtpMainWindow</receiver> + <slot>uploadFile()</slot> + </connection> + <connection> + <sender>fileConnectAction</sender> + <signal>activated()</signal> + <receiver>FtpMainWindow</receiver> + <slot>connectToHost()</slot> + </connection> + <connection> + <sender>remotePath</sender> + <signal>activated(const TQString&)</signal> + <receiver>FtpMainWindow</receiver> + <slot>changePath(const TQString&)</slot> + </connection> + <connection> + <sender>remoteView</sender> + <signal>doubleClicked(TQListViewItem*)</signal> + <receiver>FtpMainWindow</receiver> + <slot>changePathOrDownload(TQListViewItem*)</slot> + </connection> + <connection> + <sender>remoteView</sender> + <signal>returnPressed(TQListViewItem*)</signal> + <receiver>FtpMainWindow</receiver> + <slot>changePathOrDownload(TQListViewItem*)</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">ftpmainwindow.ui.h</include> +</includes> +<forwards> + <forward>class TQFtp;</forward> + <forward>class TQUrlInfo;</forward> +</forwards> +<variables> + <variable access="private">TQFtp *ftp</variable> + <variable access="private">TQLabel *stateFtp</variable> + <variable access="private">TQString currentFtpDir</variable> +</variables> +<slots> + <slot access="public">connectToHost()</slot> + <slot access="private">uploadFile()</slot> + <slot access="private">downloadFile()</slot> + <slot access="private">removeFile()</slot> + <slot access="private">changePath( const TQString & newPath )</slot> + <slot access="private">ftp_commandStarted()</slot> + <slot access="private">ftp_commandFinished()</slot> + <slot access="private">ftp_done( bool error )</slot> + <slot access="private">ftp_stateChanged( int state )</slot> + <slot access="private">ftp_listInfo( const TQUrlInfo & i )</slot> + <slot access="private">ftp_rawCommandReply( int code, const TQString & text )</slot> + <slot access="private">changePathOrDownload( TQListViewItem * )</slot> +</slots> +<functions> + <function access="private">init()</function> + <function access="private">destroy()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/ftpclient/ftpmainwindow.ui.h b/examples/network/ftpclient/ftpmainwindow.ui.h new file mode 100644 index 000000000..1c272ffbe --- /dev/null +++ b/examples/network/ftpclient/ftpmainwindow.ui.h @@ -0,0 +1,273 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** ui.h extension file, included from the uic-generated form implementation. +** +** The init() function is used in place of a constructor. +** The destroy() function is used in place of a destructor. +** The slots uploadFile(), downloadFile(), removeFile() and connectToHost() are +** connected with the resp. actions of the GUI. +** +*****************************************************************************/ + +#include <qftp.h> +#include <qlineedit.h> +#include <qspinbox.h> +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qfiledialog.h> +#include <qprogressdialog.h> +#include <qapplication.h> + +#include "connectdialog.h" +#include "ftpviewitem.h" + +void FtpMainWindow::init() +{ + stateFtp = new TQLabel( tr("Unconnected"), statusBar() ); + statusBar()->addWidget( stateFtp, 0, TRUE ); + + ftp = new TQFtp( this ); + connect( ftp, SIGNAL(commandStarted(int)), + SLOT(ftp_commandStarted()) ); + connect( ftp, SIGNAL(commandFinished(int,bool)), + SLOT(ftp_commandFinished()) ); + connect( ftp, SIGNAL(done(bool)), + SLOT(ftp_done(bool)) ); + connect( ftp, SIGNAL(stateChanged(int)), + SLOT(ftp_stateChanged(int)) ); + connect( ftp, SIGNAL(listInfo(const TQUrlInfo &)), + SLOT(ftp_listInfo(const TQUrlInfo &)) ); + connect( ftp, SIGNAL(rawCommandReply(int, const TQString &)), + SLOT(ftp_rawCommandReply(int, const TQString &)) ); +} + +void FtpMainWindow::destroy() +{ + if ( ftp->state() != TQFtp::Unconnected ) + ftp->close(); +} + +void FtpMainWindow::uploadFile() +{ + TQString fileName = TQFileDialog::getOpenFileName( + TQString::null, + TQString::null, + this, + "upload file dialog", + tr("Choose a file to upload") ); + if ( fileName.isNull() ) + return; + + TQFile *file = new TQFile( fileName ); + if ( !file->open( IO_ReadOnly ) ) { + TQMessageBox::critical( this, tr("Upload error"), + tr("Can't open file '%1' for reading.").arg(fileName) ); + delete file; + return; + } + + TQProgressDialog progress( + tr("Uploading file..."), + tr("Cancel"), + 0, + this, + "upload progress dialog", + TRUE ); + connect( ftp, SIGNAL(dataTransferProgress(int,int)), + &progress, SLOT(setProgress(int,int)) ); + connect( ftp, SIGNAL(commandFinished(int,bool)), + &progress, SLOT(reset()) ); + connect( &progress, SIGNAL(cancelled()), + ftp, SLOT(abort()) ); + + TQFileInfo fi( fileName ); + ftp->put( file, fi.fileName() ); + progress.exec(); // ### takes a lot of time!!! + + ftp->list(); +} + +void FtpMainWindow::downloadFile() +{ + FtpViewItem *item = (FtpViewItem*)remoteView->selectedItem(); + if ( !item || item->isDir() ) + return; + + TQString fileName = TQFileDialog::getSaveFileName( + item->text(0), + TQString::null, + this, + "download file dialog", + tr("Save downloaded file as") ); + if ( fileName.isNull() ) + return; + + // create file on the heap because it has to be valid throughout the whole + // asynchronous download operation + TQFile *file = new TQFile( fileName ); + if ( !file->open( IO_WriteOnly ) ) { + TQMessageBox::critical( this, tr("Download error"), + tr("Can't open file '%1' for writing.").arg(fileName) ); + delete file; + return; + } + + TQProgressDialog progress( + tr("Downloading file..."), + tr("Cancel"), + 0, + this, + "download progress dialog", + TRUE ); + connect( ftp, SIGNAL(dataTransferProgress(int,int)), + &progress, SLOT(setProgress(int,int)) ); + connect( ftp, SIGNAL(commandFinished(int,bool)), + &progress, SLOT(reset()) ); + connect( &progress, SIGNAL(cancelled()), + ftp, SLOT(abort()) ); + + ftp->get( item->text(0), file ); + progress.exec(); // ### takes a lot of time!!! +} + +void FtpMainWindow::removeFile() +{ + FtpViewItem *item = (FtpViewItem*)remoteView->selectedItem(); + if ( !item || item->isDir() ) + return; + + ftp->remove( item->text(0) ); + ftp->list(); +} + +void FtpMainWindow::connectToHost() +{ + ConnectDialog connectDialog; + if ( connectDialog.exec() == TQDialog::Rejected ) + return; + + remotePath->clear(); + remoteView->clear(); + + if ( ftp->state() != TQFtp::Unconnected ) + ftp->close(); + + ftp->connectToHost( connectDialog.host->text(), connectDialog.port->value() ); + ftp->login( connectDialog.username->text(), connectDialog.password->text() ); + ftp->rawCommand( "PWD" ); + ftp->list(); +} + +// This slot is connected to the TQComboBox::activated() signal of the +// remotePath. +void FtpMainWindow::changePath( const TQString &newPath ) +{ + ftp->cd( newPath ); + ftp->rawCommand( "PWD" ); + ftp->list(); +} + +// This slot is connected to the TQListView::doubleClicked() and +// TQListView::returnPressed() signals of the remoteView. +void FtpMainWindow::changePathOrDownload( TQListViewItem *item ) +{ + if ( ((FtpViewItem*)item)->isDir() ) + changePath( item->text(0) ); + else + downloadFile(); +} + +/**************************************************************************** +** +** Slots connected to signals of the TQFtp class +** +*****************************************************************************/ + +void FtpMainWindow::ftp_commandStarted() +{ + TQApplication::setOverrideCursor( TQCursor(TQt::WaitCursor) ); + if ( ftp->currentCommand() == TQFtp::List ) { + remoteView->clear(); + if ( currentFtpDir != "/" ) + new FtpViewItem( remoteView, FtpViewItem::Directory, "..", "", "" ); + } +} + +void FtpMainWindow::ftp_commandFinished() +{ + TQApplication::restoreOverrideCursor(); + delete ftp->currentDevice(); +} + +void FtpMainWindow::ftp_done( bool error ) +{ + if ( error ) { + TQMessageBox::critical( this, tr("FTP Error"), ftp->errorString() ); + + // If we are connected, but not logged in, it is not meaningful to stay + // connected to the server since the error is a really fatal one (login + // failed). + if ( ftp->state() == TQFtp::Connected ) + ftp->close(); + } +} + +void FtpMainWindow::ftp_stateChanged( int state ) +{ + switch ( (TQFtp::State)state ) { + case TQFtp::Unconnected: + stateFtp->setText( tr("Unconnected") ); + break; + case TQFtp::HostLookup: + stateFtp->setText( tr("Host lookup") ); + break; + case TQFtp::Connecting: + stateFtp->setText( tr("Connecting") ); + break; + case TQFtp::Connected: + stateFtp->setText( tr("Connected") ); + break; + case TQFtp::LoggedIn: + stateFtp->setText( tr("Logged in") ); + break; + case TQFtp::Closing: + stateFtp->setText( tr("Closing") ); + break; + } +} + +void FtpMainWindow::ftp_listInfo( const TQUrlInfo &i ) +{ + FtpViewItem::Type type; + if ( i.isDir() ) + type = FtpViewItem::Directory; + else + type = FtpViewItem::File; + + new FtpViewItem( remoteView, type, + i.name(), TQString::number(i.size()), i.lastModified().toString() ); +} + +void FtpMainWindow::ftp_rawCommandReply( int code, const TQString &text ) +{ + if ( code == 257 ) { + currentFtpDir = text.section( '"', 1, 1 ); + + for ( int i = 0; i<remotePath->count(); i++ ) { + // make sure that we don't insert duplicates + if ( remotePath->text( i ) == currentFtpDir ) + remotePath->removeItem( i ); + } + remotePath->insertItem( currentFtpDir, 0 ); + remotePath->setCurrentItem( 0 ); + } +} diff --git a/examples/network/ftpclient/ftpviewitem.cpp b/examples/network/ftpclient/ftpviewitem.cpp new file mode 100644 index 000000000..0763c1b0d --- /dev/null +++ b/examples/network/ftpclient/ftpviewitem.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qpixmap.h> + +#include "ftpviewitem.h" + + +FtpViewItem::FtpViewItem( TQListView *parent, Type t, const TQString &name, const TQString &size, const TQString &lastModified ) + : TQListViewItem(parent,name,size,lastModified), type(t) +{ + // the pixmaps for folders and files are in an image collection + if ( type == Directory ) + setPixmap( 0, TQPixmap::fromMimeSource( "folder.png" ) ); + else + setPixmap( 0, TQPixmap::fromMimeSource( "file.png" ) ); +} + +int FtpViewItem::compare( TQListViewItem * i, int col, bool ascending ) const +{ + // The entry ".." is always the first one. + if ( text(0) == ".." ) { + if ( ascending ) + return -1; + else + return 1; + } + if ( i->text(0) == ".." ) { + if ( ascending ) + return 1; + else + return -1; + } + + // Directories are before files. + if ( type != ((FtpViewItem*)i)->type ) { + if ( type == Directory ) { + if ( ascending ) + return -1; + else + return 1; + } else { + if ( ascending ) + return 1; + else + return -1; + } + } + + // Use default sorting otherwise. + return TQListViewItem::compare( i, col, ascending ); +} diff --git a/examples/network/ftpclient/ftpviewitem.h b/examples/network/ftpclient/ftpviewitem.h new file mode 100644 index 000000000..3387f030a --- /dev/null +++ b/examples/network/ftpclient/ftpviewitem.h @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef FTPVIEWITEM_H +#define FTPVIEWITEM_H + +#include <qlistview.h> +#include <qdatetime.h> + +class FtpViewItem : public TQListViewItem +{ +public: + enum Type { + Directory, + File + }; + + FtpViewItem( TQListView *parent, Type t, const TQString &name, const TQString &size, const TQString &lastModified ); + + int compare( TQListViewItem * i, int col, bool ascending ) const; + + bool isDir() + { return type==Directory; } + +private: + Type type; +}; + +#endif diff --git a/examples/network/ftpclient/images/file.png b/examples/network/ftpclient/images/file.png Binary files differnew file mode 100644 index 000000000..f042c917b --- /dev/null +++ b/examples/network/ftpclient/images/file.png diff --git a/examples/network/ftpclient/images/folder.png b/examples/network/ftpclient/images/folder.png Binary files differnew file mode 100644 index 000000000..5fd0a4335 --- /dev/null +++ b/examples/network/ftpclient/images/folder.png diff --git a/examples/network/ftpclient/main.cpp b/examples/network/ftpclient/main.cpp new file mode 100644 index 000000000..df636dcb9 --- /dev/null +++ b/examples/network/ftpclient/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "ftpmainwindow.h" + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + FtpMainWindow m; + a.setMainWidget( &m ); + m.show(); + a.processEvents(); + m.connectToHost(); + return a.exec(); +} diff --git a/examples/network/httpd/README b/examples/network/httpd/README new file mode 100644 index 000000000..dc7229d4a --- /dev/null +++ b/examples/network/httpd/README @@ -0,0 +1,7 @@ +This is an example for the QServerSocket class which is included in the +network module. + +It is a simple http daemon. After starting it you can connect to port +8080 with a web browser and an html page is shown. The program does +not really parse the http request; so it is not of much use except for +being a small example for QServerSocket. diff --git a/examples/network/httpd/httpd.cpp b/examples/network/httpd/httpd.cpp new file mode 100644 index 000000000..fd42891bb --- /dev/null +++ b/examples/network/httpd/httpd.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +#include <stdlib.h> +#include <qsocket.h> +#include <qregexp.h> +#include <qserversocket.h> +#include <qapplication.h> +#include <qmainwindow.h> +#include <qtextstream.h> +#include <qvbox.h> +#include <qlabel.h> +#include <qtextview.h> +#include <qpushbutton.h> + +// HttpDaemon is the the class that implements the simple HTTP server. +class HttpDaemon : public TQServerSocket +{ + Q_OBJECT +public: + HttpDaemon( TQObject* parent=0 ) : + TQServerSocket(8080,1,parent) + { + if ( !ok() ) { + qWarning("Failed to bind to port 8080"); + exit( 1 ); + } + } + + void newConnection( int socket ) + { + // When a new client connects, the server constructs a TQSocket and all + // communication with the client is done over this TQSocket. TQSocket + // works asynchronouslyl, this means that all the communication is done + // in the two slots readClient() and discardClient(). + TQSocket* s = new TQSocket( this ); + connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) ); + connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) ); + s->setSocket( socket ); + emit newConnect(); + } + +signals: + void newConnect(); + void endConnect(); + void wroteToClient(); + +private slots: + void readClient() + { + // This slot is called when the client sent data to the server. The + // server looks if it was a get request and sends a very simple HTML + // document back. + TQSocket* socket = (TQSocket*)sender(); + if ( socket->canReadLine() ) { + TQStringList tokens = TQStringList::split( TQRegExp("[ \r\n][ \r\n]*"), socket->readLine() ); + if ( tokens[0] == "GET" ) { + TQTextStream os( socket ); + os.setEncoding( TQTextStream::UnicodeUTF8 ); + os << "HTTP/1.0 200 Ok\r\n" + "Content-Type: text/html; charset=\"utf-8\"\r\n" + "\r\n" + "<h1>Nothing to see here</h1>\n"; + socket->close(); + emit wroteToClient(); + } + } + } + void discardClient() + { + TQSocket* socket = (TQSocket*)sender(); + delete socket; + emit endConnect(); + } +}; + + +// HttpInfo provides a simple graphical user interface to the server and shows +// the actions of the server. +class HttpInfo : public TQVBox +{ + Q_OBJECT +public: + HttpInfo() + { + HttpDaemon *httpd = new HttpDaemon( this ); + + TQString itext = TQString( + "This is a small httpd example.\n" + "You can connect with your\n" + "web browser to port %1" + ).arg( httpd->port() ); + TQLabel *lb = new TQLabel( itext, this ); + lb->setAlignment( AlignHCenter ); + infoText = new TQTextView( this ); + TQPushButton *tquit = new TQPushButton( "tquit" , this ); + + connect( httpd, SIGNAL(newConnect()), SLOT(newConnect()) ); + connect( httpd, SIGNAL(endConnect()), SLOT(endConnect()) ); + connect( httpd, SIGNAL(wroteToClient()), SLOT(wroteToClient()) ); + connect( tquit, SIGNAL(pressed()), qApp, SLOT(tquit()) ); + } + + ~HttpInfo() + { + } + +private slots: + void newConnect() + { + infoText->append( "New connection" ); + } + void endConnect() + { + infoText->append( "Connection closed\n\n" ); + } + void wroteToClient() + { + infoText->append( "Wrote to client" ); + } + +private: + TQTextView *infoText; +}; + + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + HttpInfo info; + app.setMainWidget( &info ); + info.show(); + return app.exec(); +} + +#include "httpd.moc" diff --git a/examples/network/httpd/httpd.doc b/examples/network/httpd/httpd.doc new file mode 100644 index 000000000..de1e0be9f --- /dev/null +++ b/examples/network/httpd/httpd.doc @@ -0,0 +1,20 @@ +/* +*/ + +/*! \page httpd-example.html + + \ingroup network-examples + + \title A simple HTTP daemon + + This example shows how to use the QServerSocket class. It is a very + simple implementation of a HTTP daemon that listens on port 8080 and + sends back a simple HTML page back for every GET request it gets. After + sending the page, it closes the connection. + + <hr> + + Implementation (httpd.cpp): + + \include network/httpd/httpd.cpp +*/ diff --git a/examples/network/httpd/httpd.pro b/examples/network/httpd/httpd.pro new file mode 100644 index 000000000..a364499ff --- /dev/null +++ b/examples/network/httpd/httpd.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = httpd + +CONFIG += qt warn_on release + +REQUIRES = network large-config + +HEADERS = +SOURCES = httpd.cpp diff --git a/examples/network/infoprotocol/infoclient/client.cpp b/examples/network/infoprotocol/infoclient/client.cpp new file mode 100644 index 000000000..24861ab55 --- /dev/null +++ b/examples/network/infoprotocol/infoclient/client.cpp @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qsocket.h> +#include <qapplication.h> +#include <qtextedit.h> +#include <qlineedit.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qtextstream.h> +#include <qlistbox.h> + +#include "client.h" + + +ClientInfo::ClientInfo( TQWidget *parent, const char *name ) : + ClientInfoBase( parent, name ), socket( 0 ) +{ + edHost->setText( "localhost" ); + edPort->setText( TQString::number( (uint)infoPort ) ); + + connect( infoList, SIGNAL(selected(const TQString&)), SLOT(selectItem(const TQString&)) ); + connect( btnConnect, SIGNAL(clicked()), SLOT(connectToServer()) ); + connect( btnBack, SIGNAL(clicked()), SLOT(stepBack()) ); + connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) ); +} + + +void ClientInfo::connectToServer() +{ + delete socket; + socket = new TQSocket( this ); + connect( socket, SIGNAL(connected()), SLOT(socketConnected()) ); + connect( socket, SIGNAL(connectionClosed()), SLOT(socketConnectionClosed()) ); + connect( socket, SIGNAL(readyRead()), SLOT(socketReadyRead()) ); + connect( socket, SIGNAL(error(int)), SLOT(socketError(int)) ); + + socket->connectToHost( edHost->text(), edPort->text().toInt() ); +} + +void ClientInfo::selectItem( const TQString& item ) +{ + // item in listBox selected, use LIST or GET depending of the node type. + if ( item.endsWith( "/" ) ) { + sendToServer( List, infoPath->text() + item ); + infoPath->setText( infoPath->text() + item ); + } else + sendToServer( Get, infoPath->text() + item ); +} + +void ClientInfo::stepBack() +{ + // go back (up) in path hierarchy + int i = infoPath->text().findRev( '/', -2 ); + if ( i > 0 ) + infoPath->setText( infoPath->text().left( i + 1 ) ); + else + infoPath->setText( "/" ); + infoList->clear(); + sendToServer( List, infoPath->text() ); +} + + +void ClientInfo::socketConnected() +{ + sendToServer( List, "/" ); +} + +void ClientInfo::sendToServer( Operation op, const TQString& location ) +{ + TQString line; + switch (op) { + case List: + infoList->clear(); + line = "LIST " + location; + break; + case Get: + line = "GET " + location; + break; + } + infoText->clear(); + TQTextStream os(socket); + os << line << "\r\n"; +} + +void ClientInfo::socketReadyRead() +{ + TQTextStream stream( socket ); + TQString line; + while ( socket->canReadLine() ) { + line = stream.readLine(); + if ( line.startsWith( "500" ) || line.startsWith( "550" ) ) { + infoText->append( tr( "error: " ) + line.mid( 4 ) ); + } else if ( line.startsWith( "212+" ) ) { + infoList->insertItem( line.mid( 6 ) + TQString( ( line[ 4 ] == 'D' ) ? "/" : "" ) ); + } else if ( line.startsWith( "213+" ) ) { + infoText->append( line.mid( 4 ) ); + } + } +} + + +void ClientInfo::socketConnectionClosed() +{ + infoText->clear(); + infoText->append( tr( "error: Connection closed by the server\n" ) ); +} + +void ClientInfo::socketError( int code ) +{ + infoText->clear(); + infoText->append( tr( "error: Error number %1 occurred\n" ).arg( code ) ); +} + diff --git a/examples/network/infoprotocol/infoclient/client.h b/examples/network/infoprotocol/infoclient/client.h new file mode 100644 index 000000000..50a31bdad --- /dev/null +++ b/examples/network/infoprotocol/infoclient/client.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef CLIENT_H +#define CLIENT_H + +#include "clientbase.h" + +class TQSocket; +class TQTextEdit; +class TQLineEdit; +class TQListBox; +class TQLabel; + +static const Q_UINT16 infoPort = 42417; + +class ClientInfo : public ClientInfoBase +{ + Q_OBJECT +public: + ClientInfo( TQWidget *parent = 0, const char *name = 0 ); + +private: + enum Operation { List, Get }; + +private slots: + void connectToServer(); + void selectItem( const TQString& item ); + void stepBack(); + void sendToServer( Operation op, const TQString& location ); + void socketConnected(); + void socketReadyRead(); + void socketConnectionClosed(); + void socketError( int code ); + +private: + TQSocket *socket; +}; + +#endif // CLIENT_H + diff --git a/examples/network/infoprotocol/infoclient/clientbase.ui b/examples/network/infoprotocol/infoclient/clientbase.ui new file mode 100644 index 000000000..6d5ea21d6 --- /dev/null +++ b/examples/network/infoprotocol/infoclient/clientbase.ui @@ -0,0 +1,276 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ClientInfoBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>ClientInfoBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>384</width> + <height>488</height> + </rect> + </property> + <property name="caption"> + <string>Info Client</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout15</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnConnect</cstring> + </property> + <property name="text"> + <string>&Connect</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>Host:</string> + </property> + </widget> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>edHost</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel2_2</cstring> + </property> + <property name="text"> + <string>Port:</string> + </property> + </widget> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>edPort</cstring> + </property> + </widget> + </hbox> + </widget> + <widget class="TQSplitter"> + <property name="name"> + <cstring>Splitter4</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout16</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout14</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnBack</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Back</string> + </property> + <property name="toolTip" stdset="0"> + <string>go one step back</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>infoPath</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>/</string> + </property> + <property name="toolTip" stdset="0"> + <string>current path</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQListBox"> + <property name="name"> + <cstring>infoList</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>double click to open</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Data:</string> + </property> + </widget> + <widget class="TQTextEdit"> + <property name="name"> + <cstring>infoText</cstring> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout12</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer10</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnQuit</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Quit</string> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer9</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> +</widget> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/infoprotocol/infoclient/infoclient.pro b/examples/network/infoprotocol/infoclient/infoclient.pro new file mode 100644 index 000000000..46759dd23 --- /dev/null +++ b/examples/network/infoprotocol/infoclient/infoclient.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = infoclient + +CONFIG += qt warn_on release + +REQUIRES = network full-config nocrosscompiler + +HEADERS = client.h +SOURCES = main.cpp \ + client.cpp +INTERFACES = clientbase.ui diff --git a/examples/network/infoprotocol/infoclient/main.cpp b/examples/network/infoprotocol/infoclient/main.cpp new file mode 100644 index 000000000..502026958 --- /dev/null +++ b/examples/network/infoprotocol/infoclient/main.cpp @@ -0,0 +1,21 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> + +#include "client.h" + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + ClientInfo info; + app.setMainWidget( &info ); + info.show(); + return app.exec(); +} diff --git a/examples/network/infoprotocol/infoserver/infodata.cpp b/examples/network/infoprotocol/infoserver/infodata.cpp new file mode 100644 index 000000000..347c78d31 --- /dev/null +++ b/examples/network/infoprotocol/infoserver/infodata.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "infodata.h" + + +// we hard code all nodes and data in InfoData class +InfoData::InfoData() : + nodes( 17, TRUE ), data( 17, TRUE ) +{ + nodes.setAutoDelete(TRUE); + data.setAutoDelete(TRUE); + TQStringList *item; + + nodes.insert( "/", item = new TQStringList( ) ); + (*item) << "D network"; + nodes.insert( "/network/", item = new TQStringList() ); + (*item) << "D workstations" << "D printers" << "D fax"; + nodes.insert( "/network/workstations/", item = new TQStringList() ); + (*item) << "D nibble" << "D douglas"; + nodes.insert( "/network/workstations/nibble/", item = new TQStringList() ); + (*item) << "F os" << "F cpu" << "F memory"; + nodes.insert( "/network/workstations/douglas/", item = new TQStringList() ); + (*item) << "F os" << "F cpu" << "F memory"; + nodes.insert( "/network/printers/", item = new TQStringList() ); + (*item) << "D overbitt" << "D kroksleiven"; + nodes.insert( "/network/printers/overbitt/", item = new TQStringList() ); + (*item) << "D jobs" << "F type"; + nodes.insert( "/network/printers/overbitt/jobs/", item = new TQStringList() ); + (*item) << "F job1" << "F job2"; + nodes.insert( "/network/printers/kroksleiven/", item = new TQStringList() ); + (*item) << "D jobs" << "F type"; + nodes.insert( "/network/printers/kroksleiven/jobs/", item = new TQStringList() ); + nodes.insert( "/network/fax/", item = new TQStringList() ); + (*item) << "F last_number"; + + data.insert( "/network/workstations/nibble/os", new TQString( "Linux" ) ); + data.insert( "/network/workstations/nibble/cpu", new TQString( "AMD Athlon 1000" ) ); + data.insert( "/network/workstations/nibble/memory", new TQString( "256 MB" ) ); + data.insert( "/network/workstations/douglas/os", new TQString( "Windows 2000" ) ); + data.insert( "/network/workstations/douglas/cpu", new TQString( "2 x Intel Pentium III 800" ) ); + data.insert( "/network/workstations/douglas/memory", new TQString( "256 MB" ) ); + data.insert( "/network/printers/overbitt/type", new TQString( "Lexmark Optra S 1255 PS" ) ); + data.insert( "/network/printers/overbitt/jobs/job1", + new TQString( "TQt manual\n" "A4 size\n" "3000 pages" ) ); + data.insert( "/network/printers/overbitt/jobs/job2", + new TQString( "Monthly report\n" "Letter size\n" "24 pages\n" "8 copies" ) ); + data.insert( "/network/printers/kroksleiven/type", new TQString( "HP C LaserJet 4500-PS" ) ); + data.insert( "/network/fax/last_number", new TQString( "22 22 22 22" ) ); +} + +TQStringList InfoData::list( TQString path, bool *found ) const +{ + if ( !path.endsWith( "/" ) ) + path += "/"; + if ( !path.startsWith( "/" ) ) + path = "/" + path; + TQStringList *list = nodes[ path ]; + if ( list ) { + *found = TRUE; + return *list; + } else { + *found = FALSE; + TQStringList empty; + return empty; + } +} + +TQString InfoData::get( TQString path, bool *found ) const +{ + if ( !path.startsWith( "/" ) ) + path = "/" + path; + TQString *file = data[ path ]; + if ( file ) { + *found = TRUE; + return *file; + } else { + *found = FALSE; + TQString empty; + return empty; + } +} diff --git a/examples/network/infoprotocol/infoserver/infodata.h b/examples/network/infoprotocol/infoserver/infodata.h new file mode 100644 index 000000000..5a293ceb0 --- /dev/null +++ b/examples/network/infoprotocol/infoserver/infodata.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef INFODATA_H +#define INFODATA_H + +#include <qdict.h> +#include <qstringlist.h> + + +// The InfoData class manages data, organized in tree structure. +class InfoData +{ +public: + InfoData(); + TQStringList list( TQString path, bool *found ) const; + TQString get( TQString path, bool *found ) const; + +private: + TQDict< TQStringList > nodes; + TQDict< TQString > data; +}; + +#endif // INFODATA_H + diff --git a/examples/network/infoprotocol/infoserver/infoserver.pro b/examples/network/infoprotocol/infoserver/infoserver.pro new file mode 100644 index 000000000..3d79aeff2 --- /dev/null +++ b/examples/network/infoprotocol/infoserver/infoserver.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = infoserver + +CONFIG += qt warn_on release + +REQUIRES = network full-config nocrosscompiler + +HEADERS = server.h \ + infodata.h +SOURCES = main.cpp \ + server.cpp \ + infodata.cpp +INTERFACES = serverbase.ui diff --git a/examples/network/infoprotocol/infoserver/main.cpp b/examples/network/infoprotocol/infoserver/main.cpp new file mode 100644 index 000000000..42c0c7fad --- /dev/null +++ b/examples/network/infoprotocol/infoserver/main.cpp @@ -0,0 +1,22 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> + +#include "server.h" + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + Q_UINT16 port = ( argc > 1 ) ? TQString( argv[ 1 ] ).toInt() : infoPort; + ServerInfo info( port, 0, "server info" ); + app.setMainWidget( &info ); + info.show(); + return app.exec(); +} diff --git a/examples/network/infoprotocol/infoserver/server.cpp b/examples/network/infoprotocol/infoserver/server.cpp new file mode 100644 index 000000000..4e5ef6d17 --- /dev/null +++ b/examples/network/infoprotocol/infoserver/server.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qtextview.h> +#include <qpushbutton.h> +#include <qtextstream.h> +#include <qapplication.h> +#include <qmessagebox.h> +#include <stdlib.h> + +#include "server.h" + + + +ServerInfo::ServerInfo( Q_UINT16 port, TQWidget *parent, const char *name ) : + ServerInfoBase( parent, name ) +{ + SimpleServer *server = new SimpleServer( port, this, "simple server" ); + connect( server, SIGNAL(newConnect()), SLOT(newConnect()) ); + connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) ); +} + +void ServerInfo::newConnect() +{ + infoText->append( tr( "New connection\n" ) ); +} + + +SimpleServer::SimpleServer( Q_UINT16 port, TQObject* parent, const char *name ) : + TQServerSocket( port, 1, parent, name ) +{ + if ( !ok() ) { + TQMessageBox::critical( 0, tr( "Error" ), tr( "Failed to bind to port %1" ).arg( port ) ); + exit(1); + } +} + +void SimpleServer::newConnection( int socket ) +{ + (void)new ClientSocket( socket, &info, this, "client socket" ); + emit newConnect(); +} + + +ClientSocket::ClientSocket( int sock, InfoData *i, TQObject *parent, const char *name ) : + TQSocket( parent, name ), info( i ) +{ + connect( this, SIGNAL(readyRead()), SLOT(readClient()) ); + connect( this, SIGNAL(connectionClosed()), SLOT(connectionClosed()) ); + setSocket( sock ); +} + +void ClientSocket::readClient() +{ + TQTextStream stream( this ); + TQStringList answer; + while ( canReadLine() ) { + stream << processCommand( stream.readLine() ); + } +} + +TQString ClientSocket::processCommand( const TQString& command ) +{ + TQString answer; + TQString com = command.simplifyWhiteSpace (); + if ( com.startsWith( "LIST" ) ) { + bool ok; + TQStringList nodes = info->list( com.mid( 5 ), &ok ); + if ( ok ) { + for ( TQStringList::Iterator it = nodes.begin(); it != nodes.end(); ++it ) + answer += "212+" + *it + "\r\n"; + answer += "212 \r\n"; + } else + answer += "550 Invalid path\r\n"; + } else if ( com.startsWith( "GET " ) ) { + bool ok; + TQStringList data = TQStringList::split( '\n', info->get( com.mid( 4 ), &ok ), TRUE ); + if ( ok ) { + for ( TQStringList::Iterator it = data.begin(); it != data.end(); ++it ) + answer += "213+" + *it + "\r\n"; + answer += "213 \r\n"; + } else + answer += "550 Info not found\r\n"; + } else + answer += "500 Syntax error\r\n"; + + return answer; +} + +void ClientSocket::connectionClosed() +{ + delete this; +} diff --git a/examples/network/infoprotocol/infoserver/server.h b/examples/network/infoprotocol/infoserver/server.h new file mode 100644 index 000000000..d7b9c9ae2 --- /dev/null +++ b/examples/network/infoprotocol/infoserver/server.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef SERVER_H +#define SERVER_H + +#include <qsocket.h> +#include <qserversocket.h> + +#include "infodata.h" +#include "serverbase.h" + +static const Q_UINT16 infoPort = 42417; + + +/* + The ServerInfo class provides a small GUI for the server. It also creates the + SimpleServer and as a result the server. +*/ +class ServerInfo : public ServerInfoBase +{ + Q_OBJECT +public: + ServerInfo( Q_UINT16 port = infoPort, TQWidget *parent = 0, const char *name = 0 ); + +private slots: + void newConnect(); +}; + + +class SimpleServer : public TQServerSocket +{ + Q_OBJECT +public: + SimpleServer( Q_UINT16 port = infoPort, TQObject* parent = 0, const char *name = 0 ); + void newConnection( int socket ); + +signals: + void newConnect(); + +private: + InfoData info; +}; + + +class ClientSocket : public TQSocket +{ + Q_OBJECT +public: + ClientSocket( int sock, InfoData *i, TQObject *parent = 0, const char *name = 0 ); + +private slots: + void readClient(); + void connectionClosed(); + +private: + TQString processCommand( const TQString& command ); + InfoData *info; +}; + + +#endif //SERVER_H + diff --git a/examples/network/infoprotocol/infoserver/serverbase.ui b/examples/network/infoprotocol/infoserver/serverbase.ui new file mode 100644 index 000000000..ddf1bffb2 --- /dev/null +++ b/examples/network/infoprotocol/infoserver/serverbase.ui @@ -0,0 +1,117 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ServerInfoBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>ServerInfoBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>272</width> + <height>282</height> + </rect> + </property> + <property name="caption"> + <string>Info Server</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>This is a small Information Server. +Accepting client requests...</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <widget class="TQTextEdit"> + <property name="name"> + <cstring>infoText</cstring> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnQuit</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Quit</string> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> +</widget> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/infoprotocol/infourlclient/client.cpp b/examples/network/infoprotocol/infourlclient/client.cpp new file mode 100644 index 000000000..ba61d3b31 --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/client.cpp @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qtextedit.h> +#include <qpushbutton.h> +#include <qfiledialog.h> + +#include "qip.h" +#include "client.h" + + + + +ClientInfo::ClientInfo( TQWidget *parent, const char *name ) : + ClientInfoBase( parent, name ) +{ + connect( btnOpen, SIGNAL(clicked()), SLOT(downloadFile()) ); + connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) ); + connect( &op, SIGNAL( data( const TQByteArray &, TQNetworkOperation * ) ), + this, SLOT( newData( const TQByteArray & ) ) ); +} + +void ClientInfo::downloadFile() +{ + // under Windows you must not use the native file dialog + TQString file = getOpenFileName(); + if ( !file.isEmpty() ) { + infoText->clear(); + // download the data + op = file; + op.get(); + } +} + +TQString ClientInfo::getOpenFileName() +{ + static TQString workingDirectory( "qip://localhost/" ); + + TQFileDialog dlg( workingDirectory, TQString::null, 0, 0, TRUE ); + dlg.setCaption( TQFileDialog::tr( "Open" ) ); + dlg.setMode( TQFileDialog::ExistingFile ); + TQString result; + if ( dlg.exec() == TQDialog::Accepted ) { + result = dlg.selectedFile(); + workingDirectory = dlg.url(); + } + return result; +} + +void ClientInfo::newData( const TQByteArray &ba ) +{ + infoText->append( TQString::fromUtf8( ba ) ); +} diff --git a/examples/network/infoprotocol/infourlclient/client.h b/examples/network/infoprotocol/infourlclient/client.h new file mode 100644 index 000000000..439edbbbb --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/client.h @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef CLIENT_H +#define CLIENT_H + +#include <qurloperator.h> + +#include "clientbase.h" + + +class ClientInfo : public ClientInfoBase +{ + Q_OBJECT + +public: + ClientInfo( TQWidget *parent = 0, const char *name = 0 ); + +private slots: + void downloadFile(); + void newData( const TQByteArray &ba ); + +private: + TQUrlOperator op; + TQString getOpenFileName(); +}; + +#endif // CLIENT_H + diff --git a/examples/network/infoprotocol/infourlclient/clientbase.ui b/examples/network/infoprotocol/infourlclient/clientbase.ui new file mode 100644 index 000000000..115b0f3b7 --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/clientbase.ui @@ -0,0 +1,118 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ClientInfoBase</class> +<widget class="TQWidget"> + <property name="name"> + <cstring>ClientInfoBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>325</width> + <height>279</height> + </rect> + </property> + <property name="caption"> + <string>Info Client Protocol</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnOpen</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Open</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>open data</string> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnQuit</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Quit</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Data:</string> + </property> + </widget> + <widget class="TQTextEdit"> + <property name="name"> + <cstring>infoText</cstring> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </vbox> +</widget> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/infoprotocol/infourlclient/infourlclient.pro b/examples/network/infoprotocol/infourlclient/infourlclient.pro new file mode 100644 index 000000000..219083d2f --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/infourlclient.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = infourlclient + +CONFIG += qt warn_on release + +REQUIRES = network full-config nocrosscompiler + +HEADERS = client.h \ + qip.h +SOURCES = main.cpp \ + client.cpp \ + qip.cpp +INTERFACES = clientbase.ui diff --git a/examples/network/infoprotocol/infourlclient/main.cpp b/examples/network/infoprotocol/infourlclient/main.cpp new file mode 100644 index 000000000..fbe6aedb0 --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> + +#include "qip.h" +#include "client.h" + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + TQNetworkProtocol::registerNetworkProtocol( "qip", new TQNetworkProtocolFactory< Qip > ); + ClientInfo info; + app.setMainWidget( &info ); + info.show(); + return app.exec(); +} diff --git a/examples/network/infoprotocol/infourlclient/qip.cpp b/examples/network/infoprotocol/infourlclient/qip.cpp new file mode 100644 index 000000000..5424370e2 --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/qip.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qsocket.h> +#include <qurlinfo.h> +#include <qurloperator.h> +#include <qtextstream.h> + +#include "qip.h" + + +Qip::Qip() +{ + state = Start; + socket = new TQSocket( this ); + connect( socket, SIGNAL(connected()), SLOT(socketConnected()) ); + connect( socket, SIGNAL(connectionClosed()), SLOT(socketConnectionClosed()) ); + connect( socket, SIGNAL(readyRead()), SLOT(socketReadyRead()) ); + connect( socket, SIGNAL(error(int)), SLOT(socketError(int)) ); +} + +int Qip::supportedOperations() const +{ + return OpListChildren | OpGet; +} + +bool Qip::checkConnection( TQNetworkOperation * ) +{ + if ( socket->isOpen() ) + return TRUE; + + // don't call connectToHost() if we are already trying to connect + if ( socket->state() == TQSocket::Connecting ) + return FALSE; + + socket->connectToHost( url()->host(), url()->port() != -1 ? url()->port() : infoPort ); + return FALSE; +} + +void Qip::operationListChildren( TQNetworkOperation * ) +{ + TQTextStream os(socket); + os << "LIST " + url()->path() + "\r\n"; + operationInProgress()->setState( StInProgress ); +} + +void Qip::operationGet( TQNetworkOperation * ) +{ + TQTextStream os(socket); + os << "GET " + url()->path() + "\r\n"; + operationInProgress()->setState( StInProgress ); +} + +void Qip::socketConnected() +{ + if ( url() ) + emit connectionStateChanged( ConConnected, tr( "Connected to host %1" ).arg( url()->host() ) ); + else + emit connectionStateChanged( ConConnected, tr ("Connected to host" ) ); +} + +void Qip::socketConnectionClosed() +{ + if ( url() ) + emit connectionStateChanged( ConClosed, tr( "Connection to %1 closed" ).arg( url()->host() ) ); + else + emit connectionStateChanged( ConClosed, tr ("Connection closed" ) ); +} + +void Qip::socketError( int code ) +{ + if ( code == TQSocket::ErrHostNotFound || + code == TQSocket::ErrConnectionRefused ) { + error( ErrHostNotFound, tr( "Host not found or couldn't connect to: %1\n" ).arg( url()->host() ) ); + } else + error( ErrUnsupported, tr( "Error" ) ); +} + +void Qip::socketReadyRead() +{ + // read from the server + TQTextStream stream( socket ); + TQString line; + while ( socket->canReadLine() ) { + line = stream.readLine(); + if ( line.startsWith( "500" ) ) { + error( ErrValid, line.mid( 4 ) ); + } else if ( line.startsWith( "550" ) ) { + error( ErrFileNotExisting, line.mid( 4 ) ); + } else if ( line.startsWith( "212+" ) ) { + if ( state != List ) { + state = List; + emit start( operationInProgress() ); + } + TQUrlInfo inf; + inf.setName( line.mid( 6 ) + TQString( ( line[ 4 ] == 'D' ) ? "/" : "" ) ); + inf.setDir( line[ 4 ] == 'D' ); + inf.setSymLink( FALSE ); + inf.setFile( line[ 4 ] == 'F' ); + inf.setWritable( FALSE ); + inf.setReadable( TRUE ); + emit newChild( inf, operationInProgress() ); + } else if ( line.startsWith( "213+" ) ) { + state = Data; + emit data( line.mid( 4 ).utf8(), operationInProgress() ); + } + if( line[3] == ' ' && state != Start) { + state = Start; + operationInProgress()->setState( StDone ); + emit finished( operationInProgress() ); + } + } +} + +void Qip::error( int code, const TQString& msg ) +{ + if ( operationInProgress() ) { + operationInProgress()->setState( StFailed ); + operationInProgress()->setErrorCode( code ); + operationInProgress()->setProtocolDetail( msg ); + clearOperationQueue(); + emit finished( operationInProgress() ); + } + state = Start; +} + diff --git a/examples/network/infoprotocol/infourlclient/qip.h b/examples/network/infoprotocol/infourlclient/qip.h new file mode 100644 index 000000000..f2b9db98d --- /dev/null +++ b/examples/network/infoprotocol/infourlclient/qip.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQIP_H +#define TQIP_H + +#include <qnetworkprotocol.h> + +class TQSocket; + +static const Q_UINT16 infoPort = 42417; + + +class Qip : public TQNetworkProtocol +{ + Q_OBJECT + +public: + Qip(); + virtual int supportedOperations() const; + +protected: + virtual void operationListChildren( TQNetworkOperation *op ); + virtual void operationGet( TQNetworkOperation *op ); + virtual bool checkConnection( TQNetworkOperation *op ); + +private slots: + void socketConnected(); + void socketReadyRead(); + void socketConnectionClosed(); + void socketError( int code ); + +private: + TQSocket *socket; + enum State { Start, List, Data } state; + void error( int code, const TQString& msg ); +}; + + + +#endif // TQIP_H + diff --git a/examples/network/mail/composer.cpp b/examples/network/mail/composer.cpp new file mode 100644 index 000000000..f5ec2383c --- /dev/null +++ b/examples/network/mail/composer.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "composer.h" +#include "smtp.h" + +#include <qlineedit.h> +#include <qmultilineedit.h> +#include <qpushbutton.h> +#include <qlabel.h> +#include <qlayout.h> + +Composer::Composer( TQWidget *parent ) + : TQWidget( parent ) +{ + TQGridLayout * layout = new TQGridLayout( this, 1, 1, 6 ); + + layout->addWidget( new TQLabel( tr( "From:" ), this ), 0, 0 ); + from = new TQLineEdit( this ); + layout->addWidget( from, 0, 1 ); + + layout->addWidget( new TQLabel( tr( "To:" ), this ), 1, 0 ); + to = new TQLineEdit( this ); + layout->addWidget( to, 1, 1 ); + + layout->addWidget( new TQLabel( tr( "Subject:" ), this ), 2, 0 ); + subject = new TQLineEdit( this ); + layout->addWidget( subject, 2, 1 ); + + message = new TQMultiLineEdit( this ); + layout->addMultiCellWidget( message, 3, 3, 0, 1 ); + + send = new TQPushButton( tr( "&Send" ), this ); + layout->addWidget( send, 4, 0 ); + connect( send, SIGNAL( clicked() ), this, SLOT( sendMessage() ) ); + + sendStatus = new TQLabel( this ); + layout->addWidget( sendStatus, 4, 1 ); +} + + +void Composer::sendMessage() +{ + send->setEnabled( FALSE ); + sendStatus->setText( tr( "Looking up mail servers" ) ); + Smtp *smtp = new Smtp( from->text(), to->text(), + subject->text(), + message->text() ); + connect( smtp, SIGNAL(destroyed()), + this, SLOT(enableSend()) ); + connect( smtp, SIGNAL(status(const TQString &)), + sendStatus, SLOT(setText(const TQString &)) ); +} + + +void Composer::enableSend() +{ + send->setEnabled( TRUE ); +} diff --git a/examples/network/mail/composer.h b/examples/network/mail/composer.h new file mode 100644 index 000000000..6ef323139 --- /dev/null +++ b/examples/network/mail/composer.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef COMPOSER_H +#define COMPOSER_H + +#include <qwidget.h> + + +class TQLineEdit; +class TQMultiLineEdit; +class TQLabel; +class TQPushButton; + + +class Composer : public TQWidget +{ + Q_OBJECT + +public: + Composer( TQWidget *parent = 0 ); + +private slots: + void sendMessage(); + void enableSend(); + +private: + TQLineEdit *from, *to, *subject; + TQMultiLineEdit *message; + TQLabel * sendStatus; + TQPushButton * send; +}; + + +#endif diff --git a/examples/network/mail/mail.doc b/examples/network/mail/mail.doc new file mode 100644 index 000000000..009f15520 --- /dev/null +++ b/examples/network/mail/mail.doc @@ -0,0 +1,25 @@ +/* +*/ + +/*! \page mail-example.html + + \ingroup network-examples + + \title A simple mail client + + This example shows how to use the QSocket class. The client can only be + used to send mails. The interesting part is the implementation of the + SMTP protocol. + + <hr> + + Header file (smtp.h): + + \include network/mail/smtp.h + + <hr> + + Implementation (smtp.cpp): + + \include network/mail/smtp.cpp +*/ diff --git a/examples/network/mail/mail.pro b/examples/network/mail/mail.pro new file mode 100644 index 000000000..39c9de535 --- /dev/null +++ b/examples/network/mail/mail.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = mail + +CONFIG += qt warn_on release + +REQUIRES = network full-config + +HEADERS = composer.h \ + smtp.h +SOURCES = composer.cpp \ + main.cpp \ + smtp.cpp diff --git a/examples/network/mail/main.cpp b/examples/network/mail/main.cpp new file mode 100644 index 000000000..c80507699 --- /dev/null +++ b/examples/network/mail/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> + +#include "composer.h" + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + Composer c; + a.setMainWidget( &c ); + c.resize( 400, 500 ); + c.show(); + return a.exec(); +} diff --git a/examples/network/mail/smtp.cpp b/examples/network/mail/smtp.cpp new file mode 100644 index 000000000..a0256867b --- /dev/null +++ b/examples/network/mail/smtp.cpp @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "smtp.h" + +#include <qtextstream.h> +#include <qsocket.h> +#include <qdns.h> +#include <qtimer.h> +#include <qapplication.h> +#include <qmessagebox.h> +#include <qregexp.h> + + +Smtp::Smtp( const TQString &from, const TQString &to, + const TQString &subject, + const TQString &body ) +{ + socket = new TQSocket( this ); + connect ( socket, SIGNAL( readyRead() ), + this, SLOT( readyRead() ) ); + connect ( socket, SIGNAL( connected() ), + this, SLOT( connected() ) ); + + mxLookup = new TQDns( to.mid( to.find( '@' )+1 ), TQDns::Mx ); + connect( mxLookup, SIGNAL(resultsReady()), + this, SLOT(dnsLookupHelper()) ); + + message = TQString::fromLatin1( "From: " ) + from + + TQString::fromLatin1( "\nTo: " ) + to + + TQString::fromLatin1( "\nSubject: " ) + subject + + TQString::fromLatin1( "\n\n" ) + body + "\n"; + message.replace( TQString::fromLatin1( "\n" ), + TQString::fromLatin1( "\r\n" ) ); + message.replace( TQString::fromLatin1( "\r\n.\r\n" ), + TQString::fromLatin1( "\r\n..\r\n" ) ); + + this->from = from; + rcpt = to; + + state = Init; +} + + +Smtp::~Smtp() +{ + delete t; + delete socket; +} + + +void Smtp::dnsLookupHelper() +{ + TQValueList<TQDns::MailServer> s = mxLookup->mailServers(); + if ( s.isEmpty() ) { + if ( !mxLookup->isWorking() ) + emit status( tr( "Error in MX record lookup" ) ); + return; + } + + emit status( tr( "Connecting to %1" ).arg( s.first().name ) ); + + socket->connectToHost( s.first().name, 25 ); + t = new TQTextStream( socket ); +} + + +void Smtp::connected() +{ + emit status( tr( "Connected to %1" ).arg( socket->peerName() ) ); +} + +void Smtp::readyRead() +{ + // SMTP is line-oriented + if ( !socket->canReadLine() ) + return; + + TQString responseLine; + do { + responseLine = socket->readLine(); + response += responseLine; + } while( socket->canReadLine() && responseLine[3] != ' ' ); + responseLine.truncate( 3 ); + + if ( state == Init && responseLine[0] == '2' ) { + // banner was okay, let's go on + *t << "HELO there\r\n"; + state = Mail; + } else if ( state == Mail && responseLine[0] == '2' ) { + // HELO response was okay (well, it has to be) + *t << "MAIL FROM: <" << from << ">\r\n"; + state = Rcpt; + } else if ( state == Rcpt && responseLine[0] == '2' ) { + *t << "RCPT TO: <" << rcpt << ">\r\n"; + state = Data; + } else if ( state == Data && responseLine[0] == '2' ) { + *t << "DATA\r\n"; + state = Body; + } else if ( state == Body && responseLine[0] == '3' ) { + *t << message << ".\r\n"; + state = Quit; + } else if ( state == Quit && responseLine[0] == '2' ) { + *t << "TQUIT\r\n"; + // here, we just close. + state = Close; + emit status( tr( "Message sent" ) ); + } else if ( state == Close ) { + deleteLater(); + return; + } else { + // something broke. + TQMessageBox::warning( qApp->activeWindow(), + tr( "TQt Mail Example" ), + tr( "Unexpected reply from SMTP server:\n\n" ) + + response ); + state = Close; + } + + response = ""; +} diff --git a/examples/network/mail/smtp.h b/examples/network/mail/smtp.h new file mode 100644 index 000000000..66cf5fda5 --- /dev/null +++ b/examples/network/mail/smtp.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef SMTP_H +#define SMTP_H + +#include <qobject.h> +#include <qstring.h> + +class TQSocket; +class TQTextStream; +class TQDns; + +class Smtp : public TQObject +{ + Q_OBJECT + +public: + Smtp( const TQString &from, const TQString &to, + const TQString &subject, const TQString &body ); + ~Smtp(); + +signals: + void status( const TQString & ); + +private slots: + void dnsLookupHelper(); + void readyRead(); + void connected(); + +private: + enum State { + Init, + Mail, + Rcpt, + Data, + Body, + Quit, + Close + }; + + TQString message; + TQString from; + TQString rcpt; + TQSocket *socket; + TQTextStream * t; + int state; + TQString response; + TQDns * mxLookup; +}; + +#endif diff --git a/examples/network/networkprotocol/README b/examples/network/networkprotocol/README new file mode 100644 index 000000000..7c1e69d52 --- /dev/null +++ b/examples/network/networkprotocol/README @@ -0,0 +1,5 @@ +This class shows you how to implement your own network protocols and how to +use them in a program. This example is part of the network module. + +The class Nntp implements the nntp protocol. The implementation of the +protocol is not complete and should not be used in real programs. diff --git a/examples/network/networkprotocol/main.cpp b/examples/network/networkprotocol/main.cpp new file mode 100644 index 000000000..ce4d90e87 --- /dev/null +++ b/examples/network/networkprotocol/main.cpp @@ -0,0 +1,29 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qnetwork.h> + +#include "nntp.h" +#include "view.h" + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + qInitNetworkProtocols(); + TQNetworkProtocol::registerNetworkProtocol( "nntp", new TQNetworkProtocolFactory<Nntp> ); + + View v; + v.resize( 600, 600 ); + v.show(); + a.setMainWidget( &v ); + + return a.exec(); +} diff --git a/examples/network/networkprotocol/networkprotocol.doc b/examples/network/networkprotocol/networkprotocol.doc new file mode 100644 index 000000000..ea0079767 --- /dev/null +++ b/examples/network/networkprotocol/networkprotocol.doc @@ -0,0 +1,26 @@ +/* +*/ + +/*! \page networkprotocol-example.html + + \ingroup network-examples + + \title A simple NNTP implementation + + This example shows how to implement your own QNetworkProtocol. The + protocol that was chosen for this example is NTTP. Please note that this + implementation is very simple since it is designed to be an example. It + should not be used as a real NNTP implemention. + + <hr> + + Header file (nntp.h): + + \include network/networkprotocol/nntp.h + + <hr> + + Implementation (nntp.cpp): + + \include network/networkprotocol/nntp.cpp +*/ diff --git a/examples/network/networkprotocol/networkprotocol.pro b/examples/network/networkprotocol/networkprotocol.pro new file mode 100644 index 000000000..1c6ea07c2 --- /dev/null +++ b/examples/network/networkprotocol/networkprotocol.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = networkprotocol + +CONFIG += qt warn_on release + +REQUIRES = network full-config + +HEADERS = nntp.h view.h +SOURCES = main.cpp \ + nntp.cpp view.cpp diff --git a/examples/network/networkprotocol/nntp.cpp b/examples/network/networkprotocol/nntp.cpp new file mode 100644 index 000000000..eccc1f974 --- /dev/null +++ b/examples/network/networkprotocol/nntp.cpp @@ -0,0 +1,256 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "nntp.h" +#include <qurlinfo.h> +#include <stdlib.h> +#include <qurloperator.h> +#include <qstringlist.h> +#include <qregexp.h> + +Nntp::Nntp() + : TQNetworkProtocol(), connectionReady( FALSE ), + readGroups( FALSE ), readArticle( FALSE ) +{ + // create the command socket and connect to its signals + commandSocket = new TQSocket( this ); + connect( commandSocket, SIGNAL( hostFound() ), + this, SLOT( hostFound() ) ); + connect( commandSocket, SIGNAL( connected() ), + this, SLOT( connected() ) ); + connect( commandSocket, SIGNAL( connectionClosed() ), + this, SLOT( closed() ) ); + connect( commandSocket, SIGNAL( readyRead() ), + this, SLOT( readyRead() ) ); + connect( commandSocket, SIGNAL( error( int ) ), + this, SLOT( error( int ) ) ); +} + +Nntp::~Nntp() +{ + close(); + delete commandSocket; +} + +void Nntp::operationListChildren( TQNetworkOperation * ) +{ + // create a command + TQString path = url()->path(), cmd; + if ( path.isEmpty() || path == "/" ) { + // if the path is empty or we are in the root dir, + // we want to read the list of available newsgroups + cmd = "list newsgroups\r\n"; + } else if ( url()->isDir() ) { + // if the path is a directory (in our case a news group) + // we want to list the articles of this group + path = path.replace( "/", "" ); + cmd = "listgroup " + path + "\r\n"; + } else + return; + + // write the command to the socket + commandSocket->writeBlock( cmd.latin1(), cmd.length() ); + readGroups = TRUE; +} + +void Nntp::operationGet( TQNetworkOperation *op ) +{ + // get the dirPath of the URL (this is our news group) + // and the filename (which is the article we want to read) + TQUrl u( op->arg( 0 ) ); + TQString dirPath = u.dirPath(), file = u.fileName(); + dirPath = dirPath.replace( "/", "" ); + + // go to the group in which the article is + TQString cmd; + cmd = "group " + dirPath + "\r\n"; + commandSocket->writeBlock( cmd.latin1(), cmd.length() ); + + // read the head of the article + cmd = "article " + file + "\r\n"; + commandSocket->writeBlock( cmd.latin1(), cmd.length() ); + readArticle = TRUE; +} + +bool Nntp::checkConnection( TQNetworkOperation * ) +{ + // we are connected, return TRUE + if ( commandSocket->isOpen() && connectionReady ) + return TRUE; + + // seems that there is no chance to connect + if ( commandSocket->isOpen() ) + return FALSE; + + // don't call connectToHost() if we are already trying to connect + if ( commandSocket->state() == TQSocket::Connecting ) + return FALSE; + + // start connecting + connectionReady = FALSE; + commandSocket->connectToHost( url()->host(), + url()->port() != -1 ? url()->port() : 119 ); + return FALSE; +} + +void Nntp::close() +{ + // close the command socket + if ( commandSocket->isOpen() ) { + commandSocket->writeBlock( "tquit\r\n", strlen( "tquit\r\n" ) ); + commandSocket->close(); + } +} + +int Nntp::supportedOperations() const +{ + // we only support listing children and getting data + return OpListChildren | OpGet; +} + +void Nntp::hostFound() +{ + if ( url() ) + emit connectionStateChanged( ConHostFound, tr( "Host %1 found" ).arg( url()->host() ) ); + else + emit connectionStateChanged( ConHostFound, tr( "Host found" ) ); +} + +void Nntp::connected() +{ + if ( url() ) + emit connectionStateChanged( ConConnected, tr( "Connected to host %1" ).arg( url()->host() ) ); + else + emit connectionStateChanged( ConConnected, tr( "Connected to host" ) ); +} + +void Nntp::closed() +{ + if ( url() ) + emit connectionStateChanged( ConClosed, tr( "Connection to %1 closed" ).arg( url()->host() ) ); + else + emit connectionStateChanged( ConClosed, tr( "Connection closed" ) ); +} + +void Nntp::readyRead() +{ + // new data arrived on the command socket + + // of we should read the list of available groups, let's do so + if ( readGroups ) { + parseGroups(); + return; + } + + // of we should read an article, let's do so + if ( readArticle ) { + parseArticle(); + return; + } + + // read the new data from the socket + TQCString s; + s.resize( commandSocket->bytesAvailable() + 1 ); + commandSocket->readBlock( s.data(), commandSocket->bytesAvailable() ); + + if ( !url() ) + return; + + // of the code of the server response was 200, we know that the + // server is ready to get commands from us now + if ( s.left( 3 ) == "200" ) + connectionReady = TRUE; +} + +void Nntp::parseGroups() +{ + if ( !commandSocket->canReadLine() ) + return; + + // read one line after the other + while ( commandSocket->canReadLine() ) { + TQString s = commandSocket->readLine(); + + // if the line starts with a dot, all groups or articles have been listed, + // so we finished processing the listChildren() command + if ( s[ 0 ] == '.' ) { + readGroups = FALSE; + operationInProgress()->setState( StDone ); + emit finished( operationInProgress() ); + return; + } + + // if the code of the server response is 215 or 211 + // the next line will be the first group or article (depending on what we read). + // So let others know that we start reading now... + if ( s.left( 3 ) == "215" || s.left( 3 ) == "211" ) { + operationInProgress()->setState( StInProgress ); + emit start( operationInProgress() ); + continue; + } + + // parse the line and create a TQUrlInfo object + // which describes the child (group or article) + bool tab = s.find( '\t' ) != -1; + TQString group = s.mid( 0, s.find( tab ? '\t' : ' ' ) ); + TQUrlInfo inf; + inf.setName( group ); + TQString path = url()->path(); + inf.setDir( path.isEmpty() || path == "/" ); + inf.setSymLink( FALSE ); + inf.setFile( !inf.isDir() ); + inf.setWritable( FALSE ); + inf.setReadable( TRUE ); + + // let others know about our new child + emit newChild( inf, operationInProgress() ); + } + +} + +void Nntp::parseArticle() +{ + if ( !commandSocket->canReadLine() ) + return; + + // read an article one line after the other + while ( commandSocket->canReadLine() ) { + TQString s = commandSocket->readLine(); + + // if the line starts with a dot, we finished reading something + if ( s[ 0 ] == '.' ) { + readArticle = FALSE; + operationInProgress()->setState( StDone ); + emit finished( operationInProgress() ); + return; + } + + if ( s.right( 1 ) == "\n" ) + s.remove( s.length() - 1, 1 ); + + // emit the new data of the article which we read + emit data( TQCString( s.ascii() ), operationInProgress() ); + } +} + +void Nntp::error( int code ) +{ + if ( code == TQSocket::ErrHostNotFound || + code == TQSocket::ErrConnectionRefused ) { + // this signal is called if connecting to the server failed + if ( operationInProgress() ) { + TQString msg = tr( "Host not found or couldn't connect to: \n" + url()->host() ); + operationInProgress()->setState( StFailed ); + operationInProgress()->setProtocolDetail( msg ); + operationInProgress()->setErrorCode( (int)ErrHostNotFound ); + clearOperationQueue(); + emit finished( operationInProgress() ); + } + } +} diff --git a/examples/network/networkprotocol/nntp.h b/examples/network/networkprotocol/nntp.h new file mode 100644 index 000000000..2940a1add --- /dev/null +++ b/examples/network/networkprotocol/nntp.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef NNTP_H +#define NNTP_H + +#include <qsocket.h> +#include <qnetworkprotocol.h> + +class Nntp : public TQNetworkProtocol +{ + Q_OBJECT + +public: + Nntp(); + virtual ~Nntp(); + virtual int supportedOperations() const; + +protected: + virtual void operationListChildren( TQNetworkOperation *op ); + virtual void operationGet( TQNetworkOperation *op ); + + TQSocket *commandSocket; + bool connectionReady; + bool readGroups; + bool readArticle; + +private: + bool checkConnection( TQNetworkOperation *op ); + void close(); + void parseGroups(); + void parseArticle(); + +protected slots: + void hostFound(); + void connected(); + void closed(); + void readyRead(); + void error( int ); + +}; + +#endif diff --git a/examples/network/networkprotocol/view.cpp b/examples/network/networkprotocol/view.cpp new file mode 100644 index 000000000..c6ee717d1 --- /dev/null +++ b/examples/network/networkprotocol/view.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "view.h" + +#include <qlabel.h> +#include <qpushbutton.h> +#include <qmultilineedit.h> +#include <qfiledialog.h> + +View::View() + : TQVBox() +{ + // setup the GUI + setSpacing( 5 ); + setMargin( 5 ); + + TQLabel *l = new TQLabel( this ); + l->setAlignment( TQt::WordBreak ), + l->setText( tr( "The button below opens the TQFileDialog and you " + "can choose a file then which is downloaded and " + "opened below then. You can use for that the <b>local " + "filesystem</b> using the file protocol, you can download " + "files from an <b>FTP</b> server using the ftp protocol and " + "you can download and open <b>USENET</b> articles using the " + "demo implementation of the nntp protocol of this " + "example (<i>This implementation of the nntp protocol is a very " + "basic and incomplete one, so you need to connect to a news server " + "which allows reading without authentification</i>)\n" + "To open a file from the local filesystem, enter in the " + "path combobox of the file dialog a url starting with file " + "(like <u>file:/usr/bin</u>), to download something from an FTP " + "server, use something like <u>ftp://ftp.trolltech.com</u> as url, and " + "for downloading a news article start with an url like " + "<u>nntp://news.tu-graz.ac.at</u> " ) ); + TQPushButton *b = new TQPushButton( tr( "Open a file..." ), this ); + connect( b, SIGNAL( clicked() ), + this, SLOT( downloadFile() ) ); + + fileView = new TQMultiLineEdit( this ); + fileView->setReadOnly( TRUE ); + + // if new data comes in, display it + connect( &op, SIGNAL( data( const TQByteArray &, TQNetworkOperation * ) ), + this, SLOT( newData( const TQByteArray & ) ) ); +} + +void View::downloadFile() +{ + // TQString file = TQFileDialog::getOpenFileName(); + // under Windows you must not use the native file dialog + TQString file = getOpenFileName(); + if ( !file.isEmpty() ) { + // clear the view + fileView->clear(); + + // download the data + op = file; + op.get(); + } +} + +TQString View::getOpenFileName() +{ + static TQString workingDirectory = TQDir::currentDirPath(); + + TQFileDialog *dlg = new TQFileDialog( workingDirectory, + TQString::null, 0, 0, TRUE ); + dlg->setCaption( TQFileDialog::tr( "Open" ) ); + dlg->setMode( TQFileDialog::ExistingFile ); + TQString result; + if ( dlg->exec() == TQDialog::Accepted ) { + result = dlg->selectedFile(); + workingDirectory = dlg->url(); + } + delete dlg; + return result; +} + +void View::newData( const TQByteArray &ba ) +{ + // append new data + fileView->append( ba ); +} diff --git a/examples/network/networkprotocol/view.h b/examples/network/networkprotocol/view.h new file mode 100644 index 000000000..29c0f6e5f --- /dev/null +++ b/examples/network/networkprotocol/view.h @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef VIEW_H +#define VIEW_H + +#include <qvbox.h> +#include <qcstring.h> +#include <qurloperator.h> + +class TQMultiLineEdit; + +class View : public TQVBox +{ + Q_OBJECT + +public: + View(); + +private slots: + void downloadFile(); + void newData( const TQByteArray &ba ); + +private: + TQMultiLineEdit *fileView; + TQUrlOperator op; + + TQString getOpenFileName(); +}; + +#endif diff --git a/examples/network/remotecontrol/ipcserver.cpp b/examples/network/remotecontrol/ipcserver.cpp new file mode 100644 index 000000000..35595673f --- /dev/null +++ b/examples/network/remotecontrol/ipcserver.cpp @@ -0,0 +1,84 @@ +#include "ipcserver.h" + +#include <qsocket.h> +#include <qvariant.h> +#include <qimage.h> +#include <qpalette.h> +#include <qapplication.h> + +class IpcSocket : public TQSocket +{ + Q_OBJECT + +public: + IpcSocket( TQObject *parent) : TQSocket( parent ) + { + packetSize = 0; + connect( this, SIGNAL(readyRead()), SLOT(read()) ); + } + +signals: + void receivedText( const TQString& ); + void receivedPixmap( const TQPixmap& ); + +private slots: + void read() + { + Q_ULONG bytesAvail = bytesAvailable(); + for ( ;; ) { + if ( packetSize == 0 ) { + TQDataStream ds( this ); + if ( bytesAvail < 4 ) + return; + ds >> packetSize; + bytesAvail -= 4; + } else { + if ( bytesAvail < packetSize ) + return; + // read the packet in a byte array to be sure that you don't + // read too much or too less + TQByteArray ba( packetSize ); + readBlock( ba.data(), packetSize ); + bytesAvail -= packetSize; + packetSize = 0; + + TQVariant variant; + TQDataStream ds( ba, IO_ReadOnly ); + ds >> variant; + switch ( variant.type() ) { + case TQVariant::String: + emit receivedText( variant.toString() ); + break; + case TQVariant::Image: + emit receivedPixmap( TQPixmap(variant.toImage()) ); + break; + case TQVariant::Palette: + TQApplication::setPalette( variant.toPalette(), TRUE ); + break; + default: + break; + } + } + } + } + +private: + Q_UINT32 packetSize; +}; + +IpcServer::IpcServer( Q_UINT16 port, TQObject *parent ) : + TQServerSocket( 0x7f000001, port, 1, parent ) +{ +} + +void IpcServer::newConnection( int socket ) +{ + IpcSocket *s = new IpcSocket( this ); + s->setSocket( socket ); + connect( s, SIGNAL(receivedText(const TQString&)), + SIGNAL(receivedText(const TQString&)) ); + connect( s, SIGNAL(receivedPixmap(const TQPixmap&)), + SIGNAL(receivedPixmap(const TQPixmap&)) ); +} + +#include "ipcserver.moc" diff --git a/examples/network/remotecontrol/ipcserver.h b/examples/network/remotecontrol/ipcserver.h new file mode 100644 index 000000000..f4c86f49f --- /dev/null +++ b/examples/network/remotecontrol/ipcserver.h @@ -0,0 +1,20 @@ +#ifndef IPCSERVER_H +#define IPCSERVER_H + +#include <qserversocket.h> + +class IpcServer : public TQServerSocket +{ + Q_OBJECT + +public: + IpcServer( Q_UINT16 port, TQObject *parent ); + + void newConnection( int socket ); + +signals: + void receivedText( const TQString& ); + void receivedPixmap( const TQPixmap& ); +}; + +#endif // IPCSERVER_H diff --git a/examples/network/remotecontrol/main.cpp b/examples/network/remotecontrol/main.cpp new file mode 100644 index 000000000..c153d02d2 --- /dev/null +++ b/examples/network/remotecontrol/main.cpp @@ -0,0 +1,11 @@ +#include <qapplication.h> + +#include "startup.h" + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + StartUp s; + TQObject::connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) ); + return a.exec(); +} diff --git a/examples/network/remotecontrol/maindialog.ui b/examples/network/remotecontrol/maindialog.ui new file mode 100644 index 000000000..ede1cfe95 --- /dev/null +++ b/examples/network/remotecontrol/maindialog.ui @@ -0,0 +1,165 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>MainDialog</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>MainDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>273</width> + <height>263</height> + </rect> + </property> + <property name="caption"> + <string>Image viewer</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>MShape</enum> + </property> + <property name="text"> + <string>If you start another instance of this application, you can use that instance to control this one.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignCenter</set> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>image</cstring> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>description</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>26</pointsize> + </font> + </property> + <property name="text"> + <string>The TQt logo</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>Quit</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<images> + <image name="image0"> + <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data> + </image> +</images> +<connections> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>MainDialog</receiver> + <slot>close()</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/remotecontrol/remotecontrol.pro b/examples/network/remotecontrol/remotecontrol.pro new file mode 100644 index 000000000..0570253c2 --- /dev/null +++ b/examples/network/remotecontrol/remotecontrol.pro @@ -0,0 +1,16 @@ +TEMPLATE = app +TARGET = remotecontrol + +CONFIG += qt warn_on release + +REQUIRES = network full-config nocrosscompiler + +HEADERS = startup.h \ + remotectrlimpl.h \ + ipcserver.h +SOURCES = main.cpp \ + startup.cpp \ + remotectrlimpl.cpp \ + ipcserver.cpp +INTERFACES = remotectrl.ui \ + maindialog.ui diff --git a/examples/network/remotecontrol/remotectrl.ui b/examples/network/remotecontrol/remotectrl.ui new file mode 100644 index 000000000..c28482ff2 --- /dev/null +++ b/examples/network/remotecontrol/remotectrl.ui @@ -0,0 +1,145 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>RemoteCtrl</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>RemoteCtrl</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>279</width> + <height>185</height> + </rect> + </property> + <property name="caption"> + <string>Remote control</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>textToSend</cstring> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer5_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>sText</cstring> + </property> + <property name="text"> + <string>Send &Text</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>sImage</cstring> + </property> + <property name="text"> + <string>Send &Image...</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>sPalette</cstring> + </property> + <property name="text"> + <string>Send &Palette...</string> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer6</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>tquitButton</cstring> + </property> + <property name="text"> + <string>&Quit</string> + </property> + </widget> + </vbox> + </widget> + </hbox> +</widget> +<connections> + <connection> + <sender>tquitButton</sender> + <signal>clicked()</signal> + <receiver>RemoteCtrl</receiver> + <slot>close()</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/network/remotecontrol/remotectrlimpl.cpp b/examples/network/remotecontrol/remotectrlimpl.cpp new file mode 100644 index 000000000..03af938f8 --- /dev/null +++ b/examples/network/remotecontrol/remotectrlimpl.cpp @@ -0,0 +1,50 @@ +#include "remotectrlimpl.h" + +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qsocket.h> +#include <qfiledialog.h> +#include <qcolordialog.h> +#include <qimage.h> + +RemoteCtrlImpl::RemoteCtrlImpl( TQSocket *s ) +{ + socket = s; + connect( sImage, SIGNAL(clicked()), SLOT(sendImage()) ); + connect( sText, SIGNAL(clicked()), SLOT(sendText()) ); + connect( sPalette, SIGNAL(clicked()), SLOT(sendPalette()) ); +} + +void RemoteCtrlImpl::sendPacket( const TQVariant &v ) +{ + TQByteArray ba; + TQDataStream varDs( ba, IO_WriteOnly ); + varDs << v; + + TQDataStream ds( socket ); + ds << (Q_UINT32) ba.size(); + socket->writeBlock( ba.data(), ba.size() ); +} + +void RemoteCtrlImpl::sendImage() +{ + TQString imageName = TQFileDialog::getOpenFileName( TQString::null, + "Images (*.png *.xpm *.jpg)", this ); + TQImage image( imageName ); + if ( !image.isNull() ) { + sendPacket( image ); + } +} + +void RemoteCtrlImpl::sendText() +{ + sendPacket( textToSend->text() ); +} + +void RemoteCtrlImpl::sendPalette() +{ + TQColor col = TQColorDialog::getColor( white, this ); + if ( col.isValid() ) { + sendPacket( TQPalette(col,col) ); + } +} diff --git a/examples/network/remotecontrol/remotectrlimpl.h b/examples/network/remotecontrol/remotectrlimpl.h new file mode 100644 index 000000000..a14d1be76 --- /dev/null +++ b/examples/network/remotecontrol/remotectrlimpl.h @@ -0,0 +1,26 @@ +#ifndef REMOTECTRLIMPL_H +#define REMOTECTRLIMPL_H + +#include "remotectrl.h" + +class TQSocket; + +class RemoteCtrlImpl : public RemoteCtrl +{ + Q_OBJECT + +public: + RemoteCtrlImpl( TQSocket * ); + +private slots: + void sendImage(); + void sendText(); + void sendPalette(); + +private: + void sendPacket( const TQVariant & ); + + TQSocket *socket; +}; + +#endif // REMOTECTRLIMPL_H diff --git a/examples/network/remotecontrol/startup.cpp b/examples/network/remotecontrol/startup.cpp new file mode 100644 index 000000000..f555499b7 --- /dev/null +++ b/examples/network/remotecontrol/startup.cpp @@ -0,0 +1,45 @@ +#include "startup.h" +#include "remotectrlimpl.h" +#include "maindialog.h" +#include "ipcserver.h" + +#include <qsocket.h> +#include <qlabel.h> + +static const Q_UINT16 ipcPort = 54923; + +StartUp::StartUp() +{ + remoteCtrl = 0; + mainDialog = 0; + + socket = new TQSocket( this ); + connect( socket, SIGNAL(connected()), SLOT(startRemoteCtrl()) ); + connect( socket, SIGNAL(error(int)), SLOT(startMainDialog()) ); + socket->connectToHost( "localhost", ipcPort ); +} + +StartUp::~StartUp() +{ + delete remoteCtrl; + delete mainDialog; +} + +void StartUp::startRemoteCtrl() +{ + remoteCtrl = new RemoteCtrlImpl( socket ); + remoteCtrl->show(); +} + +void StartUp::startMainDialog() +{ + mainDialog = new MainDialog(); + mainDialog->show(); + + IpcServer *server = new IpcServer( ipcPort, this ); + + connect( server, SIGNAL(receivedText(const TQString&)), + mainDialog->description, SLOT(setText(const TQString&)) ); + connect( server, SIGNAL(receivedPixmap(const TQPixmap&)), + mainDialog->image, SLOT(setPixmap(const TQPixmap&)) ); +} diff --git a/examples/network/remotecontrol/startup.h b/examples/network/remotecontrol/startup.h new file mode 100644 index 000000000..5530cba8f --- /dev/null +++ b/examples/network/remotecontrol/startup.h @@ -0,0 +1,28 @@ +#ifndef STARTUP_H +#define STARTUP_H + +#include <qobject.h> + +class TQSocket; +class RemoteCtrlImpl; +class MainDialog; + +class StartUp : public TQObject +{ + Q_OBJECT + +public: + StartUp(); + ~StartUp(); + +private slots: + void startRemoteCtrl(); + void startMainDialog(); + +private: + TQSocket *socket; + RemoteCtrlImpl *remoteCtrl; + MainDialog *mainDialog; +}; + +#endif // STARTUP_H diff --git a/examples/opengl/box/README b/examples/opengl/box/README new file mode 100644 index 000000000..113f82d6c --- /dev/null +++ b/examples/opengl/box/README @@ -0,0 +1,8 @@ + +The box example + +This example program shows how to use OpenGL in Qt: Put your OpenGL +code in a class inherited from QGLWidget. The resulting subclass may +be used like any other Qt widget, with signals and slots, geometry +management, etc.. + diff --git a/examples/opengl/box/box.doc b/examples/opengl/box/box.doc new file mode 100644 index 000000000..51297fa35 --- /dev/null +++ b/examples/opengl/box/box.doc @@ -0,0 +1,18 @@ +/*! \page opengl-box-example.html + + \ingroup opengl-examples + \title OpenGL Box Example + +This example demonstrates how to use OpenGL in Qt. + +Essentially, all you do is put your OpenGL code in a class inherited +from QGLWidget. This class may then be used like any other Qt widget, +including the use of signals and slots and geometry management. + +See \c{$QTDIR/examples/opengl/box} for the source code. + +*/ + + + + diff --git a/examples/opengl/box/box.pro b/examples/opengl/box/box.pro new file mode 100644 index 000000000..80784531f --- /dev/null +++ b/examples/opengl/box/box.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +TARGET = box + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl + +DEPENDPATH = ../include + +REQUIRES = opengl + +HEADERS = glbox.h \ + globjwin.h +SOURCES = glbox.cpp \ + globjwin.cpp \ + main.cpp diff --git a/examples/opengl/box/glbox.cpp b/examples/opengl/box/glbox.cpp new file mode 100644 index 000000000..aa1792241 --- /dev/null +++ b/examples/opengl/box/glbox.cpp @@ -0,0 +1,170 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying an openGL wireframe box +** +** The OpenGL code is mostly borrowed from Brian Pauls "spin" example +** in the Mesa distribution +** +****************************************************************************/ + +#include "glbox.h" + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/*! + Create a GLBox widget +*/ + +GLBox::GLBox( TQWidget* parent, const char* name ) + : TQGLWidget( parent, name ) +{ + xRot = yRot = zRot = 0.0; // default object rotation + scale = 1.25; // default object scale + object = 0; +} + + +/*! + Release allocated resources +*/ + +GLBox::~GLBox() +{ + makeCurrent(); + glDeleteLists( object, 1 ); +} + + +/*! + Paint the box. The actual openGL commands for drawing the box are + performed here. +*/ + +void GLBox::paintGL() +{ + glClear( GL_COLOR_BUFFER_BIT ); + + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -10.0 ); + glScalef( scale, scale, scale ); + + glRotatef( xRot, 1.0, 0.0, 0.0 ); + glRotatef( yRot, 0.0, 1.0, 0.0 ); + glRotatef( zRot, 0.0, 0.0, 1.0 ); + + glCallList( object ); +} + + +/*! + Set up the OpenGL rendering state, and define display list +*/ + +void GLBox::initializeGL() +{ + qglClearColor( black ); // Let OpenGL clear to black + object = makeObject(); // Generate an OpenGL display list + glShadeModel( GL_FLAT ); +} + + + +/*! + Set up the OpenGL view port, matrix mode, etc. +*/ + +void GLBox::resizeGL( int w, int h ) +{ + glViewport( 0, 0, (GLint)w, (GLint)h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 ); + glMatrixMode( GL_MODELVIEW ); +} + + +/*! + Generate an OpenGL display list for the object to be shown, i.e. the box +*/ + +GLuint GLBox::makeObject() +{ + GLuint list; + + list = glGenLists( 1 ); + + glNewList( list, GL_COMPILE ); + + qglColor( white ); // Shorthand for glColor3f or glIndex + + glLineWidth( 2.0 ); + + glBegin( GL_LINE_LOOP ); + glVertex3f( 1.0, 0.5, -0.4 ); + glVertex3f( 1.0, -0.5, -0.4 ); + glVertex3f( -1.0, -0.5, -0.4 ); + glVertex3f( -1.0, 0.5, -0.4 ); + glEnd(); + + glBegin( GL_LINE_LOOP ); + glVertex3f( 1.0, 0.5, 0.4 ); + glVertex3f( 1.0, -0.5, 0.4 ); + glVertex3f( -1.0, -0.5, 0.4 ); + glVertex3f( -1.0, 0.5, 0.4 ); + glEnd(); + + glBegin( GL_LINES ); + glVertex3f( 1.0, 0.5, -0.4 ); glVertex3f( 1.0, 0.5, 0.4 ); + glVertex3f( 1.0, -0.5, -0.4 ); glVertex3f( 1.0, -0.5, 0.4 ); + glVertex3f( -1.0, -0.5, -0.4 ); glVertex3f( -1.0, -0.5, 0.4 ); + glVertex3f( -1.0, 0.5, -0.4 ); glVertex3f( -1.0, 0.5, 0.4 ); + glEnd(); + + glEndList(); + + return list; +} + + +/*! + Set the rotation angle of the object to \e degrees around the X axis. +*/ + +void GLBox::setXRotation( int degrees ) +{ + xRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Y axis. +*/ + +void GLBox::setYRotation( int degrees ) +{ + yRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Z axis. +*/ + +void GLBox::setZRotation( int degrees ) +{ + zRot = (GLfloat)(degrees % 360); + updateGL(); +} diff --git a/examples/opengl/box/glbox.h b/examples/opengl/box/glbox.h new file mode 100644 index 000000000..a04a8122a --- /dev/null +++ b/examples/opengl/box/glbox.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying an openGL wireframe box +** +****************************************************************************/ + +#ifndef GLBOX_H +#define GLBOX_H + +#include <qgl.h> + + +class GLBox : public TQGLWidget +{ + Q_OBJECT + +public: + + GLBox( TQWidget* parent, const char* name ); + ~GLBox(); + +public slots: + + void setXRotation( int degrees ); + void setYRotation( int degrees ); + void setZRotation( int degrees ); + +protected: + + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + virtual GLuint makeObject(); + +private: + + GLuint object; + GLfloat xRot, yRot, zRot, scale; + +}; + + +#endif // GLBOX_H diff --git a/examples/opengl/box/globjwin.cpp b/examples/opengl/box/globjwin.cpp new file mode 100644 index 000000000..f4af52c36 --- /dev/null +++ b/examples/opengl/box/globjwin.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qpushbutton.h> +#include <qslider.h> +#include <qlayout.h> +#include <qframe.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qkeycode.h> +#include "globjwin.h" +#include "glbox.h" + + +GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name ) + : TQWidget( parent, name ) +{ + + // Create a menu + TQPopupMenu *file = new TQPopupMenu( this ); + file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + // Create a menu bar + TQMenuBar *m = new TQMenuBar( this ); + m->setSeparator( TQMenuBar::InWindowsStyle ); + m->insertItem("&File", file ); + + // Create a nice frame to put around the OpenGL widget + TQFrame* f = new TQFrame( this, "frame" ); + f->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + f->setLineWidth( 2 ); + + // Create our OpenGL widget + GLBox* c = new GLBox( f, "glbox"); + + // Create the three sliders; one for each rotation axis + TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" ); + x->setTickmarks( TQSlider::Left ); + TQObject::connect( x, SIGNAL(valueChanged(int)),c,SLOT(setXRotation(int)) ); + + TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" ); + y->setTickmarks( TQSlider::Left ); + TQObject::connect( y, SIGNAL(valueChanged(int)),c,SLOT(setYRotation(int)) ); + + TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" ); + z->setTickmarks( TQSlider::Left ); + TQObject::connect( z, SIGNAL(valueChanged(int)),c,SLOT(setZRotation(int)) ); + + + // Now that we have all the widgets, put them into a nice layout + + // Put the sliders on top of each other + TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout"); + vlayout->addWidget( x ); + vlayout->addWidget( y ); + vlayout->addWidget( z ); + + // Put the GL widget inside the frame + TQHBoxLayout* flayout = new TQHBoxLayout( f, 2, 2, "flayout"); + flayout->addWidget( c, 1 ); + + // Top level layout, puts the sliders to the left of the frame/GL widget + TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout"); + hlayout->setMenuBar( m ); + hlayout->addLayout( vlayout ); + hlayout->addWidget( f, 1 ); +} diff --git a/examples/opengl/box/globjwin.h b/examples/opengl/box/globjwin.h new file mode 100644 index 000000000..98dad489e --- /dev/null +++ b/examples/opengl/box/globjwin.h @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** The GLObjectWindow contains a GLBox and three sliders connected to +** the GLBox's rotation slots. +** +****************************************************************************/ + +#ifndef GLOBJWIN_H +#define GLOBJWIN_H + +#include <qwidget.h> + + +class GLObjectWindow : public TQWidget +{ + Q_OBJECT +public: + GLObjectWindow( TQWidget* parent = 0, const char* name = 0 ); + +}; + + +#endif // GLOBJWIN_H diff --git a/examples/opengl/box/main.cpp b/examples/opengl/box/main.cpp new file mode 100644 index 000000000..4a3863232 --- /dev/null +++ b/examples/opengl/box/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// TQt OpenGL example: Box +// +// A small example showing how a GLWidget can be used just as any TQt widget +// +// File: main.cpp +// +// The main() function +// + +#include "globjwin.h" +#include <qapplication.h> +#include <qgl.h> + +/* + The main program is here. +*/ + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a(argc,argv); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + GLObjectWindow w; + w.resize( 400, 350 ); + a.setMainWidget( &w ); + w.show(); + return a.exec(); +} diff --git a/examples/opengl/gear/README b/examples/opengl/gear/README new file mode 100644 index 000000000..15f55e77d --- /dev/null +++ b/examples/opengl/gear/README @@ -0,0 +1,4 @@ + +The gear example + +This example program demonstrates how to use OpenGL display lists. diff --git a/examples/opengl/gear/gear.cpp b/examples/opengl/gear/gear.cpp new file mode 100644 index 000000000..843f56384 --- /dev/null +++ b/examples/opengl/gear/gear.cpp @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// Draws a gear. +// +// Portions of this code have been borrowed from Brian Paul's Mesa +// distribution. +// + +#include <qgl.h> +#include <qapplication.h> +#include <math.h> + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/* + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth ) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat angle, da; + GLfloat u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth/2.0; + r2 = outer_radius + tooth_depth/2.0; + + const double pi = 3.14159264; + da = 2.0*pi / teeth / 4.0; + + glShadeModel( GL_FLAT ); + + glNormal3f( 0.0, 0.0, 1.0 ); + + /* draw front face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + /* draw front sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*pi / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + + glNormal3f( 0.0, 0.0, -1.0 ); + + /* draw back face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*pi / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + } + glEnd(); + + + /* draw outward faces of teeth */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + u = r2*cos(angle+da) - r1*cos(angle); + v = r2*sin(angle+da) - r1*sin(angle); + len = sqrt( u*u + v*v ); + u /= len; + v /= len; + glNormal3f( v, -u, 0.0 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + u = r1*cos(angle+3*da) - r2*cos(angle+2*da); + v = r1*sin(angle+3*da) - r2*sin(angle+2*da); + glNormal3f( v, -u, 0.0 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + } + + glVertex3f( r1*cos(0.0), r1*sin(0.0), width*0.5 ); + glVertex3f( r1*cos(0.0), r1*sin(0.0), -width*0.5 ); + + glEnd(); + + + glShadeModel( GL_SMOOTH ); + + /* draw inside radius cylinder */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glNormal3f( -cos(angle), -sin(angle), 0.0 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + } + glEnd(); + +} + + +static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0; +static GLint gear1, gear2, gear3; +static GLfloat angle = 0.0; + + +static void draw() +{ + angle += 2.0; + view_roty += 1.0; + + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glPushMatrix(); + glRotatef( view_rotx, 1.0, 0.0, 0.0 ); + glRotatef( view_roty, 0.0, 1.0, 0.0 ); + glRotatef( view_rotz, 0.0, 0.0, 1.0 ); + + glPushMatrix(); + glTranslatef( -3.0, -2.0, 0.0 ); + glRotatef( angle, 0.0, 0.0, 1.0 ); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( 3.1, -2.0, 0.0 ); + glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 ); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( -3.1, 2.2, -1.8 ); + glRotatef( 90.0, 1.0, 0.0, 0.0 ); + glRotatef( 2.0*angle-2.0, 0.0, 0.0, 1.0 ); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); +} + + +static int timer_interval = 10; // timer interval (millisec) + + +class GearWidget : public TQGLWidget +{ +public: + GearWidget( TQWidget *parent=0, const char *name=0 ); +protected: + void initializeGL(); + void resizeGL( int, int ); + void paintGL(); + void timerEvent( TQTimerEvent * ); +}; + +GearWidget::GearWidget( TQWidget *parent, const char *name ) + : TQGLWidget( parent, name ) +{ + startTimer( timer_interval ); +} + +void GearWidget::initializeGL() +{ + static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 }; + static GLfloat ared[4] = {0.8, 0.1, 0.0, 1.0 }; + static GLfloat agreen[4] = {0.0, 0.8, 0.2, 1.0 }; + static GLfloat ablue[4] = {0.2, 0.2, 1.0, 1.0 }; + + glLightfv( GL_LIGHT0, GL_POSITION, pos ); + glEnable( GL_CULL_FACE ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_DEPTH_TEST ); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ared ); + gear( 1.0, 4.0, 1.0, 20, 0.7 ); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, agreen ); + gear( 0.5, 2.0, 2.0, 10, 0.7 ); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ablue ); + gear( 1.3, 2.0, 0.5, 10, 0.7 ); + glEndList(); + + glEnable( GL_NORMALIZE ); +} + + +void GearWidget::resizeGL( int width, int height ) +{ + GLfloat w = (float) width / (float) height; + GLfloat h = 1.0; + + glViewport( 0, 0, width, height ); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum( -w, w, -h, h, 5.0, 60.0 ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -40.0 ); +} + + +void GearWidget::paintGL() +{ + draw(); +} + +void GearWidget::timerEvent(TQTimerEvent*) +{ + updateGL(); +} + + + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a( argc, argv ); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + if ( argc >= 2 ) { + bool ok = TRUE; + timer_interval = TQString::fromLatin1( argv[1] ).toInt( &ok ); + if ( !ok ) + timer_interval = 10; + } + + GearWidget w; + a.setMainWidget( &w ); + w.show(); + return a.exec(); +} diff --git a/examples/opengl/gear/gear.doc b/examples/opengl/gear/gear.doc new file mode 100644 index 000000000..2fe049a93 --- /dev/null +++ b/examples/opengl/gear/gear.doc @@ -0,0 +1,11 @@ +/*! \page opengl-gear-example.html + + \ingroup opengl-examples + \title OpenGL Gear Example + + +This example demonstrates how to use OpenGL display lists. + +See \c{$QTDIR/examples/opengl/gear} for the source code. + +*/ diff --git a/examples/opengl/gear/gear.pro b/examples/opengl/gear/gear.pro new file mode 100644 index 000000000..b91691cba --- /dev/null +++ b/examples/opengl/gear/gear.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = gear + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl +!mac:unix:LIBS += -lm +DEPENDPATH = ../include + +REQUIRES = opengl + +HEADERS = +SOURCES = gear.cpp diff --git a/examples/opengl/glpixmap/README b/examples/opengl/glpixmap/README new file mode 100644 index 000000000..b01cfafee --- /dev/null +++ b/examples/opengl/glpixmap/README @@ -0,0 +1,8 @@ + +The OpenGL pixmap example + +This example program is an extension of the "box" example program. + +It demonstrates how to render OpenGL into a QPixmap. + + diff --git a/examples/opengl/glpixmap/glbox.cpp b/examples/opengl/glpixmap/glbox.cpp new file mode 100644 index 000000000..fe7c682c5 --- /dev/null +++ b/examples/opengl/glpixmap/glbox.cpp @@ -0,0 +1,256 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying a box +** +** The OpenGL code is mostly borrowed from Brian Pauls "spin" example +** in the Mesa distribution +** +****************************************************************************/ + +#include <math.h> + +#include "glbox.h" + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/*! + Create a GLBox widget +*/ + +GLBox::GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget ) + : TQGLWidget( parent, name, shareWidget ) +{ + xRot = yRot = zRot = 0.0; // default object rotation + scale = 1.5; // default object scale +} + + +/*! + Create a GLBox widget +*/ + +GLBox::GLBox( const TQGLFormat& format, TQWidget* parent, const char* name, + const TQGLWidget* shareWidget ) + : TQGLWidget( format, parent, name, shareWidget ) +{ + xRot = yRot = zRot = 0.0; // default object rotation + scale = 1.5; // default object scale +} + + +/*! + Release allocated resources +*/ + +GLBox::~GLBox() +{ +} + + +/*! + Set up the OpenGL rendering state, and define display list +*/ + +void GLBox::initializeGL() +{ + qglClearColor( green ); // Let OpenGL clear to green + object = makeObject(); // Make display list + glEnable( GL_DEPTH_TEST ); +} + + +/*! + Set up the OpenGL view port, matrix mode, etc. +*/ + +void GLBox::resizeGL( int w, int h ) +{ + glViewport( 0, 0, (GLint)w, (GLint)h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 200.0); +} + + +/*! + Paint the box. The actual openGL commands for drawing the box are + performed here. +*/ + +void GLBox::paintGL() +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -3.0 ); + glScalef( scale, scale, scale ); + + glRotatef( xRot, 1.0, 0.0, 0.0 ); + glRotatef( yRot, 0.0, 1.0, 0.0 ); + glRotatef( zRot, 0.0, 0.0, 1.0 ); + + glCallList( object ); +} + + + + + + +/*! + Generate an OpenGL display list for the object to be shown, i.e. the box +*/ + +GLuint GLBox::makeObject() +{ + GLuint list; + + list = glGenLists( 1 ); + + glNewList( list, GL_COMPILE ); + + GLint i, j, rings, sides; + float theta1, phi1, theta2, phi2; + float v0[03], v1[3], v2[3], v3[3]; + float t0[03], t1[3], t2[3], t3[3]; + float n0[3], n1[3], n2[3], n3[3]; + float innerRadius=0.4; + float outerRadius=0.8; + float scalFac; + double pi = 3.14159265358979323846; + + rings = 8; + sides = 10; + scalFac=1/(outerRadius*2); + + for (i = 0; i < rings; i++) { + theta1 = (float)i * 2.0 * pi / rings; + theta2 = (float)(i + 1) * 2.0 * pi / rings; + for (j = 0; j < sides; j++) { + phi1 = (float)j * 2.0 * pi / sides; + phi2 = (float)(j + 1) * 2.0 * pi / sides; + + v0[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi1)); + v0[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi1)); + v0[2] = innerRadius * sin(phi1); + + v1[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi1)); + v1[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi1)); + v1[2] = innerRadius * sin(phi1); + v2[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi2)); + v2[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi2)); + v2[2] = innerRadius * sin(phi2); + + v3[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi2)); + v3[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi2)); + v3[2] = innerRadius * sin(phi2); + + n0[0] = cos(theta1) * (cos(phi1)); + n0[1] = -sin(theta1) * (cos(phi1)); + n0[2] = sin(phi1); + + n1[0] = cos(theta2) * (cos(phi1)); + n1[1] = -sin(theta2) * (cos(phi1)); + n1[2] = sin(phi1); + + n2[0] = cos(theta2) * (cos(phi2)); + n2[1] = -sin(theta2) * (cos(phi2)); + n2[2] = sin(phi2); + + n3[0] = cos(theta1) * (cos(phi2)); + n3[1] = -sin(theta1) * (cos(phi2)); + n3[2] = sin(phi2); + + t0[0] = v0[0]*scalFac + 0.5; + t0[1] = v0[1]*scalFac + 0.5; + t0[2] = v0[2]*scalFac + 0.5; + + t1[0] = v1[0]*scalFac + 0.5; + t1[1] = v1[1]*scalFac + 0.5; + t1[2] = v1[2]*scalFac + 0.5; + + t2[0] = v2[0]*scalFac + 0.5; + t2[1] = v2[1]*scalFac + 0.5; + t2[2] = v2[2]*scalFac + 0.5; + + t3[0] = v3[0]*scalFac + 0.5; + t3[1] = v3[1]*scalFac + 0.5; + t3[2] = v3[2]*scalFac + 0.5; + + // Create blue-black checkered coloring + if ( (i+j) % 2 ) + qglColor( black ); + else + qglColor( TQColor( "steelblue" ) ); + + glBegin(GL_POLYGON); + glNormal3fv(n3); glTexCoord3fv(t3); glVertex3fv(v3); + glNormal3fv(n2); glTexCoord3fv(t2); glVertex3fv(v2); + glNormal3fv(n1); glTexCoord3fv(t1); glVertex3fv(v1); + glNormal3fv(n0); glTexCoord3fv(t0); glVertex3fv(v0); + glEnd(); + } + } + glEndList(); + + return list; +} + + +/*! + Set the rotation angle of the object to \e degrees around the X axis. +*/ + +void GLBox::setXRotation( int degrees ) +{ + xRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Y axis. +*/ + +void GLBox::setYRotation( int degrees ) +{ + yRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Z axis. +*/ + +void GLBox::setZRotation( int degrees ) +{ + zRot = (GLfloat)(degrees % 360); + updateGL(); +} + + + + +/*! + Sets the rotation angles of this object to that of \a fromBox +*/ + +void GLBox::copyRotation( const GLBox& fromBox ) +{ + xRot = fromBox.xRot; + yRot = fromBox.yRot; + zRot = fromBox.zRot; +} diff --git a/examples/opengl/glpixmap/glbox.h b/examples/opengl/glpixmap/glbox.h new file mode 100644 index 000000000..0b58cda0b --- /dev/null +++ b/examples/opengl/glpixmap/glbox.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying a box +** +****************************************************************************/ + +#ifndef GLBOX_H +#define GLBOX_H + +#include <qgl.h> + + +class GLBox : public TQGLWidget +{ + Q_OBJECT + +public: + + GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget=0 ); + GLBox( const TQGLFormat& format, TQWidget* parent, const char* name, + const TQGLWidget* shareWidget=0 ); + ~GLBox(); + + void copyRotation( const GLBox& fromBox ); + +public slots: + + void setXRotation( int degrees ); + void setYRotation( int degrees ); + void setZRotation( int degrees ); + +protected: + + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + virtual GLuint makeObject(); + +private: + + GLuint object; + + GLfloat xRot, yRot, zRot, scale; + +}; + + +#endif // GLBOX_H diff --git a/examples/opengl/glpixmap/globjwin.cpp b/examples/opengl/glpixmap/globjwin.cpp new file mode 100644 index 000000000..6341c3e07 --- /dev/null +++ b/examples/opengl/glpixmap/globjwin.cpp @@ -0,0 +1,214 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** Implementation of GLObjectWindow widget class +** +****************************************************************************/ + + +#include <qpushbutton.h> +#include <qslider.h> +#include <qlayout.h> +#include <qframe.h> +#include <qlabel.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qkeycode.h> +#include <qpixmap.h> +#include <qimage.h> +#include <qpainter.h> +#include "globjwin.h" +#include "glbox.h" + + +GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name ) + : TQWidget( parent, name ) +{ + // Create a menu + file = new TQPopupMenu( this ); + file->setCheckable( TRUE ); + file->insertItem( "Grab Frame Buffer", this, SLOT(grabFrameBuffer()) ); + file->insertItem( "Render Pixmap", this, SLOT(makePixmap()) ); + file->insertItem( "Render Pixmap Hidden", this, SLOT(makePixmapHidden()) ); + file->insertSeparator(); + fixMenuItemId = file->insertItem( "Use Fixed Pixmap Size", this, + SLOT(useFixedPixmapSize()) ); + file->insertSeparator(); + insertMenuItemId = file->insertItem( "Insert Pixmap Here", this, + SLOT(makePixmapForMenu()) ); + file->insertSeparator(); + file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + // Create a menu bar + TQMenuBar *m = new TQMenuBar( this ); + m->setSeparator( TQMenuBar::InWindowsStyle ); + m->insertItem("&File", file ); + + // Create nice frames to put around the OpenGL widgets + TQFrame* f1 = new TQFrame( this, "frame1" ); + f1->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + f1->setLineWidth( 2 ); + + // Create an OpenGL widget + c1 = new GLBox( f1, "glbox1"); + + // Create a label that can display the pixmap + lb = new TQLabel( this, "pixlabel" ); + lb->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + lb->setLineWidth( 2 ); + lb->setAlignment( AlignCenter ); + lb->setMargin( 0 ); + lb->setIndent( 0 ); + + // Create the three sliders; one for each rotation axis + TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" ); + x->setTickmarks( TQSlider::Left ); + connect( x, SIGNAL(valueChanged(int)), c1, SLOT(setXRotation(int)) ); + + TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" ); + y->setTickmarks( TQSlider::Left ); + connect( y, SIGNAL(valueChanged(int)), c1, SLOT(setYRotation(int)) ); + + TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" ); + z->setTickmarks( TQSlider::Left ); + connect( z, SIGNAL(valueChanged(int)), c1, SLOT(setZRotation(int)) ); + + + // Now that we have all the widgets, put them into a nice layout + + // Put the sliders on top of each other + TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout"); + vlayout->addWidget( x ); + vlayout->addWidget( y ); + vlayout->addWidget( z ); + + // Put the GL widget inside the frame + TQHBoxLayout* flayout1 = new TQHBoxLayout( f1, 2, 2, "flayout1"); + flayout1->addWidget( c1, 1 ); + + // Top level layout, puts the sliders to the left of the frame/GL widget + TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout"); + hlayout->setMenuBar( m ); + hlayout->addLayout( vlayout ); + hlayout->addWidget( f1, 1 ); + hlayout->addWidget( lb, 1 ); + +} + + + +void GLObjectWindow::grabFrameBuffer() +{ + TQImage img = c1->grabFrameBuffer(); + + // Convert image to pixmap so we can show it + TQPixmap pm; + pm.convertFromImage( img, AvoidDither ); + drawOnPixmap( &pm ); + lb->setPixmap( pm ); +} + + + +void GLObjectWindow::makePixmap() +{ + // Make a pixmap to to be rendered by the gl widget + TQPixmap pm; + + // Render the pixmap, with either c1's size or the fixed size pmSz + if ( pmSz.isValid() ) + pm = c1->renderPixmap( pmSz.width(), pmSz.height() ); + else + pm = c1->renderPixmap(); + + if ( !pm.isNull() ) { + // Present the pixmap to the user + drawOnPixmap( &pm ); + lb->setPixmap( pm ); + } + else { + lb->setText( "Failed to render Pixmap." ); + } +} + + +void GLObjectWindow::makePixmapHidden() +{ + // Make a TQGLWidget to draw the pixmap. This widget will not be shown. + GLBox* w = new GLBox( this, "temporary glwidget", c1 ); + + bool success = FALSE; + TQPixmap pm; + + if ( w->isValid() ) { + // Set the current rotation + w->copyRotation( *c1 ); + + // Determine wanted pixmap size + TQSize sz = pmSz.isValid() ? pmSz : c1->size(); + + // Make our hidden glwidget render the pixmap + pm = w->renderPixmap( sz.width(), sz.height() ); + + if ( !pm.isNull() ) + success = TRUE; + } + + if ( success ) { + // Present the pixmap to the user + drawOnPixmap( &pm ); + lb->setPixmap( pm ); + } + else { + lb->setText( "Failed to render Pixmap." ); + } + delete w; +} + + +void GLObjectWindow::drawOnPixmap( TQPixmap* pm ) +{ + // Draw some text on the pixmap to differentiate it from the GL window + + if ( pm->isNull() ) { + qWarning("Cannot draw on null pixmap"); + return; + } + else { + TQPainter p( pm ); + p.setFont( TQFont( "Helvetica", 18 ) ); + p.setPen( white ); + p.drawText( pm->rect(), AlignCenter, "This is a Pixmap" ); + } +} + + + +void GLObjectWindow::useFixedPixmapSize() +{ + if ( pmSz.isValid() ) { + pmSz = TQSize(); + file->setItemChecked( fixMenuItemId, FALSE ); + } + else { + pmSz = TQSize( 200, 200 ); + file->setItemChecked( fixMenuItemId, TRUE ); + } +} + + +void GLObjectWindow::makePixmapForMenu() +{ + TQPixmap pm = c1->renderPixmap( 32, 32 ); + if ( !pm.isNull() ) + file->changeItem( pm, "Insert Pixmap Here", insertMenuItemId ); +} diff --git a/examples/opengl/glpixmap/globjwin.h b/examples/opengl/glpixmap/globjwin.h new file mode 100644 index 000000000..b02ed67eb --- /dev/null +++ b/examples/opengl/glpixmap/globjwin.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** The GLObjectWindow contains a GLBox and three sliders connected to +** the GLBox's rotation slots. +** +****************************************************************************/ + +#ifndef GLOBJWIN_H +#define GLOBJWIN_H + +#include <qwidget.h> + +class GLBox; +class TQLabel; +class TQPopupMenu; + +class GLObjectWindow : public TQWidget +{ + Q_OBJECT +public: + GLObjectWindow( TQWidget* parent = 0, const char* name = 0 ); + +protected slots: + + void grabFrameBuffer(); + void makePixmap(); + void makePixmapHidden(); + void makePixmapForMenu(); + void useFixedPixmapSize(); + +private: + void drawOnPixmap( TQPixmap* pm ); + GLBox* c1; + TQLabel* lb; + int fixMenuItemId; + int insertMenuItemId; + TQSize pmSz; + TQPopupMenu* file; +}; + + +#endif // GLOBJWIN_H diff --git a/examples/opengl/glpixmap/glpixmap.doc b/examples/opengl/glpixmap/glpixmap.doc new file mode 100644 index 000000000..840607682 --- /dev/null +++ b/examples/opengl/glpixmap/glpixmap.doc @@ -0,0 +1,14 @@ +/*! \page opengl-pixmap-example.html + + \ingroup opengl-examples + \title OpenGL Pixmap Example + +This example program is an extension of the \link +opengl-box-example.html OpenGL Box example\endlink. + +It demonstrates how to render OpenGL into a QPixmap. + +See \c{$QTDIR/examples/opengl/glpixmap} for the source code. + +*/ + diff --git a/examples/opengl/glpixmap/glpixmap.pro b/examples/opengl/glpixmap/glpixmap.pro new file mode 100644 index 000000000..597f94c2f --- /dev/null +++ b/examples/opengl/glpixmap/glpixmap.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +TARGET = glpixmap + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl +!mac:unix:LIBS += -lm +DEPENDPATH = ../include + +REQUIRES = opengl + +HEADERS = glbox.h \ + globjwin.h +SOURCES = glbox.cpp \ + globjwin.cpp \ + main.cpp diff --git a/examples/opengl/glpixmap/main.cpp b/examples/opengl/glpixmap/main.cpp new file mode 100644 index 000000000..13e474007 --- /dev/null +++ b/examples/opengl/glpixmap/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// TQt OpenGL example: Shared Box +// +// A small example showing how to use OpenGL display list sharing +// +// File: main.cpp +// +// The main() function +// + +#include "globjwin.h" +#include <qapplication.h> +#include <qgl.h> + +/* + The main program is here. +*/ + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a(argc,argv); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + GLObjectWindow w; + w.resize( 550, 350 ); + a.setMainWidget( &w ); + w.show(); + return a.exec(); +} diff --git a/examples/opengl/overlay/README b/examples/opengl/overlay/README new file mode 100644 index 000000000..f08e539d2 --- /dev/null +++ b/examples/opengl/overlay/README @@ -0,0 +1,9 @@ + +The overlay example + +This example program shows how to use OpenGL overlays with the Qt OpenGL +Extension. It contains a QGLWidget with a relatively expensive +redrawing operation, and rubber-band drawing in the overlay plane. +Using the overlay has the advantage that the rubber-band may be drawn +and erased without damaging the image in the main plane, so costly +redraws are avoided. diff --git a/examples/opengl/overlay/globjwin.cpp b/examples/opengl/overlay/globjwin.cpp new file mode 100644 index 000000000..fd5545512 --- /dev/null +++ b/examples/opengl/overlay/globjwin.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qlayout.h> +#include <qframe.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qmessagebox.h> +#include "globjwin.h" +#include "glteapots.h" + + +GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name ) + : TQWidget( parent, name ) +{ + // Create a menu + TQPopupMenu *file = new TQPopupMenu( this ); + file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + // Create a menu bar + TQMenuBar *m = new TQMenuBar( this ); + m->setSeparator( TQMenuBar::InWindowsStyle ); + m->insertItem("&File", file ); + + // Create a nice frame to put around the OpenGL widget + TQFrame* f = new TQFrame( this, "frame" ); + f->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + f->setLineWidth( 2 ); + + // Create our OpenGL widget. + GLTeapots* c = new GLTeapots( f, "glteapots" ); + + // Check if we obtained an overlay + if ( !c->format().hasOverlay() ) { + TQMessageBox::warning( 0, qApp->argv()[0], + "Failed to get an OpenGL overlay", + "OK" ); + } + + // Now that we have all the widgets, put them into a nice layout + + // Put the GL widget inside the frame + TQHBoxLayout* flayout = new TQHBoxLayout( f, 2, 2, "flayout"); + flayout->addWidget( c, 1 ); + + // Top level layout + TQVBoxLayout* hlayout = new TQVBoxLayout( this, 20, 20, "hlayout"); + hlayout->setMenuBar( m ); + hlayout->addWidget( f, 1 ); +} diff --git a/examples/opengl/overlay/globjwin.h b/examples/opengl/overlay/globjwin.h new file mode 100644 index 000000000..ede00a35c --- /dev/null +++ b/examples/opengl/overlay/globjwin.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** The GLObjectWindow contains a GLBox and three sliders connected to +** the GLBox's rotation slots. +** +****************************************************************************/ + +#ifndef GLOBJWIN_H +#define GLOBJWIN_H + +#include <qwidget.h> + + +class GLObjectWindow : public TQWidget +{ + Q_OBJECT +public: + GLObjectWindow( TQWidget* parent = 0, const char* name = 0 ); + + +}; + + +#endif // GLOBJWIN_H diff --git a/examples/opengl/overlay/glteapots.cpp b/examples/opengl/overlay/glteapots.cpp new file mode 100644 index 000000000..7aff716de --- /dev/null +++ b/examples/opengl/overlay/glteapots.cpp @@ -0,0 +1,457 @@ +/**************************************************************************** +** +** Implementation of GLTeapots +** This is a TQGLWidget displaying a group of teapots and a rubber-band +** in an overlay plane +** +** The OpenGL code in this example is mostly borrowed from the "teapots" +** example program in the "OpenGL Programming Guide", by Jackie Neider, +** Tom Davis, and Mason Woo, Addison Wesley 1993. +** It can be obtained from ftp.sgi.com and contains the following copyright +** notice: + + * (c) Copyright 1993, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSETQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + +****************************************************************************/ + +#include "glteapots.h" +#include <qapplication.h> + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/*! + Create a GLTeapots widget. + + Specifies the following frame buffer retquirements to the TQGLWidget + constructor: + <ul> + <li> HasOverlay - we want an overlay context to draw the rubber-band in + <li> SingleBuffer - makes the drawing process of the teapots visible + </ul> +*/ + + +GLTeapots::GLTeapots( TQWidget* parent, const char* name ) + : TQGLWidget( TQGLFormat( TQGL::SingleBuffer | TQGL::HasOverlay ), + parent, name ) +{ + teapotList = 0; + rubberOn = FALSE; +} + +/*! + Release allocated resources +*/ + +GLTeapots::~GLTeapots() +{ + makeCurrent(); + glDeleteLists( teapotList, 1 ); +} + + +/*! + Do the main plane painting: a set of teapots. +*/ + +void GLTeapots::paintGL() +{ + TQApplication::setOverrideCursor( waitCursor ); // Since it takes some time + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderTeapot( 2.0, 17.0, 0.0215, 0.1745, 0.0215, + 0.07568, 0.61424, 0.07568, + 0.633, 0.727811, 0.633, 0.6 ); + renderTeapot( 2.0, 14.0, 0.135, 0.2225, 0.1575, + 0.54, 0.89, 0.63, 0.316228, + 0.316228, 0.316228, 0.1 ); + renderTeapot( 2.0, 11.0, 0.05375, 0.05, 0.06625, + 0.18275, 0.17, 0.22525, + 0.332741, 0.328634, 0.346435, 0.3 ); + renderTeapot( 2.0, 8.0, 0.25, 0.20725, 0.20725, + 1, 0.829, 0.829, 0.296648, + 0.296648, 0.296648, 0.088 ); + renderTeapot( 2.0, 5.0, 0.1745, 0.01175, 0.01175, + 0.61424, 0.04136, 0.04136, + 0.727811, 0.626959, 0.626959, 0.6); + renderTeapot( 2.0, 2.0, 0.1, 0.18725, 0.1745, + 0.396, 0.74151, 0.69102, + 0.297254, 0.30829, 0.306678, 0.1 ); + + renderTeapot( 6.0, 17.0, 0.329412, 0.223529, 0.027451, + 0.780392, 0.568627, 0.113725, + 0.992157, 0.941176, 0.807843, 0.21794872 ); + renderTeapot( 6.0, 14.0, 0.2125, 0.1275, 0.054, + 0.714, 0.4284, 0.18144, + 0.393548, 0.271906, 0.166721, 0.2 ); + renderTeapot( 6.0, 11.0, 0.25, 0.25, 0.25, + 0.4, 0.4, 0.4, + 0.774597, 0.774597, 0.774597, 0.6 ); + renderTeapot( 6.0, 8.0, 0.19125, 0.0735, 0.0225, + 0.7038, 0.27048, 0.0828, + 0.256777, 0.137622, 0.086014, 0.1 ); + renderTeapot( 6.0, 5.0, 0.24725, 0.1995, 0.0745, + 0.75164, 0.60648, 0.22648, + 0.628281, 0.555802, 0.366065, 0.4 ); + renderTeapot( 6.0, 2.0, 0.19225, 0.19225, 0.19225, + 0.50754, 0.50754, 0.50754, + 0.508273, 0.508273, 0.508273, 0.4 ); + + renderTeapot( 10.0, 17.0, 0.0, 0.0, 0.0, + 0.01, 0.01, 0.01, + 0.50, 0.50, 0.50, .25 ); + renderTeapot( 10.0, 14.0, 0.0, 0.1, 0.06, + 0.0, 0.50980392, 0.50980392, + 0.50196078, 0.50196078, 0.50196078, .25 ); + renderTeapot( 10.0, 11.0, 0.0, 0.0, 0.0, + 0.1, 0.35, 0.1, + 0.45, 0.55, 0.45, .25 ); + renderTeapot( 10.0, 8.0, 0.0, 0.0, 0.0, + 0.5, 0.0, 0.0, + 0.7, 0.6, 0.6, .25 ); + renderTeapot( 10.0, 5.0, 0.0, 0.0, 0.0, + 0.55, 0.55, 0.55, + 0.70, 0.70, 0.70, .25 ); + renderTeapot( 10.0, 2.0, 0.0, 0.0, 0.0, + 0.5, 0.5, 0.0, + 0.60, 0.60, 0.50, .25 ); + + renderTeapot( 14.0, 17.0, 0.02, 0.02, 0.02, + 0.01, 0.01, 0.01, + 0.4, 0.4, 0.4, .078125 ); + renderTeapot( 14.0, 14.0, 0.0, 0.05, 0.05, + 0.4, 0.5, 0.5, + 0.04, 0.7, 0.7, .078125 ); + renderTeapot( 14.0, 11.0, 0.0, 0.05, 0.0, + 0.4, 0.5, 0.4, + 0.04, 0.7, 0.04, .078125 ); + renderTeapot( 14.0, 8.0, 0.05, 0.0, 0.0, + 0.5, 0.4, 0.4, + 0.7, 0.04, 0.04, .078125 ); + renderTeapot( 14.0, 5.0, 0.05, 0.05, 0.05, + 0.5, 0.5, 0.5, + 0.7, 0.7, 0.7, .078125 ); + renderTeapot( 14.0, 2.0, 0.05, 0.05, 0.0, + 0.5, 0.5, 0.4, + 0.7, 0.7, 0.04, .078125 ); + + // May add a glFinish() here to make sure the GL rendering has finished + // before the mouse cursor is reset from "waiting" to normal. + TQApplication::restoreOverrideCursor(); +} + + +/*! + Set up the OpenGL rendering state of the main plane +*/ + +void GLTeapots::initializeGL() +{ + GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 }; + GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; + GLfloat position[] = { 0.0, 3.0, 3.0, 0.0 }; + + GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 }; + GLfloat local_view[] = { 0.0 }; + + glLightfv( GL_LIGHT0, GL_AMBIENT, ambient ); + glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse ); + glLightfv( GL_LIGHT0, GL_POSITION, position ); + glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient ); + glLightModelfv( GL_LIGHT_MODEL_LOCAL_VIEWER, local_view ); + + glFrontFace( GL_CW ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_AUTO_NORMAL ); + glEnable( GL_NORMALIZE ); + glEnable( GL_DEPTH_TEST ); + glDepthFunc( GL_LESS ); +} + + + +/*! + Set up the main plane's view port, matrix mode, etc. suitably for + viewing the teapots. +*/ + +void GLTeapots::resizeGL( int w, int h ) +{ + glViewport(0, 0, w, h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + if ( w <= h ) + glOrtho( 0.0, 20.0, 0.0, 20.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0 ); + else + glOrtho( 0.0, 20.0*(GLfloat)w/(GLfloat)h, 0.0, 20.0, -10.0, 10.0 ); + glMatrixMode(GL_MODELVIEW); +} + + +/*! + Set up the OpenGL rendering state of the overlay plane +*/ + +void GLTeapots::initializeOverlayGL() +{ + glLineWidth( 2 ); + glLineStipple( 3, 0xAAAA ); + glEnable( GL_LINE_STIPPLE ); +} + + +/*! + Do the overlay plane painting: a rubber-band (if the user has + dragged out one). + +*/ + +void GLTeapots::paintOverlayGL() +{ + glClear( GL_COLOR_BUFFER_BIT ); + if ( rubberOn ) { + qglColor( TQColor( 255, 255, 0 ) ); + glBegin( GL_LINE_LOOP ); + glVertex2i( rubberP1.x(), rubberP1.y() ); + glVertex2i( rubberP2.x(), rubberP1.y() ); + glVertex2i( rubberP2.x(), rubberP2.y() ); + glVertex2i( rubberP1.x(), rubberP2.y() ); + glEnd(); + } +} + + +/*! + Set up the overlay plane's view port, matrix mode, etc. suitably for + viewing the rubber-band. +*/ + +void GLTeapots::resizeOverlayGL( int w, int h ) +{ + glViewport( 0, 0, w, h ); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D( 0, w, h, 0 ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + + +/*! + User presses a mouse button: start pulling out a rubber-band rectangle +*/ + +// We do a simple rubber-band drawing here; erasing the whole overlay +// plane for each repaint. For less flickering of the rubber-band +// itself, we could remember the coordinates of the last rectangle +// drawn, and then erase only that by painting it again with +// transparent color. + +void GLTeapots::mousePressEvent( TQMouseEvent* e ) +{ + rubberP1 = e->pos(); + rubberP2 = rubberP1; + rubberOn = TRUE; +} + +/*! + User drags the mouse: Update the rubber-band coordinates and repaint + the overlay. +*/ + +void GLTeapots::mouseMoveEvent( TQMouseEvent* e ) +{ + if ( rubberOn ) { + rubberP2 = e->pos(); + updateOverlayGL(); + } +} + +/*! + User releases the mouse button: remove the rubber-band. +*/ + +void GLTeapots::mouseReleaseEvent( TQMouseEvent* ) +{ + if ( rubberOn ) { + rubberOn = FALSE; + updateOverlayGL(); + } +} + + +/*! + Renders a teapot with the given material properties +*/ + +void GLTeapots::renderTeapot( GLfloat x, GLfloat y, GLfloat ambr, + GLfloat ambg, GLfloat ambb, GLfloat difr, + GLfloat difg, GLfloat difb, + GLfloat specr, GLfloat specg, + GLfloat specb, GLfloat shine ) +{ + float mat[4]; + + glPushMatrix(); + glTranslatef (x, y, 0.0); + mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0; + glMaterialfv (GL_FRONT, GL_AMBIENT, mat); + mat[0] = difr; mat[1] = difg; mat[2] = difb; + glMaterialfv (GL_FRONT, GL_DIFFUSE, mat); + mat[0] = specr; mat[1] = specg; mat[2] = specb; + glMaterialfv (GL_FRONT, GL_SPECULAR, mat); + glMaterialf (GL_FRONT, GL_SHININESS, shine*128.0); + teapot(); + glPopMatrix(); +} + + +/*! + Draw a classic OpenGL teapot +*/ + +void GLTeapots::teapot() +{ + static long patchdata[][16] = { + {102,103,104,105,4,5,6,7,8,9,10,11,12,13,14,15}, + {12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27}, + {24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40}, + {96,96,96,96,97,98,99,100,101,101,101,101,0,1,2,3,}, + {0,1,2,3,106,107,108,109,110,111,112,113,114,115,116,117}, + {118,118,118,118,124,122,119,121,123,126,125,120,40,39,38,37}, + {41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56}, + {53,54,55,56,57,58,59,60,61,62,63,64,28,65,66,67}, + {68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83}, + {80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95} + }; + + static float cpdata[][3] = { + {0.2,0,2.7},{0.2,-0.112,2.7},{0.112,-0.2,2.7},{0,-0.2,2.7}, + {1.3375,0,2.53125},{1.3375,-0.749,2.53125},{0.749,-1.3375,2.53125}, + {0,-1.3375,2.53125},{1.4375,0,2.53125},{1.4375,-0.805,2.53125}, + {0.805,-1.4375,2.53125},{0,-1.4375,2.53125},{1.5,0,2.4}, + {1.5,-0.84,2.4},{0.84,-1.5,2.4},{0,-1.5,2.4},{1.75,0,1.875}, + {1.75,-0.98,1.875},{0.98,-1.75,1.875},{0,-1.75,1.875},{2,0,1.35}, + {2,-1.12,1.35},{1.12,-2,1.35},{0,-2,1.35},{2,0,0.9},{2,-1.12,0.9}, + {1.12,-2,0.9},{0,-2,0.9},{-2,0,0.9},{2,0,0.45},{2,-1.12,0.45}, + {1.12,-2,0.45},{0,-2,0.45},{1.5,0,0.225},{1.5,-0.84,0.225}, + {0.84,-1.5,0.225},{0,-1.5,0.225},{1.5,0,0.15},{1.5,-0.84,0.15}, + {0.84,-1.5,0.15},{0,-1.5,0.15},{-1.6,0,2.025},{-1.6,-0.3,2.025}, + {-1.5,-0.3,2.25},{-1.5,0,2.25},{-2.3,0,2.025},{-2.3,-0.3,2.025}, + {-2.5,-0.3,2.25},{-2.5,0,2.25},{-2.7,0,2.025},{-2.7,-0.3,2.025}, + {-3,-0.3,2.25},{-3,0,2.25},{-2.7,0,1.8},{-2.7,-0.3,1.8},{-3,-0.3,1.8}, + {-3,0,1.8},{-2.7,0,1.575},{-2.7,-0.3,1.575},{-3,-0.3,1.35},{-3,0,1.35}, + {-2.5,0,1.125},{-2.5,-0.3,1.125},{-2.65,-0.3,0.9375},{-2.65,0,0.9375}, + {-2,-0.3,0.9},{-1.9,-0.3,0.6},{-1.9,0,0.6},{1.7,0,1.425}, + {1.7,-0.66,1.425},{1.7,-0.66,0.6},{1.7,0,0.6},{2.6,0,1.425}, + {2.6,-0.66,1.425},{3.1,-0.66,0.825},{3.1,0,0.825},{2.3,0,2.1}, + {2.3,-0.25,2.1},{2.4,-0.25,2.025},{2.4,0,2.025},{2.7,0,2.4}, + {2.7,-0.25,2.4},{3.3,-0.25,2.4},{3.3,0,2.4},{2.8,0,2.475}, + {2.8,-0.25,2.475},{3.525,-0.25,2.49375},{3.525,0,2.49375}, + {2.9,0,2.475},{2.9,-0.15,2.475},{3.45,-0.15,2.5125},{3.45,0,2.5125}, + {2.8,0,2.4},{2.8,-0.15,2.4},{3.2,-0.15,2.4},{3.2,0,2.4},{0,0,3.15}, + {0.8,0,3.15},{0.8,-0.45,3.15},{0.45,-0.8,3.15},{0,-0.8,3.15}, + {0,0,2.85},{1.4,0,2.4},{1.4,-0.784,2.4},{0.784,-1.4,2.4},{0,-1.4,2.4}, + {0.4,0,2.55},{0.4,-0.224,2.55},{0.224,-0.4,2.55},{0,-0.4,2.55}, + {1.3,0,2.55},{1.3,-0.728,2.55},{0.728,-1.3,2.55},{0,-1.3,2.55}, + {1.3,0,2.4},{1.3,-0.728,2.4},{0.728,-1.3,2.4},{0,-1.3,2.4},{0,0,0}, + {1.425,-0.798,0},{1.5,0,0.075},{1.425,0,0},{0.798,-1.425,0}, + {0,-1.5,0.075},{0,-1.425,0},{1.5,-0.84,0.075},{0.84,-1.5,0.075} + }; + + static float tex[2][2][2] = {{{0, 0},{1, 0}},{{0, 1},{1, 1}}}; + + if ( !glIsList( teapotList ) ) { + float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3]; + long grid = 14; + + teapotList = glGenLists( 1 ); + glNewList( teapotList, GL_COMPILE ); + glPushMatrix(); + glRotatef( 270.0, 1.0, 0.0, 0.0 ); + glScalef( 0.5, 0.5, 0.5 ); + glTranslatef( 0.0, 0.0, -1.5 ); + for ( long i = 0; i < 10; i++ ) { + for ( long j = 0; j < 4; j++ ) { + for ( long k = 0; k < 4; k++ ) { + for ( long l = 0; l < 3; l++ ) { + p[j][k][l] = cpdata[patchdata[i][j*4+k]][l]; + q[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l]; + if ( l == 1 ) + q[j][k][l] *= -1.0; + if ( i < 6 ) { + r[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l]; + if ( l == 0 ) + r[j][k][l] *= -1.0; + s[j][k][l] = cpdata[patchdata[i][j*4+k]][l]; + if ( l == 0 ) + s[j][k][l] *= -1.0; + if ( l == 1 ) + s[j][k][l] *= -1.0; + } + } + } + } + glMap2f( GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, + &tex[0][0][0] ); + glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0] ); + glEnable( GL_MAP2_VERTEX_3); + glEnable(GL_MAP2_TEXTURE_COORD_2 ); + glMapGrid2f( grid, 0.0, 1.0, grid, 0.0, 1.0 ); + glEvalMesh2( GL_LINE, 0, grid, 0, grid ); + glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0] ); + glEvalMesh2( GL_LINE, 0, grid, 0, grid ); + if ( i < 6 ) { + glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, + &r[0][0][0]); + glEvalMesh2( GL_LINE, 0, grid, 0, grid ); + glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, + &s[0][0][0] ); + glEvalMesh2( GL_LINE, 0, grid, 0, grid ); + } + } + glDisable(GL_MAP2_VERTEX_3); + glDisable(GL_MAP2_TEXTURE_COORD_2); + glPopMatrix(); + glEndList(); + } + + glCallList( teapotList ); +} diff --git a/examples/opengl/overlay/glteapots.h b/examples/opengl/overlay/glteapots.h new file mode 100644 index 000000000..4fbec9b83 --- /dev/null +++ b/examples/opengl/overlay/glteapots.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a TQGLWidget displaying a group of teapots and a rubber-band +** in an overlay plane +** +****************************************************************************/ + +#ifndef GLBOX_H +#define GLBOX_H + +#include <qgl.h> + + +class GLTeapots : public TQGLWidget +{ + Q_OBJECT + +public: + + GLTeapots( TQWidget* parent, const char* name ); + ~GLTeapots(); + +protected: + + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + void initializeOverlayGL(); + void paintOverlayGL(); + void resizeOverlayGL( int w, int h ); + + void mousePressEvent( TQMouseEvent* e ); + void mouseMoveEvent( TQMouseEvent* e ); + void mouseReleaseEvent( TQMouseEvent* e ); + + void renderTeapot( GLfloat x, GLfloat y, GLfloat ambr, + GLfloat ambg, GLfloat ambb, GLfloat difr, + GLfloat difg, GLfloat difb, + GLfloat specr, GLfloat specg, + GLfloat specb, GLfloat shine ); + + void teapot(); + +private: + GLuint teapotList; + TQPoint rubberP1; + TQPoint rubberP2; + bool rubberOn; +}; + + +#endif // GLBOX_H diff --git a/examples/opengl/overlay/main.cpp b/examples/opengl/overlay/main.cpp new file mode 100644 index 000000000..3844704fd --- /dev/null +++ b/examples/opengl/overlay/main.cpp @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// TQt OpenGL example: Box +// +// A small example showing how a GLWidget can be used just as any TQt widget +// +// File: main.cpp +// +// The main() function +// + +#include "globjwin.h" +#include <qapplication.h> +#include <qgl.h> +#include <qmessagebox.h> + +/* + The main program is here. +*/ + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a(argc,argv); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + // Check for existence of overlays + if ( !TQGLFormat::hasOpenGLOverlays() ) { + TQMessageBox::critical( 0, qApp->argv()[0], + "This system does not support OpenGL overlays", + "Exit" ); + return 1; + } + + GLObjectWindow w; + w.resize( 400, 350 ); + a.setMainWidget( &w ); + + w.show(); + return a.exec(); +} diff --git a/examples/opengl/overlay/overlay.doc b/examples/opengl/overlay/overlay.doc new file mode 100644 index 000000000..7a10b3cbd --- /dev/null +++ b/examples/opengl/overlay/overlay.doc @@ -0,0 +1,16 @@ +/*! \page opengl-overlay-example.html + + \ingroup opengl-examples + \title OpenGL Overlay Example + +This example demonstrates how to use OpenGL overlays with the Qt OpenGL +Extension. It features a QGLWidget with a relatively expensive redrawing +operation, and rubber-band drawing in the overlay plane. Using the +overlay has the advantage that the rubber-band may be drawn and erased +without damaging the image in the main plane, so costly redraws are +avoided. + +See \c{$QTDIR/examples/opengl/overlay} for the source code. + +*/ + diff --git a/examples/opengl/overlay/overlay.pro b/examples/opengl/overlay/overlay.pro new file mode 100644 index 000000000..bc0816515 --- /dev/null +++ b/examples/opengl/overlay/overlay.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = overlay + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl +DEPENDPATH = ../include + +REQUIRES = opengl + +HEADERS = glteapots.h \ + globjwin.h +SOURCES = glteapots.cpp \ + globjwin.cpp \ + main.cpp diff --git a/examples/opengl/overlay_x11/README b/examples/opengl/overlay_x11/README new file mode 100644 index 000000000..eba728e67 --- /dev/null +++ b/examples/opengl/overlay_x11/README @@ -0,0 +1,74 @@ + +----------------------------------------------------------------------- +UPDATE: From version 5.0 onwards, the Qt OpenGL Extension includes +direct support for use of OpenGL overlays. For many uses of overlays, +this makes the technique described below redundant. See the 'overlay' +example program. The following is a discussion on how to use non-QGL +widgets in overlay planes. +----------------------------------------------------------------------- + +Overlayrubber: An example program showing how to use Qt and Qt OpenGL +Extension with X11 overlay visuals. + +(Background information for this example can be found in the file + README.X11-OVERLAYS) + +The example program has three main parts: + +GearWidget: A simple QGLWidget that renders the usual gears. Modified +so that it will print a debug message every time it redraws (renders) +itself. Thus, you can eaily confirm that drawing in the overlay plane +does not cause redrawings in the main plane where the QGLWidget +resides. + +RubberbandWidget: Very simple standard (non-GL) Qt widget that +implements rubberband drawing. Designed for use in an overlay +plane. It takes the planes' transparent color as a constructor +argument and uses that for its background color. Thus, the widget +itself will be invisible, only the rubberbands it draws will be +visible. + +main.cpp: Creates a GearWidget and a Rubberbandwidget and puts the +latter on top of the former. Contains a routine that checks that the +default visual is in an overlay plane, and returns the transparent +color of that plane. + + +Running it: +----------- + +Start the overlayrubber executable. Click and drag with the left mouse +button to see rubberband drawing. Observe that the QGLWidget does +not redraw itself (no redraw debug messages are output), and yet the +image is not destroyed. Marvel at the coolness of X11 overlays! + + +Using this technique in a real application +------------------------------------------ + +For clarity, this example program has been kept very simple. Here are +some hints for real application use: + +All normal widgets can go in the overlay plane: This means that you +can put all kinds of Qt widgets (your own or those provided with Qt) +on top of the OpenGL image (widget), e.g. pushbuttons etc., and they +can be moved, resized, or removed without destroying the OpenGL image. + +Using with geometry management: The QLayout classes will not allow you +to put one widget (the overlay) on top of another (the OpenGL widget); +that would defy the whole purpose of the automatic layout. The +solution is to add just one of them to the QLayout object. Have it +keep a pointer to the other (i.e. the QGLWidget knows about its +overlay widget or vice versa). Implement the resizeEvent() method of +the widget you put in the layout, and make it call setGeometry() on +the other widget with its own geometry as parameters, thus keeping the +two widgets' geometries synchronized. + +Using with QPalette and QColorGroup: Instead of the somewhat +simplistic setBackgroundColor( transparentColor ), you can use Qt's +QPalette system for having your overlay widgets use transparent color +for what you want. This way, the normal Qt widgets can be used as +overlays for fancy effects: just create a palette for them with the +transparent color for the wanted color roles, e.g. Background and +Base, in the Normal and/or Active modes. This way, you can create +see-through QPushButtons etc. diff --git a/examples/opengl/overlay_x11/README.X11-OVERLAYS b/examples/opengl/overlay_x11/README.X11-OVERLAYS new file mode 100644 index 000000000..6029ca3eb --- /dev/null +++ b/examples/opengl/overlay_x11/README.X11-OVERLAYS @@ -0,0 +1,92 @@ + + HOW TO USE X11 OVERLAYS WITH THE QT OPENGL EXTENSION + +X11 overlays is a powerful mechanism that allows one to draw +annotations etc. on top of an image without destroying it, thus saving +significant image rendering time. For more information, consult the +highly recommended book "OpenGL Programming for the X Window System" +(Mark Kilgard, Addison Wesley Developers Press 1996). + +----------------------------------------------------------------------- +UPDATE: From version 5.0 onwards, the Qt OpenGL Extension includes +direct support for use of OpenGL overlays. For many uses of overlays, +this makes the technique described below redundant. See the 'overlay' +example program. The following is a discussion on how to use non-QGL +widgets in overlay planes. +----------------------------------------------------------------------- + +In the typical case, X11 overlays can easily be used together with the +current version of Qt and the Qt OpenGL Extension. The following +retquirements apply: + +1) Your X server and graphics card/hardware must support overlays (of + course). For many X servers, overlay support can be turned on with + a configuration option; consult your X server installation + documentation. + +2) Your X server must (be configured to) use an overlay visual as the + default visual. Most modern X servers do this, since this has the + added advantage that pop-up menus, overlapping windows etc. will + not destroy underlying images in the main plane, saving expensive + redraws. + +3) The best (deepest) visual for OpenGL rendering is in the main + plane. This is the normal case. Typically, X servers that support + overlays provide a 24 bit deep TrueColor visuals in the main plane, + and an 8 bit PseudoColor (default) visual in the overlay plane. + +The provided example program "overlayrubber" will check for all this +and tell you what is wrong, if anything. See "About X11 Visuals" below +for more information. + + +How it works: +------------- + +Given the above, a QGLWidget will by default use the main plane +visual, while all other widgets will use the overlay visual. Thus, one +can place a normal widget on top of the QGLWidget, and do drawing in +it, without destroying the image in the OpenGL window. In other words, +one can use all the drawing capabilities of QPainter to draw the +annotations, rubberbands, whatever. For the typical use of overlays, +this is much easier than using OpenGL for rendering the annotations. + +An overlay plane has a specific color called the transparent +color. Pixels drawn in this color will not be visible, instead the +underlying OpenGL image will show through. In the example program +"overlayrubber", the file main.cpp contains a routine that returns a +QColor containing the transparent color. For the overlay widget, one +will typically want to set the background color to the transparent +color, so that the OpenGL image shows through except where explicitly +overpainted. + +Note: To use this technique, you must not use the "ManyColor" or +"TrueColor" ColorSpec for the QApplication, because this will force +the normal Qt widgets to use a TrueColor visual, which will typically +be in the main plane, not in the overlay plane as desired. + + + +About X11 visuals: +------------------ + +The utilities directory contains two small programs that can help you +determine the capabilities of your X server. These programs are from +the OpenGL book mentioned above, see utilities/NOTICE for copyright +information. The full set of example programs from this book is +available at ftp://ftp.sgi.com/pub/opengl/opengl_for_x/ + +"glxvisuals" will list all the GL-capable visuals the X server provides, +together with the depth and other GL-specific information for +each. Note especially the column "lvl"; a number in this column means +the visual is in an overlay plane. + +"sovinfo" will list all available visuals, and provides special +transparency information for overlay visuals. + +The overlayrubber example program will output what visual is used for +the normal Qt widgets, and what visual is used by the QGLWidget. + + + +Comments are welcome at info@trolltech.com. diff --git a/examples/opengl/overlay_x11/gearwidget.cpp b/examples/opengl/overlay_x11/gearwidget.cpp new file mode 100644 index 000000000..4d717f27e --- /dev/null +++ b/examples/opengl/overlay_x11/gearwidget.cpp @@ -0,0 +1,268 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// A TQt OpenGL widget that draws a gear. +// +// Portions of this code has been borrowed from Brian Paul's Mesa +// distribution. +// + +#include "gearwidget.h" +#include <math.h> +#if defined(Q_WS_X11) +#include <X11/Xlib.h> +#endif + +#if defined(Q_CC_MSVC) +#pragma warning(disable:4305) // init: truncation from const double to float +#endif + +/* + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth ) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat angle, da; + GLfloat u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth/2.0; + r2 = outer_radius + tooth_depth/2.0; + + const double pi = 3.14159264; + da = 2.0*pi / teeth / 4.0; + + glShadeModel( GL_FLAT ); + + glNormal3f( 0.0, 0.0, 1.0 ); + + /* draw front face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + /* draw front sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*pi / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + + glNormal3f( 0.0, 0.0, -1.0 ); + + /* draw back face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*pi / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + } + glEnd(); + + + /* draw outward faces of teeth */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<teeth;i++) { + angle = i * 2.0*pi / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + u = r2*cos(angle+da) - r1*cos(angle); + v = r2*sin(angle+da) - r1*sin(angle); + len = sqrt( u*u + v*v ); + u /= len; + v /= len; + glNormal3f( v, -u, 0.0 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + u = r1*cos(angle+3*da) - r2*cos(angle+2*da); + v = r1*sin(angle+3*da) - r2*sin(angle+2*da); + glNormal3f( v, -u, 0.0 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + } + + glVertex3f( r1*cos(0.0), r1*sin(0.0), width*0.5 ); + glVertex3f( r1*cos(0.0), r1*sin(0.0), -width*0.5 ); + + glEnd(); + + + glShadeModel( GL_SMOOTH ); + + /* draw inside radius cylinder */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*pi / teeth; + glNormal3f( -cos(angle), -sin(angle), 0.0 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + } + glEnd(); + +} + + +static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0; +static GLint gear1, gear2, gear3; +static GLfloat angle = 0.0; + + +static void draw() +{ + angle += 2.0; + view_roty += 1.0; + + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glPushMatrix(); + glRotatef( view_rotx, 1.0, 0.0, 0.0 ); + glRotatef( view_roty, 0.0, 1.0, 0.0 ); + glRotatef( view_rotz, 0.0, 0.0, 1.0 ); + + glPushMatrix(); + glTranslatef( -3.0, -2.0, 0.0 ); + glRotatef( angle, 0.0, 0.0, 1.0 ); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( 3.1, -2.0, 0.0 ); + glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 ); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( -3.1, 2.2, -1.8 ); + glRotatef( 90.0, 1.0, 0.0, 0.0 ); + glRotatef( 2.0*angle-2.0, 0.0, 0.0, 1.0 ); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); +} + + + +GearWidget::GearWidget( TQWidget *parent, const char *name ) + : TQGLWidget( parent, name ) +{ +} + +void GearWidget::initializeGL() +{ + static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 }; + static GLfloat redgear[4] = {0.8, 0.1, 0.0, 1.0 }; + static GLfloat greengear[4] = {0.0, 0.8, 0.2, 1.0 }; + static GLfloat bluegear[4] = {0.2, 0.2, 1.0, 1.0 }; + + glLightfv( GL_LIGHT0, GL_POSITION, pos ); + glEnable( GL_CULL_FACE ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_DEPTH_TEST ); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, redgear ); + gear( 1.0, 4.0, 1.0, 20, 0.7 ); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, greengear ); + gear( 0.5, 2.0, 2.0, 10, 0.7 ); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bluegear ); + gear( 1.3, 2.0, 0.5, 10, 0.7 ); + glEndList(); + + glEnable( GL_NORMALIZE ); +} + + +void GearWidget::resizeGL( int width, int height ) +{ + GLfloat w = (float) width / (float) height; + GLfloat h = 1.0; + + glViewport( 0, 0, width, height ); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum( -w, w, -h, h, 5.0, 60.0 ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -40.0 ); +} + + +void GearWidget::paintGL() +{ + qDebug( "GearWidget: Doing GL rendering." ); +#if defined (Q_GLX) + static bool doneIt = FALSE; + if ( !doneIt ) { + doneIt = TRUE; + // Print out the Visual ID. Access to this will be made + // simpler in future versions of TQt! + XWindowAttributes a; + XGetWindowAttributes( x11Display(), winId(), &a ); + qDebug( "TQGLWidget: using Visual ID: 0x%x.", + (int)XVisualIDFromVisual( a.visual ) ); + } +#endif + draw(); +} + diff --git a/examples/opengl/overlay_x11/gearwidget.h b/examples/opengl/overlay_x11/gearwidget.h new file mode 100644 index 000000000..6154e36da --- /dev/null +++ b/examples/opengl/overlay_x11/gearwidget.h @@ -0,0 +1,29 @@ +/**************************************************************************** +** +** Definition of a simple TQt OpenGL widget +** +** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef GEAR_H +#define GEAR_H + +#include <qgl.h> + +class GearWidget : public TQGLWidget +{ +public: + GearWidget( TQWidget *parent=0, const char *name=0 ); + +protected: + void initializeGL(); + void resizeGL( int, int ); + void paintGL(); +}; + + +#endif diff --git a/examples/opengl/overlay_x11/main.cpp b/examples/opengl/overlay_x11/main.cpp new file mode 100644 index 000000000..70a6f4362 --- /dev/null +++ b/examples/opengl/overlay_x11/main.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Example application showing how to use TQt and TQt OpenGL Extension on an +** X11 overlay visual +** +** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "gearwidget.h" +#include "rubberbandwidget.h" + +#if defined(Q_WS_X11) +#include <X11/Xlib.h> +#endif + +TQColor findOverlayTransparentColor() +{ + TQColor invalidColor; + +#if defined(Q_WS_X11) + + Display* appDisplay; + Visual* appVisual; + + // The static methods are called 'App' in TQt 2.x +#if QT_VERSION < 200 + appDisplay = TQPaintDevice::x__Display(); + appVisual = (Visual*)TQPaintDevice::x11Visual(); +#else + appDisplay = TQPaintDevice::x11AppDisplay(); + appVisual = (Visual*)TQPaintDevice::x11AppVisual(); +#endif + + qDebug( "Default Visual ID: 0x%x", (int)XVisualIDFromVisual(appVisual) ); + + typedef struct OverlayProp { + long visual; + long type; + long value; + long layer; + } OverlayProp; + + TQWidget* rootWin = TQApplication::desktop(); + if ( !rootWin ) + return invalidColor; // Should not happen + + Atom overlayVisualsAtom = XInternAtom( appDisplay, + "SERVER_OVERLAY_VISUALS", True ); + if ( overlayVisualsAtom == None ) { + warning( "Server has no overlay visuals" ); + return invalidColor; + } + + Atom actualType; + int actualFormat; + ulong nItems; + ulong bytesAfter; + OverlayProp* overlayProp; + int res = XGetWindowProperty( appDisplay, TQApplication::desktop()->winId(), + overlayVisualsAtom, 0, 10000, False, + overlayVisualsAtom, &actualType, + &actualFormat, &nItems, &bytesAfter, + (uchar**)&overlayProp ); + + if ( res != Success || actualType != overlayVisualsAtom + || actualFormat != 32 || nItems < 4 ) { + warning( "Failed to get overlay visual property from server" ); + return invalidColor; + } + + + for ( uint i = 0; i < nItems/4; i++ ) { + if ( (VisualID)overlayProp[i].visual == XVisualIDFromVisual(appVisual) + && overlayProp[i].type == 1 ) + return TQColor( qRgb( 1, 2, 3 ), overlayProp[i].value ); + } + + qWarning( "Default visual is not in overlay plane" ); + return invalidColor; + +#else // defined(Q_WS_X11) + qWarning( "Wrong window system - Only X11 has overlay support." ); + return invalidColor; +#endif +} + + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a( argc, argv ); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + TQColor transparentColor = findOverlayTransparentColor(); + if ( !transparentColor.isValid() ) { + qWarning( "Failed to get transparent color for overlay. Exiting." ); + return -1; + } + + TQWidget top; + a.setMainWidget( &top ); + top.setGeometry( 50, 50, 600, 400 ); + + // Make an OpenGL widget. It will use the deepest visual available + // (typically a TrueColor visual), which typically is in the normal layer. + GearWidget g( &top ); + g.setGeometry( 20, 20, 560, 360 ); + + // Put the rubberband widget (which uses the default, i.e. overlay visual) + // on top of the OpenGL widget: + RubberbandWidget r( transparentColor, &top ); + r.setGeometry( 20, 20, 560, 360 ); + + top.show(); + return a.exec(); +} diff --git a/examples/opengl/overlay_x11/overlay_x11.doc b/examples/opengl/overlay_x11/overlay_x11.doc new file mode 100644 index 000000000..6dddc9b9b --- /dev/null +++ b/examples/opengl/overlay_x11/overlay_x11.doc @@ -0,0 +1,82 @@ +/*! \page opengl-overlay-x11-example.html + + \ingroup opengl-examples + \title OpenGL Overlay X11 Example + +\warning From version 5.0 onwards, the Qt OpenGL Extension includes +direct support for use of OpenGL overlays. For many uses of overlays, +this makes the technique described below redundant. See the \link +opengl-overlay-example.html overlay\endlink example program. The +following is a discussion on how to use non-QGL widgets in overlay +planes. + +Overlayrubber: An example program showing how to use Qt and Qt OpenGL +Extension with X11 overlay visuals. + +See \c{$QTDIR/examples/opengl/overlay_x11} for the source code. + +Background information for this example can be found in the +information on \link opengl-x11-overlays.html overlays\endlink. + +The example program has three main parts: + +\list 1 +\i \e GearWidget - a normal, simple QGLWidget. This renders the usual +gears. It has been modified to print a debug message every time it +redraws (renders) itself. Thus, you can easily confirm that drawing in +the overlay plane does not cause redrawings in the main plane where +the QGLWidget resides. + +\i \e RubberbandWidget - Very simple standard (non-GL) Qt widget that +implements rubberband drawing. Designed for use in an overlay plane. +It takes the plane's transparent color as a constructor argument and +uses that for its background color. Thus, the widget itself will be +invisible, only the rubberbands it draws will be visible. + +\i \e{main.cpp} Creates a GearWidget and a Rubberbandwidget and puts the +latter on top of the former. Contains a routine that checks that the +default visual is in an overlay plane, and returns the transparent +color of that plane. +\endlist + +\section1 Running the Example + +Start the \c overlayrubber executable. Click and drag with the left +mouse button to see rubberband drawing. Observe that the QGLWidget +does not redraw itself (no redraw debug messages are output), and yet +the image is not destroyed. Marvel at the coolness of X11 overlays! + + +\section1 Using this technique in a real application + +For clarity, this example program has been kept very simple. Here are +some hints for real application usage: + +\list + +\i \e{All normal widgets are in the overlay plane.} This means that you +can put all kinds of Qt widgets (your own or standard Qt widgets) on +top of the OpenGL image (widget), e.g. pushbuttons etc., and they can +be moved, resized, or removed without destroying the OpenGL image. + +\i \e{Using with geometry management.} The QLayout classes don't permit +putting one widget (the overlay) on top of another (the OpenGL +widget); that would defy the whole purpose of the automatic layout. +The solution is to add just one of them to the QLayout object. Have it +keep a pointer to the other (i.e. the QGLWidget knows about its +overlay widget or vice versa). Implement the resizeEvent() method of +the widget you put in the layout, and make it call setGeometry() on +the other widget with its own geometry as parameters, thus keeping the +two widgets' geometries synchronized. + +\i \e{Using together with QPalette and QColorGroup.} Instead of the +simplistic setBackgroundColor( transparentColor ), you can +use Qt's QPalette system to make your overlay widgets use +transparent color for what you want. This way, the normal Qt widgets +can be used as overlays for fancy effects. Just create a palette for +them with the transparent color for the relevant color roles, e.g. +Background and Base, in the Normal and/or Active modes. This way, you +can create see-through QPushButtons etc. +\endlist + +*/ diff --git a/examples/opengl/overlay_x11/overlayrubber.pro b/examples/opengl/overlay_x11/overlayrubber.pro new file mode 100644 index 000000000..5381ebb2e --- /dev/null +++ b/examples/opengl/overlay_x11/overlayrubber.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = overlayrubber + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl +DEPENDPATH = ../include + +REQUIRES = opengl full-config + +HEADERS = gearwidget.h \ + rubberbandwidget.h +SOURCES = gearwidget.cpp \ + main.cpp \ + rubberbandwidget.cpp diff --git a/examples/opengl/overlay_x11/rubberbandwidget.cpp b/examples/opengl/overlay_x11/rubberbandwidget.cpp new file mode 100644 index 000000000..5cd5c5654 --- /dev/null +++ b/examples/opengl/overlay_x11/rubberbandwidget.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Implementation of a widget that draws a rubberband. Designed to be used +** in an X11 overlay visual +** +** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "rubberbandwidget.h" +#include <qpainter.h> + + +RubberbandWidget::RubberbandWidget( TQColor transparentColor, TQWidget *parent, + const char *name, WFlags f ) + : TQWidget( parent, name, f ) +{ + setBackgroundColor( transparentColor ); + on = FALSE; +} + + +void RubberbandWidget::mousePressEvent( TQMouseEvent* e ) +{ + p1 = e->pos(); + p2 = p1; + p3 = p1; + on = TRUE; + setMouseTracking( TRUE ); +} + + +void RubberbandWidget::mouseMoveEvent( TQMouseEvent* e ) +{ + if ( on ) { + p2 = e->pos(); + TQPainter p( this ); + // Erase last drawn rubberband: + p.setPen( TQPen( backgroundColor(), 3 ) ); + p.drawRect( TQRect( p1, p3 ) ); + // Draw the new one: + p.setPen( TQPen( white, 3 ) ); + p.drawRect( TQRect(p1, p2) ); + p3 = p2; + } +} + +void RubberbandWidget::mouseReleaseEvent( TQMouseEvent* ) +{ + if ( on ) { + TQPainter p ( this ); + p.eraseRect( rect() ); + } + on = FALSE; + setMouseTracking( FALSE ); +} diff --git a/examples/opengl/overlay_x11/rubberbandwidget.h b/examples/opengl/overlay_x11/rubberbandwidget.h new file mode 100644 index 000000000..10513a6d6 --- /dev/null +++ b/examples/opengl/overlay_x11/rubberbandwidget.h @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Definition of a widget that draws a rubberband. Designed to be used +** in an X11 overlay visual +** +** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef RUBBERBANDWIDGET_H +#define RUBBERBANDWIDGET_H + +#include <qwidget.h> + + +class RubberbandWidget : public TQWidget +{ +public: + RubberbandWidget( TQColor transparentColor, TQWidget *parent=0, + const char *name=0, WFlags f=0 ); + +protected: + void mousePressEvent( TQMouseEvent* e ); + void mouseMoveEvent( TQMouseEvent* e ); + void mouseReleaseEvent( TQMouseEvent* e ); + + TQColor c; + TQPoint p1; + TQPoint p2; + TQPoint p3; + bool on; +}; + +#endif diff --git a/examples/opengl/overlay_x11/utilities/NOTICE b/examples/opengl/overlay_x11/utilities/NOTICE new file mode 100644 index 000000000..4157392b3 --- /dev/null +++ b/examples/opengl/overlay_x11/utilities/NOTICE @@ -0,0 +1,11 @@ + +NOTICE: This source code distribution contains source code contained +in the book "Programming OpenGL for the X Window System" (ISBN: +0-201-48359-9) published by Addison-Wesley. The programs and +associated files contained in the distribution were developed by Mark +J. Kilgard and are Copyright 1994, 1995, 1996 by Mark J. Kilgard +(unless otherwise noted). The programs are not in the public domain, +but they are freely distributable without licensing fees. These +programs are provided without guarantee or warranty expressed or +implied. + diff --git a/examples/opengl/overlay_x11/utilities/README b/examples/opengl/overlay_x11/utilities/README new file mode 100644 index 000000000..d96f3437b --- /dev/null +++ b/examples/opengl/overlay_x11/utilities/README @@ -0,0 +1,22 @@ + +Welcome to the "Programming OpenGL for the X Window System" Xlib-based +example source code. The following table names each example program +directory and what section of the book discusses the example. + +Section Example directory +---------- ------------------ + 1.5 glxsimple + 2.1 glxdino + 2.2.2 glxvisuals + 2.6.1 pixmap2eps + 6.2.3.1 xdevices + 6.2.7 dials + 6.3.4 sovinfo + 6.3.5 layerdemo + +I've tried to make the Makefiles as simple and as portable as +possible. If you find problems with these examples, please report bugs +to mjk@sgi.com + +- Mark Kilgard + diff --git a/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c b/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c new file mode 100644 index 000000000..3c1a21e68 --- /dev/null +++ b/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c @@ -0,0 +1,147 @@ + +/* Copyright (c) Mark J. Kilgard, 1996. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +#include <stdlib.h> +#include <stdio.h> +#include <X11/Xlib.h> +#include <GL/glx.h> + +static char *ClassOf(int c); +static char *Format(int n, int w); + +void +main(int argc, char *argv[]) +{ + Display *dpy; + XVisualInfo match, *visualList, *vi, *visualToTry; + int errorBase, eventBase, major, minor, found; + int glxCapable, bufferSize, level, renderType, doubleBuffer, stereo, + auxBuffers, redSize, greenSize, blueSize, alphaSize, depthSize, + stencilSize, acRedSize, acGreenSize, acBlueSize, acAlphaSize; + + dpy = XOpenDisplay(NULL); + if (!dpy) { + fprintf(stderr, "Could not connect to %s.\n", XDisplayName(NULL)); + exit(1); + } + if (glXQueryExtension(dpy, &errorBase, &eventBase) == False) { + fprintf(stderr, "OpenGL not supported by X server.\n"); + exit(1); + } + + glXQueryVersion(dpy, &major, &minor); + printf("display: %s\n", XDisplayName(NULL)); + printf("using GLX version: %d.%d\n\n", major, minor); + + match.screen = DefaultScreen(dpy); + visualList = XGetVisualInfo(dpy, VisualScreenMask, &match, &found); + + printf(" visual bf lv rg d st r g b a ax dp st accum buffs\n"); + printf(" id dep cl sz l ci b ro sz sz sz sz bf th cl r g b a\n"); + printf("-------------------------------------------------------------\n"); + + visualToTry = NULL; + for(vi = visualList; found > 0; found--, vi++) { + glXGetConfig(dpy, vi, GLX_USE_GL, &glxCapable); + if (glxCapable) { + printf("0x%x %2d %s", vi->visualid, vi->depth, ClassOf(vi->class)); + glXGetConfig(dpy, vi, GLX_BUFFER_SIZE, &bufferSize); + glXGetConfig(dpy, vi, GLX_LEVEL, &level); + glXGetConfig(dpy, vi, GLX_RGBA, &renderType); + glXGetConfig(dpy, vi, GLX_DOUBLEBUFFER, &doubleBuffer); + glXGetConfig(dpy, vi, GLX_STEREO, &stereo); + glXGetConfig(dpy, vi, GLX_AUX_BUFFERS, &auxBuffers); + glXGetConfig(dpy, vi, GLX_RED_SIZE, &redSize); + glXGetConfig(dpy, vi, GLX_GREEN_SIZE, &greenSize); + glXGetConfig(dpy, vi, GLX_BLUE_SIZE, &blueSize); + glXGetConfig(dpy, vi, GLX_ALPHA_SIZE, &alphaSize); + glXGetConfig(dpy, vi, GLX_DEPTH_SIZE, &depthSize); + glXGetConfig(dpy, vi, GLX_STENCIL_SIZE, &stencilSize); + glXGetConfig(dpy, vi, GLX_ACCUM_RED_SIZE, &acRedSize); + glXGetConfig(dpy, vi, GLX_ACCUM_GREEN_SIZE, &acGreenSize); + glXGetConfig(dpy, vi, GLX_ACCUM_BLUE_SIZE, &acBlueSize); + glXGetConfig(dpy, vi, GLX_ACCUM_ALPHA_SIZE, &acAlphaSize); + printf(" %2s %2s %1s %1s %1s ", + Format(bufferSize, 2), Format(level, 2), + renderType ? "r" : "c", + doubleBuffer ? "y" : ".", + stereo ? "y" : "."); + printf("%2s %2s %2s %2s ", + Format(redSize, 2), Format(greenSize, 2), + Format(blueSize, 2), Format(alphaSize, 2)); + printf("%2s %2s %2s %2s %2s %2s %2s", + Format(auxBuffers, 2), Format(depthSize, 2), Format(stencilSize, 2), + Format(acRedSize, 2), Format(acGreenSize, 2), + Format(acBlueSize, 2), Format(acAlphaSize, 2)); + printf("\n"); + visualToTry = vi; + } + } + + if (visualToTry) { + GLXContext context; + Window window; + Colormap colormap; + XSetWindowAttributes swa; + + context = glXCreateContext(dpy, visualToTry, 0, GL_TRUE); + colormap = XCreateColormap(dpy, + RootWindow(dpy, visualToTry->screen), + visualToTry->visual, AllocNone); + swa.colormap = colormap; + swa.border_pixel = 0; + window = XCreateWindow(dpy, RootWindow(dpy, visualToTry->screen), 0, 0, 100, 100, + 0, visualToTry->depth, InputOutput, visualToTry->visual, + CWBorderPixel | CWColormap, &swa); + glXMakeCurrent(dpy, window, context); + printf("\n"); + printf("OpenGL vendor string: %s\n", glGetString(GL_VENDOR)); + printf("OpenGL renderer string: %s\n", glGetString(GL_RENDERER)); + printf("OpenGL version string: %s\n", glGetString(GL_VERSION)); + if (glXIsDirect(dpy, context)) + printf("direct rendering: supported\n"); + printf( "GL extensions: '%s'\n\n", glGetString(GL_EXTENSIONS) ); +#if defined(GLX_VERSION_1_1) + printf( "GLX extensions: '%s'\n\n", glXQueryExtensionsString( dpy, visualToTry->screen ) ); +#endif + + } else + printf("No GLX-capable visuals!\n"); + XFree(visualList); +} + +static char * +ClassOf(int c) +{ + switch (c) { + case StaticGray: return "sg"; + case GrayScale: return "gs"; + case StaticColor: return "sc"; + case PseudoColor: return "pc"; + case TrueColor: return "tc"; + case DirectColor: return "dc"; + default: return "??"; + } +} + +static char * +Format(int n, int w) +{ + static char buffer[256]; + static int bufptr; + char *buf; + + if (bufptr >= sizeof(buffer) - w) + bufptr = 0; + buf = buffer + bufptr; + if (n == 0) + sprintf(buf, "%*s", w, "."); + else + sprintf(buf, "%*d", w, n); + bufptr += w + 1; + return buf; +} diff --git a/examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h b/examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h new file mode 100644 index 000000000..f45423a8d --- /dev/null +++ b/examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h @@ -0,0 +1,54 @@ +#ifndef __sovLayerUtil_h__ +#define __sovLayerUtil_h__ + +/* Copyright (c) Mark J. Kilgard, 1996. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xmd.h> + +/* Transparent type values */ +/* None 0 */ +#define TransparentPixel 1 +#define TransparentMask 2 + +/* layered visual info template flags */ +#define VisualLayerMask 0x200 +#define VisualTransparentType 0x400 +#define VisualTransparentValue 0x800 +#define VisualAllLayerMask 0xFFF + +/* layered visual info structure */ +typedef struct _sovVisualInfo { + XVisualInfo vinfo; + int layer; + int type; + unsigned long value; +} sovVisualInfo; + +/* SERVER_OVERLAY_VISUALS property element */ +typedef struct _sovOverlayInfo { + long overlay_visual; + long transparent_type; + long value; + long layer; +} sovOverlayInfo; + +extern sovVisualInfo *sovGetVisualInfo( + Display *display, + long lvinfo_mask, + sovVisualInfo *lvinfo_template, + int *nitems_return); +extern Status sovMatchVisualInfo( + Display *display, + int screen, + int depth, + int class, + int layer, + sovVisualInfo *lvinfo_return); + +#endif /* __sovLayerUtil_h__ */ diff --git a/examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c b/examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c new file mode 100644 index 000000000..059050c2f --- /dev/null +++ b/examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c @@ -0,0 +1,95 @@ + +/* Copyright (c) Mark J. Kilgard, 1996. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +/* compile: cc -o sovinfo sovinfo.c sovLayerUtil.c -lX11 */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "sovLayerUtil.h" + +int +main(int argc, char *argv[]) +{ + Display *dpy; + char *display_name, *arg, *class; + sovVisualInfo template, *lvinfo; + int nVisuals, i, overlaysOnly = 0; + + display_name = NULL; + for (i = 1; i < argc; i++) { + arg = argv[i]; + if (!strcmp(arg, "-display")) { + if (++i >= argc) { + fprintf(stderr, "sovinfo: missing argument to -display\n"); + exit(1); + } + display_name = argv[i]; + } else if (!strcmp(arg, "-overlays_only")) { + overlaysOnly = 1; + } else { + fprintf(stderr, + "usage: sovinfo [-display dpy] [-overlays_only]\n"); + exit(1); + } + } + dpy = XOpenDisplay(display_name); + if (dpy == NULL) { + fprintf(stderr, "sovinfo: cannot open display %s\n", + XDisplayName(NULL)); + exit(1); + } + lvinfo = sovGetVisualInfo(dpy, 0L, &template, &nVisuals); + for (i = 0; i < nVisuals; i++) { + if (!overlaysOnly || lvinfo[i].layer > 0) { + printf(" Visual ID: 0x%x\n", lvinfo[i].vinfo.visualid); + printf(" screen: %d\n", lvinfo[i].vinfo.screen); + printf(" depth: %d\n", lvinfo[i].vinfo.depth); + switch (lvinfo[i].vinfo.class) { + case StaticGray: + class = "StaticGray"; + break; + case GrayScale: + class = "GrayScale"; + break; + case StaticColor: + class = "StaticColor"; + break; + case PseudoColor: + class = "PseudoColor"; + break; + case TrueColor: + class = "TrueColor"; + break; + case DirectColor: + class = "DirectColor"; + break; + default: + class = "Unknown"; + break; + } + printf(" class: %s\n", class); + switch (lvinfo[i].type) { + case None: + printf(" transparent type: None\n"); + break; + case TransparentPixel: + printf(" transparent type: TransparentPixel\n"); + printf(" pixel value: %d\n", lvinfo[i].value); + break; + case TransparentMask: + printf(" transparent type: TransparentMask\n"); + printf(" transparency mask: %0x%x\n", lvinfo[i].value); + break; + default: + printf(" transparent type: Unknown or invalid\n"); + break; + } + printf(" layer: %d\n", lvinfo[i].layer); + } + } + return 0; +} diff --git a/examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c b/examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c new file mode 100644 index 000000000..8837d06cf --- /dev/null +++ b/examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c @@ -0,0 +1,150 @@ + +/* Copyright (c) Mark J. Kilgard, 1996. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +#include <stdlib.h> +#include "sovLayerUtil.h" + +static Bool layersRead; +static Atom overlayVisualsAtom; +static sovOverlayInfo **overlayInfoPerScreen; +static int *numOverlaysPerScreen; + +sovVisualInfo * +sovGetVisualInfo(Display *display, long lvinfo_mask, + sovVisualInfo *lvinfo_template, int *nitems_return) +{ + XVisualInfo *vinfo; + sovVisualInfo *layerInfo; + Window root; + Status status; + Atom actualType; + unsigned long sizeData, bytesLeft; + int actualFormat, numVisuals, numScreens, count, i, j; + + vinfo = XGetVisualInfo(display, lvinfo_mask & VisualAllMask, + &lvinfo_template->vinfo, nitems_return); + if (vinfo == NULL) + return NULL; + numVisuals = *nitems_return; + if (layersRead == False) { + overlayVisualsAtom = XInternAtom(display, + "SERVER_OVERLAY_VISUALS", True); + if (overlayVisualsAtom != None) { + numScreens = ScreenCount(display); + overlayInfoPerScreen = (sovOverlayInfo **) + malloc(numScreens * sizeof(sovOverlayInfo *)); + numOverlaysPerScreen = (int *) malloc(numScreens * sizeof(int)); + if (overlayInfoPerScreen != NULL && + numOverlaysPerScreen != NULL) { + for (i = 0; i < numScreens; i++) { + root = RootWindow(display, i); + status = XGetWindowProperty(display, root, overlayVisualsAtom, + 0L, (long) 10000, False, overlayVisualsAtom, + &actualType, &actualFormat, + &sizeData, &bytesLeft, + (unsigned char **) &overlayInfoPerScreen[i]); + if (status != Success || + actualType != overlayVisualsAtom || + actualFormat != 32 || sizeData < 4) + numOverlaysPerScreen[i] = 0; + else + numOverlaysPerScreen[i] = sizeData / 4; + } + layersRead = True; + } else { + if (overlayInfoPerScreen != NULL) + free(overlayInfoPerScreen); + if (numOverlaysPerScreen != NULL) + free(numOverlaysPerScreen); + } + } + } + layerInfo = (sovVisualInfo *) + malloc(numVisuals * sizeof(sovVisualInfo)); + if (layerInfo == NULL) { + XFree(vinfo); + return NULL; + } + count = 0; + for (i = 0; i < numVisuals; i++) { + XVisualInfo *pVinfo; + int screen; + sovOverlayInfo *overlayInfo; + + pVinfo = &vinfo[i]; + screen = pVinfo->screen; + overlayInfo = NULL; + if (layersRead) { + for (j = 0; j < numOverlaysPerScreen[screen]; j++) + if (pVinfo->visualid == + overlayInfoPerScreen[screen][j].overlay_visual) { + overlayInfo = &overlayInfoPerScreen[screen][j]; + break; + } + } + if (lvinfo_mask & VisualLayerMask) + if (overlayInfo == NULL) { + if (lvinfo_template->layer != 0) + continue; + } else if (lvinfo_template->layer != overlayInfo->layer) + continue; + if (lvinfo_mask & VisualTransparentType) + if (overlayInfo == NULL) { + if (lvinfo_template->type != None) + continue; + } else if (lvinfo_template->type != + overlayInfo->transparent_type) + continue; + if (lvinfo_mask & VisualTransparentValue) + if (overlayInfo == NULL) + /* non-overlay visuals have no sense of + TransparentValue */ + continue; + else if (lvinfo_template->value != overlayInfo->value) + continue; + layerInfo[count].vinfo = *pVinfo; + if (overlayInfo == NULL) { + layerInfo[count].layer = 0; + layerInfo[count].type = None; + layerInfo[count].value = 0; /* meaningless */ + } else { + layerInfo[count].layer = overlayInfo->layer; + layerInfo[count].type = overlayInfo->transparent_type; + layerInfo[count].value = overlayInfo->value; + } + count++; + } + XFree(vinfo); + *nitems_return = count; + if (count == 0) { + XFree(layerInfo); + return NULL; + } else + return layerInfo; +} + +Status +sovMatchVisualInfo(Display *display, int screen, + int depth, int class, int layer, sovVisualInfo *lvinfo_return) +{ + sovVisualInfo *lvinfo; + sovVisualInfo lvinfoTemplate; + int nitems; + + lvinfoTemplate.vinfo.screen = screen; + lvinfoTemplate.vinfo.depth = depth; + lvinfoTemplate.vinfo.class = class; + lvinfoTemplate.layer = layer; + lvinfo = sovGetVisualInfo(display, + VisualScreenMask|VisualDepthMask|VisualClassMask|VisualLayerMask, + &lvinfoTemplate, &nitems); + if (lvinfo != NULL && nitems > 0) { + *lvinfo_return = *lvinfo; + return 1; + } else + return 0; +} diff --git a/examples/opengl/sharedbox/README b/examples/opengl/sharedbox/README new file mode 100644 index 000000000..4959294d5 --- /dev/null +++ b/examples/opengl/sharedbox/README @@ -0,0 +1,8 @@ + +The shared box example + +This example program is an extension of the "box" example program. + +It demonstrates how to use OpenGL display list sharing with QGLWidgets. + + diff --git a/examples/opengl/sharedbox/glbox.cpp b/examples/opengl/sharedbox/glbox.cpp new file mode 100644 index 000000000..f3ded8888 --- /dev/null +++ b/examples/opengl/sharedbox/glbox.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying a box +** +** The OpenGL code is mostly borrowed from Brian Pauls "spin" example +** in the Mesa distribution +** +****************************************************************************/ + +#include "glbox.h" + +// Initialize static class variables: + +// Shared display list id: +GLuint GLBox::sharedDisplayList = 0; + +// Counter keeping track of number of GLBox instances sharing +// the display list, so that the last instance can delete it: +int GLBox::sharedListUsers = 0; + + +/*! + Create a GLBox widget +*/ + +GLBox::GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget ) + : TQGLWidget( parent, name, shareWidget ) +{ + xRot = yRot = zRot = 0.0; // default object rotation + scale = 1.0; // default object scale + object = 0; + localDisplayList = 0; +} + + +/*! + Set up the OpenGL rendering state. Robustly access shared display list. +*/ + +void GLBox::initializeGL() +{ + // Let OpenGL clear to black + qglClearColor( black ); + + glEnable(GL_DEPTH_TEST); + + if ( sharedListUsers == 0 ) { // No shared list has been made yet + sharedDisplayList = makeObject(); // Make one + object = sharedDisplayList; // Use it + sharedListUsers++; // Keep reference count + qDebug( "GLBox %s created shared display list.", name() ); + } + else { // There is a shared diplay list + if ( isSharing() ) { // Can we access it? + object = sharedDisplayList; // Yes, use it + sharedListUsers++; // Keep reference count + qDebug( "GLBox %s uses shared display list.", name() ); + } + else { + localDisplayList = makeObject(); // No, roll our own + object = localDisplayList; // and use that + qDebug( "GLBox %s uses private display list.", name() ); + } + } +} + + + +/*! + Release allocated resources +*/ + +GLBox::~GLBox() +{ + makeCurrent(); // We're going to do gl calls + if ( localDisplayList != 0 ) { // Did we make our own? + glDeleteLists( localDisplayList, 1 ); // Yes, delete it + qDebug( "GLBox %s deleted private display list.", name() ); + } + else { + sharedListUsers--; // No, we used the shared one; keep refcount + if ( sharedListUsers == 0 ) { // Any sharers left? + glDeleteLists( sharedDisplayList, 1 ); // No, delete it + sharedDisplayList = 0; + qDebug( "GLBox %s deleted shared display list.", name() ); + } + } +} + + +/*! + Paint the box. The actual openGL commands for drawing the box are + performed here. +*/ + +void GLBox::paintGL() +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -3.0 ); + glScalef( scale, scale, scale ); + + glRotatef( xRot, 1.0, 0.0, 0.0 ); + glRotatef( yRot, 0.0, 1.0, 0.0 ); + glRotatef( zRot, 0.0, 0.0, 1.0 ); + + glCallList( object ); +} + + + + +/*! + Set up the OpenGL view port, matrix mode, etc. +*/ + +void GLBox::resizeGL( int w, int h ) +{ + glViewport( 0, 0, (GLint)w, (GLint)h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0); +} + + +/*! + Generate an OpenGL display list for the object to be shown, i.e. the box +*/ + +GLuint GLBox::makeObject() +{ + GLuint list; + + list = glGenLists( 1 ); + + glNewList( list, GL_COMPILE ); + + glBegin(GL_QUADS); + /* Front face */ + qglColor( green ); + glVertex3f(-1.0, 1.0, 1.0); + glVertex3f(1.0, 1.0, 1.0); + glVertex3f(1.0, -1.0, 1.0); + glVertex3f(-1.0, -1.0, 1.0); + /* Back face */ + qglColor( yellow ); + glVertex3f(-1.0, 1.0, -1.0); + glVertex3f(1.0, 1.0, -1.0); + glVertex3f(1.0, -1.0, -1.0); + glVertex3f(-1.0, -1.0, -1.0); + /* Top side face */ + qglColor( blue ); + glVertex3f(-1.0, 1.0, 1.0); + glVertex3f(1.0, 1.0, 1.0); + glVertex3f(1.0, 1.0, -1.0); + glVertex3f(-1.0, 1.0, -1.0); + /* Bottom side face */ + qglColor( red ); + glVertex3f(-1.0, -1.0, 1.0); + glVertex3f(1.0, -1.0, 1.0); + glVertex3f(1.0, -1.0, -1.0); + glVertex3f(-1.0, -1.0, -1.0); + glEnd(); + glEndList(); + + return list; +} + + +/*! + Set the rotation angle of the object to \e degrees around the X axis. +*/ + +void GLBox::setXRotation( int degrees ) +{ + xRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Y axis. +*/ + +void GLBox::setYRotation( int degrees ) +{ + yRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Z axis. +*/ + +void GLBox::setZRotation( int degrees ) +{ + zRot = (GLfloat)(degrees % 360); + updateGL(); +} diff --git a/examples/opengl/sharedbox/glbox.h b/examples/opengl/sharedbox/glbox.h new file mode 100644 index 000000000..089513d33 --- /dev/null +++ b/examples/opengl/sharedbox/glbox.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying a box +** +****************************************************************************/ + +#ifndef GLBOX_H +#define GLBOX_H + +#include <qgl.h> + + +class GLBox : public TQGLWidget +{ + Q_OBJECT + +public: + + GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget=0 ); + ~GLBox(); + +public slots: + + void setXRotation( int degrees ); + void setYRotation( int degrees ); + void setZRotation( int degrees ); + +protected: + + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + virtual GLuint makeObject(); + +private: + + GLuint object; + GLuint localDisplayList; + + static GLuint sharedDisplayList; + static int sharedListUsers; + + GLfloat xRot, yRot, zRot, scale; + +}; + + +#endif // GLBOX_H diff --git a/examples/opengl/sharedbox/globjwin.cpp b/examples/opengl/sharedbox/globjwin.cpp new file mode 100644 index 000000000..f908add4b --- /dev/null +++ b/examples/opengl/sharedbox/globjwin.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qpushbutton.h> +#include <qslider.h> +#include <qlayout.h> +#include <qframe.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qkeycode.h> +#include "globjwin.h" +#include "glbox.h" + + +GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name ) + : TQWidget( parent, name ) +{ + // Create a menu + TQPopupMenu *file = new TQPopupMenu( this ); + file->insertItem( "Delete Left TQGLWidget", this, + SLOT(deleteFirstWidget()) ); + file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + // Create a menu bar + TQMenuBar *m = new TQMenuBar( this ); + m->setSeparator( TQMenuBar::InWindowsStyle ); + m->insertItem("&File", file ); + + // Create nice frames to put around the OpenGL widgets + TQFrame* f1 = new TQFrame( this, "frame1" ); + f1->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + f1->setLineWidth( 2 ); + TQFrame* f2 = new TQFrame( this, "frame2" ); + f2->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + f2->setLineWidth( 2 ); + + // Create an OpenGL widget + c1 = new GLBox( f1, "glbox1" ); + + // Create another OpenGL widget that shares display lists with the first + c2 = new GLBox( f2, "glbox2", c1 ); + + // Create the three sliders; one for each rotation axis + // Make them spin the boxes, but not in synch + TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" ); + x->setTickmarks( TQSlider::Left ); + connect( x, SIGNAL(valueChanged(int)), c1, SLOT(setXRotation(int)) ); + connect( x, SIGNAL(valueChanged(int)), c2, SLOT(setZRotation(int)) ); + + TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" ); + y->setTickmarks( TQSlider::Left ); + connect( y, SIGNAL(valueChanged(int)), c1, SLOT(setYRotation(int)) ); + connect( y, SIGNAL(valueChanged(int)), c2, SLOT(setXRotation(int)) ); + + TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" ); + z->setTickmarks( TQSlider::Left ); + connect( z, SIGNAL(valueChanged(int)), c1, SLOT(setZRotation(int)) ); + connect( z, SIGNAL(valueChanged(int)), c2, SLOT(setYRotation(int)) ); + + + // Now that we have all the widgets, put them into a nice layout + + // Put the sliders on top of each other + TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout"); + vlayout->addWidget( x ); + vlayout->addWidget( y ); + vlayout->addWidget( z ); + + // Put the GL widgets inside the frames + TQHBoxLayout* flayout1 = new TQHBoxLayout( f1, 2, 2, "flayout1"); + flayout1->addWidget( c1, 1 ); + TQHBoxLayout* flayout2 = new TQHBoxLayout( f2, 2, 2, "flayout2"); + flayout2->addWidget( c2, 1 ); + + // Top level layout, puts the sliders to the left of the frame/GL widget + TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout"); + hlayout->setMenuBar( m ); + hlayout->addLayout( vlayout ); + hlayout->addWidget( f1, 1 ); + hlayout->addWidget( f2, 1 ); + +} + + +void GLObjectWindow::deleteFirstWidget() +{ + // Delete only c1; c2 will keep working and use the shared display list + if ( c1 ) { + delete c1; + c1 = 0; + } +} diff --git a/examples/opengl/sharedbox/globjwin.h b/examples/opengl/sharedbox/globjwin.h new file mode 100644 index 000000000..c42f2ea72 --- /dev/null +++ b/examples/opengl/sharedbox/globjwin.h @@ -0,0 +1,39 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** The GLObjectWindow contains a GLBox and three sliders connected to +** the GLBox's rotation slots. +** +****************************************************************************/ + +#ifndef GLOBJWIN_H +#define GLOBJWIN_H + +#include <qwidget.h> +class GLBox; + +class GLObjectWindow : public TQWidget +{ + Q_OBJECT +public: + GLObjectWindow( TQWidget* parent = 0, const char* name = 0 ); + +protected slots: + + void deleteFirstWidget(); + +private: + GLBox* c1; + GLBox* c2; +}; + + +#endif // GLOBJWIN_H diff --git a/examples/opengl/sharedbox/main.cpp b/examples/opengl/sharedbox/main.cpp new file mode 100644 index 000000000..13e474007 --- /dev/null +++ b/examples/opengl/sharedbox/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// TQt OpenGL example: Shared Box +// +// A small example showing how to use OpenGL display list sharing +// +// File: main.cpp +// +// The main() function +// + +#include "globjwin.h" +#include <qapplication.h> +#include <qgl.h> + +/* + The main program is here. +*/ + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a(argc,argv); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + GLObjectWindow w; + w.resize( 550, 350 ); + a.setMainWidget( &w ); + w.show(); + return a.exec(); +} diff --git a/examples/opengl/sharedbox/sharedbox.doc b/examples/opengl/sharedbox/sharedbox.doc new file mode 100644 index 000000000..21e7a66a3 --- /dev/null +++ b/examples/opengl/sharedbox/sharedbox.doc @@ -0,0 +1,16 @@ +/*! \page opengl-sharedbox-example.html + + \ingroup opengl-examples + \title OpenGL Shared Box Example + + +This example program is an extension of the \link +opengl-box-example.html Box example\endlink. + +It demonstrates how to use OpenGL display list sharing with +QGLWidgets. + +See \c{$QTDIR/examples/opengl/sharedbox} for the source code. + +*/ + diff --git a/examples/opengl/sharedbox/sharedbox.pro b/examples/opengl/sharedbox/sharedbox.pro new file mode 100644 index 000000000..30b92e8ca --- /dev/null +++ b/examples/opengl/sharedbox/sharedbox.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = sharedbox + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl +DEPENDPATH = ../include + +REQUIRES = opengl + +HEADERS = glbox.h \ + globjwin.h +SOURCES = glbox.cpp \ + globjwin.cpp \ + main.cpp diff --git a/examples/opengl/texture/README b/examples/opengl/texture/README new file mode 100644 index 000000000..5b85cd719 --- /dev/null +++ b/examples/opengl/texture/README @@ -0,0 +1,4 @@ + +The texture example + +This example program demonstrates how to use OpenGL 2D textures. diff --git a/examples/opengl/texture/gllogo.bmp b/examples/opengl/texture/gllogo.bmp Binary files differnew file mode 100644 index 000000000..ee64a1036 --- /dev/null +++ b/examples/opengl/texture/gllogo.bmp diff --git a/examples/opengl/texture/globjwin.cpp b/examples/opengl/texture/globjwin.cpp new file mode 100644 index 000000000..e46833faf --- /dev/null +++ b/examples/opengl/texture/globjwin.cpp @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qpushbutton.h> +#include <qslider.h> +#include <qlayout.h> +#include <qframe.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qkeycode.h> +#include "globjwin.h" +#include "gltexobj.h" + + +GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name ) + : TQWidget( parent, name ) +{ + + // Create nice frames to put around the OpenGL widgets + TQFrame* f1 = new TQFrame( this, "frame1" ); + f1->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); + f1->setLineWidth( 2 ); + + // Create an OpenGL widget + GLTexobj* c = new GLTexobj( f1, "glbox1"); + + // Create a menu + TQPopupMenu *file = new TQPopupMenu( this ); + file->insertItem( "Toggle Animation", c, SLOT(toggleAnimation()), + CTRL+Key_A ); + file->insertSeparator(); + file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + // Create a menu bar + TQMenuBar *m = new TQMenuBar( this ); + m->setSeparator( TQMenuBar::InWindowsStyle ); + m->insertItem("&File", file ); + + // Create the three sliders; one for each rotation axis + TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" ); + x->setTickmarks( TQSlider::Left ); + connect( x, SIGNAL(valueChanged(int)), c, SLOT(setXRotation(int)) ); + + TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" ); + y->setTickmarks( TQSlider::Left ); + connect( y, SIGNAL(valueChanged(int)), c, SLOT(setYRotation(int)) ); + + TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" ); + z->setTickmarks( TQSlider::Left ); + connect( z, SIGNAL(valueChanged(int)), c, SLOT(setZRotation(int)) ); + + + // Now that we have all the widgets, put them into a nice layout + + // Put the sliders on top of each other + TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout"); + vlayout->addWidget( x ); + vlayout->addWidget( y ); + vlayout->addWidget( z ); + + // Put the GL widget inside the frame + TQHBoxLayout* flayout1 = new TQHBoxLayout( f1, 2, 2, "flayout1"); + flayout1->addWidget( c, 1 ); + + // Top level layout, puts the sliders to the left of the frame/GL widget + TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout"); + hlayout->setMenuBar( m ); + hlayout->addLayout( vlayout ); + hlayout->addWidget( f1, 1 ); + +} diff --git a/examples/opengl/texture/globjwin.h b/examples/opengl/texture/globjwin.h new file mode 100644 index 000000000..98dad489e --- /dev/null +++ b/examples/opengl/texture/globjwin.h @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** The GLObjectWindow contains a GLBox and three sliders connected to +** the GLBox's rotation slots. +** +****************************************************************************/ + +#ifndef GLOBJWIN_H +#define GLOBJWIN_H + +#include <qwidget.h> + + +class GLObjectWindow : public TQWidget +{ + Q_OBJECT +public: + GLObjectWindow( TQWidget* parent = 0, const char* name = 0 ); + +}; + + +#endif // GLOBJWIN_H diff --git a/examples/opengl/texture/gltexobj.cpp b/examples/opengl/texture/gltexobj.cpp new file mode 100644 index 000000000..483a18843 --- /dev/null +++ b/examples/opengl/texture/gltexobj.cpp @@ -0,0 +1,240 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget demonstrating the use of TQImages for textures. +** +** Much of the GL code is inspired by the 'spectex' and 'texcyl' +** public domain demo programs by Brian Paul. +** +****************************************************************************/ + +#include "gltexobj.h" +#include <qimage.h> +#include <qtimer.h> + + +const int redrawWait = 50; + +/*! + Create a GLTexobj widget +*/ + +GLTexobj::GLTexobj( TQWidget* parent, const char* name ) + : TQGLWidget( parent, name ) +{ + xRot = yRot = zRot = 0.0; // default object rotation + scale = 5.0; // default object scale + object = 0; + animation = TRUE; + timer = new TQTimer( this ); + connect( timer, SIGNAL(timeout()), SLOT(update()) ); + timer->start( redrawWait, TRUE ); +} + + +/*! + Release allocated resources +*/ + +GLTexobj::~GLTexobj() +{ + makeCurrent(); + glDeleteLists( object, 1 ); +} + + +/*! + Paint the texobj. The actual openGL commands for drawing the texobj are + performed here. +*/ + +void GLTexobj::paintGL() +{ + if ( animation ) { + xRot += 1.0; + yRot += 2.5; + zRot -= 5.0; + } + glClear( GL_COLOR_BUFFER_BIT ); + glPushMatrix(); + glRotatef( xRot, 1.0, 0.0, 0.0 ); + glRotatef( yRot, 0.0, 1.0, 0.0 ); + glRotatef( zRot, 0.0, 0.0, 1.0 ); + glScalef( scale, scale, scale ); + glCallList( object ); + glPopMatrix(); + + if ( animation ) { + glFlush(); // Make sure everything is drawn before restarting timer + timer->start( redrawWait, TRUE ); // Wait this many msecs before redraw + } +} + + +/*! + Set up the OpenGL rendering state, and define display list +*/ + +void GLTexobj::initializeGL() +{ + // Set up the lights + + GLfloat whiteDir[4] = {2.0, 2.0, 2.0, 1.0}; + GLfloat whiteAmb[4] = {1.0, 1.0, 1.0, 1.0}; + GLfloat lightPos[4] = {30.0, 30.0, 30.0, 1.0}; + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteAmb); + + glMaterialfv(GL_FRONT, GL_DIFFUSE, whiteDir); + glMaterialfv(GL_FRONT, GL_SPECULAR, whiteDir); + glMaterialf(GL_FRONT, GL_SHININESS, 20.0); + + glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDir); // enable diffuse + glLightfv(GL_LIGHT0, GL_SPECULAR, whiteDir); // enable specular + glLightfv(GL_LIGHT0, GL_POSITION, lightPos); + + // Set up the textures + + TQImage tex1, tex2, buf; + + if ( !buf.load( "gllogo.bmp" ) ) { // Load first image from file + qWarning( "Could not read image file, using single-color instead." ); + TQImage dummy( 128, 128, 32 ); + dummy.fill( TQt::green.rgb() ); + buf = dummy; + } + tex1 = TQGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA + + if ( !buf.load( "qtlogo.bmp" ) ) { // Load first image from file + qWarning( "Could not read image file, using single-color instead." ); + TQImage dummy( 128, 128, 32 ); + dummy.fill( TQt::red.rgb() ); + buf = dummy; + } + tex2 = TQGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA + + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glEnable( GL_TEXTURE_2D ); + + // Set up various other stuff + + glClearColor( 0.0, 0.0, 0.0, 0.0 ); // Let OpenGL clear to black + glEnable( GL_CULL_FACE ); // don't need Z testing for convex objects + glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); + + // Make the object display list + + object = makeObject( tex1, tex2 ); // Generate an OpenGL display list +} + + + +/*! + Set up the OpenGL view port, matrix mode, etc. +*/ + +void GLTexobj::resizeGL( int w, int h ) +{ + glViewport( 0, 0, w, h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 ); + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -70.0 ); +} + + +/*! + Generate an OpenGL display list for the object to be shown, i.e. the texobj +*/ + +GLuint GLTexobj::makeObject( const TQImage& tex1, const TQImage& tex2 ) +{ + GLUquadricObj* q = gluNewQuadric(); + GLuint cylinderObj = glGenLists(1); + glNewList( cylinderObj, GL_COMPILE ); + + glTranslatef( 0.0, 0.0, -1.0 ); + + // cylinder + glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() ); + gluQuadricTexture( q, GL_TRUE ); + gluCylinder(q, 0.6, 0.6, 2.0, 24, 1); + + // end cap + glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2.width(), tex2.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, tex2.bits() ); + glTranslatef( 0.0, 0.0, 2.0 ); + gluDisk( q, 0.0, 0.6, 24, 1 ); + + // other end cap + glTranslatef( 0.0, 0.0, -2.0 ); + gluQuadricOrientation( q, (GLenum)GLU_INSIDE ); + gluDisk( q, 0.0, 0.6, 24, 1 ); + + glEndList(); + gluDeleteQuadric( q ); + + return cylinderObj; +} + + +/*! + Set the rotation angle of the object to \e degrees around the X axis. +*/ + +void GLTexobj::setXRotation( int degrees ) +{ + xRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Y axis. +*/ + +void GLTexobj::setYRotation( int degrees ) +{ + yRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Set the rotation angle of the object to \e degrees around the Z axis. +*/ + +void GLTexobj::setZRotation( int degrees ) +{ + zRot = (GLfloat)(degrees % 360); + updateGL(); +} + + +/*! + Turns animation on or off +*/ + +void GLTexobj::toggleAnimation() +{ + animation = !animation; + if ( animation ) + updateGL(); + else + timer->stop(); +} diff --git a/examples/opengl/texture/gltexobj.h b/examples/opengl/texture/gltexobj.h new file mode 100644 index 000000000..9fa368376 --- /dev/null +++ b/examples/opengl/texture/gltexobj.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +/**************************************************************************** +** +** This is a simple TQGLWidget displaying an openGL wireframe box +** +****************************************************************************/ + +#ifndef GLTEXOBJ_H +#define GLTEXOBJ_H + +#include <qgl.h> + + +class GLTexobj : public TQGLWidget +{ + Q_OBJECT + +public: + + GLTexobj( TQWidget* parent, const char* name ); + ~GLTexobj(); + +public slots: + + void setXRotation( int degrees ); + void setYRotation( int degrees ); + void setZRotation( int degrees ); + void toggleAnimation(); + +protected: + + void initializeGL(); + void paintGL(); + void resizeGL( int w, int h ); + + virtual GLuint makeObject( const TQImage& tex1, const TQImage& tex2 ); + +private: + bool animation; + GLuint object; + GLfloat xRot, yRot, zRot, scale; + TQTimer* timer; +}; + + +#endif // GLTEXOBJ_H diff --git a/examples/opengl/texture/main.cpp b/examples/opengl/texture/main.cpp new file mode 100644 index 000000000..4798bc16d --- /dev/null +++ b/examples/opengl/texture/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// TQt OpenGL example: Texture +// +// File: main.cpp +// +// The main() function +// + +#include "globjwin.h" +#include <qapplication.h> +#include <qgl.h> + +/* + The main program is here. +*/ + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a(argc,argv); + + if ( !TQGLFormat::hasOpenGL() ) { + qWarning( "This system has no OpenGL support. Exiting." ); + return -1; + } + + GLObjectWindow* w = new GLObjectWindow; + w->resize( 400, 350 ); + a.setMainWidget( w ); + w->show(); + int result = a.exec(); + delete w; + return result; +} diff --git a/examples/opengl/texture/qtlogo.bmp b/examples/opengl/texture/qtlogo.bmp Binary files differnew file mode 100644 index 000000000..b7f9215d9 --- /dev/null +++ b/examples/opengl/texture/qtlogo.bmp diff --git a/examples/opengl/texture/texture.doc b/examples/opengl/texture/texture.doc new file mode 100644 index 000000000..28f1d3fbd --- /dev/null +++ b/examples/opengl/texture/texture.doc @@ -0,0 +1,10 @@ +/*! \page opengl-texture-example.html + + \ingroup opengl-examples + \title OpenGL Texture Example + +This example program demonstrates how to use OpenGL 2D textures. + +See \c{$QTDIR/examples/opengl/texture} for the source code. + +*/ diff --git a/examples/opengl/texture/texture.pro b/examples/opengl/texture/texture.pro new file mode 100644 index 000000000..a9a31b8ee --- /dev/null +++ b/examples/opengl/texture/texture.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = texture + +CONFIG += qt opengl warn_on release +CONFIG -= dlopen_opengl +DEPENDPATH = ../include + +REQUIRES = opengl + +HEADERS = gltexobj.h \ + globjwin.h +SOURCES = gltexobj.cpp \ + globjwin.cpp \ + main.cpp diff --git a/examples/picture/README b/examples/picture/README new file mode 100644 index 000000000..84373a468 --- /dev/null +++ b/examples/picture/README @@ -0,0 +1,5 @@ +This program demonstrates how to record, save, load and replay a +picture. + +Run picture to record car.pic, then run it again to replay it. + diff --git a/examples/picture/car_orig.pic b/examples/picture/car_orig.pic Binary files differnew file mode 100644 index 000000000..a0141b753 --- /dev/null +++ b/examples/picture/car_orig.pic diff --git a/examples/picture/flag.bmp b/examples/picture/flag.bmp Binary files differnew file mode 100644 index 000000000..04fc3e46e --- /dev/null +++ b/examples/picture/flag.bmp diff --git a/examples/picture/picture.cpp b/examples/picture/picture.cpp new file mode 100644 index 000000000..44420d084 --- /dev/null +++ b/examples/picture/picture.cpp @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qpainter.h> +#include <qpicture.h> +#include <qpixmap.h> +#include <qwidget.h> +#include <qmessagebox.h> +#include <qfile.h> +#include <ctype.h> + + +void paintCar( TQPainter *p ) // paint a car +{ + TQPointArray a; + TQBrush brush( TQt::yellow, TQt::SolidPattern ); + p->setBrush( brush ); // use solid, yellow brush + + a.setPoints( 5, 50,50, 350,50, 450,120, 450,250, 50,250 ); + p->drawPolygon( a ); // draw car body + + TQFont f( "courier", 12, TQFont::Bold ); + p->setFont( f ); + + TQColor windowColor( 120, 120, 255 ); // a light blue color + brush.setColor( windowColor ); // set this brush color + p->setBrush( brush ); // set brush + p->drawRect( 80, 80, 250, 70 ); // car window + p->drawText( 180, 80, 150, 70, TQt::AlignCenter, "-- TQt --\nTrolltech AS" ); + + TQPixmap pixmap; + if ( pixmap.load("flag.bmp") ) // load and draw image + p->drawPixmap( 100, 85, pixmap ); + + p->setBackgroundMode( TQt::OpaqueMode ); // set opaque mode + p->setBrush( TQt::DiagCrossPattern ); // black diagonal cross pattern + p->drawEllipse( 90, 210, 80, 80 ); // back wheel + p->setBrush( TQt::CrossPattern ); // black cross fill pattern + p->drawEllipse( 310, 210, 80, 80 ); // front wheel +} + + +class PictureDisplay : public TQWidget // picture display widget +{ +public: + PictureDisplay( const char *fileName ); + ~PictureDisplay(); +protected: + void paintEvent( TQPaintEvent * ); + void keyPressEvent( TQKeyEvent * ); +private: + TQPicture *pict; + TQString name; +}; + +PictureDisplay::PictureDisplay( const char *fileName ) +{ + pict = new TQPicture; + name = fileName; + if ( !pict->load(fileName) ) { // cannot load picture + delete pict; + pict = 0; + name.sprintf( "Not able to load picture: %s", fileName ); + } +} + +PictureDisplay::~PictureDisplay() +{ + delete pict; +} + +void PictureDisplay::paintEvent( TQPaintEvent * ) +{ + TQPainter paint( this ); // paint widget + if ( pict ) + paint.drawPicture( *pict ); // draw picture + else + paint.drawText( rect(), AlignCenter, name ); +} + +void PictureDisplay::keyPressEvent( TQKeyEvent *k ) +{ + switch ( tolower(k->ascii()) ) { + case 'r': // reload + pict->load( name ); + update(); + break; + case 'q': // tquit + TQApplication::exit(); + break; + } +} + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); // TQApplication retquired! + + const char *fileName = "car.pic"; // default picture file name + + if ( argc == 2 ) // use argument as file name + fileName = argv[1]; + + if ( !TQFile::exists(fileName) ) { + TQPicture pict; // our picture + TQPainter paint; // our painter + + paint.begin( &pict ); // begin painting onto picture + paintCar( &paint ); // paint! + paint.end(); // painting done + + pict.save( fileName ); // save picture + TQMessageBox::information(0, "TQt Example - Picture", "Saved. Run me again!"); + return 0; + } else { + PictureDisplay test( fileName ); // create picture display + a.setMainWidget( &test); // set main widget + test.setCaption("TQt Example - Picture"); + test.show(); // show it + + return a.exec(); // start event loop + } +} diff --git a/examples/picture/picture.doc b/examples/picture/picture.doc new file mode 100644 index 000000000..fa4d25711 --- /dev/null +++ b/examples/picture/picture.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page picture-example.html + + \ingroup examples + \title Picture + + This example shows how to make a picture, store it to a file, and read it as + a set of drawing commands. + + <hr> + + Implementation: + + \include picture/picture.cpp +*/ + diff --git a/examples/picture/picture.pro b/examples/picture/picture.pro new file mode 100644 index 000000000..39e64b750 --- /dev/null +++ b/examples/picture/picture.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = picture + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = picture.cpp diff --git a/examples/popup/README b/examples/popup/README new file mode 100644 index 000000000..3be117bb2 --- /dev/null +++ b/examples/popup/README @@ -0,0 +1,3 @@ +The popup program demonstrates some easy techniques for creating custom +popup widgets like a fancy color or line-width selection for the +toolbar of a drawing program or a browsebox for various symbols or ... diff --git a/examples/popup/popup.cpp b/examples/popup/popup.cpp new file mode 100644 index 000000000..9a13fc8f9 --- /dev/null +++ b/examples/popup/popup.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "popup.h" +#include <qapplication.h> +#include <qlayout.h> + +FancyPopup::FancyPopup( TQWidget* parent, const char* name ): + TQLabel( parent, name, WType_Popup ){ + setFrameStyle( WinPanel|Raised ); + setAlignment( AlignCenter ); + resize(150,100); + moves = 0; + setMouseTracking( TRUE ); +} + +void FancyPopup::mouseMoveEvent( TQMouseEvent * e){ + moves++; + TQString s; + s.sprintf("%d/%d", e->pos().x(), e->pos().y()); + if (e->state() & TQMouseEvent::LeftButton) + s += " (down)"; + setText(s); +} + +void FancyPopup::mouseReleaseEvent( TQMouseEvent * e){ + if (rect().contains( e->pos() ) || moves > 5) + close(); +} + +void FancyPopup::closeEvent( TQCloseEvent *e ){ + e->accept(); + moves = 0; + if (!popupParent) + return; + + // remember that we (as a popup) might recieve the mouse release + // event instead of the popupParent. This is due to the fact that + // the popupParent popped us up in its mousePressEvent handler. To + // avoid the button remaining in pressed state we simply send a + // faked mouse button release event to it. + TQMouseEvent me( TQEvent::MouseButtonRelease, TQPoint(0,0), TQPoint(0,0), TQMouseEvent::LeftButton, TQMouseEvent::NoButton); + TQApplication::sendEvent( popupParent, &me ); +} + +void FancyPopup::popup( TQWidget* parent) { + popupParent = parent; + setText("Move the mouse!"); + if (popupParent) + move( popupParent->mapToGlobal( popupParent->rect().bottomLeft() ) ); + show(); +} + + + + + + +Frame::Frame(TQWidget* parent, const char* name): TQFrame(parent, name){ + button1 = new TQPushButton("Simple Popup", this); + connect ( button1, SIGNAL( clicked() ), SLOT( button1Clicked() ) ); + button2 = new TQPushButton("Fancy Popup", this); + connect ( button2, SIGNAL( pressed() ), SLOT( button2Pressed() ) ); + + TQBoxLayout * l = new TQHBoxLayout( this ); + button1->setMaximumSize(button1->sizeHint()); + button2->setMaximumSize(button2->sizeHint()); + l->addWidget( button1 ); + l->addWidget( button2 ); + l->activate(); + +// button1->setGeometry(20,20,100,30); +// button2->setGeometry(140,20,100,30); + resize(270, 70); + + //create a very simple popup: it is just composed with other + //widget and will be shown after clicking on button1 + + popup1 = new TQFrame( this ,0, WType_Popup); + popup1->setFrameStyle( WinPanel|Raised ); + popup1->resize(150,100); + TQLineEdit *tmpE = new TQLineEdit( popup1 ); + connect( tmpE, SIGNAL( returnPressed() ), popup1, SLOT( hide() ) ); + tmpE->setGeometry(10,10, 130, 30); + tmpE->setFocus(); + TQPushButton *tmpB = new TQPushButton("Click me!", popup1); + connect( tmpB, SIGNAL( clicked() ), popup1, SLOT( close() ) ); + tmpB->setGeometry(10, 50, 130, 30); + + // the fancier version uses its own class. It will be shown when + // pressing button2, so they behavior is more like a modern menu + // or toolbar. + + popup2 = new FancyPopup( this ); + + // you might also add new widgets to the popup, just like you do + // it with any other widget. The next four lines (if not + // commented out) will for instance add a line edit widget. + +// tmpE = new TQLineEdit( popup2 ); +// tmpE->setFocus(); +// connect( tmpE, SIGNAL( returnPressed() ), popup2, SLOT( close() ) ); +// tmpE->setGeometry(10, 10, 130, 30); +} + + +void Frame::button1Clicked(){ + popup1->move( mapToGlobal( button1->geometry().bottomLeft() ) ); + popup1->show(); +} + +void Frame::button2Pressed(){ + popup2->popup(button2); +} + + +int main( int argc, char **argv ) +{ + TQApplication a(argc,argv); + + Frame frame; + frame.setCaption("TQt Example - Custom Popups"); + a.setMainWidget(&frame); + frame.show(); + return a.exec(); +} diff --git a/examples/popup/popup.doc b/examples/popup/popup.doc new file mode 100644 index 000000000..1322fbd5a --- /dev/null +++ b/examples/popup/popup.doc @@ -0,0 +1,23 @@ +/* +*/ +/*! \page popup-example.html + + \ingroup examples + \title Popup Widgets + + This example shows how to implement widgets that should + pop up. + + <hr> + + Header file: + + \include popup/popup.h + + <hr> + + Implementation: + + \include popup/popup.cpp +*/ + diff --git a/examples/popup/popup.h b/examples/popup/popup.h new file mode 100644 index 000000000..ef4e8b282 --- /dev/null +++ b/examples/popup/popup.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Definition of something or other +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef POPUP_H +#define POPUP_H +#include <qlabel.h> +#include <qpushbutton.h> +#include <qlineedit.h> + +class FancyPopup : public TQLabel +{ + Q_OBJECT +public: + FancyPopup( TQWidget* parent = 0, const char* name=0); + + void popup( TQWidget* parent = 0); +protected: + virtual void mouseMoveEvent( TQMouseEvent * ); + virtual void mouseReleaseEvent( TQMouseEvent * ); + virtual void closeEvent( TQCloseEvent * ); + +private: + TQWidget* popupParent; + int moves; +}; + + + class Frame : public TQFrame + { + Q_OBJECT + public: + Frame( TQWidget *parent=0, const char* name=0); + + protected: + + private slots: + void button1Clicked(); + void button2Pressed(); + + private: + TQPushButton *button1; + TQPushButton *button2; + + TQFrame* popup1; + FancyPopup* popup2; + }; + +#endif diff --git a/examples/popup/popup.pro b/examples/popup/popup.pro new file mode 100644 index 000000000..9a77d8e8c --- /dev/null +++ b/examples/popup/popup.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = popup + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = popup.h +SOURCES = popup.cpp diff --git a/examples/process/README b/examples/process/README new file mode 100644 index 000000000..55a2d02f3 --- /dev/null +++ b/examples/process/README @@ -0,0 +1,8 @@ +The process example is not particularly useful, but it shows a typical +use of the class QProcess. + +This example starts the uic command with some options and displays the +output of the uic call. The uic is a command line tool that is used if you +create dialogs with the Qt Designer. If you installed Qt correctly, it +should be available on your system. It outputs the generated code to +standard output by default. diff --git a/examples/process/process.cpp b/examples/process/process.cpp new file mode 100644 index 000000000..32368dc57 --- /dev/null +++ b/examples/process/process.cpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qobject.h> +#include <qprocess.h> +#include <qvbox.h> +#include <qtextview.h> +#include <qpushbutton.h> +#include <qapplication.h> +#include <qmessagebox.h> + +#include <stdlib.h> + +class UicManager : public TQVBox +{ + Q_OBJECT + +public: + UicManager(); + ~UicManager() {} + +public slots: + void readFromStdout(); + void scrollToTop(); + +private: + TQProcess *proc; + TQTextView *output; + TQPushButton *tquitButton; +}; + +UicManager::UicManager() +{ + // Layout + output = new TQTextView( this ); + tquitButton = new TQPushButton( tr("Quit"), this ); + connect( tquitButton, SIGNAL(clicked()), + qApp, SLOT(tquit()) ); + resize( 500, 500 ); + + // TQProcess related code + proc = new TQProcess( this ); + + // Set up the command and arguments. + // On the command line you would do: + // uic -tr i18n "small_dialog.ui" + proc->addArgument( "uic" ); + proc->addArgument( "-tr" ); + proc->addArgument( "i18n" ); + proc->addArgument( "small_dialog.ui" ); + + connect( proc, SIGNAL(readyReadStdout()), + this, SLOT(readFromStdout()) ); + connect( proc, SIGNAL(processExited()), + this, SLOT(scrollToTop()) ); + + if ( !proc->start() ) { + // error handling + TQMessageBox::critical( 0, + tr("Fatal error"), + tr("Could not start the uic command."), + tr("Quit") ); + exit( -1 ); + } +} + +void UicManager::readFromStdout() +{ + // Read and process the data. + // Bear in mind that the data might be output in chunks. + output->append( proc->readStdout() ); +} + +void UicManager::scrollToTop() +{ + output->setContentsPos( 0, 0 ); +} + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + UicManager manager; + a.setMainWidget( &manager ); + manager.show(); + return a.exec(); +} + +#include "process.moc" diff --git a/examples/process/process.doc b/examples/process/process.doc new file mode 100644 index 000000000..d02b855f3 --- /dev/null +++ b/examples/process/process.doc @@ -0,0 +1,20 @@ +/* +*/ + +/*! \page process-example.html + + \ingroup qprocess-examples + + \title Starting processes with IO redirection + + This example shows you how to start other processes with Qt and how + IO redirection is done. The example tries to start the uic (a tool + that comes with the Qt Designer) on a certain ui file and displays the + output of the command. + + <hr> + + Implementation (process.cpp): + + \include process/process.cpp +*/ diff --git a/examples/process/process.pro b/examples/process/process.pro new file mode 100644 index 000000000..ba5fb24b0 --- /dev/null +++ b/examples/process/process.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = process + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = +SOURCES = process.cpp +INTERFACES = diff --git a/examples/process/small_dialog.ui b/examples/process/small_dialog.ui new file mode 100644 index 000000000..47d9109dc --- /dev/null +++ b/examples/process/small_dialog.ui @@ -0,0 +1,197 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>SmallDialog</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>SmallDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>361</width> + <height>283</height> + </rect> + </property> + <property name="caption"> + <string>Small Dialog</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>OK</string> + </property> + <property name="accel"> + <number>0</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + <property name="accel"> + <number>0</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property name="text"> + <string>This is just a useless dialog.</string> + </property> + </widget> + <widget class="TQFrame" row="1" column="0"> + <property name="name"> + <cstring>Frame4</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQDial" row="0" column="1"> + <property name="name"> + <cstring>Dial1</cstring> + </property> + </widget> + <widget class="TQLCDNumber" row="1" column="1"> + <property name="name"> + <cstring>LCDNumber1</cstring> + </property> + <property name="numDigits"> + <number>2</number> + </property> + </widget> + <widget class="TQSlider" row="0" column="0" rowspan="2" colspan="1"> + <property name="name"> + <cstring>Slider1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + </widget> + </grid> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>SmallDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>SmallDialog</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>Slider1</sender> + <signal>valueChanged(int)</signal> + <receiver>LCDNumber1</receiver> + <slot>display(int)</slot> + </connection> + <connection> + <sender>Slider1</sender> + <signal>valueChanged(int)</signal> + <receiver>Dial1</receiver> + <slot>setValue(int)</slot> + </connection> + <connection> + <sender>Dial1</sender> + <signal>valueChanged(int)</signal> + <receiver>Slider1</receiver> + <slot>setValue(int)</slot> + </connection> +</connections> +</UI> diff --git a/examples/progress/README b/examples/progress/README new file mode 100644 index 000000000..97ba32365 --- /dev/null +++ b/examples/progress/README @@ -0,0 +1,6 @@ +This example demonstrates the use of QProgressBar when performing +operations which may take a long time to complete. + +The progress dialog only appears if the estimated completion time +is 3-4 seconds. + diff --git a/examples/progress/progress.cpp b/examples/progress/progress.cpp new file mode 100644 index 000000000..fa8ff1d60 --- /dev/null +++ b/examples/progress/progress.cpp @@ -0,0 +1,337 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qprogressdialog.h> +#include <qapplication.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qpainter.h> +#include <stdlib.h> + +class AnimatedThingy : public TQLabel { +public: + AnimatedThingy( TQWidget* parent, const TQString& s ) : + TQLabel(parent), + label(s), + step(0) + { + setBackgroundColor(white); + label+="\n... and wasting CPU\nwith this animation!\n"; + + for (int i=0; i<nqix; i++) + ox[0][i] = oy[0][i] = ox[1][i] = oy[1][i] = 0; + x0 = y0 = x1 = y1 = 0; + dx0 = rand()%8+2; + dy0 = rand()%8+2; + dx1 = rand()%8+2; + dy1 = rand()%8+2; + } + + void show() + { + if (!isVisible()) startTimer(100); + TQWidget::show(); + } + + void hide() + { + TQWidget::hide(); + killTimers(); + } + + TQSize sizeHint() const + { + return TQSize(120,100); + } + +protected: + void timerEvent(TQTimerEvent*) + { + TQPainter p(this); + TQPen pn=p.pen(); + pn.setWidth(2); + pn.setColor(backgroundColor()); + p.setPen(pn); + + step = (step + 1) % nqix; + + p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]); + + inc(x0, dx0, width()); + inc(y0, dy0, height()); + inc(x1, dx1, width()); + inc(y1, dy1, height()); + ox[0][step] = x0; + oy[0][step] = y0; + ox[1][step] = x1; + oy[1][step] = y1; + + TQColor c; + c.setHsv( (step*255)/nqix, 255, 255 ); // rainbow effect + pn.setColor(c); + p.setPen(pn); + p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]); + p.setPen(colorGroup().text()); + p.drawText(rect(), AlignCenter, label); + } + + void paintEvent(TQPaintEvent* event) + { + TQPainter p(this); + TQPen pn=p.pen(); + pn.setWidth(2); + p.setPen(pn); + p.setClipRect(event->rect()); + for (int i=0; i<nqix; i++) { + TQColor c; + c.setHsv( (i*255)/nqix, 255, 255 ); // rainbow effect + pn.setColor(c); + p.setPen(pn); + p.drawLine(ox[0][i], oy[0][i], ox[1][i], oy[1][i]); + } + p.setPen(colorGroup().text()); + p.drawText(rect(), AlignCenter, label); + } + +private: + void inc(int& x, int& dx, int b) + { + x+=dx; + if (x<0) { x=0; dx=rand()%8+2; } + else if (x>=b) { x=b-1; dx=-(rand()%8+2); } + } + + enum {nqix=10}; + int ox[2][nqix]; + int oy[2][nqix]; + int x0,y0,x1,y1; + int dx0,dy0,dx1,dy1; + TQString label; + int step; +}; + + +class CPUWaster : public TQWidget +{ + Q_OBJECT + + enum { first_draw_item = 1000, last_draw_item = 1006 }; + + int drawItemRects(int id) + { + int n = id - first_draw_item; + int r = 100; + while (n--) r*=(n%3 ? 5 : 4); + return r; + } + TQString drawItemText(int id) + { + TQString str; + str.sprintf("%d Rectangles", drawItemRects(id)); + return str; + } + +public: + CPUWaster() : + pb(0) + { + menubar = new TQMenuBar( this, "menu" ); + Q_CHECK_PTR( menubar ); + + TQPopupMenu* file = new TQPopupMenu(); + Q_CHECK_PTR( file ); + menubar->insertItem( "&File", file ); + for (int i=first_draw_item; i<=last_draw_item; i++) + file->insertItem( drawItemText(i), i ); + connect( menubar, SIGNAL(activated(int)), this, SLOT(doMenuItem(int)) ); + file->insertSeparator(); + file->insertItem( "Quit", qApp, SLOT(tquit()) ); + + options = new TQPopupMenu(); + Q_CHECK_PTR( options ); + menubar->insertItem( "&Options", options ); + td_id = options->insertItem( "Timer driven", this, SLOT(timerDriven()) ); + ld_id = options->insertItem( "Loop driven", this, SLOT(loopDriven()) ); + options->insertSeparator(); + dl_id = options->insertItem( "Default label", this, SLOT(defaultLabel()) ); + cl_id = options->insertItem( "Custom label", this, SLOT(customLabel()) ); + options->insertSeparator(); + md_id = options->insertItem( "No minimum duration", this, SLOT(toggleMinimumDuration()) ); + options->setCheckable( TRUE ); + loopDriven(); + defaultLabel(); + + setFixedSize( 400, 300 ); + + setBackgroundColor( black ); + } + +public slots: + void doMenuItem(int id) + { + if (id >= first_draw_item && id <= last_draw_item) + draw(drawItemRects(id)); + } + + void stopDrawing() { got_stop = TRUE; } + + void timerDriven() + { + timer_driven = TRUE; + options->setItemChecked( td_id, TRUE ); + options->setItemChecked( ld_id, FALSE ); + } + + void loopDriven() + { + timer_driven = FALSE; + options->setItemChecked( ld_id, TRUE ); + options->setItemChecked( td_id, FALSE ); + } + + void defaultLabel() + { + default_label = TRUE; + options->setItemChecked( dl_id, TRUE ); + options->setItemChecked( cl_id, FALSE ); + } + + void customLabel() + { + default_label = FALSE; + options->setItemChecked( dl_id, FALSE ); + options->setItemChecked( cl_id, TRUE ); + } + + void toggleMinimumDuration() + { + options->setItemChecked( md_id, + !options->isItemChecked( md_id ) ); + } + +private: + void timerEvent( TQTimerEvent* ) + { + if (!got_stop) + pb->setProgress( pb->totalSteps() - rects ); + rects--; + + { + TQPainter p(this); + + int ww = width(); + int wh = height(); + + if ( ww > 8 && wh > 8 ) { + TQColor c(rand()%255, rand()%255, rand()%255); + int x = rand() % (ww-8); + int y = rand() % (wh-8); + int w = rand() % (ww-x); + int h = rand() % (wh-y); + p.fillRect( x, y, w, h, c ); + } + } + + if (!rects || got_stop) { + if (!got_stop) + pb->setProgress( pb->totalSteps() ); + TQPainter p(this); + p.fillRect(0, 0, width(), height(), backgroundColor()); + enableDrawingItems(TRUE); + killTimers(); + delete pb; + pb = 0; + } + } + + TQProgressDialog* newProgressDialog( const char* label, int steps, bool modal ) + { + TQProgressDialog *d = new TQProgressDialog(label, "Cancel", steps, this, + "progress", modal); + if ( options->isItemChecked( md_id ) ) + d->setMinimumDuration(0); + if ( !default_label ) + d->setLabel( new AnimatedThingy(d,label) ); + return d; + } + + void enableDrawingItems(bool yes) + { + for (int i=first_draw_item; i<=last_draw_item; i++) { + menubar->setItemEnabled(i, yes); + } + } + + void draw(int n) + { + if ( timer_driven ) { + if ( pb ) { + qWarning("This cannot happen!"); + return; + } + rects = n; + pb = newProgressDialog("Drawing rectangles.\n" + "Using timer event.", n, FALSE); + pb->setCaption("Please Wait"); + connect(pb, SIGNAL(cancelled()), this, SLOT(stopDrawing())); + enableDrawingItems(FALSE); + startTimer(0); + got_stop = FALSE; + } else { + TQProgressDialog* lpb = newProgressDialog( + "Drawing rectangles.\nUsing loop.", n, TRUE); + lpb->setCaption("Please Wait"); + + TQPainter p(this); + for (int i=0; i<n; i++) { + lpb->setProgress(i); + if ( lpb->wasCancelled() ) + break; + + TQColor c(rand()%255, rand()%255, rand()%255); + int x = rand()%(width()-8); + int y = rand()%(height()-8); + int w = rand()%(width()-x); + int h = rand()%(height()-y); + p.fillRect(x,y,w,h,c); + } + + p.fillRect(0, 0, width(), height(), backgroundColor()); + + delete lpb; + } + } + + TQMenuBar* menubar; + TQProgressDialog* pb; + TQPopupMenu* options; + int td_id, ld_id; + int dl_id, cl_id; + int md_id; + int rects; + bool timer_driven; + bool default_label; + bool got_stop; +}; + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + int wincount = argc > 1 ? atoi(argv[1]) : 1; + + for ( int i=0; i<wincount; i++ ) { + CPUWaster* cpuw = new CPUWaster; + if ( i == 0 ) a.setMainWidget(cpuw); + cpuw->show(); + } + return a.exec(); +} + +#include "progress.moc" diff --git a/examples/progress/progress.doc b/examples/progress/progress.doc new file mode 100644 index 000000000..478013a16 --- /dev/null +++ b/examples/progress/progress.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page progress-example.html + + \ingroup examples + \title Progress Bar and Dialog Example + + This example displays either a simple (text-only) or a + custom-labelled (user-supplied widget) progress dialog. It also + demonstrates simple use of menus. + <hr> + + Implementation: + + \include progress/progress.cpp +*/ + diff --git a/examples/progress/progress.pro b/examples/progress/progress.pro new file mode 100644 index 000000000..d9217e2b8 --- /dev/null +++ b/examples/progress/progress.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = progress + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = progress.cpp diff --git a/examples/progressbar/main.cpp b/examples/progressbar/main.cpp new file mode 100644 index 000000000..73a5fbc8e --- /dev/null +++ b/examples/progressbar/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "progressbar.h" +#include <qapplication.h> + +int main(int argc,char **argv) +{ + TQApplication a(argc,argv); + + ProgressBar progressbar; + progressbar.setCaption("TQt Example - ProgressBar"); + a.setMainWidget(&progressbar); + progressbar.show(); + + return a.exec(); +} diff --git a/examples/progressbar/progressbar.cpp b/examples/progressbar/progressbar.cpp new file mode 100644 index 000000000..9befa6e80 --- /dev/null +++ b/examples/progressbar/progressbar.cpp @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "progressbar.h" + +#include <qradiobutton.h> +#include <qpushbutton.h> +#include <qprogressbar.h> +#include <qlayout.h> + +#include <qmotifstyle.h> + +/* + * Constructor + * + * Creates child widgets of the ProgressBar widget + */ + +ProgressBar::ProgressBar( TQWidget *parent, const char *name ) + : TQButtonGroup( 0, Horizontal, "Progress Bar", parent, name ), timer() +{ + setMargin( 10 ); + + TQGridLayout* toplayout = new TQGridLayout( layout(), 2, 2, 5); + + setRadioButtonExclusive( TRUE ); + + // insert three radiobuttons which the user can use + // to set the speed of the progress and two pushbuttons + // to start/pause/continue and reset the progress + slow = new TQRadioButton( "S&low", this ); + normal = new TQRadioButton( "&Normal", this ); + fast = new TQRadioButton( "&Fast", this ); + TQVBoxLayout* vb1 = new TQVBoxLayout; + toplayout->addLayout( vb1, 0, 0 ); + vb1->addWidget( slow ); + vb1->addWidget( normal ); + vb1->addWidget( fast ); + + // two push buttons, one for start, for for reset. + start = new TQPushButton( "&Start", this ); + reset = new TQPushButton( "&Reset", this ); + TQVBoxLayout* vb2 = new TQVBoxLayout; + toplayout->addLayout( vb2, 0, 1 ); + vb2->addWidget( start ); + vb2->addWidget( reset ); + + // Create the progressbar + progress = new TQProgressBar( 100, this ); + // progress->setStyle( new TQMotifStyle() ); + toplayout->addMultiCellWidget( progress, 1, 1, 0, 1 ); + + // connect the clicked() SIGNALs of the pushbuttons to SLOTs + connect( start, SIGNAL( clicked() ), this, SLOT( slotStart() ) ); + connect( reset, SIGNAL( clicked() ), this, SLOT( slotReset() ) ); + + // connect the timeout() SIGNAL of the progress-timer to a SLOT + connect( &timer, SIGNAL( timeout() ), this, SLOT( slotTimeout() ) ); + + // Let's start with normal speed... + normal->setChecked( TRUE ); + + + // some contraints + start->setFixedWidth( 80 ); + setMinimumWidth( 300 ); +} + +/* + * SLOT slotStart + * + * This SLOT is called if the user clicks start/pause/continue + * button + */ + +void ProgressBar::slotStart() +{ + // If the progress bar is at the beginning... + if ( progress->progress() == -1 ) { + // ...set according to the checked speed-radiobutton + // the number of steps which are needed to complete the process + if ( slow->isChecked() ) + progress->setTotalSteps( 10000 ); + else if ( normal->isChecked() ) + progress->setTotalSteps( 1000 ); + else + progress->setTotalSteps( 50 ); + + // disable the speed-radiobuttons + slow->setEnabled( FALSE ); + normal->setEnabled( FALSE ); + fast->setEnabled( FALSE ); + } + + // If the progress is not running... + if ( !timer.isActive() ) { + // ...start the timer (and so the progress) with a interval of 1 ms... + timer.start( 1 ); + // ...and rename the start/pause/continue button to Pause + start->setText( "&Pause" ); + } else { // if the prgress is running... + // ...stop the timer (and so the prgress)... + timer.stop(); + // ...and rename the start/pause/continue button to Continue + start->setText( "&Continue" ); + } +} + +/* + * SLOT slotReset + * + * This SLOT is called when the user clicks the reset button + */ + +void ProgressBar::slotReset() +{ + // stop the timer and progress + timer.stop(); + + // rename the start/pause/continue button to Start... + start->setText( "&Start" ); + // ...and enable this button + start->setEnabled( TRUE ); + + // enable the speed-radiobuttons + slow->setEnabled( TRUE ); + normal->setEnabled( TRUE ); + fast->setEnabled( TRUE ); + + // reset the progressbar + progress->reset(); +} + +/* + * SLOT slotTimeout + * + * This SLOT is called each ms when the timer is + * active (== progress is running) + */ + +void ProgressBar::slotTimeout() +{ + int p = progress->progress(); + +#if 1 + // If the progress is complete... + if ( p == progress->totalSteps() ) { + // ...rename the start/pause/continue button to Start... + start->setText( "&Start" ); + // ...and disable it... + start->setEnabled( FALSE ); + // ...and return + return; + } +#endif + + // If the process is not complete increase it + progress->setProgress( ++p ); +} diff --git a/examples/progressbar/progressbar.doc b/examples/progressbar/progressbar.doc new file mode 100644 index 000000000..6950c7295 --- /dev/null +++ b/examples/progressbar/progressbar.doc @@ -0,0 +1,29 @@ + +/* +*/ +/*! \page progressbar-example.html + + \ingroup examples + \title Progress Bar + + This example shows how to use a progress bar. + + <hr> + + Header file: + + \include progressbar/progressbar.h + + <hr> + + Implementation: + + \include progressbar/progressbar.cpp + + <hr> + + Main: + + \include progressbar/main.cpp +*/ + diff --git a/examples/progressbar/progressbar.h b/examples/progressbar/progressbar.h new file mode 100644 index 000000000..0fe4bc4a1 --- /dev/null +++ b/examples/progressbar/progressbar.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef PROGRESSBAR_H +#define PROGRESSBAR_H + +#include <qbuttongroup.h> +#include <qtimer.h> + +class TQRadioButton; +class TQPushButton; +class TQProgressBar; + +class ProgressBar : public TQButtonGroup +{ + Q_OBJECT + +public: + ProgressBar( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQRadioButton *slow, *normal, *fast; + TQPushButton *start, *pause, *reset; + TQProgressBar *progress; + TQTimer timer; + +protected slots: + void slotStart(); + void slotReset(); + void slotTimeout(); + +}; + +#endif diff --git a/examples/progressbar/progressbar.pro b/examples/progressbar/progressbar.pro new file mode 100644 index 000000000..9b25197cd --- /dev/null +++ b/examples/progressbar/progressbar.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = progressbar + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = progressbar.h +SOURCES = main.cpp \ + progressbar.cpp diff --git a/examples/qdir/qdir.cpp b/examples/qdir/qdir.cpp new file mode 100644 index 000000000..f936a31f0 --- /dev/null +++ b/examples/qdir/qdir.cpp @@ -0,0 +1,359 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "../dirview/dirview.h" +#include "qdir.h" + +#include <qapplication.h> +#include <qtextview.h> +#include <qfileinfo.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qhbox.h> +#include <qspinbox.h> +#include <qlabel.h> +#include <qmultilineedit.h> +#include <qheader.h> +#include <qevent.h> +#include <qpainter.h> +#include <qpopupmenu.h> +#include <qpushbutton.h> +#include <qtoolbutton.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qtooltip.h> + +#include <stdlib.h> + +/* XPM */ +static const char *bookmarks[]={ + "22 14 8 1", + "# c #000080", + "a c #585858", + "b c #000000", + "c c #ffffff", + "d c #ffffff", + "e c #ffffff", + "f c #000000", + ". c None", + "...bb.................", + "..bacb....bbb.........", + "..badcb.bbccbab.......", + "..bacccbadccbab.......", + "..baecdbcccdbab.......", + "..bacccbacccbab.......", + "..badcdbcecdfab.......", + "..bacecbacccbab.......", + "..baccdbcccdbab.......", + "...badcbacdbbab.......", + "....bacbcbbccab.......", + ".....babbaaaaab.......", + ".....bbabbbbbbb.......", + "......bb.............." +}; + +/* XPM */ +static const char *home[]={ + "16 15 4 1", + "# c #000000", + "a c #ffffff", + "b c #c0c0c0", + ". c None", + ".......##.......", + "..#...####......", + "..#..#aabb#.....", + "..#.#aaaabb#....", + "..##aaaaaabb#...", + "..#aaaaaaaabb#..", + ".#aaaaaaaaabbb#.", + "###aaaaaaaabb###", + "..#aaaaaaaabb#..", + "..#aaa###aabb#..", + "..#aaa#.#aabb#..", + "..#aaa#.#aabb#..", + "..#aaa#.#aabb#..", + "..#aaa#.#aabb#..", + "..#####.######.." +}; + +// **************************************************************************************************** + +PixmapView::PixmapView( TQWidget *parent ) + : TQScrollView( parent ) +{ + viewport()->setBackgroundMode( PaletteBase ); +} + +void PixmapView::setPixmap( const TQPixmap &pix ) +{ + pixmap = pix; + resizeContents( pixmap.size().width(), pixmap.size().height() ); + viewport()->repaint( FALSE ); +} + +void PixmapView::drawContents( TQPainter *p, int cx, int cy, int cw, int ch ) +{ + p->fillRect( cx, cy, cw, ch, colorGroup().brush( TQColorGroup::Base ) ); + p->drawPixmap( 0, 0, pixmap ); +} + +// **************************************************************************************************** + +Preview::Preview( TQWidget *parent ) + : TQWidgetStack( parent ) +{ + normalText = new TQMultiLineEdit( this ); + normalText->setReadOnly( TRUE ); + html = new TQTextView( this ); + pixmap = new PixmapView( this ); + raiseWidget( normalText ); +} + +void Preview::showPreview( const TQUrl &u, int size ) +{ + if ( u.isLocalFile() ) { + TQString path = u.path(); + TQFileInfo fi( path ); + if ( fi.isFile() && (int)fi.size() > size * 1000 ) { + normalText->setText( tr( "The File\n%1\nis too large, so I don't show it!" ).arg( path ) ); + raiseWidget( normalText ); + return; + } + + TQPixmap pix( path ); + if ( pix.isNull() ) { + if ( fi.isFile() ) { + TQFile f( path ); + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + TQString text = ts.read(); + f.close(); + if ( fi.extension().lower().contains( "htm" ) ) { + TQString url = html->mimeSourceFactory()->makeAbsolute( path, html->context() ); + html->setText( text, url ); + raiseWidget( html ); + return; + } else { + normalText->setText( text ); + raiseWidget( normalText ); + return; + } + } + } + normalText->setText( TQString::null ); + raiseWidget( normalText ); + } else { + pixmap->setPixmap( pix ); + raiseWidget( pixmap ); + } + } else { + normalText->setText( "I only show local files!" ); + raiseWidget( normalText ); + } +} + +// **************************************************************************************************** + +PreviewWidget::PreviewWidget( TQWidget *parent ) + : TQVBox( parent ), TQFilePreview() +{ + setSpacing( 5 ); + setMargin( 5 ); + TQHBox *row = new TQHBox( this ); + row->setSpacing( 5 ); + (void)new TQLabel( tr( "Only show files smaller than: " ), row ); + sizeSpinBox = new TQSpinBox( 1, 10000, 1, row ); + sizeSpinBox->setSuffix( " KB" ); + sizeSpinBox->setValue( 64 ); + row->setFixedHeight( 10 + sizeSpinBox->sizeHint().height() ); + preview = new Preview( this ); +} + +void PreviewWidget::previewUrl( const TQUrl &u ) +{ + preview->showPreview( u, sizeSpinBox->value() ); +} + +// **************************************************************************************************** + +CustomFileDialog::CustomFileDialog() + : TQFileDialog( 0, 0, TRUE ) +{ + setDir( "/" ); + + dirView = new DirectoryView( this, 0, TRUE ); + dirView->addColumn( "" ); + dirView->header()->hide(); + ::Directory *root = new ::Directory( dirView, "/" ); + root->setOpen( TRUE ); + dirView->setFixedWidth( 150 ); + + addLeftWidget( dirView ); + + TQPushButton *p = new TQPushButton( this ); + p->setPixmap( TQPixmap( bookmarks ) ); + TQToolTip::add( p, tr( "Bookmarks" ) ); + + bookmarkMenu = new TQPopupMenu( this ); + connect( bookmarkMenu, SIGNAL( activated( int ) ), + this, SLOT( bookmarkChosen( int ) ) ); + addId = bookmarkMenu->insertItem( tr( "Add bookmark" ) ); + bookmarkMenu->insertSeparator(); + + TQFile f( ".bookmarks" ); + if ( f.open( IO_ReadOnly ) ) { + TQDataStream ds( &f ); + ds >> bookmarkList; + f.close(); + + TQStringList::Iterator it = bookmarkList.begin(); + for ( ; it != bookmarkList.end(); ++it ) { + bookmarkMenu->insertItem( *it ); + } + } + + p->setPopup( bookmarkMenu ); + + addToolButton( p, TRUE ); + + connect( dirView, SIGNAL( folderSelected( const TQString & ) ), + this, SLOT( setDir2( const TQString & ) ) ); + connect( this, SIGNAL( dirEntered( const TQString & ) ), + dirView, SLOT( setDir( const TQString & ) ) ); + + TQToolButton *b = new TQToolButton( this ); + TQToolTip::add( b, tr( "Go Home!" ) ); + b->setPixmap( TQPixmap( home ) ); + connect( b, SIGNAL( clicked() ), + this, SLOT( goHome() ) ); + + addToolButton( b ); + + resize( width() + width() / 3, height() ); +} + +CustomFileDialog::~CustomFileDialog() +{ + if ( !bookmarkList.isEmpty() ) { + TQFile f( ".bookmarks" ); + if ( f.open( IO_WriteOnly ) ) { + TQDataStream ds( &f ); + ds << bookmarkList; + f.close(); + } + } +} + +void CustomFileDialog::setDir2( const TQString &s ) +{ + blockSignals( TRUE ); + setDir( s ); + blockSignals( FALSE ); +} + +void CustomFileDialog::showEvent( TQShowEvent *e ) +{ + TQFileDialog::showEvent( e ); + dirView->setDir( dirPath() ); +} + +void CustomFileDialog::bookmarkChosen( int i ) +{ + if ( i == addId ) { + bookmarkList << dirPath(); + bookmarkMenu->insertItem( dirPath() ); + } else { + setDir( bookmarkMenu->text( i ) ); + } +} + +void CustomFileDialog::goHome() +{ + if ( getenv( "HOME" ) ) + setDir( getenv( "HOME" ) ); + else + setDir( "/" ); +} + +// **************************************************************************************************** + +int main( int argc, char ** argv ) +{ + TQFileDialog::Mode mode = TQFileDialog::ExistingFile; + TQString start; + TQString filter; + TQString caption; + bool preview = FALSE; + bool custom = FALSE; + TQApplication a( argc, argv ); + for (int i=1; i<argc; i++) { + TQString arg = argv[i]; + if ( arg == "-any" ) + mode = TQFileDialog::AnyFile; + else if ( arg == "-dir" ) + mode = TQFileDialog::Directory; + else if ( arg == "-default" ) + start = argv[++i]; + else if ( arg == "-filter" ) + filter = argv[++i]; + else if ( arg == "-preview" ) + preview = TRUE; + else if ( arg == "-custom" ) + custom = TRUE; + else if ( arg[0] == '-' ) { + qDebug("Usage: qdir [-any | -dir | -custom] [-preview] [-default f] {-filter f} [caption ...]\n" + " -any Get any filename, need not exist.\n" + " -dir Return a directory rather than a file.\n" + " -custom Opens a customized TQFileDialog with \n" + " dir browser, bookmark menu, etc.\n" + " -preview Show a preview widget.\n" + " -default f Start from directory/file f.\n" + " -filter f eg. '*.gif' '*.bmp'\n" + " caption ... Caption for dialog.\n" + ); + return 1; + } else { + if ( !caption.isNull() ) + caption += ' '; + caption += arg; + } + } + + if ( !start ) + start = TQDir::currentDirPath(); + + if ( !caption ) + caption = mode == TQFileDialog::Directory + ? "Choose directory..." : "Choose file..."; + + if ( !custom ) { + TQFileDialog fd( TQString::null, filter, 0, 0, TRUE ); + fd.setMode( mode ); + if ( preview ) { + fd.setContentsPreviewEnabled( TRUE ); + PreviewWidget *pw = new PreviewWidget( &fd ); + fd.setContentsPreview( pw, pw ); + fd.setViewMode( TQFileDialog::List ); + fd.setPreviewMode( TQFileDialog::Contents ); + } + fd.setCaption( caption ); + fd.setSelection( start ); + if ( fd.exec() == TQDialog::Accepted ) { + TQString result = fd.selectedFile(); + printf("%s\n", (const char*)result); + return 0; + } else { + return 1; + } + } else { + CustomFileDialog fd; + fd.exec(); + return 1; + } +} diff --git a/examples/qdir/qdir.doc b/examples/qdir/qdir.doc new file mode 100644 index 000000000..624cbd583 --- /dev/null +++ b/examples/qdir/qdir.doc @@ -0,0 +1,15 @@ +/* +*/ +/*! \page qdir-example.html + + \ingroup examples + \title QDir + + + <hr> + + Main: + + \include qdir/qdir.cpp +*/ + diff --git a/examples/qdir/qdir.h b/examples/qdir/qdir.h new file mode 100644 index 000000000..86dde7072 --- /dev/null +++ b/examples/qdir/qdir.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQDIREXAMPLE_H +#define TQDIREXAMPLE_H + +#include <qscrollview.h> +#include <qfiledialog.h> +#include <qwidgetstack.h> +#include <qvbox.h> +#include <qurl.h> +#include <qpixmap.h> +#include <qstringlist.h> + +class TQMultiLineEdit; +class TQTextView; +class DirectoryView; +class TQSpinBox; +class TQShowEvent; +class TQPopupMenu; + +class PixmapView : public TQScrollView +{ + Q_OBJECT + +public: + PixmapView( TQWidget *parent ); + void setPixmap( const TQPixmap &pix ); + void drawContents( TQPainter *p, int, int, int, int ); + +private: + TQPixmap pixmap; + +}; + +class Preview : public TQWidgetStack +{ + Q_OBJECT + +public: + Preview( TQWidget *parent ); + void showPreview( const TQUrl &u, int size ); + +private: + TQMultiLineEdit *normalText; + TQTextView *html; + PixmapView *pixmap; + +}; + +class PreviewWidget : public TQVBox, + public TQFilePreview +{ + Q_OBJECT + +public: + PreviewWidget( TQWidget *parent ); + void previewUrl( const TQUrl &u ); + +private: + TQSpinBox *sizeSpinBox; + Preview *preview; + +}; + +class CustomFileDialog : public TQFileDialog +{ + Q_OBJECT + +public: + CustomFileDialog(); + ~CustomFileDialog(); + +protected: + void showEvent( TQShowEvent *e ); + +public slots: + void setDir2( const TQString & ); + +private slots: + void bookmarkChosen( int i ); + void goHome(); + +private: + DirectoryView *dirView; + TQPopupMenu *bookmarkMenu; + TQStringList bookmarkList; + int addId; + +}; + +#endif diff --git a/examples/qdir/qdir.pro b/examples/qdir/qdir.pro new file mode 100644 index 000000000..fa7a0f685 --- /dev/null +++ b/examples/qdir/qdir.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = qdir + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = qdir.h ../dirview/dirview.h +SOURCES = qdir.cpp ../dirview/dirview.cpp diff --git a/examples/qfd/fontdisplayer.cpp b/examples/qfd/fontdisplayer.cpp new file mode 100644 index 000000000..eecb16143 --- /dev/null +++ b/examples/qfd/fontdisplayer.cpp @@ -0,0 +1,155 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "fontdisplayer.h" +#include <qapplication.h> +#include <qslider.h> +#include <qspinbox.h> +#include <qpainter.h> +#include <qtoolbar.h> +#include <qstatusbar.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qfontdialog.h> +#include <stdlib.h> + + +FontRowTable::FontRowTable( TQWidget* parent, const char* name ) : + TQFrame(parent,name) +{ + setBackgroundMode(PaletteBase); + setFrameStyle(Panel|Sunken); + setMargin(8); + setRow(0); + tablefont = TQApplication::font(); +} + +TQSize FontRowTable::sizeHint() const +{ + return 24*cellSize()+TQSize(2,2)*(margin()+frameWidth()); +} + +TQSize FontRowTable::cellSize() const +{ + TQFontMetrics fm = fontMetrics(); + return TQSize( fm.maxWidth(), fm.lineSpacing()+1 ); +} + +void FontRowTable::paintEvent( TQPaintEvent* e ) +{ + TQFrame::paintEvent(e); + TQPainter p(this); + p.setClipRegion(e->region()); + TQRect r = e->rect(); + TQFontMetrics fm = fontMetrics(); + int ml = frameWidth()+margin() + 1 + TQMAX(0,-fm.minLeftBearing()); + int mt = frameWidth()+margin(); + TQSize cell((width()-15-ml)/16,(height()-15-mt)/16); + + if ( !cell.width() || !cell.height() ) + return; + + int mini = r.left() / cell.width(); + int maxi = (r.right()+cell.width()-1) / cell.width(); + int minj = r.top() / cell.height(); + int maxj = (r.bottom()+cell.height()-1) / cell.height(); + + int h = fm.height(); + + TQColor body(255,255,192); + TQColor negative(255,192,192); + TQColor positive(192,192,255); + TQColor rnegative(255,128,128); + TQColor rpositive(128,128,255); + + for (int j = minj; j<=maxj; j++) { + for (int i = mini; i<=maxi; i++) { + if ( i < 16 && j < 16 ) { + int x = i*cell.width(); + int y = j*cell.height(); + + TQChar ch = TQChar(j*16+i,row); + + if ( fm.inFont(ch) ) { + int w = fm.width(ch); + int l = fm.leftBearing(ch); + int r = fm.rightBearing(ch); + + x += ml; + y += mt+h; + + p.fillRect(x,y,w,-h,body); + if ( w ) { + if ( l ) { + p.fillRect(x+(l>0?0:l), y-h/2, abs(l),-h/2, + l < 0 ? negative : positive); + } + if ( r ) { + p.fillRect(x+w-(r>0?r:0),y+2, abs(r),-h/2, + r < 0 ? rnegative : rpositive); + } + } + TQString s; + s += ch; + p.setPen(TQPen(TQt::black)); + p.drawText(x,y,s); + } + } + } + } +} + +void FontRowTable::setRow(int r) +{ + row = r; + + TQFontMetrics fm = fontMetrics(); + TQFontInfo fi = fontInfo(); + TQString str = TQString("%1 %2pt%3%4 mLB=%5 mRB=%6 mW=%7") + .arg(fi.family()) + .arg(fi.pointSize()) + .arg(fi.bold() ? " bold" : "") + .arg(fi.italic() ? " italic" : "") + .arg(fm.minLeftBearing()) + .arg(fm.minRightBearing()) + .arg(fm.maxWidth()); + + emit fontInformation(str); + update(); +} + +void FontRowTable::chooseFont() +{ + bool ok; + TQFont oldfont = tablefont; + tablefont = TQFontDialog::getFont(&ok, oldfont, this); + + if (ok) + setFont(tablefont); + else + tablefont = oldfont; +} + +FontDisplayer::FontDisplayer( TQWidget* parent, const char* name ) : + TQMainWindow(parent,name) +{ + FontRowTable* table = new FontRowTable(this); + TQToolBar* controls = new TQToolBar(this); + (void) new TQLabel(tr("Row:"), controls); + TQSpinBox *row = new TQSpinBox(0,255,1,controls); + controls->addSeparator(); + TQPushButton *fontbutton = new TQPushButton(tr("Font..."), controls); + + connect(row,SIGNAL(valueChanged(int)),table,SLOT(setRow(int))); + connect(fontbutton, SIGNAL(clicked()), table, SLOT(chooseFont())); + connect(table,SIGNAL(fontInformation(const TQString&)), + statusBar(),SLOT(message(const TQString&))); + table->setRow(0); + setCentralWidget(table); +} diff --git a/examples/qfd/fontdisplayer.h b/examples/qfd/fontdisplayer.h new file mode 100644 index 000000000..6d42aa52e --- /dev/null +++ b/examples/qfd/fontdisplayer.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef FontDisplayer_H +#define FontDisplayer_H + +#include <qframe.h> +#include <qmainwindow.h> + +class TQSlider; + +class FontRowTable : public TQFrame { + Q_OBJECT +public: + FontRowTable( TQWidget* parent=0, const char* name=0 ); + + TQSize sizeHint() const; + +signals: + void fontInformation(const TQString&); + +public slots: + void setRow(int); + void chooseFont(); + + +protected: + TQSize cellSize() const; + void paintEvent( TQPaintEvent* ); +private: + TQFont tablefont; + int row; +}; + +class FontDisplayer : public TQMainWindow { + Q_OBJECT +public: + FontDisplayer( TQWidget* parent=0, const char* name=0 ); +}; + +#endif diff --git a/examples/qfd/qfd.cpp b/examples/qfd/qfd.cpp new file mode 100644 index 000000000..b52362543 --- /dev/null +++ b/examples/qfd/qfd.cpp @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "fontdisplayer.h" + +#include <qapplication.h> +#include <qslider.h> +#include <qpainter.h> +#include <qstatusbar.h> + + + +int main(int argc, char** argv) +{ + TQApplication app(argc,argv); + + FontDisplayer m; + TQSize sh = m.centralWidget()->sizeHint(); + m.resize(sh.width(), + sh.height()+3*m.statusBar()->height()); + app.setMainWidget(&m); + m.setCaption("TQt Example - TQFD"); + m.show(); + + return app.exec(); +} diff --git a/examples/qfd/qfd.doc b/examples/qfd/qfd.doc new file mode 100644 index 000000000..dc9360c21 --- /dev/null +++ b/examples/qfd/qfd.doc @@ -0,0 +1,28 @@ +/* +*/ +/*! \page qfd-example.html + + \ingroup examples + \title Font Displayer + + This example program displays all characters of a font. + + <hr> + + Header file: + + \include qfd/fontdisplayer.h + + <hr> + + Implementation: + + \include qfd/fontdisplayer.cpp + + <hr> + + Main: + + \include qfd/qfd.cpp +*/ + diff --git a/examples/qfd/qfd.pro b/examples/qfd/qfd.pro new file mode 100644 index 000000000..6f1ae2487 --- /dev/null +++ b/examples/qfd/qfd.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = qfd + +CONFIG += qt warn_on release +DEPENDPATH = ../../include +REQUIRES = full-config + +HEADERS = fontdisplayer.h +SOURCES = fontdisplayer.cpp \ + qfd.cpp diff --git a/examples/qmag/README b/examples/qmag/README new file mode 100644 index 000000000..df10244e1 --- /dev/null +++ b/examples/qmag/README @@ -0,0 +1,6 @@ +The qmag program can magnify portions of the screen to let you see +things at a pixel level. + +Run it, resize it appropriately, click inside, then click where you want +to grab. Set magnification factor and auto-refresh as desired. + diff --git a/examples/qmag/qmag.cpp b/examples/qmag/qmag.cpp new file mode 100644 index 000000000..e747bab40 --- /dev/null +++ b/examples/qmag/qmag.cpp @@ -0,0 +1,389 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qcombobox.h> +#include <qpushbutton.h> +#include <qpixmap.h> +#include <qimage.h> +#include <qlabel.h> +#include <qfiledialog.h> +#include <qregexp.h> + +#include <qapplication.h> +#include <qpainter.h> +#include <qwmatrix.h> + + +class MagWidget : public TQWidget +{ + Q_OBJECT +public: + MagWidget( TQWidget *parent=0, const char *name=0 ); + +public slots: + void setZoom( int ); + void setRefresh( int ); + void save(); + void multiSave(); + +protected: + void paintEvent( TQPaintEvent * ); + void mousePressEvent( TQMouseEvent * ); + void mouseReleaseEvent( TQMouseEvent * ); + void mouseMoveEvent( TQMouseEvent * ); + void focusOutEvent( TQFocusEvent * ); + void timerEvent( TQTimerEvent * ); + void resizeEvent( TQResizeEvent * ); + +private: + void grabAround(TQPoint pos); + void grab(); + + TQComboBox *zoom; + TQComboBox *refresh; + TQPushButton *saveButton; + TQPushButton *multiSaveButton; + TQPushButton *tquitButton; + TQPixmap pm; // pixmap, magnified + TQPixmap p; // pixmap + TQImage image; // image of pixmap (for RGB) + TQLabel *rgb; + int yoffset; // pixels in addition to the actual picture + int z; // magnification factor + int r; // autorefresh rate (index into refreshrates) + bool grabbing; // TRUE if qmag is currently grabbing + int grabx, graby; + TQString multifn; // filename for multisave +}; + + +#ifdef COMPLEX_GUI +static const char *zoomfactors[] = { + "100%", "200%", "300%", "400%", "500%", + "600%", "700%", "800%", "1600%", 0 }; + +static const char *refreshrates[] = { + "No autorefresh", "50 per second", "4 per second", "3 per second", "2 per second", + "Every second", "Every two seconds", "Every three seconds", + "Every five seconds", "Every ten seconds", 0 }; +#endif + +static const int timer[] = { + 0, 20, 250, 333, 500, 1000, 2000, 3000, 5000, 10000 }; + + +MagWidget::MagWidget( TQWidget *parent, const char *name ) + : TQWidget( parent, name) +{ + z = 1; // default zoom (100%) + r = 0; // default refresh (none) + +#ifdef COMPLEX_GUI + int w=0, x=0, n; + + zoom = new TQComboBox( FALSE, this ); + Q_CHECK_PTR(zoom); + zoom->insertStrList( zoomfactors, 9 ); + connect( zoom, SIGNAL(activated(int)), SLOT(setZoom(int)) ); + + refresh = new TQComboBox( FALSE, this ); + Q_CHECK_PTR(refresh); + refresh->insertStrList( refreshrates, 9 ); + connect( refresh, SIGNAL(activated(int)), SLOT(setRefresh(int)) ); + + for( n=0; n<9; n++) { + int w2 = zoom->fontMetrics().width( zoomfactors[n] ); + w = TQMAX(w2, w); + } + zoom->setGeometry( 2, 2, w+30, 20 ); + + x = w+34; + w = 0; + for( n=0; n<9; n++) { + int w2 = refresh->fontMetrics().width( refreshrates[n] ); + w = TQMAX(w2, w); + } + refresh->setGeometry( x, 2, w+30, 20 ); + + saveButton = new TQPushButton( this ); + Q_CHECK_PTR(saveButton); + connect( saveButton, SIGNAL(clicked()), this, SLOT(save()) ); + saveButton->setText( "Save" ); + saveButton->setGeometry( x+w+30+2, 2, + 10+saveButton->fontMetrics().width("Save"), 20 ); + + multiSaveButton = new TQPushButton( this ); + multiSaveButton->setToggleButton(TRUE); + Q_CHECK_PTR(multiSaveButton); + connect( multiSaveButton, SIGNAL(clicked()), this, SLOT(multiSave()) ); + multiSaveButton->setText( "MultiSave" ); + multiSaveButton->setGeometry( saveButton->geometry().right() + 2, 2, + 10+multiSaveButton->fontMetrics().width("MultiSave"), 20 ); + + tquitButton = new TQPushButton( this ); + Q_CHECK_PTR(tquitButton); + connect( tquitButton, SIGNAL(clicked()), qApp, SLOT(tquit()) ); + tquitButton->setText( "Quit" ); + tquitButton->setGeometry( multiSaveButton->geometry().right() + 2, 2, + 10+tquitButton->fontMetrics().width("Quit"), 20 ); +#else + zoom = 0; + multiSaveButton = 0; +#endif + + setRefresh(1); + setZoom(5); + + rgb = new TQLabel( this ); + Q_CHECK_PTR( rgb ); + rgb->setText( "" ); + rgb->setAlignment( AlignVCenter ); + rgb->resize( width(), rgb->fontMetrics().height() + 4 ); + +#ifdef COMPLEX_GUI + yoffset = zoom->height() // top buttons + + 4 // space around top buttons + + rgb->height(); // color-value text height + setMinimumSize( tquitButton->pos().x(), yoffset+20 ); + resize( tquitButton->geometry().topRight().x() + 2, yoffset+60 ); +#else + yoffset = 0; + resize(350,350); +#endif + + grabx = graby = -1; + grabbing = FALSE; + + setMouseTracking( TRUE ); // and do let me know what pixel I'm at, eh? + + grabAround( TQPoint(grabx=qApp->desktop()->width()/2, graby=qApp->desktop()->height()/2) ); +} + + +void MagWidget::setZoom( int index ) +{ + if (index == 8) + z = 16; + else + z = index+1; + grab(); +} + + +void MagWidget::setRefresh( int index ) +{ + r = index; + killTimers(); + if (index && !grabbing) + startTimer( timer[r] ); +} + + +void MagWidget::save() +{ + if ( !p.isNull() ) { + killTimers(); + TQString fn = TQFileDialog::getSaveFileName(); + if ( !fn.isEmpty() ) + p.save( fn, "BMP" ); + if ( r ) + startTimer( timer[r] ); + } +} + +void MagWidget::multiSave() +{ + if ( !p.isNull() ) { + multifn = ""; // stops saving + multifn = TQFileDialog::getSaveFileName(); + if ( multifn.isEmpty() ) + multiSaveButton->setOn(FALSE); + if ( !r ) + p.save( multifn, "BMP" ); + } else { + multiSaveButton->setOn(FALSE); + } +} + + +void MagWidget::grab() +{ + if ( !isVisible() ) + return; // don't eat resources when iconified + + if ( grabx < 0 || graby < 0 ) + return; // don't grab until the user has said to + + int x,y, w,h; + + w = (width()+z-1)/z; + h = (height()+z-1-yoffset)/z; + if ( w<1 || h<1 ) + return; // don't ask too much from the window system :) + + x = grabx-w/2; // find a suitable position to grab from + y = graby-h/2; + if ( x + w > TQApplication::desktop()->width() ) + x = TQApplication::desktop()->width()-w; + else if ( x < 0 ) + x = 0; + if ( y + h > TQApplication::desktop()->height() ) + y = TQApplication::desktop()->height()-h; + else if ( y < 0 ) + y = 0; + + p = TQPixmap::grabWindow( TQApplication::desktop()->winId(), x, y, w, h ); + image = p.convertToImage(); + TQWMatrix m; // after getting it, scale it + m.scale( (double)z, (double)z ); + pm = p.xForm( m ); + + if ( !multiSaveButton || !multiSaveButton->isOn() ) + repaint( FALSE ); // and finally repaint, flicker-free +} + + +void MagWidget::paintEvent( TQPaintEvent * ) +{ + if ( !pm.isNull() ) { + TQPainter paint( this ); + paint.drawPixmap( 0, zoom ? zoom->height()+4 : 0, pm, + 0,0, width(), height()-yoffset ); + } +} + + +void MagWidget::mousePressEvent( TQMouseEvent *e ) +{ + if ( !grabbing ) { // prepare to grab... + grabbing = TRUE; + killTimers(); + grabMouse( crossCursor ); + grabx = -1; + graby = -1; + } else { // REALLY prepare to grab + grabx = mapToGlobal(e->pos()).x(); + graby = mapToGlobal(e->pos()).y(); + } +} + + + +void MagWidget::mouseReleaseEvent( TQMouseEvent * e ) +{ + if ( grabbing && grabx >= 0 && graby >= 0 ) { + grabbing = FALSE; + grabAround(e->pos()); + releaseMouse(); + } +} + +void MagWidget::grabAround(TQPoint pos) +{ + int rx, ry; + rx = mapToGlobal(pos).x(); + ry = mapToGlobal(pos).y(); + int w = TQABS(rx-grabx); + int h = TQABS(ry-graby); + if ( w > 10 && h > 10 ) { + int pz; + pz = 1; + while ( w*pz*h*pz < width()*(height()-yoffset) && + w*pz < TQApplication::desktop()->width() && + h*pz < TQApplication::desktop()->height() ) + pz++; + if ( (w*pz*h*pz - width()*(height()-yoffset)) > + (width()*(height()-yoffset) - w*(pz-1)*h*(pz-1)) ) + pz--; + if ( pz < 1 ) + pz = 1; + if ( pz > 8 ) + pz = 8; + if ( zoom ) + zoom->setCurrentItem( pz-1 ); + + z = pz; + grabx = TQMIN(rx, grabx) + w/2; + graby = TQMIN(ry, graby) + h/2; + resize( w*z, h*z+yoffset ); + } + grab(); + if ( r ) + startTimer( timer[r] ); +} + + +void MagWidget::mouseMoveEvent( TQMouseEvent *e ) +{ + if ( grabbing || pm.isNull() || + e->pos().y() > height() - (zoom ? zoom->fontMetrics().height() - 4 : 0) || + e->pos().y() < (zoom ? zoom->height()+4 : 4) ) { + rgb->setText( "" ); + } else { + int x,y; + x = e->pos().x() / z; + y = (e->pos().y() - ( zoom ? zoom->height() : 0 ) - 4) / z; + TQString pixelinfo; + if ( image.valid(x,y) ) + { + TQRgb px = image.pixel(x,y); + pixelinfo.sprintf(" %3d,%3d,%3d #%02x%02x%02x", + qRed(px), qGreen(px), qBlue(px), + qRed(px), qGreen(px), qBlue(px)); + } + TQString label; + label.sprintf( "x=%d, y=%d %s", + x+grabx, y+graby, (const char*)pixelinfo ); + rgb->setText( label ); + } +} + + +void MagWidget::focusOutEvent( TQFocusEvent * ) +{ + rgb->setText( "" ); +} + + +void MagWidget::timerEvent( TQTimerEvent * ) +{ + grab(); +/* + if ( multiSaveButton->isOn() && !multifn.isEmpty() ) { + TQRegExp num("[0-9][0-9]*"); + int start; + int len; + if ((start=num.match(multifn,0,&len))>=0) + multifn.replace(num, + TQString().setNum(multifn.mid(start,len).toInt()+1) + ); + p.save( multifn, "BMP" ); + } +*/ +} + + +void MagWidget::resizeEvent( TQResizeEvent * ) +{ + rgb->setGeometry( 0, height() - rgb->height(), width(), rgb->height() ); + grab(); +} + + +#include "qmag.moc" + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + MagWidget m; + a.setMainWidget( &m ); + m.show(); + return a.exec(); +} diff --git a/examples/qmag/qmag.doc b/examples/qmag/qmag.doc new file mode 100644 index 000000000..5084f395e --- /dev/null +++ b/examples/qmag/qmag.doc @@ -0,0 +1,23 @@ +/* +*/ +/*! \page qmag-example.html + + \ingroup examples + \title QMag + + This is a simple magnifier-type program. It shows how one can do + some tquite low-level operations in a portable way using Qt. + + Run it, click in the magnifier window, then click where you want to + magnify or drag out a rectangle. Two combo boxes let you select + amplification and refresh frequency, a text label tells you the color + of the pixel the cursor is on, and a button lets you save the + magnified area as a .bmp file. + + <hr> + + Implementation: + + \include qmag/qmag.cpp +*/ + diff --git a/examples/qmag/qmag.pro b/examples/qmag/qmag.pro new file mode 100644 index 000000000..a19025fce --- /dev/null +++ b/examples/qmag/qmag.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = qmag + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = qmag.cpp diff --git a/examples/qtl/qtl-qvaluelist.doc b/examples/qtl/qtl-qvaluelist.doc new file mode 100644 index 000000000..e87908a83 --- /dev/null +++ b/examples/qtl/qtl-qvaluelist.doc @@ -0,0 +1,19 @@ +/*! \page qtl-qvaluelist-example.html + + \ingroup examples + \title A Tiny QTL Example + +This tiny example shows a \l{QValueListIterator}. + +<hr> + + Implementation: + + \include qtl/qvaluelistiterator.cpp + + +*/ + + + + diff --git a/examples/qtl/qtl.pro b/examples/qtl/qtl.pro new file mode 100644 index 000000000..7601f1796 --- /dev/null +++ b/examples/qtl/qtl.pro @@ -0,0 +1,7 @@ +TEMPLATE = app +TARGET = qtl + +CONFIG += qt console warn_on release + +SOURCES = qvaluelistiterator.cpp +INTERFACES = diff --git a/examples/qtl/qvaluelistiterator.cpp b/examples/qtl/qvaluelistiterator.cpp new file mode 100644 index 000000000..a9c65afa7 --- /dev/null +++ b/examples/qtl/qvaluelistiterator.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qvaluelist.h> +#include <qstring.h> +#include <qwindowdefs.h> +#include <stdio.h> + + +class Employee +{ +public: + Employee(): s(0) {} + Employee( const TQString& name, int salary ) + : n(name), s(salary) {} + + TQString name() const { return n; } + + int salary() const { return s; } + void setSalary( int salary ) { s = salary; } + + // this is here to support very old compilers + Q_DUMMY_COMPARISON_OPERATOR( Employee ) + +private: + TQString n; + int s; +}; + + +int main( int, char** ) +{ + typedef TQValueList<Employee> EmployeeList; + EmployeeList list; + + list.append( Employee("Bill", 50000) ); + list.append( Employee("Steve",80000) ); + list.append( Employee("Ron", 60000) ); + + Employee joe( "Joe", 50000 ); + list.append( joe ); + joe.setSalary( 4000 ); + + EmployeeList::ConstIterator it = list.begin(); + while( it != list.end() ) { + printf( "%s earns %d\n", (*it).name().latin1(), (*it).salary() ); + ++it; + } + + return 0; +} diff --git a/examples/qwerty/ANSI_X3.110-1983.map b/examples/qwerty/ANSI_X3.110-1983.map new file mode 100644 index 000000000..1b7058ecb --- /dev/null +++ b/examples/qwerty/ANSI_X3.110-1983.map @@ -0,0 +1,511 @@ +<code_set_name> ANSI_X3.110-1983 +<comment_char> % +<escape_char> / +% version: 1.0 +% repertoiremap: mnemonic,ds +% source: ECMA registry + +% alias ISO-IR-99 +% alias CSA_T500-1983 +% alias NAPLPS +CHARMAP +<NU> /x00 <U0000> NULL (NUL) +<SH> /x01 <U0001> START OF HEADING (SOH) +<SX> /x02 <U0002> START OF TEXT (STX) +<EX> /x03 <U0003> END OF TEXT (ETX) +<ET> /x04 <U0004> END OF TRANSMISSION (EOT) +<EQ> /x05 <U0005> ENQUIRY (ENQ) +<AK> /x06 <U0006> ACKNOWLEDGE (ACK) +<BL> /x07 <U0007> BELL (BEL) +<BS> /x08 <U0008> BACKSPACE (BS) +<HT> /x09 <U0009> CHARACTER TABULATION (HT) +<LF> /x0A <U000A> LINE FEED (LF) +<VT> /x0B <U000B> LINE TABULATION (VT) +<FF> /x0C <U000C> FORM FEED (FF) +<CR> /x0D <U000D> CARRIAGE RETURN (CR) +<SO> /x0E <U000E> SHIFT OUT (SO) +<SI> /x0F <U000F> SHIFT IN (SI) +<DL> /x10 <U0010> DATALINK ESCAPE (DLE) +<D1> /x11 <U0011> DEVICE CONTROL ONE (DC1) +<D2> /x12 <U0012> DEVICE CONTROL TWO (DC2) +<D3> /x13 <U0013> DEVICE CONTROL THREE (DC3) +<D4> /x14 <U0014> DEVICE CONTROL FOUR (DC4) +<NK> /x15 <U0015> NEGATIVE ACKNOWLEDGE (NAK) +<SY> /x16 <U0016> SYNCHRONOUS IDLE (SYN) +<EB> /x17 <U0017> END OF TRANSMISSION BLOCK (ETB) +<CN> /x18 <U0018> CANCEL (CAN) +<EM> /x19 <U0019> END OF MEDIUM (EM) +<SB> /x1A <U001A> SUBSTITUTE (SUB) +<EC> /x1B <U001B> ESCAPE (ESC) +<FS> /x1C <U001C> FILE SEPARATOR (IS4) +<GS> /x1D <U001D> GROUP SEPARATOR (IS3) +<RS> /x1E <U001E> RECORD SEPARATOR (IS2) +<US> /x1F <U001F> UNIT SEPARATOR (IS1) +<SP> /x20 <U0020> SPACE +<!> /x21 <U0021> EXCLAMATION MARK +<"> /x22 <U0022> QUOTATION MARK +<%> /x25 <U0025> PERCENT SIGN +<&> /x26 <U0026> AMPERSAND +<'> /x27 <U0027> APOSTROPHE +<(> /x28 <U0028> LEFT PARENTHESIS +<)> /x29 <U0029> RIGHT PARENTHESIS +<*> /x2A <U002A> ASTERISK +<+> /x2B <U002B> PLUS SIGN +<,> /x2C <U002C> COMMA +<-> /x2D <U002D> HYPHEN-MINUS +<.> /x2E <U002E> FULL STOP +<//> /x2F <U002F> SOLIDUS +<0> /x30 <U0030> DIGIT ZERO +<1> /x31 <U0031> DIGIT ONE +<2> /x32 <U0032> DIGIT TWO +<3> /x33 <U0033> DIGIT THREE +<4> /x34 <U0034> DIGIT FOUR +<5> /x35 <U0035> DIGIT FIVE +<6> /x36 <U0036> DIGIT SIX +<7> /x37 <U0037> DIGIT SEVEN +<8> /x38 <U0038> DIGIT EIGHT +<9> /x39 <U0039> DIGIT NINE +<:> /x3A <U003A> COLON +<;> /x3B <U003B> SEMICOLON +<<> /x3C <U003C> LESS-THAN SIGN +<=> /x3D <U003D> EQUALS SIGN +</>> /x3E <U003E> GREATER-THAN SIGN +<?> /x3F <U003F> QUESTION MARK +<At> /x40 <U0040> COMMERCIAL AT +<A> /x41 <U0041> LATIN CAPITAL LETTER A +<B> /x42 <U0042> LATIN CAPITAL LETTER B +<C> /x43 <U0043> LATIN CAPITAL LETTER C +<D> /x44 <U0044> LATIN CAPITAL LETTER D +<E> /x45 <U0045> LATIN CAPITAL LETTER E +<F> /x46 <U0046> LATIN CAPITAL LETTER F +<G> /x47 <U0047> LATIN CAPITAL LETTER G +<H> /x48 <U0048> LATIN CAPITAL LETTER H +<I> /x49 <U0049> LATIN CAPITAL LETTER I +<J> /x4A <U004A> LATIN CAPITAL LETTER J +<K> /x4B <U004B> LATIN CAPITAL LETTER K +<L> /x4C <U004C> LATIN CAPITAL LETTER L +<M> /x4D <U004D> LATIN CAPITAL LETTER M +<N> /x4E <U004E> LATIN CAPITAL LETTER N +<O> /x4F <U004F> LATIN CAPITAL LETTER O +<P> /x50 <U0050> LATIN CAPITAL LETTER P +<Q> /x51 <U0051> LATIN CAPITAL LETTER Q +<R> /x52 <U0052> LATIN CAPITAL LETTER R +<S> /x53 <U0053> LATIN CAPITAL LETTER S +<T> /x54 <U0054> LATIN CAPITAL LETTER T +<U> /x55 <U0055> LATIN CAPITAL LETTER U +<V> /x56 <U0056> LATIN CAPITAL LETTER V +<W> /x57 <U0057> LATIN CAPITAL LETTER W +<X> /x58 <U0058> LATIN CAPITAL LETTER X +<Y> /x59 <U0059> LATIN CAPITAL LETTER Y +<Z> /x5A <U005A> LATIN CAPITAL LETTER Z +<<(> /x5B <U005B> LEFT SQUARE BRACKET +<////> /x5C <U005C> REVERSE SOLIDUS +<)/>> /x5D <U005D> RIGHT SQUARE BRACKET +<'/>> /x5E <U005E> CIRCUMFLEX ACCENT +<_> /x5F <U005F> LOW LINE +<'!> /x60 <U0060> GRAVE ACCENT +<a> /x61 <U0061> LATIN SMALL LETTER A +<b> /x62 <U0062> LATIN SMALL LETTER B +<c> /x63 <U0063> LATIN SMALL LETTER C +<d> /x64 <U0064> LATIN SMALL LETTER D +<e> /x65 <U0065> LATIN SMALL LETTER E +<f> /x66 <U0066> LATIN SMALL LETTER F +<g> /x67 <U0067> LATIN SMALL LETTER G +<h> /x68 <U0068> LATIN SMALL LETTER H +<i> /x69 <U0069> LATIN SMALL LETTER I +<j> /x6A <U006A> LATIN SMALL LETTER J +<k> /x6B <U006B> LATIN SMALL LETTER K +<l> /x6C <U006C> LATIN SMALL LETTER L +<m> /x6D <U006D> LATIN SMALL LETTER M +<n> /x6E <U006E> LATIN SMALL LETTER N +<o> /x6F <U006F> LATIN SMALL LETTER O +<p> /x70 <U0070> LATIN SMALL LETTER P +<q> /x71 <U0071> LATIN SMALL LETTER Q +<r> /x72 <U0072> LATIN SMALL LETTER R +<s> /x73 <U0073> LATIN SMALL LETTER S +<t> /x74 <U0074> LATIN SMALL LETTER T +<u> /x75 <U0075> LATIN SMALL LETTER U +<v> /x76 <U0076> LATIN SMALL LETTER V +<w> /x77 <U0077> LATIN SMALL LETTER W +<x> /x78 <U0078> LATIN SMALL LETTER X +<y> /x79 <U0079> LATIN SMALL LETTER Y +<z> /x7A <U007A> LATIN SMALL LETTER Z +<(!> /x7B <U007B> LEFT CURLY BRACKET +<!!> /x7C <U007C> VERTICAL LINE +<!)> /x7D <U007D> RIGHT CURLY BRACKET +<'?> /x7E <U007E> TILDE +<DT> /x7F <U007F> DELETE (DEL) +<PA> /x80 <U0080> PADDING CHARACTER (PAD) +<HO> /x81 <U0081> HIGH OCTET PRESET (HOP) +<BH> /x82 <U0082> BREAK PERMITTED HERE (BPH) +<NH> /x83 <U0083> NO BREAK HERE (NBH) +<IN> /x84 <U0084> INDEX (IND) +<NL> /x85 <U0085> NEXT LINE (NEL) +<SA> /x86 <U0086> START OF SELECTED AREA (SSA) +<ES> /x87 <U0087> END OF SELECTED AREA (ESA) +<HS> /x88 <U0088> CHARACTER TABULATION SET (HTS) +<HJ> /x89 <U0089> CHARACTER TABULATION WITH JUSTIFICATION (HTJ) +<VS> /x8A <U008A> LINE TABULATION SET (VTS) +<PD> /x8B <U008B> PARTIAL LINE FORWARD (PLD) +<PU> /x8C <U008C> PARTIAL LINE BACKWARD (PLU) +<RI> /x8D <U008D> REVERSE LINE FEED (RI) +<S2> /x8E <U008E> SINGLE-SHIFT TWO (SS2) +<S3> /x8F <U008F> SINGLE-SHIFT THREE (SS3) +<DC> /x90 <U0090> DEVICE CONTROL STRING (DCS) +<P1> /x91 <U0091> PRIVATE USE ONE (PU1) +<P2> /x92 <U0092> PRIVATE USE TWO (PU2) +<TS> /x93 <U0093> SET TRANSMIT STATE (STS) +<CC> /x94 <U0094> CANCEL CHARACTER (CCH) +<MW> /x95 <U0095> MESSAGE WAITING (MW) +<SG> /x96 <U0096> START OF GUARDED AREA (SPA) +<EG> /x97 <U0097> END OF GUARDED AREA (EPA) +<SS> /x98 <U0098> START OF STRING (SOS) +<GC> /x99 <U0099> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) +<SC> /x9A <U009A> SINGLE CHARACTER INTRODUCER (SCI) +<CI> /x9B <U009B> CONTROL SEQUENCE INTRODUCER (CSI) +<ST> /x9C <U009C> STRING TERMINATOR (ST) +<OC> /x9D <U009D> OPERATING SYSTEM COMMAND (OSC) +<PM> /x9E <U009E> PRIVACY MESSAGE (PM) +<AC> /x9F <U009F> APPLICATION PROGRAM COMMAND (APC) +<!I> /xA1 <U00A1> INVERTED EXCLAMATION MARK +<Ct> /xA2 <U00A2> CENT SIGN +<Pd> /xA3 <U00A3> POUND SIGN +<DO> /xA4 <U0024> DOLLAR SIGN +<Ye> /xA5 <U00A5> YEN SIGN +<Nb> /xA6 <U0023> NUMBER SIGN +<SE> /xA7 <U00A7> SECTION SIGN +<Cu> /xA8 <U00A4> CURRENCY SIGN +<'6> /xA9 <U2018> LEFT SINGLE QUOTATION MARK +<"6> /xAA <U201C> LEFT DOUBLE QUOTATION MARK +<<<> /xAB <U00AB> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +<<-> /xAC <U2190> LEFTWARDS ARROW +<-!> /xAD <U2191> UPWARDS ARROW +<-/>> /xAE <U2192> RIGHTWARDS ARROW +<-v> /xAF <U2193> DOWNWARDS ARROW +<DG> /xB0 <U00B0> DEGREE SIGN +<+-> /xB1 <U00B1> PLUS-MINUS SIGN +<2S> /xB2 <U00B2> SUPERSCRIPT TWO +<3S> /xB3 <U00B3> SUPERSCRIPT THREE +<*X> /xB4 <U00D7> MULTIPLICATION SIGN +<My> /xB5 <U00B5> MICRO SIGN +<PI> /xB6 <U00B6> PILCROW SIGN +<.M> /xB7 <U00B7> MIDDLE DOT +<-:> /xB8 <U00F7> DIVISION SIGN +<'9> /xB9 <U2019> RIGHT SINGLE QUOTATION MARK +<"9> /xBA <U201D> RIGHT DOUBLE QUOTATION MARK +</>/>> /xBB <U00BB> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +<14> /xBC <U00BC> VULGAR FRACTION ONE QUARTER +<12> /xBD <U00BD> VULGAR FRACTION ONE HALF +<34> /xBE <U00BE> VULGAR FRACTION THREE QUARTERS +<?I> /xBF <U00BF> INVERTED QUESTION MARK +<"!> /xC1 <UE002> NON-SPACING GRAVE ACCENT <ISO-IR-103_C1> (not a real character) +<"'> /xC2 <UE003> NON-SPACING ACUTE ACCENT <ISO-IR-103_C2> (not a real character) +<"/>> /xC3 <UE004> NON-SPACING CIRCUMFLEX ACCENT <ISO-IR-103_C3> (not a real character) +<"?> /xC4 <UE005> NON-SPACING TILDE <ISO-IR-103_C4> (not a real character) +<"-> /xC5 <UE006> NON-SPACING MACRON <ISO-IR-103_C5> (not a real character) +<"(> /xC6 <UE007> NON-SPACING BREVE <ISO-IR-103_C6> (not a real character) +<".> /xC7 <UE008> NON-SPACING DOT ABOVE <ISO-IR-103_C7> (not a real character) +<":> /xC8 <UE009> NON-SPACING DIAERESIS <ISO-IR-103_C8> (not a real character) +<"//> /xC9 <UE011> NON-SPACING LONG SOLIDUS OVERLAY <ISO-IR-128_C9> (not a real character) +<"0> /xCA <UE00A> NON-SPACING RING ABOVE <ISO-IR-103_CA> (not a real character) +<",> /xCB <UE00B> NON-SPACING CEDILLA <ISO-IR-103_CB> (not a real character) +<"_> /xCC <UE00C> NON-SPACING LOW LINE <ISO-IR-103_CC> (not a real character) +<""> /xCD <UE00D> NON-SPACING DOUBLE ACCUTE ACCENT <ISO-IR-103_CD> (not a real character) +<";> /xCE <UE00E> NON-SPACING OGONEK <ISO-IR-103_CE> (not a real character) +<"<> /xCF <UE00F> NON-SPACING CARON <ISO-IR-103_CF> (not a real character) +<-M> /xD0 <U2014> EM DASH +<1S> /xD1 <U00B9> SUPERSCRIPT ONE +<Rg> /xD2 <U00AE> REGISTERED SIGN +<Co> /xD3 <U00A9> COPYRIGHT SIGN +<TM> /xD4 <U2122> TRADE MARK SIGN +<M8> /xD5 <U266A> EIGHTH NOTE +<hh> /xD6 <U2500> BOX DRAWINGS LIGHT HORIZONTAL +<vv> /xD7 <U2502> BOX DRAWINGS LIGHT VERTICAL +<FD> /xD8 <U2571> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +<BD> /xD9 <U2572> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +<Fd> /xDA <U25E2> BLACK LOWER RIGHT TRIANGLE +<Bd> /xDB <U25E3> BLACK LOWER LEFT TRIANGLE +<18> /xDC <U215B> VULGAR FRACTION ONE EIGHTH +<38> /xDD <U215C> VULGAR FRACTION THREE EIGHTHS +<58> /xDE <U215D> VULGAR FRACTION FIVE EIGHTHS +<78> /xDF <U215E> VULGAR FRACTION SEVEN EIGHTHS +<Om> /xE0 <U2126> OHM SIGN +<AE> /xE1 <U00C6> LATIN CAPITAL LETTER AE +<D-> /xE2 <U00D0> LATIN CAPITAL LETTER ETH (Icelandic) +<-a> /xE3 <U00AA> FEMININE ORDINAL INDICATOR +<H//> /xE4 <U0126> LATIN CAPITAL LETTER H WITH STROKE +<vh> /xE5 <U253C> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +<IJ> /xE6 <U0132> LATIN CAPITAL LIGATURE IJ +<L.> /xE7 <U013F> LATIN CAPITAL LETTER L WITH MIDDLE DOT +<L//> /xE8 <U0141> LATIN CAPITAL LETTER L WITH STROKE +<O//> /xE9 <U00D8> LATIN CAPITAL LETTER O WITH STROKE +<OE> /xEA <U0152> LATIN CAPITAL LIGATURE OE +<-o> /xEB <U00BA> MASCULINE ORDINAL INDICATOR +<TH> /xEC <U00DE> LATIN CAPITAL LETTER THORN (Icelandic) +<T//> /xED <U0166> LATIN CAPITAL LETTER T WITH STROKE +<NG> /xEE <U014A> LATIN CAPITAL LETTER ENG (Sami) +<'n> /xEF <U0149> LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +<kk> /xF0 <U0138> LATIN SMALL LETTER KRA (Greenlandic) +<ae> /xF1 <U00E6> LATIN SMALL LETTER AE +<d//> /xF2 <U0111> LATIN SMALL LETTER D WITH STROKE +<d-> /xF3 <U00F0> LATIN SMALL LETTER ETH (Icelandic) +<h//> /xF4 <U0127> LATIN SMALL LETTER H WITH STROKE +<i.> /xF5 <U0131> LATIN SMALL LETTER DOTLESS I +<ij> /xF6 <U0133> LATIN SMALL LIGATURE IJ +<l.> /xF7 <U0140> LATIN SMALL LETTER L WITH MIDDLE DOT +<l//> /xF8 <U0142> LATIN SMALL LETTER L WITH STROKE +<o//> /xF9 <U00F8> LATIN SMALL LETTER O WITH STROKE +<oe> /xFA <U0153> LATIN SMALL LIGATURE OE +<ss> /xFB <U00DF> LATIN SMALL LETTER SHARP S (German) +<th> /xFC <U00FE> LATIN SMALL LETTER THORN (Icelandic) +<t//> /xFD <U0167> LATIN SMALL LETTER T WITH STROKE +<ng> /xFE <U014B> LATIN SMALL LETTER ENG (Sami) +<''> /xC2/x20 <U00B4> ACUTE ACCENT +<a'> /xC2/x61 <U00E1> LATIN SMALL LETTER A WITH ACUTE +<A'> /xC2/x41 <U00C1> LATIN CAPITAL LETTER A WITH ACUTE +<e'> /xC2/x65 <U00E9> LATIN SMALL LETTER E WITH ACUTE +<E'> /xC2/x45 <U00C9> LATIN CAPITAL LETTER E WITH ACUTE +<i'> /xC2/x69 <U00ED> LATIN SMALL LETTER I WITH ACUTE +<I'> /xC2/x49 <U00CD> LATIN CAPITAL LETTER I WITH ACUTE +<o'> /xC2/x6F <U00F3> LATIN SMALL LETTER O WITH ACUTE +<O'> /xC2/x4F <U00D3> LATIN CAPITAL LETTER O WITH ACUTE +<u'> /xC2/x75 <U00FA> LATIN SMALL LETTER U WITH ACUTE +<U'> /xC2/x55 <U00DA> LATIN CAPITAL LETTER U WITH ACUTE +<y'> /xC2/x79 <U00FD> LATIN SMALL LETTER Y WITH ACUTE +<Y'> /xC2/x59 <U00DD> LATIN CAPITAL LETTER Y WITH ACUTE +<c'> /xC2/x63 <U0107> LATIN SMALL LETTER C WITH ACUTE +<C'> /xC2/x43 <U0106> LATIN CAPITAL LETTER C WITH ACUTE +<l'> /xC2/x6C <U013A> LATIN SMALL LETTER L WITH ACUTE +<L'> /xC2/x4C <U0139> LATIN CAPITAL LETTER L WITH ACUTE +<n'> /xC2/x6E <U0144> LATIN SMALL LETTER N WITH ACUTE +<N'> /xC2/x4E <U0143> LATIN CAPITAL LETTER N WITH ACUTE +<r'> /xC2/x72 <U0155> LATIN SMALL LETTER R WITH ACUTE +<R'> /xC2/x52 <U0154> LATIN CAPITAL LETTER R WITH ACUTE +<s'> /xC2/x73 <U015B> LATIN SMALL LETTER S WITH ACUTE +<S'> /xC2/x53 <U015A> LATIN CAPITAL LETTER S WITH ACUTE +<z'> /xC2/x7A <U017A> LATIN SMALL LETTER Z WITH ACUTE +<Z'> /xC2/x5A <U0179> LATIN CAPITAL LETTER Z WITH ACUTE +<'(> /xC6/x20 <U02D8> BREVE +<a(> /xC6/x61 <U0103> LATIN SMALL LETTER A WITH BREVE +<A(> /xC6/x41 <U0102> LATIN CAPITAL LETTER A WITH BREVE +<g(> /xC6/x67 <U011F> LATIN SMALL LETTER G WITH BREVE +<G(> /xC6/x47 <U011E> LATIN CAPITAL LETTER G WITH BREVE +<u(> /xC6/x75 <U016D> LATIN SMALL LETTER U WITH BREVE +<U(> /xC6/x55 <U016C> LATIN CAPITAL LETTER U WITH BREVE +<'<> /xCF/x20 <U02C7> CARON (Mandarin Chinese third tone) +<c<> /xCF/x63 <U010D> LATIN SMALL LETTER C WITH CARON +<C<> /xCF/x43 <U010C> LATIN CAPITAL LETTER C WITH CARON +<d<> /xCF/x64 <U010F> LATIN SMALL LETTER D WITH CARON +<D<> /xCF/x44 <U010E> LATIN CAPITAL LETTER D WITH CARON +<e<> /xCF/x65 <U011B> LATIN SMALL LETTER E WITH CARON +<E<> /xCF/x45 <U011A> LATIN CAPITAL LETTER E WITH CARON +<l<> /xCF/x6C <U013E> LATIN SMALL LETTER L WITH CARON +<L<> /xCF/x4C <U013D> LATIN CAPITAL LETTER L WITH CARON +<n<> /xCF/x6E <U0148> LATIN SMALL LETTER N WITH CARON +<N<> /xCF/x4E <U0147> LATIN CAPITAL LETTER N WITH CARON +<r<> /xCF/x72 <U0159> LATIN SMALL LETTER R WITH CARON +<R<> /xCF/x52 <U0158> LATIN CAPITAL LETTER R WITH CARON +<s<> /xCF/x73 <U0161> LATIN SMALL LETTER S WITH CARON +<S<> /xCF/x53 <U0160> LATIN CAPITAL LETTER S WITH CARON +<t<> /xCF/x74 <U0165> LATIN SMALL LETTER T WITH CARON +<T<> /xCF/x54 <U0164> LATIN CAPITAL LETTER T WITH CARON +<z<> /xCF/x7A <U017E> LATIN SMALL LETTER Z WITH CARON +<Z<> /xCF/x5A <U017D> LATIN CAPITAL LETTER Z WITH CARON +<',> /xCB/x20 <U00B8> CEDILLA +<c,> /xCB/x63 <U00E7> LATIN SMALL LETTER C WITH CEDILLA +<C,> /xCB/x43 <U00C7> LATIN CAPITAL LETTER C WITH CEDILLA +<g,> /xCB/x67 <U0123> LATIN SMALL LETTER G WITH CEDILLA +<G,> /xCB/x47 <U0122> LATIN CAPITAL LETTER G WITH CEDILLA +<k,> /xCB/x6B <U0137> LATIN SMALL LETTER K WITH CEDILLA +<K,> /xCB/x4B <U0136> LATIN CAPITAL LETTER K WITH CEDILLA +<l,> /xCB/x6C <U013C> LATIN SMALL LETTER L WITH CEDILLA +<L,> /xCB/x4C <U013B> LATIN CAPITAL LETTER L WITH CEDILLA +<n,> /xCB/x6E <U0146> LATIN SMALL LETTER N WITH CEDILLA +<N,> /xCB/x4E <U0145> LATIN CAPITAL LETTER N WITH CEDILLA +<r,> /xCB/x72 <U0157> LATIN SMALL LETTER R WITH CEDILLA +<R,> /xCB/x52 <U0156> LATIN CAPITAL LETTER R WITH CEDILLA +<s,> /xCB/x73 <U015F> LATIN SMALL LETTER S WITH CEDILLA +<S,> /xCB/x53 <U015E> LATIN CAPITAL LETTER S WITH CEDILLA +<t,> /xCB/x74 <U0163> LATIN SMALL LETTER T WITH CEDILLA +<T,> /xCB/x54 <U0162> LATIN CAPITAL LETTER T WITH CEDILLA +<a/>> /xC3/x61 <U00E2> LATIN SMALL LETTER A WITH CIRCUMFLEX +<A/>> /xC3/x41 <U00C2> LATIN CAPITAL LETTER A WITH CIRCUMFLEX +<e/>> /xC3/x65 <U00EA> LATIN SMALL LETTER E WITH CIRCUMFLEX +<E/>> /xC3/x45 <U00CA> LATIN CAPITAL LETTER E WITH CIRCUMFLEX +<i/>> /xC3/x69 <U00EE> LATIN SMALL LETTER I WITH CIRCUMFLEX +<I/>> /xC3/x49 <U00CE> LATIN CAPITAL LETTER I WITH CIRCUMFLEX +<o/>> /xC3/x6F <U00F4> LATIN SMALL LETTER O WITH CIRCUMFLEX +<O/>> /xC3/x4F <U00D4> LATIN CAPITAL LETTER O WITH CIRCUMFLEX +<u/>> /xC3/x75 <U00FB> LATIN SMALL LETTER U WITH CIRCUMFLEX +<U/>> /xC3/x55 <U00DB> LATIN CAPITAL LETTER U WITH CIRCUMFLEX +<y/>> /xC3/x79 <U0177> LATIN SMALL LETTER Y WITH CIRCUMFLEX +<Y/>> /xC3/x59 <U0176> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +<c/>> /xC3/x63 <U0109> LATIN SMALL LETTER C WITH CIRCUMFLEX +<C/>> /xC3/x43 <U0108> LATIN CAPITAL LETTER C WITH CIRCUMFLEX +<g/>> /xC3/x67 <U011D> LATIN SMALL LETTER G WITH CIRCUMFLEX +<G/>> /xC3/x47 <U011C> LATIN CAPITAL LETTER G WITH CIRCUMFLEX +<h/>> /xC3/x68 <U0125> LATIN SMALL LETTER H WITH CIRCUMFLEX +<H/>> /xC3/x48 <U0124> LATIN CAPITAL LETTER H WITH CIRCUMFLEX +<j/>> /xC3/x6A <U0135> LATIN SMALL LETTER J WITH CIRCUMFLEX +<J/>> /xC3/x4A <U0134> LATIN CAPITAL LETTER J WITH CIRCUMFLEX +<s/>> /xC3/x73 <U015D> LATIN SMALL LETTER S WITH CIRCUMFLEX +<S/>> /xC3/x53 <U015C> LATIN CAPITAL LETTER S WITH CIRCUMFLEX +<w/>> /xC3/x77 <U0175> LATIN SMALL LETTER W WITH CIRCUMFLEX +<W/>> /xC3/x57 <U0174> LATIN CAPITAL LETTER W WITH CIRCUMFLEX +<':> /xC8/x20 <U00A8> DIAERESIS +<a:> /xC8/x61 <U00E4> LATIN SMALL LETTER A WITH DIAERESIS +<A:> /xC8/x41 <U00C4> LATIN CAPITAL LETTER A WITH DIAERESIS +<e:> /xC8/x65 <U00EB> LATIN SMALL LETTER E WITH DIAERESIS +<E:> /xC8/x45 <U00CB> LATIN CAPITAL LETTER E WITH DIAERESIS +<i:> /xC8/x69 <U00EF> LATIN SMALL LETTER I WITH DIAERESIS +<I:> /xC8/x49 <U00CF> LATIN CAPITAL LETTER I WITH DIAERESIS +<o:> /xC8/x6F <U00F6> LATIN SMALL LETTER O WITH DIAERESIS +<O:> /xC8/x4F <U00D6> LATIN CAPITAL LETTER O WITH DIAERESIS +<u:> /xC8/x75 <U00FC> LATIN SMALL LETTER U WITH DIAERESIS +<U:> /xC8/x55 <U00DC> LATIN CAPITAL LETTER U WITH DIAERESIS +<y:> /xC8/x79 <U00FF> LATIN SMALL LETTER Y WITH DIAERESIS +<Y:> /xC8/x59 <U0178> LATIN CAPITAL LETTER Y WITH DIAERESIS +<'.> /xC7/x20 <U02D9> DOT ABOVE (Mandarin Chinese light tone) +<c.> /xC7/x63 <U010B> LATIN SMALL LETTER C WITH DOT ABOVE +<C.> /xC7/x43 <U010A> LATIN CAPITAL LETTER C WITH DOT ABOVE +<e.> /xC7/x65 <U0117> LATIN SMALL LETTER E WITH DOT ABOVE +<E.> /xC7/x45 <U0116> LATIN CAPITAL LETTER E WITH DOT ABOVE +<g.> /xC7/x67 <U0121> LATIN SMALL LETTER G WITH DOT ABOVE +<G.> /xC7/x47 <U0120> LATIN CAPITAL LETTER G WITH DOT ABOVE +<I.> /xC7/x49 <U0130> LATIN CAPITAL LETTER I WITH DOT ABOVE +<z.> /xC7/x7A <U017C> LATIN SMALL LETTER Z WITH DOT ABOVE +<Z.> /xC7/x5A <U017B> LATIN CAPITAL LETTER Z WITH DOT ABOVE +<'"> /xCD/x20 <U02DD> DOUBLE ACUTE ACCENT +<o"> /xCD/x6F <U0151> LATIN SMALL LETTER O WITH DOUBLE ACUTE +<O"> /xCD/x4F <U0150> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +<u"> /xCD/x75 <U0171> LATIN SMALL LETTER U WITH DOUBLE ACUTE +<U"> /xCD/x55 <U0170> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +<a!> /xC1/x61 <U00E0> LATIN SMALL LETTER A WITH GRAVE +<A!> /xC1/x41 <U00C0> LATIN CAPITAL LETTER A WITH GRAVE +<e!> /xC1/x65 <U00E8> LATIN SMALL LETTER E WITH GRAVE +<E!> /xC1/x45 <U00C8> LATIN CAPITAL LETTER E WITH GRAVE +<i!> /xC1/x69 <U00EC> LATIN SMALL LETTER I WITH GRAVE +<I!> /xC1/x49 <U00CC> LATIN CAPITAL LETTER I WITH GRAVE +<o!> /xC1/x6F <U00F2> LATIN SMALL LETTER O WITH GRAVE +<O!> /xC1/x4F <U00D2> LATIN CAPITAL LETTER O WITH GRAVE +<u!> /xC1/x75 <U00F9> LATIN SMALL LETTER U WITH GRAVE +<U!> /xC1/x55 <U00D9> LATIN CAPITAL LETTER U WITH GRAVE +<'m> /xC5/x20 <U00AF> MACRON +<a-> /xC5/x61 <U0101> LATIN SMALL LETTER A WITH MACRON +<A-> /xC5/x41 <U0100> LATIN CAPITAL LETTER A WITH MACRON +<e-> /xC5/x65 <U0113> LATIN SMALL LETTER E WITH MACRON +<E-> /xC5/x45 <U0112> LATIN CAPITAL LETTER E WITH MACRON +<i-> /xC5/x69 <U012B> LATIN SMALL LETTER I WITH MACRON +<I-> /xC5/x49 <U012A> LATIN CAPITAL LETTER I WITH MACRON +<o-> /xC5/x6F <U014D> LATIN SMALL LETTER O WITH MACRON +<O-> /xC5/x4F <U014C> LATIN CAPITAL LETTER O WITH MACRON +<u-> /xC5/x75 <U016B> LATIN SMALL LETTER U WITH MACRON +<U-> /xC5/x55 <U016A> LATIN CAPITAL LETTER U WITH MACRON +<';> /xCE/x20 <U02DB> OGONEK +<a;> /xCE/x61 <U0105> LATIN SMALL LETTER A WITH OGONEK +<A;> /xCE/x41 <U0104> LATIN CAPITAL LETTER A WITH OGONEK +<e;> /xCE/x65 <U0119> LATIN SMALL LETTER E WITH OGONEK +<E;> /xCE/x45 <U0118> LATIN CAPITAL LETTER E WITH OGONEK +<i;> /xCE/x69 <U012F> LATIN SMALL LETTER I WITH OGONEK +<I;> /xCE/x49 <U012E> LATIN CAPITAL LETTER I WITH OGONEK +<u;> /xCE/x75 <U0173> LATIN SMALL LETTER U WITH OGONEK +<U;> /xCE/x55 <U0172> LATIN CAPITAL LETTER U WITH OGONEK +<'0> /xCA/x20 <U02DA> RING ABOVE +<aa> /xCA/x61 <U00E5> LATIN SMALL LETTER A WITH RING ABOVE +<AA> /xCA/x41 <U00C5> LATIN CAPITAL LETTER A WITH RING ABOVE +<u0> /xCA/x75 <U016F> LATIN SMALL LETTER U WITH RING ABOVE +<U0> /xCA/x55 <U016E> LATIN CAPITAL LETTER U WITH RING ABOVE +<a?> /xC4/x61 <U00E3> LATIN SMALL LETTER A WITH TILDE +<A?> /xC4/x41 <U00C3> LATIN CAPITAL LETTER A WITH TILDE +<n?> /xC4/x6E <U00F1> LATIN SMALL LETTER N WITH TILDE +<N?> /xC4/x4E <U00D1> LATIN CAPITAL LETTER N WITH TILDE +<i?> /xC4/x69 <U0129> LATIN SMALL LETTER I WITH TILDE +<I?> /xC4/x49 <U0128> LATIN CAPITAL LETTER I WITH TILDE +<o?> /xC4/x6F <U00F5> LATIN SMALL LETTER O WITH TILDE +<O?> /xC4/x4F <U00D5> LATIN CAPITAL LETTER O WITH TILDE +<u?> /xC4/x75 <U0169> LATIN SMALL LETTER U WITH TILDE +<U?> /xC4/x55 <U0168> LATIN CAPITAL LETTER U WITH TILDE +<NUL> /x00 <U0000> NUL +<SOH> /x01 <U0001> START OF HEADING (SOH) +<STX> /x02 <U0002> START OF TEXT (STX) +<ETX> /x03 <U0003> END OF TEXT (ETX) +<EOT> /x04 <U0004> END OF TRANSMISSION (EOT) +<ENQ> /x05 <U0005> ENQUIRY (ENQ) +<ACK> /x06 <U0006> ACKNOWLEDGE (ACK) +<alert> /x07 <U0007> BELL (BEL) +<BEL> /x07 <U0007> BELL (BEL) +<backspace> /x08 <U0008> BACKSPACE (BS) +<tab> /x09 <U0009> CHARACTER TABULATION (HT) +<newline> /x0A <U000A> LINE FEED (LF) +<vertical-tab> /x0B <U000B> LINE TABULATION (VT) +<form-feed> /x0C <U000C> FORM FEED (FF) +<carriage-return> /x0D <U000D> CARRIAGE RETURN (CR) +<DLE> /x10 <U0010> DATALINK ESCAPE (DLE) +<DC1> /x11 <U0011> DEVICE CONTROL ONE (DC1) +<DC2> /x12 <U0012> DEVICE CONTROL TWO (DC2) +<DC3> /x13 <U0013> DEVICE CONTROL THREE (DC3) +<DC4> /x14 <U0014> DEVICE CONTROL FOUR (DC4) +<NAK> /x15 <U0015> NEGATIVE ACKNOWLEDGE (NAK) +<SYN> /x16 <U0016> SYNCHRONOUS IDLE (SYN) +<ETB> /x17 <U0017> END OF TRANSMISSION BLOCK (ETB) +<CAN> /x18 <U0018> CANCEL (CAN) +<SUB> /x1A <U001A> SUBSTITUTE (SUB) +<ESC> /x1B <U001B> ESCAPE (ESC) +<IS4> /x1C <U001C> FILE SEPARATOR (IS4) +<IS3> /x1D <U001D> GROUP SEPARATOR (IS3) +<intro> /x1D <U001D> GROUP SEPARATOR (IS3) +<IS2> /x1E <U001E> RECORD SEPARATOR (IS2) +<IS1> /x1F <U001F> UNIT SEPARATOR (IS1) +<DEL> /x7F <U007F> DELETE (DEL) +<space> /x20 <U0020> SPACE +<exclamation-mark> /x21 <U0021> EXCLAMATION MARK +<quotation-mark> /x22 <U0022> QUOTATION MARK +<number-sign> /xA6 <U0023> NUMBER SIGN +<dollar-sign> /xA4 <U0024> DOLLAR SIGN +<percent-sign> /x25 <U0025> PERCENT SIGN +<ampersand> /x26 <U0026> AMPERSAND +<apostrophe> /x27 <U0027> APOSTROPHE +<left-parenthesis> /x28 <U0028> LEFT PARENTHESIS +<right-parenthesis> /x29 <U0029> RIGHT PARENTHESIS +<asterisk> /x2A <U002A> ASTERISK +<plus-sign> /x2B <U002B> PLUS SIGN +<comma> /x2C <U002C> COMMA +<hyphen> /x2D <U002D> HYPHEN-MINUS +<hyphen-minus> /x2D <U002D> HYPHEN-MINUS +<period> /x2E <U002E> FULL STOP +<full-stop> /x2E <U002E> FULL STOP +<slash> /x2F <U002F> SOLIDUS +<solidus> /x2F <U002F> SOLIDUS +<zero> /x30 <U0030> DIGIT ZERO +<one> /x31 <U0031> DIGIT ONE +<two> /x32 <U0032> DIGIT TWO +<three> /x33 <U0033> DIGIT THREE +<four> /x34 <U0034> DIGIT FOUR +<five> /x35 <U0035> DIGIT FIVE +<six> /x36 <U0036> DIGIT SIX +<seven> /x37 <U0037> DIGIT SEVEN +<eight> /x38 <U0038> DIGIT EIGHT +<nine> /x39 <U0039> DIGIT NINE +<colon> /x3A <U003A> COLON +<semicolon> /x3B <U003B> SEMICOLON +<less-than-sign> /x3C <U003C> LESS-THAN SIGN +<equals-sign> /x3D <U003D> EQUALS SIGN +<greater-than-sign> /x3E <U003E> GREATER-THAN SIGN +<question-mark> /x3F <U003F> QUESTION MARK +<commercial-at> /x40 <U0040> COMMERCIAL AT +<left-square-bracket> /x5B <U005B> LEFT SQUARE BRACKET +<backslash> /x5C <U005C> REVERSE SOLIDUS +<reverse-solidus> /x5C <U005C> REVERSE SOLIDUS +<right-square-bracket> /x5D <U005D> RIGHT SQUARE BRACKET +<circumflex> /x5E <U005E> CIRCUMFLEX ACCENT +<circumflex-accent> /x5E <U005E> CIRCUMFLEX ACCENT +<underscore> /x5F <U005F> LOW LINE +<low-line> /x5F <U005F> LOW LINE +<grave-accent> /x60 <U0060> GRAVE ACCENT +<left-brace> /x7B <U007B> LEFT CURLY BRACKET +<left-curly-bracket> /x7B <U007B> LEFT CURLY BRACKET +<vertical-line> /x7C <U007C> VERTICAL LINE +<right-brace> /x7D <U007D> RIGHT CURLY BRACKET +<right-curly-bracket> /x7D <U007D> RIGHT CURLY BRACKET +<tilde> /x7E <U007E> TILDE +END CHARMAP diff --git a/examples/qwerty/ANSI_X3.110-1983.txt b/examples/qwerty/ANSI_X3.110-1983.txt new file mode 100644 index 000000000..eab630853 --- /dev/null +++ b/examples/qwerty/ANSI_X3.110-1983.txt @@ -0,0 +1,7 @@ +ABCDE
+ÂaÃaÄaÈaÊañËcÁeÂeÃeÈeÁiÂiÃiÈióÄnÁoÂoÃoÄoÈoùÁuÂa
+?????
+?????
+?????
+??????
+??????
\ No newline at end of file diff --git a/examples/qwerty/IBM277.map b/examples/qwerty/IBM277.map new file mode 100644 index 000000000..51a2472d9 --- /dev/null +++ b/examples/qwerty/IBM277.map @@ -0,0 +1,350 @@ +<code_set_name> IBM277 +<comment_char> % +<escape_char> / +% version: 1.0 +% repertoiremap: mnemonic,ds +% source: IBM NLS RM Vol2 SE09-8002-01, March 1990 + +% alias EBCDIC-CP-DK +% alias EBCDIC-CP-NO +CHARMAP +<NU> /x00 <U0000> NULL (NUL) +<SH> /x01 <U0001> START OF HEADING (SOH) +<SX> /x02 <U0002> START OF TEXT (STX) +<EX> /x03 <U0003> END OF TEXT (ETX) +<ST> /x04 <U009C> STRING TERMINATOR (ST) +<HT> /x05 <U0009> CHARACTER TABULATION (HT) +<SA> /x06 <U0086> START OF SELECTED AREA (SSA) +<DT> /x07 <U007F> DELETE (DEL) +<EG> /x08 <U0097> END OF GUARDED AREA (EPA) +<RI> /x09 <U008D> REVERSE LINE FEED (RI) +<S2> /x0A <U008E> SINGLE-SHIFT TWO (SS2) +<VT> /x0B <U000B> LINE TABULATION (VT) +<FF> /x0C <U000C> FORM FEED (FF) +<CR> /x0D <U000D> CARRIAGE RETURN (CR) +<SO> /x0E <U000E> SHIFT OUT (SO) +<SI> /x0F <U000F> SHIFT IN (SI) +<DL> /x10 <U0010> DATALINK ESCAPE (DLE) +<D1> /x11 <U0011> DEVICE CONTROL ONE (DC1) +<D2> /x12 <U0012> DEVICE CONTROL TWO (DC2) +<D3> /x13 <U0013> DEVICE CONTROL THREE (DC3) +<OC> /x14 <U009D> OPERATING SYSTEM COMMAND (OSC) +<NL> /x15 <U0085> NEXT LINE (NEL) +<BS> /x16 <U0008> BACKSPACE (BS) +<ES> /x17 <U0087> END OF SELECTED AREA (ESA) +<CN> /x18 <U0018> CANCEL (CAN) +<EM> /x19 <U0019> END OF MEDIUM (EM) +<P2> /x1A <U0092> PRIVATE USE TWO (PU2) +<S3> /x1B <U008F> SINGLE-SHIFT THREE (SS3) +<FS> /x1C <U001C> FILE SEPARATOR (IS4) +<GS> /x1D <U001D> GROUP SEPARATOR (IS3) +<RS> /x1E <U001E> RECORD SEPARATOR (IS2) +<US> /x1F <U001F> UNIT SEPARATOR (IS1) +<PA> /x20 <U0080> PADDING CHARACTER (PAD) +<HO> /x21 <U0081> HIGH OCTET PRESET (HOP) +<BH> /x22 <U0082> BREAK PERMITTED HERE (BPH) +<NH> /x23 <U0083> NO BREAK HERE (NBH) +<IN> /x24 <U0084> INDEX (IND) +<LF> /x25 <U000A> LINE FEED (LF) +<EB> /x26 <U0017> END OF TRANSMISSION BLOCK (ETB) +<EC> /x27 <U001B> ESCAPE (ESC) +<HS> /x28 <U0088> CHARACTER TABULATION SET (HTS) +<HJ> /x29 <U0089> CHARACTER TABULATION WITH JUSTIFICATION (HTJ) +<VS> /x2A <U008A> LINE TABULATION SET (VTS) +<PD> /x2B <U008B> PARTIAL LINE FORWARD (PLD) +<PU> /x2C <U008C> PARTIAL LINE BACKWARD (PLU) +<EQ> /x2D <U0005> ENQUIRY (ENQ) +<AK> /x2E <U0006> ACKNOWLEDGE (ACK) +<BL> /x2F <U0007> BELL (BEL) +<DC> /x30 <U0090> DEVICE CONTROL STRING (DCS) +<P1> /x31 <U0091> PRIVATE USE ONE (PU1) +<SY> /x32 <U0016> SYNCHRONOUS IDLE (SYN) +<TS> /x33 <U0093> SET TRANSMIT STATE (STS) +<CC> /x34 <U0094> CANCEL CHARACTER (CCH) +<MW> /x35 <U0095> MESSAGE WAITING (MW) +<SG> /x36 <U0096> START OF GUARDED AREA (SPA) +<ET> /x37 <U0004> END OF TRANSMISSION (EOT) +<SS> /x38 <U0098> START OF STRING (SOS) +<GC> /x39 <U0099> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) +<SC> /x3A <U009A> SINGLE CHARACTER INTRODUCER (SCI) +<CI> /x3B <U009B> CONTROL SEQUENCE INTRODUCER (CSI) +<D4> /x3C <U0014> DEVICE CONTROL FOUR (DC4) +<NK> /x3D <U0015> NEGATIVE ACKNOWLEDGE (NAK) +<PM> /x3E <U009E> PRIVACY MESSAGE (PM) +<SB> /x3F <U001A> SUBSTITUTE (SUB) +<SP> /x40 <U0020> SPACE +<NS> /x41 <U00A0> NO-BREAK SPACE +<a/>> /x42 <U00E2> LATIN SMALL LETTER A WITH CIRCUMFLEX +<a:> /x43 <U00E4> LATIN SMALL LETTER A WITH DIAERESIS +<a!> /x44 <U00E0> LATIN SMALL LETTER A WITH GRAVE +<a'> /x45 <U00E1> LATIN SMALL LETTER A WITH ACUTE +<a?> /x46 <U00E3> LATIN SMALL LETTER A WITH TILDE +<!)> /x47 <U007D> RIGHT CURLY BRACKET +<c,> /x48 <U00E7> LATIN SMALL LETTER C WITH CEDILLA +<n?> /x49 <U00F1> LATIN SMALL LETTER N WITH TILDE +<Nb> /x4A <U0023> NUMBER SIGN +<.> /x4B <U002E> FULL STOP +<<> /x4C <U003C> LESS-THAN SIGN +<(> /x4D <U0028> LEFT PARENTHESIS +<+> /x4E <U002B> PLUS SIGN +<!> /x4F <U0021> EXCLAMATION MARK +<&> /x50 <U0026> AMPERSAND +<e'> /x51 <U00E9> LATIN SMALL LETTER E WITH ACUTE +<e/>> /x52 <U00EA> LATIN SMALL LETTER E WITH CIRCUMFLEX +<e:> /x53 <U00EB> LATIN SMALL LETTER E WITH DIAERESIS +<e!> /x54 <U00E8> LATIN SMALL LETTER E WITH GRAVE +<i'> /x55 <U00ED> LATIN SMALL LETTER I WITH ACUTE +<i/>> /x56 <U00EE> LATIN SMALL LETTER I WITH CIRCUMFLEX +<i:> /x57 <U00EF> LATIN SMALL LETTER I WITH DIAERESIS +<i!> /x58 <U00EC> LATIN SMALL LETTER I WITH GRAVE +<ss> /x59 <U00DF> LATIN SMALL LETTER SHARP S (German) +<Cu> /x5A <U00A4> CURRENCY SIGN +<AA> /x5B <U00C5> LATIN CAPITAL LETTER A WITH RING ABOVE +<*> /x5C <U002A> ASTERISK +<)> /x5D <U0029> RIGHT PARENTHESIS +<;> /x5E <U003B> SEMICOLON +<'/>> /x5F <U005E> CIRCUMFLEX ACCENT +<-> /x60 <U002D> HYPHEN-MINUS +<//> /x61 <U002F> SOLIDUS +<A/>> /x62 <U00C2> LATIN CAPITAL LETTER A WITH CIRCUMFLEX +<A:> /x63 <U00C4> LATIN CAPITAL LETTER A WITH DIAERESIS +<A!> /x64 <U00C0> LATIN CAPITAL LETTER A WITH GRAVE +<A'> /x65 <U00C1> LATIN CAPITAL LETTER A WITH ACUTE +<A?> /x66 <U00C3> LATIN CAPITAL LETTER A WITH TILDE +<DO> /x67 <U0024> DOLLAR SIGN +<C,> /x68 <U00C7> LATIN CAPITAL LETTER C WITH CEDILLA +<N?> /x69 <U00D1> LATIN CAPITAL LETTER N WITH TILDE +<o//> /x6A <U00F8> LATIN SMALL LETTER O WITH STROKE +<,> /x6B <U002C> COMMA +<%> /x6C <U0025> PERCENT SIGN +<_> /x6D <U005F> LOW LINE +</>> /x6E <U003E> GREATER-THAN SIGN +<?> /x6F <U003F> QUESTION MARK +<BB> /x70 <U00A6> BROKEN BAR +<E'> /x71 <U00C9> LATIN CAPITAL LETTER E WITH ACUTE +<E/>> /x72 <U00CA> LATIN CAPITAL LETTER E WITH CIRCUMFLEX +<E:> /x73 <U00CB> LATIN CAPITAL LETTER E WITH DIAERESIS +<E!> /x74 <U00C8> LATIN CAPITAL LETTER E WITH GRAVE +<I'> /x75 <U00CD> LATIN CAPITAL LETTER I WITH ACUTE +<I/>> /x76 <U00CE> LATIN CAPITAL LETTER I WITH CIRCUMFLEX +<I:> /x77 <U00CF> LATIN CAPITAL LETTER I WITH DIAERESIS +<I!> /x78 <U00CC> LATIN CAPITAL LETTER I WITH GRAVE +<'!> /x79 <U0060> GRAVE ACCENT +<:> /x7A <U003A> COLON +<AE> /x7B <U00C6> LATIN CAPITAL LETTER AE +<O//> /x7C <U00D8> LATIN CAPITAL LETTER O WITH STROKE +<'> /x7D <U0027> APOSTROPHE +<=> /x7E <U003D> EQUALS SIGN +<"> /x7F <U0022> QUOTATION MARK +<At> /x80 <U0040> COMMERCIAL AT +<a> /x81 <U0061> LATIN SMALL LETTER A +<b> /x82 <U0062> LATIN SMALL LETTER B +<c> /x83 <U0063> LATIN SMALL LETTER C +<d> /x84 <U0064> LATIN SMALL LETTER D +<e> /x85 <U0065> LATIN SMALL LETTER E +<f> /x86 <U0066> LATIN SMALL LETTER F +<g> /x87 <U0067> LATIN SMALL LETTER G +<h> /x88 <U0068> LATIN SMALL LETTER H +<i> /x89 <U0069> LATIN SMALL LETTER I +<<<> /x8A <U00AB> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +</>/>> /x8B <U00BB> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +<d-> /x8C <U00F0> LATIN SMALL LETTER ETH (Icelandic) +<y'> /x8D <U00FD> LATIN SMALL LETTER Y WITH ACUTE +<th> /x8E <U00FE> LATIN SMALL LETTER THORN (Icelandic) +<+-> /x8F <U00B1> PLUS-MINUS SIGN +<DG> /x90 <U00B0> DEGREE SIGN +<j> /x91 <U006A> LATIN SMALL LETTER J +<k> /x92 <U006B> LATIN SMALL LETTER K +<l> /x93 <U006C> LATIN SMALL LETTER L +<m> /x94 <U006D> LATIN SMALL LETTER M +<n> /x95 <U006E> LATIN SMALL LETTER N +<o> /x96 <U006F> LATIN SMALL LETTER O +<p> /x97 <U0070> LATIN SMALL LETTER P +<q> /x98 <U0071> LATIN SMALL LETTER Q +<r> /x99 <U0072> LATIN SMALL LETTER R +<-a> /x9A <U00AA> FEMININE ORDINAL INDICATOR +<-o> /x9B <U00BA> MASCULINE ORDINAL INDICATOR +<(!> /x9C <U007B> LEFT CURLY BRACKET +<',> /x9D <U00B8> CEDILLA +<<(> /x9E <U005B> LEFT SQUARE BRACKET +<)/>> /x9F <U005D> RIGHT SQUARE BRACKET +<My> /xA0 <U00B5> MICRO SIGN +<u:> /xA1 <U00FC> LATIN SMALL LETTER U WITH DIAERESIS +<s> /xA2 <U0073> LATIN SMALL LETTER S +<t> /xA3 <U0074> LATIN SMALL LETTER T +<u> /xA4 <U0075> LATIN SMALL LETTER U +<v> /xA5 <U0076> LATIN SMALL LETTER V +<w> /xA6 <U0077> LATIN SMALL LETTER W +<x> /xA7 <U0078> LATIN SMALL LETTER X +<y> /xA8 <U0079> LATIN SMALL LETTER Y +<z> /xA9 <U007A> LATIN SMALL LETTER Z +<!I> /xAA <U00A1> INVERTED EXCLAMATION MARK +<?I> /xAB <U00BF> INVERTED QUESTION MARK +<D-> /xAC <U00D0> LATIN CAPITAL LETTER ETH (Icelandic) +<Y'> /xAD <U00DD> LATIN CAPITAL LETTER Y WITH ACUTE +<TH> /xAE <U00DE> LATIN CAPITAL LETTER THORN (Icelandic) +<Rg> /xAF <U00AE> REGISTERED SIGN +<Ct> /xB0 <U00A2> CENT SIGN +<Pd> /xB1 <U00A3> POUND SIGN +<Ye> /xB2 <U00A5> YEN SIGN +<.M> /xB3 <U00B7> MIDDLE DOT +<Co> /xB4 <U00A9> COPYRIGHT SIGN +<SE> /xB5 <U00A7> SECTION SIGN +<PI> /xB6 <U00B6> PILCROW SIGN +<14> /xB7 <U00BC> VULGAR FRACTION ONE QUARTER +<12> /xB8 <U00BD> VULGAR FRACTION ONE HALF +<34> /xB9 <U00BE> VULGAR FRACTION THREE QUARTERS +<NO> /xBA <U00AC> NOT SIGN +<!!> /xBB <U007C> VERTICAL LINE +<'-> /xBC <U203E> OVERLINE +<':> /xBD <U00A8> DIAERESIS +<''> /xBE <U00B4> ACUTE ACCENT +<*X> /xBF <U00D7> MULTIPLICATION SIGN +<ae> /xC0 <U00E6> LATIN SMALL LETTER AE +<A> /xC1 <U0041> LATIN CAPITAL LETTER A +<B> /xC2 <U0042> LATIN CAPITAL LETTER B +<C> /xC3 <U0043> LATIN CAPITAL LETTER C +<D> /xC4 <U0044> LATIN CAPITAL LETTER D +<E> /xC5 <U0045> LATIN CAPITAL LETTER E +<F> /xC6 <U0046> LATIN CAPITAL LETTER F +<G> /xC7 <U0047> LATIN CAPITAL LETTER G +<H> /xC8 <U0048> LATIN CAPITAL LETTER H +<I> /xC9 <U0049> LATIN CAPITAL LETTER I +<--> /xCA <U00AD> SOFT HYPHEN +<o/>> /xCB <U00F4> LATIN SMALL LETTER O WITH CIRCUMFLEX +<o:> /xCC <U00F6> LATIN SMALL LETTER O WITH DIAERESIS +<o!> /xCD <U00F2> LATIN SMALL LETTER O WITH GRAVE +<o'> /xCE <U00F3> LATIN SMALL LETTER O WITH ACUTE +<o?> /xCF <U00F5> LATIN SMALL LETTER O WITH TILDE +<aa> /xD0 <U00E5> LATIN SMALL LETTER A WITH RING ABOVE +<J> /xD1 <U004A> LATIN CAPITAL LETTER J +<K> /xD2 <U004B> LATIN CAPITAL LETTER K +<L> /xD3 <U004C> LATIN CAPITAL LETTER L +<M> /xD4 <U004D> LATIN CAPITAL LETTER M +<N> /xD5 <U004E> LATIN CAPITAL LETTER N +<O> /xD6 <U004F> LATIN CAPITAL LETTER O +<P> /xD7 <U0050> LATIN CAPITAL LETTER P +<Q> /xD8 <U0051> LATIN CAPITAL LETTER Q +<R> /xD9 <U0052> LATIN CAPITAL LETTER R +<1S> /xDA <U00B9> SUPERSCRIPT ONE +<u/>> /xDB <U00FB> LATIN SMALL LETTER U WITH CIRCUMFLEX +<'?> /xDC <U007E> TILDE +<u!> /xDD <U00F9> LATIN SMALL LETTER U WITH GRAVE +<u'> /xDE <U00FA> LATIN SMALL LETTER U WITH ACUTE +<y:> /xDF <U00FF> LATIN SMALL LETTER Y WITH DIAERESIS +<////> /xE0 <U005C> REVERSE SOLIDUS +<-:> /xE1 <U00F7> DIVISION SIGN +<S> /xE2 <U0053> LATIN CAPITAL LETTER S +<T> /xE3 <U0054> LATIN CAPITAL LETTER T +<U> /xE4 <U0055> LATIN CAPITAL LETTER U +<V> /xE5 <U0056> LATIN CAPITAL LETTER V +<W> /xE6 <U0057> LATIN CAPITAL LETTER W +<X> /xE7 <U0058> LATIN CAPITAL LETTER X +<Y> /xE8 <U0059> LATIN CAPITAL LETTER Y +<Z> /xE9 <U005A> LATIN CAPITAL LETTER Z +<2S> /xEA <U00B2> SUPERSCRIPT TWO +<O/>> /xEB <U00D4> LATIN CAPITAL LETTER O WITH CIRCUMFLEX +<O:> /xEC <U00D6> LATIN CAPITAL LETTER O WITH DIAERESIS +<O!> /xED <U00D2> LATIN CAPITAL LETTER O WITH GRAVE +<O'> /xEE <U00D3> LATIN CAPITAL LETTER O WITH ACUTE +<O?> /xEF <U00D5> LATIN CAPITAL LETTER O WITH TILDE +<0> /xF0 <U0030> DIGIT ZERO +<1> /xF1 <U0031> DIGIT ONE +<2> /xF2 <U0032> DIGIT TWO +<3> /xF3 <U0033> DIGIT THREE +<4> /xF4 <U0034> DIGIT FOUR +<5> /xF5 <U0035> DIGIT FIVE +<6> /xF6 <U0036> DIGIT SIX +<7> /xF7 <U0037> DIGIT SEVEN +<8> /xF8 <U0038> DIGIT EIGHT +<9> /xF9 <U0039> DIGIT NINE +<3S> /xFA <U00B3> SUPERSCRIPT THREE +<U/>> /xFB <U00DB> LATIN CAPITAL LETTER U WITH CIRCUMFLEX +<U:> /xFC <U00DC> LATIN CAPITAL LETTER U WITH DIAERESIS +<U!> /xFD <U00D9> LATIN CAPITAL LETTER U WITH GRAVE +<U'> /xFE <U00DA> LATIN CAPITAL LETTER U WITH ACUTE +<AC> /xFF <U009F> APPLICATION PROGRAM COMMAND (APC) +<NUL> /x00 <U0000> NUL +<SOH> /x01 <U0001> START OF HEADING (SOH) +<STX> /x02 <U0002> START OF TEXT (STX) +<ETX> /x03 <U0003> END OF TEXT (ETX) +<EOT> /x37 <U0004> END OF TRANSMISSION (EOT) +<ENQ> /x2D <U0005> ENQUIRY (ENQ) +<ACK> /x2E <U0006> ACKNOWLEDGE (ACK) +<alert> /x2F <U0007> BELL (BEL) +<BEL> /x2F <U0007> BELL (BEL) +<backspace> /x16 <U0008> BACKSPACE (BS) +<tab> /x05 <U0009> CHARACTER TABULATION (HT) +<newline> /x25 <U000A> LINE FEED (LF) +<vertical-tab> /x0B <U000B> LINE TABULATION (VT) +<form-feed> /x0C <U000C> FORM FEED (FF) +<carriage-return> /x0D <U000D> CARRIAGE RETURN (CR) +<DLE> /x10 <U0010> DATALINK ESCAPE (DLE) +<DC1> /x11 <U0011> DEVICE CONTROL ONE (DC1) +<DC2> /x12 <U0012> DEVICE CONTROL TWO (DC2) +<DC3> /x13 <U0013> DEVICE CONTROL THREE (DC3) +<DC4> /x3C <U0014> DEVICE CONTROL FOUR (DC4) +<NAK> /x3D <U0015> NEGATIVE ACKNOWLEDGE (NAK) +<SYN> /x32 <U0016> SYNCHRONOUS IDLE (SYN) +<ETB> /x26 <U0017> END OF TRANSMISSION BLOCK (ETB) +<CAN> /x18 <U0018> CANCEL (CAN) +<SUB> /x3F <U001A> SUBSTITUTE (SUB) +<ESC> /x27 <U001B> ESCAPE (ESC) +<IS4> /x1C <U001C> FILE SEPARATOR (IS4) +<IS3> /x1D <U001D> GROUP SEPARATOR (IS3) +<intro> /x1D <U001D> GROUP SEPARATOR (IS3) +<IS2> /x1E <U001E> RECORD SEPARATOR (IS2) +<IS1> /x1F <U001F> UNIT SEPARATOR (IS1) +<DEL> /x07 <U007F> DELETE (DEL) +<space> /x40 <U0020> SPACE +<exclamation-mark> /x4F <U0021> EXCLAMATION MARK +<quotation-mark> /x7F <U0022> QUOTATION MARK +<number-sign> /x4A <U0023> NUMBER SIGN +<dollar-sign> /x67 <U0024> DOLLAR SIGN +<percent-sign> /x6C <U0025> PERCENT SIGN +<ampersand> /x50 <U0026> AMPERSAND +<apostrophe> /x7D <U0027> APOSTROPHE +<left-parenthesis> /x4D <U0028> LEFT PARENTHESIS +<right-parenthesis> /x5D <U0029> RIGHT PARENTHESIS +<asterisk> /x5C <U002A> ASTERISK +<plus-sign> /x4E <U002B> PLUS SIGN +<comma> /x6B <U002C> COMMA +<hyphen> /x60 <U002D> HYPHEN-MINUS +<hyphen-minus> /x60 <U002D> HYPHEN-MINUS +<period> /x4B <U002E> FULL STOP +<full-stop> /x4B <U002E> FULL STOP +<slash> /x61 <U002F> SOLIDUS +<solidus> /x61 <U002F> SOLIDUS +<zero> /xF0 <U0030> DIGIT ZERO +<one> /xF1 <U0031> DIGIT ONE +<two> /xF2 <U0032> DIGIT TWO +<three> /xF3 <U0033> DIGIT THREE +<four> /xF4 <U0034> DIGIT FOUR +<five> /xF5 <U0035> DIGIT FIVE +<six> /xF6 <U0036> DIGIT SIX +<seven> /xF7 <U0037> DIGIT SEVEN +<eight> /xF8 <U0038> DIGIT EIGHT +<nine> /xF9 <U0039> DIGIT NINE +<colon> /x7A <U003A> COLON +<semicolon> /x5E <U003B> SEMICOLON +<less-than-sign> /x4C <U003C> LESS-THAN SIGN +<equals-sign> /x7E <U003D> EQUALS SIGN +<greater-than-sign> /x6E <U003E> GREATER-THAN SIGN +<question-mark> /x6F <U003F> QUESTION MARK +<commercial-at> /x80 <U0040> COMMERCIAL AT +<left-square-bracket> /x9E <U005B> LEFT SQUARE BRACKET +<backslash> /xE0 <U005C> REVERSE SOLIDUS +<reverse-solidus> /xE0 <U005C> REVERSE SOLIDUS +<right-square-bracket> /x9F <U005D> RIGHT SQUARE BRACKET +<circumflex> /x5F <U005E> CIRCUMFLEX ACCENT +<circumflex-accent> /x5F <U005E> CIRCUMFLEX ACCENT +<underscore> /x6D <U005F> LOW LINE +<low-line> /x6D <U005F> LOW LINE +<grave-accent> /x79 <U0060> GRAVE ACCENT +<left-brace> /x9C <U007B> LEFT CURLY BRACKET +<left-curly-bracket> /x9C <U007B> LEFT CURLY BRACKET +<vertical-line> /xBB <U007C> VERTICAL LINE +<right-brace> /x47 <U007D> RIGHT CURLY BRACKET +<right-curly-bracket> /x47 <U007D> RIGHT CURLY BRACKET +<tilde> /xDC <U007E> TILDE +END CHARMAP diff --git a/examples/qwerty/IBM277.txt b/examples/qwerty/IBM277.txt new file mode 100644 index 000000000..e0d659c87 --- /dev/null +++ b/examples/qwerty/IBM277.txt @@ -0,0 +1 @@ +ÁÂÃÄÅ
%EBFCÐÀHTQRSXUVWŒIÍÎËÏÌjÝE
%?????
%?????
%?????
%??????
%??????
\ No newline at end of file diff --git a/examples/qwerty/eucJP.txt b/examples/qwerty/eucJP.txt new file mode 100644 index 000000000..f7a867275 --- /dev/null +++ b/examples/qwerty/eucJP.txt @@ -0,0 +1,7 @@ +ABCDE
+¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢
+¤¢¤¤¤¦¤¨¤ª
+¤«¤¤¯¤±¤³
+¤µ¤·¤¹¤»¤½
+§«§¸§µ§¬§¦§¯
+§Û§è§å§Ü§Ö§ß
\ No newline at end of file diff --git a/examples/qwerty/koi8.txt b/examples/qwerty/koi8.txt new file mode 100644 index 000000000..8d08046ac --- /dev/null +++ b/examples/qwerty/koi8.txt @@ -0,0 +1,7 @@ +ABCDE
+¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
+¤¤¤¤¤
+¤¤¤¤¤
+¤¤¤¤¤
+êãõëåî
+ÊÃÕËÅÎ
\ No newline at end of file diff --git a/examples/qwerty/latin1.txt b/examples/qwerty/latin1.txt new file mode 100644 index 000000000..14ddc2522 --- /dev/null +++ b/examples/qwerty/latin1.txt @@ -0,0 +1,7 @@ +ABCDE
+áâãäåæçèéêëìíîïðñòóôõöøùá
+?????
+?????
+?????
+??????
+??????
\ No newline at end of file diff --git a/examples/qwerty/main.cpp b/examples/qwerty/main.cpp new file mode 100644 index 000000000..b514126ec --- /dev/null +++ b/examples/qwerty/main.cpp @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "qwerty.h" + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + + bool isSmall = qApp->desktop()->size().width() < 450 + || qApp->desktop()->size().height() < 450; + + int i; + for ( i= argc <= 1 ? 0 : 1; i<argc; i++ ) { + Editor *e = new Editor; + e->setCaption("TQt Example - TQWERTY"); + if ( i > 0 ) + e->load( argv[i] ); + if ( isSmall ) { + e->showMaximized(); + } else { + e->resize( 400, 400 ); + e->show(); + } + } + a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) ); + return a.exec(); +} diff --git a/examples/qwerty/msunicode.txt b/examples/qwerty/msunicode.txt Binary files differnew file mode 100644 index 000000000..a707a7604 --- /dev/null +++ b/examples/qwerty/msunicode.txt diff --git a/examples/qwerty/qwerty.cpp b/examples/qwerty/qwerty.cpp new file mode 100644 index 000000000..ceb2f92b7 --- /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 TQt. 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 TQPtrList<TQTextCodec> *codecList = 0; + +enum { Uni = 0, MBug = 1, Lat1 = 2, Local = 3, Guess = 4, Codec = 5 }; + + +Editor::Editor( TQWidget * parent , const char * name ) + : TQWidget( parent, name, WDestructiveClose ) +{ + m = new TQMenuBar( this, "menu" ); + + TQPopupMenu * file = new TQPopupMenu(); + 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 TQPopupMenu(); + file->insertItem( "Open &As", open_as ); + save_as = new TQPopupMenu(); + 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(); + + TQPopupMenu * edit = new TQPopupMenu(); + 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 TQMultiLineEdit( 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. + // + TQFont unifont("unifont",16,50); unifont.setPixelSize(16); + e->setFont( unifont ); + + e->setFocus(); +} + +Editor::~Editor() +{ +} + +void Editor::font() +{ +#ifndef QT_NO_FONTDIALOG + bool ok; + TQFont f = TQFontDialog::getFont( &ok, e->font() ); + if ( ok ) { + e->setFont( f ); + } +#endif +} + + + +void Editor::rebuildCodecList() +{ + delete codecList; + codecList = new TQPtrList<TQTextCodec>; + TQTextCodec *codec; + int i; + for (i = 0; (codec = TQTextCodec::codecForIndex(i)); i++) + codecList->append( codec ); + int n = codecList->count(); + for (int pm=0; pm<2; pm++) { + TQPopupMenu* menu = pm ? open_as : save_as; + menu->clear(); + TQString local = "Local ("; + local += TQTextCodec::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 + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) + load( fn, -1 ); +#endif +} + +void Editor::load( const TQString& fileName, int code ) +{ + TQFile f( fileName ); + if ( !f.open( IO_ReadOnly ) ) + return; + + e->setAutoUpdate( FALSE ); + + TQTextStream t(&f); + if ( code >= Codec ) + t.setCodec( codecList->at(code-Codec) ); + else if ( code == Uni ) + t.setEncoding( TQTextStream::Unicode ); + else if ( code == MBug ) + t.setEncoding( TQTextStream::UnicodeReverse ); + else if ( code == Lat1 ) + t.setEncoding( TQTextStream::Latin1 ); + else if ( code == Guess ) { + TQFile f(fileName); + f.open(IO_ReadOnly); + char buffer[256]; + int l = 256; + l=f.readBlock(buffer,l); + TQTextCodec* codec = TQTextCodec::codecForContent(buffer, l); + if ( codec ) { + TQMessageBox::information(this,"Encoding",TQString("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... + TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::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... + TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::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... + TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, this ); + if ( !fn.isEmpty() ) + (void) saveAs( fn, code ); +#endif +} + +void Editor::addEncoding() +{ +#ifndef QT_NO_FILEDIALOG + TQString fn = TQFileDialog::getOpenFileName( TQString::null, "*.map", this ); + if ( !fn.isEmpty() ) { + TQFile f(fn); + if (f.open(IO_ReadOnly)) { + if (TQTextCodec::loadCharmap(&f)) { + rebuildCodecList(); + } else { + TQMessageBox::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 TQString& fileName, int code ) +{ + TQFile f( fileName ); + if ( no_writing || !f.open( IO_WriteOnly ) ) { + TQMessageBox::warning(this,"I/O Error", + TQString("The file could not be opened.\n\n") + +fileName); + return FALSE; + } + TQTextStream t(&f); + if ( code >= Codec ) + t.setCodec( codecList->at(code-Codec) ); + else if ( code == Uni ) + t.setEncoding( TQTextStream::Unicode ); + else if ( code == MBug ) + t.setEncoding( TQTextStream::UnicodeReverse ); + else if ( code == Lat1 ) + t.setEncoding( TQTextStream::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 + TQPainter p; + p.begin( &printer ); // paint on printer + p.setFont( e->font() ); + TQFontMetrics fm = p.fontMetrics(); + TQPaintDeviceMetrics 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( TQResizeEvent * ) +{ + if ( e && m ) + e->setGeometry( 0, m->height(), width(), height() - m->height() ); +} + +void Editor::closeEvent( TQCloseEvent *event ) +{ + event->accept(); + + if ( changed ) { // the text has been changed + switch ( TQMessageBox::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; +} diff --git a/examples/qwerty/qwerty.doc b/examples/qwerty/qwerty.doc new file mode 100644 index 000000000..51a1febb1 --- /dev/null +++ b/examples/qwerty/qwerty.doc @@ -0,0 +1,27 @@ +/* +*/ +/*! \page qwerty-example.html + + \ingroup examples + \title Simple editor that can load encodings + + + <hr> + + Header file: + + \include qwerty/qwerty.h + + <hr> + + Implementation: + + \include qwerty/qwerty.cpp + + <hr> + + Main: + + \include qwerty/main.cpp +*/ + diff --git a/examples/qwerty/qwerty.h b/examples/qwerty/qwerty.h new file mode 100644 index 000000000..5509d5bd1 --- /dev/null +++ b/examples/qwerty/qwerty.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQWERTY_H +#define TQWERTY_H + +#include <qwidget.h> +#include <qmenubar.h> +#include <qmultilineedit.h> +#include <qprinter.h> + +class Editor : public TQWidget +{ + Q_OBJECT +public: + Editor( TQWidget *parent=0, const char *name="qwerty" ); + ~Editor(); + + void load( const TQString& fileName, int code=-1 ); + +public slots: + void newDoc(); + void load(); + bool save(); + void print(); + void addEncoding(); + void toUpper(); + void toLower(); + void font(); +protected: + void resizeEvent( TQResizeEvent * ); + void closeEvent( TQCloseEvent * ); + +private slots: + void saveAsEncoding( int ); + void openAsEncoding( int ); + void textChanged(); + +private: + bool saveAs( const TQString& fileName, int code=-1 ); + void rebuildCodecList(); + TQMenuBar *m; + TQMultiLineEdit *e; +#ifndef QT_NO_PRINTER + TQPrinter printer; +#endif + TQPopupMenu *save_as; + TQPopupMenu *open_as; + bool changed; +}; + +#endif // TQWERTY_H diff --git a/examples/qwerty/qwerty.pro b/examples/qwerty/qwerty.pro new file mode 100644 index 000000000..474333a55 --- /dev/null +++ b/examples/qwerty/qwerty.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = qwerty + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = qwerty.h +SOURCES = main.cpp \ + qwerty.cpp diff --git a/examples/qwerty/unicode.txt b/examples/qwerty/unicode.txt Binary files differnew file mode 100644 index 000000000..1d08d414f --- /dev/null +++ b/examples/qwerty/unicode.txt diff --git a/examples/rangecontrols/main.cpp b/examples/rangecontrols/main.cpp new file mode 100644 index 000000000..bc2fa2896 --- /dev/null +++ b/examples/rangecontrols/main.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "rangecontrols.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + RangeControls rangecontrols; + rangecontrols.resize( 500, 300 ); + rangecontrols.setCaption( "TQt Example - Range Control Widgets" ); + a.setMainWidget( &rangecontrols ); + rangecontrols.show(); + + return a.exec(); +} diff --git a/examples/rangecontrols/rangecontrols.cpp b/examples/rangecontrols/rangecontrols.cpp new file mode 100644 index 000000000..82d61673c --- /dev/null +++ b/examples/rangecontrols/rangecontrols.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "rangecontrols.h" + +#include <qhbox.h> +#include <qlcdnumber.h> +#include <qspinbox.h> +#include <qlabel.h> +#include <qstring.h> +#include <qslider.h> +#include <qcheckbox.h> + +#include <limits.h> + +RangeControls::RangeControls( TQWidget *parent, const char *name ) + : TQVBox( parent, name ) +{ + TQHBox *row1 = new TQHBox( this ); + + TQVBox *cell2 = new TQVBox( row1 ); + cell2->setMargin( 10 ); + cell2->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); + + (void)new TQWidget( cell2 ); + + TQLabel *label1 = new TQLabel( TQString( "Enter a value between\n%1 and %2:" ).arg( -INT_MAX ).arg( INT_MAX ), cell2 ); + label1->setMaximumHeight( label1->sizeHint().height() ); + TQSpinBox *sb1 = new TQSpinBox( -INT_MAX, INT_MAX, 1, cell2 ); + sb1->setValue( 0 ); + + TQLabel *label2 = new TQLabel( "Enter a zoom value:", cell2 ); + label2->setMaximumHeight( label2->sizeHint().height() ); + TQSpinBox *sb2 = new TQSpinBox( 0, 1000, 10, cell2 ); + sb2->setSuffix( " %" ); + sb2->setSpecialValueText( "Automatic" ); + + TQLabel *label3 = new TQLabel( "Enter a price:", cell2 ); + label3->setMaximumHeight( label3->sizeHint().height() ); + TQSpinBox *sb3 = new TQSpinBox( 0, INT_MAX, 1, cell2 ); + sb3->setPrefix( "$" ); + sb3->setValue( 355 ); + + (void)new TQWidget( cell2 ); + + TQHBox *row2 = new TQHBox( this ); + + TQVBox *cell3 = new TQVBox( row2 ); + cell3->setMargin( 10 ); + cell3->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); + TQSlider *hslider = new TQSlider( 0, 64, 1, 33, TQt::Horizontal, cell3, "horizontal_s" ); + TQLCDNumber *lcd2 = new TQLCDNumber( 2, cell3 ); + lcd2->display( 33 ); + lcd2->setSegmentStyle( TQLCDNumber::Filled ); + connect( hslider, SIGNAL( valueChanged( int ) ), lcd2, SLOT( display( int ) ) ); + + TQHBox *cell4 = new TQHBox( row2 ); + cell4->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); + cell4->setMargin( 10 ); + TQSlider *vslider = new TQSlider( 0, 64, 1, 8, TQt::Vertical, cell4 ); + TQLCDNumber *lcd3 = new TQLCDNumber( 3, cell4 ); + lcd3->display( 8 ); + connect( vslider, SIGNAL( valueChanged( int ) ), lcd3, SLOT( display( int ) ) ); +} diff --git a/examples/rangecontrols/rangecontrols.doc b/examples/rangecontrols/rangecontrols.doc new file mode 100644 index 000000000..3fc3323c3 --- /dev/null +++ b/examples/rangecontrols/rangecontrols.doc @@ -0,0 +1,28 @@ +/* +*/ +/*! \page rangecontrols-example.html + + \ingroup examples + \title Range controls + + This examples shows various types of range controls that + are supported by Qt: dials, spin boxes and sliders. + + <hr> + + Header file: + + \include rangecontrols/rangecontrols.h + + <hr> + + Implementation: + + \include rangecontrols/rangecontrols.cpp + + <hr> + + Main: + + \include rangecontrols/main.cpp +*/ diff --git a/examples/rangecontrols/rangecontrols.h b/examples/rangecontrols/rangecontrols.h new file mode 100644 index 000000000..549815c0d --- /dev/null +++ b/examples/rangecontrols/rangecontrols.h @@ -0,0 +1,28 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef RANGECONTROLS_H +#define RANGECONTROLS_H + +#include <qvbox.h> + +class TQCheckBox; + +class RangeControls : public TQVBox +{ + Q_OBJECT + +public: + RangeControls( TQWidget *parent = 0, const char *name = 0 ); + +private: + TQCheckBox *notches, *wrapping; +}; + +#endif diff --git a/examples/rangecontrols/rangecontrols.pro b/examples/rangecontrols/rangecontrols.pro new file mode 100644 index 000000000..21c1a5ddc --- /dev/null +++ b/examples/rangecontrols/rangecontrols.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = rangecontrols + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = rangecontrols.h +SOURCES = main.cpp \ + rangecontrols.cpp diff --git a/examples/regexptester/main.cpp b/examples/regexptester/main.cpp new file mode 100644 index 000000000..493c955af --- /dev/null +++ b/examples/regexptester/main.cpp @@ -0,0 +1,11 @@ +#include <qapplication.h> +#include "regexptester.h" + +int main(int argc, char **argv) +{ + TQApplication app(argc, argv); + RegexpTester form; + form.show(); + app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(tquit())); + return app.exec(); +} diff --git a/examples/regexptester/regexptester.cpp b/examples/regexptester/regexptester.cpp new file mode 100644 index 000000000..326c02048 --- /dev/null +++ b/examples/regexptester/regexptester.cpp @@ -0,0 +1,179 @@ +#include <qapplication.h> +#include <qcheckbox.h> +#include <qclipboard.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpushbutton.h> +#include <qregexp.h> +#include <qstatusbar.h> +#include <qtable.h> + +#include "regexptester.h" + + +RegexpTester::RegexpTester(TQWidget* parent, const char* name, bool modal, + WFlags f) + : TQDialog(parent, name, modal, f) +{ + regexLabel = new TQLabel(this); + regexComboBox = new TQComboBox(this); + regexComboBox->setEditable(true); + regexComboBox->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred); + regexLabel->setBuddy(regexComboBox); + textLabel = new TQLabel(this); + textComboBox = new TQComboBox(this); + textComboBox->setEditable(true); + textComboBox->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred); + textLabel->setBuddy(textComboBox); + caseSensitiveCheckBox = new TQCheckBox(this); + caseSensitiveCheckBox->setChecked(true); + minimalCheckBox = new TQCheckBox(this); + wildcardCheckBox = new TQCheckBox(this); + resultTable = new TQTable(3, 3, this); + resultTable->verticalHeader()->hide(); + resultTable->setLeftMargin(0); + resultTable->horizontalHeader()->hide(); + resultTable->setTopMargin(0); + resultTable->setReadOnly(true); + executePushButton = new TQPushButton(this); + executePushButton->setDefault(true); + copyPushButton = new TQPushButton(this); + tquitPushButton = new TQPushButton(this); + statusBar = new TQStatusBar(this); + + TQGridLayout *gridLayout = new TQGridLayout(2, 2, 6); + gridLayout->addWidget(regexLabel, 0, 0); + gridLayout->addWidget(regexComboBox, 0, 1); + gridLayout->addWidget(textLabel, 1, 0); + gridLayout->addWidget(textComboBox, 1, 1); + TQHBoxLayout *checkboxLayout = new TQHBoxLayout(0, 6, 6); + checkboxLayout->addWidget(caseSensitiveCheckBox); + checkboxLayout->addWidget(minimalCheckBox); + checkboxLayout->addWidget(wildcardCheckBox); + checkboxLayout->addStretch(1); + TQVBoxLayout *buttonLayout = new TQVBoxLayout(0, 6, 6); + buttonLayout->addWidget(executePushButton); + buttonLayout->addWidget(copyPushButton); + buttonLayout->addWidget(tquitPushButton); + buttonLayout->addStretch(1); + TQHBoxLayout *middleLayout = new TQHBoxLayout(0, 6, 6); + middleLayout->addWidget(resultTable); + middleLayout->addLayout(buttonLayout); + TQVBoxLayout *mainLayout = new TQVBoxLayout(this, 6, 6); + mainLayout->addLayout(gridLayout); + mainLayout->addLayout(checkboxLayout); + mainLayout->addLayout(middleLayout); + mainLayout->addWidget(statusBar); + + resize(TQSize(500, 350).expandedTo(minimumSizeHint())); + + languageChange(); + + connect(copyPushButton, SIGNAL(clicked()), this, SLOT(copy())); + connect(executePushButton, SIGNAL(clicked()), this, SLOT(execute())); + connect(tquitPushButton, SIGNAL(clicked()), this, SLOT(accept())); + + execute(); +} + +void RegexpTester::execute() +{ + TQString regex = regexComboBox->currentText(); + TQString text = textComboBox->currentText(); + if (!regex.isEmpty() && !text.isEmpty()) { + TQRegExp re(regex); + re.setCaseSensitive(caseSensitiveCheckBox->isChecked()); + re.setMinimal(minimalCheckBox->isChecked()); + bool wildcard = wildcardCheckBox->isChecked(); + re.setWildcard(wildcard); + if (!re.isValid()) { + statusBar->message(tr("Invalid regular expression: %1") + .arg(re.errorString())); + return; + } + int offset = re.search(text); + int captures = re.numCaptures(); + int row = 0; + const int OFFSET = 5; + resultTable->setNumRows(0); + resultTable->setNumRows(captures + OFFSET); + resultTable->setText(row, 0, tr("Regex")); + TQString escaped = regex; + escaped = escaped.replace("\\", "\\\\"); + resultTable->setText(row, 1, escaped); + resultTable->item(row, 1)->setSpan(1, 2); + if (offset != -1) { + ++row; + resultTable->setText(row, 0, tr("Offset")); + resultTable->setText(row, 1, TQString::number(offset)); + resultTable->item(row, 1)->setSpan(1, 2); + if (!wildcard) { + ++row; + resultTable->setText(row, 0, tr("Captures")); + resultTable->setText(row, 1, TQString::number(captures)); + resultTable->item(row, 1)->setSpan(1, 2); + ++row; + resultTable->setText(row, 1, tr("Text")); + resultTable->setText(row, 2, tr("Characters")); + } + ++row; + resultTable->setText(row, 0, tr("Match")); + resultTable->setText(row, 1, re.cap(0)); + resultTable->setText(row, 2, TQString::number(re.matchedLength())); + if (!wildcard) { + for (int i = 1; i <= captures; ++i) { + resultTable->setText(row + i, 0, tr("Capture #%1").arg(i)); + resultTable->setText(row + i, 1, re.cap(i)); + resultTable->setText(row + i, 2, + TQString::number(re.cap(i).length())); + } + } + else + resultTable->setNumRows(3); + } + else { + resultTable->setNumRows(2); + ++row; + resultTable->setText(row, 0, tr("No matches")); + resultTable->item(row, 0)->setSpan(1, 3); + } + resultTable->adjustColumn(0); + resultTable->adjustColumn(1); + resultTable->adjustColumn(2); + statusBar->message(tr("Executed \"%1\" on \"%2\"") + .arg(escaped).arg(text)); + } + else + statusBar->message(tr("A regular expression and a text must be given")); +} + +void RegexpTester::copy() +{ + TQString escaped = regexComboBox->currentText(); + if (!escaped.isEmpty()) { + escaped = escaped.replace("\\", "\\\\"); + TQClipboard *cb = TQApplication::clipboard(); + cb->setText(escaped, TQClipboard::Clipboard); + if (cb->supportsSelection()) + cb->setText(escaped, TQClipboard::Selection); + statusBar->message(tr("Copied \"%1\" to the clipboard") + .arg(escaped)); + } +} + +void RegexpTester::languageChange() +{ + setCaption(tr("Regex Tester")); + regexLabel->setText(tr("&Regex:")); + regexComboBox->insertItem(tr("[A-Z]+=(\\d+):(\\d*)")); + textLabel->setText(tr("&Text:")); + textComboBox->insertItem(tr("ABC=12:3456")); + caseSensitiveCheckBox->setText(tr("Case &Sensitive")); + minimalCheckBox->setText(tr("&Minimal")); + wildcardCheckBox->setText(tr("&Wildcard")); + copyPushButton->setText(tr("&Copy")); + executePushButton->setText(tr("&Execute")); + tquitPushButton->setText(tr("&Quit")); +} + diff --git a/examples/regexptester/regexptester.doc b/examples/regexptester/regexptester.doc new file mode 100644 index 000000000..81f7cb435 --- /dev/null +++ b/examples/regexptester/regexptester.doc @@ -0,0 +1,35 @@ +/*! + \page regexptester-example.html + + \ingroup examples + + \title A Small Application for Testing Regular Expressions + + Regular expressions can sometimes be tricky to get right, + especially those that use the * quantifier. This application lets + you type in a regexp (without doubling the backslashes) and some + test text, and to execute the regexp and see the results. If you + click the Copy button the regexp will be copied to the clipboard + (with the backslashes doubled, ready for you to paste into your + program). Previous regexps and test texts are remembered + throughout the session and can be accessed by dropping down the + comboboxes. + + <hr> + + Header file: + + \include regexptester/regexptester.h + + <hr> + + Implementation: + + \include regexptester/regexptester.cpp + + <hr> + + Main: + + \include regexptester/main.cpp +*/ diff --git a/examples/regexptester/regexptester.h b/examples/regexptester/regexptester.h new file mode 100644 index 000000000..faff773bf --- /dev/null +++ b/examples/regexptester/regexptester.h @@ -0,0 +1,42 @@ +#ifndef REGEXPTESTER_H +#define REGEXPTESTER_H + +#include <qdialog.h> + +class TQCheckBox; +class TQComboBox; +class TQLabel; +class TQPushButton; +class TQStatusBar; +class TQTable; + +class RegexpTester : public TQDialog +{ + Q_OBJECT + +public: + RegexpTester(TQWidget* parent=0, const char* name=0, bool modal=false, + WFlags f=0); + + TQLabel *regexLabel; + TQComboBox *regexComboBox; + TQLabel *textLabel; + TQComboBox *textComboBox; + TQCheckBox *caseSensitiveCheckBox; + TQCheckBox *minimalCheckBox; + TQCheckBox *wildcardCheckBox; + TQTable *resultTable; + TQPushButton *executePushButton; + TQPushButton *copyPushButton; + TQPushButton *tquitPushButton; + TQStatusBar *statusBar; + +public slots: + void copy(); + void execute(); + +private: + void languageChange(); +}; + +#endif // REGEXPTESTER_H diff --git a/examples/regexptester/regexptester.pro b/examples/regexptester/regexptester.pro new file mode 100644 index 000000000..9aeee9f8f --- /dev/null +++ b/examples/regexptester/regexptester.pro @@ -0,0 +1,5 @@ +SOURCES += main.cpp +HEADERS += regexptester.h +SOURCES += regexptester.cpp + +REQUIRES += table full-config diff --git a/examples/richtext/main.cpp b/examples/richtext/main.cpp new file mode 100644 index 000000000..5e7ffff89 --- /dev/null +++ b/examples/richtext/main.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "richtext.h" +#include <qapplication.h> + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + MyRichText richtext; + richtext.resize( 450, 350 ); + richtext.setCaption( "TQt Example - Richtext" ); + a.setMainWidget( &richtext ); + richtext.show(); + + return a.exec(); +} diff --git a/examples/richtext/marble.png b/examples/richtext/marble.png Binary files differnew file mode 100644 index 000000000..5caf7eaaf --- /dev/null +++ b/examples/richtext/marble.png diff --git a/examples/richtext/richtext.cpp b/examples/richtext/richtext.cpp new file mode 100644 index 000000000..e2b393eae --- /dev/null +++ b/examples/richtext/richtext.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "richtext.h" + +#include <qhbox.h> +#include <qhbox.h> +#include <qpushbutton.h> +#include <qtextview.h> +#include <qbrush.h> +#include <qapplication.h> + +static const char* sayings[] = { + "<b>Saying 1:</b><br>" + "<hr><br><br>" + "<big>Evil is that which one believes of others. It is a sin to believe evil " + "of others, but it is seldom a mistake.</big><br><br>" + "<center><i>-- H.L. Mencken</i></center>", + + "<b>Saying 2:</b><br>" + "<hr><br><br>" + "<big>A well-used door needs no oil on its hinges.<br>" + "A swift-flowing steam does not grow stagnant.<br>" + "Neither sound nor thoughts can travel through a vacuum.<br>" + "Software rots if not used.<br><br>" + "These are great mysteries.</big><br><br>" + "<center><i>-- Geoffrey James, \"The Tao of Programming\"</i></center>", + + "<b>Saying 3:</b><br>" + "<hr><br><br>" + "<big>Show business is just like high school, except you get paid.</big><br><br>" + "<center><i>-- Martin Mull</i></center>", + + "<b>Saying 4:</b><br>" + "<hr><br><br>" + "<big><b>The Least Successful Executions</b><br>" + "<twocolumn><p> History has furnished us with two executioners worthy of attention. " + "The first performed in Sydney in Australia. In 1803 three attempts were " + "made to hang a Mr. Joseph Samuels. On the first two of these the rope " + "snapped, while on the third Mr. Samuels just hung there peacefully until he " + "and everyone else got bored. Since he had proved unsusceptible to capital " + "punishment, he was reprieved.</p>" + "<p> The most important British executioner was Mr. James Berry who " + "tried three times in 1885 to hang Mr. John Lee at Exeter Jail, but on each " + "occasion failed to get the trap door open.<!p>" + "<p> In recognition of this achievement, the Home Secretary commuted " + "Lee's sentence to \"life\" imprisonment. He was released in 1917, emigrated " + "to America and lived until 1933.</p></twocolumn></big><br><br>" + "<center><i>-- Stephen Pile, \"The Book of Heroic Failures\"</i></center>", + + "<b>Saying 5:</b><br>" + "<hr><br><br>" + "<big>If you can, help others. If you can't, at least don't hurt others.</big><br><br>" + "<center><i>-- the Dalai Lama</i></center>", + + "<b>Saying 6:</b><br>" + "<hr><br><br>" + "<big>Television has brought back murder into the home -- where it belongs.</big><br><br>" + "<center><i>-- Alfred Hitchcock</i></center>", + + "<b>Saying 7:</b><br>" + "<hr><br><br>" + "<big>I don't know who my grandfather was; I am much more concerned to know " + "what his grandson will be.</big><br><br>" + "<center><i>-- Abraham Lincoln</i></center>", + + 0 +}; + + +MyRichText::MyRichText( TQWidget *parent, const char *name ) + : TQVBox( parent, name ) +{ + setMargin( 5 ); + + view = new TQTextView( this ); + view->setText( "This is a <b>Test</b> with <i>italic</i> <u>stuff</u>" ); + TQBrush paper; + paper.setPixmap( TQPixmap( "../richtext/marble.png" ) ); + if ( paper.pixmap() != 0 ) + view->setPaper( paper ); + else + view->setPaper( white ); + + view->setText( sayings[0] ); + view->setMinimumSize( 450, 250 ); + + TQHBox *buttons = new TQHBox( this ); + buttons->setMargin( 5 ); + + bClose = new TQPushButton( "&Close", buttons ); + bPrev = new TQPushButton( "<< &Prev", buttons ); + bNext = new TQPushButton( "&Next >>", buttons ); + + bPrev->setEnabled( FALSE ); + + connect( bClose, SIGNAL( clicked() ), qApp, SLOT( tquit() ) ); + connect( bPrev, SIGNAL( clicked() ), this, SLOT( prev() ) ); + connect( bNext, SIGNAL( clicked() ), this, SLOT( next() ) ); + + num = 0; +} + +void MyRichText::prev() +{ + if ( num <= 0 ) + return; + + num--; + + view->setText( sayings[num] ); + + if ( num == 0 ) + bPrev->setEnabled( FALSE ); + + bNext->setEnabled( TRUE ); +} + +void MyRichText::next() +{ + if ( !sayings[++num] ) + return; + + view->setText( sayings[num] ); + + if ( !sayings[num + 1] ) + bNext->setEnabled( FALSE ); + + bPrev->setEnabled( TRUE ); +} + + + + + diff --git a/examples/richtext/richtext.doc b/examples/richtext/richtext.doc new file mode 100644 index 000000000..661e262c6 --- /dev/null +++ b/examples/richtext/richtext.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page richtext-example.html + + \ingroup examples + \title Richtext + + In this example we demonstrate how to display rich text + in a widget. To do this some sayings taken from the famous + Unix "fortune" are displayed nicely formatted. + + <hr> + + Header file: + + \include richtext/richtext.h + + <hr> + + Implementation: + + \include richtext/richtext.cpp + + <hr> + + Main: + + \include richtext/main.cpp +*/ diff --git a/examples/richtext/richtext.h b/examples/richtext/richtext.h new file mode 100644 index 000000000..4c0baf75e --- /dev/null +++ b/examples/richtext/richtext.h @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef RICHTEXT_H +#define RICHTEXT_H + +#include <qvbox.h> + +class TQTextView; +class TQPushButton; + +class MyRichText : public TQVBox +{ + Q_OBJECT + +public: + MyRichText( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQTextView *view; + TQPushButton *bClose, *bNext, *bPrev; + int num; + +protected slots: + void prev(); + void next(); + +}; + +#endif diff --git a/examples/richtext/richtext.pro b/examples/richtext/richtext.pro new file mode 100644 index 000000000..b97b4abb1 --- /dev/null +++ b/examples/richtext/richtext.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = richtext + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = medium-config + +HEADERS = richtext.h +SOURCES = main.cpp \ + richtext.cpp diff --git a/examples/rot13/rot13.cpp b/examples/rot13/rot13.cpp new file mode 100644 index 000000000..967c72de7 --- /dev/null +++ b/examples/rot13/rot13.cpp @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "rot13.h" + +#include <qmultilineedit.h> +#include <qpushbutton.h> +#include <qapplication.h> +#include <qlayout.h> + +Rot13::Rot13() +{ + left = new TQMultiLineEdit( this, "left" ); + right = new TQMultiLineEdit( this, "right" ); + connect( left, SIGNAL(textChanged()), this, SLOT(changeRight()) ); + connect( right, SIGNAL(textChanged()), this, SLOT(changeLeft()) ); + + TQPushButton * tquit = new TQPushButton( "&Quit", this ); + tquit->setFocusPolicy( NoFocus ); + connect( tquit, SIGNAL(clicked()), qApp, SLOT(tquit()) ); + + TQGridLayout * l = new TQGridLayout( this, 2, 2, 5 ); + l->addWidget( left, 0, 0 ); + l->addWidget( right, 0, 1 ); + l->addWidget( tquit, 1, 1, AlignRight ); + + left->setFocus(); +} + + +void Rot13::changeLeft() +{ + left->blockSignals( TRUE ); + left->setText( rot13( right->text() ) ); + left->blockSignals( FALSE ); +} + + +void Rot13::changeRight() +{ + right->blockSignals( TRUE ); + right->setText( rot13( left->text() ) ); + right->blockSignals( FALSE ); +} + + +TQString Rot13::rot13( const TQString & input ) const +{ + TQString r = input; + int i = r.length(); + while( i-- ) { + if ( r[i] >= TQChar('A') && r[i] <= TQChar('M') || + r[i] >= TQChar('a') && r[i] <= TQChar('m') ) + r[i] = (char)((int)TQChar(r[i]) + 13); + else if ( r[i] >= TQChar('N') && r[i] <= TQChar('Z') || + r[i] >= TQChar('n') && r[i] <= TQChar('z') ) + r[i] = (char)((int)TQChar(r[i]) - 13); + } + return r; +} + + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + Rot13 r; + r.resize( 400, 400 ); + a.setMainWidget( &r ); + r.setCaption("TQt Example - ROT13"); + r.show(); + return a.exec(); +} diff --git a/examples/rot13/rot13.doc b/examples/rot13/rot13.doc new file mode 100644 index 000000000..28e3bf6cf --- /dev/null +++ b/examples/rot13/rot13.doc @@ -0,0 +1,23 @@ +/* +*/ +/*! \page rot-example.html + + \ingroup examples + \title Rot13 + + This example lets you enter a text into a mulitilineedit widget. + It will be displayed in the edit widget to the right transformed using + the rot13 algorithm. + + <hr> + + Header file: + + \include rot13/rot13.h + + <hr> + + Implementation: + + \include rot13/rot13.cpp +*/ diff --git a/examples/rot13/rot13.h b/examples/rot13/rot13.h new file mode 100644 index 000000000..dc207c87e --- /dev/null +++ b/examples/rot13/rot13.h @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Definition of something or other +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef ROT13_H +#define ROT13_H + +#include <qwidget.h> + +class TQMultiLineEdit; + +class Rot13: public TQWidget { + Q_OBJECT +public: + Rot13(); + + TQString rot13( const TQString & ) const; + +private slots: + void changeLeft(); + void changeRight(); + +private: + TQMultiLineEdit * left, * right; +}; + +#endif diff --git a/examples/rot13/rot13.pro b/examples/rot13/rot13.pro new file mode 100644 index 000000000..e27606e52 --- /dev/null +++ b/examples/rot13/rot13.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = rot13 + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = rot13.h +SOURCES = rot13.cpp diff --git a/examples/scribble/main.cpp b/examples/scribble/main.cpp new file mode 100644 index 000000000..8e5034c5c --- /dev/null +++ b/examples/scribble/main.cpp @@ -0,0 +1,29 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "scribble.h" +#include <qapplication.h> + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + Scribble scribble; + + scribble.resize( 500, 350 ); + scribble.setCaption("TQt Example - Scribble"); + a.setMainWidget( &scribble ); + if ( TQApplication::desktop()->width() > 550 + && TQApplication::desktop()->height() > 366 ) + scribble.show(); + else + scribble.showMaximized(); + return a.exec(); +} diff --git a/examples/scribble/scribble.cpp b/examples/scribble/scribble.cpp new file mode 100644 index 000000000..438f73d5f --- /dev/null +++ b/examples/scribble/scribble.cpp @@ -0,0 +1,187 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "scribble.h" + +#include <qapplication.h> +#include <qevent.h> +#include <qpainter.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qspinbox.h> +#include <qtooltip.h> +#include <qrect.h> +#include <qpoint.h> +#include <qcolordialog.h> +#include <qfiledialog.h> +#include <qcursor.h> +#include <qimage.h> +#include <qstrlist.h> +#include <qpopupmenu.h> +#include <qintdict.h> + +const bool no_writing = FALSE; + +Canvas::Canvas( TQWidget *parent, const char *name ) + : TQWidget( parent, name, WStaticContents ), pen( TQt::red, 3 ), polyline(3), + mousePressed( FALSE ), buffer( width(), height() ) +{ + + if ((qApp->argc() > 0) && !buffer.load(qApp->argv()[1])) + buffer.fill( colorGroup().base() ); + setBackgroundMode( TQWidget::PaletteBase ); +#ifndef QT_NO_CURSOR + setCursor( TQt::crossCursor ); +#endif +} + +void Canvas::save( const TQString &filename, const TQString &format ) +{ + if ( !no_writing ) + buffer.save( filename, format.upper() ); +} + +void Canvas::clearScreen() +{ + buffer.fill( colorGroup().base() ); + repaint( FALSE ); +} + +void Canvas::mousePressEvent( TQMouseEvent *e ) +{ + mousePressed = TRUE; + polyline[2] = polyline[1] = polyline[0] = e->pos(); +} + +void Canvas::mouseReleaseEvent( TQMouseEvent * ) +{ + mousePressed = FALSE; +} + +void Canvas::mouseMoveEvent( TQMouseEvent *e ) +{ + if ( mousePressed ) { + TQPainter painter; + painter.begin( &buffer ); + painter.setPen( pen ); + polyline[2] = polyline[1]; + polyline[1] = polyline[0]; + polyline[0] = e->pos(); + painter.drawPolyline( polyline ); + painter.end(); + + TQRect r = polyline.boundingRect(); + r = r.normalize(); + r.setLeft( r.left() - penWidth() ); + r.setTop( r.top() - penWidth() ); + r.setRight( r.right() + penWidth() ); + r.setBottom( r.bottom() + penWidth() ); + + bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() ); + } +} + +void Canvas::resizeEvent( TQResizeEvent *e ) +{ + TQWidget::resizeEvent( e ); + + int w = width() > buffer.width() ? + width() : buffer.width(); + int h = height() > buffer.height() ? + height() : buffer.height(); + + TQPixmap tmp( buffer ); + buffer.resize( w, h ); + buffer.fill( colorGroup().base() ); + bitBlt( &buffer, 0, 0, &tmp, 0, 0, tmp.width(), tmp.height() ); +} + +void Canvas::paintEvent( TQPaintEvent *e ) +{ + TQWidget::paintEvent( e ); + + TQMemArray<TQRect> rects = e->region().rects(); + for ( uint i = 0; i < rects.count(); i++ ) { + TQRect r = rects[(int)i]; + bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() ); + } +} + +//------------------------------------------------------ + +Scribble::Scribble( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name ) +{ + canvas = new Canvas( this ); + setCentralWidget( canvas ); + + TQToolBar *tools = new TQToolBar( this ); + + bSave = new TQToolButton( TQPixmap(), "Save", "Save as PNG image", this, SLOT( slotSave() ), tools ); + bSave->setText( "Save as..." ); + + tools->addSeparator(); + + bPColor = new TQToolButton( TQPixmap(), "Choose Pen Color", "Choose Pen Color", this, SLOT( slotColor() ), tools ); + bPColor->setText( "Choose Pen Color..." ); + + tools->addSeparator(); + + bPWidth = new TQSpinBox( 1, 20, 1, tools ); + TQToolTip::add( bPWidth, "Choose Pen Width" ); + connect( bPWidth, SIGNAL( valueChanged( int ) ), this, SLOT( slotWidth( int ) ) ); + bPWidth->setValue( 3 ); + + tools->addSeparator(); + + bClear = new TQToolButton( TQPixmap(), "Clear Screen", "Clear Screen", this, SLOT( slotClear() ), tools ); + bClear->setText( "Clear Screen" ); +} + +void Scribble::slotSave() +{ + TQPopupMenu *menu = new TQPopupMenu( 0 ); + TQIntDict<TQString> formats; + formats.setAutoDelete( TRUE ); + + for ( unsigned int i = 0; i < TQImageIO::outputFormats().count(); i++ ) { + TQString str = TQString( TQImageIO::outputFormats().at( i ) ); + formats.insert( menu->insertItem( TQString( "%1..." ).arg( str ) ), new TQString( str ) ); + } + + menu->setMouseTracking( TRUE ); + int id = menu->exec( bSave->mapToGlobal( TQPoint( 0, bSave->height() + 1 ) ) ); + + if ( id != -1 ) { + TQString format = *formats[ id ]; + + TQString filename = TQFileDialog::getSaveFileName( TQString::null, TQString( "*.%1" ).arg( format.lower() ), this ); + if ( !filename.isEmpty() ) + canvas->save( filename, format ); + } + + delete menu; +} + +void Scribble::slotColor() +{ + TQColor c = TQColorDialog::getColor( canvas->penColor(), this ); + if ( c.isValid() ) + canvas->setPenColor( c ); +} + +void Scribble::slotWidth( int w ) +{ + canvas->setPenWidth( w ); +} + +void Scribble::slotClear() +{ + canvas->clearScreen(); +} diff --git a/examples/scribble/scribble.doc b/examples/scribble/scribble.doc new file mode 100644 index 000000000..6763df267 --- /dev/null +++ b/examples/scribble/scribble.doc @@ -0,0 +1,30 @@ + +/* +*/ +/*! \page scribble-example.html + + \ingroup examples + \title Simple Painting Application + + This example implements the famous scribble example. You can draw around + in the canvas with different pens and save the result as picture. + + <hr> + + Header file: + + \include scribble/scribble.h + + <hr> + + Implementation: + + \include scribble/scribble.cpp + + <hr> + + Main: + + \include scribble/main.cpp +*/ + diff --git a/examples/scribble/scribble.h b/examples/scribble/scribble.h new file mode 100644 index 000000000..6e23cbf82 --- /dev/null +++ b/examples/scribble/scribble.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef SCRIBBLE_H +#define SCRIBBLE_H + +#include <qmainwindow.h> +#include <qpen.h> +#include <qpoint.h> +#include <qpixmap.h> +#include <qwidget.h> +#include <qstring.h> +#include <qpointarray.h> + +class TQMouseEvent; +class TQResizeEvent; +class TQPaintEvent; +class TQToolButton; +class TQSpinBox; + +class Canvas : public TQWidget +{ + Q_OBJECT + +public: + Canvas( TQWidget *parent = 0, const char *name = 0 ); + + void setPenColor( const TQColor &c ) + { pen.setColor( c ); } + + void setPenWidth( int w ) + { pen.setWidth( w ); } + + TQColor penColor() + { return pen.color(); } + + int penWidth() + { return pen.width(); } + + void save( const TQString &filename, const TQString &format ); + + void clearScreen(); + +protected: + void mousePressEvent( TQMouseEvent *e ); + void mouseReleaseEvent( TQMouseEvent *e ); + void mouseMoveEvent( TQMouseEvent *e ); + void resizeEvent( TQResizeEvent *e ); + void paintEvent( TQPaintEvent *e ); + + TQPen pen; + TQPointArray polyline; + + bool mousePressed; + + TQPixmap buffer; + +}; + +class Scribble : public TQMainWindow +{ + Q_OBJECT + +public: + Scribble( TQWidget *parent = 0, const char *name = 0 ); + +protected: + Canvas* canvas; + + TQSpinBox *bPWidth; + TQToolButton *bPColor, *bSave, *bClear; + +protected slots: + void slotSave(); + void slotColor(); + void slotWidth( int ); + void slotClear(); + +}; + +#endif diff --git a/examples/scribble/scribble.pro b/examples/scribble/scribble.pro new file mode 100644 index 000000000..35304c697 --- /dev/null +++ b/examples/scribble/scribble.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = scribble + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = scribble.h +SOURCES = main.cpp \ + scribble.cpp diff --git a/examples/scrollview/README b/examples/scrollview/README new file mode 100644 index 000000000..3bdaa7def --- /dev/null +++ b/examples/scrollview/README @@ -0,0 +1,3 @@ +This example demonstrates the use of QScrollView for displaying large +widgets. Both techniques are demonstrated: using QScrollView to scroll +around a large widget, and drawing arbitrary material in a QScrollView. diff --git a/examples/scrollview/bg.ppm b/examples/scrollview/bg.ppm new file mode 100644 index 000000000..51d8db5be --- /dev/null +++ b/examples/scrollview/bg.ppm @@ -0,0 +1,4 @@ +P6 +150 150 +255 +ñßÑëÙËëØÊðÝÏïÜÎéÖÈæÓÅèÔÆçÓÅà;æÓÅôáÔöãÖ÷äÖöãÖöãÖöãÖõãÕñÞÐóàÒðÝÏóßÑøåØ÷ä×øåØûéÛÿìÞÿîàÿíàþìÞõâÔòßÑðÝÏ÷ãÖøæÙñßÑëÙËëØÊìÙËóàÒøä×øåØùæÙüéÜúçÚóàÒôàÒ÷å×úéÚõäÖôâÔùèÙþíÞýíÞúéÚûéÛøçÙóáÒòàÑôâÔðÞÐôâÔùçÚýëÝþëÝüêÜûèÛõâÔ÷ãÖùæØ÷äÖøæØþìÞúèÚ÷ä×öãÖõãÕóàÒ÷ä×úçÙôáÓóàÒûèÛýëÝõãÕíÛÍ÷å×þïáùæØõâÕñÞÐùçÚúèÛîÛÍçÔÆèÕÇõâÕýëÝþìÞýëÝþíßüéÜùæÙöãÖôâÕöãÖõâÔòßÑóàÓòÞÑîÛÍê×ÉìÙËðÜÎøå×úèÚûéÛûèÚùæØøæØ÷ä×öãÖòßÑíÛÍïÜÏóßÒøä×ôáÓñÞÐðÝÏòßÑóàÓòßÑñßÑõãÖôàÓñÝÏ÷ãÖ÷ãÕûèÛúçÚóàÒóàÒøæØöâÔùæÙûéÛøåØòàÒïÜÎòàÒòßÑðÝÏîÛÍðÝÏòßÑñßÑñÞÐöäÖóáÓìØÊìÙËóßÑñÞÐïÜÎðÝÏòßÒõâÔøåØøåØôàÒõáÓõâÕðÝÐôáÔ÷åØûéÛüéÜúçÙøä×ùæÙùæÙûéÛùæÙöãÕøä×öãÕñÞÐêØÊê×ÉïÜÎóßÑ÷ãָ娸åØõâÕóàÓñÞÐòáÒöå×ùèÚúéÚüêÜýìÝøçÙöåÖ÷æØüëÝýíÞüêÜþìßÿîàÿïáÿíßýêÜùæÙûèÛùæØùæØ÷äÖóáÓôâÔÿîàýëÝõáÓñÞÐöâÕöâÕòÞÐñÞÐòßÑõãÕúçÚýëÝüèÚòßÑõâÔõâÔíÚÌëÙËõâÕûéÛÿíßüêÜöãÕòàÒöäÖûéÜüéÜþìÞÿñãÿïáüìßùçÙöãÕôáÔòßÑðÝÏøå×úæÙöâÔìØÊîÛÍ÷äÖûéÜöãÖñßÒðÝÏîÛÍìÙËîÛÍóàÒùçÙüéÜûéÜùçÙûèÛøæÙ÷ä×÷å×úçÚüéÜöâÕøåØúçÚùæØöãÕôáÓøåØ÷ä×÷äÖùæÙöãÕñÞÐ÷ä×õâÕöãÕúçÚûèÛøæÙîÛÍïÜÎíÚÌîÛÍöäÖýíßûéÛúèÛþìßýëÞöãÖóáÔõâÔóßÑðÝÏóàÒúçÙýìÞôáÓôáÓóàÒõãÖôáÓîÛÍéÖÈìÙËïÝÏñÞÐñÞÐðÜÎòßÒõãÖúçÚùæØøå×úèÚüêÜøåØñÞÐëØÊíÛÍóßÑéÕÇèÕÇìÚÌóàÓôáÔñÞÐóáÓöäÖùçÙøçÙõäÖóáÒëÚËíÜÍôâÔúèÚùèÚôãÕñÞÐñÞÐóàÒ÷ãÖüéÛýìÞûéÛýëÝþëÝøæØõáÔöâÕúèÛÿíàúçÙõãÖùæØöä×ñÞÐíÚÌòàÓùæÙùæÙûéÛöä×óàÒ÷äÖøä×ôâÔøæØüéÛöãÖôáÓùåØûéÛúçÚíÛÍðÝÏòßÑ÷ä×üêÜüëÝùçÚöãÖóáÓôàÓõâÕöãÖòßÑúçÚýëÝùæÙ÷åØùçÚòßÑîÜÎêÖÈéÖÈïÜÎõâÕôàÓòÞÐóàÒ÷ãÖùçÚùæÙûèÛùæÙøåØ÷åØùæÙúçÚúçÚüêÜùæÙúçÚúçÚòßÑóàÒïÜÎïÜÎõáÔôàÓíÚÌòßÑïÜÎîÛÍñÞÑõáÔöäÖûéÛõâÔðÝÏðÝÏñÞÐïÜÎöâÔýêÜúçÙòàÒòßÑñÞÐìÚÌëÙËëÙËïÜÎöãÕúèÛøæÙöä×øåØùçÙ÷äÖõâÔðÝÏïÜÏíÛÍíÚÌíÚÌíÚÌïÜÎòÞÐõâÕýëÞÿòäþîàùçÚüêÜþìÞûèÛúçÚûèÛûèÛûèÛùæÙõãÖöãÖøåØ÷æ×óáÓñàÒôãÕðßÐéØÉûêÛýìÝùèÙôãÕôãÕ÷çÙ÷ãÕôáÓñßÑôáÓúèÚûíßñÝÏõâÕõâÔóàÒòßÒòßÑùæÙýëÞüêÜùæÙúçÚùæÙùæØôáÓøå×ûéÛøåØøæÙ÷åØúèÛþïáÿòåÿñäÿôæþòä÷å×ïÜÎòßÑõâÔôáÓðÝÏïÜÎïÜÏîÛÍíÚÌïÜÎðÝÐñÞÐòßÑõáÓùçÚýëÞúçÚòßÒðÝÏôáÓõâÔòßÑôáÓñÞÐîÛÍíÛÍòÞÐ÷ä×÷å×îÛÍçÔÆèÕÇíÚÌðÝÏîÚÌîÛÍïÜÎñÞÐóßÑôàÒøåØ÷ä×ñßÑòßÑöãÖñßÑëÙËñÞÐõâÔöãÖôáÓòßÑéÖÈïÜÎðÝÏëÙËíÚÌòàÓõâÔøåØüéÜúçÙñßÑé×ÉöãÖùæÙñÝÐéÖÈîÛÍïÜÎíÚÌîÜÎðÜÎñÞÐóàÒôáÔûèÛôàÓîÚÌèÕÇê×ÉòßÒüéÜûéÛùçÙöãÖóàÒñÝÏïÜÎïÜÎîÛÍñßÑöãÕõâÔøåØúèÚýëÝþíßÿíßÿìÞüéÜüêÝùçÚóßÑòßÑõáÔêØÊìÚËðÞÐöå×ùçÙøçÙùèÙøçÙõäÖôãÕúéÛÿòãúçÚüêÜüêÜøå×ñÞÐëØÊöãÕøåØ÷ãÖ÷åØúçÚøæÙðÞÐïÛÎóàÓùæÙüêÝÿñãýëÝüéÛúèÚøåØöä×õâÕýëÝýêÝüëÞûëÝûèÛùçÙ÷å×÷ãÖùåØüéÛüêÜúèÚüéÛûéÜúéÜñßÑëØÊíÛÍúçÚúçÚöãÕñÝÏïÛÎðÜÏòßÒïÛÍòÞÐüéÜûèÛôáÓñßÑðÝÏòÞÐöâÕöãÖôâÕñÞÐïÜÎíÚÌíÙËíÚÌíÚÌèÕÇêØÊíÛÍðÝÏòßÑôàÒòÞÐðÝÏîÛÍïÜÎñÞÐôáÓõâÕùçÙúçÚùæÙúçÚýëÝöâÕ÷ä×õáÓîÛÍëØÊìÚÌôàÒûèÚþìÞ÷åØôáÔöäÖ÷ä×õâÕóáÓøæØøæØóàÓñÞÐóàÒõáÓòßÑîÜÎëØÊòßÑðÝÏðÜÎèÕÇäÐÂëØÊøæÙüéÜÿíßþíßûèÚöä×øæØøå×óàÒçÓÅäÑÃëØÊúèÚ÷ãÖõáÓùçÚýêÜþëÝþðãûèÛúèÚüëÝúèÚòßÑíÛÍ÷æØûêÛóâÔóâÓùçÙõäÖ÷å×úéÚýîàüëÝöæ×öä×øæÙúçÚùæÙ÷å×õãÕùçÙùçÙõáÔøæØüêÜøæØïÛÍéÖÈòàÒøå×òßÒôãÖüéÜÿíßùçÚôáÓõãÕôàÒõâÔòßÑïÜÎðÝÏñÞÐðÜÎ÷äÖüêÝÿíàýêÜúçÚ÷åØûèÛþíßÿðã÷ä×ðÞÐöãÖõâÔ÷äÖöãÖñÞÐïÜÎñÝÏìÙËéÖÈéÕÇìØÊïÜÏîÛÎê×ÉðÜÎõâÕöãÕóàÒðÜÎóßÑöãÖ÷ä×ôáÔòÞÐóßÑòàÓóáÔôàÓóßÑòßÑñÞÐêØÊëØÊïÜÎïÜÎïÜÎõãÖüêÜûéÛûéÛûéÛûèÛùçÚòßÑíÚÌìÙËóàÒöãÖóßÑîÛÍîÜÎîÛÍñÞÐøåØýìÞõâÔùæÙýëÝþëÝüéÜùæÙùçÚöäÖóàÓðÝÏðÝÏðÝÏ÷ãÕöãÖöãÖõâÔóàÒòßÑöãÖùæØùéÛúéÜûèÚúçÚùæÙüêÜýëÝöãÕòßÑöãÖúçÙ÷ãÖôàÒõáÓøä×ûèÛüëÝýíàûíßûêÜûéÜûëÞÿñãüìÝùèÙúéÛûêÜûéÛýïàþïàýíÞúèÚøæØ÷æØÿóæþíßýëÝþíàþîàþíà÷åØùæÙüêÝüïâüíàúæÙöãÕöãÖôâÕùæÙùæØïÛÍðÝÏôáÔöãÖõáÓôàÒôáÓóàÒöâÔöâÔóàÒóàÒöâÕ÷ä×ùçÙóàÒòÞÐùåØûèÛòßÑðÝÏõâÕÿîáþîàøåØéÕÇïÜÎôàÒöãÖôáÓðÞÐóàÓôáÓñÞÐìÚÌéÕÇåÒÄîÛÍóàÒôàÒïÛÍðÝÏôáÓóáÓûêÜýíßùæØõãÕ÷ä×øæÙûêÜúçÙóàÒóàÒ÷ä×øæØõâÔöãÖùæÙöãÕíÙÌìÚÌòßÑòàÒîÛÍðÝÏõáÓòßÑòßÒòßÑöâÔøæØûèÚëØÊìÚÌòàÒüêÝÿîáýíàûéÛýëÞýëÞúèÚùæØùæÙþîàýëÝúèÚ÷äÖöãÕöãÕùçÚöä×ôáÔ÷äÖûéÛÿíàôáÔëØÊæÓÅíÚÌøå×þëÝ÷äÖûéÛûéÛøåØ÷äÖôáÓòßÑ÷ä×üéÛûéÛ÷äÖñÝÐñÞÐðÝÐîÛÍòßÑûêÝÿõçýðáÿïáÿðáÿðáýìÝøçÙòàÒôâÔôâÔóâÔöäÖùçÙøæØúçÙøå×óàÓôáÓ÷äÖüéÜûèÛõâÕðÝÏñÞÐöãÕûèÚúçÙôáÓõâÔýêÜþíßúæØ÷åØõáÓòßÑñÞÐñÞÑðÝÏôáÔöäÖôâÔòßÑòßÑðÝÏñÞÐóßÑõãÕøæØúèÚöãÖóàÓôáÓ÷å×óáÓíÚÍîÛÍñßÑöãÕùçÚúèÚúèÚôáÓöãÕùæØùæÙøåØöãÕöãÖùæÙùçÙ÷äÖõâÕöäÖõãÕòÞÑïÛÍðÝÏôàÒöãÕôâÔïÝÏëÙËìØÊðÝÏôàÓðÝÏòßÑòßÒñßÑôáÔùæÙòßÑïÜÎê×ÉèÕÇíÚÌóàÓûéÛ÷ä×ôáÓóßÑòßÑðÝÏóáÔôâÕöä×øåØôáÓîÜÎöâÔ÷ãÕôáÓòßÑöãÖýëÞÿïâÿíàþëÝüéÜúçÚùæÙôáÓóàÒñÞÐòßÑôáÓõâÔñÞÐíÚÌê×ÉíÚÌóàÒöâÔóàÒôâÔöäÖüêÜþíàüéÛòßÑøæØýêÝúèÚñÞÐéÕÇåÒÄíÚÌõâÔúèÚûéÛùèÛöå×ùçÙüëÜþíÞüëÜúèÚòáÓïÞÏðßÑ÷å×÷æØõäÖèÕÇíÛÍðÝÏïÜÎòßÑöãÖ÷äÖúçÚùæÙöãÖøåØûéÛþìÞÿïáüëÝôàÒöãÖûêÜþìÞúèÛ÷å×öãÖóàÓïÜÎïÝÏðÝÏïÜÎñÞÐõâÔùçÙ÷å×òßÑõâÕ÷åØõâÕöãÖþðâüêÜöäÖòßÑñÞÐñÝÏõâÕøåØûèÛýëÝüêÜûéÛôâÕöäÖùæÙûèÛüêÜüêÜþëÝýëÝýëÝýëÝûèÛöãÕëØÊèÔÆèÕÇïÜÎóàÒôàÒïÜÎñßÑôâÕõâÕïÝÏéÖÈìÚÌðÝÏïÜÎëØÊðÜÎøåØ÷ä×õâÕóßÑïÜÎìÙËê×ÉôáÓòßÑòßÑõãÖôáÓïÜÎùæÙúçÚ÷ä×ðÝÏíÚÌïÛÍñÞÐîÛÍìÙËíÚÌôáÓúéÛòàÓóáÓóàÒòßÑòÞÐñÞÐóàÒùæÙýëÝýëÝöãÕîÛÍíÛÍóàÒóàÒìÙËìÙËòßÑñÞÐêØÊíÚÌøå×úçÙùçÙþëÝûéÛùçÙøåØúèÛûêÝúéÜüêÝýêÜûéÛöãÖñÞÐúéÚùçÙøæØùçÙüìÝþñãþîßüëÝüìÝýìÝøçÙñßÑöâÔöãÕúçÚÿðâÿðâþíßøåØöãÖøåØúçÚöãÕðÝÏøå×ýëÞýêÝòßÑïÜÎõãÕ÷äÖùçÙýëÞþðãþîáûéÛ÷äÖôáÓòßÑóàÒöãÕøå×÷ä×ñÞÐóßÑöäÖõãÖøåØíÚÌîÚÌíÙËîÛÍñÞÐôáÓýêÜ÷ä×ïÝÏìÙËîÜÎñÞÐûèÛ÷ä×óàÒðÝÏóßÑôâÔ÷äÖôáÓòàÓóáÔñÞÑìÙËïÜÎóàÒóàÒðÝÏîÜÎïÜÎôáÔúçÙùåØðÝÏïÜÎóáÓöä×öãÖ÷ä×ùæÙúçÚúèÚóßÑñÞÐïÜÎíÚÌìÚÌëØÊíÚÌñÞÐøå×þëÝýëÝúèÚýëÞøåØóßÑñÞÐñÞÐòÞÐêÖÈèÕÇéÖÈëØÊêØÊèÕÇé×ÉëÙËíÚÌïÜÎïÜÎïÜÎóßÑöãÕúçÙúèÚ÷å×ôâÔõâÕùæÙúèÚ÷å×ùå×üèÛôáÓíÚÌîÛÍôâÔóàÒðÝÏòßÒîÛÎìØÊðÞÐøæÙýîàþïáþíàþëÞúèÚóàÓëØÊöå×õäÖóâÔðÞÐóáÒöåÖýíÞþïàýíßùèÙ÷å×öäÖþëÝýëÝýëÝüëÝøæØòßÒòßÑðÝÏòàÒ÷å×÷åØõãÕþìÞûéÛ÷äÖìÙËèÔÆíÚÌóßÑòßÑòßÒòßÒòàÒóßÑüêÝûéÜûêÜúèÛ÷äÖòßÑûèÛùæÙ÷äÖõâÔõâÔõâÕìØÊê×Éê×ÉðÝÏ÷ä×üëÝûèÚóàÒê×ÉçÔÆê×ÉîÛÍôâÔñÞÐîÛÍë×ÉìÙËíÛÍðÝÏìÚÌê×Éê×Éê×ÉèÕÇãÐÂê×ÉïÜÎïÜÎëÙËèÕÇäÐÂìÙËñÞÐôáÔøæØþîàôáÓóßÑôáÓ÷äÖ÷äÖóàÓòßÑõâÔöäÖõâÕöãÕ÷å×ôáÔøå×úèÚúæØúçÙûéÛøåØìØÊçÔÆóàÒöãÖðÞÐëØÊîÚÌöäÖúèÛóàÒæÒÄîÜÎñÞÐôáÔ÷ä×ùæØùæØûèÚöâÔðÝÏðÝÏöãÖûèÛýëÞøä×÷ä×ýëÝþëÝúçÚöä×÷äÖøåØüêÝúèÛñÞÐëØÊêØÊêØÊíÛÍòßÑõâÔ÷å×õâÔôáÓõâÔñÞÐìÙËîÝÎóâÔöäÖóâÔòàÒóâÔõãÕõäÕóâÔôâÔ÷æØûêÛüéÜÿíßþíßõãÖîÛÍêØÊòßÑùçÚýïáþñãþðâþóåùçÙõâÔõáÓðÝÏê×ÉêØÊñÞÐíÛÍçÔÆéÕÇôâÔûïáþìÞüêÜûéÜþìÞýëÝûéÛúèÚÿðâþîàýíàýðâýìß÷åØôáÓñÞÐóàÒõâÔôâÔóßÑöâÕùæÙ÷å×ôáÓñÞÐêØÊìÚÌïÜÎðÜÎñÝÏðÝÏôáÓñÝÏíÚÌëØÊíÚÌïÜÎïÛÍê×ÉëØÊñÞÐðÝÏê×ÉéÖÈëØÊïÜÎõáÔøæÙøæÙøåØøåØõáÓðÝÏíÛÍìÙËðÝÏùåØýëÝøåØóàÒòßÒõãÕöãÕñÞÐêÖÈìÙËôáÓðÝÏóàÒñÞÐìÚÌîÛÍõâÕ÷ä×ûèÚüêÝùæØõâÕóàÒôáÔñÞÐòßÑúçÚýêÝûéÜùçÙôáÔòÞÐôáÓöãÕôáÓùæÙúçÚõâÕôáÓùæÙûèÛþìÞÿðâþíß÷åØõâÔ÷äÖúèÚýíÞÿïàÿïàüëÝøçØóâÔîÜÎìÚÌòàÒúéÚþïáþîàûéÛøæØøæØøçÙöå×îÝÎëÙËëÙËòàÒøçÙûëÝøæØñÞÐñÞÐúçÚýëÝûéÜóàÒöä×öä×ùçÚüéÜõâÔîÝÎóáÒòáÓ÷å×úèÚôãÕòàÒøçÙþíßýîßøçØòáÓöâÕúèÛúçÙóßÑ÷äÖþîáüêÜûéÛûîáøéÛðÞÐìÙËðÜÎôáÓõãÖôáÓõáÓöãÖñßÑôáÓ÷åØûèÛöãÖïÜÎìØÊôáÓ÷ä×óßÑðÝÏñÞÐîÛÍíÚÌëÙËîÛÍöãÖýìß÷å×óàÒðÝÏòàÒôáÔôàÓôáÓðÝÏôáÔöãÕñÞÐñÝÏùêÜúéÛöãÕïÜÎðÝÏôâÕóáÓõáÓøåØúèÛõãÕíÚÌõâÕóáÓñÞÐðÝÐðÝÏðÞÐòßÑöãÖøåØôàÒðÜÎíÚÍîÛÍóßÑóßÑîÛÍðÜÎõâÕòßÑñßÑôáÓøåØõâÕîÛÍìÙËîÛÍóßÑùæÙúçÙ÷äÖöä×øæÙùçÙóàÓñÞÐõâÔýìÞþíßüëÝùæØúèÚþîàúèÚûêÛýìÝüëÜ÷å×ïÞÐúéÚýîßýíÞøçØùçÙýîßüìÞøçÙôãÕôãÕõäÖóâÔóâÓ÷çØúëÜúêÛöå×òáÓôàÒöãÕôâÔöãÖüêÜþìßúçÚûèÚúçÚùçÚ÷åØõãÖøæØøæØôãÕöå×ùçÙöäÖýíÞüëÝúéÚ÷æØõäÖôãÕ÷ãÖöãÖõáÔõâÕöäÖöä×ôáÓïÜÎê×Éê×ÉðÝÏôâÔùæØúèÚùçÙ÷ä×øåØûèÛ÷å×õâÔôáÔ÷ãÖøåØ÷ä×óàÓðÝÏñÞÐ÷ãÖùçÙøæØê×ÉñÞÐöãÕõâÕöãÕøå×ûéÛüêÜøæØðÝÏîÛÍñÞÐøåØõâÕóàÒñÝÏìÚÌèÕÇçÓÅê×ÉðÜÎ÷å×øæØöãÖûéÛøå×ôáÓñÞÑôáÔ÷åØëÙËñÞÑ÷åØùæÙõâÔðÝÏéÖÈëØÊîÜÎïÜÎëØÊåÑÃêØÊê×ÉéÕÇëÙËðÝÏõãÖúèÚüêÜüéÛöä×ôáÔöãÖôáÓóáÔõáÓ÷å×øæØ÷åØôáÓ÷ä×üêÜûèÛóàÓïÜÎøå×õâÔðÝÏîÜÎöäÖþíßþõæþîßüëÜýíÞþîàüìÞÿîßüëÝûêÜüêÜøæØñàÒóâÔñàÑòàÒöå×øæØøæØûêÛþíßþîàûéÛúèÚúéÚøå×üêÜûéÛ÷ä×ùæÙøæØÿñäÿíàÿîàûéÜ÷ä×ûéÛøæØõäÖòáÓóâÔøæØúéÚñßÐïÝÏîÜÎñßÑöå×úéÛ÷ä×ôàÒõâÕúèÚóàÓçÔÆïÜÎðÞÐîÚÌôàÓýîáÿòäÿòäÿïáýêÝøæÙöäÖ÷ãÕ÷ä×óàÒðÝÏòßÑøä×üêÜõãÖòßÑóàÒùæÙùæÙöâÔöãÖöãÕöâÔöâÕóàÒðÝÏðÝÏîÜÎðÝÏôáÓõâÔóàÒüéÜúèÚóàÒñÞÐóàÒîÚÌòßÒõâÕùçÙýëÝûèÛ÷ä×òßÑîÜÎëÙËíÚÌóàÓùçÙöãÖôáÓóàÓõâÔ÷å×úçÙéÕÇèÔÆìÙËôáÓùæÙøåØðÝÏéÖÈêØÊóáÔ÷ä×óßÑóßÑõãÖõâÔðÝÏïÜÎòàÓóßÑõâÔöä×öâÔôàÒóßÑòßÑóßÑñÞÐõâÕøåØõâÔõáÓ÷äÖøçÚúèÚüêÝüîàüðâýìÞûéÛýìÞþîàþïáùçÙ÷å×öå×öå×ôãÕñßÐòáÓóâÔõäÖúèÚúèÚ÷æØûéÛúèÚ÷å×ôãÕøçØþîßúçÙùæÙýêÜÿîàüêÜùæÙùæÙøåØúçÚ÷ä×ôáÓúæÙÿðâüêÜøçØôãÕõäÖøçÙôãÕöå×øçÙøèÚúèÚúèÚóàÒîÛÍïÜÎùæÙùæØòÞÑíÙËóßÑóßÑöãÖúèÚöäÖöãÖöãÕôâÕóßÑïÜÎìÙËðÝÏðÝÏðÝÏñÞÐóáÓöãÖ÷ä×ùæÙöä×ïÜÎîÛÍñÞÑôáÓíÙËìØÊôáÔõâÕîÛÍçÔÆèÕÇìÙËóßÒ÷ä×öä×óáÔòàÒíÛÍòßÒúèÛúçÚ÷å×ôáÓñÝÏóßÑõâÔöãÖöâÕôáÓøåØþíàþìßøæØõâÕñÞÐíÛÍê×ÉëÙËíÙËõâÔôáÓóáÓõáÓôáÓñßÑôáÓïÜÎïÜÎôáÔõãÕñÞÐïÜÎñÞÐòßÑòßÑñÞÐïÜÎòàÒøæÙüéÜöãÖîÚÌèÕÇòßÑñÞÐíÛÍðÝÏøå×üêÜùæÙüéÜýìÞúèÛóáÔîÚÍìÛÍôãÕüëÝþîßýíßýîßùçÙõäÖöå×ûêÛúèÚôãÕòáÓñàÒóâÔúéÚüëÜûêÛýìÝýìÝüëÜüëÝûêÛûêÛþìÞüéÜûèÛùæÙöãÕôáÔ÷ä×ùæÙûèÛüéÜüêÝüêÜúêÜúèÚûêÛùçÙøæØýìÞýìÝþíÞþîßþîßþîàþîßûèÛ÷äÖñÞÐñÞÐöãÖúèÚùçÙùçÚøæØöãÖóàÓñÞÐðÜÎïÜÎðÝÏòÞÐñÝÏîÛÍìÚÌñÞÐõâÔóàÓñÞÐðÝÏöãÕùæÙõáÓëØÊìÙËõãÖüéÛùæØøå×÷ä×òßÑêØÊíÚÌñÞÐñÞÐîÛÍñÞÐ÷ä×îÛÍíÚÌîÛÍóßÑöãÕõâÕøå×ñÞÐìÚÌîÛÍðÝÏòßÑ÷ä×øæÙûèÚúèÛ÷ä×òßÑöãÕøæØùçÚöãÕñÞÑìÙËôáÓøæØüéÜúèÚóàÓíÚÌóàÓôàÓñÞÐìÙËìÙËðÝÏóàÒñÞÐíÛÍìÚÌïÝÏôâÔõâÔûéÛþëÝúèÚöãÖõãÕõâÕôáÓùæØüîáýìÞûèÛøå×õâÔóàÒòßÑóàÒóàÓæÕÆîÜÍñßÐëÚËèÖÇé×ÈñßÑùéÛýíß÷æØõäÖúéÚùèÚõãÕñàÒôâÔöå×÷æØóâÔóáÒôãÔ÷çÙøçØõäÖûéÛýêÜõâÔìÙËñÝÏøå×õâÕúçÚùæÙýëÝÿíàùçÚóâÔôãÕøæØôãÕðÞÏóãÔüëÜøçÙóâÓñßÐóâÔöæØ÷ãÖûéÛùæÙóßÑöãÕþîàþìÞýëÝÿðâýîáùæÙøåØüîàûéÛøæØøæØøæØöãÖíÚÌôáÔùæÙöãÖñÞÐîÛÍïÜÎôâÕöãÖóáÓôáÓ÷ä×öãÕûéÛ÷äÖêÖÉæÓÅêØÊê×ÉèÔÆèÔÆîÛÍóàÒõáÓòßÑñÞÐöãÖ÷å×ðÝÏíÚÌéÕÇëØÊëÙËêØÊìÚÌòÞÐñÞÐ÷äÖôáÔìØÊíÚÌöãÕýëÝùçÚöãÕõãÕùæÙüêÜùçÚúçÚùæÙúèÚûéÛüêÜôâÕñÞÐòßÒ÷äÖôáÓíÚÌïÜÎðÝÏïÜÎïÜÎòàÒ÷å×÷äÖðÝÏîÛÍöäÖûéÛûéÛûèÚùæÙ÷ä×öãÖôáÔóàÒóàÓóàÒôáÓ÷ãÕõâÕñÝÏôãÕðßÐéØÊæÔÅëÙÊóâÓýðâøçÙøçÙùçÙöå×÷æØýðâþðâùèÚñßÐóáÓúéÛöå×øæØôâÔòáÓöå×òáÓîÛÍìÙËîÛÍúèÚÿíßýëÝôàÓòßÑóàÒ÷ä×òßÑêÖÈðßÑúéÛÿðáíÛÌçÕÇäÒÃîÜÍòáÒöåÖôãÕîÝÏèÖÈðÝÏóàÒúêÝüîàõâÔïÜÎöãÖþîàþìÞøæØõãÕðÝÐòÞÐùçÙýíßûéÛúçÙüèÚ÷å×õâÔñÞÑîÜÎìÚÌëÙËêØÊèÔÆîÚÌîÜÎçÔÆäÑÃà̽âÐÂãÐÂãÐÂëØÊõâÕõâÕòÞÐïÜÎòßÑöâÕöãÖùæØùæÙôàÒìÚÌîÜÎöãÖöãÖñÝÏîÛÍðÝÏòßÒñÞÑìÚÌçÕÇâοäÑÃîÚÌ÷äÖîÜÎëØÊìÚÌõâÔøåØõâÔúçÙ÷äÖóàÓðÜÏðÜÏñÞÑñÞÐìÚÌé×ÉìÚÌñÞÐõáÓóàÓòßÑóßÑ÷ä×øå×öãÕóàÒòÞÐîÜÎíÛÍóàÒüéÛ÷äÖûéÜûèÛôáÓôàÒ÷ä×öãÕøä×ùæÙøå×ñÝÏéÖÈòáÒôãÕôãÕôãÕ÷å×úèÚùçÙûéÛýìÝûéÛøçÙöå×öäÖùèÙûêÛùèÚúéÚûéÛüîàýîàùèÚöäÖöå×òáÓïÜÎðÞÐ÷å×ûèÛùå×ûèÚøåØöãÖôàÒñÞÐòßÑõâÔøçÙùçÙýëÝöäÖóáÒêÙÊè×ÈêØÉìÚËðÞÐôãÕ÷æØïÜÎîÛÍòÞÐòßÒðÝÏñÞÐøä×ùæØùæÙöãÖòÞÐîÛÍåÒÄëØÊïÝÏðÝÏñÞÐòßÑúçÚùæÙ÷ä×öä×öäÖ÷å×õâÔòßÑòÞÐîÛÍëØÊìÙËïÜÎñÞÑóàÒôáÓ÷äÖúçÚñÞÐïÜÎïÜÎòßÑòßÑðÝÏïÜÎñÞÐòÞÐñÞÐñÞÐóàÓôàÒöâÔ÷äÖøä×÷åØöãÖíÛÍðÝÏòÞÐïÜÎëØÊåÓÅçÓÅñÞÐ÷ãÖòàÒðÝÏòßÑòßÑîÛÍëØÊê×ÉíÚÌðÝÏóáÓõâÕõâÕöãÕùæØýêÜùçÚóáÓòÞÐõâÔóàÒìÙËòßÑ÷ä×øä×óàÒòßÑõâÔ÷åØúèÚúçÚôàÒóàÒöä×÷ãÖõâÔôàÒöâÔøå×ùçÙôãÕöäÖ÷æØ÷æØ÷å×÷å×ôãÕúèÚ÷å×óáÓøçÙúéÚøæØúéÚþíßÿñãÿñâþíÞýíßüëÝøæØõäÖöå×õäÖúæØñÞÐôáÓòàÒíÛÍóàÒúçÚúçÚøåØõâÕ÷äÖùæÙúèÚõäÖ÷æØúéÚúèÚòáÓîÝÏîÝÏïÞÐðßÑòáÓóâÔõâÕ÷å×ùæØöä×õâÕøå×ùæØôáÓõáÓòßÒòßÑúçÙöäÖðÝÏëÙËîÛÍõâÔúçÙùæÙõâÔïÝÏîÜÎóàÒ÷åØöâÔöãÕõâÕóßÑôáÓùæØøåØøæÙùæÙùæÙúçÚúçÙòßÑðÝÏîÛÍíÛÍéÖÈåÒÄíÛÍîÛÍñÞÐóßÑñÞÐîÛÍòßÑ÷å×ùæÙ÷ä×õáÓóàÓõâÕñÝÏíÚÌë×ÉêØÊéÖÈðÝÏøåØ÷ãÖìÙËê×ÉñÞÐðÝÏðÝÏðÝÏòßÑöäÖùæÙ÷ä×úçÚúèÚøæØùæØüéÛýêÜøä×ôàÒùåØúçÙøåØðÝÏðÝÏôáÓûéÛûéÛöãÕìØÊêÖÈíÚÌöãÕùçÙøåØýëÞþìßýìßýêÜûéÛûèÛúèÚöå×óâÔôãÕöå×ùçÙ÷æØøæØõäÖùéÛþïàûëÜüëÜüëÜþîßþîàúèÚòàÒçÕÇíÛÍõãÕûêÛûêÛûéÛ÷äÖîÜÎòàÒõáÓòßÑúèÚúèÚóáÓñÞÐøå×øåØôàÓòáÒóâÔôãÕ÷å×øæØúèÚúèÚùçÙ÷æØøæØûéÛýìÝýëÝþìßûéÛ÷äÖøåØúèÚûîà÷å×ôáÓôáÓõáÓüéÛþîáùåØóàÓöãÕúèÛúëÝõãÕòßÒìÚÌèÔÆæÒÄåÑÃìÚÌòßÑõãÕ÷ä×ûèÚûëÝøåØôáÔðÝÏìØÊëØÊëÙËòßÑîÛÍëØÊêØÊéÖÈçÓÅèÔÆçÔÆëØÊòßÑõáÓóßÑôàÒõâÔóàÒíÛÍìÙËìÙËøäÖðÝÏë×ÉïÝÏ÷äÖúçÚöãÖõâÕóßÑñÞÐòßÑóàÒêØÊîÛÍñÞÑôáÔõâÕôàÓõâÕóàÒïÝÏîÛÍòÞÐ÷ä×ûéÛúçÚöãÕñÝÏñÞÐóáÓñÞÐëØÊíÚÌúçÙýëÝúçÚøæØôáÔôáÔùçÙùæØôáÔõãÕõâÔóàÒòàÒöãÖúèÚüìÝùéÚ÷æØøçÙùçÙøæØùçÙ÷å×úèÚÿòãÿñâúéÛûéÛøæØõäÖóáÓîÝÎè×ÈïÞÐïÞÏôãÕ÷æØøæØúéÚûéÜùçÙûéÛúèÚ÷ä×øæÙúçÙòßÑðÝÏöãÕøåØôâÔñàÑõäÖôãÕúéÛûêÛþîàþîßúéÛôãÕòáÓóáÓôãÔùæÙøåØòßÑñÞÐöäÖöäÖæÓÅé×ÉòßÒþìÞÿîàüéÜ÷å×÷ãÖöä×óàÓëØÊãÐÂèÕÇìÙËñÞÐóàÓñßÑïÜÏöãÕøåØôâÔðÝÏíÚÌçÓÅçÔÆé×Éé×ÉéÖÈìÙËïÜÎëÙËêØÊëÙËïÜÎðÝÏïÜÎöãÕôáÔôáÓöãÕ÷ãÖõâÔöãÖõáÓóßÑòßÒóàÓóàÓôàÒòßÑõáÔüéÜüêÜ÷äÖîÜÎîÛÍóßÑúçÚ÷ä×ðÝÏéÖÈñÞÑùçÚþìßýëÞúèÚõâÔòßÑïÜÎðÝÏóàÓ÷ä×õâÕüéÛûéÜòßÑòßÒøå×øåØöãÖ÷ä×üéÜúèÚôáÓøæÙ÷äÖôáÓïÜÏìÚÌëØÊìÙËóàÒ÷ä×øå×÷ä×ùæÙýìÝüëÜýìÝûêÛóâÔëÙËôãÕôãÕøæØõåÖõäÕüíßýñâõäÕéØÉæÔÅìÚÌóâÓôãÕñàÒöäÖúéÚüìÝÿóäþìß÷ä×óàÒøæØüêÜùçÚ÷åØûêÜüîàýíßüêÜùçÙ÷å×÷æØ÷æØÿôåÿòäÿòäÿñâÿðáýïàúéÛóâÔîÝÎóàÓ÷å×÷äÖûéÛýëÞ÷ãÕìÙËñÞÐðÜÎðÞÐïÜÎçÔÆæÓÅëØÊñßÑñÞÐëØÊäÑÃë×ÉìÙËïÜÎóáÓøåØúèÚòßÑòßÑìÚÌëÙËêØÊãÐÁçÔÆîÛÍïÜÎìÙËëÙËîÛÍé×ÉëÙËïÜÎôáÓôáÓñÞÐîÜÎðÝÐñÞÐòßÑñÞÐïÝÏöä×öãÖøåØýíàþñãþðãøä×òßÑðÝÐôáÓôáÓîÛÍíÚÌíÛÍòÞÐöãÕòÞÐéÖÈüéÛ÷ãÖðÝÏíÚÌïÜÎòÞÐñÞÐóàÒõâÔöâÔôàÒóàÒõáÓöâÕöä×ùæÙüêÜýëÞÿíßýïáûéÛîÛÍéÖÈê×ÉìÙËîÛÍíÚÍêÖÈîÛÍöâÔþìÞÿîáÿíàÿòäýîàòßÑðÜÎòßÒòßÒïÝÏñÞÐõâÕùæÙùæÙóáÓêÖÈë×ÉòÞÐôãÕõäÖðßÑôâÓúèÚùçÙ÷å×øæØøæØ÷å×öäÖõäÕøçØùèÙøæØöå×ùèÚýïá÷åÖõãÕöåÖûêÛüëÜûéÛûèÛýêÝüéÜøåØ÷ä×øæØüîàýðâýíàþñäÿôæþíßøäÖüêÝýîàúçÙóàÓðÝÏþëÝþìÞöäÖëØÊìØÊïÜÎ÷ãÕüéÛþìÞüéÜùæÙøåØùçÚýíàüìÞöãÕöâÔúçÙøå×ôáÔöâÔóßÑïÜÎôàÒöãÕóàÒðÝÏðÝÏðÝÐîÜÎîÛÍòàÒõâÕëØÊæÓÅíÚÍë×ÉçÔÆãÐÂâÏÁçÓÅêØÊîÜÎõâÕóßÒñÞÐòàÓðÜÎóàÒõãÖõãÕñÞÐïÜÎïÜÎôáÓîÛÍîÛÍùåØýëÝüêÜ÷åØ÷äÖõâÔòßÑðÝÏîÛÍôàÒùåØýêÝüêÜ÷ãÖòßÑõáÓ÷åØ÷åØôáÔòßÒñÞÑôâÔðÝÏêÖÈåÒÄèÕÇîÛÍõãÕ÷å×úçÙûèÛûéÛúèÚûéÛúèÚüêÝýíßøçÙñÞÑèÕÇôáÔûèÛøæØõâÔöâÕõâÔóàÓóáÓ÷ãÖõãÕñÞÐñàÒ÷æØúéÛþðáÿòãûêÜöå×öå×ôãÕðßÑíÛÌëÙÊíÛÌóáÓùèÙúéÚöå×òàÒñàÑïÞÏñßÑõäÖøçÙøæØ÷ãÖøåØõáÔîÛÍíÚÌðÝÏôáÔõâÔöä×øä×ùæØúèÚùæØõâÕñßÑîÛÍîÛÍðÝÏúçÚýëÝþíßúçÚöãÕùæÙþíßþëÝýìÞþëÝûèÛ÷åØñßÒîÜÏíÙÌîÜÎëÙËæÒÄïÜÎíÛÍïÜÎíÛÍíÚÌòßÑøå×õâÔòßÑõâÔõãÕóàÒíÚÌïÜÎëØÊê×ÉòßÑôáÔùæÙöãÖðÝÏìÙËëØÊéÖÈèÕÇéÖÈêÖÈêØÊèÕÇæÒÄïÜÎöãÖøåØðÝÏïÜÎõáÔ÷ä×øä×öãÕôàÓõâÕ÷å×ôáÓöãÕ÷ä×÷åØ÷ä×öãÖûèÚúèÚùæÙ÷ä×öâÕôâÕ÷ä×ùæÙøåØñÞÐïÜÎñÞÐíÚÌìÙËîÛÍòàÓöãÖ÷ä×þëÝþëÝúèÚöãÕöäÖøåØöãÖìÙËë×ÉíÛÍíÚÍðÝÏôáÓñÞÐîÜÎîÛÍòÞÐöãÖóßÑîÛÍîÛÍöãÕõãÖðÝÏðÞÐúéÚýíÞúêÜøèÚ÷æØ÷å×÷å×öäÖôãÕñàÒïÞÐòáÓñßÑòàÑôãÔóâÔñàÑøæØ÷å×øæØúéÚûêÛûêÛüéÜûéÛôáÓëÙËîÛÍöâÕöãÖóßÑõáÓñÞÐîÜÎôáÔôâÕïÜÎìÙËñÞÐ÷äÖûèÚøåØøæØûèÛùæÙöãÖøåØûéÛôáÓñßÑøæÙüêÜûéÛùæØòßÑñÝÏõâÕðÝÐåÒÄïÜÎëØÊëÙËñÝÏòÞÐñÞÐðÝÏôáÔøåØ÷å×ôáÓòßÑöãÖóàÒìÙËñÞÑùæÙõâÔôáÓöâÔõáÓñÞÐìÙËèÔÆæÒÄáÎÀåÒÄðÝÏòßÒõâÕùçÙúèÚ÷ãÖðÝÏñÞÐøä×óàÒ÷äÖöãÕîÛÍéÖÈçÓÅðÝÏîÚÌíÚÌóàÒûéÛÿðâÿïáüéÜøæØõâÔ÷ãÖùæÙöãÖûèÛÿíßÿíßüêÜúèÚúçÙ÷ä×÷åØýìÞÿðâÿïáúçÚúçÚùæÙøåØùæÙùæØîÛÍèÔÆë×ÉòßÑöä×ýíßÿóåúæØôàÒúéÜÿïáÿïáüêÜûéÛøæÙòßÑïÜÎíÛÍòáÓòáÒðßÑìÚËìÚÌñàÒõãÕ÷å×úèÚüìÝþíÞþíÞþíß÷å×ïÞÏðßÑöå×úèÚðÞÏõäÖûéÛýîßýîàýîàøåØùæÙõâÕëØÊåÑÃæÒÄçÓÅçÓÅíÙËðÜÎòàÒûéÛÿíàþìÞýíßþíßüêÜùæÙûèÚ÷ä×ñÞÑõáÓûéÛýëÝóàÒêÖÈäÐÂê×ÉôáÓùçÙüéÛúèÚùçÙùçÙ÷äÖóàÒóàÒðÝÏîÛÍñÞÐóàÒðÝÏêÖÈñÞÑòÞÐëØÊìÚÌôâÕöãÖðÝÏõâÕýêÝùæØõãÕôáÓòßÑðÝÏðÝÏòßÑõáÓñÞÑñÞÐõãÖôáÓóàÒùçÙûêÜòÞÑëØÊïÜÎôáÓôâÕøæØïÜÎèÔÆëÙËñÞÐõãÖîÜÎìÙËë×ÉïÜÎöäÖûéÜúçÚûèÛúçÚøåØöâÕôáÓëÙËðÝÏøå×üëÝùæØòßÑïÛÍôáÓûéÜÿñãþïâüêÝüéÜúçÚúèÚûéÜöãÖîÚÌîÛÍóàÒùæÙþìÞÿîàýîá÷äÖúèÛþìÞÿñäþðâýíßýëÝþëÝûèÛ÷åØúèÚýîáõäÖïÝÎïÝÎòàÑôâÔ÷æØöäÖ÷æØùçÙúèÚúéÛøèÚøçØúéÚúêÜûëÝýìÞýìÝôâÔöå×÷å×öäÖôãÕôãÕøåØùæÙøåØòßÑê×ÉäÑÃîÚÍïÝÐòàÓøä×ûéÛüêÝöãÕúéÜþïáÿðãþíßüéÛöãÖðÝÏìÙËòßÑúçÚûèÛ÷ä×òßÑëØÊèÕÇîÜÎ÷äÖóßÑñÞÐðÝÏñÞÐóßÑòßÑóàÒ÷ãÖóßÑðÝÏóàÒóàÓñÞÐïÛÍê×ÉèÕÇîÚÌöâÕîÛÍê×ÉëØÊë×ÉäÑÃãÐÂê×ÉëØÊíÚÌïÜÎñÞÐòßÑôáÓõâÔðÝÐèÕÇëØÊóàÒíÚÍéÖÈë×ÉõâÕöãÕðÝÏëØÊëØÊìØÊðÝÏóàÒôáÓõâÕõâÕõâÕõâÕôáÓóàÒñÞÐñÞÑñÞÐðÝÏîÛÍìÙËóáÓïÜÎïÜÎ÷ãÖøåØôâÕõâÕ÷ä×øæÙ÷äÖôáÓñÞÐïÝÏíÛÍìÙËìÙËëÙËé×ÉôáÓùæØöãÕóàÒóàÒìØËòßÒüëÞþíßöãÕöãÕýëÞýëÝüêÜûéÛüêÜýëÝûêÝýìÞùèÙûìÝýïàýíßþïàþîßýìÞûéÛõäÖñàÒîÝÎíÜÎùèÚÿóåÿöçÿòãÿïàþïáþîàúéÛõäÖöå×ùèÙøåØòßÑîÜÎòàÒøå×ùæØôàÓöä×ôáÔ÷åØúçÚóàÒæÒÄîÚÌõâÔùçÚýêÜÿìÞüêÝõãÕõãÕûèÛûèÛøåØúçÚýëÝùæÙïÜÎòàÒûèÚðÝÏéÖÈçÔÆïÜÎôàÒòßÑùæØýêÜùæØ÷ä×üéÛûèÛõâÕíÛÍìÙËôàÒõâÔïÜÏïÜÎðÝÏèÕÇäÐÂéÖÈêÖÈèÔÆëØÊïÜÎõâÕùçÙüêÜöâÕðÝÏæÒÄåÒÄèÕÇãÏÁåÒÄïÜÏúèÛýíàöäÖê×ÉòÞÐùèÚûéÛôáÔïÜÎðÝÏýëÞøæØøåØûéÛ÷ä×ðÝÏìØÊäÑÃà̽æÒÄïÜÏöãÕöãÕíÛÍéÕÇçÓÅìÙËùçÙÿðãýëÞöäÖïÜÎóàÒùæØñÞÑòßÑìÙËìØÊòßÑòßÑîÛÍõâÔ÷ãÖïÜÎìÙËìÚÌöäÖûéÜúèÚøæØöãÕïÜÎëØÊñÞÐõâÕúçÚûèÛöãÖùèÚþðâÿõæÿðâüìÞúéÛõäÖ÷å×÷å×÷æØöå×öå×÷æØúèÚúéÚ÷åÖõãÕöäÖüîßþïáþðáþðáýîßüìÝøå×òÞÐðÝÏõáÔù娸ä×üéÜúçÚûéÛÿîàüêÜõâÔöâÔðÝÏðÝÏîÛÍíÚÌóßÑùæÙüéÜþëÝüéÛõâÔïÜÎõáÔúèÚüéÜöãÕïÜÎëØÊæÒÄìÙËòÞÐõáÓ÷äÖùçÚôâÔðÝÏóàÓôáÓíÚÌé×ÉçÔÆíÚÌóßÑòßÑìØÊäÑÃëÙËîÜÎñÞÐóßÑòßÑðÝÏôâÔïÜÎîÛÍòßÑñßÑìÙËæÒÄçÓÅçÓÅéÕÇîÜÎöâÕöãÕùæÙùçÙìÙËãÑÃèÖÈîÛÍôáÓøåØ÷ä×÷ä׸娸ä×úçÚøä×ðÝÏìØÊíÚÌê×ÉìÙËîÚÌíÙËêÖÈçÓÅðÝÏíÚÌïÜÎòàÒôáÓøåØúçÙòßÑðÝÏñÞÐïÜÎîÜÎðÞÐóàÓøæØüìßýìßúçÙùçÙøæØöâÔñÞÐóàÒöäÖñÞÐñÞÐíÚÌîÛÍôáÓôáÔòßÒðÜÏôáÔúçÚ÷ä×ôàÒñàÒøçÙûìÞùéÛôãÕñàÑòáÓôãÕøæØüìÝüîßüîàÿòäýíÞøæØóâÔòàÒòàÒñàÑõäÖùçÙøçØôâÔðÞÐðÝÏóàÓ÷ä×ùçÚ÷ä×õâÔýêÝþîáÿïáþëÞýêÝýìÞûèÛ÷ä×òàÒïÜÎïÜÎîÜÎöãÕûèÚûèÛôáÔóàÓöäÖðÝÏöãÕúçÚøåØõâÔòàÒóáÓóáÓôàÒõâÔöãÕ÷å×ñÞÐê×ÉêÖÈë×ÉéÖÈëØÊôáÓñÞÐîÛÍíÚÌîÜÎðÝÏîÛÍîÜÎîÜÎïÜÎïÜÎðÝÏòÞÐöãÕôâÔêØÊåÒÄåÑÃìØÊîÚÌðÝÏñßÑòßÑòÞÐøåØøæÙôáÓíÚÌíÚÌóàÓëØÊìÚÌïÜÎñÞÐôàÓõâÔïÜÎðÝÐë×ÉãÐÂäÑÃìÙËöãÖøæØøæØöãÖöãÖøå×úçÙôáÓñÞÐôáÓõãÕ÷ä×òßÑìÚÌðÝÏòßÑëÙËêØÊåÒÄìÙËûéÛÿòåÿîàÿïáûèÛ÷äÖóàÒöäÖúçÚüêÜøåØ÷ä×õâÕ÷ä×úèÚüêÜÿîáþëÞýëÝúçÚöãÖ÷äÖøæ×øæØöå×öå×øæØúéÚúéÚúéÛüëÜÿñâÿõæÿõæþïáûêÛùçÙüëÝýñãýóåóâÔóâÔñàÑïÝÏîÝÎîÜÍòßÑõâÕúèÚþîàþîàýëÝþìÞÿîàýìÞöãÕõâÔøæÙüêÜùæÙïÜÎîÜÎöãÖöãÖöãָ娸æÙõãÕ÷ä×ýêÜðÝÏôâÔøæÙûèÛúçÚùæÙþñäûéÜõâÔòÞÐðÝÏíÚÌöãÕðÝÏíÙËîÚÌñÞÐôáÔòßÑïÜÎêØÊéÖÈêØÊíÚÌìÙËîÛÍðÝÏðÝÏíÛÍëÙËéÕÇóàÓõãÕëØÊé×ÉðÜÎúèÚù娸åØöä×ñÝÏéÖÈíÛÍðÝÏíÛÍðÝÏ÷å×øæÙöãÖóàÒñÞÐòÞÐòßÑðÝÏêØÊê×ÉéÕÇìÙËïÜÎïÜÎùæØ÷ä×õáÓõáÓúéÜýóåþíàûèÚõâÔõâÔ÷ä×öâÔòßÑõãÕúçÚõâÕðÝÏñßÑöâÕüêÝþðãõâÔîÛÍõâÔðÝÏñÞÐõãÖûéÛûèÚöãÖ÷ä×ûèÚÿïâÿðãýëÞúèÛýëÞÿîàþìÞüêÜÿìßþíßõãÕòáÓïÞÐóâÔùçÙüìÞÿøêýïáøçØöäÖ÷å×õãÕðßÑñßÑóáÓøçÙúéÚùçÙüëÝúèÚöå×óáÒóáÒóâÔùæÙûèÛýëÞþíàüêÜúèÚðÝÏëØÊçÔÆê×ÉêØÊçÓÅòßÑóàÓñÞÐøäÖþìÞüéÛóáÓðÝÏðÝÏôàÒòßÑíÚÌöä×÷娸娸娸å×öãÖøæØöâÕõâÔùæÙúçÚúçÚøåØùæÙøåØøåØúçÚúèÛóßÑñÞÐîÛÍìÙËîÛÍïÜÎðÝÏîÛÍìÙËìÙËîÛÍïÜÏñÞÐñÞÐóßÑôàÒõâÕ÷ä×öãÖóàÒñÞÐðÝÏìØÊæÒÄáÎÀåÑÃäÐÂîÜÎùæÙúèÚ÷åØöäÖöãÖøåØ÷äÖóßÑîÜÎðÝÏôáÓùæÙ÷äÖñÞÐîÜÎðÝÏóàÒóáÓñßÑïÝÏöãÕúçÚùçÙùæÙùæÙôáÓöäÖýêÜüêÜ÷åØ÷äÖöâÕøä×úéÛöå×êØÊéÕÇïÛÍñÞÐôáÓùæÙýëÝùçÙôáÔñÞÐòßÒøäÖøå×õâÕõãÖúêÜûêÝúçÙøå×ùæØ÷äÖîÝÏíÜÎíÜÎòàÒóâÔóâÔ÷çÙñàÑíÜÍòáÓôãÕóâÔîÝÎòàÒõãÕ÷æØøæØöå×ÿïáÿïáÿïáþîßþíßüìÝúèÚþíßþíàøå×òßÑñÞÐëØÊäÑÂäÒÄîÛÍñßÑìÚÌñßÑóàÓùå×þíßüéÜõáÓñÞÐïÜÎòßÒúèÚúêÜ÷åØúçÚöäÖóáÓñÞÐïÛÍëØÊîÛÍñÞÐôáÓ÷äÖ÷äÖöãÕñÞÐ÷äÖ÷äÖôáÔõâÕòàÒòßÑîÜÎëÙËêØÊïÜÎóßÑôáÔîÛÍèÕÇéÖÈðÝÏöãÕùçÙôáÓñÞÐôàÓòßÒíÚÌé×ÉëÙËíÛÍïÜÎïÜÎïÜÎçÔÆêÖÈíÙËïÜÎñÞÐñÞÐôáÔôáÓóßÑñÞÐðÝÏïÜÎ÷ä×öãÖôáÔòßÑòßÑóßÑîÛÍòßÒùæØúèÚòßÑçÓÅóàÒûéÛúçÚ÷娸åØõáÓûèÚþëÝöãÕ÷äÖüéÜòÞÑøåØ÷åØñÞÐñÞÐöãÖõãÕûèÚüéÛüêÜüéÜùæÙ÷ä×ûìßôáÔðÜÎíÛÍïÜÎöãÖöä×ùçÙûéÛöãÕôàÒ÷ä×úêÜõãÕñßÐóâÔ÷å×øæØñàÒîÜÍïÞÏõäÖöå×òáÓ÷å×úéÛûêÛøæØöå×öå×öå×óâÓñßÐóâÔùèÚýîßþïáþìßùçÚõáÓõâÔøåØùçÙöäÖøæØüîàýðãüîàýîá÷ä×øåØúçÚóàÒïÜÎ÷ãÖ÷ä×öä×öãÕöäÖøä×ùæÙóßÑìÚÌé×ÉæÒÄâÎÀâÏÁéÖÈíÛÍëØÊæÓÅãÐÂë×ÉóàÒòßÑîÛÍïÜÎëÙËóßÑòÞÐòßÑóáÓõãÕ÷äÖïÜÎïÜÎîÛÍïÜÎñÞÐôàÒðÝÏíÛÍîÜÎòÞÐðÜÎéÖÈëØÊñßÑöäÖøåØùæÙûéÛúéÛ÷äÖõãÖîÛÍéÕÇìÙËìÚÌîÛÍíÚÌíÚÌñßÑ÷å×îÛÍñÞÐøå×öãÕñÞÐóßÑøåØ÷ä×öâÔôáÓòßÑñÞÐêÖÈïÝÏùçÙûéÛ÷ä×úèÛôâÕðÝÏöãÖöãÖñÞÐ÷ä×üêÜôáÓïÜÏôáÓ÷äÖõâÔóàÒùæØùæØôàÒôáÓúçÙýëÝöãÖðÜÎòßÑöãÖùæÙ÷ä×÷ä×òàÒíÚÌìÙËïÝÏõãÕùèÚüëÜúéÚòáÒëÚËíÛÌøçØùèÚîÜÎëÙËòàÒúçÚøåØ÷ä×÷ãÖóàÒîÜÎê×ÉïÜÎîÛÍôàÒûèÛûèÛõâÔðÝÏîÜÎòßÑøåØûèÛ÷äÖýîàýëÝñÝÏðÞÐùçÚûèÛùæÙñÞÐçÓÅéÖÈñÝÏñÞÐíÚÌíÚÌöãÖúèÚùçÙîÜÎê×ÉêÖÈõáÓ÷å×ðÝÏêÖÈìÙÌïÝÏðÝÏîÛÍìÙËíÚÌíÚÌìÙËéÕÇìÙËñÞÐõâÕ÷ä×øåØõâÔíÚÌåÒÄê×ÉîÛÍòßÑôàÒñÝÏîÚÌçÔÆë×ÉöãÕûèÚõâÕôâÔòàÒôâÔùçÙýíßýíßüéÛûéÛúçÚøåØöä×öãÕöãÕòßÒ÷åØ÷åØïÜÎîÛÍñÞÐñÞÐñÞÑõâÔôáÓñÞÐôáÓúçÚýëÝûèÛöãÕøåØýìÞõâÕôàÓôáÓ÷ä×öãÖòàÒðÞÐîÜÎñÞÑôáÔõâÕùçÙøæÙúçÙúèÚûèÛýëÞþïáûêÝóàÒìÚÌðÝÏøå×üêÜÿíßûéÜøå×÷äÖõâÕóàÒòÞÐõâÔ÷ä×÷åØúçÚýêÜüíßüëÜúèÚ÷æØõäÖôâÔöäÕöäÖ÷æØùèÚùçÙ÷å×òßÒóàÒôàÒõâÔ÷ä×÷娸å×øå×òßÑñÞÐõáÔôáÓóàÒìÙËëØÊõâÔüêÜþëÝþìÞúçÙóßÑìÙËëØÊìÙËøå×õâÕòßÑóàÓöäÖøå×öãÕóàÓòÞÑòßÑðÝÏíÚÌìÚÌïÝÏôáÓóßÑîÛÍíÛÍùæØüéÛøåØïÜÎìÙËîÛÍìÚÌíÚÌîÛÍîÛÍìÙËê×ÉéÖÈîÚÌïÜÎëÙËê×ÉëØÊëØÊðÝÏóàÒòßÑòÞÐòßÑòàÒñÞÑïÜÎïÜÎðÝÏðÝÏèÕÇê×ÉíÚÌðÝÏñÞÑñÝÐõáÔ÷ãÖùæÙûéÛûéÛûèÛöãÖöä×øåØ÷å×ôáÔðÝÏëÙËîÛÍòÞÐõãÕ÷äÖúçÙøå×÷ãÕùçÙþïâþîàùèÛüéÛüéÛöä×öä×õáÔë×ÉëÙËîÛÍîÛÍõáÓûéÛûèÛéÖÈîÜÎóàÒøäÖúçÚûêÜýëÝõâÔðÝÏõãÕ÷åØôáÓûèÛýëÝþíßþñãþðãüîàüëÝúçÚöâÕöâÔúèÚþìÞÿõçþïàøçØöå×ùèÚýìÝûêÛ÷å×øæØÿîßùèÙíÜÎëÙËñÞÐöâÕõáÓóàÓóàÒüêÜüêÜùåØ÷ä×ù娸ä×üéÛøåØõâÕõáÓöâÔõâÔùæÙôáÓòßÑõâÕöãÖõâÕìÚÌîÛÍñÞÐ÷åØüêÜþëÝþíßýëÞøåØòßÑðÝÏðÝÏøæØ÷ä×öãÕñÝÏðÝÏ÷ãÕýëÝüéÜõâÕëØÊê×ÉìÚÌîÛÍë×ÉéÖÈëØÊçÔÆâÏÁæÒÄèÔÆéÕÇêØÊíÛÍñÞÐïÜÎõâÔ÷ä×óßÑîÛÍìÚÌ÷åØùæÙòßÑîÛÍðÝÏïÜÎèÕÇæÒÄãÐÂâÏÁéÕÇðÝÏñÞÐõâÔùçÙúèÚöãÖñÞÐøæÙ÷ä×÷åØùæÙøåØóàÒòßÒóàÒòÞÐóàÒôáÔòÞÐóàÒñÞÐòßÑøæØøåØóàÓüéÜþíà÷åØñÞÐõáÓõâÔýíßÿîàüéÛüéÜýëÝôâÔóàÒðÝÏñÞÐôáÓðÝÏçÓÅïÜÎõâÕúèÚüêÜüéÜúçÚúèÚüêÜþíßþïâýðãýðãöãÖôáÔôáÓ÷äÖùçÙúèÚóâÔ÷å×ûéÛúèÚöäÖñàÒíÛÌíÛÌðßÐ÷å×úèÚùçÙôáÓõáÓòßÑíÚÌëÙËíÚÌòßÑõâÔúèÚýëÝúçÚøä×ïÛÍöãÕøåØðÝÏíÚÌïÜÎòßÑùæÙþìßÿìßüêÜûéÛöãÖüêÝüêÝõãÖôàÒ÷ä×úèÚ÷å×ðÞÐê×ÉîÛÍöãÕøåØôáÓïÜÎóàÒøæÙ÷ä×ñÞÑìÙËìÙËôáÓùæÙùæÙòßÑë×ÉéÖÈòßÑ÷ä×÷ä×òßÑíÛÍêØÊíÛÍîÜÎíÛÍîÛÍïÝÏîÜÎîÛÍñÞÐôáÓñÞÑôâÔîÛÍêØÊñÝÏóàÒîÛÍïÜÎíÛÍëØÊïÜÎóàÒóàÒðÝÏíÚÌìØÊíÚÌîÜÎóßÑóßÑñÞÐîÛÍñÞÐ÷å×üìÞùçÙñÞÐîÛÍïÜÎë×ÉôáÔóáÓîÛÍéÖÈìÙËôáÓôáÔôáÓñÞÐðÝÏ÷å×þîàÿòäþïáüêÜþíàÿïáûéÜúèÚøä×ùæÙüéÜøåØïÛÍöãÕúçÚúèÚöãÖõâÕöãÕùçÙûéÛûèÛ÷ä×õâÕõâÕôàÒ÷åØüêÝþíßøæØðÞÐè×ÈðÞÐøçØøçÙóâÔíÜÎöäÕôâÔòàÒóâÓøçØüëÝüêÜöãÕðÝÏíÚÌðÝÏòàÒîÛÍñÝÏøä×úçÚõâÔôàÒóàÓúçÙûéÛõâÔòßÒôáÔ÷äÖüêÝýíßúçÚöãÕõâÔþëÝÿñãÿðâúèÚ÷ä×ùçÚñÞÐñÞÐïÜÎëØÊîÛÍñÞÐêÖÈëØÊîÛÍöãÕöãÖîÜÎäÐÂâÏÁåÑÃïÝÏóàÓòßÒôàÒîÛÍìÙËðÝÏðÝÐîÚÌñÞÐóàÓõâÔ÷äÖùæÙûèÛõâÔíÚÌæÒÄèÕÇîÛÍòßÒìÙËëÙËçÔÆäÐÂéÖÈòßÒòßÑõâÕøæÙùæØõâÔòßÑõãÕîÛÍçÔÆèÕÇïÝÏöä×÷ãÖõáÓòÞÐòßÑ÷ä×üêÝúçÚôàÓéÕÇìØÊõâÔ÷äÖùæÙõâÔðÝÏëØÊëØÊìÙËåÒÄäÑÃíÚÌùæØûèÚýìÞþìßöãÕñÞÐõâÔøåØ÷åØúçÚüêÜýëÝùæÙöãÕóàÒ÷åØöäÖöâÔõáÓòßÑðÝÏðÝÐöãÕùæÙøåØ÷äÖ÷ä×ùæÙüéÜÿðâÿòäûéÜòàÒöåÖòàÒïÝÎñßÑùéÚüðâÿòäþòäýðâýîßúèÚöå×õâÔõáÓ÷ãÖúèÚúèÚøæØòßÑòßÑùçÙûéÛøåØùçÙøä×õâÔõâÔùæÙúçÚøåØûèÛøå×õâÔ÷ä×ùçÙûèÚÿòäÿïáýìÞúçÚ÷äÖôáÓöãÖûèÛüíàüëÝøåØòßÑæÒÄê×ÉòàÓ÷ä×óàÒðÝÏìÙËîÛÍíÚÌêØÊæÓÅãÐÂòßÑóàÓõãÖõâÕíÚÌåÑÃçÔÆòàÒõâÔêÖÉéÖÈðÝÏìÙËæÒÄæÒÄìÙËïÝÏîÛÍé×ÉëØÊîÛÍèÕÇäÑÃìÙËøä×õâÕõáÓ÷å×öãÖóàÒõáÓóßÑñÝÏñÞÐóàÒõâÔòßÑë×ÊéÕÇñÝÏõáÓóàÒùæÙíÛÍêØÊôáÔ÷ä×ñÞÐçÓÅçÓÅðÝÏùæÙùæÙúçÚ÷äÖõâÔ÷äÖõâÔíÛÍèÔÆìÙËïÜÎïÜÎçÔÆèÔÆôâÔúèÚúçÚøäÖõáÓøå×üëÞüêÜúçÚùæÙøå×óàÒë×Éé×ÉêØÊñÞÐôâÔðÝÏñÞÐ÷äÖüìÞüïâúêÜûèÚýëÝûêÛóáÓîÜÍóâÔûêÜÿðâúéÛ÷æ×öäÖøçÙùèÙøæ×þëÝÿîàÿóåÿôæÿóåþðâþëÝüéÜúçÚùæØøåØ÷ä×èÕÇäÑÃèÔÆüëÞÿïáýëÝüéÛûèÛòßÑïÜÏùæÙýëÞøåØöâÕøåØûéÛ÷ä×òßÑöãÖóßÑóàÓùçÙýêÜýêÜüêÜþîàùçÙëØÊíÚÌùæØùçÚüëÞôàÓíÚÌïÜÎíÛÍðÝÏðÝÏðÝÏïÜÎïÜÎïÜÎòàÓîÜÎëØÊìØÊëØÊèÔÆëØÊíÚÌìÚÌëÙËîÛÍòßÑôáÓñÞÐîÛÍíÚÌðÝÏôâÔóàÒöãÕôàÒëÙËëØÊïÜÎìÙËéÖÈê×ÉîÛÍê×ÉáÍ¿à̾çÓÅîÛÍóàÒõáÓöãÕíÚÌìÙËîÛÍóàÒðÝÏê×ÉçÔÆèÖÈïÝÏóßÒñÝÏòßÑøæÙüêÜöãÖìÚÌïÛÍóàÓåÑÃéÖÈóàÓøåØõâÔõâÔðÜÎöãÕûèÛýëÝùçÙõâÕõáÓøå×ùæÙ÷ãÖõâÕ÷äÖðÝÏíÙËîÛÍïÜÎðÝÏõâÔþìÞôáÓçÔÅåÒÃïÜÎûéÛûéÛùçÙ÷æ×÷å×ùçÙùéÛïÝÏñßÑóâÔóâÔñßÑïÝÏ÷å×ûéÛþîàþîáûéÜøå×üêÝýìÞùçÚñÞÐñÞÐöäÖùçÙ÷å×øå×ûéÜùèÚöãÕïÝÏöäÖ÷ä×õâÔôáÔñßÑóàÓùæØùæÙöâÕôáÓòßÑ÷ä×ôáÔôâÔ÷å×úçÙúçÚöä×òßÒîÚÌíÚÌïÜÎðÝÏòÞÐîÛÍæÓÅìÙËøåØøæÙñÝÏðÝÏïÜÎïÜÎñÞÐòßÑìÙËê×ÉéÖÈê×Éê×ÉèÔÆçÔÆíÚÌñÞÐòßÑóàÒôáÔøå×ðÝÏëØÊðÝÏòßÑïÛÍïÜÎîÛÍïÜÎñÞÐñÞÐïÜÎòßÒñßÑíÚÌçÔÆãÏÁà̾íÙËóàÒøå×úçÚöãÕñÞÐôáÔöãÕõâÕóßÑóßÑôáÓöäÖòàÒïÜÎê×ÉëØÊõâÕõáÓóáÓíÛÍîÛÍöâÕûçÚñÝÏðÝÏòßÑôáÓóàÒñÞÐé×ÉìÚÌòßÒúèÚûéÜøåØúçÚøåØøåØúçÚûéÛûéÛýïá÷äÖîÛÍíÚÌôáÔýëÝûéÛðÝÏåÑÃæÒÄîÛÍöãÕøæØýíßþðáùèÙïÞÐèÖÈòáÓõäÖõäÖòàÒðÞÏñàÑë×ÉîÜÎóàÒöâÔôáÓòßÑðÞÐñßÑðÝÐíÚÌñßÑùçÙþìÞþëÝüêÜïÜÎë×ÉèÔÆêÖÈòÞÐöâÔñÞÐéÖÈâÏÁçÓÅíÚÌîÜÎóàÒùçÙüèÚõáÔ÷ä×úçÚúçÚöäÖòßÑðÝÐçÔÆãÐÂìÚÌóßÑóàÒíÚÌêØÊé×ÉñÝÐöãÕöãÕôàÒñÞÐïÜÎìÚÌìÚÌíÚÌìÚÌðÞÑõâÕöäÖòàÒíÚÌé×ÉíÚÌïÛÍëØÊçÔÆæÓÅâοâÎÀçÓÅïÜÎíÚÌåÑÃëØÊíÚÌìÙËèÔÆçÔÆê×ÉòßÑôáÓóàÒîÛÍìÙËíÚÌøåØþëÝûèÛïÜÎéÕÇçÔÆê×ÉñßÑöäÖ÷äÖ÷ä×ùæÙþðâþìßúèÛñÞÐïÜÎøæØõâÔóàÒõâÔøæÙøæÙûéÛúçÚöäÖòßÒôâÕúçÚûéÛøæÙöãÖöãÖûèÛýëÝüëÝøåØüéÛøåØïÜÎðÜÎöãÕðÝÏðÝÏðÝÏõâÕüéÜþîàóáÓóßÑõâÕøæØõâÔîÛÍúèÚþîßÿïáúèÚóáÓïÞÏøçÙüêÜüëÜ÷æØôãÕóâÔðÝÏïÝÏïÜÎñÞÐôàÒöâÕïÜÎìÚÌîÛÍ÷äÖüêÜüêÜóàÒùæÙüêÜôàÒöãÖúçÚôáÓõâÔõâÔñÞÐðÝÏòßÑêÖÈèÔÆêØÊîÛÍóàÒûèÚúçÚöãÖñÞÐîÜÎðÝÏóàÒíÚÌïÜÎðÞÐðÝÏðÞÐñÝÏðÝÏóàÒ÷ä×òßÑíÚÌðÝÏíÚÌìÙËêØÊêØÊêØÊêØÊðÝÏòßÑòßÒñÞÐðÝÏðÝÏðÝÏïÜÎëÙËâÏÁß˽ß˼åÒÄìÙËôáÓ÷åØ÷äÖöâÔïÝÏòßÑòÞÐíÛÍê×ÉçÓÅêØÊìÚÌòÞÐøåØ÷åØóàÒñÞÐðÝÏéÕÇÝÉ»ÝÊ»ãÐÂéÕÇèÕÇéÕÇîÛÍôáÓøåØôâÔøæØþìÞùçÙòßÑôáÓøåØûéÛÿíàûéÜõãÕóàÓùçÚýëÝûéÜúèÚúèÚöãÕôáÔöãÖ÷ãÖôáÓïÜÎìØÊòßÑïÜÎîÛÍðÞÐñÞÐðÜÎóáÓùèÚüêÝþìÞýêÜ÷ä×èÕÇíÚÌôâÕýìÞýìÞûèÛøæØùèÚùèÚûéÛüêÜýìÞúéÛ÷å×óáÓóáÓöå×úèÚýëÝûèÚøä×öãÕøä×ùæÙûèÛùæØúèÛþíßüëÝöäÖôáÔ÷ãÖöãÕòÞÐóàÒ÷äÖóàÓòßÑóàÒóàÒóàÒùæØøå×÷äÖõãÕðÜÎëÙËíÚÌùæØûèÛúèÚõãÖòàÒñßÑðÝÏûèÛþîà÷å×îÛÍêØÊðÝÏøæØûéÛõâÔîÛÍéÖÈåÒÄçÔÆêØÊîÛÍïÜÎðÜÎíÚÌéÖÈãÐÂâÏÁèÕÇñÞÐôàÒóàÒïÝÏë×Éë×ÉîÛÍôâÔóàÒñÞÑòßÒöãÕúçÚõáÔê×ÉåÒÄê×ÉîÛÍìÚÌçÔÆê×ÉðÜÎóàÓóàÓðÝÏóàÒðÝÏíÙËíÙËðÝÏóàÓôáÔñÞÐñÝÏõâÕóàÓîÜÎäÑÃê×ÉõâÔ÷äÖòßÑôàÒõáÓôáÓ÷åØýëÝöãÖæÓÅïÜÎüëÝþëÝôáÓòßÑñÞÐëÙËòÞÐôàÒïÜÎê×ÉæÒÄèÔÆê×ÉîÛÍõâÕúçÚûèÚúçÚüëÝùçÚùå×ùæÙôáÓðÝÏóàÓ÷ä×üêÜýëÝýëÝûêÜòáÓìÚÌðÞÐ÷æØýìÝøæØñàÑíÛÌôãÕûëÜþñâûèÛúçÚùæÙùæÙùæÙùæÙüéÜÿîàÿðãüêÝôáÔíÛÍ÷ä×õâÔïÜÍïÜÍîÛÌñÝÎöãÖøæ×ûëÜùæØòßÑôàÒüêÜýëÝüêÜúèÚôáÓèÕÇñÞÐóàÓóàÒîÛÍêØÊé×ÉõâÔüéÜþíßùåØòßÑðÝÏøåØüéÛòßÒðÜÎñÞÐãÐÂåÑÃêÖÈîÛÍòßÑòÞÐñÝÏéÕÇéÖÈçÓÅçÓÅíÚÌôâÔõâÔöãÖõâÕóßÑöâÔùçÙðÞÐèÖÈåÑÃëÙËïÜÎîÛÍîÛÍðÝÐòßÒñÞÑîÛÍêØÊçÓÅîÛÍòÞÐïÜÎðÝÏöãÖóßÒöâÔøåØøåØ÷åØöä×ùæÙûéÛýëÝúèÚõâÔòÞÐöãÕóàÒñÝÐñÞÐòÞÐðÝÏïÜÎóáÓóàÒíÛÍìÚÌïÝÏñÞÐòßÑîÛÍéÕÇêÖÈíÚÌóàÓìÙËëÙËòàÒ÷åØöãÕøæÙøåØùæÙúçÙúèÚûèÚõâÕòßÑîÜÎíÚÌíÚÌìÚÍýëÝÿíßÿíàûéÛôáÔðÝÏéØÉè×ÈóâÔûëÜõäÖîÝÏêØÊêÙÊòáÓþðáþôåþïàùæÙñÞÑóàÒøåØùçÚýêÜïÜÎôáÔõâÕñßÑôàÒúçÙúè×ýìÛôáÎõâÑ÷åÔúèÖ÷äÔ÷åÔøæÓøæÕöãÒôàÐõãÕúçÙöãÖòßÑôàÒðÝÏê×ÉèÔÆêÖÉôáÓûéÛýëÝúçÙìÙËåÑÃíÚÍõâÕõâÕôàÒíÚÌíÚÌîÛÍîÚÌóàÒñÞÑôáÓôàÒñÞÐïÜÎðÝÏòßÑðÝÏïÝÏòÞÐðÝÏíÚÌïÝÏïÜÎíÚÌîÛÍðÝÏòßÑêØÊê×ÉëØÊìÚÌèÕÇâÏÁëÙËöãÕúèÚýëÝüéÜóàÒóßÑõáÔ÷ä×øæØúçÙúçÙù娸æÙùæÙúçÚöâÕðÝÏöãÕõâÕôâÔôáÓôáÔõâÕÿíàýëÝúçÙôáÓñÝÏîÛÍòßÑîÜÎëÙËïÝÏøåØýîáüêÜôáÔîÛÍïÜÎðÝÏðÝÏòÞÐîÚÌîÚÌöãÕûèÛüêÜýëÞÿíßûéÛñÞÐïÜÎòßÑ÷äÖøåØ÷å×öãÕ÷å×úèÚÿïáýëÝûéÛüêÜùæØóáÓïÝÏñßÑñàÒîÜÎêÙÊèÖÈîÝÏóâÓøçØùçÙøçÙöå×üéÛüêÜøæÙôáÔ÷ä×ýêÜóßÑïÜÎñßÑûêÜÿíßýëÛüêÙýíÚùæÔþíÚûê×öäÒúèÖýëØüê×øæÓøæÔûèÖïÝÏóßÑõâÔôáÔöãÕøå×ñÝÐ÷äÖùçÚöâÕõãÕùçÙüëÞõâÕïÜÎïÜÏïÝÏìÙËéÖÈìÙËðÝÏïÜÎðÝÏùçÙüéÜúçÚôáÓíÛÍìÚÌîÛÍíÛÍêØÊèÕÇèÕÇæÓÅäÐÂëØÊèÕÇèÕÇìØÊïÜÎïÜÎíÚÌïÜÎðÝÏïÜÎìÙËéÖÈëÙËòßÑôáÓòßÒõâÔûèÛóàÒðÝÏïÜÎóàÒ÷äÖùæØóßÑõâÔøåØüéÜùçÙõãÕîÛÍíÚÌëÙËíÚÌñÞÐôáÓôâÔûèÚþìÞýìßüëÝüìÞûéÛôáÓðÝÏôàÓøæÙøæÙòßÑðÝÏñÞÐøå×øæØõãÖûèÚûèÚüêÜýìßýëÝúèÚóàÓùçÙüéÜöäÖôâÕöãÖ÷ä×øåØýëÞÿòäÿïâúæØúèÚøæÙøåØûèÛýëÞýìßýðâýîàõäÕñàÒùéÛûðâøæØúèÚúèÚòáÓëÚÌè×ÉîÚÍõáÓòßÑïÜÎõâÔöãÖðÜÎ÷äÖüéÛûéÛ÷å×ôáÑùçÖõãÐõâÐþíÚüëØõãÐóáÏøåÓúèÕøæÔõãÑóáÎöãÕóßÑúèÚþïâüëÝûéÛùåØûèÚöãÕéÕÇçÓÅìÙËøå×úèÚüêÜýêÝûèÛùæØøæØúèÚùçÙòÞÐíÛÍïÝÏôáÓòßÑîÛÍêØÊëÙËïÜÎëÙËê×ÉèÖÈé×Éê×Éê×ÉìÙËéÕÇçÓÅê×Éê×ÉçÔÆê×ÉïÜÎðÝÏîÛÍíÚÌîÛÍíÚÌê×ÉèÕÇåÒÄæÓÅñÞÐòÞÐïÜÎðÝÏõãÖøåØ÷äÖóßÑñÞÐòßÒöãÕùçÚüéÜíÚÌñÝÏõáÔóàÓîÛÍèÕÇäÐÂìÙËõâÕùçÙûéÛûìÞúçÙøåØöä×öä×öãÖôàÓôáÓùçÙýëÝýëÞþîáÿóåÿðãÿðâýìßúçÚùæÙúçÚûéܸ娸å×ýëÝýëÝúçÚýìÞþïáüïáùçÙ÷ä×øæØìÚÌòÞÐòßÑïÜÎóàÒûèÛøçØöå×ñßÑ÷æØþðáýïàùéÛøçÙùçÙúéÚøçÙóáÓîÜÎòßÑòßÑøæØûéÜôáÓøäÖúèÚöãÖìØÊíÙËôáÓþëÛúçÕøåÓôâÏøæÓüê×øæÓòàÎòàÎøæÓùæÔôâÐíÚÌìÙËôâÕùçÙóàÒïÜÎòßÑïÜÎìÙËë×ÊéÖÈçÔÆäÑÃìØÊóáÓøåØùæÙùæØ÷å×ôáÔñÞÐôàÒòßÑìÙËéÖÈìÚÌïÜÎîÛÍïÜÎòßÑðÝÏðÝÏîÛÍîÛÍïÜÎòßÑëÙËïÜÎóàÒóßÑëØÊãÐÂë×ÉîÛÍñÞÐðÝÏòßÒõâÕñÝÏçÔÆæÒÄë×ÉéÖÈëØÊòßÑóßÒôàÓðÝÏèÔÆß˽ê×Éê×ÉèÕÇæÓÅæÒÄæÒÄïÜÎìÙËéÖÈê×ÉïÜÎóàÒîÛÍìÙËê×ÉèÕÇê×ÉëØÊëØÊôáÔùçÚ÷ä×õâÕ÷ãÖúèÚùçÙöãÕóàÒ÷äÖüëÝüêÝüéÛõâÔïÜÎôàÓüéÛþîàùæØöâÕüéÜÿîáþíà÷äÖïÝÏëØÊíÚÌóàÒ÷äÖïÜÎóßÑóàÓðÝÏïÜÎðÝÏïÝÎóâÔùèÚüëÝùèÚõäÖÿðâýìÝúéÚùéÚøèÚøçÙýêÝúçÚøåØúèÛûèÛøå×úçÚóàÒïÜÎóáÓ÷äÖ÷äÖöãÓõãÐõãÑçÕÃêØÅôáÎôâÏíÛÈé×ÄíÛÈòàÍôâÐ÷å×øå×÷ä×ðÝÏìÙËëØÊðÝÏïÝÏôáÓûéÜúèÚôáÓìØÊíÚÌîÜÎïÜÎîÛÎíÙÌåÒÄãÏÁâÎÀîÚÌ÷äÖõâÕïÜÎòßÒõáÓòßÑðÝÏïÜÎòßÑòßÑïÜÎìÚÌíÚÌðÝÏñßÑòßÒñÞÐïÜÎïÜÎðÞÐñÞÐòßÑóßÑôàÒöâÔ÷ãÖòÞÐïÛÍðÜÎ÷ãÖøå×ôàÒðÝÏôâÔöä×ñÞÐê×ÉçÔÆæÒÄé×ÉíÚÌíÚÌîÛÍðÜÏüëÝûéÜøæØôáÔóàÒòßÒüìßñßÑåÒÄâÏÁæÒÄéÖÈíÙËöãÕøåØîÛÍîÜÎöãÖûéÛöâÕòßÑôáÔõáÔóàÒ÷åØûèÛøæØòÞÐñÞÐöâÔûèÛýëÞýìßýêÝúèÛøæÙúçÙ÷å×óàÓðÝÏòßÑõâÔúçÙøåØúèÚýíßúéÛóàÒïÝÎöäÖþîßûêÛöå×ûëÜøçÙúèÚõäÖîÝÎðßÑøçÙúèÚôáÓñÞÐíÙÌîÛÍùæØõáÔôàÓøæØþïâþïáùæ×íÚÉëØÅóáÏîÜÉïÜÉïÝÊìÚÇóàÍôâÏðÞËðÞËôâÐúçÚúçÚóàÒòßÑøåØúçÙûèÚûèÚüêÜþíßÿîáþìßúçÙóàÓìÙËçÓÅäÐÂáÎÀçÕÇçÔÆáÎÀäÑÃïÝÏôàÓðÝÏòßÑòßÑîÜÎìÚÌëÙËðÝÏñÞÐïÜÎíÚÌñÝÏõâÕüêÜ÷åØîÛÎæÒÄìØÊ÷ä×õâÕòßÑðÝÏòßÑñÞÐïÜÎóàÒùæØ÷ä×÷åØùæÙõáÔïÜÎòßÑðÝÐéÕÇéÖÈîÛÍôáÓñßÑíÛÍë×ÉñÞÐøå×÷ä×óàÒôàÒüêÜýíßüêÝòàÓøæØùçÙóàÒðÞÐñÞÐë×ÉèÕÇéÖÈòÞÐ÷ä×øæÙ÷ä×òßÑóáÔùçÙòÞÐåÑÃìÙËîÛÍôáÓúèÚ÷åØðÝÏðÜÎóßÒöâÕõâÕ÷ä×úçÙúèÚþìßÿîàüêÜùæÙ÷åØõâÔùçÚûèÚøæØöãÖõãÕüíÞúêÜõäÖïÝÎðÞÏóâÔüêÜþíßýìÝ÷æØõäÖöæ×òàÒïÜÏòßÑòßÑïÜÏòßÒýëÝÿîàÿðâþíßúçÚõâÓùæÕðÞËôâÐúèÕòàÍëÙÇðÞËëÙÇñßÍøæÔôâÐòàÎðÝÏîÛÍîÛÍñÞÐòßÑñÞÐøæÙþíàûêÜöãÖøæØøå×ùæÙ÷äÖðÝÏîÛÍòßÑïÜÎôàÒóßÑòßÑê×ÉäÐÂéÖÈéÕÇèÔÆëØÊôâÕõáÔïÜÎòßÑòßÑóßÑóàÒóáÔóàÓìÙËïÜÎðÝÏîÛÍìÚÌíÚÌðÝÏëØÊèÕÇìÚÌñÞÐóàÒóßÑõáÓôàÒñÞÐòÞÐõáÔìÚÌìÙËíÚÌðÝÏöãÕúèÚùæÙúçÚùæÙöä×óàÒñÞÐóàÓõâÔõâÔõãÖõâÕôáÓèÕÇéÖÈïÝÏùæÙúçÚõâÕûéÜùæÙøå×úèÚûéÜùèÚõâÕõâÔôàÒîÛÍëØÊéÖÈíÛÍîÜÎñÞÐóàÒðÞÐëØÊäÐÂåÒÄëØÊõáÓõâÔïÜÎúçÚüéÜüéÜûéÛüëÝüíàûéÛ÷ä×òßÑòßÑõâÕøåØÿóåÿôæþñãûêÜùèÚúèÚùèÙõäÕõäÕýíÞÿðâþíßýìÞûéÛýìÞþîàüëÞýëÞÿïáýìÞúçÙöãÖôáÔóàÑôàÐòßÍóáÏùçÔùçÔõãÑýëØôâÏíÛÈðÞËõãÑ÷åÒôáÔôáÔôàÓóàÒòÞÐðÝÏ÷ä×÷äÖôàÒïÜÎíÛÍîÛÍõâÕôáÓðÝÏòßÑôàÒðÝÏïÜÎñÞÐñÞÐîÛÍéÕÇäÑÃçÓÅèÕÇêØÊíÛÍðÝÏñÞÐòÞÐòßÑñÞÐðÝÏíÚÌëØÊãÐÂê×ÉðÝÏðÝÏîÛÍìÙËîÛÍïÜÎñÞÐòßÒôáÓõâÔñÞÐóáÓôàÓòßÑðÝÏñÝÏíÙËë×ÉìØÊðÝÏòßÑðÜÎõâÔøå×ûéÛúçÚõâÔðÝÏéÕÇôáÔüéÛøå×òßÑïÜÎúçÙúèÛúèÚøåØõáÔóßÑýëÝÿìÞÿìÞúèÚòßÑê×ÉìØÊôáÔúçÚ÷ä×÷å×úçÙüéÛûèÚøåØóßÑïÜÎëÙËùæØùæØõãÖòßÑóàÒöãÖñÞÐóàÒöä×ûéÛÿïáÿõçúçÚ÷ä×öãÖúèÚþìßÿíàøèÚúêÜýíÞþíÞýìÝýìÝ÷æØðÞÐïÝÎøèÙüìÝúèÚþìÞýëÝÿïâÿõèÿòåþíßøæÙôáÓîÜÎìÚÌïÜÎñÝÎúç×üê×÷åÒõãÑøåÓôâÐùçÔúèÕ÷åÒùèÕüêØõãÑòßÒôáÔõáÓòßÑñÞÐóßÑïÜÏîÛÍôàÒôáÔïÜÎïÝÏéÖÈîÛÍîÛÍíÚÌñÝÏõâÔðÝÏïÜÎìÙËõâÔüéÜ÷åØïÜÎôàÓôàÒîÛÍïÜÎôàÒîÛÍðÝÏñÞÐôáÓöãÖöãÖðÝÏðÝÏïÜÎìÚÌêØÊé×ÉíÚÌõáÔúçÙõâÕîÛÍéÖÈçÔÆíÙËòßÑöãÖ÷ä×øå×òàÓòßÒòàÓóáÔóßÑðÝÏíÚÌñÞÐöäÖúçÚ÷äÖòßÑòÞÐùæØüèÚöãÖõáÓöãÖøåØöãÖôâÔõáÔ÷ä×ùæÙñÞÐóàÒôâÔôâÔóàÓóàÒóàÒöãÕùæÙüêÜýìßýëÞùçÙúèÚûéÛûèÛûéÜûéÜüêÜøæØòßÒîÛÍòßÒùæØðÝÏóßÑöãÖøåØ÷ä×ôâÔýêÜúèÛúçÙüèÚûéÛùæÙñßÐðßÐðßÑôãÕöäÖ÷å×ôãÕõäÖôãÕòáÓóâÔöå×ÿíàÿïáýîáüïáüìÞùæØïÜÎïÜÎðÝÐóàÒöäÖùæ×úç×üêØ÷åÒôâÐùæÔøæÓòßÍúéÖûêØúèÖôáÎçÔÁéÕÇñßÑúçÙýëÝüêÜûèÛíÚÌéÕÇìÙËïÜÎîÛÍóàÒéÖÈìÙËîÛÍîÛÍòßÑúèÚûèÛöãÕïÛÍóàÒúèÚöãÖùçÙýëÝüêÜòÞÐìÙËëÙËòÞÐïÜÎìÙËê×ÉìÙËîÛÍôâÔóàÒñÞÐñÞÐñÞÐðÝÏðÜÎòßÑñÝÏëÙËéÖÈéÕÇíÛÍîÛÍðÝÏñÞÐðÝÏîÛÍþìÞÿíàûéÜñÝÏîÛÍòàÓíÚÌìÙËíÚÌóàÒõáÓóàÒüêÜ÷ä×ñÞÐðÝÏôáÔøæÙòßÒîÛÍïÜÎõâÔ÷å×õãÕòßÑïÜÎëÙËêØÊñÝÏøå×ÿïáûèÛõáÔòßÑóàÓóáÓîÛÍïÜÎõáÔüêÜÿîàýíß÷ä×ôáÓôáÓ÷ãÖõâÔïÜÎíÚÌðÝÏôáÔùæÙõâÕðÝÏôáÓòßÑðÝÏòÞÐôáÔ÷äÖöäÖòáÒïÞÏñàÒóâÔòáÓôâÔúéÛûëÜõäÖòàÒóâÔúèÛùçÙñÞÐìÙËñÞÐõáÓóàÒöâÕùæÙüêÜýëÝýêÛóàÏóáÎõãÐøåÓûéÖýëØõãÑñßÍíÛÈîÛÈôáÎ÷æÔùéÛúçÚøåØ÷äÖöäÖöãÕúçÚöãÕïÝÏìÙËðÝÏöäÖñÝÏîÛÍòÞÐõáÓòßÑòßÒðÞÐòßÑôáÓòßÑïÜÎëÙËêÖÈíÚÌñÞÑõáÔõâÕôáÓîÛÍìÚÌê×ÉèÕÇèÕÇèÕÇæÓÅéÕÇïÛÍõãÕ÷åØõâÔôáÓðÝÏëØÊê×ÉîÛÍñÞÐ÷ä×óßÑðÝÏóàÒöãÕøå×ûéÛüêÜùçÚòßÒðÝÐñÞÐëØÊèÕÇé×ÉõáÓúèÚûéÛõâÔíÚÌêØÊïÜÎôáÓôáÓñÞÐöäÖöãÖîÛÍêÖÈëØÊõâÓöãÕõãÕöãÕúèÚþîàúèÛûéÚùæ×òßÐñÞÏóàÒöãÕôàÒõáÓùæÙ÷äÖñÞÏñÞÐöãÕùæ×øå×öãÖöãÖòÞÐóßÑõâÕøä×óàÒìÚÌïÜÎòÞÐòÞÐîÛÍìÚÌîÜÎôãÕñàÐðßÏóâÔôãÔóâÒôãÕùèÙüëÛõäÕìÚËæÕÅêÖÈòàÒòÞÐïÜÎõâÔøæÖ÷å×ùæØúèØúçÚùçÙ÷åÖøåÔóàÎöãÑ÷åÔôâÐõãÑûè×õâÑôâÏõâÒ÷åÔþíÝýëÞõâÕíÛÍíÚÌðÝÏñÞÐõâÔúèÚõâÔíÚÌîÛÍîÜÎïÜÎïÜÎôàÒñÞÐæÓÅáοëØÊðÜÎ÷äÖðÜÎçÔÆé×ÉçÓÅæÒÄê×É÷ãÕüéÜûèÛõâÕ÷ä×øæØõãÖñßÒîÜÎçÔÆäÑÃåÒÄìØÊðÝÏðÜÎùæØöãÖôáÔõâÕòßÒîÜÎñßÑê×ÉæÒÄêÖÈòàÒöä×òßÑñÞÐõãÕþìÞýìÞøåØ÷å×ñÞÑðÝÏöâÔ÷å×õâÔèÕÇñÞÐóàÒíÛÍíÛÍôáÓ÷åØùçÚýìÞùæØðÝÏðÝÏðÜËóàÏúé×ýìÛ÷åÓìÚÈíÚÉòßÎòßÎ÷äÓþìÚþìÙýìÚúèÖóáÏéÖÆæÓÁæÓÀñßÎøæÔûéÖùçÖùæÕüéÙûèÛüêÜöâÔê×ÉëØÊóáÓðÝÏóàÒöä×÷ä×òßÑíÛÌïÜÌõâÑúèÖüéØùæÕõãÑøåÕúè×òàÍêׯïÜËòßÍìÙÇóáÏ÷äÒôáÐóáÏöãÒüéØõâÑðÞËïÜÌðÝËîÛËùæ×ýêÛþëÜùæÙöãÔõáÓöâÕúçÙúëÝúëÝøå×óßÑóáÓôàÒíÚÌîÛÍôâÔöãÕèÔÆæÒÄçÔÆïÜÎðÝÏíÚÌìÚÌïÜÎîÛÍé×ÉæÒÄäÑÃæÒÄíÛÍìÚÌâÏÁæÒÄñÝÏôáÓôâÕðÝÏéÖÈëØÊòßÒïÜÎñÞÐðÝÏê×ÉèÕÇçÔÆîÜÎíÚÌèÔÆäÑÃçÔÆíÚÌîÛÍìÚÌíÚÌðÝÏñÞÐïÜÎîÛÍëÙËêØÊìÚÌðÝÏóàÓèÖÈèÖÈëØÊòßÑöãÖõãÖ÷å×óáÓðÝÏðÝÏðÜÎíÚÌïÝÏöäÖùæÙôáÔòßÑóàÒóáÓùçÙûëÞûèÛ÷å×õâÓùæÖöãÐôâÐõãÑòàÎìÚÇïÜÉñÞËðÞË÷åÒüê×ùçÕöæÔôáÎíÛÈê×ÄîÜÉõãÑùçÔùçÔøæÔöäÑóáÎñßÌöãÕ÷äÖôàÒíÚÌîÛÍòßÑûéÛþìÞþìÞøåØõâÕõâÓóàÏõãÑõâÐóáÎôâÏ÷åÒøæÔúèÖ÷åÓ÷åÓûéÖúèÕüê×ùæÔóáÏðÝÊóáÎøæÓúèÕüê×ûê×öäÑöãÐøæÓüêÜøæØ÷äÖûêÝüêÜøä×öâÕïÜÎéÖÈêØÊïÜÎñÞÐëÙËíÚÌîÛÍîÛÍñÞÐôáÔïÛÍîÚÌòßÑ÷å×õâÕîÛÍôáÓóàÒðÝÏíÚÌïÜÎòßÒïÜÎíÚÌìÙËïÛÍòàÒôàÒïÜÎê×ÉäÑÃáÎÀáοáÍ¿åÓÅçÔÆèÕÇæÒÄãÏÁáÍ¿çÔÆìÙËïÜÎîÛÍíÚÌíÚÌëÙËëÙËìÚÌïÜÎîÛÍìÙËìÙËìÙËðÝÐöãÕóàÒìÙËåÑÃê×ÉïÜÎóàÒóßÑñÞÐôâÔôáÔôáÔöâÕôáÓñÞÐùçÚûèÛúçÚõãÕðÝÏìÚÌëÙËïÜÎîÛÎôáÓýìÞþïàÿðßýíÛøæÔòßÌóàÎ÷åÒóáÎôâÐöäÒúèÕõâÐëØÅåÓÀïÜÉøæÓûê×úèÕúèÕ÷äÒøåÓôâÐíÛÈé×Äé×ÄîÛÍñÞÐôáÔøåØûéÛýìÞøæØøåØ÷ãÖõáÔõâÕ÷äÕûéØüëÙùçÔôâÐóáÏöãÑñßÌîÜÉîÜÊõãÑ÷åÓòàÎüê×øæÔõãÑöãÑ÷äÒ÷åÒñßÌøæÔýëØúèÕùçÔúçÕùæÙïÜÏéÖÈíÛÍðÝÏîÜÎòßÑñÞÐóàÓúèÚûéÛøåØïÝÏïÜÎòßÑîÚÌê×ÉïÜÎúæÙüéÛýêÜüêÜúçÚùçÙùæÙùæÙöäÖóßÑôàÓ÷ä×øå×òÞÐñÞÐùæÙøä×ñÝÐêØÊé×ÉèÖÈæÔÆâÏÀÞ˽àÍ¿âÏÁæÒÄë×Éê×ÉçÓÅê×ÉêØÊêØÊéÕÇê×ÉêØÊðÝÏíÚÌêÖÈé×ÉëÙËìÚÌðÝÏøå×úèÛóàÒìÚÌê×ÉîÛÍóàÒõãÖóßÑñÞÐñÞÐúèÚûéÜüéÜùçÙôáÔïÜÎùçÙ÷ä×õâÕóáÔóàÒòßÑûèÛùçÙòÞÐóàÒúèÚûèØöãÓöäÑñßÌêØÅîÛÈóáÏùçÔõãÑöäÒøæÔóáÏíÛÈôáÎùçÔýëØûéÖúçÕùæÔðÝËñßÍòàÍóáÏöäÒ÷æÔõâÔöãÖùæÙüêÜýëÝýëÝúéÛõãÕõâÔûéÛûéÜ÷äÖ÷äÔüëØÿñßÿðÞÿïÜþîÜúèÕôâÐõãÑþìÙÿðÞÿïÝýëÙúèÕøæÔùçÔõâÐîÜÉòàÎòßÌòàÎñßÍêØÆâнòßÑöãÕôáÔíÛÍìÚÌðÝÏúçÚüéÜþìßýíßüéÛöãÕõâÔóàÒõãÖóßÒðÝÏöâÕûéÛýëÝöäÖèÕÇéÖÈôáÔñÞÐ÷äÖúèÚøåØôáÓòÞÐëØÊëÙËíÚÌïÜÎëØÊæÒÄê×ÉðÝÏñÞÐëÙËëØÊïÜÎòßÑñÞÐòßÑôàÒñÝÏìÚÌóßÑðÝÏíÚÌíÚÌïÜÎðÝÏïÜÎðÝÏïÜÎíÚÌëÙËëÙËôáÓõâÕðÝÏçÕÇçÓÅëØÊñÞÐòÞÐðÜÎîÛÍñÞÐöãÖøåØúçÚûéÜùæÙöäÖôâÔê×ÉëØÊëÙËîÛÍñÞÐôàÒóàÒòßÒóßÑöãÖ÷ä×õãÓöãÓõãÐôâÏôáÎöãÐöäÑúèÕôâÐôâÐøæÓùçÔûê×ùæÔûèÖúèÕøæÓøæÔûéÖõãÐòàÎôâÏýëÙÿðÞÿðÞüìÞýìßýìÞýëÝýëÝýëÝüìÞüêÜþìÞÿïáÿîàüéÙøåÕùçÔûé×ýìÙýëØøæÔóàÎñÞÌóáÏõãÐõäÑøèÖ÷åÓöäÒ÷åÓûéÖüêØúèÖöäÒõãÑöäÒøæÓõãÐïÝÊïÜÎöãÕõâÕëØÊíÚÌ÷ä×þíßüêÜøä×õâÔùæØþìÞýëÝûèÛùæÙúçÚ÷ä×óàÒ÷äÖ÷äÖñÞÐçÔÆçÔÆíÚÌòßÑöãÖøæÙôáÓíÛÍêØÊíÚÌïÜÎïÜÎïÜÎïÜÎðÞÐëØÊòßÑôàÒîÛÍëØÊìÙËïÜÎðÝÏñÝÏòßÑôàÒôáÔìÙËíÚÌîÛÍðÝÏîÛÍê×ÉæÒÄìÙËðÝÏðÝÏïÜÎíÛÍõáÔëØÊåÑÃèÕÇìØÊìÙËê×Éê×ÉêØÊìÚÌðÜÎòßÑôâÔõâÕòàÒïÛÍîÚÌðÝÏïÜÎóßÒõâÕôáÔöãÖøå×ïÜÎëØÊñÝÏúçÚüëÝýðáûéØýëØüêØüê×üê×þìÙ÷åÓ÷åÒüëØýëÙúçÕûéÖýìÙúèÕóàÎïÝÊóáÏúèÕþìÙúèÖ÷åÓ÷åÓöæÔõäÒþíßûêÜõãÕë×ÉçÔÆåÒÄìÙËøå×þìÞüêÜúçÚüéÚôàÐíÛÈëÙÆñßÌôâÐóàÎõâÐöãÑ÷åÒïÜÉçÔÁêØÅôâÐøæÓüëÙþîÛÿîÜþìÚõãÑøåÓøæÓöäÑ÷äÒúèÕóàÒ÷ä×ôáÔëÙËìÚÌôàÒöãÕùæÙöâÕíÚÌë×ÉîÜÎ÷ãÕúçÚúçÚþîáþîàõáÓåÒÄãÐÂæÒÄíÛÍìÚÌåÓÅçÔÆëØÊïÜÏñÞÐôáÔøåØúçÙôáÓîÛÍîÛÍñÞÐôáÓöãÖóáÓñÞÐíÚÌéÖÈäÑÃéÖÈêØÊéÖÈèÔÆëØÊïÜÏôáÔòßÑðÝÏñÞÐíÚÌèÔÆáÎÀäÑÃçÓÅê×ÉñßÑøæØùçÙôâÔïÜÎìÙËïÜÎòßÑêØÊíÚÌðÝÏòßÑíÛÍæÔÆèÕÇèÕÇæÓÅåÒÄê×ÉñÝÏôâÔíÛÍëØÊõáÓùæÙôáÓðÝÏë×ÉéÖÈìÙËìÙËçÕÅéׯòßÍöãÐòàÍòßÌöåÒüê×ýëÙûèÕýíÛÿòàþíÚüìÚøæÓõãÑ÷åÓ÷åÓóáÏúèÖ÷åÓñÞËé×ÅçÕÂçÔÁíÚÌïÜÎäÑÂåÑÃìÙËåÒÄæÓÄïÝÏïÜÎìÚÌòÞÐôáÒ÷äÔöãÑòàÍïÝÊóáÎøæÓøåÓòàÍðÝÊôáÏôâÐñÞËöäÒûé×ûê×ôâÏïÝËðÞËóáÎúèÕòßÌîÜÉ÷äÒõãÑøåØûèÛýëÝûéÛöãÖóßÑíÛÍðÝÏðÝÏéÕÇçÔÆéÖÈæÓÅðÝÏöãÕðÜÎëÙËëØÊäÑÃçÔÆñÞÐöâÔòßÑóßÑëÙËìÚÌðÝÏóàÒñÞÑíÛÍîÛÍòÞÐòßÑîÛÍíÚÌïÜÎñÞÐïÜÎîÛÍðÝÏïÝÏíÚÌïÜÎíÚÌêÖÈèÔÆéÕÇê×ÉñÝÏóáÔòßÑíÚÌê×ÉêÖÈðÝÏóàÒóàÓñÞÐôàÓ÷å×éÖÈê×ÉñÞÐóßÑòßÑøäÖôáÔõãÖóßÒìØÊçÕÇåÒÄëÙËñÞÐóßÑðÝÏñÞÐôáÓõãÕðÝÏïÜÎðÝÏïÜÎñÞÐñÝÏòßÑîÛÍæÓÅãÐÂäÑÁåÑÀèÖÃïÜÉ÷åÓúèÕúèÖ÷äÑñßÌéÖÃëÙÆóáÏõãÐóáÎõãÑøåÓùçÔùçÕùçÕ÷åÓôâÐôâÐøæÓúèÖùèÕõâÔøæØøèÚûîàþñãúëÞûëÞõâÔìÚÌîÛÍòßÑõáÒùæÕõãÑòßÍóàÎ÷åÓûèÖýëØúèÕøæÔùæÔ÷åÓôâÐ÷åÓõãÑïÝÊëÙÆñßÍúéÖöäÒôâÏñßÌôâÐøæÓóáÎðÝÏ÷ä×ûéÛýìÞüëÞøåØ÷äÖõâÕóàÓôáÔ÷ä×úçÚîÚÌæÒÄãÐÂéÖÈíÛÍìØÊðÞÑòàÓùæÙùæØóßÑðÝÏïÜÎèÕÇêÖÈõâÔöãÖîÜÎæÔÆçÔÆë×ÉðÝÏîÛÍéÖÈëØÊêÖÈéÖÈíÚÌóàÓ÷ä×ñÞÐóàÓöãÕóàÒïÜÎëØÊæÒÄæÓÅåÓÅéÕÇíÚÌðÝÏîÛÍéÖÈçÔÆêØÊìÚÌìÙËèÔÆæÒÄìÙËòßÑïÝÏîÛÍòßÑóßÑîÛÍèÕÇìÚÌõâÕñÞÑïÜÎòÞÐúçÚüéÜ÷åØñÞÐðÝÏïÜÎçÓÅåÒÄê×ÉìÙËòÞÑòßÑëØÊë×ÉïÜÌìÙÉïÝÊõâÐúèÕ÷åÓòßÍìÚÇê×ÅãнáλåÒ¿äѾíÛÈõâÐúçÕöãÑôáÎöäÒñßÌöäÒúèÖýëØþíÚÿîÜþñäÿîàÿòåÿôæÿñäÿóåýëÝñÞÐïÝÏõâÕõáÓöãÔýêÙ÷åÓôâÐõãÑøæÔùçÔýìÙýëØüê×ùçÔùçÔøæÓûèÖøæÔùçÔúé×úèÖ÷æÓøæÔòàÍóàÎóáÏîÜÉëÙÆïÜÎöãÖöä×ûéÜÿîáúçÚ÷ãÕõâÔ÷ãÖûéÛúçÚõâÔóàÒõãÕöäÖõâÔôàÒõâÔúèÚôâÔñÞÐïÜÏòßÑ÷ä×òßÑæÓÅãÏÁíÛÍòßÑíÚÌæÒÄäÐÂåÑÃëÙËíÚÌê×ÉêØÊèÕÇåÑÃáÎÀåÒÄë×ÉñÞÐñÞÐïÝÏïÜÎðÝÏðÜÎçÕÇäÐÂâÏÁæÓÅìÙËíÚÌê×ÉçÓÅèÔÆîÛÍòÞÐñÞÐðÜÎçÔÆæÓÅðÝÏñÞÐíÚÌìÚÌêØÊèÕÇëØÊóàÓüéÜõãÖðÝÏîÛÍñÞÐõâÔöä×úçÚþíßûéÛóàÓõâÔøå×ûéÜûèÛúçÚøæÙöãÕòßÏñÝÍóáÏôáÏóàÎöãÑúèÕûê×þíÚûéÖ÷åÓöåÓòàÎüëØÿïÝþíÚóáÏîÛÉîÛÉøçÕýìÚÿðÞþíÚøæÓóáÏöãÕòßÒ÷ãÖ÷ãÕòÞÐ÷ãÖðÝÏïÜÎóàÒóáÓòßÑøäÖõâÒóáÏôâÐûéÖþíÛþíÚÿíÛýëØûéÖüê×þíÚÿïÝþíÚýëØþìÙýëÙ÷åÓíÛÉöäÒöãÑüé×ùçÔõãÑüëÙþëÝúçÚôàÓóßÑóßÑíÚÌçÔÆê×ÉïÜÎõâÔõâÕóàÒóßÒøåØöãÕíÛÍíÛÍôáÓðÜÎê×ÉãÐÂåÒÄðÞÐøå×ûéÜ÷äÖðÝÏîÛÍóàÒøæØøåØûèÛúèÚóßÑíÚÌíÙËòÞÐóßÑñÞÐìÙËëØÊíÛÍóàÒðÝÏìÚÌíÚÌðÝÐôáÔõáÔòÞÐïÜÎïÜÎëÙËèÔÆìÙËñÞÐñÞÐë×ÉåÑÃãÏÁðÝÏóàÒòàÒòÞÐòÞÐðÝÏìÙËçÓÅçÔÆïÜÎîÛÍçÓÅïÜÎôàÒôàÒîÜÎíÛÍñÝÏðÝÐôãÕõãÕõâÕøæØùæØùèÚúçÙüèÚýìÞüêÜ÷äÖîÛÊìÚÇê×ÅèÕÃêØÅíÛÈöäÒúêØùé×úèÕýëÙýëØöåÒõäÑõãÑõãÑ÷åÓùæÔüêØûé×ûê×ûé×öäÒðÞËéÖÈëÙËñÞÐñÝÏîÛÍðÝÏõãÕöäÖõáÓñÞÐòßÑöãÔøæÕúèÖüêØûéÖøæÓõãÐüê×úèÕûéÖýìÙýìÙûêØüìÚûé×øæÔöäÒøåÓùçÕôâÐôâÐ÷äÒôâÐôâÐûé×øæØñÞÐñÞÐòßÑîÛÍëÙËóàÒ÷äÖ÷äÖôàÒõâÕùæÙùçÙðÝÏèÕÇê×ÉñÞÐõâÕìÚÌîÛÍìÙËìØÊîÜÎìÙËë×ÉîÛÍíÚÌåÒÄåÒÄèÕÇñßÑõãÕõãÕîÛÍèÔÆåÑÃéÕÇìØÊïÛÍðÝÏñÞÐñÝÏôáÓðÝÏê×ÉäÑÃà̾ÞʼáÍ¿äÑÃèÕÇëÙËìØÊë×ÉæÓÅìÚÌîÛÍéÕÇãÐÂá;ê×É÷äÖùæØòÞÐðÝÏðÝÏ÷ä×õâÔõâÕùæØôâÔíÙËïÜÎõâÔùæÙ÷ä×òßÑíÛÍãÐÂâÏÁèÖÈñÞÐóßÑõáÓóàÒ÷ä×úçÚûéÛúçÚøåØðÝÍñßÎ÷åÒúéÙôáÐçÔÂàÌ»êׯðÝÊóàÏ÷åÔ÷åÓíÚÉçÓÂåÒ¿îÛÊôáÐõãÑïÝÌðÝÌðÝËðÝÌóàÎöãÓúçÙùæØóàÒíÚÌíÚÌïÜÎúçÚýëÝùæÙøåØùæÙôàÒ÷åÕýëÙÿîÜúèÖóáÏðÝËóàÎòÞÍõãÑùçÖõâÑíÚÉçÔÂê×ÅðÝÊöãÓ÷äÓõãÒñÞÍîÜÊïÝÊ÷åÔüëÚýêÚøæØîÛÍòàÓòßÒæÓÅâÏÁéÖÈõâÔùæÙðÜÎíÛÍóàÒóàÒîÛÍîÛÍ÷ä×÷ä×òàÒ÷ä×ûèÚ÷ä×òÞÐíÛÍãÑÃäÑÃíÚÌôáÔðÝÐèÕÇâÏÁãÐÂß̽ß̽çÓÅîÚÌñÞÐéÖÈèÕÇé×ÉìÚÌìÚÌêÖÈëØÊéÕÇæÒÄäÑÃæÒÄèÕÇãÎÀçÔÆê×ÉèÕÇçÔÆéÖÈë×ÉìÙËïÜÎóáÓòßÑîÚÌíÚÌñÞÐìÙËëØÊðÝÏïÜÎðÝÐôàÒõáÓõâÔøåØüêÜúçÙ÷ä×õâÔóàÒïÜÎêÖÈèÕÇðÝÏõâÔôâÔñßÑïÜÎüêÜýëÝøå×òßÒðÝÏê×ÉùæØúèÙùæ×õâÔ÷äÕúçÙôàÒîÛÍôâÓýëÝøæ×óßÐíÙËîÜÍõâÔõâÕîÛÌìÙÊîÛÍëØÊéÖÇìÚÌóßÐøåØýïáüêÝúèÚóàÒóßÒüéÛþíßþëÝýìÞýìÞøåØïÜÎóßÑõâÔôáÓïÜÎíÚËîÛÌçÓÄìÙÊóßÐóáÓïÜÎéÖÇïÜÎîÛÍîÛÌòßÑôáÔ÷äÖõãÕôáÒùæØÿðâþðâùçÚúçÚýêÝúçÚìÙËôâÕøåØõâÔóàÒôáÓùæÙôâÔíÙËöâÕúçÚúçÚôàÒôàÒøåØûèÛùçÚôáÓíÚÌë×ÉëØÊîÜÎóàÓöãÖõâÔôàÒõáÓôàÒïÜÎéÖÈèÔÆìÙËñÞÐïÜÎèÖÈãÑÃãÐÂäÑÃãÐÂâÏÁçÓÅðÝÏöä×õâÔïÜÎòÞÐôáÓôáÓïÜÎíÚÌíÚÌðÝÏñÞÐñÞÐïÜÎóàÒøå×øæÙõãÕóàÒñÞÐðÝÏðÝÏëÙËïÜÎñÞÐòÞÐõâÔúçÙôáÓòÞÐòßÑôâÕõáÔòßÑõâÕ÷äÖ÷åØ÷äÖôáÓòÞÐñßÑôáÓñÞÐïÛÍîÚÌèÔÆìÚÌñÞÐðÝÏèÕÇèÕÇîÛÍûèÛùçÚùæØùçÙöãÖòßÑýìÞúçÚúçÚöãÖòÞÐóßÒûéÜ÷å×óàÒôàÒùæÙýìÞùæÙ÷ä×úèÚýëÝüêÝþíßüêÜúèÚöãÖóßÑñÞÐóàÒñÞÐíÚÌê×Éë×ÉîÛÍðÝÏëØÊõâÔüêÜûéÛøæÙ÷ä×õâÔõáÔñÞÐíÛÍîÛÍñÞÐúçÚþëÞÿíßùèÛ÷äÖöãÕùçÚýëÝûéÛñßÑúèÛþíßùæÙõâÕôáÔùçÚûèÛùæØøåØøæÙ÷äÖôàÒôàÒöâÔóàÓòßÒðÞÐòÞÐõãÕøå×÷ä×õâÕðÝÏîÛÍñÞÐöâÕôáÔïÜÎéÖÈéÖÈíÚÌòßÑîÛÍðÝÐîÜÎèÕÇê×ÉðÝÏìØÊïÛÍòßÒóàÓðÞÐíÚÌñÞÐñÞÐðÝÏîÛÍìÚÌëØÊêÖÈìÙËïÜÎïÜÎíÚÌê×ÉñÝÐóàÓóáÓòÞÐôáÔùæÙñÞÐîÛÍìÙËìÚÌëÙËë×Éê×ÉóàÒöãÕïÝÏïÝÏôáÓúçÚöãÕôàÒôàÒóàÒñÞÐñßÑøæØúçÙúçÙøæØñÞÐíÚÌê×ÉëÙËòßÑôâÔóàÒúèÚýêÝõâÔðÜÎ÷ä×üéÛúèÛöãÕöãÖ÷ä×øå×ýëÝüéÜùæÙöãÖ÷ä×ûèÛþìÞþîàöãÕóàÒûèÛüêÝúèÛþìÞÿîáüëÝóßÑóáÓúèÛøåØôáÔïÜÎìÙËïÜÎóáÔôàÒ÷åØûèÚøåØôáÓòßÑòßÑ÷ãÕ÷äÖòÞÐñÞÑõâÕõâÔúèÛúçÚòßÑóßÑùæØûèÛÿìÞúçÚñÞÐõãÖøæÙðÞÐìÚÌëÙËðÞÐôáÔöâÔõâÔòßÑïÜÎðÝÏòÞÐñÞÐïÜÎñÞÐóàÓöãÖóàÒìÚÌðÝÐóàÒõâÔôáÓòßÑðÝÏëÙËíÛÍðÝÏðÝÏñÞÐñÞÐñÞÐöâÕôàÓëØÊëØÊðÝÏòßÑñÝÏìÙËèÔÆëØÊïÜÎïÜÎîÛÍîÛÍðÝÏðÝÏîÚÌê×ÉéÕÇê×ÉìÚÌêÖÈäÑÃâÏÁæÓÅéÕÇïÜÎóàÒ÷ä×õâÔõãÕóßÑîÛÍêØÊèÖÈãÐÂðÝÏõáÓíÚÌïÜÎùçÙóàÓñÞÐóàÒúçÚþëÝýëÝýíßùæØëÙËåÒÄëØÊìÚÌíÚÌéÕÇëØÊõâÔùæÙøäÖðÝÐúçÙøåØóáÓöãÖ÷ä×òßÒïÝÏðÝÐîÛÍê×ÉìÙË÷ä׸娸åØ÷åØôâÔòßÑòßÑóàÓòßÒñÞÐïÜÎë×ÊöãÖøåØùæÙõãÖðÝÏëØÊóßÑúçÚüéÛñÞÐñÝÏ÷ãÕþìÞùæÙ÷åØûèÛøåØñÞÐñÞÑñÝÐëØÊãÏÁãÐÂèÖÈðÝÐõãÕùæÙùæÙøåØùæÙúèÛþíßøæÙõáÓ÷ãÖùæÙõâÕöä×øæÙûèÛúèÚøåØóàÒðÝÏðÜÎôáÓõâÔôàÒñÝÏôáÓûèÚýîàûéÜöâÕóàÒïÜÎìÙËðÝÏ÷ä×ýêÜþìßúçÙôàÒòÞÐõâÔùæÙøåØõâÕóßÑóàÒóàÓñÞÐæÓÅíÚÌóßÑôàÓõáÓöãÕîÛÍëØÊëØÊòßÑøæØüéÛöãÖíÚÌçÓÅêÖÈëØÊêÖÈóàÒïÜÎðÝÏøåØøåØóßÒîÛÎøæØúçÚñÞÐîÛÍóàÒïÝÏñÞÐðÝÏîÛÍðÝÏôáÔèÖÈëÙËðÝÏóáÓôâÔôâÔðÝÏñÞÐìÙËíÙËñßÑñÞÐõáÓôáÓñÞÐïÜÎòßÒ÷äÖñÞÐíÚÌçÔÆãÑÂçÔÆíÚÌöãÖõâÕùæÙ÷äÖñÞÐòßÑóàÓõâÕ÷ãÖõâÔðÝÏíÚÌîÜÎóàÓïÜÏìØÊóàÓúçÚùæØ÷ãÖøå×øåØðÞÐäÒÄë×ÉöãÕüéÛ÷äÖóàÓôàÒøæÙúèÚýìÞÿðâþîàùçÙèÕÇë×ÉíÚÌñßÑùçÙþïá÷ä×ùæÙúçÚøåØ÷ãÖ÷ãÖþîàÿòåúçÚ÷ä×õâÔõâÔ÷äÖúèÚþëÞüêÜöãÕðÝÏõáÓôàÒõâÔ÷ä×öãÕôàÒñÞÐóàÓöãÕöä×öãÕôáÓóàÒñÞÐòßÑöãÖøæØøå×öãÕõáÔóàÓöãÕúçÙýêÝúçÚóáÓòßÑøåØúçÚ÷åØöäÖõáÔóàÒóàÓõâÔöãÕóàÒõâÔôáÔòßÑðÜÎîÚÌðÝÐê×ÉéÖÈòßÑùçÚûêÜüéÜùæØöä×öãÕñßÑëÙËîÜÎóàÒôáÓïÜÎñßÑøåØýëÞ÷ä×òßÑòÞÐòßÑðÝÏòÞÐöãÖöãÖíÚÌåÑÃá;êÖÈðÝÏóàÒúçÙþìÞýêÜùå×ñÞÐëÙËìÙËîÛÍðÜÎöãÕêÖÈæÒÄæÓÅèÔÆîÛÍíÛÍìÚÌðÝÏïÜÎêÖÈéÕÇæÓÅêÖÈíÚÌðÜÎðÝÏîÛÍðÝÏñÞÐïÜÎôâÕüëÞüëÝúçÚûéÛùæÙòßÑìÚÌéÖÈñÞÐôáÓúçÚýêÝ÷ä×îÛÍèÕÇõãÕþíàüêÜöãÕôáÓôàÒùçÚýïáüêÝòàÒèÖÈïÝÏ÷äÖùæÙòßÑîÛÍïÜÎ÷å×üëÝõâÔöãÖôáÔôâÕûéÛþíßÿïáûéÜòàÒëÙËòßÑóàÒôàÓòßÑîÜÎê×ÉíÚÌôáÓøæÙöä×óßÑñÞÐôáÓöäÖúèÚûéÛõâÔíÚÌéÖÈñßÑúèÚþìßúèÛõâÕøåØóáÓðÝÏñÞÐóàÒóàÓñÞÑîÜÎîÛÍñÞÐóßÑñÞÐîÜÎõãÕøåØóàÒìÙËçÓÅîÛÍîÛÍñÝÏøåØûéÜûèÛõâÕûèÛùçÚñÝÏîÛÍðÝÏúçÙòßÑìÚÌñÞÐ÷ä×úçÚüéÜùæÙ÷ä×÷ä×öãÖóßÑïÝÏíÛÍèÕÇïÜÎóßÑìØÊèÔÆïÜÎðÝÏìÙËñÞÑúêÜùçÙë×ÉçÓÅé×Éé×ÉëØÊèÖÈê×ÉñÞÑùæÙóàÒèÔÆæÓÅëØÊðÝÏôàÒöãÕøåØõâÔíÚÌéÖÈðÝÏõâÕöãÕøæØñßÑñÝÏ÷ä×÷äÖðÜÎîÛÍôàÓøåØ÷å×÷äÖøå×÷åØòßÒíÙËëÙËê×ÉèÔÆðÞÐíÛÍëÙËîÛÍòßÑöãÕýìßþîàÿîàûéÛõâÔñÞÐøå×òÞÐïÜÎñÞÐñÞÐíÛÍõâÔõâÕôáÓõáÓ÷äÖøçÙòßÑïÜÎìÙËîÛÍóàÒ÷ä×ùçÚûèÛüéÛûèÛøåØõâÔøæÙûèÛùçÚóàÒóàÒ÷æØøçÚùæÙõâÔðÝÏòßÑ÷å×øçÚ÷å×ùæÙôáÔðÝÏõâÔðÝÏõâÔøæÙõâÕñÞÐïÜÎïÜÎïÜÎòÞÐñÞÐîÜÎïÜÎ÷ä×õãÕóàÒòàÒòßÑðÝÐõáÔûèÚýëÞúçÙöäÖôáÓùçÙùçÙõãÕöäÖ÷ä×ïÜÎóàÓøåØöäÖ÷åØüêÜøæØûèÛøåØóàÓîÛÍñßÑ÷äÖìÚÌôáÓõâÔñÞÐòßÑñÞÐîÛÎõâÔ÷å×òßÑîÛÍíÛÍõâÔôàÒòßÑé×ÉäÐÂæÒÄëØÊôáÓúçÙöãÕðÝÐìÚÌñÞÐðÝÏðÝÏóßÑôâÔõâÔûéÛùæÙøåØøåØõâÔðÝÏïÝÏìÚÌíÚÌñÝÏëØÊâοåÑÃìÙËóàÓùæØþëÞÿðâöãÖê×ÉäÐÂíÚÌóàÒòàÒüêÜöãÖóàÓöãÖûèÛýëÝóàÒôáÔøå×þíàÿíßüéÜùæÙóàÓðÞÑôáÔöãÖôáÔòàÒïÝÏðÝÏøæØýìÞþîàùçÙîÛÍæÒÄê×ÉõáÓüêÝþíàøåØóàÒõáÓøåØùæÙúçÚüêÝþíßþìÞÿïáÿñãÿîàûéÛøåØúèÚüêÜûéÛûìßúèÚôáÓîÛÍïÝÏóáÓôáÓöãÖõãÕñÞÐïÜÎðÝÏìØÊê×ÉêÖÈðÝÏõâÔóàÒïÜÎôâÔ÷äÖôâÔòàÒóàÓöä×÷ãÖòàÒìÚÌê×ÉéÖÈñÞÐñÞÐïÜÎêØÊëØÊïÜÎôâÔúèÚÿðâÿõçÿïáúçÙöãÕûèÛûèÛôáÓíÚÌéÕÇöäÖüêÜúçÚñÞÐðÝÏóàÒ÷ä×ùæÙûèÛøåØòàÒìÚÌìÚÌóáÓ÷åØðÜÎë×ÉîÚÌôâÔõãÕðÞÐæÓÅçÕÇîÜÎòßÑòßÑïÜÎëÙËïÜÎôáÔòßÑóàÒôáÓôáÓõâÔõâÔñÝÏíÚÌìÙËðÝÏðÝÏîÛÍíÚÌê×ÉçÓÅèÔÆîÛÍôâÔõãÕïÜÎìÙËòßÒöä×õáÓóàÒòßÒõãÖúèÚúèÚöãÕêØÊéÖÈë×ÉïÝÏóàÒõâÔðÝÐóàÒùçÙûéÛõâÕíÙËåÒÄéÖÈïÜÎóàÒòßÑïÝÏòàÒïÜÎðÜÎöäÖûèÚûèÛ÷äÖöä×öãÖ÷äÖ÷åØöãÖîÜÎðÝÏôáÓúçÚûéÜúèÛøæÙõâÔóàÒõâÔõâÔóàÒë×ÉñÞÐðÝÏìÙËéÖÈâοïÜÏñÞÑñÞÐîÛÍïÜÎðÝÏîÛÍîÛÍëØÊëÙËîÜÎíÛÍìÚÌéÖÈäÑÃäÑÃê×ÉòÞÐ÷ãÖóàÒðÝÏïÜÎóàÒ÷å×ûéÜùæØúçÙõâÕõãÕüíßüéÜ÷ä×úéÛþîàüêÝüêÜïÜÎôáÓøæØùæÙ÷ä×õâÕüêÜøåØôáÔôáÓöäÖùæÙðÝÏëÙËëØÊðÝÏòßÒñÞÑíÚÌðÝÏóàÒøåØùæÙ÷ä×õâÕîÛÍéÕÇíÙÌ÷äÖþìßôàÒïÜÎîÛÍóàÒöâÕõãÕõâÔ÷娸åØùæÙúçÙúèÚòßÒñßÑòßÑõâÔøå×úçÚüêÜõãÕîÚÌèÔÆèÔÆçÓÅíÛÍñÞÐòßÑïÜÎòßÒúçÚîÜÎïÜÎðÝÏòßÑñÝÏîÛÍóàÒóàÒíÙËåÒÄê×ÉôáÓøçÙøæÙøä×÷ä×ôâÔòßÑòßÑùæØúçÚïÝÏê×Éê×ÉçÔÆïÝÏøåØûéÛòàÒèÔÆìÚÌ÷ä×ýëÝøåØõâÔ÷ãÕîÛÍíÚÌðÝÏõâÕõâÔñÞÐñÞÐõáÔõáÓñÞÐïÜÏñÞÑóàÒûèÛýëÝýëÝüêÜóàÒáÎÀçÕÇíÚÌñÞÐôáÓ÷ä×ýìßþïáÿîàôàÓíÛÍñÞÐúçÙóàÒñÞÐøæØüêÜûèÚòàÓïÜÎîÛÍòßÒøæØüêÜüíàøåØûèÚýíßüéÛüêÜüëÝòßÒíÚÌíÚÌîÛÍôáÓíÛÍðÝÏôáÓûèÚýëÝýêÜíÙËîÚÌ÷äÖþíßüéÜùæÙôáÔîÛÍëØÊñÞÐõâÔõâÕóàÓóàÓñÞÐôâÔ÷äÖòßÑôáÓòßÑóàÒøåØúçÙøå×÷ãÖñÞÐñÞÐùæÙøå×ðÝÏóàÓóàÒòàÒóàÓòÞÐîÛÍúçÚüêÜþëÝüéÜûèÛüéÛþëÝûèÛ÷åØöãÕôáÓñÞÐóáÓ÷äÖôàÓêØÊëØÊòàÒ÷ä×õáÓðÝÏíÚÌñÞÐöäÖýìÞýêÜ÷ä×óáÓ÷å×ýêÜýïâøçÙñÞÐïÝÏôâÔùçÙùæÙùæÙõâÔïÜÎðÝÏôáÓôáÔúèÚþìÞùæØòßÑîÚÌòÞÐöâÔ÷äÖöä×øå×ûéÛôáÓñÞÐñÞÐòßÑòßÑðÝÏñÞÐ÷å×úçÚùçÚùçÙûéÛñÞÑóàÓõãÕùçÙùçÙ÷äÖðÜÏòßÒóàÒñÞÐïÜÎðÝÏðÜÎóáÓøæØøåØøå×ýêÜ÷äÖ÷ãÖøå×÷å×ïÝÏçÔÆèÕÇéÕÇëØÊòßÑõáÔõâÕòßÑîÛÍìØÊïÜÏðÞÐïÜÎöãÕôáÔðÝÏëØÊê×ÉìÚÌ÷äÖøåØúçÚýëÝüêÜùæÙèÔÆëØÊöãÕûèÛùæÙüéÛöãÖóßÑðÝÏñÞÐðÝÏìØÊòßÑõâÔñÝÏïÜÎðÝÏíÚÌåÒÄé×ÉíÛÍîÜÎìÙËêÖÈíÙË÷ãÕùæØìÚÌçÔÆèÕÇê×ÉãÐÁáÏÀéÕÇðÝÏòßÑøåØùæÙ÷äÖóàÒöãÖûéÛþìßöãÖîÛÎîÛÎñÞÑóßÑöâÔúçÚûéÛ÷å×óàÒñÞÐñÞÐôáÓôàÒòßÑøå×þðâýëÝùå×øå×ýëÝýëÞøä×îÚÌñÞÐóáÓòßÒïÜÎìÙËóàÒîÜÎðÝÏúéÛýîàýëÞöãÖüéÜüéÜöãÖõâÔøæØøäÖñÝÏñÝÏùæÙýëÝûèÛüéÜúçÙ÷ä×õãÕõãÕõâÕêÖÈíÚÌóàÒüêÜþìÞûèÛñÞÐìÙËðÝÏõáÓôàÒöãÖúèÚúçÚöâÕñÞÐñÞÐóàÓòßÑïÜÎïÜÎøæØýëÝùçÚñÞÐòßÑîÛÍçÓÅéÖÈðÝÐóàÒôáÔöãÖöãÕðÝÏéÖÈðÝÏòÞÐêØÊæÓÅíÛÍñÞÐôáÓûéÛõâÕíÚÌïÜÎðÝÏïÜÏìÙËìØÊñÞÐôáÓôàÓôáÓïÜÎìÙËíÚÌíÚÌëØÊèÕÇëØÊîÛÍéÕÇæÒÄíÚÌíÚÌëØÊîÛÍôáÓòàÒìÚÌïÜÎíÚÌðÜÎõâÕòàÓëØÊìÚÌîÛÍíÚÌéÖÈêÖÈìØÊêÖÈíÚÌöãÖïÜÏê×É÷å×öâÔ÷ãÕöâÕôàÓòßÑðÝÏ÷ä×ùæÙøåØòàÒòßÒôáÔñÝÏôáÓøæØüéÛüêÜûéÛøåØóàÒóàÒûèÛþëÝûéÛëÙËéÖÈëØÊóàÒóàÒîÚÌéÖÈðÝÐùæÙþíßúèÚóàÒíÚÌðÝÏöãÖûéÛüêÜûèÛöãÕôáÓöä×úèÚúçÚúçÚÿïáûéÛöãÕõâÔùçÚýêÜûèÚùæÙöãÖ÷ä×úçÚüêÜ÷ä×ûéÛûèÚòßÑñÞÐôâÔôàÒñÞÐïÜÎíÚÌïÜÎñÞÐõâÕôâÔòßÑñÞÐòßÑóàÒòßÑñÞÑóßÑôáÔðÜÏé×ÉïÛÍðÜÎîÜÎðÝÏôáÓùæÙöãÖûèÚ÷äÖðÜÎðÜÎìÙËìÙËôáÔúçÚ÷ä×ñÞÑíÚÌðÝÏöãÖóàÒðÝÏøå×ûëÝúìÞïÜÎåÒÄáÎÀäÐÂïÛÍõãÖñÝÏìÙËêØÊé×ÉèÕÇóáÓøå×ôàÓîÛÍîÛÍê×ÉæÓÅìÚÌíÚÌæÒÄéÕÇñÞÑìÚÌçÔÆäÑÃéÖÈïÜÎóàÓðÝÏòÞÐôáÓúçÙûèÛúçÚóßÑòßÑõáÔõãÖôáÔ÷ä×ûèÛùæØõâÕñÞÑîÛÍìØÊñÞÐõáÔùçÙùçÙòßÑê×ÉðÝÏðÝÏñÞÐõáÔùçÚýëÝþíßþïáÿîàþìßøå×ðÝÏëÙËê×ÉëØÊòÞÑ÷å×úçÚõâÕøå×ûêÜþðâÿïáýëÞíÛÍîÛÍñÞÐøæÙüêÜýëÝÿíßýëÝøæÙùæØùçÚöãÕõãÕûêÜýìÞøå×óàÓóàÓóßÑòßÑòßÑóàÒõâÔõâÕóßÑîÛÍìØÊíÚÌíÚÌê×ÉðÝÏñÞÐïÜÎîÛÍñÞÐôáÓòßÒðÝÏïÜÎòßÑòßÑïÜÎøå×ùæÙõáÓèÔÆãÏÀãÐÂáÍ¿ê×ÉõãÕüéÜûéÛøæØêÖÈìØÊëØÊæÓÅäÑÃäÐÂéÖÈñÝÏ÷ä×ûèÛüêÜüëÝñÞÐóàÒóàÒñÝÏñÞÐóàÒõâÔôáÓòßÑïÝÐïÜÎîÛÍ÷ä×õâÕóàÒòÞÐñÝÏïÜÎùæÙõâÕë×ÉêÖÈïÜÎìØÊõâÔóáÓðÝÏìÙËíÚÌïÜÏîÛÍìÙËèÔÆáÎÀß̽à̾áÍ¿á;æÒÃðÞÐñÞÐëÙËíÛÍïÜÎîÛÍñÞÐ÷äÖöãÕ÷ä×öãÕôàÒñÞÐîÚÌê×ÉðÝÏôáÔùçÙüêÜúèÚ÷ä×÷ä×õãÖôâÔôàÒôáÓôâÔþìÞþíßûéÜôáÓïÜÏíÚÌ÷å×÷ä×õâÕôâÔøæØýêÜûéÛóáÔïÜÏõãÕýêÝÿñäüêÜøæØõâÕöä×øæØøæØÿîàüêÜöä×÷ä×ùæÙ÷äÖíÚÌòßÑóàÒîÛÍíÚÌðÝÏúçÙöâÕðÝÏîÛÍñÞÐôàÒôàÒìÚÌëÙËóàÒ÷äÖôáÔ÷ä×÷ä×õáÓðÝÏðÝÏôáÓùçÙöãÖôáÓòßÑðÝÏîÛÍìØËðÝÐìÙËáÎÀáÍ¿æÓÅæÔÆíÚÌõãÖúçÚõâÕïÜÎìÙËëØÊïÜÎîÛÍê×ÉíÚÌñÞÐòßÑóàÒôáÓ÷ãÖøæÙðÝÏíÚÌòßÑ÷å×öãÖøåØûéÜþìßúèÛøæÙùçÙôáÓñÞÐõâÕúçÚüéÜúçÚùæÙïÜÎçÔÆèÔÆîÜÎïÜÎôáÔòàÓîÛÍíÚÌñÞÐíÛÍæÓÅïÝÏ÷å×üéÜøå×óßÑðÜÏñÞÑîÜÎîÛÍïÛÍêÖÈãÏÁèÔÆïÜÎèÔÆáÎÀæÒÄæÒÄçÔÆéÖÈîÚÌóáÔñÞÐìØÊìÙËóßÑôáÔðÝÏòßÑ÷ãÖÿîàÿìßüéÛøåØõáÔóßÒîÚÌðÝÏðÝÏïÜÎóßÑøåØûèÛþìÞþëÝûèÛúèÚýëÝüéÛõâÔïÜÎïÜÎòßÑóàÓúçÙùæÙõãÖóàÒõâÕùæÙïÜÎëÙËìÚÌóßÑõâÕùæÙÿñäûèÛ÷ä×ûèÛüêÜûéÛùæÙúçÚúèÛüêÜþëÝÿíßõâÔõáÔôàÒõáÓøå×ûéÛõâÕôâÔñßÑïÜÎðÝÏóßÑôàÒõãÖòßÒê×Éê×ÉñÞÐé×ÉäÑÃáÎÀçÕÇòßÑøåØ÷ä×ñßÑëØÊê×ÉïÛÍõáÔóáÔòßÑ÷äÖùæÙöä×øåØ÷åØóàÓíÚÌéÖÈçÓÅæÒÄðÝÏïÜÏõãÖ÷å×íÛÍçÓÅìØÊñÝÏðÝÏòßÒöäÖôáÔîÜÎóàÓ÷ä×øä×÷äÖøåØ÷äÖôâÔøå×öãÖîÛÍê×ÉêØÊïÜÎóàÒóàÒñÞÐïÜÎîÜÎóßÑõâÔõâÔóáÓóáÓùçÙùæÙõáÔìÙËçÓÅäÒÄåÒÄëØÊêÖÈèÕÇëØÊìÙËß˽à̽äÑÂíÚÌíÛÍéÖÈâÏÁèÔÆíÚÌòßÑôáÔöâÕùçÙüêÜÿìÞýêÜøæÙôàÓèÔÆíÛÍòßÑõâÕöäÖøå×õâÔøå×øå×óáÓðÞÐîÛÎòàÒòßÑòßÑïÜÎêÖÈâÏÁëØÊòßÑôàÓðÝÏòßÑùæÙòßÒðÜÏòßÒøå×úçÙüêÜùéÛ÷äÖ÷ãÖúçÚ÷å×ñÞÐúçÚþëÝÿïáÿðãþìÞüéÛúèÚûéÛøå×òßÑñÞÐóàÒîÜÎìÙËëÙËïÜÎòßÑòßÑñÞÐôáÓõâÔóàÓõâÔøåØíÛÍêØÊìØÊõâÕùæØöãÕîÜÎê×ÉâÏÁÞʼæÓÅóàÒðÝÏñÞÐóàÒ÷ä×øåØöãÕôàÓðÝÏíÛÍîÛÍîÚÌìØÊôáÔöäÖúçÚúèÚõâÕîÛÎçÔÆê×ÉíÛÍïÜÎìÙËéÕÇöãÖ÷ä×öãÕòßÑóàÒõâÕùçÙþëÝúçÚöâÕôàÒìÙËîÛÍòÞÐõáÓõáÓóàÒòßÑôàÒõáÓôàÒñÞÐïÜÎìÚÌëØÊñÞÑðÝÏèÔÆèÕÇïÜÎðÜÎïÜÎòÞÐøå×øå×õáÓóàÓïÛÍïÜÎ÷ä×úèÚùçÙóàÒíÚÌïÜÎüëÝþðâýëÝöãÖøåØùæÙøåØõâÔòßÑíÚÌïÜÎðÝÏñÞÐñÞÐðÝÏìÙËïÜÎòßÑóàÓóáÔòàÓðÝÏòßÑôáÔ÷ä×õâÔñÝÏïÜÏúçÚûéÛîÚÌê×ÉïÜÏóàÒóàÓñßÑóàÒóàÒïÝÏòßÑöâÕùçÙüéÜûéÛúçÙöä×÷ãÕöãÕùçÚýëÞþîáÿòäÿïáþíßûèÚøæØõãÖõâÕîÜÎíÚÌôàÒöãÖôàÒñÞÐðÝÏõáÓûéÛøå×ðÝÏìÙËïÜÎôáÔöãÖòßÑëØÊðÞÐôáÔñÝÏåÒÄäÐÂëØÊòßÑôâÕóàÒøæØüêÜ÷ãÕñÞÐðÝÏôáÔúçÙüèÚúçÙúèÚöãÖíÚÌïÜÎúçÙýìÞòàÓñÞÐöãÕøå×õâÕøå×ÿïáúçÚòßÑðÝÏôáÓùçÙïÜÎöãÕüéÜòàÒê×ÉîÛÍèÕÇíÚÌñÞÐîÛÍíÚÌîÛÍðÝÏñÞÐðÝÏñÞÐõâÕõâÔîÜÎòÞÐõâÕøåØùæÙøæÙöãÕýêÜýëÝôàÓòßÒ÷åØûéÜûéÛúçÙöãÖóàÒñÞÐðÝÏôáÓóàÒ÷ãÕýëÞýëÝðÝÏñÞÐóàÒõâÕ÷ä×øåØù娸å×ùæÙýêÜþëÝýëÝþìßûèÛøå×ùæØýëÝþîáþìßúèÛýìÞÿòäÿîàüéÜöãÕýìÞþìÞôàÒðÝÏóáÓíÚÌíÛÍõãÕ÷å×óßÒôáÔøåØ÷ä×ùæÙþìÞÿîàÿíàýîàýëÞüéÛöä×ôáÔóßÑôâÔ÷ä×ûéÛþîáýìÞùçÚøæÙýìÞüëÞöâÔ÷ãÕûìßõáÓõâÔõáÓõáÓòßÑïÜÎöãÖüéÜùçÙîÛÍîÛÍöãÖùçÙ÷ä×ôáÔóàÒôáÓöãÕöãÖøå×óàÒñÞÐóßÑðÝÏðÝÏóàÓ÷ä×÷ä×ôáÓðÝÏòÞÐìÚÌèÔÆéÕÇêØÊêØÊùçÚýëÞþîáþíàþíàÿíàöãÕõâÔóßÑñÝÏîÛÍìÙËìÙËê×ÉíÛÍñÞÐñÝÏóàÒøå×óàÒðÝÏóàÒõáÓóàÒòßÑïÜÎðÝÏðÝÏñÞÐôáÓüêÝöãÕîÜÎîÜÎöãÕüêÜüêÜüéÛùæØöãÖøæÙüéÜüêÝüêÝúèÚóáÓñÞÐñÞÐöäÖùëÝùéÛ÷äÖ÷äÖôâÔ÷ä×óàÓïÜÎíÚÌòßÑùçÙùæØ÷ãÖöãÕ÷äÖöäÖôâÔ÷äÖóàÓðÝÐôàÓ÷åØùæÙýìÞÿòäþïáùçÙùçÚüêÝþëÞûèÛùçÚûèÚ÷äÖñÞÐñÞÐöâÕúçÚûèÛ÷ä×ôàÒ÷ä×öä×÷ä×ùæÙûéÛýêÜ÷ä×÷åØõáÓðÝÏðÝÏñÞÐïÜÏöäÖûéÛûèÛüêÜþíßþëÝÿðãÿñäúèÚðÝÏê×ÉõâÔøæØøæØöä×öä×ùçÚþðâüêÝ÷äÖõáÓôàÒóáÓîÛÍïÜÎõâÕüéÜøå×îÜÎîÛÍðÝÏïÜÎîÛÍðÝÏóàÒóàÒöâÕùçÙûèÛøæØöãÕðÝÏñÞÐñßÑñßÑðÝÏîÜÎôâÔôáÔõãÕ÷å×ùæÙøå×ê×ÉòßÒùçÙøå×ðÝÏèÔÆæÒÄæÒÄíÚÌ÷ä×ùæÙ÷ä×úçÚôáÓïÜÎðÝÏñÞÐïÜÎîÛÍê×Éê×ÉêØÊíÚÌñÞÐùæÙôáÓíÛÍíÚÌòßÑöä×ùæÙôáÓòßÑôáÓõâÕòßÑôàÒöãÕõâÔñÞÐóßÑöãÕÿïâÿôçþïáóàÒîÜÎîÛÍóàÒôáÔóàÒðÝÏòßÑ÷ä×þìßùçÙóàÒïÜÎíÚÌêØÊðÝÏíÚÌíÚÌóàÒöãÖöâÕöãÕöäÖòàÒíÚÌïÜÎðÝÏóáÓìÙËíÚÌúçÙüêÜöâÔûèÚüéÜ÷ãÕõâÕúçÚøå×÷ä×øåØöä×óàÒõâÕùæÙùçÙúçÚ÷ä×ñÞÐñÞÐôáÔüêÝûèÛúçÚüêÜüéÛùæØ÷ä×òàÓðÞÑñßÑîÛÍéÖÈïÜÎôáÔúèÚüéÛüêÜüêÜûëÞõâÕðÝÏòßÑòßÑîÛÍíÚÌìÚÌïÜÏöãÕöãÕðÞÐðÝÏóàÒùçÙõâÔðÝÏôàÒýêÜþëÝýëÝûéÛøå×õâÔõáÔûéÜýîàüëÞøåØõãÕöãÖñÞÐðÝÏöãÖøåØöãÖùæÙûèÛüêÜøåØòßÑìÚÌíÚÌñÞÑñÞÑîÛÍðÝÏóßÑòßÑ÷å×øåØòÞÐîÛÍîÛÍíÚÌîÛÍìÙËíÛÍòßÒóàÒðÝÏóßÒöãÖøæØ÷åØöãÖõáÔóßÑôâÕùæÙôàÓéÕÇíÚÌîÛÍðÜÎóßÑ÷äÖûéÛûèÛôàÓðÝÏõâÔ÷å×úçÚñÞÐöâÕøä×÷ä×öãÕöâÔöâÔñÞÐîÛÍñÞÐöãÕ÷ä×ôàÒôàÓöâÕ÷åØ÷ä×õâÔðÝÏéÖÈëÙËóàÓöãÕ÷å×òàÒíÙÌëØÊòßÑ÷äÖöä×üêÜûèÛôáÔñßÑ÷äÖöäÖ÷ä×÷äÖòßÑìÙËêØÊëÙËïÜÎðÝÏïÜÎíÚÌïÜÎñÞÐõãÕñÞÐîÛÍëØÊéÕÇæÒÄèÕÇâÏÀáÎÀîÜÏøæÙüêÜöãÕïÜÎëØÊîÛÍìÙËæÒÄãÐÂê×ÉòÞÐôáÔñÞÐîÛÍòßÒóàÓïÜÎé×ÉíÛÍõâÕðÝÏðÝÏ÷äÖøåØöãÖûèÛöãÖõâÕòßÑîÛÍëÙËêØÊöäÖüëÝþïâýëÞùæØöâÕóàÒóàÒðÝÏìÙËîÛÍóßÑðÝÐòßÒõâÕöãÖöãÖõâÕõáÔ÷ä×îÛÎæÒÄêÖÈîÛÍìÚÌñÞÑóàÓïÜÎíÚÌíÚÌñÞÐóàÒòßÑóàÒõâÔôáÓóßÑöãÕúçÚüêÜúçÚ÷äÖîÛÍîÛÍðÜÎñÞÐîÛÍêÖÈãÐÂâÏÁåÑÃíÚÌôàÓ÷äÖôáÓê×ÉìÙËöãÕ÷å×öãÕîÛÍîÜÎðÝÏ÷äÖüéÜýëÝûéÛøå×õâÔóßÑðÝÏìØÊïÜÎõâÕúçÚûèÛúèÚùæÙüéÛøæØùæØúçÚûèÛýëÝýíßùæØòßÑòßÑõâÕùæØùæÙùæÙ÷ä×õâÔôàÒòßÑîÜÎðÝÏñÞÐñßÑñßÑðÞÐðÝÏðÝÏòßÑ÷äÖ÷äÖõâÔìÚÌðÝÏðÝÏëØÊëØÊïÝÏöãÕóàÓòßÒôáÔõâÕõâÔôàÒìÙËæÓÅçÔÆéÖÈê×ÉíÚÌïÜÎïÜÎîÛÍîÛÍîÛÍõâÕøåØôáÔíÚÌìÙËðÝÏõãÕòßÑðÝÏñÞÐòßÑñÞÑðÝÏïÜÎïÜÎðÜÎòßÑôáÓôáÓöãÕ÷ãÖ÷åØ÷ä×öãÕùçÚûéÜøåØðÝÏðÝÏöãÕçÓÅçÓÅèÔÆíÚÌñßÑõãÖòÞÐôáÓðÝÏîÛÍóàÒóàÒöãÕñÞÐðÝÏôáÓöãÖöãÖòßÑòßÑóßÑñÝÏíÚÌìÚÌñÞÐõâÕùæÙøåØñßÑê×ÉðÝÏïÜÎíÚÌìÚÌñÞÑøæØ÷åØðÝÐìÙËîÛÍïÜÎë×ÉâÏÁæÔÆñßÑôâÔòßÑöãÕõâÕòÞÐðÝÏôàÒóàÒíÚÌïÜÎòßÑöãÖùåØôáÓíÙËöãÕüêÜþëÞõâÕïÜÎîÜÎóàÒøå×øåØùæÙýìÞÿðâüêÝõâÕñÞÐöãÕüëÝþðâýêÝ÷ãÖöãÖôàÒóßÑ÷äÖúçÙúçÙûèÚýêÜùæÙóáÓüéÛùçÙúèÚþëÝúèÛóàÒðÝÏðÝÏóßÑøåØùçÙ÷ä×ùæÙûéÛûèÛ÷ä×õãÕõâÕóàÓùæØùçÙòÞÐðÝÏôáÔïÛÍèÕÇäÑÃê×ÉðÝÏôáÓúèÚøåØõáÓòßÑïÜÎíÚÌñÞÐóßÒóßÑ÷ä×ôáÔèÔÆìÚÌìÚÌíÚÌðÝÏõáÔøåØöâÕóßÑòÞÐøåØýëÞþíßþíàøåØôáÓôàÓñßÑíÙË÷åØöâÕðÝÏôáÓüêÝüêÜóáÓîÜÎîÜÎóàÒöâÔôáÓôáÔòàÒðÝÏñÞÐôáÓöãÖõâÔûéÛüéÜ÷äÖõâÔòßÑöâÕôáÓòßÑòßÑóàÓõâÔóáÔõáÔöâÔíÚÌèÔÆíÚÌöä×÷åØúçÚúçÙóàÒêÖÈ÷ä×ôáÓðÝÏïÜÎòßÑõâÔúçÚöãÖóàÒôáÓõâÔôáÓöäÖúæÙþíàÿ÷éÿ÷êÿñäÿñãþìÞûèÚôáÔëØÊãÏÁìÚÌíÚÍíÚÍðÝÐôâÕóàÒõâÔ÷ä×úçÙòßÒîÜÎ÷ä×üëÞøå×ôâÔøæÙýëÞýíßúçÚûèÛûêÜüìÞüëÝüêÜöãÖ÷åØ÷å×÷åØûéÛÿíàûéÜûèÛúèÚüéÜûèÛùæÙöãÖõâÕ÷ä×ûéÛüéÜúçÚùæØóàÒóßÑðÝÏíÚÌðÝÏôáÓøå×ùçÚöâÕóàÓóàÒóàÒøæØûéÜ÷ãÖñÞÐîÛÍéÕÇñÞÐôáÔöãÖõãÕïÜÎóàÒïÝÏñßÑøåØøåØòàÓñÝÏñßÑ÷å×ýìÞýìÞûéÛôáÓëØÊéÕÇòßÑõâÔòßÑøå×ñÞÐëØÊìÚÌñÞÐóáÓôáÔõâÔõâÕôáÔñßÑïÝÏîÛÍðÝÏïÜÎïÜÎòßÑõâÔýíßúèÚûèÚþìÞüéÜúçÚõâÔôáÓòßÑóàÓõâÕ÷äÖíÚÌïÜÎöãÕöâÕïÜÎíÚÌôâÔøå×ûèÛýëÝûèÛùæØïÜÎñÞÐñÞÐòßÑóàÒóàÒúèÚùæÙ÷åØúçÚüêÜþíßÿòäÿïáýëÞúíßüðãÿóæÿóåþìÞøå×òßÒñÞÑòÞÐöäÖúèÚûëÝôàÓìÙËíÛÍûéÜýìÞÿíßüêÜøå×õâÔ÷ãÖúçÚýëÝüêÜöäÖòÞÐýêÜÿíßÿðâÿðãýìßûéÛðÜÎ÷ãÖúèÚøæÙúæÙýìÞÿîàýëÝ÷ä×óàÓ÷ä×üéÛôàÒôàÒôàÒôáÔõâÕõâÕòßÑîÛÍðÝÏôàÒòÞÐòßÑöäÖøæØúèÚûèÚùæÙ÷ä×óàÒóàÓñßÑîÛÍïÜÎòßÑõâÔôàÓîÚÌîÜÎõâÕ÷娸åØúçÚ÷åØðÝÏíÚÌíÙËîÚÌõâÔúèÚøæÙóàÓðÝÏðÝÏ÷äÖüêÝýìÞýëÝýìÞøå×òßÑóàÒôáÔòßÑöãÖùçÙóßÑëØÊæÓÅãÐÂà̽çÓÅíÚÌñÞÐôàÒøåØüêÜ÷åØïÝÏìÙËîÜÎîÜÎïÜÏòßÑôàÒõâÔõãÖôáÔóßÑìÚÌêØÊîÛÎ÷ãÕ÷ä×óàÒïÜÎòßÑóàÒñßÑñÞÑôáÓòÞÐôàÒôâÔõáÓòßÑðÝÏôáÓöäÖ÷ä×÷åØúçÙýìÞþíßýìÞ÷ãÕëÙËçÔÆèÕÇöå×ùçÚúçÚüéÛþîàÿõçþîàýëÝüëÝùçÙôáÔóáÓøå×þìÞüéÜùæÙöãÕîÜÎöãÖûéÛýëÝøåØóßÒðÝÏùæÙûèÛûéÜúçÚöãÖóàÒñÝÏòßÑñÞÐòßÑõâÕúçÚöãÕ÷åØôáÓìÚÌîÜÎöâÔúçÙüèÚùæÙóßÑïÜÎîÛÍæÓÅæÓÅìÙË÷ä×ùæØøå×òÞÐíÙËêÖÈíÙËïÜÎïÜÎôâÕôáÓòÞÐñÝÏõáÓúçÙöãÖöãÖóßÑðÞÐðÝÏîÜÎõáÔùæÙ÷åØòßÑ÷äÖüíßûéÜ÷äÖïÜÎéÖÈìÙËïÜÎíÚÌðÝÏóàÒøå×úçÚúçÚôáÔõâÕûèÚ÷äÖíÚÌë×ÉìÙËê×ÉéÖÈë×ÉîÛÎðÝÏæÓÅê×ÉíÛÍðÝÏóàÒöâÕóàÒóàÒíÙËäÑÃæÓÅèÔÆîÛÍìØÊéÖÈèÖÈê×ÉìÙËïÜÎìÚÌíÚÌõáÓùæÙõãÖðÜÎñÞÐðÝÏìÚÌîÛÍñÞÐùæÙøåØöä×õãÖ÷ãÕ÷äÖñÞÐöãÖùæÙöãÖóßÑòÞÐêØÊðÝÏñÝÏèÖÈçÔÆêÖÈà̽äÑÃèÖÈíÚÌôáÔûéÛÿóåøå×ïÜÎ÷å×ÿîáÿíßôáÓüêÜúçÚöâÔøåØùæÙõãÕøåØùæÙøåØ÷åØùæÙôáÓóßÑòÞÐôáÓøåØûèÛ÷åØðÞÐïÝÏøæØüêÜ÷å×öãÕüìÞþñäûéÜôâÔñÞÐúèÚüìÞýìÞøå×óßÑðÝÏïÝÏðÝÏñÞÐóàÒôáÓñÝÏóàÒðÝÏíÚÌíÚÌìÙËéÕÇé×ÉîÛÍòÞÐòÞÐñÝÏòÞÐîÛÍíÛÍïÝÏñÞÐóßÑõâÔúçÚù娸ä×øåØ÷ä×õâÕûèÚôáÔìØÊæÒÄê×ÉïÜÎíÚÌíÛÍíÚÍìÚÌîÛÍðÝÏèÕÇîÛÍòßÑðÝÏîÚÌìØÊïÛÎõâÕùçÙ÷ãÖøåØûéÛöäÖóáÓñÞÐòÞÐòÞÐðÝÏóßÒùæÙùæØõãÕôáÔóáÓêÖÈèÕÇæÓÅçÔÆéÖÈìØÊñÞÐôáÓòßÑñÞÐôáÓòßÑ÷ãÖöãÕöâÕ÷äÖùæÙûèÛùæÙ÷åØõãÖ÷åØúçÚýêÝøä×ùæÙùæÙöãÖòßÑïÜÎéÕÇìÙËìÚÌêØÊíÚÌòàÒóàÒóàÒòàÒôâÔ÷äÖùæÙøèÚöãÕñÝÏôàÒûéÜÿìÞþìßûéÛøå×öä×öâÕôáÔñÝÏôàÒ÷ä×úçÚúçÚùæÙñÞÐîÛÍëÙËðÜÎ÷äÖýìÞÿñäüëÝûéÛüéÜ÷å×ðÝÏëØÊîÜÎõâÔùçÚ÷ä×òÞÐê×ÉíÚÌðÝÏòÞÐñÞÐïÜÎûèÛýêÜ÷ä×ðÝÏîÜÎìØÊóàÒöâÕøä×õâÔïÜÎê×ÉæÓÅìÙËñÞÐñÝÏïÛÍïÛÍ÷ãÕðÝÏîÜÎïÜÎñÞÐøåØöãÖóàÒñÞÐôàÒôáÓòÞÐõáÓøå×ùçÙøå×öãÕöãÖòßÑúæÙûèÛóàÒïÜÎðÝÏñÞÐõâÕðÝÏîÛÍõâո娸ä×øä×öâÔóàÒõâÕøæÙüéÜôáÓïÜÎñÞÐðÝÏìÚÌåÒÄê×ÉõãÕþëÝùçÚôáÔñÞÐîÛÍëØÊîÛÍõâÔûèÚùæÙûèÛñÞÐèÕÇîÜÎóàÒøåØöâÕõáÓøåØùæÙ÷äÖùæÙøåØöä×õãÖöãÖ÷åØûèÛöãÖóàÒòßÒñÝÏîÛÍìÙËðÝÏôáÓóáÔôâÔöãÖûéÛýëÝþíßþîàùæØñÝÐéÖÈñÞÐùæØ÷ãÖõâÔøåØñÞÑäÑÂçÓÅóàÒñÞÐëÙËñÞÐïÜÎðÝÏöâÕúçÚúçÚüìÞùæØóáÔóàÒøåØüêÜùèÛúèÚøå×óàÓôâÔøæØøçÚîÜÏëØÊñÞÑôáÓðÜÎñÞÑðÜÎñÞÐöãÖúèÚûèÚõâÔûèÛ÷äÖòßÑöäÖùçÙüéÛþëÝýêÜùæÙøåØúçÙõâÕøå׸娸åØúçÙýêÝðÝÐòßÒúèÛûéÛõâÔóàÓîÜÎòÞÐõáÔ÷äÖ÷ãÖ÷ä×ðÝÏìÙËìØËôáÔúçÚüéÜúçÙùæÙøæÙ÷å×óáÓîÛÍùçÚöãÖóàÒóàÒôàÓóßÑðÝÏóàÒøåØûéÛöãÕïÜÎïÜÎìÙËê×ÉãÏÁà̾çÕÇæÓÅéÕÇìÙÌòÞÐõáÔøä×ñÞÐîÚÌóàÒùæØöãÖõâÕòàÒñÞÐòßÑôáÓóßÒðÝÏîÛÍñÞÐöãÖùçÙùæÙ÷äÖøåØõâÔöãÕ÷ä×÷åØúèÚ÷ä×ôáÓõáÓúçÚýêÝüêÜþíß÷å×öäÖþîàÿòäþìÞüêÝýìßýîàýñäýîàòßÑêØÊäÑÃëØÊòàÓë×ÉâÎÀãÐÂèÕÇìÚÌõãÕùçÚõãÕñÞÐóàÒóáÓóáÓóàÒñÞÐöãÖ÷ä×÷åØ÷åØ÷ä×öãÖôáÓøä×ùæÙøæÙùçÚüéÜýëÝôâÔîÛÍñßÑøæÙýëÝüêÜúçÚøåØùåØ÷äÖôàÒôáÔúçÙúçÙóßÑóßÑ÷ä×ñÞÐîÛÍïÜÎøåØüéÛúèÚóßÑðÝÏôàÓõâÕôáÔøæØüêÝöãÖöä×öâÔòßÑóàÒóßÑöâÕúèÚýìÞûèÚõâÔíÚÌìÙËðÝÏ÷ä×øæØöãÕúçÚòàÒòßÑóàÓðÝÏñÞÐýêÝúçÚúçÚúçÚõâÕïÜÎøæÙûéÛýëÝùæÙñÞÐéÖÈäÑÃâÏÁãÐÂâÎÀâÎÀèÕÇóàÓôáÓóáÓóàÒóàÒóßÑýëÝûèÚ÷å×ïÜÎéÖÈíÚÌ÷ä×ùæÙúçÚøæÙõâÔòßÑìÚÌñÞÐñÞÐîÚÍñÞÑøæØûéÛúçÚ÷ãÖøæÙûèÛøåØôáÔóàÒòÞÐôáÔøå×úèÚþíßþíßþïáÿïáýìÞùçÚòßÒóàÓñÞÑõâÕøæÙôáÔôáÓóàÒòßÑòßÒòßÒòßÑôáÓùçÙùçÙüêÜÿîàþìÞýêÝÿïâÿóåÿïáúèÚóàÓõãÕùæÙýêÝüêÝøåØóàÒ÷åØûéÛþëÝþëÝþëÝÿíàúèÚõáÔðÝÏòßÒ÷åØúéÜùæÙôâÔñÞÑòÞÐóßÑòßÑùæÙôàÒðÜÎñÞÐòßÑðÝÏíÚÌîÛÍðÝÏóàÒòßÑîÛÍôàÒòßÑôáÓóàÒïÜÎïÜÎ÷ä×óáÓøåØûéÛ÷ä×óàÒîÛÍðÝÏðÞÑòßÒôáÔöãÕðÝÏùçÚûêÜðÝÏîÚÌôáÓïÜÎðÝÏðÝÏìÚÌíÛÍöãÖõáÓ÷äÖ÷åØ÷ãÕöãÖöãÕõáÓõáÓòßÑìÚÍíÛÍðÝÏíÚÌîÛÍðÜÎíÚÌæÓÅãÐÂãÐÂçÓÅîÚÌôáÓ÷ä×øåØòßÑïÜÎëÙËçÔÆìÙËõâÔôàÒöãÕ÷å×õáÓôàÒôâÔõâÕõãÖñÞÑêØÊìÙËòßÑøå×õâÔñÞÐ÷ãÕüêÜúçÚîÛÍðÝÏðÝÏðÝÏñÞÐõáÓøæÙþíàÿïâúçÙôáÓòßÒïÜÎðÝÏîÛÍðÜÏ÷ä×üéÜýëÝþðâýìÞýìÞþòåÿóåýëÝþìßøæÙôáÓ÷ãÕ÷ãÕûèÚûéÜûêÜüëÝýëÞüêÝúèÚûèÛûèÛøæÙõáÓòßÑõáÔ÷ãÕ÷äÖ÷äÖøåØùçÚûéÛûéÛúçÙ÷äÖôáÓðÝÐðÝÏíÚÌëÙËïÜÎòßÑóßÑïÜÏîÛÍòÞÐùçÙõâÔìÚÌìÚÌòÞÐöâÕöãÕôáÓóßÑïÜÎëØÊèÕÇéÖÈìÚÌñÝÏúèÚ÷ä×ôáÔóàÒôáÓ÷ä×ôâÔöäÖöäÖñÝÏîÛÍíÛÍøåØúçÚøå×ïÜÎëØÊë×ÉèÕÇóàÒùçÙôáÔïÜÎñÞÑäÑÃðÝÏõãÕïÜÎîÜÎôáÔòßÑñÝÏìÚÌèÔÆëØÊïÜÎùçÙùçÙôâÕîÜÎéÖÈäÑÃçÓÅê×ÉíÚÌíÚÌê×ÉçÔÆèÔÆìÚÌóàÒúçÙùæØñÝÏìÙËïÜÎñÞÐóàÒøä×ýëÝþëÝøæØ÷ä×üêÜýëÝúèÚïÜÎïÜÎôáÓöä×óàÒðÜÎõáÔúèÚþëÝýêÝúçÚúçÚïÛÍõáÔõâÕíÚÌìÙËïÜÎøåØ÷äÖòßÑêØÊçÔÆê×ÉöâÕùçÚùæÙùæÙøæØïÜÎøåØýëÞýëÝùæÙùæÙõâÕèÔÆèÔÆêÖÈðÝÏøå×ýíßýëÝöãÕìÚÌéÕÇíÚÌñÞÑôáÓðÝÏíÚÌìÙËîÛÍïÜÎûèÛüêÜüêÜøæÙõâÕóàÒôáÓñÞÐïÜÎïÜÎíÚÌêÖÈåÑÃíÙËòàÓòßÒíÚÌéÖÈðÝÏóàÒòÞÐíÚÌíÚÌðÝÏïÜÎðÝÏîÛÎîÜÎñÞÑóßÑíÙËëØÊåÒÄäÑÃé×ÉîÜÎòÞÐöãÕ÷äÖôàÓòßÑóàÒøæØòßÒîÛÍïÜÎîÜÎìØÊñÞÐöâÕúçÙúèÚóàÒèÔÆçÔÆîÛÍóàÒðÝÏíÚÌìÚÌòÞÐòÞÐðÝÏíÛÍêØÊèÔÆëØÊïÜÎîÛÍïÝÏ÷äÖùçÙ÷å×õãÕñÞÐëÙËçÔÆåÒÃòßÒñÞÑïÜÎñÝÏñÞÐê×ÉïÜÎòÞÐõáÓøå×ûéÛýëÞúèÚõáÔóàÒ÷äÖ÷äÖóßÑñÞÐöãÕûéÛ÷ä×ïÜÎìÙË÷ä×ùçÙüéÛüéÜúèÚøåØóàÓôàÓòÞÐïÜÎòßÑõâÕôàÒòÞÐóßÑíÚÌéÖÈìØÊ÷ä×øåØ÷äÖòÞÐìÚÌéÖÈòßÑõâÕôáÔøå×ýëÝüêÜõâÔõâÕôáÔóßÑñÞÐïÜÎüêÝùåØóàÓóàÓ÷äÖûèÚôáÓñÞÐïÜÎðÝÏñÝÏïÜÎïÜÎõâÔùæÙúçÚøåØøåØõáÓòßÑóßÑõâÔõâÔóàÒîÛÍïÜÎëØÊæÒÄçÓÅëØÊèÕÇê×Éé×Éë×ÉïÜÎôáÓöâÔûéÜüéÜúçÚõâÕíÙËçÓÅíÙËîÚÌñßÑóàÓðÝÏêÖÈìÙËïÜÎõâÔùæØüêÜòßÑöãÕ÷äÖõâÔ÷äÖúçÙûéÛöãÕðÝÏóàÓöãÖðÜÎöäÖëØÊèÔÆñÞÑõâÕòßÑèÔÆæÒÄçÔÆìÚÌîÛÍíÚÌôâÕûìÞûëÝúèÚüêÜûéÛøæØóàÒìÚÌëØÊîÛÍòßÑðÝÏõáÓñÝÏïÜÎôáÔöãÖòßÑôàÒøåØûèÛùåØôáÓöâÕõáÓôàÒõâÔùæØûêÜûèÛýìÞùå×òÞÐöãÕûéÜûèÛøåØ÷ä×úçÚûéÛúèÚýëÞúçÚ÷äÖùæÙüéÜýêÜûèÚùæØüèÚûéÜùçÙûêÜöä×÷åØ÷ãÕëØÊéÖÈõâÔöãÕöãÖóßÑøåØþíßýëÝùæÙùæÙøåØöãÖóáÓòÞÐëØÊñßÑøåØüêÜúèÚ÷äÖïÛÍïÜÎòÞÐõãÖôáÔðÝÏìÚÌðÝÏóàÒòßÒõáÓøåØúçÙöãÖõáÔøåØúçÚúçÚ÷ãÖðÝÏêØÊêØÊïÛÍóßÑñÝÏñÞÐòßÑõâÕùæÙüêÜöâÔýêÝüéÜùçÙôâÔëØÊìÙË÷äÖùæÙõãÖöä×ôàÒíÚÌðÝÏöãÖúèÚ÷ä×òßÑóàÒûèÛþðâþñãÿòäÿóåþëÝúçÚñÞÐôáÓýìÞýíàîÛÍîÛÍïÜÎïÜÏðÝÏîÛÎâοæÓÅïÜÎùæÙýêÜûèÚëØÊéÕÇíÚÌöãÖôáÔê×ÉìÙËíÚÌïÜÎïÜÎïÜÏïÜÎñÞÐóßÑñÞÐìÙËìÙËîÛÍõâÕúæÙýêÝøå×ñÞÐìÙËñÞÐøåØüèÚúèÚûèÛþîàüêÜøæØïÜÎðÞÐúèÚûéÛöäÖðßÐîÜÍôãÔöå×õãÕôâÓïÝÎóâÔùçÙúèÚüìÞþíßþìÞþëÝýëÝþëÝýëÝøæØôáÓòßÑ÷åØýêÜÿíßûèÛúçÚøæØ÷娸åØùæÙøåØøå×úèÚüéÜùçÚôáÓëÙËñÝÏùçÙþìÞøæÙðÞÐòßÑõâÔõãÖóßÑóßÑõáÔóàÒõãÕðÞÐñÞÐ÷åØ÷å×õâÔ÷åØ÷åØòÞÐïÜÎïÝÏùæÙúçÚùæÙöãÕöâÔöãÖùçÙ÷ä×óàÒïÛÍñÝÐôáÔóßÑóßÑòÞÐðÝÏïÜÎñÞÐõâÔöâÕýêÝýêܸ娸æÙüêÜöãÕïÝÏîÚÌðÝÏòßÒûêÜøå×øå×üêÝûêÜöãÕøåØýïáüðâ÷åØòàÒôáÔòßÑëØÊìÙË÷娸æØðÝÏòàÒñÞÐñÞÐñÞÐóáÓõáÓóàÒñßÑõâÔüéÜûéÛöãÖíÚÌñÞÐñÞÐõãÖúèÛúèÚ÷ãÖôàÒòÞÐòßÑîÛÍèÕÇéÕÇôáÓöãÕçÔÆãÐÂéÖÈíÛÍðÝÏðÜÎíÚÌñÞÐ÷ä×øæØðÝÏíÚÌóàÒõâÔïÜÎñàÒîÝÎíÛÌïÝÎïÞÏîÝÎïÞÐîÝÏôâÔúéÚùèÚúêÜÿòäþëÝûèÛüéÜøå×ñÞÐñÝÏóßÑöâÔ÷ä×÷äÖ÷å×öãÕøæØùçÙ÷ãÖõâÕöäÖùæØ÷ãÖ÷ãÖøæØùæØ÷äÖñßÑòßÑôáÓ÷äÖõâÔñÞÐöãÕøå×÷ä×ôàÒóßÑôàÒõâÕõâÔòßÑöäÖúèÚõãÕøå×úçÙùçÙ÷ãÖ÷ãÖøæØôáÔøæØüêÜþìÞûèÛ÷äÖíÚÌîÛÍëÙËäÐÂçÔÆïÜÎòßÑðÝÏíÚÌîÛÍñÞÐôàÒôàÒðÝÏóàÓ÷äÖ÷ãÖøå×ÿîàûèÚñßÒìØÊñÝÏøæØøå×öãÕòßÑïÜÎðÝÏóàÒñÝÏóàÒòàÒïÝÏîÛÍîÜÎöä×òßÑðÝÏòßÑñÞÐíÚÌùæÙ÷ä×óàÒïÜÎòßÑ÷ä×ýíßýëÞûèÛùæÙ÷äÖõáÓôâÕùæØõâÔ÷åØýëÝûèÛóàÒóàÒ÷äÖüêÝüêÝ÷ä×îÚÌçÕÇäÑÃë×ÉòÞÑöãÖøæØ÷äÖñÞÑìØÊíÚÌñÞÑñÞÐðÜÎöãÕøå×óßÑóàÓûëÜùçØôãÕñàÒðßÑðßÐùèÙ÷å×øæØüëÜÿñâÿöçþìßøä×ôàÓöãÖõãÖòßÑôâÕúçÙýêÜùçÙõáÔòßÑñÝÏóßÑòßÒñÞÐôáÓùçÚøæØ÷åØöãÕ÷ä×ùæÙùæÙúèÚõâÔðÝÏñÝÏöãÕúçÙþìÞüéÜøåØõáÓõâÕ÷ä×þìßýêÜúçÙúçÚûèÛùçÙûèÛúçÚ÷ãÕñÞÐíÙÌê×ÉéÕÇñÞÐöãÕôáÓòßÑóàÓîÛÍòÞÐòßÑñÞÐôáÔøæØöä×ùçÙ÷ä×òÞÐòÞÐöâÕõâÔîÛÍìÚÌïÜÎðÝÏîÛÍòàÒôáÓõãÕ÷ä×øä×öãÖúçÚøåØòÞÑé×ÉçÔÆêØÊöãÖôáÓöâÕûèÚüéÛúçÙûéÛþìÞúèÚðÝÏïÜÎôáÓñÞÐóßÑòÞÐïÜÎîÜÎðÜÎöãÖöäÖôâÕòßÑòßÑóàÒöãÖ÷ä×õáÓõáÓ÷äÖôàÒøäÖüêÜýëÝúçÚúçÚüêÜòßÑðÞÐìÙËêÖÈñÞÑùçÙöãÕüéÛÿíßüéÛõãÕðÝÏêÖÈóáÔýëÝúçÚøå×þïâþñâýìÞúèÚøçØúéÛýìÞûéÛùèÚöäÖóâÔõäÖöäÖëØÊóàÒøåØùçÙüêÝÿðã÷åØûèÛûéÛùçÙøåØøæÙúçÚüéÜüêÜúçÚúçÙûèÚöä×øæÙùæÙùæÙ÷ä×÷ä×ûèÛóàÒëØÊëÙËõãÕþîàýëÞøæØñßÑñÞÐôáÓ÷å×üéÜüêÜøåØîÛÍïÜÎöãָ娸åØ÷åØôáÓðÞÐìØÊîÛÍîÛÍëÙËæÓÅçÓÅêØÊ÷ãÕöâÕùæÙýëÝùçÙòßÑóàÒòàÓïÜÎìÙËïÜÎõâÕöâÕóàÒòßÑöãÕöãÕðÝÏíÛÍïÜÎñÞÐõãÖù娸åØôáÓóàÓõâÔ÷äÖõâÔðÝÏòàÒóßÑõâÕùæÙøåØõáÓûèÛýêÝûèÛõáÓöãÖýêÜòßÑôáÔôáÔñÞÐìÙËçÓÅéÖÈêØÊíÚÌñÞÐôáÓöâÕîÛÍîÜÎóßÑôáÓñÞÐòßÑúçÚúèÚøæØ÷äÖûèÛÿïáûèÛþëÝýêÜ÷äÖñÞÐîÛÍíÛÍóàÒøå×ûèÚúèÚøæØöãÖúçÚüêÝýêÝÿîàÿòäøçÙ÷å×øæØüëÜÿïàþîàúéÛþïáýìÞöå×òáÒìÛÌà̾ìØÊöâÕöãÕõâÕ÷ä×÷åØ÷äÖøå×úçÚüéÜýìßúèÚøæØ÷å×öäÖóàÒîÛÍöãÕ÷ä×öäÖôáÓóàÒóàÓõâÔóàÒðÝÏïÜÎóàÒùçÙøæÙõãÕòàÒõâÕ÷äÖ÷ä×ùåØ÷ãÖöä×òßÒïÜÎôáÓñßÑñßÑôáÓúçÙüêÝüêÜïÜÎê×ÉêÖÈðÝÏôáÔôáÓøæÙùæÙùçÙöäÖñÞÐêØÊîÛÍæÓÅãÐÂëØÊòßÑõáÓôáÓ÷娸åØüêÜýëÝøåØóßÑôàÒóßÑïÜÎñÞÐôáÓõâÔøä×ûèÛûèÛ÷ãÖñÞÐëÙËðÝÏôàÒôáÔöäÖùçÙõãÕöäÖõâÔñÞÐôáÓùæÙûéÛûéÜûéÜúèÚóàÓëØÊîÛÍìÙËîÛÍïÜÎïÜÎíÚÌìÙËêÖÈóàÓôâÔëØÊíÚÌïÜÎçÔÆâÏÀçÓÆíÚÍñßÑòßÑôáÓ÷ä×÷åØñÝÐê×ÉëÙËîÛÍñÞÐ÷ä×úçÚûéÛþíßýëÝ÷ãÖøä×ýëÝüéÛ÷æØöå×ùèÙÿïàýíÞöå×øçÙýíÞûêÜ÷æØøçÙöäÖôâÔõáÔôàÓõáÔôáÔóàÒøåØôáÔòÞÐôàÓõáÔóàÓûèÚðÞÐêÖÈîÛÍòàÒóáÔõãÖõâÔðÝÏìÙËìÙËïÜÎöâÔûéÛýìÞúçÙöãÕôàÓùæÙúèÚýíßþòåþñäýëÝîÛÍéÕÇïÜÎõãÖðÝÏìØÊìÙËèÕÇçÓÅíÚÌóàÒöâÔðÝÏïÝÏòÞÐ÷ä×÷ãÖñÞÑëØÊòßÑñÞÐæÒÄåÑÃê×ÉðÝÏðÜÎóàÓúçÙúçÙöäÖñÞÐöãÖõâÔõâÔ÷åØôáÔ÷ä×õâÕôàÒóßÑñÞÐïÜÎîÛÍ÷äÖüêÜ÷ä×ôáÔöãÖ÷å×ûèÚøä×íÚÌíÚÌôáÓüéÛþìÞ÷åØðÝÏïÜÎìÙËôáÓìÚÌëØÊñÞÐôàÒñÞÑíÛÍïÜÎé×ÉáÎÀæÓÅñÞÐúçÚùæÙöãÖïÜÎíÚÌëØÊîÜÎðÝÏïÜÏìÙËèÕÇåÒÄæÒÄçÓÅæÒÄðÞÐûéÛýêÜûêÝöãÖ÷ä×øæØôáÓôàÓñÞÐñÞÐ÷å×÷ä×ìÙËæÓÅôãÕúéÛúèÚòáÓòáÒøæØõãÕñßÐöäÖùèÙöäÖõäÖýïáüëÝ÷äÖðÝÏñÞÐôáÔôáÓùæÙýêÝûêÜöä×ðÝÐïÜÎôáÓòßÑïÝÏòßÑòßÑ÷ä×õâÕîÜÎòßÑúçÚùæØüêÝýëÝþíßüêÜöãÕïÜÎìÙÌùéÜüíßúèÚøæÙôáÔöãÕóàÒôáÓøåØúçÚùæÙôâÔïÜÎðÝÏòßÑòßÑøå×÷ä×øåØ÷ä×óßÑíÛÍéÖÈèÕÇóàÓôáÔòàÒ÷ãÖ÷äÖòßÑñÞÐòÞÐóáÓðÝÏìÚÌðÝÏñÞÐñÞÐñÞÐñÞÐðÝÏïÝÏôáÔøæÙúèÚúçÚûèÚøä×ðÜÎíÙËõãÕüêÜþëÝüêÜÿîáþìÞõâÔóàÓöãÕñÞÐöãÕõâÔóáÓòßÑëØÊìÚÌðÝÏòßÑðÝÏòßÑõãÖ÷äÖïÛÎèÕÇéÖÈðÝÏöä×÷åØñÞÑìØÊîÛÍóàÒ÷äÖòßÑõâÔõâÕòÞÐîÛÍìÙËíÙËèÕÇèÕÇòàÓûèÛýëÝùëÝòßÑíÙËîÜÎòßÒùæÙðÝÏñÞÐòÞÐóàÓôáÓõâÔôãÕõäÖóâÔñàÒôãÕøæØüëÜúèÚøæØòàÒïÝÏóâÔðÞÑïÜÎîÛÍîÛÍñÞÐóàÒôáÔõâÕ÷äÖùèÚùæÙöä×ôáÓüéÜýìÞýêÜþëÝûéÛöãÕöãÖøæÙûèÚúèÚøä×õâÔûéÜüìÞùæÙöãÕ÷ä×ñÞÐîÛÍëØÊîÜÎóàÓöãÕüêÜûèÛùæØöãÕóàÓñßÑöâÕøå×üìÞûëÞ÷äÖôáÔõáÓòÞÐïÜÎìÚÌîÛÍðÝÏõâÔôáÔóàÒóáÓøåØýìÞöâÕóàÒðÝÏîÛÍîÛÍîÜÎïÝÏôâÔøå×õáÔñÞÐðÝÏóáÓøæØüéÜùçÙ÷äÖöãÕîÛÎçÔÆåÑÃïÝÏúèÚÿìÞ÷ä×öäÖúçÚÿìÞûèÛòÞÐêØÊìÙËíÛÍóàÓøä×÷ãÖòßÑúçÙúçÚòÞÐíÚÌïÜÎõâÔñÞÐïÜÎðÝÏîÜÎéÖÈïÜÏðÝÏîÛÍîÛÍñÞÐôáÓë×ÉíÚÌðÝÏïÜÎñÞÐóàÒøæØòÞÐöäÖüéÛ÷ä×ôáÓçÔÆæÒÄê×ÉðÝÐöãÖúèÚúçÙûéÛôáÓóàÒúçÚýêÜûëÝõäÖðßÐòáÓôãÕóâÔõäÖôãÕñßÐìÛÌîÝÎõäÖðÝÏïÝÏñÞÐøå×úèÚùæÙ÷ä×îÛÎéÕÇîÛÍöâÕúèÚöâÕüéÜþìÞûèÛøå×öâÔöãÕòßÑöäÖûèÛùçÙûéÛüêÝõâÔïÝÏñÞÐ÷äÖûèÛðÞÐêØÊêØÊìÙËëØÊíÚÌøåØ÷åØôàÓðÝÏôáÓøæØùæÙúçÚûêÜýíßýëÝýìÞýîàøæØïÜÎìÙËðÝÏôáÔôâÕëØÊéÕÇêÖÈéÖÈïÜÎöãÕøä×÷ä×ôâÔôâÕ÷ä×üëÞþíßýìÞõãÕðÝÏïÜÎûéÛøæØ÷åØùæÙöâÔïÜÎé×Éê×ÉïÛÍöãÕ÷ãÖôáÓòßÑëØÊìÙÌöãÕõãÖìÚÌìÙËêÖÉìÚÌòÞÐóßÑóßÑíÛÍïÜÎòßÑõâÔóáÓñÞÐðÞÐøæØüëÞúçÙõâÔóàÒòßÑôáÔöãÖöä×øäÖøæÙ÷äÖøå×ùçÙúèÚùæØõâÔöãÕòÞÐöãÕøä×ïÜÎëØÊïÜÎöãÖûèÛüêÜûèÛ÷åØþîàÿòåýìÞúçÚþëÝþëÝüíÞøæØôãÕõäÖõäÖóâÔóâÔïÞÐíÜÎõäÖûêÜüëÜþíßýëÝþëÝÿîàÿíßýëÝõãÕóàÓôàÒøå×üéÛýêÜùæÙúçÚûéÛúçÚûèÚþìßõâÔïÜÎòÞÐõâÔóàÒõâÕùçÙõãÕóàÒóàÒôàÒòßÑðÝÏôáÓûéÛøåØõâÔüëÝùæÙúçÚùçÙ÷娸åØûéÛñÞÐîÛÍçÔÆèÕÇîÛÍòßÒñÝÏóàÓöä×ùæÙúçÚùåØîÛÍéÖÈíÚÌðÝÏê×ÉéÕÇëÙËóáÓûèÛüêÜûèÚùçÙùçÙõãÕñÝÏïÜÎòßÑøåØ÷å×òßÒñÞÐõâÕöãÖõâÕöãÕøåØúçÙöâÕëØÊâÏÁé×ÉêÖÈìØÊïÜÎñÞÐóàÒùçÙùæÙûéÜøæØñÞÐïÜÎöãÖôàÓôàÒ÷äÖ÷äÖõáÓûéÛýîàüíà÷äÖôâÔöäÖõâÔòßÑóàÒúçÙÿíßÿñãýíßôáÓíÚÌôáÔüéÜýëÝöä×öãÕöâÕöä×÷äÖ÷ãÖóàÒøæØ÷äÖöãո娸娸äÖúçÚüéÜüêÜùçÙ÷äÖõäÖùçÙúèÚ÷å×ôãÕôãÕûêÜûêÜùèÚþîàÿóåþïáÿðâÿîáþìßýêÜüéÛúçÚÿðãüêÝõãÕðÜÎóßÑøæØþìÞúçÚ÷ä×òßÒñÞÐ÷äÖïÜÎîÜÎðÝÏ÷äÖúèÚúèÚôàÓúçÚüéÜøåØ÷ä×úçÙýîáÿòäþïáøæØøä×úéÜúçÚüéÛüêÜûèÚ÷ä×ôáÔõâÕôáÔîÚÌê×ÉìÙËëØÊçÕÇïÛÍ÷ä×úçÙõâÕðÝÏëÙËîÛÍñÞÐõâÔòßÒîÛÍéÖÈìÚÌñÞÐóàÓòÞÑðÜÎèÕÇåÒÄåÑÃíÚÌôáÓøå×õâÔöãÕóàÒðÝÏðÝÏòßÒõâÕõâÔôáÓôàÒóàÓòßÑîÛÍôáÓöãÕôàÒöãÕûèÛøæØöãÕöãÕïÜÎêÖÈíÚÌóàÒðÝÏìØÊéÕÇë×ÉíÛÍðÝÏñßÑðÞÐîÛÍìÙËëÙËíÚÌîÛÍðÝÏóàÒøå×üëÝúèÚñÞÐðÜÎøåØöäÖìÙËñÞÑúèÚúçÚöä×÷åØôáÔõáÔøåØôáÓòßÒøåØùæÙòÞÐïÜÎôâÕöãÖïÜÎëÙËñßÐûêÜþîàôâÔîÜÍîÜÍùèÚÿñãÿñãþïáÿòãÿñâþìÞþìÞýêÜùæÙùæÙûèÛþíàÿîàûéÛöãÖùæÙþðâüêÜ÷äÖõáÓðÝÏîÛÍôáÔüñãúêÜðÝÐñßÑûèÚüéÛøä×÷åØùçÚþïáÿôçÿõçþíßýìÞöãÕòÞÐòÞÐíÙËîÛÍë×Êë×ÉðÞÐöãÖùæÙøåØøåØóàÒðÝÏñÞÐîÛÍòÞÐðÜÎïÜÎïÜÎñÞÐôáÓùçÙûéÜ÷ä×öãÖøå×óàÒñßÒíÚÌèÔÆèÔÆéÕÇèÔÆëØÊé×ÉëØÊñÞÐðÝÏéÖÈèÔÆíÙËñÞÐôáÓõãÕöä×úèÚùæÙ÷ä×ùæØûéÛþìßüïáýìÞøæØñÝÏôáÔüêÜèÔÆáÍ¿áÎÀíÙÌõâÕ÷ä×êØÊëÙËê×ÉèÔÆëØÊïÜÎîÛÍñÝÏôáÓ÷ãÖôáÔðÝÏéÕÇóàÓ÷äÖõâÕðÝÐåÒÄìÚÌöãÕøåØíÚÌêÖÈîÚÌøåØúçÚúçÚüéÜýêÝþíßÿîàýêÝùæÙôàÒïÜÎìÙËçÓÅéÕÇëØÊïÜÎöâÕúèÛýîàúèÛõâÔóàÒöâÔùåØýîàùæÙûéÛõâÕùçÚûéÛþðâûêÜöå×õäÖøæØúéÚöå×ôãÕøæØþîàüìÞöå×ñÝÐöâÔóáÓöãÕüéÜüéÜøä×þïáÿóåûéÛõâÔôáÓùçÚùæÙþìßÿðãþíàÿðãûéÛôàÒóàÒüéÜüéÜõâÕîÛÍë×ÉéÕÇíÙÌðÞÐðÝÏüéÜøåØôâÔôáÓóàÓðÝÏôáÓöä×ôáÔïÜÎïÝÏõâÔùæØúçÙùæØöãÖøåØüêÜõâÔõâÔðÜÎéÖÈíÙËôáÓúçÚùæÙöâÔïÜÎéÕÇãÐÂçÔÆòàÒøæÙõâÔóàÒõâÔüêÜüêÜöãÕõâÕúèÚúèÚùæÙöãÖõáÔ÷ä×öãÖóáÔéÕÇìØÊñÞÐõâÔôàÒïÜÎïÜÎôâÔøåØöãÖóàÒòÞÐëÙËðÝÏôáÓôàÒóàÒôáÔòßÑ÷ä×õâÕðÝÏíÙËèÕÇîÛÍëØÊíÚÌôáÓøå×÷äÖõáÓøæØøä×ôáÔ÷äÖûêÜûéÜüêÜùæÙòßÑñÞÐóàÒøå×ùæØøå×öâÕùæØüêÜôàÒòßÑóàÒùåØüêÜüêÜôáÓðÝÏóßÒíÚÌíÚÌìÙËïÝÎôãÕõäÖòáÒóâÓøæØ÷å×øæØûéÛþïàþîßüêÜûèÛøåØøæÙýëÞþíßýìÞûèÛúçÙøæÙúèÚûèÚùçÚ÷ä×÷åØýêÜýëÝùçÙúçÚüêÝýêÝýëÝþíßÿíßþíßùèÛúêÝûíàüíàøæÙòÞÑíÙËóàÒ÷ä×óàÒêÖÈáÍ¿ìÙÌòàÓ÷ä×öãÖóßÑðÝÏðÝÏôáÓ÷ãÖöãÕ÷ãÖùåØôáÓöãÖõâÕñÝÏõáÓúèÚüêÜùæØöãÕ÷ãÖ÷äÖõãÕøæÙúçÙûéÛüéÜûèÚøåØøæÙûèÛýëÝùçÙòàÓìÙÌìÙËòßÑõâÔðÝÏìÙËê×ÉöãÕ÷ä×öãÖóàÒñÞÐñÝÏóàÒôàÒòßÑðÝÏîÛÍîÛÍñÞÐîÛÍîÛÍñÞÐ÷ãÖúçÚüéÛýêÜøæØóßÑõáÔøåØôâÔíÛÍíÚÌõâÔúèÚúçÚòßÑïÜÎïÜÎóàÒóáÓïÝÏóáÓ÷äÖúçÚùçÙøåØöãÖúçÚúçÚüêÜþìÞùæØñÞÐöäÖôâÕøå×þìÞþìÞøæØìÙËïÜÎðÝÏîÛÍîÛÍéÕÇâÐÁëÚËòáÓòáÓõãÕûéÛóâÔóâÔóáÓòàÑóâÓöå×ôáÓðÝÏôàÒ÷åØ÷äÖûêÜùåØñÞÐíÚÌïÜÎðÝÐðÝÏúèÚùæÙùçÙ÷ä×õâÔ÷äÖòßÒõãÖùçÙûèÛýëÝÿíàþíßýìßûëÞúéÜ÷å×óàÒæÓÅîÛÍóàÒòßÑïÜÎíÚËíÙËíÚÌïÜÎòßÑñÞÐïÜÎ÷ä×ùæÙøåØóßÒðÜÎíÚÌïÜÎõâÔøæÙ÷ä×öä×øæÙôáÓñÞÐòßÑøåØüêÜüêÜþìÞüêÜûéÛýêÜüéÛ÷åØöãÖòßÒöâÔóàÒìÙËê×ÉðÝÏöãÖùæÙ÷ä×öãÖ÷ä×úçÚùæÙóáÔðÝÏôáÔüéÛöãÖóàÓñÞÐòßÑôáÓöäÖõâÔìØÊãÐÂæÓÅðÞÐùçÚþíßûèÚõáÓðÝÏðÝÏõáÓùçÙþìÞúèÛìÚÌë×ÉòàÓïÜÎîÜÎóàÒùçÙøæØóàÒîÛÍëÙËîÛÍùçÙüëÝùèÛöäÖõâÔ÷äÖûèÚùæØóàÒöãÖõâÔøåØýêÜúçÚóàÒñÞÐùçÚøæÙûéÛÿíßùçÚøçÙ÷æØùçÙûéÛûêÜûéÛþíÞûêÛóáÒìÚÌìÛÌñßÐîÛÍîÜÎïÛÍåÑÃáÎÀé×Éöä×÷åØöãÕóàÓöâÕùæÙùçÙùæÙóàÓíÚÌîÜÎñßÒúçÙúçÚûéÛþëÞýëÝûèÚøåØ÷ä×öâÔõâÔöäÖùæÙøçÙùçÚøæÙ÷äÖúèÚþíßûéÛ÷äÖóàÓ÷ãÖ÷åØõâÔíÚÌìÙËìÙËíÚÌíÚÌìÚÌëÙËòßÒ÷åØöä×ñÞÐíÛÍîÛÍïÜÎòßÑøåØùæÙøåØòßÑöãÖ÷ä×ôáÔóßÑôàÒøå×òßÑöãÖûèÛúçÚûèÛøåØ÷äÖøæÙûéÛúçÚõáÔüéÜûèÛ÷åØòßÑðÝÏòßÑíÚÌîÛÍñÞÐ÷äÖøå×öãÕòßÑðÝÏëØÊèÕÇìÙËñßÑöãÕñÞÑóßÑöãÕöâÕøä×øæÙüìßùçÙìÙËéÖÈðÜÎ÷ãÖûéÛûéÛôáÓòÞÐôàÒôáÔñÞÐñÞÐùçÚþîàÿñãüêÝúçÚôáÔóßÑúçÙÿðâýìßûéÜùæÙöä×òßÒíÛÍùåØüêÜøæÙüêÜûéÜüéÜûëÜûéÛüëÜýíßþîàÿïáûêÜûêÜúéÚøèÚûëÜþîßöâÕ÷ä×öãÕòßÒóàÒöäÖúçÚûèÛúçÚ÷ä×õãÕöãÕñÞÐùæÙøå×ðÝÏíÚÌéÖÈúçÙûéÛûèÛöäÖòßÒðÝÏöãÕøæØùçÙøå×øæØûèÚÿïáþíßüêÜúçÚùæÙùçÙøåØ÷ä×÷ä×÷å×ôáÓïÜÎðÜÎðÝÏòßÑôáÔõâÕóàÓòßÑôàÒõâÔôáÓñÞÐïÜÎòßÑ÷å×ûéÛûèÛùæÙøåØòßÑóàÒóßÑòßÑòßÑóßÑóßÑòßÑöãÕþëÝþìßúèÛþíàúèÚ÷ä×ùæÙúçÚøæØñÞÐóàÒôàÓõáÔöãÕöãÖòßÑðÝÏñÞÐôáÓõáÓóßÑ÷ãÖúæÙüêÜúçÙóàÒëÙËëØÊæÒÄìÙËóàÓïÜÏìÙÌõãÖðÝÏíÛÍòßÑôáÔòàÒòßÑðÞÐîÜÎïÜÎòÞÐõáÓôáÓûéÜüîáýêÜýêÜÿîáÿñãüéÛôáÓòßÑøä×þíàÿðâÿíßýêÜúèÚúçÙùçÙüéÜöãÕñßÑóßÑêÖÈñÞÐñàÒ÷æØøæØñàÑðßÐóãÕöäÖøæØûéÛüëÜùèÚ÷æØúçÚ÷äÖòßÑøæÙüéÜôáÓøåØôàÒôáÓüêÜüêÜ÷ä×ùæÙþíàûèÛóßÑóàÒòàÒðÝÏùæØúçÚïÝÏìÙËðÝÏ÷äÖöãÕóàÓïÛÍðÝÏôâÕõâÔòàÒòßÑ÷ãÖúèÚûéÛùæÙùæÙøåØ÷ä×ôâÕòàÒïÛÍñÝÏöãÖûéÛûèÛöâÕúèÚ÷ãÖóàÒóàÒ÷ãÖúçÙõâÔüéÜÿìÞúçÚùæÙûèÛüêÜõâÔðÝÏõãÖøä×öâÔøåØøå×öâÔûêÜÿðãûéÛóàÒ÷äÖøåØöä×ùçÙýêÜôáÓ÷ãÖûéÛýìß÷äÖîÛÍðÞÐôáÔõâÕñÝÏîÛÍíÛÍöä×øæÙùæÙ÷ä×óàÒðÝÏæÓÅíÛÍñÞÐîÛÍîÛÍðÝÐîÛÍóàÓúèÚþîàÿðãÿïâýëÝùçÙöä×÷ä×øå×öãÕøæÙùçÚþíàûéÛõáÓöãÖþíßýìßýìßüêÜ÷äÖðÝÐøæØûéÜþñäþîàúçÚüêÜòßÑõáÓôáÓîÜÎðÞÐõãÕôãÕòàÑòáÒõäÖöå×ôãÕôå×öæØùçÙùçÙõäÖòàÑúçÚüéÜýëÝüéÜùæÙ÷ä×øå×ýëÞýëÝüìÞûïáúêÜúçÙõâÔôâÔúçÚüêÜùæÙüêÜ÷ä×ùæÙúçÚõâÔõâÔùæÙúèÚóàÒïÜÎõãÕ÷åØìÙÌéÕÇîÚÌñÞÐòÞÐ÷ä×ïÝÏíÛÍîÜÎôáÓ÷ä×öãÖ÷ä×öãÖôâÔôáÔöãÕ÷äÖõáÔøåØóàÓóàÒûèÛýëÝúçÚ÷ä×õâÕøä×ù娸å×øåØúçÚóàÒðÜÎöãÕøæØûèÛýêÝüéÛöãÖôáÓôàÒñÞÐóàÒøæØüêÝùçÙòßÒýìÞûèÛøå×öäÖôàÒðÝÏùçÙõâÔñÞÐîÛÍðÝÏóßÑúçÚøä×÷ãÖöãÖôàÒðÝÏîÛÍðÝÏñÞÐñÞÐóàÒ÷ä×îÛÍíÛÍïÜÎöäÖûéÜüêÝüéÛøåØõâÔ÷ãÖüéÜþîáþìÞýêÜûèÚùæØ÷äÖöãÕúçÚýíàÿñäüìÞùåØöãÖöãÕòßÒóàÓûéÛÿíßþëÝôáÓ÷ä×ùçÙùæÙûéÜýìßüëÝúéÚöå×ôãÕøçÙýîàÿóåüíß÷æØöäÖùçÙýíÞûéÛÿìßþíßùçÙ÷ä×ùçÚùçÚùçÚôâÕìÚÌìÙËðÝÏòßÑðÝÏñÞÐöãÕúèÚüéÛýêÜøæÙúçÚûèÚøæØøå×ñÞÐóßÑõâÔùæØûèÛüéÜûéÛùæØùæØöâÕòßÑóàÒùæÙøåØùçÙúçÚöãÕñÞÐïÛÍìØÊéÕÇêÖÈïÜÎóáÓ÷ä×öãÕõáÓöäÖøåØùæØõâÔïÜÎìØÊðÝÏóàÒòßÑõâÔøå×øåØôáÔðÝÏïÜÎúçÚôâÔíÚÌìØÊïÜÎôàÒðÜÎéÖÈìØÊìØÊëÙËõãÕ÷äÖóàÒðÝÏîÛÍðÝÏóßÑùæÙöãÖôáÔôâÔóßÑðÜÎîÜÎíÚÍîÜÎöãÕúèÚúçÙõâÕòßÑïÜÎìÚÌîÛÍïÜÎæÓÅçÔÆìÙËóàÒõâÔòßÒóàÒôáÓóßÑóàÒ÷ä×üëÞùæÙôâÔíÙËðÝÐúçÚúçÚùçÙõâÔùæÙÿóæýïáóàÒèÕÇé×ÉëÙËøçÚÿïáûèÛýìÞýêÜûèÛõâÔïÜÎë×ÉñßÐôãÕõäÖôãÕõäÖõæØîÞÏé×Éé×ÈòàÑùçÙûéÛóàÒùçÚùçÚïÝÏïÝÏõãÕïÛÍåÑÃåÒÄíÚÌðÜÎõâÔöãÖõâÕôâÔ÷ä×üéÛÿíßûéÛ÷äÖøå×üéÜþìßÿïâóßÑñÞÐùçÙþíßüêÜýëÝÿîáÿïáÿðâúèÚòßÒíÛÍñÞÐóàÒöäÖøåØöâÕòßÑæÒÄçÓÅéÖÈïÛÍõâÔúèÛñÞÐëØÊïÜÎóßÒîÛÍëØÊê×ÉèÖÈëØÊóàÒóàÓíÛÍêØÊéÕÇìÚÌíÛÍëØÊïÜÎíÚÌçÓÅäÐÂéÕÇðÝÏõáÓõâÔëØÊê×ÉèÕÇèÕÇñÞÐâÎÀæÓÅíÚÌõâÕûéÛÿíßöä×õãÕ÷äÖ÷ä×óáÓîÛÍëØÊêÖÈìÙËñÞÑ÷äÖùçÙõáÔòßÑïÜÎíÚÌíÚÌìÚÌóàÓòßÑñÞÐðÜÎîÛÍëÙËòßÑ÷ä×úçÚ÷å×óàÒñÞÐîÛÍñÞÐðÞÐöãÕüêÜøåØõâÕöãÖøä×ùæÙ÷äÖóàÒöäÖûêÜùæÙøæÙýëÞýëÞûéÛüéÜûèÛøåØóàÒîÜÎôâÔòáÓõäÖüìÝøèÚîÝÏðÞÏïÞÏñßÐøæØüëÜûêÛùéÛþîàüêÝóàÒîÛÍñÞÐñÝÏêÖÈíÚÍõáÓôàÒõáÓþëÝûéÛùæÙöãÖ÷ä×ùæØ÷ãÖñÞÐê×ÉëÙËðÝÏñÞÐøåØôáÓùçÙþíßþëÝÿíßýëÝûéÛ÷ä×ôâÔõáÓóàÓðÝÏñÞÐðÝÏðÝÏñÞÐñÞÐøåØúçÚûéÛøä×óßÑîÛÍëÙËíÛÍòßÑïÜÎèÔÆéÖÈöâÔôàÒõáÔùæØ÷åØòßÒîÛÍèÕÇêÖÈëÙËêÖÈïÜÎëØÊîÜÎôáÓøçÚøæØôàÓöäÖøåØöâÔûéÜüëÝñÞÐðÝÏóàÓôàÓôáÔõâÕ÷å×õâÔóàÒòÞÐñÞÐòßÑóßÑöä×öãÕôàÒïÜÎîÛÍðÝÏõâÕõâÕóàÒñÞÐôáÓùå×øæÙôâÔîÛÍçÓÅçÓÅéÕÇöãÖøæÙûèÛûèÛøåØöâÕñÞÐøæØýìÞþìÞøæØòßÑòÞÐïÜÎðÝÏöäÖûéÜýëÞÿðâÿðâúèÛðÞÐðÞÐöãÕýêÝÿíßÿîáüêÜùçÙùæÙöäÖòáÓõäÖþðáÿõæýïàýíÞþîßûêÛôãÕóâÔöå×ýíßýïáþîàûéÛõâÔðÝÏòßÑùåØûéÛ÷ä×öãÕøå×ùæØöâÕóáÓôàÒòßÑðÝÏïÜÎîÛÍëØÊðÝÏõâÕõâÔøåØ÷娸åØùæØùæØùæØùçÙ÷ä×ñÞÐñÞÐøå×úçÚøåØ÷ãÖòßÑíÚÌíÚÌïÜÎòàÒôáÓóàÒïÜÎê×ÉæÓÅñÞÐøåØúèÚôáÔñßÑóàÒøæÙôáÔïÜÎíÙËîÛÍðÝÏòÞÑóàÓ÷äÖúéÜúèÚøå×÷äÖúçÚýëÝüêÜøæÙõâÕóàÒûéÛúçÚüêÝýíàöä×üêÜùçÚóßÑëÙËíÚÌðÝÏïÜÎñÞÐñÞÐðÝÏðÝÏóßÑöä×úèÚùæÙñÞÐðÝÏôâÔøæÙ÷åØòàÒîÛÍôáÓýêÝôáÔùæØøå×òßÑòÞÑöäÖõâÕñßÑñÞÐöâÕûèÛýêÜ÷ä×÷åØûèÛøåØóàÒöãÖúçÙõâÕðÝÏñÞÐøå×ýëÝýëÞüêÜýêÝöäÖðÝÏñÞÐùçÚýêÝüéÜóáÓñÞÐóàÒõäÖôãÕõäÖ÷æØöçÙõå×÷æØýëÝýìÝ÷å×òáÓñàÒëØÊìØÊòÞÐùæÙõâÔìÚÌôàÒûèÛûèÛüéÜüêÜ÷äÖòßÑðÝÏñÞÐöãÖôáÔîÛÍèÕÇîÛÍïÜÎôáÓ÷äÖñÞÐùæØýêÜ÷åØðÝÏîÛÍêÖÈóàÒùæÙùçÚúèÚûèÛôáÔîÜÎðÝÏïÜÎíÚÌðÝÏôâÔöãÖóàÓðÝÏïÜÎòßÒõâÔøåØúçÚøæØüëÝüìÞôáÓóàÒôáÔóàÒðÜÎñÞÐôáÔüëÞþîáýìÞþíßÿîàøæÙøåØ÷ä×óáÓðÝÏòßÒ÷ä×÷äÖûéÛøæØíÛÍîÚÍ÷ä×øæØõâÕôâÔøåØùæÙøåØòßÑïÜÎðÝÏ÷äÖøå×õãÕñÞÐòßÑñÞÐðÝÏíÚÌë×ÉíÚÌëØÊíÚÌóàÒòÞÐëØÊöãÖûéÛûéÛýëÝÿîàûéÜùæÙòÞÑñÞÑùæÙûèÚõáÓúçÚùæØîÛÍñßÑúçÚôâÔúçÚüéÜûêÜþíàþíßùçÙîÛÍïÜÎ÷å×üëÝüéÛüîàÿòäþíßùçÚ÷ãÕûéÛÿíßûêÜúçÙõâÔçÓÅÞʼâÎÀïÜÎóàÒøåØúèÚùçÚ÷äÖðÞÐðÝÏòßÑúçÚûèÛùæÙõâÔ÷ãÕöâÔõáÓöãÖùçÚûéÛùæÙöâÔòßÑñÞÐôàÒ÷åØüéÛüéÛöãÖöä×üêÜûéÜúçÚôáÔïÜÎðÝÏóàÒñÞÐóßÑøå×ûèÚõáÔêÖÈíÚÌçÔÆäÐÂèÕÇïÜÎôáÔõâÕôáÓöä×ýëÝúèÚóàÒëØËîÜÎòßÑõâÕöãÖöãÖñÝÏôáÓ÷äÖùçÙúèÚøæØüéÛüéÛ÷å×ïÜÎëÙËêØÊñÞÐõáÔñÞÐèÔÆëØÊöãÖ÷äÖñÝÏïÛÍõâÔùæÙ÷ä×éÕÇêÖÈìÚÌðÝÏïÝÏíÙËõâÕóàÒòßÑóßÑðÝÏíÚÌê×ÉíÛÍñÞÐôáÓòßÑïÜÎìØÊïÝÏôáÔöä×òßÑëØÊïÜÎøå×úèÚûèÛýëÝýêÜôâÔùçÙúèÚôâÕòÞÐñßÑúçÚþìÞûéÛùçÚýêÝþìßýëÝüêÜýìßýëÞûéÜüéÜøæØíÛÍìÙËõáÓöãÕõâÔÿïáüêÜýêÝÿðâÿðãýêÝþïâúçÙöä×óàÒïÜÎñÞÐöãÕöãÖ÷ãÖùçÚýêÜÿíßýëÝþëÝúçÚöâÕùæÙþëÝûéÛÿíßþíßúçÚúèÚþíàõâÕ÷ä×÷ä×òßÑóàÓøå×ùçÚ÷åØóàÒòßÑöãÖüéÛöãÖöãÖóàÒïÜÎîÛÍðÝÏðÝÏîÛÍïÜÎóßÑôáÓóàÒïÜÎìÙËîÛÍ÷äÖúæØ÷äÖñÞÐøå×úèÚöãÕðÝÐîÛÍõâÔïÜÎëØÊìÙËîÛÍîÛÍîÚÌðÝÏóàÒõáÓóàÒñÞÐôáÓöäÖùæØøå×öãÕóàÓõâÕ÷äÖøå×øæØùèÚûéÛùæØíÚÌéÖÈòßÑóàÒë×ÉéÖÈëØÊíÚÌìÚÌèÕÇãÐÂéÖÈñÝÏ÷äÖøå×óàÒîÛÍæÒÄçÔÆëØÊòÞÑùåØýëÞúçÙúçÚøåØôáÓóàÒôâÔðÝÏ÷ãÖúçÚùåØõâÔðÞÐêÖÈòßÑòßÑìÚÌñÞÑûèÚøåØùæÙûèÛ÷ä×ôáÓùæÙôáÔñÞÑïÝÏîÛÍòßÑúèÚüêÜøæØöãÖ÷ä×úèÛýíßóàÒñÞÐôáÓýìÞÿïâýëÝöãÕöãÕúèÚþíàþïáþñã÷ä×öãÖõâÕöä×ùæÙûèÛøå×úçÚúçÚ÷ä×øåØûéÛöâÔøæØùçÚøæØøæØùçÚñÞÐóßÑöãÖúæÙüêÜýëÝþìßúèÚõãÖ÷äÖùæÙúçÚ÷ä×øåØ÷ä×ñÞÐîÛÍîÛÍîÛÍíÚÌîÛÍòßÒùæÙþìÞùæØõâÕöãÖûèÛþëÝýëÝ÷å×üêÜûéÛñÞÐïÛÍñßÒôàÒòßÑôáÓúçÙúèÛøåØüéÛøäÖóàÒòßÑöâÕùçÙûèÚûéÜþìÞÿðâÿîàüêÜûèÛüêÜÿíßÿîàûéÛôáÔë×ÊîÜÎôáÔöãÖòßÑìÙËöãÖøåØùæÙøæÙøåØøåØìÚÌðÝÏõâÔøä×÷ä×õâÔúçÚöãÖñÞÑïÜÎïÜÎñÞÐõâÔõâÔòßÑîÛÍðÞÐ÷ä×öä×íÛÍé×ÉíÚÌíÙËéÕÇîÜÎïÜÏïÜÎñÞÑ÷äÖûèÛóàÓìÙËïÝÏôáÓòßÑóàÒôáÓöâÔòßÑîÜÎñÞÐòÞÐíÚÌñÞÐôáÔõâÔõáÓñÞÐäÑÃìØÊóàÒøåØúèÚûèÚôáÔýíàÿñãûéÛöãÖôáÔüêÜþìÞÿîàýêÜøåØóßÑ÷ä×ôáÓôáÓùçÙûéÜúèÛóàÒëØÊéÕÇòßÑ÷ä×öâÔüêÜüêÜýëÝþëÝüéÜ÷åØùæÙùæÙúçÙùæÙóáÓìÙËñßÑõâÔöãÖôàÒòÞÐñßÑñÞÐòßÑôàÒôàÓôáÔôâÔúèÛþïáþñãùçÚóàÓðÝÏøå×óáÓïÜÎôáÔûéÜÿñãûéÛüéÜüìÞüïáüíßûéÛíÛÍê×ÉéÕÇîÜÎ÷äÖþëÝûèÛùæÙùæÙüêÜýëÝüéÛûèÛùæÙóàÒîÛÍîÛÍðÞÐîÛÍõãÕûèÛüéÜùæÙöãÖùæÙúçÚøå×óàÒñÞÐòßÑîÜÎìÙËìÙËôáÓüéÛÿíßøæÙùæØøå×õãÖòßÑðÝÏðÝÏöãÕúçÙúçÙùæØùæÙúçÙîÛÍê×ÉîÜÎòàÒùå×øå×õâÔõâÔ÷äÖ÷äÖóáÓôáÔñÞÑõãÕûèÛøæÙøåØûéÛÿîàÿïâýëÞøåØñÞÐðÞÑòßÒôáÔúèÚöäÖéÖÈóàÓöãÖ÷ãÖôáÓñÞÐïÜÎöâÕýìßüëÝ÷ãÖõâÕõâÔùçÙûèÚúèÚ÷äÖñÞÐëÙËôáÓìÙËèÕÇìÙËòßÑóáÓõâÔñßÑòàÒùçÙùçÙôáÓôáÔøæØýëÝÿíàþíßýëÞûéÛýêÝÿíßþìÞøæØñÞÑïÝÏóàÒöãÕõâÔöãÕøåØ÷ãÕôàÒñÞÐñÞÐïÜÎëÙËïÜÎðÝÏðÝÏòßÑõâÔùåØçÔÆäÐÂäÑÃîÛÍ÷äÖûéÛñÝÏðÝÏíÚÌëØÊïÛÍóßÑ÷æØøçÙùçÙûéÜýêÝýëÝ÷娸åØúçÚüêÜþìÞÿíàÿïáûéÛõâÕõâÔøåØûéÜûèÛöãÖóàÓôáÔõâÕôáÓ÷ãÖùæÙøåØóàÒñÞÐñÞÐðÝÏíÚÌîÛÍôáÓöãÖóáÓôàÒõáÓõãÕøæÙûéÜüìÞôàÒøåØüêÜûéÛ÷äÖòßÒéÖÈíÙËñÞÐíÚÌëØÊòßÒñÞÑîÛÍìÚÌðÝÏöâÕùæÙùçÚýíßþïáüêÜøä×õáÔùçÚøæÙûëÝþìÞúèÚ÷ä×øåØýìÞýëÞþëÝþëÝùæØöãÖìÙËçÓÅïÝÏøå×ûéÛûéÛùçÚóàÒöãÕýíßþîàýêÜúçÚõâÔòÞÐñÞÐðÝÏëØÊìÙËìÙËëØÊïÜÎôâÔ÷ä×üêÝþìßûéÛ÷åØöãÖïÜÎòßÑøåØÿðâÿñãüêÝúçÚûèÚûèÛúçÚùçÙøåØüêÝýìÞýìßüéÜûéÛýëÝùæÙñÞÐíÚÌòßÑöãÖõâÕéÖÈãÏÁäÐÂñÞÐõâÔñßÑìÙËïÜÎóßÒôâÔôàÓóàÒöãÖöäÖóßÑíÙËðÝÏøå×þìÞüêÝúèÛùçÚùçÙùæÙñÞÐöãÖúçÚøæØøäÖøæØûèÛùæÙýëÞþôæûìÞðÝÏòßÑóàÒïÜÎèÕÇê×ÉñÞÐùçÚôáÔôàÒûèÛþìÞýëÝûèÛþíßÿîáõâÔîÛÍóàÒöãÕ÷ãÖóßÑïÜÎôáÓüéÜÿìÞýëÝøåØøåØúèÚõâÔýêÝüéÛøå×ôáÓøåØþíàüêÜüêÜþëÝöäÖïÜÎóßÑùæØýìßøæØïÜÎòßÑôáÔ÷ä×øåØôáÓñÝÏöâÕþíßüìßÿðãýíàøæØøåØüêÜûëÝõãÕ÷æØüêÜúèÚüéÜóàÓìØÊíÚÌúèÚþìÞùæØöãÕýëÝùçÙôáÓøåØûéÛöãÕûéÛûéÜõâÔôáÓøåØÿðãýìß÷ä×ñÞÐõáÔüéÛøåØõãÕøæØùçÙöãÖùçÙþðâûéÛ÷åØúèÚüìÞüïáúèÚùæÙøåØúçÚüêÜýìÞóàÒóàÒóàÒõáÓ÷äÖúçÚòßÑïÝÏïÜÎóàÒõâÔôáÓúçÚüêÜúçÚôàÒïÜÎîÛÍðÝÏñÞÐñÞÐóàÒõâÕ÷ä×õãÕóàÓñÞÐïÜÎîÜÎîÜÎôáÓõâÕóàÓíÛÍëÙËìÚÌïÜÎòßÑüêÝÿïáüéÜûèÛþìßýëÞ÷äÖöãÕùçÙ÷ä×ðÞÐðÝÏóàÓûèÛþíßþíßýëÝüëÝøçÙîÛÍîÛÍúèÚÿíßýëÞúæØöãÕôáÓóáÓøåØùæÙîÚÌëØÊøå×ýëÝõâÕôàÓòßÑõáÔúçÚþìÞøåØúçÚûèÛûèÛøå×õâÔòßÑñÞÐîÛÍñÞÐôáÓïÜÎíÙËòßÑôáÔõâÔùæØþìßÿôçüëÝ÷ãÖøå×ûéÛýëÝûíàþîáÿñãûèÚñÝÏïÜÎñÞÐôâÔõâÕôáÓ÷åØüêÜùæÙöãÕûéÛþëÝùæÙ÷ä×þïâÿðâÿïáÿíßýíßýìßúçÚñÞÐê×ÉìÚÌñÞÐóáÓõâÔïÜÎïÜÎñÞÐóàÒöä×ùæÙùçÙøæØöâÔóàÒñÞÐñÞÐñÞÐñÞÑñßÑòàÒóàÒûèÛýêÝüêÝüéÛüêÜýìßûéÛýêÜÿìÞýìÞûéÜùçÙóàÓôáÓôáÔôáÓõâÔõâÕôáÓ÷åØúçÚûéÛùçÙ÷åØòßÑðÝÏîÛÍëÙËëØÊêØÊïÜÎéÖÈãÐÂæÒÄîÛÍöãÕ÷ãÖöãÕõâÔöãÕøå×ùçÚõâÕøæØûèÛþíßüëÝòßÑìÚÌðÝÏõâÕùæÙúçÚùçÙøåØïÜÎê×ÉïÜÎôáÓ÷ãÕõãÕøå×üêÜþìßùæØðÝÏéÖÈñÞÐéÕÇçÓÅòßÑòßÑóàÒõãÖõâÕòßÑõáÓøæØûéÛöãÖïÝÏôáÔûéÛ÷å×ôàÒôáÓ÷å×ýíàüëÞôáÓé×ÉñÞÑùçÙúçÚ÷äÖôáÓùèÛöâÔôàÒùæÙùæÙõâÔæÓÅîÛÍõãÕôáÓñÞÐðÝÏ÷äÖûéÛüêÜùæÙøåØûéÛùæÙöãÖ÷åØôáÓóàÓûêÝÿïâÿðâÿîàûéÜúèÛûéÜòßÑðÝÏñÞÐ÷ä×ùçÙøåØôáÓíÚÌëÙËïÜÎóàÒöãÖ÷åØüéÜýëÝûèÚù娸æØòÞÐíÚÌæÔÆåÒÄéÖÈíÛÍ÷åØûéÜûéÜøåØ÷äÖøæØ÷å×õâÔðÞÐë×ÉìÙËïÜÎóàÒðÝÏðÝÏôàÒöâÔõáÓñÞÐñÞÐñÞÐõâÔøæØûéÛúçÙúèÚùçÙøå×õâÕóáÓóáÓíÛÍê×ÉîÛÍñÞÐóàÒðÝÐïÜÏçÔÆèÔÆñÞÐòßÒòßÑõáÓóßÒóàÒõáÔñÞÐøåØûèÛüêÜúèÚõâÔðÝÏóßÑñÞÐñÞÐ÷ä×õâÔíÚÌçÔÆéÖÈìÚÌíÚÌéÕÇãÏÁäÒÄíÛÍðÝÏùæÙüéÛñÞÐöãÖùçÙùçÙôâÔòàÒôàÒùçÙõãÕðÝÏ÷äÖÿíàüêÝøåØùçÙüêÝüêÜüéÛþëÝúéÛøåØõâÕôáÓñÞÐïÛÍéÖÈðÝÏòßÑíÚÌê×ÉêÖÉíÚÌìØÊìÙËóàÒ÷äÖõâÔúçÙûéÛþìÞþïáþíàüéÛøåØùæÙñÞÐðÝÏøå×ùçÙóßÑûéÛüéÛîÚÌåÑÃäÐÂðÝÏ÷äÖüéÜùæÙøåØúçÙùçÙ÷åØõâÔõáÓõâÔóàÒöãÖ÷åØõãÖóßÑöãÕúèÛ÷ãÕ÷ãÕöâÔóàÒñÞÐïÜÎîÛÍñÞÐñÞÐîÜÎìÚÌìÙËñÞÐðÝÏîÜÎîÜÎõâÕýêÜýíßùçÙôàÓñÞÐîÛÍë×ÉðÜÎîÛÍìÚÌîÛÍñÞÐôáÓûèÚýêÜýìßýëÞûèÚøåØøæÙ÷娸åØùæÙõâÕïÜÎêÖÉíÚÍê×ÉïÝÐùçÚûéÛùåØõáÔíÚÌðÝÏúçÙýëÝøåØ÷ä×÷äÖôáÔíÚÌåÒÄïÛÍúçÙýêÜöãÖñÞÐìÚÌîÜÎóàÓóàÓëÙËæÔÆæÓÅëØÊíÚÌðÝÏõâÕôâÔîÜÎóàÒöãÖùæÙøæÙõâÕóßÑôáÓ÷ä×úçÚýëÝûéÜúèÛõâÕóàÒóàÒñÞÐôáÓüêÜÿòäùæØñÞÐòßÑõâÕöãÕíÙËöäÖùæÙõâÔöãÕûëÞþëÝûèÚöãÖúéÛþíßýêÜÿíßýêÜùæØóáÓðÞÑïÜÏñÞÐñÞÐïÜÎöãÕöäÖìÙËë×ÉïÜÏñÝÐïÛÍîÚÌðÝÏðÜÎøä×ýêÝøæØñßÑîÛÍñÞÐ÷ä׸娸æÙüéÜûèÛûèÛùæÙöãÕóàÓóßÑòàÒúçÚùæÙ÷äÖøåØúèÚüêÝùèÚùæØùæØùæØùæØ÷äÖõâÔ÷ä×úçÚûèÛùæÙ÷äÖõâÔõâÕõâÕöâÕ÷äÖ÷äÖøå×÷äÖõâÔòßÑïÜÎíÚÌðÝÏðÞÐðÞÐðÞÑòßÑóßÑôáÔóáÓóàÓóáÓõâÔõâÕúçÙúèÚúèÚøå×õãÕóáÓñÝÏíÛÍêØÊôáÓýêÝüêÜüéÜùçÙúçÙúçÙóàÒê×ÉçÓÅñÞÐôáÓóàÒòßÑíÚÌðÝÏ÷äÖöâÕîÛÍðÝÐùéÛûèÚúçÙüéÛñÞÐæÓÅæÔÆðÜÎöãÖúçÚöä×ñßÑðÝÏ÷äÖøåØúçÚòßÑë×ÊðÜÎòßÑñÞÐ÷äÖùçÙ÷ä×úçÚøæÙõáÓõâÔüéÛýëÞùçÚøåØýëÞÿìßøåØõâÔôãÕûéÛÿïâýìÞúçÚûèÛúçÚöãÕñßÑêÖÈäÒÄèÖÈïÜÎùæØùæØüîáýïáùçÙøå×øæØòßÒòÞÐúçÙüéÛùæÙ÷ä×øåØúçÚþëÝüéÜ÷ä×òàÒúèÚøæØóàÒõâÔöâÔöãÕöãÖøåØöä×ñÝÏéÖÈèÕÈíÚÌòÞÐ÷ä×øæÙøåØýìÞøå×öãÕûèÛüêÜùæÙóàÒõáÔ÷å×úçÚõâÔîÛÍðÝÏõâÔøæÙùæÙúèÚýëÝþìßúçÚóáÔïÜÎðÝÏñÞÐïÜÎë×ÉæÓÅèÕÇðÜÎ÷ãÖðÝÏòßÑñÞÐðÝÏóáÓøåØöãÕôáÓöä×òßÑéÖÈèÔÆóàÒóáÓðÝÏôáÓýêÜþëÝûéÛùæØòßÑðÞÐ÷å×ûéÛõâÔìØÊãÐÂäÑÃëØÊðÝÏùçÙðÝÏë×ÉñÞÐ÷ä×÷å×ýêÜûèÚúçÙôáÔîÛÍñÞÐ÷ä×úçÙúçÙöãÕôàÓôáÓøåØõãÕöâո娸åØöâÔøçØóáÒòàÒ÷å×öå×ðßÐîÝÎôãÕúéÚüëÜúèÚõäÖþðâúêÛùèÙýíÞþïáüëÝûëÝüïáüîß÷æØòàÒðÞÏîÝÎêØÊè×ÉòàÒúèÚùèÚùçÙùèÙþóäÿøéýîßúèÚùéÜýíàÿðâþìÞýëÝþëÝ÷åØñßÑêÖÈëØÊôâÔýìßÿðáþðáúéÛòáÓðÞÏòàÒóâÔõäÖøæØúèÚøéÛ÷çÙúçÚýêÜþìÞùæÙñÞÐéÖÈìØÊíÚÌóàÒõâÕôàÓ÷ä×øåØûéÛûèÛõãÖòßÑóßÑôàÒòÞÐïÜÎðÝÏõâÕûèÛôáÔíÛÍîÛÎúèÛýïâûëÝñÞÐóáÔóàÒìØÊæÒÄäÐÂòÞÐùæØþíàþíßüêÜúèÚûêÜõáÔîÜÎïÝÏóáÓöâÔùçÙüêÜþñãûêÜòßÑñÞÑîÛÎöãÕúçÚóßÑðÝÏöâÕöãÕíÚÌèÕÇëØÊóàÓøå×øä×÷ä×÷ãÖøå×üéÜÿíßöäÖðÝÏêÖÈëØÊóàÒûéÛ÷ä×ôàÒðÝÏòßÑøå×üêÜøåØúçÚûéÛûéÛûèÛúçÚþíßýîàûëÝöå×õäÖ÷çÙùéÛùçÙøæØøæØøæØøæØ÷å×ñßÑòáÓþîßÿóåþïáóâÔîÝÏîÝÏ÷çØûìÝúëÜùéÛ÷æ×øçØùèÙ÷æ×öäÕ÷æØöå×úéÛüìÞýíÞÿðáýîàûïáùëÝ÷å×ùåØüêÜÿîáýîáøçÙðÝÏñÞÐøå×ýíÞøçØõäÖøçØùèÙøæØôãÕðÞÐðÞÐùéÛþñãÿòãúçÚýëÝÿíàþìÞûèÚ÷äÖïÛÎóàÓ÷å×òßÑìÙËîÛÍñÞÐôáÓõâÔôáÓóßÑôàÒðÝÏíÚÌïÜÎ÷äÖøæÙõâÔìÚÌòßÑõãÖóàÓîÜÎë×ÉèÔÆìÚÌðÝÏóßÑñÞÑîÛÍöãÕúèÚúèÛõâÔôáÓ÷ä×þïáþìÞùæÙöâÕùæØýêÜþëÝþëÝûèÛõâÔîÛÍéÖÈãÐÂçÓÅîÚÍóàÓõâÕùæÙ÷ä×ôâÕôáÔøåØüêÜýêÜðÝÏôáÓøä×ùæÙùçÙúèÚøåØóàÒêØÊðÝÏüëÝÿîáõâÔòßÑñÞÐõâÕöä×õãÕõáÔúçÚýëÝüêÜüêÜþëÝÿôæÿ÷èÿôæûêÛüêÜÿòäÿòäýìÝöå×óâÔôãÕöå×úéÚøæ×øæØúéÛûêÜúèÚùéÛñßÐïÝÎøçÙþíÞýíÞýìÞþïàÿòãúéÛîÝÎèÖÈñàÑôãÕøæØøæØöå×øçÙôàÒîÜÎíÛÍõáÓûèÚüêÜûéÛÿñãÿöèýòåýîàþíß÷æØ÷å×ùçÙúèÚõãÕîÜÍóâÔôãÕòáÓïÝÏõãÕýìÞüêÜûèÛùçÚûèÛþìßþïáýóåýìÞ÷å×òßÑñÞÐôáÓóàÒóàÒòÞÐñÞÐòßÑôàÒöãÖóáÔöãÖüêÜûéÛôáÓöãÖ÷ä×óàÒêÖÈêÖÈîÛÍõâÔóàÓôàÒùæÙûéÛûèÚóßÑôàÓóßÒòÞÐõáÓøåØôáÓùåØùæÙóàÒóàÒùæÙýêÜýëÝùæÙùçÙùæØðÞÐõâÔðÝÏíÛÍ÷ãÕùæÙñÞÐîÛÍòßÑøåØûèÛöãÕîÛÍîÜÎíÚÌñÞÐøåØöãÕïÛÍûéÛýëÝûèÛýëÝýëÞ÷ä×ðÝÏðÝÏóßÑùæÙùçÚöä×üêÜýëÝüéÛôâÕòßÑñÞÐúéÚùçØúéÚýìÝþïàþïáùèÙ÷æØõäÖöå×øçÙúèÚýîßþîßöå×ëÙÊïÝÎùéÛýóåÿñâûêÜóâÔïÞÏîÜÎûêÜþïáýìÞøçØùçÙûéÛ÷æØüêÜûêÜöäÖòáÓïÞÐðÝÏóàÒôáÓñÞÐðÝÏòßÑóßÑóàÒöäÖûìÞüîàûéÛøçÙþîßÿïàøæØòáÒðßÐôâÔúéÚüìÝùéÛûìÞÿòäüéÛ÷ãÖðÜÎðÝÏöâÔúéÛôáÓñÝÏìÚÌîÛÍøä×þìßùæÙõâÔòÞÐóàÓ÷ä×úçÚýìßþíßýìÞùçÙ÷ä×÷ä×ýëÞûèÛøäÖöãÕùåØúèÚüéÛúçÚúçÚüêÜûéÛøåØøæØñßÒñÞÐøåØöãÖïÜÎëÙËôáÓúçÙùæÙ÷娸æÙ÷ä×óàÒê×ÉìÙËóßÒòßÑøåØùæÙøåØúçÚùæØòßÑòàÒôâÔ÷ä×úçÚöãÖñÞÐöãÕòàÒóàÓøåØõâÕîÛÍôáÔ÷ä×ûèÚûéÛ÷å×ôáÔüìÞúèÚ÷ãÖôàÒôáÔôáÔõâÔôáÔóáÓôáÓöãÖ÷äÖóáÓñßÑóâÔøçÙøçÙõãÔóâÔõäÖøæØüëÜþîßÿðáÿðáÿñâúéÚëÚËé×ÈîÝÏóâÓúéÚûêÜöäÖôâÔöåÖþîßûêÛóâÔïÞÏ÷æ×üìÝùçÙùçÙòáÒðÞÏòàÒðßÐðÞÐüêÜþíßôáÓðÝÏôáÓòßÑîÜÎëÙËëÙËíÚÌîÛÍúéÛûëÜúéÛ÷å×úéÛþîßÿòäýìÝûëÜüïáýðáûëÝôâÔöãÖ÷ãÖôáÔðÝÏìØÊîÛÍöãÕ÷äÖõâÕùåØûèÚøåØöãÖöãÕúèÚüêÜüéÛòßÒóàÓòßÑïÜÎîÛÍïÜÎóàÓöãÖûèÚüêÝùæÙôâÔðÝÏóàÒöãÖ÷äÖôáÓòÞÐòßÑïÝÏðÞÐ÷ä×öãÖðÞÑìÙËîÛÍòßÑöäÖöäÖôáÓñÞÐîÛÍëØÊíÚÌôáÔúçÚõâÕõáÓõâÔñÞÑïÜÎñÞÐöãÖñÞÐîÛÍñÞÐôâÔöãÖùæÙùæÙ÷ä×óàÓòßÑðÝÏïÜÎîÛÍôàÒõâÔöãÕüìÞÿîàÿíàûéÛôâÕòßÑóàÒñÞÐîÛÍïÜÎõáÓûèÛýëÝ÷å×ùèÙúéÛ÷æØôãÕñàÒûêÛüêÜüëÜýìÝþíÞþíÞþîàýíÞûëÜúéÚ÷æ×öäÖöäÖúéÚþíßýìÝúéÚúèÚüêÜùèÚúéÚùèÙúéÛýíßþíßýìÝøæØúêÛýðâüìÞ÷ä×øå×úçÚúèÚóáÓë×ÉìÙË÷äÖúçÙòßÒîÛÍðÝÏóâÔðßÐñàÑ÷æØûêÜûêÜúëÝõäÖîÜÍêÙÊíÜÍñßÑøåØùæÙøåØôàÓðÝÏìÙËòßÑúçÚüêÜýêÜýêÜ÷å×÷ä×øæÙûéÛþìÞúèÚóáÓñÞÐïÜÎñÞÐúèÚúèÚõâÕïÜÎðÝÏîÜÎêÖÉíÙÌòßÑðÝÏðÝÏîÛÍëÙËîÜÎóáÓóàÒôáÓóàÒîÛÍíÚÌïÜÏôáÓìÙËê×ÉóàÒõâÕðÝÏïÜÎôáÓûëÝúçÙðÝÏîÜÎ
\ No newline at end of file diff --git a/examples/scrollview/scrollview.cpp b/examples/scrollview/scrollview.cpp new file mode 100644 index 000000000..994cd292c --- /dev/null +++ b/examples/scrollview/scrollview.cpp @@ -0,0 +1,441 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qscrollview.h> +#include <qapplication.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qpushbutton.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qmessagebox.h> +#include <qlayout.h> +#include <qlabel.h> +#include <qmultilineedit.h> +#include <qsizegrip.h> +#include <stdlib.h> + + +static const int style_id = 0x1000; +static const int lw_id = 0x2000; +static const int mlw_id = 0x4000; +static const int mw_id = 0x8000; +static const int max_lw = 16; +static const int max_mlw = 5; +static const int max_mw = 10; + + +class BigShrinker : public TQFrame { + Q_OBJECT +public: + BigShrinker(TQWidget* parent) : + TQFrame(parent) + { + setFrameStyle(TQFrame::Box|TQFrame::Sunken); + int h=35; + int b=0; + for (int y=0; y<2000-h; y+=h+10) { + if (y == 0) { + TQButton* q=new TQPushButton("Quit", this); + connect(q, SIGNAL(clicked()), qApp, SLOT(tquit())); + } else { + TQString str; + if ( b > 0 ) { + str.sprintf("Button %d", b++); + } else { + str = "I'm shrinking!"; + ++b; + } + (new TQPushButton(str, this))->move(y/2,y); + } + } + resize(1000,2000); + + startTimer(250); + } + + void timerEvent(TQTimerEvent*) + { + int w=width(); + int h=height(); + if ( w > 50 ) w -= 1; + if ( h > 50 ) h -= 2; + resize(w,h); + } + + void mouseReleaseEvent(TQMouseEvent* e) + { + emit clicked(e->x(), e->y()); + } + +signals: + void clicked(int,int); +}; + +class BigMatrix : public TQScrollView { + TQMultiLineEdit *dragging; +public: + BigMatrix(TQWidget* parent) : + TQScrollView(parent,"matrix", WStaticContents), + bg("bg.ppm") + { + bg.load("bg.ppm"); + resizeContents(400000,300000); + + dragging = 0; + } + + void viewportMousePressEvent(TQMouseEvent* e) + { + int x, y; + viewportToContents( e->x(), e->y(), x, y ); + dragging = new TQMultiLineEdit(viewport(),"Another"); + dragging->setText("Thanks!"); + dragging->resize(100,100); + addChild(dragging, x, y); + showChild(dragging); + } + + void viewportMouseReleaseEvent(TQMouseEvent*) + { + dragging = 0; + } + + void viewportMouseMoveEvent(TQMouseEvent* e) + { + if ( dragging ) { + int mx, my; + viewportToContents( e->x(), e->y(), mx, my ); + int cx = childX(dragging); + int cy = childY(dragging); + int w = mx - cx + 1; + int h = my - cy + 1; + TQString msg; + msg.sprintf("at (%d,%d) %d by %d",cx,cy,w,h); + dragging->setText(msg); + dragging->resize(w,h); + } + } + +protected: + void drawContents(TQPainter* p, int cx, int cy, int cw, int ch) + { + // The Background + if ( !bg.isNull() ) { + int rowheight=bg.height(); + int toprow=cy/rowheight; + int bottomrow=(cy+ch+rowheight-1)/rowheight; + int colwidth=bg.width(); + int leftcol=cx/colwidth; + int rightcol=(cx+cw+colwidth-1)/colwidth; + for (int r=toprow; r<=bottomrow; r++) { + int py=r*rowheight; + for (int c=leftcol; c<=rightcol; c++) { + int px=c*colwidth; + p->drawPixmap(px, py, bg); + } + } + } else { + p->fillRect(cx, cy, cw, ch, TQColor(240,222,208)); + } + + // The Numbers + { + TQFontMetrics fm=p->fontMetrics(); + int rowheight=fm.lineSpacing(); + int toprow=cy/rowheight; + int bottomrow=(cy+ch+rowheight-1)/rowheight; + int colwidth=fm.width("00000,000000 ")+3; + int leftcol=cx/colwidth; + int rightcol=(cx+cw+colwidth-1)/colwidth; + TQString str; + for (int r=toprow; r<=bottomrow; r++) { + int py=r*rowheight; + for (int c=leftcol; c<=rightcol; c++) { + int px=c*colwidth; + str.sprintf("%d,%d",c,r); + p->drawText(px+3, py+fm.ascent(), str); + } + } + + // The Big Hint + if (leftcol<10 && toprow<5) { + p->setFont(TQFont("Charter",30)); + p->setPen(red); + TQString text; + text.sprintf("HINT: Look at %d,%d",215000/colwidth,115000/rowheight); + p->drawText(100,50,text); + } + } + + // The Big X + { + if (cx+cw>200000 && cy+ch>100000 && cx<230000 && cy<130000) { + // Note that some X server cannot even handle co-ordinates + // beyond about 4000, so you might not see this. + p->drawLine(200000,100000,229999,129999); + p->drawLine(229999,100000,200000,129999); + + // X marks the spot! + p->setFont(TQFont("Charter",100)); + p->setPen(blue); + p->drawText(215000-500,115000-100,1000,200,AlignCenter,"YOU WIN!!!!!"); + } + } + } + +private: + TQPixmap bg; +}; + +class ScrollViewExample : public TQWidget { + Q_OBJECT + +public: + ScrollViewExample(int technique, TQWidget* parent=0, const char* name=0) : + TQWidget(parent,name) + { + TQMenuBar* menubar = new TQMenuBar(this); + Q_CHECK_PTR( menubar ); + + TQPopupMenu* file = new TQPopupMenu( menubar ); + Q_CHECK_PTR( file ); + menubar->insertItem( "&File", file ); + file->insertItem( "Quit", qApp, SLOT(tquit()) ); + + vp_options = new TQPopupMenu( menubar ); + Q_CHECK_PTR( vp_options ); + vp_options->setCheckable( TRUE ); + menubar->insertItem( "&ScrollView", vp_options ); + connect( vp_options, SIGNAL(activated(int)), + this, SLOT(doVPMenuItem(int)) ); + + vauto_id = vp_options->insertItem( "Vertical Auto" ); + vaoff_id = vp_options->insertItem( "Vertical AlwaysOff" ); + vaon_id = vp_options->insertItem( "Vertical AlwaysOn" ); + vp_options->insertSeparator(); + hauto_id = vp_options->insertItem( "Horizontal Auto" ); + haoff_id = vp_options->insertItem( "Horizontal AlwaysOff" ); + haon_id = vp_options->insertItem( "Horizontal AlwaysOn" ); + vp_options->insertSeparator(); + corn_id = vp_options->insertItem( "cornerWidget" ); + + if (technique == 1) { + vp = new TQScrollView(this); + BigShrinker *bs = new BigShrinker(0);//(vp->viewport()); + vp->addChild(bs); + bs->setAcceptDrops(TRUE); + TQObject::connect(bs, SIGNAL(clicked(int,int)), + vp, SLOT(center(int,int))); + } else { + vp = new BigMatrix(this); + if ( technique == 3 ) + vp->enableClipper(TRUE); + srand(1); + for (int i=0; i<30; i++) { + TQMultiLineEdit *l = new TQMultiLineEdit(vp->viewport(),"First"); + l->setText("Drag out more of these."); + l->resize(100,100); + vp->addChild(l, rand()%800, rand()%10000); + } + vp->viewport()->setBackgroundMode(NoBackground); + } + + f_options = new TQPopupMenu( menubar ); + Q_CHECK_PTR( f_options ); + f_options->setCheckable( TRUE ); + menubar->insertItem( "F&rame", f_options ); + connect( f_options, SIGNAL(activated(int)), + this, SLOT(doFMenuItem(int)) ); + + f_options->insertItem( "No Frame", style_id ); + f_options->insertItem( "Box", style_id|TQFrame::Box ); + f_options->insertItem( "Panel", style_id|TQFrame::Panel ); + f_options->insertItem( "WinPanel", style_id|TQFrame::WinPanel ); + f_options->insertSeparator(); + f_options->insertItem( "Plain", style_id|TQFrame::Plain ); + f_options->insertItem( "Raised", style_id|TQFrame::Raised ); + f_laststyle = f_options->indexOf( + f_options->insertItem( "Sunken", style_id|TQFrame::Sunken )); + f_options->insertSeparator(); + lw_options = new TQPopupMenu( menubar ); + Q_CHECK_PTR( lw_options ); + lw_options->setCheckable( TRUE ); + for (int lw = 1; lw <= max_lw; lw++) { + TQString str; + str.sprintf("%d Pixels", lw); + lw_options->insertItem( str, lw_id | lw ); + } + f_options->insertItem( "Line Width", lw_options ); + connect( lw_options, SIGNAL(activated(int)), + this, SLOT(doFMenuItem(int)) ); + mlw_options = new TQPopupMenu( menubar ); + Q_CHECK_PTR( mlw_options ); + mlw_options->setCheckable( TRUE ); + for (int mlw = 0; mlw <= max_mlw; mlw++) { + TQString str; + str.sprintf("%d Pixels", mlw); + mlw_options->insertItem( str, mlw_id | mlw ); + } + f_options->insertItem( "Midline Width", mlw_options ); + connect( mlw_options, SIGNAL(activated(int)), + this, SLOT(doFMenuItem(int)) ); + mw_options = new TQPopupMenu( menubar ); + Q_CHECK_PTR( mw_options ); + mw_options->setCheckable( TRUE ); + for (int mw = 0; mw <= max_mw; mw++) { + TQString str; + str.sprintf("%d Pixels", mw); + mw_options->insertItem( str, mw_id | mw ); + } + f_options->insertItem( "Margin Width", mw_options ); + connect( mw_options, SIGNAL(activated(int)), + this, SLOT(doFMenuItem(int)) ); + + setVPMenuItems(); + setFMenuItems(); + + TQVBoxLayout* vbox = new TQVBoxLayout(this); + vbox->setMenuBar(menubar); + menubar->setSeparator(TQMenuBar::InWindowsStyle); + vbox->addWidget(vp); + vbox->activate(); + + corner = new TQSizeGrip(this); + corner->hide(); + } + +private slots: + void doVPMenuItem(int id) + { + if (id == vauto_id ) { + vp->setVScrollBarMode(TQScrollView::Auto); + } else if (id == vaoff_id) { + vp->setVScrollBarMode(TQScrollView::AlwaysOff); + } else if (id == vaon_id) { + vp->setVScrollBarMode(TQScrollView::AlwaysOn); + } else if (id == hauto_id) { + vp->setHScrollBarMode(TQScrollView::Auto); + } else if (id == haoff_id) { + vp->setHScrollBarMode(TQScrollView::AlwaysOff); + } else if (id == haon_id) { + vp->setHScrollBarMode(TQScrollView::AlwaysOn); + } else if (id == corn_id) { + bool corn = !vp->cornerWidget(); + vp->setCornerWidget(corn ? corner : 0); + } else { + return; // Not for us to process. + } + setVPMenuItems(); + } + + void setVPMenuItems() + { + TQScrollView::ScrollBarMode vm = vp->vScrollBarMode(); + vp_options->setItemChecked( vauto_id, vm == TQScrollView::Auto ); + vp_options->setItemChecked( vaoff_id, vm == TQScrollView::AlwaysOff ); + vp_options->setItemChecked( vaon_id, vm == TQScrollView::AlwaysOn ); + + TQScrollView::ScrollBarMode hm = vp->hScrollBarMode(); + vp_options->setItemChecked( hauto_id, hm == TQScrollView::Auto ); + vp_options->setItemChecked( haoff_id, hm == TQScrollView::AlwaysOff ); + vp_options->setItemChecked( haon_id, hm == TQScrollView::AlwaysOn ); + + vp_options->setItemChecked( corn_id, !!vp->cornerWidget() ); + } + + void doFMenuItem(int id) + { + if (id & style_id) { + int sty; + + if (id == style_id) { + sty = 0; + } else if (id & TQFrame::MShape) { + sty = vp->frameStyle()&TQFrame::MShadow; + sty = (sty ? sty : TQFrame::Plain) | (id&TQFrame::MShape); + } else { + sty = vp->frameStyle()&TQFrame::MShape; + sty = (sty ? sty : TQFrame::Box) | (id&TQFrame::MShadow); + } + vp->setFrameStyle(sty); + } else if (id & lw_id) { + vp->setLineWidth(id&~lw_id); + } else if (id & mlw_id) { + vp->setMidLineWidth(id&~mlw_id); + } else { + vp->setMargin(id&~mw_id); + } + + vp->update(); + setFMenuItems(); + } + + void setFMenuItems() + { + int sty = vp->frameStyle(); + + f_options->setItemChecked( style_id, !sty ); + + for (int i=1; i <= f_laststyle; i++) { + int id = f_options->idAt(i); + if (id & TQFrame::MShape) + f_options->setItemChecked( id, + ((id&TQFrame::MShape) == (sty&TQFrame::MShape)) ); + else + f_options->setItemChecked( id, + ((id&TQFrame::MShadow) == (sty&TQFrame::MShadow)) ); + } + + for (int lw=1; lw<=max_lw; lw++) + lw_options->setItemChecked( lw_id|lw, vp->lineWidth() == lw ); + + for (int mlw=0; mlw<=max_mlw; mlw++) + mlw_options->setItemChecked( mlw_id|mlw, vp->midLineWidth() == mlw ); + + for (int mw=0; mw<=max_mw; mw++) + mw_options->setItemChecked( mw_id|mw, vp->margin() == mw ); + } + +private: + TQScrollView* vp; + TQPopupMenu* vp_options; + TQPopupMenu* f_options; + TQPopupMenu* lw_options; + TQPopupMenu* mlw_options; + TQPopupMenu* mw_options; + TQSizeGrip* corner; + + int vauto_id, vaoff_id, vaon_id, + hauto_id, haoff_id, haon_id, + corn_id; + + int f_laststyle; +}; + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + ScrollViewExample ve1(1,0,"ve1"); + ScrollViewExample ve2(2,0,"ve2"); + ScrollViewExample ve3(3,0,"ve3"); + ve1.setCaption("TQt Example - Scrollviews"); + ve1.show(); + ve2.setCaption("TQt Example - Scrollviews"); + ve2.show(); + ve3.setCaption("TQt Example - Scrollviews"); + ve3.show(); + + TQObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit())); + + return a.exec(); +} + +#include "scrollview.moc" diff --git a/examples/scrollview/scrollview.doc b/examples/scrollview/scrollview.doc new file mode 100644 index 000000000..48989f42e --- /dev/null +++ b/examples/scrollview/scrollview.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page scrollview-example.html + + \ingroup examples + \title Scrollview + + This example shows how to use Qt's scrollview. This is a widget + optimized for very large contents. + + <hr> + + Implementation: + + \include scrollview/scrollview.cpp +*/ + diff --git a/examples/scrollview/scrollview.pro b/examples/scrollview/scrollview.pro new file mode 100644 index 000000000..2203f4b0f --- /dev/null +++ b/examples/scrollview/scrollview.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = scrollview + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = +SOURCES = scrollview.cpp diff --git a/examples/showimg/README b/examples/showimg/README new file mode 100644 index 000000000..a6c9ca982 --- /dev/null +++ b/examples/showimg/README @@ -0,0 +1,14 @@ +This example demonstrates how to read in and display images, and the +conversion facilities available. The CuteWidget can read a file into +a pixmap and resizes the displayed pixmap when the widget is resized. + +Note that the function CuteWidget::paintEvent uses the drawPixmap function +of QPainter to display the pixmap, the bitBlt function can also be used to +display pixmaps. + +If you have installed the Qt imageio extension (see extensions/imageio +in your Qt directory), you can build using that extension. + +Some of the conversion options will have no effect, depending on the +display hardware used. Generally, these are disabled. + diff --git a/examples/showimg/imagefip.cpp b/examples/showimg/imagefip.cpp new file mode 100644 index 000000000..418b612c2 --- /dev/null +++ b/examples/showimg/imagefip.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "imagefip.h" +#include <qimage.h> + +/* XPM */ +static const char *image_xpm[] = { +"17 15 9 1", +" c #7F7F7F", +". c #FFFFFF", +"X c #00B6FF", +"o c #BFBFBF", +"O c #FF6C00", +"+ c #000000", +"@ c #0000FF", +"# c #6CFF00", +"$ c #FFB691", +" ..XX", +" ........o .XXX", +" .OOOOOOOo. XXX+", +" .O@@@@@@+++XXX++", +" .O@@@@@@O.XXX+++", +" .O@@@@@@OXXX+++.", +" .O######XXX++...", +" .O#####XXX++....", +" .O##$#$XX+o+....", +" .O#$$$$$+.o+....", +" .O##$$##O.o+....", +" .OOOOOOOO.o+....", +" ..........o+....", +" ooooooooooo+....", +"+++++++++++++...." +}; + +ImageIconProvider::ImageIconProvider( TQWidget *parent, const char *name ) : + TQFileIconProvider( parent, name ), + imagepm(image_xpm) +{ + fmts = TQImage::inputFormats(); +} + +ImageIconProvider::~ImageIconProvider() +{ +} + +const TQPixmap * ImageIconProvider::pixmap( const TQFileInfo &fi ) +{ + TQString ext = fi.extension().upper(); + if ( fmts.contains(ext) ) { + return &imagepm; + } else { + return TQFileIconProvider::pixmap(fi); + } +} diff --git a/examples/showimg/imagefip.h b/examples/showimg/imagefip.h new file mode 100644 index 000000000..3537f9420 --- /dev/null +++ b/examples/showimg/imagefip.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef IMAGEFIP_H +#define IMAGEFIP_H + +#include <qfiledialog.h> +#include <qstrlist.h> +#include <qpixmap.h> + +class ImageIconProvider : public TQFileIconProvider +{ + Q_OBJECT + TQStrList fmts; + TQPixmap imagepm; + +public: + ImageIconProvider( TQWidget *parent=0, const char *name=0 ); + ~ImageIconProvider(); + + const TQPixmap * pixmap( const TQFileInfo &fi ); +}; + + +#endif // IMAGEFIP_H diff --git a/examples/showimg/imagetexteditor.cpp b/examples/showimg/imagetexteditor.cpp new file mode 100644 index 000000000..464f85d9c --- /dev/null +++ b/examples/showimg/imagetexteditor.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "imagetexteditor.h" +#include <qimage.h> +#include <qlayout.h> +#include <qgrid.h> +#include <qvbox.h> +#include <qhbox.h> +#include <qcombobox.h> +#include <qmultilineedit.h> +#include <qlabel.h> +#include <qlineedit.h> +#include <qlistbox.h> +#include <qpushbutton.h> + + +ImageTextEditor::ImageTextEditor( TQImage& i, TQWidget *parent, const char *name, WFlags f ) : + TQDialog(parent,name,TRUE,f), + image(i) +{ + TQVBoxLayout* vbox = new TQVBoxLayout(this,8); + vbox->setAutoAdd(TRUE); + + TQGrid* controls = new TQGrid(3,TQGrid::Horizontal,this); + controls->setSpacing(8); + TQLabel* l; + l=new TQLabel("Language",controls); l->setAlignment(AlignCenter); + l=new TQLabel("Key",controls); l->setAlignment(AlignCenter); + (void)new TQLabel("",controls); // dummy + languages = new TQComboBox(controls); + keys = new TQComboBox(controls); + TQPushButton* remove = new TQPushButton("Remove",controls); + + newlang = new TQLineEdit(controls); + newkey = new TQLineEdit(controls); + TQPushButton* add = new TQPushButton("Add",controls); + + text = new TQMultiLineEdit(this); + + TQHBox* hbox = new TQHBox(this); + TQPushButton* cancel = new TQPushButton("Cancel",hbox); + TQPushButton* ok = new TQPushButton("OK",hbox); + + connect(add,SIGNAL(clicked()), + this,SLOT(addText())); + + connect(remove,SIGNAL(clicked()), + this,SLOT(removeText())); + + connect(ok,SIGNAL(clicked()), + this,SLOT(accept())); + + connect(cancel,SIGNAL(clicked()), + this,SLOT(reject())); + + connect(languages,SIGNAL(activated(int)), + this,SLOT(updateText())); + + connect(keys,SIGNAL(activated(int)), + this,SLOT(updateText())); + + imageChanged(); +} + +ImageTextEditor::~ImageTextEditor() +{ +} + +void ImageTextEditor::imageChanged() +{ + languages->clear(); + keys->clear(); + text->clear(); + languages->insertItem("<any>"); + + languages->insertStringList(image.textLanguages()); + keys->insertStringList(image.textKeys()); + + updateText(); +} + +void ImageTextEditor::accept() +{ + storeText(); + TQDialog::accept(); +} + +void ImageTextEditor::updateText() +{ + storeText(); + newlang->setText(languages->currentText()); + newkey->setText(keys->currentText()); + TQString t = image.text(currKey(),currLang()); + + text->setText(t); +} + +TQString ImageTextEditor::currKey() +{ + return newkey->text(); +} + +TQString ImageTextEditor::currLang() +{ + TQString l = newlang->text(); + if ( l=="<any>" ) + l = TQString::null; + return l; +} + +TQString ImageTextEditor::currText() +{ + TQString t = text->text(); + if ( t.isNull() ) t = ""; + return t; +} + + +void ImageTextEditor::removeText() +{ + image.setText(currKey(),currLang(),TQString::null); +} + +void ImageTextEditor::addText() +{ + storeText(); +} + +void ImageTextEditor::storeText() +{ + if ( currKey().length() > 0 ) { + image.setText(currKey(),currLang(),currText()); + } +} diff --git a/examples/showimg/imagetexteditor.h b/examples/showimg/imagetexteditor.h new file mode 100644 index 000000000..e33b6e70f --- /dev/null +++ b/examples/showimg/imagetexteditor.h @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef IMAGETEXTEDITOR_H +#define IMAGETEXTEDITOR_H + +#include <qdialog.h> + +class TQImage; +class TQComboBox; +class TQListBox; +class TQLineEdit; +class TQMultiLineEdit; + +class ImageTextEditor : public TQDialog +{ + Q_OBJECT +public: + ImageTextEditor( TQImage& i, TQWidget *parent=0, const char *name=0, WFlags f=0 ); + ~ImageTextEditor(); + void accept(); +public slots: + void imageChanged(); + void updateText(); + void addText(); + void removeText(); +private: + void storeText(); + TQImage& image; + TQComboBox* languages; + TQComboBox* keys; + TQMultiLineEdit* text; + TQLineEdit* newlang; + TQLineEdit* newkey; + TQString currKey(); + TQString currLang(); + TQString currText(); +}; + +#endif // IMAGETEXTEDITOR_H diff --git a/examples/showimg/main.cpp b/examples/showimg/main.cpp new file mode 100644 index 000000000..213b91216 --- /dev/null +++ b/examples/showimg/main.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "showimg.h" +#include "imagefip.h" +#include <qapplication.h> +#include <qimage.h> + +int main( int argc, char **argv ) +{ + if ( argc > 1 && TQString(argv[1]) == "-m" ) { + TQApplication::setColorSpec( TQApplication::ManyColor ); + argc--; + argv++; + } + else if ( argc > 1 && TQString(argv[1]) == "-n" ) { + TQApplication::setColorSpec( TQApplication::NormalColor ); + argc--; + argv++; + } + else { + TQApplication::setColorSpec( TQApplication::CustomColor ); + } + + TQApplication a( argc, argv ); + + ImageIconProvider iip; + TQFileDialog::setIconProvider( &iip ); + + if ( argc <= 1 ) { + // Create a window which looks after its own existence. + ImageViewer *w = + new ImageViewer(0, "new window", TQt::WDestructiveClose | TQt::WResizeNoErase ); + w->setCaption("TQt Example - Image Viewer"); + w->show(); + } else { + for ( int i=1; i<argc; i++ ) { + // Create a window which looks after its own existence. + ImageViewer *w = + new ImageViewer(0, argv[i], TQt::WDestructiveClose | TQt::WResizeNoErase ); + w->setCaption("TQt Example - Image Viewer"); + w->loadImage( argv[i] ); + w->show(); + } + } + + TQObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit())); + + return a.exec(); +} diff --git a/examples/showimg/showimg.cpp b/examples/showimg/showimg.cpp new file mode 100644 index 000000000..905f8184a --- /dev/null +++ b/examples/showimg/showimg.cpp @@ -0,0 +1,672 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "showimg.h" +#include "imagetexteditor.h" +#include <qmenubar.h> +#include <qfiledialog.h> +#include <qmessagebox.h> +#include <qpopupmenu.h> +#include <qlabel.h> +#include <qpainter.h> +#include <qapplication.h> +#include <qclipboard.h> + + +/* + In the constructor, we just pass the standard parameters on to + TQWidget. + + The menu uses a single slot to simplify the process of adding + more items to the options menu. +*/ +ImageViewer::ImageViewer( TQWidget *parent, const char *name, int wFlags ) + : TQWidget( parent, name, wFlags ), + conversion_flags( PreferDither ), + helpmsg( 0 ) +{ + pickx = -1; + picky = -1; + clickx = -1; + clicky = -1; + alloc_context = 0; + + menubar = new TQMenuBar(this); + menubar->setSeparator( TQMenuBar::InWindowsStyle ); + + TQStrList fmt = TQImage::outputFormats(); + saveimage = new TQPopupMenu( menubar ); + savepixmap = new TQPopupMenu( menubar ); + for (const char* f = fmt.first(); f; f = fmt.next()) { + saveimage->insertItem( f ); + savepixmap->insertItem( f ); + } + connect( saveimage, SIGNAL(activated(int)), this, SLOT(saveImage(int)) ); + connect( savepixmap, SIGNAL(activated(int)), this, SLOT(savePixmap(int)) ); + + file = new TQPopupMenu( menubar ); + menubar->insertItem( "&File", file ); + file->insertItem( "&New window", this, SLOT(newWindow()), CTRL+Key_N ); + file->insertItem( "&Open...", this, SLOT(openFile()), CTRL+Key_O ); + si = file->insertItem( "Save image", saveimage ); + sp = file->insertItem( "Save pixmap", savepixmap ); + file->insertSeparator(); + file->insertItem( "E&xit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + edit = new TQPopupMenu( menubar ); + menubar->insertItem( "&Edit", edit ); + edit->insertItem("&Copy", this, SLOT(copy()), CTRL+Key_C); + edit->insertItem("&Paste", this, SLOT(paste()), CTRL+Key_V); + edit->insertSeparator(); + edit->insertItem("&Horizontal flip", this, SLOT(hFlip()), ALT+Key_H); + edit->insertItem("&Vertical flip", this, SLOT(vFlip()), ALT+Key_V); + edit->insertItem("&Rotate 180", this, SLOT(rot180()), ALT+Key_R); + edit->insertSeparator(); + edit->insertItem("&Text...", this, SLOT(editText())); + edit->insertSeparator(); + t1 = edit->insertItem( "Convert to &1 bit", this, SLOT(to1Bit()) ); + t8 = edit->insertItem( "Convert to &8 bit", this, SLOT(to8Bit()) ); + t32 = edit->insertItem( "Convert to &32 bit", this, SLOT(to32Bit()) ); + + options = new TQPopupMenu( menubar ); + menubar->insertItem( "&Options", options ); + ac = options->insertItem( "AutoColor" ); + co = options->insertItem( "ColorOnly" ); + mo = options->insertItem( "MonoOnly" ); + options->insertSeparator(); + fd = options->insertItem( "DiffuseDither" ); + bd = options->insertItem( "OrderedDither" ); + td = options->insertItem( "ThresholdDither" ); + options->insertSeparator(); + ta = options->insertItem( "ThresholdAlphaDither" ); + ba = options->insertItem( "OrderedAlphaDither" ); + fa = options->insertItem( "DiffuseAlphaDither" ); + options->insertSeparator(); + ad = options->insertItem( "PreferDither" ); + dd = options->insertItem( "AvoidDither" ); + options->insertSeparator(); + ss = options->insertItem( "Smooth scaling" ); + cc = options->insertItem( "Use color context" ); + if ( TQApplication::colorSpec() == TQApplication::ManyColor ) + options->setItemEnabled( cc, FALSE ); + options->setCheckable( TRUE ); + setMenuItemFlags(); + + menubar->insertSeparator(); + + TQPopupMenu* help = new TQPopupMenu( menubar ); + menubar->insertItem( "&Help", help ); + help->insertItem( "Help!", this, SLOT(giveHelp()), CTRL+Key_H ); + + connect( options, SIGNAL(activated(int)), this, SLOT(doOption(int)) ); + + status = new TQLabel(this); + status->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); + status->setFixedHeight( fontMetrics().height() + 4 ); + + setMouseTracking( TRUE ); +} + +ImageViewer::~ImageViewer() +{ + if ( alloc_context ) + TQColor::destroyAllocContext( alloc_context ); + if ( other == this ) + other = 0; +} + +/* + This function modifies the conversion_flags when an options menu item + is selected, then ensures all menu items are up to date, and reconverts + the image if possibly necessary. +*/ +void ImageViewer::doOption(int item) +{ + if ( item == ss || item == cc ) { + // Toggle + bool newbool = !options->isItemChecked(item); + options->setItemChecked(item, newbool); + // And reconvert... + reconvertImage(); + repaint(image.hasAlphaBuffer()); // show image in widget + return; + } + + if ( options->isItemChecked( item ) ) return; // They are all radio buttons + + int ocf = conversion_flags; + + if ( item == ac ) { + conversion_flags = ( conversion_flags & ~ColorMode_Mask ) | AutoColor; + } else if ( item == co ) { + conversion_flags = ( conversion_flags & ~ColorMode_Mask ) | ColorOnly; + } else if ( item == mo ) { + conversion_flags = ( conversion_flags & ~ColorMode_Mask ) | MonoOnly; + } else if ( item == fd ) { + conversion_flags = ( conversion_flags & ~Dither_Mask ) | DiffuseDither; + } else if ( item == bd ) { + conversion_flags = ( conversion_flags & ~Dither_Mask ) | OrderedDither; + } else if ( item == td ) { + conversion_flags = ( conversion_flags & ~Dither_Mask ) | ThresholdDither; + } else if ( item == ta ) { + conversion_flags = ( conversion_flags & ~AlphaDither_Mask ) | ThresholdAlphaDither; + } else if ( item == fa ) { + conversion_flags = ( conversion_flags & ~AlphaDither_Mask ) | DiffuseAlphaDither; + } else if ( item == ba ) { + conversion_flags = ( conversion_flags & ~AlphaDither_Mask ) | OrderedAlphaDither; + } else if ( item == ad ) { + conversion_flags = ( conversion_flags & ~DitherMode_Mask ) | PreferDither; + } else if ( item == dd ) { + conversion_flags = ( conversion_flags & ~DitherMode_Mask ) | AvoidDither; + } + + if ( ocf != conversion_flags ) { + setMenuItemFlags(); + // And reconvert... + reconvertImage(); + repaint(image.hasAlphaBuffer()); // show image in widget + } +} + +/* + Set the options menu to reflect the conversion_flags value. +*/ +void ImageViewer::setMenuItemFlags() +{ + // File + bool valid_image = pm.size() != TQSize( 0, 0 ); + file->setItemEnabled( si, valid_image ); + file->setItemEnabled( sp, valid_image ); + + // Edit + edit->setItemEnabled( t1, image.depth() != 1 ); + edit->setItemEnabled( t8, image.depth() != 8 ); + edit->setItemEnabled( t32, image.depth() != 32 ); + + // Options + bool may_need_color_dithering = + !valid_image + || image.depth() == 32 && TQPixmap::defaultDepth() < 24; + bool may_need_dithering = may_need_color_dithering + || image.depth() > 1 && options->isItemChecked(mo) + || image.depth() > 1 && TQPixmap::defaultDepth() == 1; + bool has_alpha_mask = !valid_image || image.hasAlphaBuffer(); + + options->setItemEnabled( fd, may_need_dithering ); + options->setItemEnabled( bd, may_need_dithering ); + options->setItemEnabled( td, may_need_dithering ); + + options->setItemEnabled( ta, has_alpha_mask ); + options->setItemEnabled( fa, has_alpha_mask ); + options->setItemEnabled( ba, has_alpha_mask ); + + options->setItemEnabled( ad, may_need_color_dithering ); + options->setItemEnabled( dd, may_need_color_dithering ); + + options->setItemChecked( ac, (conversion_flags & ColorMode_Mask) == AutoColor ); + options->setItemChecked( co, (conversion_flags & ColorMode_Mask) == ColorOnly ); + options->setItemChecked( mo, (conversion_flags & ColorMode_Mask) == MonoOnly ); + options->setItemChecked( fd, (conversion_flags & Dither_Mask) == DiffuseDither ); + options->setItemChecked( bd, (conversion_flags & Dither_Mask) == OrderedDither ); + options->setItemChecked( td, (conversion_flags & Dither_Mask) == ThresholdDither ); + options->setItemChecked( ta, (conversion_flags & AlphaDither_Mask) == ThresholdAlphaDither ); + options->setItemChecked( fa, (conversion_flags & AlphaDither_Mask) == DiffuseAlphaDither ); + options->setItemChecked( ba, (conversion_flags & AlphaDither_Mask) == OrderedAlphaDither ); + options->setItemChecked( ad, (conversion_flags & DitherMode_Mask) == PreferDither ); + options->setItemChecked( dd, (conversion_flags & DitherMode_Mask) == AvoidDither ); +} + +void ImageViewer::updateStatus() +{ + if ( pm.size() == TQSize( 0, 0 ) ) { + if ( !filename.isEmpty() ) + status->setText("Could not load image"); + else + status->setText("No image - select Open from File menu."); + } else { + TQString message, moremsg; + message.sprintf("%dx%d", image.width(), image.height()); + if ( pm.size() != pmScaled.size() ) { + moremsg.sprintf(" [%dx%d]", pmScaled.width(), + pmScaled.height()); + message += moremsg; + } + moremsg.sprintf(", %d bits ", image.depth()); + message += moremsg; + if (image.valid(pickx,picky)) { + moremsg.sprintf("(%d,%d)=#%0*x ", + pickx, picky, + image.hasAlphaBuffer() ? 8 : 6, + image.pixel(pickx,picky)); + message += moremsg; + } + if ( image.numColors() > 0 ) { + if (image.valid(pickx,picky)) { + moremsg.sprintf(", %d/%d colors", image.pixelIndex(pickx,picky), + image.numColors()); + } else { + moremsg.sprintf(", %d colors", image.numColors()); + } + message += moremsg; + } + if ( image.hasAlphaBuffer() ) { + if ( image.depth() == 8 ) { + int i; + bool alpha[256]; + int nalpha=0; + + for (i=0; i<256; i++) + alpha[i] = FALSE; + + for (i=0; i<image.numColors(); i++) { + int alevel = image.color(i) >> 24; + if (!alpha[alevel]) { + alpha[alevel] = TRUE; + nalpha++; + } + } + moremsg.sprintf(", %d alpha levels", nalpha); + } else { + // Too many pixels to bother counting. + moremsg = ", 8-bit alpha channel"; + } + message += moremsg; + } + status->setText(message); + } +} + +/* + This function saves the image. +*/ +void ImageViewer::saveImage( int item ) +{ + const char* fmt = saveimage->text(item); + TQString savefilename = TQFileDialog::getSaveFileName(TQString::null, TQString::null, + this, filename); + if ( !savefilename.isEmpty() ) + if ( !image.save( savefilename, fmt ) ) + TQMessageBox::warning( this, "Save failed", "Error saving file" ); +} + +/* + This function saves the converted image. +*/ +void ImageViewer::savePixmap( int item ) +{ + const char* fmt = savepixmap->text(item); + TQString savefilename = TQFileDialog::getSaveFileName(TQString::null, + TQString::null, this, filename); + if ( !savefilename.isEmpty() ) + if ( !pmScaled.save( savefilename, fmt ) ) + TQMessageBox::warning( this, "Save failed", "Error saving file" ); +} + + +void ImageViewer::newWindow() +{ + ImageViewer* that = new ImageViewer(0, "new window", WDestructiveClose); + that->options->setItemChecked( that->cc, useColorContext() ); + that->show(); +} + +/* + This function is the slot for processing the Open menu item. +*/ +void ImageViewer::openFile() +{ + TQString newfilename = TQFileDialog::getOpenFileName( TQString::null, + TQString::null, + this ); + if ( !newfilename.isEmpty() ) { + loadImage( newfilename ) ; + repaint(); // show image in widget + } +} + +/* + This function loads an image from a file and resizes the widget to + exactly fit the image size. If the file was not found or the image + format was unknown it will resize the widget to fit the errorText + message (see above) displayed in the current font. + + Returns TRUE if the image was successfully loaded. +*/ + +bool ImageViewer::loadImage( const TQString& fileName ) +{ + filename = fileName; + bool ok = FALSE; + if ( !filename.isEmpty() ) { + TQApplication::setOverrideCursor( waitCursor ); // this might take time + ok = image.load(filename, 0); + pickx = -1; + clickx = -1; + if ( ok ) + ok = reconvertImage(); + if ( ok ) { + setCaption( filename ); // set window caption + int w = pm.width(); + int h = pm.height(); + + const int reasonable_width = 128; + if ( w < reasonable_width ) { + // Integer scale up to something reasonable + int multiply = ( reasonable_width + w - 1 ) / w; + w *= multiply; + h *= multiply; + } + + h += menubar->heightForWidth(w) + status->height(); + resize( w, h ); // we resize to fit image + } else { + pm.resize(0,0); // couldn't load image + update(); + } + TQApplication::restoreOverrideCursor(); // restore original cursor + } + updateStatus(); + setMenuItemFlags(); + return ok; +} + +bool ImageViewer::reconvertImage() +{ + bool success = FALSE; + + if ( image.isNull() ) return FALSE; + + if ( alloc_context ) { + TQColor::destroyAllocContext( alloc_context ); + alloc_context = 0; + } + if ( useColorContext() ) { + alloc_context = TQColor::enterAllocContext(); + // Clear the image to hide flickering palette + TQPainter painter(this); + painter.eraseRect(0, menubar->heightForWidth( width() ), width(), height()); + } + + TQApplication::setOverrideCursor( waitCursor ); // this might take time + if ( pm.convertFromImage(image, conversion_flags) ) + { + pmScaled = TQPixmap(); + scale(); + resize( width(), height() ); + success = TRUE; // load successful + } else { + pm.resize(0,0); // couldn't load image + } + updateStatus(); + setMenuItemFlags(); + TQApplication::restoreOverrideCursor(); // restore original cursor + + if ( useColorContext() ) + TQColor::leaveAllocContext(); + + return success; // TRUE if loaded OK +} + +bool ImageViewer::smooth() const +{ + return options->isItemChecked(ss); +} + +bool ImageViewer::useColorContext() const +{ + return options->isItemChecked(cc); +} + +/* + This functions scales the pixmap in the member variable "pm" to fit the + widget size and puts the resulting pixmap in the member variable "pmScaled". +*/ + +void ImageViewer::scale() +{ + int h = height() - menubar->heightForWidth( width() ) - status->height(); + + if ( image.isNull() ) return; + + TQApplication::setOverrideCursor( waitCursor ); // this might take time + if ( width() == pm.width() && h == pm.height() ) + { // no need to scale if widget + pmScaled = pm; // size equals pixmap size + } else { + if (smooth()) { + pmScaled.convertFromImage(image.smoothScale(width(), h), + conversion_flags); + } else { + TQWMatrix m; // transformation matrix + m.scale(((double)width())/pm.width(),// define scale factors + ((double)h)/pm.height()); + pmScaled = pm.xForm( m ); // create scaled pixmap + } + } + TQApplication::restoreOverrideCursor(); // restore original cursor +} + +/* + The resize event handler, if a valid pixmap was loaded it will call + scale() to fit the pixmap to the new widget size. +*/ + +void ImageViewer::resizeEvent( TQResizeEvent * ) +{ + status->setGeometry(0, height() - status->height(), + width(), status->height()); + + if ( pm.size() == TQSize( 0, 0 ) ) // we couldn't load the image + return; + + int h = height() - menubar->heightForWidth( width() ) - status->height(); + if ( width() != pmScaled.width() || h != pmScaled.height()) + { // if new size, + scale(); // scale pmScaled to window + updateStatus(); + } + if ( image.hasAlphaBuffer() ) + erase(); +} + +bool ImageViewer::convertEvent( TQMouseEvent* e, int& x, int& y) +{ + if ( pm.size() != TQSize( 0, 0 ) ) { + int h = height() - menubar->heightForWidth( width() ) - status->height(); + int nx = e->x() * image.width() / width(); + int ny = (e->y()-menubar->heightForWidth( width() )) * image.height() / h; + if (nx != x || ny != y ) { + x = nx; + y = ny; + updateStatus(); + return TRUE; + } + } + return FALSE; +} + +void ImageViewer::mousePressEvent( TQMouseEvent *e ) +{ + may_be_other = convertEvent(e, clickx, clicky); +} + +void ImageViewer::mouseReleaseEvent( TQMouseEvent * ) +{ + if ( may_be_other ) + other = this; +} + +/* + Record the pixel position of interest. +*/ +void ImageViewer::mouseMoveEvent( TQMouseEvent *e ) +{ + if (convertEvent(e,pickx,picky)) { + updateStatus(); + if ((e->state()&LeftButton)) { + may_be_other = FALSE; + if ( clickx >= 0 && other) { + copyFrom(other); + } + } + } +} + +/* + Draws the portion of the scaled pixmap that needs to be updated or prints + an error message if no legal pixmap has been loaded. +*/ + +void ImageViewer::paintEvent( TQPaintEvent *e ) +{ + if ( pm.size() != TQSize( 0, 0 ) ) { // is an image loaded? + TQPainter painter(this); + painter.setClipRect(e->rect()); + painter.drawPixmap(0, menubar->heightForWidth( width() ), pmScaled); + } +} + + +/* + Explain anything that might be confusing. +*/ +void ImageViewer::giveHelp() +{ + if (!helpmsg) { + TQString helptext = + "<b>Usage:</b> <tt>showimg [-m] <i>filename ...</i></tt>" + "<blockquote>" + "<tt>-m</tt> - use <i>ManyColor</i> color spec" + "</blockquote>" + "<p>Supported input formats:" + "<blockquote>"; + helptext += TQImage::inputFormatList().join(", "); + helptext += "</blockquote>"; + + helpmsg = new TQMessageBox( "Help", helptext, + TQMessageBox::Information, TQMessageBox::Ok, 0, 0, 0, 0, FALSE ); + } + helpmsg->show(); + helpmsg->raise(); +} + +void ImageViewer::copyFrom(ImageViewer* s) +{ + if ( clickx >= 0 ) { + int dx = clickx; + int dy = clicky; + int sx = s->clickx; + int sy = s->clicky; + int sw = TQABS(clickx - pickx)+1; + int sh = TQABS(clicky - picky)+1; + if ( clickx > pickx ) { + dx = pickx; + sx -= sw-1; + } + if ( clicky > picky ) { + dy = picky; + sy -= sh-1; + } + bitBlt( &image, dx, dy, &s->image, sx, sy, sw, sh ); + reconvertImage(); + repaint( image.hasAlphaBuffer() ); + } +} +ImageViewer* ImageViewer::other = 0; + +void ImageViewer::hFlip() +{ + setImage(image.mirror(TRUE,FALSE)); +} + +void ImageViewer::vFlip() +{ + setImage(image.mirror(FALSE,TRUE)); +} + +void ImageViewer::rot180() +{ + setImage(image.mirror(TRUE,TRUE)); +} + +void ImageViewer::copy() +{ +#ifndef QT_NO_MIMECLIPBOARD + TQApplication::clipboard()->setImage(image); // Less information loss +#endif +} + +void ImageViewer::paste() +{ +#ifndef QT_NO_MIMECLIPBOARD + TQImage p = TQApplication::clipboard()->image(); + if ( !p.isNull() ) { + filename = "pasted"; + setImage(p); + } +#endif +} + +void ImageViewer::setImage(const TQImage& newimage) +{ + image = newimage; + + pickx = -1; + clickx = -1; + setCaption( filename ); // set window caption + int w = image.width(); + int h = image.height(); + if ( !w ) + return; + + const int reasonable_width = 128; + if ( w < reasonable_width ) { + // Integer scale up to something reasonable + int multiply = ( reasonable_width + w - 1 ) / w; + w *= multiply; + h *= multiply; + } + + h += menubar->heightForWidth(w) + status->height(); + resize( w, h ); // we resize to fit image + + reconvertImage(); + repaint( image.hasAlphaBuffer() ); + + updateStatus(); + setMenuItemFlags(); +} + +void ImageViewer::editText() +{ + ImageTextEditor editor(image,this); + editor.exec(); +} + +void ImageViewer::to1Bit() +{ + toBitDepth(1); +} + +void ImageViewer::to8Bit() +{ + toBitDepth(8); +} + +void ImageViewer::to32Bit() +{ + toBitDepth(32); +} + +void ImageViewer::toBitDepth(int d) +{ + image = image.convertDepth(d); + reconvertImage(); + repaint( image.hasAlphaBuffer() ); +} diff --git a/examples/showimg/showimg.doc b/examples/showimg/showimg.doc new file mode 100644 index 000000000..d501bb8fe --- /dev/null +++ b/examples/showimg/showimg.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page showimg-example.html + + \ingroup examples + \title Show Image + + This example reads and displays an image in any supported image + format (GIF, BMP, PPM, XMP, etc.). + + <hr> + + Header file: + + \include showimg/showimg.h + + <hr> + + Implementation: + + \include showimg/showimg.cpp + + <hr> + + Main: + + \include showimg/main.cpp +*/ + diff --git a/examples/showimg/showimg.h b/examples/showimg/showimg.h new file mode 100644 index 000000000..020c910be --- /dev/null +++ b/examples/showimg/showimg.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef SHOWIMG_H +#define SHOWIMG_H + +#include <qwidget.h> +#include <qimage.h> + + +class TQLabel; +class TQMenuBar; +class TQPopupMenu; + +class ImageViewer : public TQWidget +{ + Q_OBJECT +public: + ImageViewer( TQWidget *parent=0, const char *name=0, int wFlags=0 ); + ~ImageViewer(); + bool loadImage( const TQString& ); +protected: + void paintEvent( TQPaintEvent * ); + void resizeEvent( TQResizeEvent * ); + void mousePressEvent( TQMouseEvent * ); + void mouseReleaseEvent( TQMouseEvent * ); + void mouseMoveEvent( TQMouseEvent * ); + +private: + void scale(); + int conversion_flags; + bool smooth() const; + bool useColorContext() const; + int alloc_context; + bool convertEvent( TQMouseEvent* e, int& x, int& y ); + TQString filename; + TQImage image; // the loaded image + TQPixmap pm; // the converted pixmap + TQPixmap pmScaled; // the scaled pixmap + + TQMenuBar *menubar; + TQPopupMenu *file; + TQPopupMenu *saveimage; + TQPopupMenu *savepixmap; + TQPopupMenu *edit; + TQPopupMenu *options; + + TQWidget *helpmsg; + TQLabel *status; + int si, sp, ac, co, mo, fd, bd, // Menu item ids + td, ta, ba, fa, au, ad, dd, + ss, cc, t1, t8, t32; + void updateStatus(); + void setMenuItemFlags(); + bool reconvertImage(); + int pickx, picky; + int clickx, clicky; + bool may_be_other; + static ImageViewer* other; + void setImage(const TQImage& newimage); + +private slots: + void to1Bit(); + void to8Bit(); + void to32Bit(); + void toBitDepth(int); + + void copy(); + void paste(); + + void hFlip(); + void vFlip(); + void rot180(); + + void editText(); + + void newWindow(); + void openFile(); + void saveImage(int); + void savePixmap(int); + void giveHelp(); + void doOption(int); + void copyFrom(ImageViewer*); +}; + + +#endif // SHOWIMG_H diff --git a/examples/showimg/showimg.pro b/examples/showimg/showimg.pro new file mode 100644 index 000000000..b2df09493 --- /dev/null +++ b/examples/showimg/showimg.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = showimg + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = showimg.h imagetexteditor.h \ + imagefip.h +SOURCES = main.cpp \ + imagetexteditor.cpp \ + showimg.cpp \ + imagefip.cpp diff --git a/examples/sound/sound.cpp b/examples/sound/sound.cpp new file mode 100644 index 000000000..45ce61563 --- /dev/null +++ b/examples/sound/sound.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +// +// Very simple example of TQSound::play(filename) +// +// 99% of this program is just boilerplate TQt code to put up a nice +// window so you think something special is happening. +// + +#include "sound.h" +#include <qapplication.h> +#include <qmessagebox.h> +#include <qmenubar.h> + +SoundPlayer::SoundPlayer() : + TQMainWindow(), + bucket3("sounds/3.wav"), + bucket4("sounds/4.wav") +{ + if (!TQSound::isAvailable()) { + // Bail out. Programs in which sound is not critical + // could just silently (hehe) ignore the lack of a server. + // + TQMessageBox::warning(this,"No Sound", + "<p><b>Sorry, you are not running the Network Audio System.</b>" + "<p>If you have the `au' command, run it in the background before this program. " + "The latest release of the Network Audio System can be obtained from:" + "<pre>\n" + " \n" + " ftp.ncd.com:/pub/ncd/technology/src/nas\n" + " ftp.x.org:/contrib/audio/nas\n" + "</pre>" + "<p>Release 1.2 of NAS is also included with the X11R6" + "contrib distribution." + "<p>After installing NAS, you will then need to reconfigure TQt with NAS sound support"); + } + + TQPopupMenu *file = new TQPopupMenu; + file->insertItem("Play &1", this, SLOT(doPlay1()), CTRL+Key_1); + file->insertItem("Play &2", this, SLOT(doPlay2()), CTRL+Key_2); + file->insertItem("Play from bucket &3", this, SLOT(doPlay3()), CTRL+Key_3); + file->insertItem("Play from bucket &4", this, SLOT(doPlay4()), CTRL+Key_4); + file->insertSeparator(); + file->insertItem("Play 3 and 4 together", this, SLOT(doPlay34())); + file->insertItem("Play all together", this, SLOT(doPlay1234())); + file->insertSeparator(); + file->insertItem("E&xit", qApp, SLOT(tquit())); + menuBar()->insertItem("&File", file); +} + +void SoundPlayer::doPlay1() +{ + TQSound::play("sounds/1.wav"); +} + +void SoundPlayer::doPlay2() +{ + TQSound::play("sounds/2.wav"); +} + +void SoundPlayer::doPlay3() +{ + bucket3.play(); +} + +void SoundPlayer::doPlay4() +{ + bucket4.play(); +} + +void SoundPlayer::doPlay34() +{ + // Some sound platforms will only play one sound at a time + bucket3.play(); + bucket4.play(); +} + +void SoundPlayer::doPlay1234() +{ + // Some sound platforms will only play one sound at a time + TQSound::play("sounds/1.wav"); + TQSound::play("sounds/2.wav"); + bucket3.play(); + bucket4.play(); +} + +int main(int argc, char** argv) +{ + TQApplication app(argc,argv); + SoundPlayer sp; + app.setMainWidget(&sp); + sp.setCaption("TQt Example - Sounds"); + sp.show(); + return app.exec(); +} + diff --git a/examples/sound/sound.doc b/examples/sound/sound.doc new file mode 100644 index 000000000..031c97e66 --- /dev/null +++ b/examples/sound/sound.doc @@ -0,0 +1,24 @@ +/*! \page sound-example.html + + \ingroup examples + \title Sound Example + + This example shows how easy it is to play sounds, e.g. .WAV files, + if your machine is set up to play audio. + + <hr> + + Header file: + + \include sound/sound.h + + <hr> + + Implementation: + + \include sound/sound.cpp + + +*/ + + diff --git a/examples/sound/sound.h b/examples/sound/sound.h new file mode 100644 index 000000000..9c3e5d7b3 --- /dev/null +++ b/examples/sound/sound.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +#ifndef PLAY_H +#define PLAY_H + +#include "qsound.h" +#include <qmainwindow.h> + +class SoundPlayer : public TQMainWindow { + Q_OBJECT +public: + SoundPlayer(); + +public slots: + void doPlay1(); + void doPlay2(); + void doPlay3(); + void doPlay4(); + void doPlay34(); + void doPlay1234(); + +private: + TQSound bucket3; + TQSound bucket4; +}; + +#endif diff --git a/examples/sound/sound.pro b/examples/sound/sound.pro new file mode 100644 index 000000000..38ab30a8f --- /dev/null +++ b/examples/sound/sound.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = sound + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config +x11:REQUIRES = nas + +HEADERS = sound.h +SOURCES = sound.cpp diff --git a/examples/sound/sounds/1.wav b/examples/sound/sounds/1.wav Binary files differnew file mode 100644 index 000000000..30b84e30b --- /dev/null +++ b/examples/sound/sounds/1.wav diff --git a/examples/sound/sounds/2.wav b/examples/sound/sounds/2.wav Binary files differnew file mode 100644 index 000000000..dd32e3455 --- /dev/null +++ b/examples/sound/sounds/2.wav diff --git a/examples/sound/sounds/3.wav b/examples/sound/sounds/3.wav Binary files differnew file mode 100644 index 000000000..5213eb55d --- /dev/null +++ b/examples/sound/sounds/3.wav diff --git a/examples/sound/sounds/4.wav b/examples/sound/sounds/4.wav Binary files differnew file mode 100644 index 000000000..e31b06090 --- /dev/null +++ b/examples/sound/sounds/4.wav diff --git a/examples/splitter/splitter.cpp b/examples/splitter/splitter.cpp new file mode 100644 index 000000000..684818a30 --- /dev/null +++ b/examples/splitter/splitter.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qlabel.h> +#include <qsplitter.h> +#include <qmultilineedit.h> + +#include <qpainter.h> + + +class Test : public TQWidget { +public: + Test(TQWidget* parent=0, const char* name=0, int f=0); + void paintEvent(TQPaintEvent* e); +private: +}; + + + +Test::Test(TQWidget* parent, const char* name, int f) : + TQWidget(parent, name, f) +{ + +} + +void Test::paintEvent(TQPaintEvent* e) +{ + TQPainter p(this); + p.setClipRect(e->rect()); + const int d = 1000; //large number + int x1 = 0; + int x2 = width()-1; + int y1 = 0; + int y2 = height()-1; + + int x = (x1+x2)/2; + p.drawLine( x, y1, x+d, y1+d ); + p.drawLine( x, y1, x-d, y1+d ); + p.drawLine( x, y2, x+d, y2-d ); + p.drawLine( x, y2, x-d, y2-d ); + + int y = (y1+y2)/2; + p.drawLine( x1, y, x1+d, y+d ); + p.drawLine( x1, y, x1+d, y-d ); + p.drawLine( x2, y, x2-d, y+d ); + p.drawLine( x2, y, x2-d, y-d ); +} + + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + + TQSplitter *s1 = new TQSplitter( TQSplitter::Vertical, 0 , "main" ); + + TQSplitter *s2 = new TQSplitter( TQSplitter::Horizontal, s1, "top" ); + + Test *t1 = new Test( s2, "topLeft" ); + t1->setBackgroundColor( TQt::blue.light( 180 ) ); + t1->setMinimumSize( 50, 0 ); + + Test *t2 = new Test( s2, "topRight" ); + t2->setBackgroundColor( TQt::green.light( 180 ) ); + s2->setResizeMode( t2, TQSplitter::KeepSize ); + s2->moveToFirst( t2 ); + + TQSplitter *s3 = new TQSplitter( TQSplitter::Horizontal, s1, "bottom" ); + + Test *t3 = new Test( s3, "bottomLeft" ); + t3->setBackgroundColor( TQt::red ); + Test *t4 = new Test( s3, "bottomMiddle" ); + t4->setBackgroundColor( TQt::white ); + + Test *t5 = new Test( s3, "bottomRight" ); + t5->setMaximumHeight( 250 ); + t5->setMinimumSize( 80, 50 ); + t5->setBackgroundColor( TQt::yellow ); + +#ifdef Q_WS_QWS + // TQt/Embedded XOR drawing not yet implemented. + s1->setOpaqueResize( TRUE ); +#endif + s2->setOpaqueResize( TRUE ); + s3->setOpaqueResize( TRUE ); + + a.setMainWidget( s1 ); + s1->setCaption("TQt Example - Splitters"); + s1->show(); + int result = a.exec(); + delete s1; + return result; +} diff --git a/examples/splitter/splitter.doc b/examples/splitter/splitter.doc new file mode 100644 index 000000000..ddee7692b --- /dev/null +++ b/examples/splitter/splitter.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page splitter-example.html + + \ingroup examples + \title Splitter + + This example shows how to use splitters. With their help users can + decide for themselves how much space each child item should get. + + <hr> + + Implementation: + + \include splitter/splitter.cpp +*/ + diff --git a/examples/splitter/splitter.pro b/examples/splitter/splitter.pro new file mode 100644 index 000000000..439d8fec4 --- /dev/null +++ b/examples/splitter/splitter.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = splitter + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = medium-config + +HEADERS = +SOURCES = splitter.cpp diff --git a/examples/sql/blob/blob.pro b/examples/sql/blob/blob.pro new file mode 100644 index 000000000..9240f2e42 --- /dev/null +++ b/examples/sql/blob/blob.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = blob + +CONFIG += qt warn_on release +win32:CONFIG += console + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp +INTERFACES = diff --git a/examples/sql/blob/main.cpp b/examples/sql/blob/main.cpp new file mode 100644 index 000000000..e66e9aaf5 --- /dev/null +++ b/examples/sql/blob/main.cpp @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlquery.h> +#include <qsqlcursor.h> +#include <qfile.h> + +#define DRIVER "TQPSQL7" /* see the TQt SQL documentation for a list of available drivers */ +#define DATABASE "" /* the name of your database */ +#define USER "" /* user name with appropriate rights */ +#define PASSWORD "" /* password for USER */ +#define HOST "" /* host on which the database is running */ + +int main( int argc, char ** argv ) +{ + + TQApplication a( argc, argv, FALSE ); + TQSqlDatabase * db = TQSqlDatabase::addDatabase( DRIVER ); + db->setDatabaseName( DATABASE ); + db->setUserName( USER ); + db->setPassword( PASSWORD ); + db->setHostName( HOST ); + if ( !db->open() ) { + qWarning( db->lastError().databaseText() ); + return 1; + } + + if ( argc < 2 ) { + qWarning( "Usage: %s <filename>", argv[0] ); + return 1; + } + + // read a file which we want to insert into the database + TQFile f( argv[1] ); + if ( !f.open( IO_ReadOnly ) ) { + qWarning( "Unable to open data file '%s' - exiting", argv[1] ); + return 1; + } + TQByteArray binaryData = f.readAll(); + qWarning( "Data size: %d", binaryData.size() ); + + // create a table with a binary field + TQSqlQuery q; + if ( !q.exec( "CREATE TABLE blobexample ( id INT PRIMARY KEY, binfield LONGBLOB )" ) ) { + qWarning( "Unable to create table - exiting" ); + return 1; + } + + // insert a BLOB into the table + if ( !q.prepare( "INSERT INTO blobexample ( id, binfield ) VALUES ( ?, ? )" ) ) { + qWarning( "Unable to prepare query - exiting" ); + return 1; + } + q.bindValue( 0, 1 ); + q.bindValue( 1, binaryData ); + if ( !q.exec() ) { + qWarning( "Unable to execute prepared query - exiting" ); + return 1; + } + + // read the BLOB back from the database + if ( !q.exec( "SELECT id, binfield FROM blobexample" ) ) { + qWarning( "Unable to execute query - exiting" ); + return 1; + } + qWarning( "\nTQSqlQuery:" ); + while ( q.next() ) { + qWarning( "BLOB id: %d", q.value( 0 ).toInt() ); + qWarning( "BLOB size: %d", q.value( 1 ).toByteArray().size() ); + } + + // write another BLOB using TQSqlCursor + TQSqlCursor cur( "blobexample" ); + TQSqlRecord * r = cur.primeInsert(); + r->setValue( "id", 2 ); + r->setValue( "binfield", binaryData ); + if ( !cur.insert() ) { + qWarning( "Unable to insert BLOB using TQSqlCursor - exiting" ); + return 1; + } + + // read the BLOBs back using TQSqlCursor + if ( !cur.select() ) { + qWarning( "Unable retrieve blobexample table using TQSqlCursor - exiting" ); + return 1; + } + qWarning( "\nTQSqlCursor:" ); + while ( cur.next() ) { + qWarning( "BLOB id: %d", cur.value( "id" ).toInt() ); + qWarning( "BLOB size: %d", cur.value( "binfield" ).toByteArray().size() ); + } + + if ( !q.exec( "DROP TABLE blobexample" ) ) { + qWarning( "Unable to drop table - exiting" ); + return 1; + } + return 0; +} diff --git a/examples/sql/overview/basicbrowsing/README b/examples/sql/overview/basicbrowsing/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/basicbrowsing/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/basicbrowsing/basicbrowsing.pro b/examples/sql/overview/basicbrowsing/basicbrowsing.pro new file mode 100644 index 000000000..b7245c992 --- /dev/null +++ b/examples/sql/overview/basicbrowsing/basicbrowsing.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp + diff --git a/examples/sql/overview/basicbrowsing/main.cpp b/examples/sql/overview/basicbrowsing/main.cpp new file mode 100644 index 000000000..a63182444 --- /dev/null +++ b/examples/sql/overview/basicbrowsing/main.cpp @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlquery.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlDatabase *oracledb = TQSqlDatabase::database( "ORACLE" ); + // Copy data from the oracle database to the ODBC (default) + // database + TQSqlQuery target; + TQSqlQuery query( "SELECT id, name FROM people", oracledb ); + if ( query.isActive() ) { + while ( query.next() ) { + target.exec( "INSERT INTO people ( id, name ) VALUES ( " + + query.value(0).toString() + + ", '" + query.value(1).toString() + "' )" ); + } + } + } + + return 0; +} diff --git a/examples/sql/overview/basicbrowsing2/README b/examples/sql/overview/basicbrowsing2/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/basicbrowsing2/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/basicbrowsing2/basicbrowsing2.pro b/examples/sql/overview/basicbrowsing2/basicbrowsing2.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/basicbrowsing2/basicbrowsing2.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/basicbrowsing2/main.cpp b/examples/sql/overview/basicbrowsing2/main.cpp new file mode 100644 index 000000000..5f7cbcb9f --- /dev/null +++ b/examples/sql/overview/basicbrowsing2/main.cpp @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlquery.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlDatabase *oracledb = TQSqlDatabase::database( "ORACLE" ); + // Copy data from the oracle database to the ODBC (default) + // database + TQSqlQuery target; + TQSqlQuery query( "SELECT id, name FROM people", oracledb ); + int count = 0; + if ( query.isActive() ) { + while ( query.next() ) { + target.exec( "INSERT INTO people ( id, name ) VALUES ( " + + query.value(0).toString() + + ", '" + query.value(1).toString() + "' )" ); + if ( target.isActive() ) + count += target.numRowsAffected(); + } + } + } + + return 0; +} + + + + + diff --git a/examples/sql/overview/basicdatamanip/README b/examples/sql/overview/basicdatamanip/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/basicdatamanip/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/basicdatamanip/basicdatamanip.pro b/examples/sql/overview/basicdatamanip/basicdatamanip.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/basicdatamanip/basicdatamanip.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/basicdatamanip/main.cpp b/examples/sql/overview/basicdatamanip/main.cpp new file mode 100644 index 000000000..7777f9813 --- /dev/null +++ b/examples/sql/overview/basicdatamanip/main.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlquery.h> +#include "../connection.h" + +bool createConnections(); + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + int rows = 0; + + if ( createConnections() ) { + TQSqlQuery query( "INSERT INTO staff ( id, forename, surname, salary ) " + "VALUES ( 1155, 'Ginger', 'Davis', 50000 )" ); + if ( query.isActive() ) rows += query.numRowsAffected() ; + + query.exec( "UPDATE staff SET salary=60000 WHERE id=1155" ); + if ( query.isActive() ) rows += query.numRowsAffected() ; + + query.exec( "DELETE FROM staff WHERE id=1155" ); + if ( query.isActive() ) rows += query.numRowsAffected() ; + } + + return ( rows == 3 ) ? 0 : 1; +} + + + diff --git a/examples/sql/overview/connect1/README b/examples/sql/overview/connect1/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/connect1/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/connect1/connect1.pro b/examples/sql/overview/connect1/connect1.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/connect1/connect1.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/connect1/main.cpp b/examples/sql/overview/connect1/main.cpp new file mode 100644 index 000000000..16f3eeab2 --- /dev/null +++ b/examples/sql/overview/connect1/main.cpp @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include "../connection.h" + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + TQSqlDatabase *defaultDB = TQSqlDatabase::addDatabase( DB_SALES_DRIVER ); + defaultDB->setDatabaseName( DB_SALES_DBNAME ); + defaultDB->setUserName( DB_SALES_USER ); + defaultDB->setPassword( DB_SALES_PASSWD ); + defaultDB->setHostName( DB_SALES_HOST ); + + if ( defaultDB->open() ) { + // Database successfully opened; we can now issue SQL commands. + } + + return 0; +} + diff --git a/examples/sql/overview/connection.cpp b/examples/sql/overview/connection.cpp new file mode 100644 index 000000000..0bbc7116c --- /dev/null +++ b/examples/sql/overview/connection.cpp @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +#include <qsqldatabase.h> +#include "connection.h" + +bool createConnections() +{ + + TQSqlDatabase *defaultDB = TQSqlDatabase::addDatabase( DB_SALES_DRIVER ); + defaultDB->setDatabaseName( DB_SALES_DBNAME ); + defaultDB->setUserName( DB_SALES_USER ); + defaultDB->setPassword( DB_SALES_PASSWD ); + defaultDB->setHostName( DB_SALES_HOST ); + if ( ! defaultDB->open() ) { + qWarning( "Failed to open sales database: " + defaultDB->lastError().text() ); + return FALSE; + } + + TQSqlDatabase *oracle = TQSqlDatabase::addDatabase( DB_ORDERS_DRIVER, "ORACLE" ); + oracle->setDatabaseName( DB_ORDERS_DBNAME ); + oracle->setUserName( DB_ORDERS_USER ); + oracle->setPassword( DB_ORDERS_PASSWD ); + oracle->setHostName( DB_ORDERS_HOST ); + if ( ! oracle->open() ) { + qWarning( "Failed to open orders database: " + oracle->lastError().text() ); + return FALSE; + } + + TQSqlQuery q(TQString::null, defaultDB); + q.exec("create table people (id integer primary key, name char(40))"); + q.exec("create table staff (id integer primary key, forename char(40), " + "surname char(40), salary float, statusid integer)"); + q.exec("create table status (id integer primary key, name char(30))"); + q.exec("create table creditors (id integer primary key, forename char(40), " + "surname char(40), city char(30))"); + q.exec("create table prices (id integer primary key, name char(40), price float)"); + q.exec("create table invoiceitem (id integer primary key, " + "pricesid integer, quantity integer, paiddate date)"); + + TQSqlQuery q2(TQString::null, oracle); + q2.exec("create table people (id integer primary key, name char(40))"); + + return TRUE; +} diff --git a/examples/sql/overview/connection.h b/examples/sql/overview/connection.h new file mode 100644 index 000000000..c2c5195b6 --- /dev/null +++ b/examples/sql/overview/connection.h @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +// Enter your connection info here + +#define DB_SALES_DRIVER "TQSQLITE" +#define DB_SALES_DBNAME ":memory:" +#define DB_SALES_USER "" +#define DB_SALES_PASSWD "" +#define DB_SALES_HOST "" + +#define DB_ORDERS_DRIVER "TQSQLITE" +#define DB_ORDERS_DBNAME ":memory:" +#define DB_ORDERS_USER "" +#define DB_ORDERS_PASSWD "" +#define DB_ORDERS_HOST "" + +bool createConnections(); diff --git a/examples/sql/overview/create_connections/README b/examples/sql/overview/create_connections/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/create_connections/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/create_connections/create_connections.pro b/examples/sql/overview/create_connections/create_connections.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/create_connections/create_connections.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/create_connections/main.cpp b/examples/sql/overview/create_connections/main.cpp new file mode 100644 index 000000000..c4b3a9b71 --- /dev/null +++ b/examples/sql/overview/create_connections/main.cpp @@ -0,0 +1,26 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + // Databases successfully opened; get pointers to them: + TQSqlDatabase *oracledb = TQSqlDatabase::database( "ORACLE" ); + // Now we can now issue SQL commands to the oracle connection + // or to the default connection + } + + return 0; +} diff --git a/examples/sql/overview/custom1/custom1.pro b/examples/sql/overview/custom1/custom1.pro new file mode 100644 index 000000000..c490bedd0 --- /dev/null +++ b/examples/sql/overview/custom1/custom1.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = main.h +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/custom1/main.cpp b/examples/sql/overview/custom1/main.cpp new file mode 100644 index 000000000..808444c7c --- /dev/null +++ b/examples/sql/overview/custom1/main.cpp @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" + + +CustomEdit::CustomEdit( TQWidget *parent, const char *name ) : + TQLineEdit( parent, name ) +{ + connect( this, SIGNAL(textChanged(const TQString &)), + this, SLOT(changed(const TQString &)) ); +} + + +void CustomEdit::changed( const TQString &line ) +{ + setUpperLine( line ); +} + + +void CustomEdit::setUpperLine( const TQString &line ) +{ + upperLineText = line.upper(); + setText( upperLineText ); +} + + +TQString CustomEdit::upperLine() const +{ + return upperLineText; +} + + +FormDialog::FormDialog() +{ + TQLabel *forenameLabel = new TQLabel( "Forename:", this ); + CustomEdit *forenameEdit = new CustomEdit( this ); + TQLabel *surnameLabel = new TQLabel( "Surname:", this ); + CustomEdit *surnameEdit = new CustomEdit( this ); + TQLabel *salaryLabel = new TQLabel( "Salary:", this ); + TQLineEdit *salaryEdit = new TQLineEdit( this ); + salaryEdit->setAlignment( TQt::AlignRight ); + TQPushButton *saveButton = new TQPushButton( "&Save", this ); + connect( saveButton, SIGNAL(clicked()), this, SLOT(save()) ); + + TQGridLayout *grid = new TQGridLayout( this ); + grid->addWidget( forenameLabel, 0, 0 ); + grid->addWidget( forenameEdit, 0, 1 ); + grid->addWidget( surnameLabel, 1, 0 ); + grid->addWidget( surnameEdit, 1, 1 ); + grid->addWidget( salaryLabel, 2, 0 ); + grid->addWidget( salaryEdit, 2, 1 ); + grid->addWidget( saveButton, 3, 0 ); + grid->activate(); + + staffCursor = new TQSqlCursor( "staff" ); + staffCursor->setTrimmed( "forename", TRUE ); + staffCursor->setTrimmed( "surname", TRUE ); + idIndex = staffCursor->index( "id" ); + staffCursor->select( idIndex ); + staffCursor->first(); + + propMap = new TQSqlPropertyMap; + propMap->insert( forenameEdit->className(), "upperLine" ); + + sqlForm = new TQSqlForm( this ); + sqlForm->setRecord( staffCursor->primeUpdate() ); + sqlForm->installPropertyMap( propMap ); + sqlForm->insert( forenameEdit, "forename" ); + sqlForm->insert( surnameEdit, "surname" ); + sqlForm->insert( salaryEdit, "salary" ); + sqlForm->readFields(); +} + + +FormDialog::~FormDialog() +{ + delete staffCursor; +} + + +void FormDialog::save() +{ + sqlForm->writeFields(); + staffCursor->update(); + staffCursor->select( idIndex ); + staffCursor->first(); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( ! createConnections() ) + return 1; + + FormDialog *formDialog = new FormDialog(); + formDialog->show(); + app.setMainWidget( formDialog ); + + return app.exec(); +} diff --git a/examples/sql/overview/custom1/main.h b/examples/sql/overview/custom1/main.h new file mode 100644 index 000000000..191672245 --- /dev/null +++ b/examples/sql/overview/custom1/main.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qdialog.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qsqlform.h> +#include <qsqlpropertymap.h> +#include "../connection.h" + +class CustomEdit : public TQLineEdit +{ + Q_OBJECT + Q_PROPERTY( TQString upperLine READ upperLine WRITE setUpperLine ) + public: + CustomEdit( TQWidget *parent=0, const char *name=0 ); + TQString upperLine() const; + void setUpperLine( const TQString &line ); + public slots: + void changed( const TQString &line ); + private: + TQString upperLineText; +}; + + +class FormDialog : public TQDialog +{ + Q_OBJECT + public: + FormDialog(); + ~FormDialog(); + public slots: + void save(); + private: + TQSqlCursor *staffCursor; + TQSqlForm *sqlForm; + TQSqlPropertyMap *propMap; + TQSqlIndex idIndex; +}; + + diff --git a/examples/sql/overview/delete/README b/examples/sql/overview/delete/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/delete/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/delete/delete.pro b/examples/sql/overview/delete/delete.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/delete/delete.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/delete/main.cpp b/examples/sql/overview/delete/main.cpp new file mode 100644 index 000000000..ebe2108fa --- /dev/null +++ b/examples/sql/overview/delete/main.cpp @@ -0,0 +1,29 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlCursor cur( "prices" ); + cur.select( "id=999" ); + if ( cur.next() ) { + cur.primeDelete(); + cur.del(); + } + } + + return 0; +} diff --git a/examples/sql/overview/extract/README b/examples/sql/overview/extract/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/extract/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/extract/extract.pro b/examples/sql/overview/extract/extract.pro new file mode 100644 index 000000000..c517268f4 --- /dev/null +++ b/examples/sql/overview/extract/extract.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH =../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/extract/main.cpp b/examples/sql/overview/extract/main.cpp new file mode 100644 index 000000000..191601c82 --- /dev/null +++ b/examples/sql/overview/extract/main.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlCursor cur( "creditors" ); + + TQStringList orderFields = TQStringList() << "surname" << "forename"; + TQSqlIndex order = cur.index( orderFields ); + + TQStringList filterFields = TQStringList() << "surname" << "city"; + TQSqlIndex filter = cur.index( filterFields ); + cur.setValue( "surname", "Chirac" ); + cur.setValue( "city", "Paris" ); + + cur.select( filter, order ); + + while ( cur.next() ) { + int id = cur.value( "id" ).toInt(); + TQString name = cur.value( "forename" ).toString() + " " + + cur.value( "surname" ).toString(); + qDebug( TQString::number( id ) + ": " + name ); + } + } + + return 0; +} diff --git a/examples/sql/overview/form1/form1.pro b/examples/sql/overview/form1/form1.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/form1/form1.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/form1/main.cpp b/examples/sql/overview/form1/main.cpp new file mode 100644 index 000000000..8f1c05b0e --- /dev/null +++ b/examples/sql/overview/form1/main.cpp @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qdialog.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qsqlform.h> +#include "../connection.h" + +class FormDialog : public TQDialog +{ + public: + FormDialog(); +}; + + +FormDialog::FormDialog() +{ + TQLabel *forenameLabel = new TQLabel( "Forename:", this ); + TQLabel *forenameDisplay = new TQLabel( this ); + TQLabel *surnameLabel = new TQLabel( "Surname:", this ); + TQLabel *surnameDisplay = new TQLabel( this ); + TQLabel *salaryLabel = new TQLabel( "Salary:", this ); + TQLineEdit *salaryEdit = new TQLineEdit( this ); + + TQGridLayout *grid = new TQGridLayout( this ); + grid->addWidget( forenameLabel, 0, 0 ); + grid->addWidget( forenameDisplay, 0, 1 ); + grid->addWidget( surnameLabel, 1, 0 ); + grid->addWidget( surnameDisplay, 1, 1 ); + grid->addWidget( salaryLabel, 2, 0 ); + grid->addWidget( salaryEdit, 2, 1 ); + grid->activate(); + + TQSqlCursor staffCursor( "staff" ); + staffCursor.select(); + staffCursor.next(); + + TQSqlForm sqlForm( this ); + sqlForm.setRecord( staffCursor.primeUpdate() ); + sqlForm.insert( forenameDisplay, "forename" ); + sqlForm.insert( surnameDisplay, "surname" ); + sqlForm.insert( salaryEdit, "salary" ); + sqlForm.readFields(); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( ! createConnections() ) return 1; + + FormDialog *formDialog = new FormDialog(); + formDialog->show(); + app.setMainWidget( formDialog ); + + return app.exec(); +} diff --git a/examples/sql/overview/form2/form2.pro b/examples/sql/overview/form2/form2.pro new file mode 100644 index 000000000..c490bedd0 --- /dev/null +++ b/examples/sql/overview/form2/form2.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = main.h +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/form2/main.cpp b/examples/sql/overview/form2/main.cpp new file mode 100644 index 000000000..2d5420bdc --- /dev/null +++ b/examples/sql/overview/form2/main.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" + +FormDialog::FormDialog() + : staffCursor( "staff" ) +{ + staffCursor.setTrimmed( "forename", TRUE ); + staffCursor.setTrimmed( "surname", TRUE ); + + TQLabel *forenameLabel = new TQLabel( "Forename:", this ); + TQLineEdit *forenameEdit = new TQLineEdit( this ); + TQLabel *surnameLabel = new TQLabel( "Surname:", this ); + TQLineEdit *surnameEdit = new TQLineEdit( this ); + TQLabel *salaryLabel = new TQLabel( "Salary:", this ); + TQLineEdit *salaryEdit = new TQLineEdit( this ); + TQPushButton *saveButton = new TQPushButton( "&Save", this ); + connect( saveButton, SIGNAL(clicked()), this, SLOT(save()) ); + + TQGridLayout *grid = new TQGridLayout( this ); + grid->addWidget( forenameLabel, 0, 0 ); + grid->addWidget( forenameEdit, 0, 1 ); + grid->addWidget( surnameLabel, 1, 0 ); + grid->addWidget( surnameEdit, 1, 1 ); + grid->addWidget( salaryLabel, 2, 0 ); + grid->addWidget( salaryEdit, 2, 1 ); + grid->addWidget( saveButton, 3, 0 ); + grid->activate(); + + idIndex = staffCursor.index( "id" ); + staffCursor.select( idIndex ); + staffCursor.first(); + + sqlForm = new TQSqlForm( this ); + sqlForm->setRecord( staffCursor.primeUpdate() ); + sqlForm->insert( forenameEdit, "forename" ); + sqlForm->insert( surnameEdit, "surname" ); + sqlForm->insert( salaryEdit, "salary" ); + sqlForm->readFields(); +} + + +FormDialog::~FormDialog() +{ + +} + + +void FormDialog::save() +{ + sqlForm->writeFields(); + staffCursor.update(); + staffCursor.select( idIndex ); + staffCursor.first(); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( ! createConnections() ) + return 1; + + FormDialog *formDialog = new FormDialog(); + formDialog->show(); + app.setMainWidget( formDialog ); + + return app.exec(); +} diff --git a/examples/sql/overview/form2/main.h b/examples/sql/overview/form2/main.h new file mode 100644 index 000000000..31a0f66cd --- /dev/null +++ b/examples/sql/overview/form2/main.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qdialog.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qsqlform.h> +#include "../connection.h" + +class FormDialog : public TQDialog +{ + Q_OBJECT + public: + FormDialog(); + ~FormDialog(); + public slots: + void save(); + private: + TQSqlCursor staffCursor; + TQSqlForm *sqlForm; + TQSqlIndex idIndex; +}; diff --git a/examples/sql/overview/insert/README b/examples/sql/overview/insert/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/insert/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/insert/insert.pro b/examples/sql/overview/insert/insert.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/insert/insert.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/insert/main.cpp b/examples/sql/overview/insert/main.cpp new file mode 100644 index 000000000..47276819f --- /dev/null +++ b/examples/sql/overview/insert/main.cpp @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + int count = 0; + TQSqlCursor cur( "prices" ); + TQStringList names = TQStringList() << + "Screwdriver" << "Hammer" << "Wrench" << "Saw"; + int id = 20; + for ( TQStringList::Iterator name = names.begin(); + name != names.end(); ++name ) { + TQSqlRecord *buffer = cur.primeInsert(); + buffer->setValue( "id", id ); + buffer->setValue( "name", *name ); + buffer->setValue( "price", 100.0 + (double)id ); + count += cur.insert(); + id++; + } + } + + return 0; +} diff --git a/examples/sql/overview/insert2/insert2.pro b/examples/sql/overview/insert2/insert2.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/insert2/insert2.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/insert2/main.cpp b/examples/sql/overview/insert2/main.cpp new file mode 100644 index 000000000..800a94464 --- /dev/null +++ b/examples/sql/overview/insert2/main.cpp @@ -0,0 +1,29 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlCursor cur( "prices" ); + TQSqlRecord *buffer = cur.primeInsert(); + buffer->setValue( "id", 53981 ); + buffer->setValue( "name", "Thingy" ); + buffer->setValue( "price", 105.75 ); + cur.insert(); + } + + return 0; +} diff --git a/examples/sql/overview/navigating/README b/examples/sql/overview/navigating/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/navigating/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/navigating/main.cpp b/examples/sql/overview/navigating/main.cpp new file mode 100644 index 000000000..519aa2698 --- /dev/null +++ b/examples/sql/overview/navigating/main.cpp @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlquery.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlQuery query( "SELECT id, name FROM people ORDER BY name" ); + if ( ! query.isActive() ) return 1; // Query failed + int i; + i = query.size(); // In this example we have 9 records; i == 9. + query.first(); // Moves to the first record. + i = query.at(); // i == 0 + query.last(); // Moves to the last record. + i = query.at(); // i == 8 + query.seek( query.size() / 2 ); // Moves to the middle record. + i = query.at(); // i == 4 + } + + return 0; +} diff --git a/examples/sql/overview/navigating/navigating.pro b/examples/sql/overview/navigating/navigating.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/navigating/navigating.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/order1/README b/examples/sql/overview/order1/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/order1/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/order1/main.cpp b/examples/sql/overview/order1/main.cpp new file mode 100644 index 000000000..7b185d459 --- /dev/null +++ b/examples/sql/overview/order1/main.cpp @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlCursor cur( "staff" ); + TQStringList fields = TQStringList() << "surname" << "forename"; + TQSqlIndex order = cur.index( fields ); + cur.select( order ); + while ( cur.next() ) { + qDebug( cur.value( "id" ).toString() + ": " + + cur.value( "surname" ).toString() + " " + + cur.value( "forename" ).toString() ); + } + } + + return 0; +} diff --git a/examples/sql/overview/order1/order1.pro b/examples/sql/overview/order1/order1.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/order1/order1.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/order2/README b/examples/sql/overview/order2/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/order2/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/order2/main.cpp b/examples/sql/overview/order2/main.cpp new file mode 100644 index 000000000..9165d2a9f --- /dev/null +++ b/examples/sql/overview/order2/main.cpp @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlCursor cur( "staff" ); + TQStringList fields = TQStringList() << "id" << "forename"; + TQSqlIndex order = cur.index( fields ); + TQSqlIndex filter = cur.index( "surname" ); + cur.setValue( "surname", "Bloggs" ); + cur.select( filter, order ); + while ( cur.next() ) { + qDebug( cur.value( "id" ).toString() + ": " + + cur.value( "surname" ).toString() + " " + + cur.value( "forename" ).toString() ); + } + } + + return 0; +} diff --git a/examples/sql/overview/order2/order2.pro b/examples/sql/overview/order2/order2.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/order2/order2.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/overview.pro b/examples/sql/overview/overview.pro new file mode 100644 index 000000000..59be65100 --- /dev/null +++ b/examples/sql/overview/overview.pro @@ -0,0 +1,33 @@ +TEMPLATE = subdirs + +CONFIG += ordered + +REQUIRES = full-config + +SUBDIRS = basicbrowsing \ + basicbrowsing2 \ + basicdatamanip \ + connect1 \ + create_connections \ + custom1 \ + delete \ + extract \ + form1 \ + form2 \ + insert \ + insert2 \ + navigating \ + order1 \ + order2 \ + retrieve1 \ + retrieve2 \ + subclass1 \ + subclass2 \ + subclass3 \ + subclass4 \ + subclass5 \ + table1 \ + table2 \ + table3 \ + table4 \ + update diff --git a/examples/sql/overview/retrieve1/README b/examples/sql/overview/retrieve1/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/retrieve1/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/retrieve1/main.cpp b/examples/sql/overview/retrieve1/main.cpp new file mode 100644 index 000000000..956f8a17f --- /dev/null +++ b/examples/sql/overview/retrieve1/main.cpp @@ -0,0 +1,30 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlquery.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlQuery query( "SELECT id, surname FROM staff" ); + if ( query.isActive() ) { + while ( query.next() ) { + qDebug( query.value(0).toString() + ": " + + query.value(1).toString() ); + } + } + } + + return 0; +} diff --git a/examples/sql/overview/retrieve1/retrieve1.pro b/examples/sql/overview/retrieve1/retrieve1.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/retrieve1/retrieve1.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/retrieve2/README b/examples/sql/overview/retrieve2/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/retrieve2/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/retrieve2/main.cpp b/examples/sql/overview/retrieve2/main.cpp new file mode 100644 index 000000000..4cb0150be --- /dev/null +++ b/examples/sql/overview/retrieve2/main.cpp @@ -0,0 +1,30 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + TQSqlCursor cur( "staff" ); // Specify the table/view name + cur.select(); // We'll retrieve every record + while ( cur.next() ) { + qDebug( cur.value( "id" ).toString() + ": " + + cur.value( "surname" ).toString() + " " + + cur.value( "salary" ).toString() ); + } + } + + return 0; +} diff --git a/examples/sql/overview/retrieve2/retrieve2.pro b/examples/sql/overview/retrieve2/retrieve2.pro new file mode 100644 index 000000000..c58585ea2 --- /dev/null +++ b/examples/sql/overview/retrieve2/retrieve2.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/subclass1/main.cpp b/examples/sql/overview/subclass1/main.cpp new file mode 100644 index 000000000..476ebd898 --- /dev/null +++ b/examples/sql/overview/subclass1/main.cpp @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qdatatable.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + TQSqlCursor invoiceItemCursor( "invoiceitem" ); + + TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor ); + + app.setMainWidget( invoiceItemTable ); + + invoiceItemTable->addColumn( "pricesid", "PriceID" ); + invoiceItemTable->addColumn( "quantity", "Quantity" ); + invoiceItemTable->addColumn( "paiddate", "Paid" ); + + invoiceItemTable->refresh(); + invoiceItemTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/subclass1/subclass1.pro b/examples/sql/overview/subclass1/subclass1.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/subclass1/subclass1.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/subclass2/main.cpp b/examples/sql/overview/subclass2/main.cpp new file mode 100644 index 000000000..f7f9bd91f --- /dev/null +++ b/examples/sql/overview/subclass2/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" +#include <qdatatable.h> + +InvoiceItemCursor::InvoiceItemCursor() : + TQSqlCursor( "invoiceitem" ) +{ + // NOOP +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + InvoiceItemCursor invoiceItemCursor; + + TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor ); + + app.setMainWidget( invoiceItemTable ); + + invoiceItemTable->addColumn( "pricesid", "PriceID" ); + invoiceItemTable->addColumn( "quantity", "Quantity" ); + invoiceItemTable->addColumn( "paiddate", "Paid" ); + + invoiceItemTable->refresh(); + invoiceItemTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/subclass2/main.h b/examples/sql/overview/subclass2/main.h new file mode 100644 index 000000000..020ecbff7 --- /dev/null +++ b/examples/sql/overview/subclass2/main.h @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +class TQSqlRecord; + +class InvoiceItemCursor : public TQSqlCursor +{ + public: + InvoiceItemCursor(); +}; + + diff --git a/examples/sql/overview/subclass2/subclass2.pro b/examples/sql/overview/subclass2/subclass2.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/subclass2/subclass2.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/subclass3/main.cpp b/examples/sql/overview/subclass3/main.cpp new file mode 100644 index 000000000..db77b855e --- /dev/null +++ b/examples/sql/overview/subclass3/main.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" +#include <qdatatable.h> + +InvoiceItemCursor::InvoiceItemCursor() : + TQSqlCursor( "invoiceitem" ) +{ + TQSqlFieldInfo productName( "productname", TQVariant::String ); + append( productName ); + setCalculated( productName.name(), TRUE ); +} + + +TQVariant InvoiceItemCursor::calculateField( const TQString & name ) +{ + if ( name == "productname" ) { + TQSqlQuery query( "SELECT name FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return query.value( 0 ); + } + + return TQVariant( TQString::null ); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + InvoiceItemCursor invoiceItemCursor; + + TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor ); + + app.setMainWidget( invoiceItemTable ); + + invoiceItemTable->addColumn( "productname", "Product" ); + invoiceItemTable->addColumn( "quantity", "Quantity" ); + invoiceItemTable->addColumn( "paiddate", "Paid" ); + + invoiceItemTable->refresh(); + invoiceItemTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/subclass3/main.h b/examples/sql/overview/subclass3/main.h new file mode 100644 index 000000000..06b0a1734 --- /dev/null +++ b/examples/sql/overview/subclass3/main.h @@ -0,0 +1,25 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +class TQSqlRecord; + +class InvoiceItemCursor : public TQSqlCursor +{ + public: + InvoiceItemCursor(); + protected: + TQVariant calculateField( const TQString & name ); +}; + + diff --git a/examples/sql/overview/subclass3/subclass3.pro b/examples/sql/overview/subclass3/subclass3.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/subclass3/subclass3.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/subclass4/main.cpp b/examples/sql/overview/subclass4/main.cpp new file mode 100644 index 000000000..a96870e4d --- /dev/null +++ b/examples/sql/overview/subclass4/main.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" +#include <qdatatable.h> + +InvoiceItemCursor::InvoiceItemCursor() : + TQSqlCursor( "invoiceitem" ) +{ + TQSqlFieldInfo productName( "productname", TQVariant::String ); + append( productName ); + setCalculated( productName.name(), TRUE ); + + TQSqlFieldInfo productPrice( "price", TQVariant::Double ); + append( productPrice ); + setCalculated( productPrice.name(), TRUE ); + + TQSqlFieldInfo productCost( "cost", TQVariant::Double ); + append( productCost ); + setCalculated( productCost.name(), TRUE ); +} + + +TQVariant InvoiceItemCursor::calculateField( const TQString & name ) +{ + + if ( name == "productname" ) { + TQSqlQuery query( "SELECT name FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return query.value( 0 ); + } + else if ( name == "price" ) { + TQSqlQuery query( "SELECT price FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return query.value( 0 ); + } + else if ( name == "cost" ) { + TQSqlQuery query( "SELECT price FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return TQVariant( query.value( 0 ).toDouble() * + value( "quantity").toDouble() ); + } + + return TQVariant( TQString::null ); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + InvoiceItemCursor invoiceItemCursor; + + TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor ); + + app.setMainWidget( invoiceItemTable ); + + invoiceItemTable->addColumn( "productname", "Product" ); + invoiceItemTable->addColumn( "price", "Price" ); + invoiceItemTable->addColumn( "quantity", "Quantity" ); + invoiceItemTable->addColumn( "cost", "Cost" ); + invoiceItemTable->addColumn( "paiddate", "Paid" ); + + invoiceItemTable->refresh(); + invoiceItemTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/subclass4/main.h b/examples/sql/overview/subclass4/main.h new file mode 100644 index 000000000..06b0a1734 --- /dev/null +++ b/examples/sql/overview/subclass4/main.h @@ -0,0 +1,25 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +class TQSqlRecord; + +class InvoiceItemCursor : public TQSqlCursor +{ + public: + InvoiceItemCursor(); + protected: + TQVariant calculateField( const TQString & name ); +}; + + diff --git a/examples/sql/overview/subclass4/subclass4.pro b/examples/sql/overview/subclass4/subclass4.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/subclass4/subclass4.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/subclass5/main.cpp b/examples/sql/overview/subclass5/main.cpp new file mode 100644 index 000000000..260ddaf2a --- /dev/null +++ b/examples/sql/overview/subclass5/main.cpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" +#include <qdatatable.h> + +InvoiceItemCursor::InvoiceItemCursor() : + TQSqlCursor( "invoiceitem" ) +{ + TQSqlFieldInfo productName( "productname", TQVariant::String ); + append( productName ); + setCalculated( productName.name(), TRUE ); + + TQSqlFieldInfo productPrice( "price", TQVariant::Double ); + append( productPrice ); + setCalculated( productPrice.name(), TRUE ); + + TQSqlFieldInfo productCost( "cost", TQVariant::Double ); + append( productCost ); + setCalculated( productCost.name(), TRUE ); +} + + +TQVariant InvoiceItemCursor::calculateField( const TQString & name ) +{ + + if ( name == "productname" ) { + TQSqlQuery query( "SELECT name FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return query.value( 0 ); + } + else if ( name == "price" ) { + TQSqlQuery query( "SELECT price FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return query.value( 0 ); + } + else if ( name == "cost" ) { + TQSqlQuery query( "SELECT price FROM prices WHERE id=" + + field( "pricesid" )->value().toString() ); + if ( query.next() ) + return TQVariant( query.value( 0 ).toDouble() * + value( "quantity").toDouble() ); + } + + return TQVariant( TQString::null ); +} + + +TQSqlRecord *InvoiceItemCursor::primeInsert() +{ + TQSqlRecord *buffer = editBuffer(); + TQSqlQuery query( "SELECT NEXTVAL( 'invoiceitem_seq' )" ); + if ( query.next() ) + buffer->setValue( "id", query.value( 0 ) ); + buffer->setValue( "paiddate", TQDate::currentDate() ); + buffer->setValue( "quantity", 1 ); + + return buffer; +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + InvoiceItemCursor invoiceItemCursor; + + TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor ); + + app.setMainWidget( invoiceItemTable ); + + invoiceItemTable->addColumn( "productname", "Product" ); + invoiceItemTable->addColumn( "price", "Price" ); + invoiceItemTable->addColumn( "quantity", "Quantity" ); + invoiceItemTable->addColumn( "cost", "Cost" ); + invoiceItemTable->addColumn( "paiddate", "Paid" ); + + invoiceItemTable->refresh(); + invoiceItemTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/subclass5/main.h b/examples/sql/overview/subclass5/main.h new file mode 100644 index 000000000..6f3a0edca --- /dev/null +++ b/examples/sql/overview/subclass5/main.h @@ -0,0 +1,25 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qdatetime.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +class TQSqlRecord; + +class InvoiceItemCursor : public TQSqlCursor +{ + public: + InvoiceItemCursor(); + TQSqlRecord *primeInsert(); + protected: + TQVariant calculateField( const TQString & name ); +}; diff --git a/examples/sql/overview/subclass5/subclass5.pro b/examples/sql/overview/subclass5/subclass5.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/subclass5/subclass5.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/table1/main.cpp b/examples/sql/overview/table1/main.cpp new file mode 100644 index 000000000..c0041a9a2 --- /dev/null +++ b/examples/sql/overview/table1/main.cpp @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qdatatable.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + TQSqlCursor staffCursor( "staff" ); + TQDataTable *staffTable = new TQDataTable( &staffCursor, TRUE ); + app.setMainWidget( staffTable ); + staffTable->refresh(); + staffTable->show(); + + return app.exec(); + } + + return 0; +} diff --git a/examples/sql/overview/table1/table1.pro b/examples/sql/overview/table1/table1.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/table1/table1.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/table2/main.cpp b/examples/sql/overview/table2/main.cpp new file mode 100644 index 000000000..79c9993f9 --- /dev/null +++ b/examples/sql/overview/table2/main.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qdatatable.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + TQSqlCursor staffCursor( "staff" ); + + TQDataTable *staffTable = new TQDataTable( &staffCursor ); + + app.setMainWidget( staffTable ); + + staffTable->addColumn( "forename", "Forename" ); + staffTable->addColumn( "surname", "Surname" ); + staffTable->addColumn( "salary", "Annual Salary" ); + + TQStringList order = TQStringList() << "surname" << "forename"; + staffTable->setSort( order ); + + staffTable->refresh(); + staffTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/table2/table2.pro b/examples/sql/overview/table2/table2.pro new file mode 100644 index 000000000..a6cd8cb47 --- /dev/null +++ b/examples/sql/overview/table2/table2.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/table3/main.cpp b/examples/sql/overview/table3/main.cpp new file mode 100644 index 000000000..4b9f2050e --- /dev/null +++ b/examples/sql/overview/table3/main.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" +#include <qdatatable.h> + +StatusPicker::StatusPicker( TQWidget *parent, const char *name ) + : TQComboBox( parent, name ) +{ + TQSqlCursor cur( "status" ); + cur.select( cur.index( "name" ) ); + + int i = 0; + while ( cur.next() ) { + insertItem( cur.value( "name" ).toString(), i ); + index2id[i] = cur.value( "id" ).toInt(); + i++; + } +} + + +int StatusPicker::statusId() const +{ + return index2id[ currentItem() ]; +} + + +void StatusPicker::setStatusId( int statusid ) +{ + TQMap<int,int>::Iterator it; + for ( it = index2id.begin(); it != index2id.end(); ++it ) { + if ( it.data() == statusid ) { + setCurrentItem( it.key() ); + break; + } + } +} + + + +TQWidget *CustomSqlEditorFactory::createEditor( + TQWidget *parent, const TQSqlField *field ) +{ + if ( field->name() == "statusid" ) { + TQWidget *editor = new StatusPicker( parent ); + return editor; + } + + return TQSqlEditorFactory::createEditor( parent, field ); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + TQSqlCursor staffCursor( "staff" ); + + TQDataTable *staffTable = new TQDataTable( &staffCursor ); + TQSqlPropertyMap *propMap = new TQSqlPropertyMap(); + CustomSqlEditorFactory *editorFactory = new CustomSqlEditorFactory(); + propMap->insert( "StatusPicker", "statusid" ); + staffTable->installPropertyMap( propMap ); + staffTable->installEditorFactory( editorFactory ); + + app.setMainWidget( staffTable ); + + staffTable->addColumn( "forename", "Forename" ); + staffTable->addColumn( "surname", "Surname" ); + staffTable->addColumn( "salary", "Annual Salary" ); + staffTable->addColumn( "statusid", "Status" ); + + TQStringList order = TQStringList() << "surname" << "forename"; + staffTable->setSort( order ); + + staffTable->refresh(); + staffTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/table3/main.h b/examples/sql/overview/table3/main.h new file mode 100644 index 000000000..dd0d8d095 --- /dev/null +++ b/examples/sql/overview/table3/main.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qcombobox.h> +#include <qmap.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qsqleditorfactory.h> +#include <qsqlpropertymap.h> +#include "../connection.h" + +class StatusPicker : public TQComboBox +{ + Q_OBJECT + Q_PROPERTY( int statusid READ statusId WRITE setStatusId ) + public: + StatusPicker( TQWidget *parent=0, const char *name=0 ); + int statusId() const; + void setStatusId( int id ); + private: + TQMap< int, int > index2id; +}; + + +class CustomSqlEditorFactory : public TQSqlEditorFactory +{ + Q_OBJECT + public: + TQWidget *createEditor( TQWidget *parent, const TQSqlField *field ); +}; + + + diff --git a/examples/sql/overview/table3/table3.pro b/examples/sql/overview/table3/table3.pro new file mode 100644 index 000000000..c490bedd0 --- /dev/null +++ b/examples/sql/overview/table3/table3.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = main.h +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/table4/main.cpp b/examples/sql/overview/table4/main.cpp new file mode 100644 index 000000000..b557b3f1e --- /dev/null +++ b/examples/sql/overview/table4/main.cpp @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "main.h" + + +StatusPicker::StatusPicker( TQWidget *parent, const char *name ) + : TQComboBox( parent, name ) +{ + TQSqlCursor cur( "status" ); + cur.select( cur.index( "name" ) ); + + int i = 0; + while ( cur.next() ) { + insertItem( cur.value( "name" ).toString(), i ); + index2id[i] = cur.value( "id" ).toInt(); + i++; + } +} + + +int StatusPicker::statusId() const +{ + return index2id[ currentItem() ]; +} + + +void StatusPicker::setStatusId( int statusid ) +{ + TQMap<int,int>::Iterator it; + for ( it = index2id.begin(); it != index2id.end(); ++it ) { + if ( it.data() == statusid ) { + setCurrentItem( it.key() ); + break; + } + } +} + + +void CustomTable::paintField( TQPainter * p, const TQSqlField* field, + const TQRect & cr, bool b) +{ + if ( !field ) + return; + if ( field->name() == "statusid" ) { + TQSqlQuery query( "SELECT name FROM status WHERE id=" + + field->value().toString() ); + TQString text; + if ( query.next() ) { + text = query.value( 0 ).toString(); + } + p->drawText( 2,2, cr.width()-4, cr.height()-4, fieldAlignment( field ), text ); + } + else { + TQDataTable::paintField( p, field, cr, b) ; + } +} + + +TQWidget *CustomSqlEditorFactory::createEditor( + TQWidget *parent, const TQSqlField *field ) +{ + if ( field->name() == "statusid" ) { + TQWidget *editor = new StatusPicker( parent ); + return editor; + } + + return TQSqlEditorFactory::createEditor( parent, field ); +} + + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv ); + + if ( createConnections() ) { + TQSqlCursor staffCursor( "staff" ); + + CustomTable *staffTable = new CustomTable( &staffCursor ); + TQSqlPropertyMap *propMap = new TQSqlPropertyMap(); + CustomSqlEditorFactory *editorFactory = new CustomSqlEditorFactory(); + propMap->insert( "StatusPicker", "statusid" ); + staffTable->installPropertyMap( propMap ); + staffTable->installEditorFactory( editorFactory ); + + app.setMainWidget( staffTable ); + + staffTable->addColumn( "forename", "Forename" ); + staffTable->addColumn( "surname", "Surname" ); + staffTable->addColumn( "salary", "Annual Salary" ); + staffTable->addColumn( "statusid", "Status" ); + + TQStringList order = TQStringList() << "surname" << "forename"; + staffTable->setSort( order ); + + staffTable->refresh(); + staffTable->show(); + + return app.exec(); + } + + return 1; +} diff --git a/examples/sql/overview/table4/main.h b/examples/sql/overview/table4/main.h new file mode 100644 index 000000000..59edfc9d5 --- /dev/null +++ b/examples/sql/overview/table4/main.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qcombobox.h> +#include <qmap.h> +#include <qpainter.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include <qsqleditorfactory.h> +#include <qsqlpropertymap.h> +#include <qdatatable.h> +#include "../connection.h" + +class StatusPicker : public TQComboBox +{ + Q_OBJECT + Q_PROPERTY( int statusid READ statusId WRITE setStatusId ) +public: + StatusPicker( TQWidget *parent=0, const char *name=0 ); + int statusId() const; + void setStatusId( int id ); +private: + TQMap< int, int > index2id; +}; + + +class CustomTable : public TQDataTable +{ + Q_OBJECT +public: + CustomTable( + TQSqlCursor *cursor, bool autoPopulate = FALSE, + TQWidget * parent = 0, const char * name = 0 ) : + TQDataTable( cursor, autoPopulate, parent, name ) {} + void paintField( + TQPainter * p, const TQSqlField* field, const TQRect & cr, bool ); + +}; + + +class CustomSqlEditorFactory : public TQSqlEditorFactory +{ + Q_OBJECT +public: + TQWidget *createEditor( TQWidget *parent, const TQSqlField *field ); +}; diff --git a/examples/sql/overview/table4/table4.pro b/examples/sql/overview/table4/table4.pro new file mode 100644 index 000000000..c490bedd0 --- /dev/null +++ b/examples/sql/overview/table4/table4.pro @@ -0,0 +1,8 @@ +TEMPLATE = app + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = main.h +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/overview/update/README b/examples/sql/overview/update/README new file mode 100644 index 000000000..eae3cd7f9 --- /dev/null +++ b/examples/sql/overview/update/README @@ -0,0 +1 @@ +This example is part of the overview in sql.html diff --git a/examples/sql/overview/update/main.cpp b/examples/sql/overview/update/main.cpp new file mode 100644 index 000000000..207702c06 --- /dev/null +++ b/examples/sql/overview/update/main.cpp @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qsqlcursor.h> +#include "../connection.h" + +int main( int argc, char *argv[] ) +{ + TQApplication app( argc, argv, FALSE ); + + if ( createConnections() ) { + TQSqlCursor cur( "prices" ); + cur.select( "id=202" ); + if ( cur.next() ) { + TQSqlRecord *buffer = cur.primeUpdate(); + double price = buffer->value( "price" ).toDouble(); + double newprice = price * 1.05; + buffer->setValue( "price", newprice ); + cur.update(); + } + } + + return 0; +} diff --git a/examples/sql/overview/update/update.pro b/examples/sql/overview/update/update.pro new file mode 100644 index 000000000..9e6df96c9 --- /dev/null +++ b/examples/sql/overview/update/update.pro @@ -0,0 +1,9 @@ +TEMPLATE = app + +CONFIG += qt warn_on release +DEPENDPATH = ../../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp ../connection.cpp diff --git a/examples/sql/sql.pro b/examples/sql/sql.pro new file mode 100644 index 000000000..35f92914c --- /dev/null +++ b/examples/sql/sql.pro @@ -0,0 +1,9 @@ +TEMPLATE = subdirs + +CONFIG += ordered + +REQUIRES = full-config + +SUBDIRS = overview \ + sqltable \ + blob diff --git a/examples/sql/sqltable/README b/examples/sql/sqltable/README new file mode 100644 index 000000000..701458835 --- /dev/null +++ b/examples/sql/sqltable/README @@ -0,0 +1,18 @@ +This SQL table example retquires a connection to a SQL database. +Modify main.cpp to connect to your specific database. + +This example program expects a table called 'simpletable' to exist in +the database. You can create this table by running the following SQL +script (modify to suit your backend, if necessary): + +drop table simpletable; +create table simpletable +(id number primary key, +name varchar(20), +address varchar(20) ); + +-- optional, some sample data +insert into simpletable (id, name, address) +values (1, 'Trond', 'Oslo'); +insert into simpletable (id, name, address) +values (2, 'Dave', 'Oslo'); diff --git a/examples/sql/sqltable/main.cpp b/examples/sql/sqltable/main.cpp new file mode 100644 index 000000000..68d31389a --- /dev/null +++ b/examples/sql/sqltable/main.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qsqldatabase.h> +#include <qdatatable.h> +#include <qsqlcursor.h> +#include <qmessagebox.h> + +/* Modify the following to match your environment */ +#define DRIVER "TQSQLITE" /* see the TQt SQL documentation for a list of available drivers */ +#define DATABASE ":memory:" /* the name of your database */ +#define USER "" /* user name with appropriate rights */ +#define PASSWORD "" /* password for USER */ +#define HOST "" /* host on which the database is running */ + +class SimpleCursor : public TQSqlCursor +{ +public: + SimpleCursor () : TQSqlCursor( "simpletable" ) {} +protected: + TQSqlRecord* primeInsert() + { + /* a real-world application would use sequences, or the like */ + TQSqlRecord* buf = TQSqlCursor::primeInsert(); + TQSqlQuery q( "select max(id)+1 from simpletable" ); + if ( q.next() ) + buf->setValue( "id", q.value(0) ); + return buf; + } +}; + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + + TQSqlDatabase * db = TQSqlDatabase::addDatabase( DRIVER ); + db->setDatabaseName( DATABASE ); + db->setUserName( USER ); + db->setPassword( PASSWORD ); + db->setHostName( HOST ); + + if( !db->open() ){ + db->lastError().showMessage( "An error occured. Please read the README file in the sqltable" + "dir for more information.\n\n" ); + return 1; + } + + if (!db->tables().contains("simpletable")) { + TQSqlQuery q("create table simpletable(id int, name varchar(20), address varchar(20))", db); + } + + SimpleCursor cursor; + + TQDataTable table( &cursor ); /* data table uses our cursor */ + table.addColumn( "name", "Name" ); + table.addColumn( "address", "Address" ); + table.setSorting( TRUE ); + + a.setMainWidget( &table ); + table.refresh(); /* load data */ + table.show(); /* show widget */ + + return a.exec(); +} diff --git a/examples/sql/sqltable/sqltable.doc b/examples/sql/sqltable/sqltable.doc new file mode 100644 index 000000000..bfa86f551 --- /dev/null +++ b/examples/sql/sqltable/sqltable.doc @@ -0,0 +1,24 @@ +/* +/**************************************************************************** +** +** 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. +** +*****************************************************************************/ +*/ +/*! \page sqltable-example.html + + \ingroup sql-examples + \title SQL Table + + This example shows how to use a QDataTable to browse data in a SQL database. + + <hr> + + Implementation: + + \include sql/sqltable/main.cpp + +*/ diff --git a/examples/sql/sqltable/sqltable.pro b/examples/sql/sqltable/sqltable.pro new file mode 100644 index 000000000..6a8c216f6 --- /dev/null +++ b/examples/sql/sqltable/sqltable.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = sqltable + +CONFIG += qt warn_on release + +REQUIRES = full-config + +HEADERS = +SOURCES = main.cpp +INTERFACES = diff --git a/examples/tabdialog/main.cpp b/examples/tabdialog/main.cpp new file mode 100644 index 000000000..954f4dc94 --- /dev/null +++ b/examples/tabdialog/main.cpp @@ -0,0 +1,26 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "tabdialog.h" +#include <qapplication.h> +#include <qstring.h> + +int main( int argc, char **argv ) +{ + + TQApplication a( argc, argv ); + + TabDialog tabdialog( 0, "tabdialog", TQString( argc < 2 ? "." : argv[1] ) ); + tabdialog.resize( 450, 350 ); + tabdialog.setCaption( "TQt Example - Tabbed Dialog" ); + a.setMainWidget( &tabdialog ); + tabdialog.show(); + + return a.exec(); +} diff --git a/examples/tabdialog/tabdialog.cpp b/examples/tabdialog/tabdialog.cpp new file mode 100644 index 000000000..774b74c73 --- /dev/null +++ b/examples/tabdialog/tabdialog.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "tabdialog.h" + +#include <qvbox.h> +#include <qlabel.h> +#include <qlineedit.h> +#include <qdatetime.h> +#include <qbuttongroup.h> +#include <qcheckbox.h> +#include <qlistbox.h> +#include <qapplication.h> + +TabDialog::TabDialog( TQWidget *parent, const char *name, const TQString &_filename ) + : TQTabDialog( parent, name ), filename( _filename ), fileinfo( filename ) +{ + setupTab1(); + setupTab2(); + setupTab3(); + + connect( this, SIGNAL( applyButtonPressed() ), qApp, SLOT( tquit() ) ); +} + +void TabDialog::setupTab1() +{ + TQVBox *tab1 = new TQVBox( this ); + tab1->setMargin( 5 ); + + (void)new TQLabel( "Filename:", tab1 ); + TQLineEdit *fname = new TQLineEdit( filename, tab1 ); + fname->setFocus(); + + (void)new TQLabel( "Path:", tab1 ); + TQLabel *path = new TQLabel( fileinfo.dirPath( TRUE ), tab1 ); + path->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + (void)new TQLabel( "Size:", tab1 ); + ulong kb = (ulong)(fileinfo.size()/1024); + TQLabel *size = new TQLabel( TQString( "%1 KB" ).arg( kb ), tab1 ); + size->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + (void)new TQLabel( "Last Read:", tab1 ); + TQLabel *lread = new TQLabel( fileinfo.lastRead().toString(), tab1 ); + lread->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + (void)new TQLabel( "Last Modified:", tab1 ); + TQLabel *lmodif = new TQLabel( fileinfo.lastModified().toString(), tab1 ); + lmodif->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + addTab( tab1, "General" ); +} + +void TabDialog::setupTab2() +{ + TQVBox *tab2 = new TQVBox( this ); + tab2->setMargin( 5 ); + + TQButtonGroup *bg = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Permissions", tab2 ); + + TQCheckBox *readable = new TQCheckBox( "Readable", bg ); + if ( fileinfo.isReadable() ) + readable->setChecked( TRUE ); + + TQCheckBox *writable = new TQCheckBox( "Writeable", bg ); + if ( fileinfo.isWritable() ) + writable->setChecked( TRUE ); + + TQCheckBox *executable = new TQCheckBox( "Executable", bg ); + if ( fileinfo.isExecutable() ) + executable->setChecked( TRUE ); + + TQButtonGroup *bg2 = new TQButtonGroup( 2, TQGroupBox::Horizontal, "Owner", tab2 ); + + (void)new TQLabel( "Owner", bg2 ); + TQLabel *owner = new TQLabel( fileinfo.owner(), bg2 ); + owner->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + (void)new TQLabel( "Group", bg2 ); + TQLabel *group = new TQLabel( fileinfo.group(), bg2 ); + group->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + + addTab( tab2, "Permissions" ); +} + +void TabDialog::setupTab3() +{ + TQVBox *tab3 = new TQVBox( this ); + tab3->setMargin( 5 ); + tab3->setSpacing( 5 ); + + (void)new TQLabel( TQString( "Open %1 with:" ).arg( filename ), tab3 ); + + TQListBox *prgs = new TQListBox( tab3 ); + for ( unsigned int i = 0; i < 30; i++ ) { + TQString prg = TQString( "Application %1" ).arg( i ); + prgs->insertItem( prg ); + } + prgs->setCurrentItem( 3 ); + + (void)new TQCheckBox( TQString( "Open files with the extension '%1' always with this application" ).arg( fileinfo.extension() ), tab3 ); + + addTab( tab3, "Applications" ); +} diff --git a/examples/tabdialog/tabdialog.doc b/examples/tabdialog/tabdialog.doc new file mode 100644 index 000000000..c52e6653c --- /dev/null +++ b/examples/tabdialog/tabdialog.doc @@ -0,0 +1,31 @@ +/* +*/ +/*! \page tabdialog-example.html + + \ingroup examples + \title Tabdialog + + This example shows how to use a dialog with multiple tabs + (pages). To start the program you have to specify a filename + as the first argument. The dialog shows information about the + file separated onto different tabs. + + <hr> + + Header file: + + \include tabdialog/tabdialog.h + + <hr> + + Implementation: + + \include tabdialog/tabdialog.cpp + + <hr> + + Main: + + \include tabdialog/main.cpp +*/ + diff --git a/examples/tabdialog/tabdialog.h b/examples/tabdialog/tabdialog.h new file mode 100644 index 000000000..363c07eb0 --- /dev/null +++ b/examples/tabdialog/tabdialog.h @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TABDIALOG_H +#define TABDIALOG_H + +#include <qtabdialog.h> +#include <qstring.h> +#include <qfileinfo.h> + +class TabDialog : public TQTabDialog +{ + Q_OBJECT + +public: + TabDialog( TQWidget *parent, const char *name, const TQString &_filename ); + +protected: + TQString filename; + TQFileInfo fileinfo; + + void setupTab1(); + void setupTab2(); + void setupTab3(); + +}; + +#endif diff --git a/examples/tabdialog/tabdialog.pro b/examples/tabdialog/tabdialog.pro new file mode 100644 index 000000000..40cfbe97a --- /dev/null +++ b/examples/tabdialog/tabdialog.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = tabdialog + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = tabdialog.h +SOURCES = main.cpp \ + tabdialog.cpp diff --git a/examples/table/bigtable/bigtable.doc b/examples/table/bigtable/bigtable.doc new file mode 100644 index 000000000..7f8a5c2da --- /dev/null +++ b/examples/table/bigtable/bigtable.doc @@ -0,0 +1,19 @@ +/* +*/ + +/*! \page bigtable-example.html + + \ingroup table-examples + + \title How to create a large, sparse QTable + + This example shows a sparse table implementation using a QIntDict to + keep track of the cells that are actually in use. + + <hr> + + Implementation: + + \include table/bigtable/main.cpp + +*/ diff --git a/examples/table/bigtable/bigtable.pro b/examples/table/bigtable/bigtable.pro new file mode 100644 index 000000000..e059dd953 --- /dev/null +++ b/examples/table/bigtable/bigtable.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = bigtable + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = table full-config + +HEADERS = +SOURCES = main.cpp diff --git a/examples/table/bigtable/main.cpp b/examples/table/bigtable/main.cpp new file mode 100644 index 000000000..b0d42b22b --- /dev/null +++ b/examples/table/bigtable/main.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qtable.h> + +// Table size + +const int numRows = 1000000; +const int numCols = 1000000; + +class MyTable : public TQTable +{ +public: + MyTable( int r, int c ) : TQTable( r, c ) { + items.setAutoDelete( TRUE ); + widgets.setAutoDelete( TRUE ); + setCaption( tr( "A 1 Million x 1 Million Cell Table" ) ); + setLeftMargin( fontMetrics().width( "W999999W" ) ); + } + + void resizeData( int ) {} + TQTableItem *item( int r, int c ) const { return items.find( indexOf( r, c ) ); } + void setItem( int r, int c, TQTableItem *i ) { items.replace( indexOf( r, c ), i ); } + void clearCell( int r, int c ) { items.remove( indexOf( r, c ) ); } + void takeItem( TQTableItem *item ) + { + items.setAutoDelete( FALSE ); + items.remove( indexOf( item->row(), item->col() ) ); + items.setAutoDelete( TRUE ); + } + void insertWidget( int r, int c, TQWidget *w ) { widgets.replace( indexOf( r, c ), w ); } + TQWidget *cellWidget( int r, int c ) const { return widgets.find( indexOf( r, c ) ); } + void clearCellWidget( int r, int c ) + { + TQWidget *w = widgets.take( indexOf( r, c ) ); + if ( w ) + w->deleteLater(); + } + +private: + TQIntDict<TQTableItem> items; + TQIntDict<TQWidget> widgets; + +}; + +// The program starts here. + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + + MyTable table( numRows, numCols ); + app.setMainWidget( &table ); + table.show(); + return app.exec(); +} diff --git a/examples/table/small-table-demo/main.cpp b/examples/table/small-table-demo/main.cpp new file mode 100644 index 000000000..8039aadf2 --- /dev/null +++ b/examples/table/small-table-demo/main.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qtable.h> +#include <qimage.h> +#include <qpixmap.h> +#include <qstringlist.h> + +// TQt logo: static const char *qtlogo_xpm[] +#include "qtlogo.xpm" + +// Table size + +const int numRows = 30; +const int numCols = 10; + +// The program starts here. + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + + TQTable table( numRows, numCols ); + + TQHeader *header = table.horizontalHeader(); + header->setLabel( 0, TQObject::tr( "Tiny" ), 40 ); + header->setLabel( 1, TQObject::tr( "Checkboxes" ) ); + header->setLabel( 5, TQObject::tr( "Combos" ) ); + table.setColumnMovingEnabled(TRUE); + + TQImage img( qtlogo_xpm ); + TQPixmap pix = img.scaleHeight( table.rowHeight(3) ); + table.setPixmap( 3, 2, pix ); + table.setText( 3, 2, "A Pixmap" ); + + TQStringList comboEntries; + comboEntries << "one" << "two" << "three" << "four"; + + for ( int i = 0; i < numRows; ++i ){ + TQComboTableItem * item = new TQComboTableItem( &table, comboEntries, FALSE ); + item->setCurrentItem( i % 4 ); + table.setItem( i, 5, item ); + } + for ( int j = 0; j < numRows; ++j ) + table.setItem( j, 1, new TQCheckTableItem( &table, "Check me" ) ); + + app.setMainWidget( &table ); + table.show(); + return app.exec(); +} diff --git a/examples/table/small-table-demo/qtlogo.xpm b/examples/table/small-table-demo/qtlogo.xpm new file mode 100644 index 000000000..d8aee6add --- /dev/null +++ b/examples/table/small-table-demo/qtlogo.xpm @@ -0,0 +1,123 @@ +/* XPM */ +static const char *qtlogo_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 100 100 16 1", +/* colors */ +". c #000000", +"# c #0b0d01", +"a c #161a02", +"b c #202703", +"c c #2b3505", +"d c #364206", +"e c #414f07", +"f c #4c5c08", +"g c #566909", +"h c #61760a", +"i c #6c830b", +"j c #77900c", +"k c #829e0e", +"l c #8cab0f", +"m c #97b810", +"n c #a2c511", +/* pixels */ +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmkhgecbbabbcdefikmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkjdc#..............#ceilnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmida......................aehmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmgc#.....................##..#abgmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmgd#..............................#chmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnjd....##..................#.....###..#eimnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnmga...#...............................#..agmnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnke#.......#................................acknnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnjc...#........................##....#.........dinnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnib..#...............................#...........cjnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnhb....#.#......................##......#..........ahnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnib..#..........#.....####aabba#.....#.....##.......#cinnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnjb.................#acehklmmmmljihca..................bjnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnkc..#.............#cfknnnnnnnnnnnnnlkhc#..#.............cknnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnme......##....#..#dhmnnnnnnnnnnnnnnnnnnlhda...##.......##.dmnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnng#.#....#......#bglnnnnnnnnnnnnnnnnnnnnnnlfa...#...#....#.#fnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnja...#.......#.#dknnnnnnnnnnnnnnnnnnnnnnnnnnmda.....#....##.ajnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnmd..#........#.#emnnnnnnnnnnnnnnnnnnnnnnnnnnnnmf#.#...#.......dlnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnf...#....#..#.#hnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnh#.#...........gnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnmd.#..........#hlnnnnnnnnnnnnnnnnnnnnnnnknnnnnnnnmg#............dlnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnng#.#..........fmnnnnnnnnnnnnnnnnnnnnnnnhcgnnnnnnnnme............agnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnmc..#......#..dlnnnnnnnnnnnnnnnnnnnnnnnha.ahnnnnnnnnld.#..........cmnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnni#.#.........bknnnnnnnnnnnnnnnnnnnnnnnha...ahnnnnnnnnkb...........#innnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnd..#........#gnnnnnnnnnnnnnnnnnnnnnnng#...#.#hnnnnnnnnh..........#.ennnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnla.#......#..dlnnnnnnnnnnnnnnnnnnnnnmha..#.##.bhnnnnnnnlc.........#.aknnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnj.........#.#innnnnnnnnnnnnnnnnnnnnnia.#.......ahnnnnnnni............innnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnd...........cmnnnnnnnnnnnnnnnnnnnnnha............hnnnnnnnc.........##dnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnmc..........#fnnnnnnnnnnnnnnnnnnnnnha....#...##...bgmnnnnnf##.........cmnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnk#..........aknnnnnnnnnnnnnnnnnnnnha..#.....#......cknnnnnka#.........aknnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnh...........cnnnnnnnnnnnnnnnnnnnni#..#.....#......ahmnnnnnnc...........innnnnnnnnnnnnn", +"nnnnnnnnnnnnnng..........#ennnnnnnnnnnnnnnnnnnha.........#..#..#imnnnnnnne........#..gnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnne..........#hnnnnnnnnnnnnnnnnnnha.....#.........ahnnnnnnnnnh#.......#..ennnnnnnnnnnnnn", +"nnnnnnnnnnnnnnc..........#knnnnnnnnnnnnnnnnnha.#...##........ainnnnnnnnnnk#..........cnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnmb..........#lnnnnnnnnnnnnnnnnia.#.............#hnnnnnnnnnnnma..........bnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnma..........amnnnnnnnnnnnnnnnh#.............#.ainnnnnnnnnnnnna..........bnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnma..........amnnnnnnnnnnnnnnha.............#.#hnnnnnnnnnnnnnna..........bmnnnnnnnnnnnnn", +"nnnnnnnnnnnnnmb..........bmnnnnnnnnnnnnmha..............#.#hnnnnnnnnnnnnnna..........amnnnnnnnnnnnnn", +"nnnnnnnnnnnnnmb..........amnnnnnnnnnnnmia.##..#..........#.ahnnnnnnnnnnnnna..........bmnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnc..........alnnnnnnnnnnnha.##..##.............#hnnnnnnnnnnnla..........cmnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnd..........#jnnnnnnnnnnga..#...................ahnnnnnnnnnnj#..........dnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnne...........innnnnnnnnha.#....................#.ahmnnnnnnnnh.#.........ennnnnnnnnnnnnn", +"nnnnnnnnnnnnnne.........#.hnnnnnnnnia.#...#...#.........#.....#.imnnnnnnng.#......#.#fnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnni....#..#.#.cmnnnnnnh#..#..#...#...#..............#hnnnnnnnb...........innnnnnnnnnnnnn", +"nnnnnnnnnnnnnnj#......#...aknnnnnkc.....#..##...#..#.............ahnnnnnka........#.#knnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnlb.#.........hnnnnnnga..#...##...#.##...............ahnnnnf.........#.bmnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnne.#.......#.clnnnnnnh#.#..##..#..#hha.............#.ahmnmb.........#.ennnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnni...........#hnnnnnnnh#...#..#..#hnnh#.#.............#ini#..#.....#..innnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnla......#....dlnnnnnnnhb....#..bhmnnnha.............#.bfc...#.....#.alnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnne#.#..#.....afnnnnnnnni#.....binnnnnnha#.........#................#ennnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnha.#....#..#.amnnnnnnnnh#...#hnnnnnnnnh..............#..........#.#hnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnb.#.....#....dmnnnnnnnnha.ainnnnnnnnnmi..........................dlnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnh#......#..#.afnnnnnnnnngdgmnnnnnnnnnnmha.#..#.................#.gnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnmc.#....#..#..#glnnnnnnnmkmnnnnnnnnnnnnnh#......................clnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnh#.............gmnnnnnnnnnnnnnnnnnnnnnnnha.#...................innnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnme..........##.#elnnnnnnnnnnnnnnnnnnnnnnnh#...................elnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnia...........#.#dknnnnnnnnnnnnnnnnnnnnnnmhb.............##.#alnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnmga..............bhlmnnnnnnnnnnnnnnnnnnnnng.#...........##.#bmnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnmc.......###...#..cimnnnnnnnnnnnnnnnnnnmic..........#......ajnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnkd........#........cfknnnnnnnnnnnnnnkfb#..........#........#hnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnic....##...........#bcehklmmnmljhfba.......................agnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnja#...............###.##aaabba#............................ahnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnhc..#..........................#.............##..........#.ahnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnib..##......................................##..........##.ahmnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnjc......................................................#.#emnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnjd#................####.....#.............##............#cjnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnmfa......................................aba.........a#bknnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnjd.................................#..elmj#.......#.clnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmgda..##................#..........cilnnnha.##..#.elnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlgc#...#...##...........###..##dglnnnnnng#.##.#clnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnliea##....................behlnnnnnnnnnh#..#blnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkidca..............#cfilnnnnnnnnnnnnnib#cknnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmkigecbbbabcdefikmnnnnnnnnnnnnnnnnnhejnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmnnnnnnnnnnnnnnnnnnnnnnnmmnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", +"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn" +}; diff --git a/examples/table/small-table-demo/small-table-demo.doc b/examples/table/small-table-demo/small-table-demo.doc new file mode 100644 index 000000000..d2ced77b7 --- /dev/null +++ b/examples/table/small-table-demo/small-table-demo.doc @@ -0,0 +1,15 @@ +/*! \page small-table-example-example.html + + \ingroup table-examples + \title Small Table Example + + This example displays a QTable and some \l{QTableItem}s. + + <hr> + + Implementation: + + \include table/small-table-demo/main.cpp +*/ + + diff --git a/examples/table/small-table-demo/small-table-demo.pro b/examples/table/small-table-demo/small-table-demo.pro new file mode 100644 index 000000000..c052fa1a8 --- /dev/null +++ b/examples/table/small-table-demo/small-table-demo.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = smalltable + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = table full-config + +HEADERS = +SOURCES = main.cpp diff --git a/examples/table/statistics/main.cpp b/examples/table/statistics/main.cpp new file mode 100644 index 000000000..0f58c21b8 --- /dev/null +++ b/examples/table/statistics/main.cpp @@ -0,0 +1,20 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "statistics.h" +#include <qapplication.h> +int main( int argc, char **argv ) +{ + TQApplication a(argc,argv); + + Table t; + a.setMainWidget( &t ); + t.show(); + return a.exec(); +} diff --git a/examples/table/statistics/statistics.cpp b/examples/table/statistics/statistics.cpp new file mode 100644 index 000000000..f64b67568 --- /dev/null +++ b/examples/table/statistics/statistics.cpp @@ -0,0 +1,171 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "statistics.h" + +#include <qdir.h> +#include <qstringlist.h> +#include <qheader.h> +#include <qcombobox.h> +#include <stdlib.h> + +const char* dirs[] = { + "kernel", + "tools", + "widgets", + "dialogs", + "xml", + "table", + "network", + "opengl", + "canvas", + 0 +}; + +Table::Table() + : TQTable( 10, 100, 0, "table" ) +{ + setSorting( TRUE ); + horizontalHeader()->setLabel( 0, tr( "File" ) ); + horizontalHeader()->setLabel( 1, tr( "Size (bytes)" ) ); + horizontalHeader()->setLabel( 2, tr( "Use in Sum" ) ); + initTable(); + adjustColumn( 0 ); + + // if the user edited something we might need to recalculate the sum + connect( this, SIGNAL( valueChanged( int, int ) ), + this, SLOT( recalcSum( int, int ) ) ); +} + +void Table::initTable() +{ + // read all the TQt source and header files into a list + TQStringList all; + int i = 0; + TQString srcdir( "../../../src/" ); + while ( dirs[ i ] ) { + TQDir dir( srcdir + dirs[ i ] ); + TQStringList lst = dir.entryList( "*.cpp; *.h" ); + for ( TQStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) { + if ( ( *it ).contains( "moc" ) ) + continue; + all << (TQString( dirs[ i ] ) + "/" + *it); + } + ++i; + } + + // set the number of rows we'll need for the table + setNumRows( all.count() + 1 ); + i = 0; + int sum = 0; + + // insert the data into the table + for ( TQStringList::Iterator it = all.begin(); it != all.end(); ++it ) { + setText( i, 0, *it ); + TQFile f( srcdir + *it ); + setText( i, 1, TQString::number( (ulong)f.size() ) ); + ComboItem *ci = new ComboItem( this, TQTableItem::WhenCurrent ); + setItem( i++, 2, ci ); + sum += f.size(); + } + + // last row should show the sum + TableItem *i1 = new TableItem( this, TQTableItem::Never, tr( "Sum" ) ); + setItem( i, 0, i1 ); + TableItem *i2 = new TableItem( this, TQTableItem::Never, TQString::number( sum ) ); + setItem( i, 1, i2 ); +} + +void Table::recalcSum( int, int col ) +{ + // only recalc if a value in the second or third column changed + if ( col < 1 || col > 2 ) + return; + + // recalc sum + int sum = 0; + for ( int i = 0; i < numRows() - 1; ++i ) { + if ( text( i, 2 ) == "No" ) + continue; + sum += text( i, 1 ).toInt(); + } + + // insert calculated data + TableItem *i1 = new TableItem( this, TQTableItem::Never, tr( "Sum" ) ); + setItem( numRows() - 1, 0, i1 ); + TableItem *i2 = new TableItem( this, TQTableItem::Never, TQString::number( sum ) ); + setItem( numRows() - 1, 1, i2 ); +} + +void Table::sortColumn( int col, bool ascending, bool /*wholeRows*/ ) +{ + // sum row should not be sorted, so get rid of it for now + clearCell( numRows() - 1, 0 ); + clearCell( numRows() - 1, 1 ); + // do sort + TQTable::sortColumn( col, ascending, TRUE ); + // re-insert sum row + recalcSum( 0, 1 ); +} + + + +void TableItem::paint( TQPainter *p, const TQColorGroup &cg, const TQRect &cr, bool selected ) +{ + TQColorGroup g( cg ); + // last row is the sum row - we want to make it more visible by + // using a red background + if ( row() == table()->numRows() - 1 ) + g.setColor( TQColorGroup::Base, red ); + TQTableItem::paint( p, g, cr, selected ); +} + + + + +ComboItem::ComboItem( TQTable *t, EditType et ) + : TQTableItem( t, et, "Yes" ), cb( 0 ) +{ + // we do not want this item to be replaced + setReplaceable( FALSE ); +} + +TQWidget *ComboItem::createEditor() const +{ + // create an editor - a combobox in our case + ( (ComboItem*)this )->cb = new TQComboBox( table()->viewport() ); + TQObject::connect( cb, SIGNAL( activated( int ) ), table(), SLOT( doValueChanged() ) ); + cb->insertItem( "Yes" ); + cb->insertItem( "No" ); + // and initialize it + cb->setCurrentItem( text() == "No" ? 1 : 0 ); + return cb; +} + +void ComboItem::setContentFromEditor( TQWidget *w ) +{ + // the user changed the value of the combobox, so synchronize the + // value of the item (its text), with the value of the combobox + if ( w->inherits( "TQComboBox" ) ) + setText( ( (TQComboBox*)w )->currentText() ); + else + TQTableItem::setContentFromEditor( w ); +} + +void ComboItem::setText( const TQString &s ) +{ + if ( cb ) { + // initialize the combobox from the text + if ( s == "No" ) + cb->setCurrentItem( 1 ); + else + cb->setCurrentItem( 0 ); + } + TQTableItem::setText( s ); +} diff --git a/examples/table/statistics/statistics.doc b/examples/table/statistics/statistics.doc new file mode 100644 index 000000000..4cd47d897 --- /dev/null +++ b/examples/table/statistics/statistics.doc @@ -0,0 +1,27 @@ +/*! \page statistics-example.html + + \ingroup table-examples + \title Table Example + + Another QTable example. + + <hr> + + Header file: + + \include table/statistics/statistics.h + + <hr> + + Implementation: + + \include table/statistics/statistics.cpp + + <hr> + + Main: + + \include table/statistics/main.cpp +*/ + + diff --git a/examples/table/statistics/statistics.h b/examples/table/statistics/statistics.h new file mode 100644 index 000000000..efb0358a6 --- /dev/null +++ b/examples/table/statistics/statistics.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef STATISTICS_H +#define STATISTICS_H + +#include <qtable.h> +#include <qcombobox.h> + +class TableItem : public TQTableItem +{ +public: + TableItem( TQTable *t, EditType et, const TQString &txt ) : TQTableItem( t, et, txt ) {} + void paint( TQPainter *p, const TQColorGroup &cg, const TQRect &cr, bool selected ); +}; + +class ComboItem : public TQTableItem +{ +public: + ComboItem( TQTable *t, EditType et ); + TQWidget *createEditor() const; + void setContentFromEditor( TQWidget *w ); + void setText( const TQString &s ); + +private: + TQComboBox *cb; + +}; + +class Table : public TQTable +{ + Q_OBJECT + +public: + Table(); + void sortColumn( int col, bool ascending, bool wholeRows ); + +private slots: + void recalcSum( int row, int col ); + +private: + void initTable(); + +}; + +#endif diff --git a/examples/table/statistics/statistics.pro b/examples/table/statistics/statistics.pro new file mode 100644 index 000000000..d172d5266 --- /dev/null +++ b/examples/table/statistics/statistics.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = statistics + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = table full-config + +HEADERS = statistics.h +SOURCES = statistics.cpp main.cpp diff --git a/examples/tablet/canvas.cpp b/examples/tablet/canvas.cpp new file mode 100644 index 000000000..6d5c0fe75 --- /dev/null +++ b/examples/tablet/canvas.cpp @@ -0,0 +1,178 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "canvas.h" + +#include <qapplication.h> +#include <qpainter.h> +#include <qevent.h> +#include <qrect.h> + +const bool no_writing = FALSE; + +Canvas::Canvas( TQWidget *parent, const char *name, WFlags fl ) + : TQWidget( parent, name, WStaticContents | fl ), + pen( TQt::red, 3 ), polyline(3), + mousePressed( FALSE ), oldPressure( 0 ), saveColor( red ), + buffer( width(), height() ) +{ + + if ((qApp->argc() > 0) && !buffer.load(qApp->argv()[1])) + buffer.fill( colorGroup().base() ); + setBackgroundMode( TQWidget::PaletteBase ); +#ifndef QT_NO_CURSOR + setCursor( TQt::crossCursor ); +#endif +} + +void Canvas::save( const TQString &filename, const TQString &format ) +{ + if ( !no_writing ) + buffer.save( filename, format.upper() ); +} + +void Canvas::clearScreen() +{ + buffer.fill( colorGroup().base() ); + repaint( FALSE ); +} + +void Canvas::mousePressEvent( TQMouseEvent *e ) +{ + mousePressed = TRUE; + polyline[2] = polyline[1] = polyline[0] = e->pos(); +} + +void Canvas::mouseReleaseEvent( TQMouseEvent * ) +{ + mousePressed = FALSE; +} + +void Canvas::mouseMoveEvent( TQMouseEvent *e ) +{ + if ( mousePressed ) { + TQPainter painter; + painter.begin( &buffer ); + painter.setPen( pen ); + polyline[2] = polyline[1]; + polyline[1] = polyline[0]; + polyline[0] = e->pos(); + painter.drawPolyline( polyline ); + painter.end(); + + TQRect r = polyline.boundingRect(); + r = r.normalize(); + r.setLeft( r.left() - penWidth() ); + r.setTop( r.top() - penWidth() ); + r.setRight( r.right() + penWidth() ); + r.setBottom( r.bottom() + penWidth() ); + + bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() ); + } +} + +void Canvas::tabletEvent( TQTabletEvent *e ) +{ + e->accept(); + // change the width based on range of pressure + if ( e->device() == TQTabletEvent::Stylus ) { + if ( e->pressure() >= 0 && e->pressure() <= 32 ) + pen.setColor( saveColor.light(175) ); + else if ( e->pressure() > 32 && e->pressure() <= 64 ) + pen.setColor( saveColor.light(150) ); + else if ( e->pressure() > 64 && e->pressure() <= 96 ) + pen.setColor( saveColor.light(125) ); + else if ( e->pressure() > 96 && e->pressure() <= 128 ) + pen.setColor( saveColor ); + else if ( e->pressure() > 128 && e->pressure() <= 160 ) + pen.setColor( saveColor.dark(150) ); + else if ( e->pressure() > 160 && e->pressure() <= 192 ) + pen.setColor( saveColor.dark(200) ); + else if ( e->pressure() > 192 && e->pressure() <= 224 ) + pen.setColor( saveColor.dark(250) ); + else // pressure > 224 + pen.setColor( saveColor.dark(300) ); + } else if ( e->device() == TQTabletEvent::Eraser + && pen.color() != backgroundColor() ) { + pen.setColor( backgroundColor() ); + } + + int xt = e->xTilt(); + int yt = e->yTilt(); + if ( ( xt > -15 && xt < 15 ) && ( yt > -15 && yt < 15 ) ) + pen.setWidth( 3 ); + else if ( ((xt < -15 && xt > -30) || (xt > 15 && xt < 30)) && + ((yt < -15 && yt > -30) || (yt > 15 && yt < 30 )) ) + pen.setWidth( 6 ); + else if ( ((xt < -30 && xt > -45) || (xt > 30 && xt < 45)) && + ((yt < -30 && yt > -45) || (yt > 30 && yt < 45)) ) + pen.setWidth( 9 ); + else if ( (xt < -45 || xt > 45 ) && ( yt < -45 || yt > 45 ) ) + pen.setWidth( 12 ); + + switch ( e->type() ) { + case TQEvent::TabletPress: + mousePressed = TRUE; + polyline[2] = polyline[1] = polyline[0] = e->pos(); + break; + case TQEvent::TabletRelease: + mousePressed = FALSE; + break; + case TQEvent::TabletMove: + if ( mousePressed ) { + TQPainter painter; + painter.begin( &buffer ); + painter.setPen( pen ); + polyline[2] = polyline[1]; + polyline[1] = polyline[0]; + polyline[0] = e->pos(); + painter.drawPolyline( polyline ); + painter.end(); + + TQRect r = polyline.boundingRect(); + r = r.normalize(); + r.setLeft( r.left() - penWidth() ); + r.setTop( r.top() - penWidth() ); + r.setRight( r.right() + penWidth() ); + r.setBottom( r.bottom() + penWidth() ); + + bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), + r.height() ); + } + break; + default: + break; + } +} + +void Canvas::resizeEvent( TQResizeEvent *e ) +{ + TQWidget::resizeEvent( e ); + + int w = width() > buffer.width() ? + width() : buffer.width(); + int h = height() > buffer.height() ? + height() : buffer.height(); + + TQPixmap tmp( buffer ); + buffer.resize( w, h ); + buffer.fill( colorGroup().base() ); + bitBlt( &buffer, 0, 0, &tmp, 0, 0, tmp.width(), tmp.height() ); +} + +void Canvas::paintEvent( TQPaintEvent *e ) +{ + TQWidget::paintEvent( e ); + + TQMemArray<TQRect> rects = e->region().rects(); + for ( uint i = 0; i < rects.count(); i++ ) { + TQRect r = rects[(int)i]; + bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() ); + } +} diff --git a/examples/tablet/canvas.h b/examples/tablet/canvas.h new file mode 100644 index 000000000..24268b95d --- /dev/null +++ b/examples/tablet/canvas.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qpen.h> +#include <qpixmap.h> +#include <qpoint.h> +#include <qpointarray.h> +#include <qwidget.h> + + +#ifndef _MY_CANVAS_ +#define _MY_CANVAS_ + + +class Canvas : public TQWidget +{ + Q_OBJECT + +public: + Canvas( TQWidget *parent = 0, const char *name = 0, WFlags fl = 0 ); + virtual ~Canvas() {}; + + void setPenColor( const TQColor &c ) + { saveColor = c; + pen.setColor( saveColor ); } + + void setPenWidth( int w ) + { pen.setWidth( w ); } + + TQColor penColor() + { return pen.color(); } + + int penWidth() + { return pen.width(); } + + void save( const TQString &filename, const TQString &format ); + + void clearScreen(); + +protected: + virtual void mousePressEvent( TQMouseEvent *e ); + virtual void mouseReleaseEvent( TQMouseEvent *e ); + virtual void mouseMoveEvent( TQMouseEvent *e ); + virtual void resizeEvent( TQResizeEvent *e ); + virtual void paintEvent( TQPaintEvent *e ); + virtual void tabletEvent( TQTabletEvent *e ); + + TQPen pen; + TQPointArray polyline; + + bool mousePressed; + int oldPressure; + TQColor saveColor; + + TQPixmap buffer; + +}; + +#endif diff --git a/examples/tablet/main.cpp b/examples/tablet/main.cpp new file mode 100644 index 000000000..7f97aa964 --- /dev/null +++ b/examples/tablet/main.cpp @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "scribble.h" +#include "tabletstats.h" +#include <qapplication.h> +#include <qtabwidget.h> + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + TQTabWidget tab; + Scribble scribble(&tab, "scribble"); + TabletStats tabStats( &tab, "tablet stats" ); + + scribble.setMinimumSize( 500, 350 ); + tabStats.setMinimumSize( 500, 350 ); + tab.addTab(&scribble, "Scribble" ); + tab.addTab(&tabStats, "Tablet Stats" ); + + a.setMainWidget( &tab ); + if ( TQApplication::desktop()->width() > 550 + && TQApplication::desktop()->height() > 366 ) + tab.show(); + else + tab.showMaximized(); + return a.exec(); +} diff --git a/examples/tablet/scribble.cpp b/examples/tablet/scribble.cpp new file mode 100644 index 000000000..356a4277b --- /dev/null +++ b/examples/tablet/scribble.cpp @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "canvas.h" +#include "scribble.h" + +#include <qapplication.h> +#include <qevent.h> +#include <qpainter.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qspinbox.h> +#include <qtooltip.h> +#include <qrect.h> +#include <qpoint.h> +#include <qcolordialog.h> +#include <qfiledialog.h> +#include <qcursor.h> +#include <qimage.h> +#include <qstrlist.h> +#include <qpopupmenu.h> +#include <qintdict.h> + + + +Scribble::Scribble( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name ) +{ + canvas = new Canvas( this ); + setCentralWidget( canvas ); + + TQToolBar *tools = new TQToolBar( this ); + + bSave = new TQToolButton( TQPixmap(), "Save", "Save as PNG image", this, SLOT( slotSave() ), tools ); + bSave->setText( "Save as..." ); + + tools->addSeparator(); + + bPColor = new TQToolButton( TQPixmap(), "Choose Pen Color", "Choose Pen Color", this, SLOT( slotColor() ), tools ); + bPColor->setText( "Choose Pen Color..." ); + + tools->addSeparator(); + + bPWidth = new TQSpinBox( 1, 20, 1, tools ); + TQToolTip::add( bPWidth, "Choose Pen Width" ); + connect( bPWidth, SIGNAL( valueChanged( int ) ), this, SLOT( slotWidth( int ) ) ); + bPWidth->setValue( 3 ); + + tools->addSeparator(); + + bClear = new TQToolButton( TQPixmap(), "Clear Screen", "Clear Screen", this, SLOT( slotClear() ), tools ); + bClear->setText( "Clear Screen" ); +} + +/* + +Scribble::Scribble( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name ) +{ + canvas = new Canvas( this ); + setCentralWidget( canvas ); + + TQToolBar *tools = new TQToolBar( this ); + + bSave = new TQPushButton( "Save as...", tools ); + + tools->addSeparator(); + + bPColor = new TQPushButton( "Choose Pen Color...", tools ); + // bPColor->setText( "Choose Pen Color..." ); + + tools->addSeparator(); + + bPWidth = new TQSpinBox( 1, 20, 1, tools ); + TQToolTip::add( bPWidth, "Choose Pen Width" ); + connect( bPWidth, SIGNAL( valueChanged( int ) ), this, SLOT( slotWidth( int ) ) ); + bPWidth->setValue( 3 ); + + tools->addSeparator(); + + bClear = new TQPushButton( "Clear Screen", tools ); + TQObject::connect( bSave, SIGNAL( clicked() ), this, SLOT( slotSave() ) ); + TQObject::connect( bPColor, SIGNAL( clicked() ), this, SLOT( slotColor() ) ); + TQObject::connect( bClear, SIGNAL( clicked() ), this, SLOT( slotClear() ) ); + +} + + */ +void Scribble::slotSave() +{ + TQPopupMenu *menu = new TQPopupMenu( 0 ); + TQIntDict<TQString> formats; + formats.setAutoDelete( TRUE ); + + for ( unsigned int i = 0; i < TQImageIO::outputFormats().count(); i++ ) { + TQString str = TQString( TQImageIO::outputFormats().at( i ) ); + formats.insert( menu->insertItem( TQString( "%1..." ).arg( str ) ), new TQString( str ) ); + } + + menu->setMouseTracking( TRUE ); + int id = menu->exec( bSave->mapToGlobal( TQPoint( 0, bSave->height() + 1 ) ) ); + + if ( id != -1 ) { + TQString format = *formats[ id ]; + + TQString filename = TQFileDialog::getSaveFileName( TQString::null, TQString( "*.%1" ).arg( format.lower() ), this ); + if ( !filename.isEmpty() ) + canvas->save( filename, format ); + } + + delete menu; +} + +void Scribble::slotColor() +{ + TQColor c = TQColorDialog::getColor( canvas->penColor(), this ); + canvas->setPenColor( c ); +} + +void Scribble::slotWidth( int w ) +{ + canvas->setPenWidth( w ); +} + +void Scribble::slotClear() +{ + canvas->clearScreen(); +} diff --git a/examples/tablet/scribble.h b/examples/tablet/scribble.h new file mode 100644 index 000000000..de5749bed --- /dev/null +++ b/examples/tablet/scribble.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef SCRIBBLE_H +#define SCRIBBLE_H + +#include <qmainwindow.h> +#include <qpen.h> +#include <qpoint.h> +#include <qpixmap.h> +#include <qwidget.h> +#include <qstring.h> +#include <qpointarray.h> + +class TQMouseEvent; +class TQResizeEvent; +class TQPaintEvent; +class TQSpinBox; +class TQToolButton; +class Canvas; + +class Scribble : public TQMainWindow +{ + Q_OBJECT + +public: + Scribble( TQWidget *parent = 0, const char *name = 0 ); + +protected: + Canvas* canvas; + + TQSpinBox *bPWidth; + TQToolButton *bPColor, *bSave, *bClear; + +protected slots: + void slotSave(); + void slotColor(); + void slotWidth( int ); + void slotClear(); + +}; + +#endif diff --git a/examples/tablet/tablet.doc b/examples/tablet/tablet.doc new file mode 100644 index 000000000..8ee77f8fc --- /dev/null +++ b/examples/tablet/tablet.doc @@ -0,0 +1,11 @@ +/*! \page tablet-example.html + + \ingroup examples + \title Tablet Example + + This example shows how to interact with a tablet device. + + See \c{$QTDIR/examples/tablet} for the source code. +*/ + + diff --git a/examples/tablet/tablet.pro b/examples/tablet/tablet.pro new file mode 100644 index 000000000..b7b32eaba --- /dev/null +++ b/examples/tablet/tablet.pro @@ -0,0 +1,12 @@ +############################################################## +# Automatically generated by qmake Thu Jul 26 13:46:03 2001 +############################################################## +TEMPLATE = app +TARGET = tablet + +REQUIRES = tablet + +# Input +HEADERS += canvas.h scribble.h tabletstats.h +INTERFACES += tabletstatsbase.ui +SOURCES += canvas.cpp main.cpp scribble.cpp tabletstats.cpp diff --git a/examples/tablet/tabletstats.cpp b/examples/tablet/tabletstats.cpp new file mode 100644 index 000000000..ac3617e0f --- /dev/null +++ b/examples/tablet/tabletstats.cpp @@ -0,0 +1,194 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qlabel.h> +#include <qlayout.h> +#include <qpainter.h> +#include <math.h> + +#include "tabletstats.h" + +MyOrientation::MyOrientation( TQWidget *parent, const char *name ) + : TQFrame( parent, name, WRepaintNoErase ) +{ +// TQSizePolicy mySize( TQSizePolicy::Minimum, TQSizePolicy::Expanding ); +// setSizePolicy( mySize ); + setFrameStyle( TQFrame::Box | TQFrame::Sunken ); +} + +MyOrientation::~MyOrientation() +{ +} + +void MyOrientation::newOrient( int tiltX, int tiltY ) +{ + double PI = 3.14159265359; + int realWidth, + realHeight, + hypot, // a faux hypoteneus, to mess with calculations + shaX, + shaY; + static int oldX = 0, + oldY = 0; + realWidth = width() - 2 * frameWidth(); + realHeight = height() - 2 * frameWidth(); + + + + TQRect cr( 0 + frameWidth(), 0 + frameWidth(), realWidth, realHeight ); + TQPixmap pix( cr.size() ); + pix.fill( this, cr.topLeft() ); + TQPainter p( &pix ); + + if ( realWidth > realHeight ) + hypot = realHeight / 2; + else + hypot = realWidth / 2; + + // create a shadow... + shaX = int(hypot * sin( tiltX * (PI / 180) )); + shaY = int(hypot * sin( tiltY * (PI / 180) )); + + p.translate( realWidth / 2, realHeight / 2 ); + p.setPen( backgroundColor() ); + p.drawLine( 0, 0, oldX, oldY ); + p.setPen( foregroundColor() ); + p.drawLine( 0, 0,shaX, shaY ); + oldX = shaX; + oldY = shaY; + p.end(); + + TQPainter p2( this ); + p2.drawPixmap( cr.topLeft(), pix ); + p2.end(); +} + + +StatsCanvas::StatsCanvas( TQWidget *parent, const char* name ) + : Canvas( parent, name, WRepaintNoErase ) +{ + TQSizePolicy mySize( TQSizePolicy::Expanding, TQSizePolicy::Minimum ); + setSizePolicy( mySize ); +} + +StatsCanvas::~StatsCanvas() +{ +} + +void StatsCanvas::tabletEvent( TQTabletEvent *e ) +{ + static TQRect oldR( -1, -1, -1, -1); + TQPainter p; + + e->accept(); + switch( e->type() ) { + case TQEvent::TabletPress: + qDebug( "Tablet Press" ); + mousePressed = TRUE; + break; + case TQEvent::TabletRelease: + qDebug( "Tablet Release" ); + mousePressed = FALSE; + clearScreen(); + break; + default: + break; + } + + r.setRect( e->x() - e->pressure() / 2, + e->y() - e->pressure() / 2, e->pressure(), e->pressure() ); + TQRect tmpR = r | oldR; + oldR = r; + + update( tmpR ); + emit signalNewTilt( e->xTilt(), e->yTilt() ); + emit signalNewDev( e->device() ); + emit signalNewLoc( e->x(), e->y() ); + emit signalNewPressure( e->pressure() ); +} + +void StatsCanvas::mouseMoveEvent( TQMouseEvent *e ) +{ + qDebug( "Mouse Move" ); + // do nothing + TQWidget::mouseMoveEvent( e ); +} + + +void StatsCanvas::mousePressEvent( TQMouseEvent *e ) +{ + qDebug( "Mouse Press" ); + TQWidget::mousePressEvent( e ); +} + +void StatsCanvas::mouseReleaseEvent( TQMouseEvent *e ) +{ + qDebug( "Mouse Release" ); + TQWidget::mouseReleaseEvent( e ); +} + +void StatsCanvas::paintEvent( TQPaintEvent *e ) +{ + TQPainter p; + p.begin( &buffer ); + p.fillRect( e->rect(), colorGroup().base() ); + + // draw a circle if we have the tablet down + if ( mousePressed ) { + p.setBrush( red ); + p.drawEllipse( r ); + } + bitBlt( this, e->rect().x(), e->rect().y(), &buffer, e->rect().x(), + e->rect().y(), e->rect().width(), e->rect().height() ); + p.end(); +} + +TabletStats::TabletStats( TQWidget *parent, const char *name ) + : TabletStatsBase( parent, name ) +{ + lblXPos->setMinimumSize( lblXPos->sizeHint() ); + lblYPos->setMinimumSize( lblYPos->sizeHint() ); + lblPressure->setMinimumSize( lblPressure->sizeHint() ); + lblDev->setMinimumSize( lblDev->sizeHint() ); + lblXTilt->setMinimumSize( lblXTilt->sizeHint() ); + lblYTilt->setMinimumSize( lblYTilt->sizeHint() ); + + TQObject::connect( statCan, SIGNAL(signalNewTilt(int, int)), + orient, SLOT(newOrient(int, int)) ); + TQObject::connect( statCan, SIGNAL(signalNewTilt(int, int)), + this, SLOT(slotTiltChanged(int, int)) ); + TQObject::connect( statCan, SIGNAL(signalNewDev(int)), + this, SLOT(slotDevChanged(int)) ); + TQObject::connect( statCan, SIGNAL(signalNewLoc(int,int)), + this, SLOT( slotLocationChanged(int,int)) ); +} + +TabletStats::~TabletStats() +{ +} + +void TabletStats::slotDevChanged( int newDev ) +{ + if ( newDev == TQTabletEvent::Stylus ) + lblDev->setText( tr("Stylus") ); + else if ( newDev == TQTabletEvent::Eraser ) + lblDev->setText( tr("Eraser") ); +} + +void TabletStats::slotLocationChanged( int newX, int newY ) +{ + lblXPos->setNum( newX ); + lblYPos->setNum( newY ); +} + +void TabletStats::slotTiltChanged( int newTiltX, int newTiltY ) +{ + lblXTilt->setNum( newTiltX ); + lblYTilt->setNum( newTiltY ); +} diff --git a/examples/tablet/tabletstats.h b/examples/tablet/tabletstats.h new file mode 100644 index 000000000..fca8960fa --- /dev/null +++ b/examples/tablet/tabletstats.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef _TABLET_STATS_ +#define _TABLET_STATS_ + +#include <qwidget.h> +#include <qframe.h> +#include "canvas.h" +#include "tabletstatsbase.h" + +class TQLabel; + +class MyOrientation : public TQFrame +{ + Q_OBJECT +public: + MyOrientation( TQWidget *parent = 0, const char *name = 0 ); + virtual ~MyOrientation(); + +public slots: + void newOrient( int tiltX, int tiltY ); + +}; + +class StatsCanvas : public Canvas +{ + Q_OBJECT +public: + StatsCanvas( TQWidget *parent = 0, const char* name = 0 ); + ~StatsCanvas(); +signals: + void signalNewPressure( int ); + void signalNewTilt( int, int ); + void signalNewDev( int ); + void signalNewLoc( int, int ); + +protected: + void tabletEvent( TQTabletEvent *e ); + void mouseMoveEvent( TQMouseEvent *e ); + void paintEvent( TQPaintEvent *e ); + void mousePressEvent( TQMouseEvent *e ); + void mouseReleaseEvent( TQMouseEvent *e ); + +private: + TQRect r; +}; + +class TabletStats : public TabletStatsBase +{ + Q_OBJECT +public: + TabletStats( TQWidget *parent, const char* name ); + ~TabletStats(); + +private slots: + void slotTiltChanged( int newTiltX, int newTiltY ); + void slotDevChanged( int newDev ); + void slotLocationChanged( int newX, int newY ); + +protected: +}; + +#endif diff --git a/examples/tablet/tabletstatsbase.ui b/examples/tablet/tabletstatsbase.ui new file mode 100644 index 000000000..5c2c16640 --- /dev/null +++ b/examples/tablet/tabletstatsbase.ui @@ -0,0 +1,298 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>TabletStatsBase</class> +<layoutdefaults spacing="6" margin="11"/> +<widget class="TQWidget"> + <property name="name"> + <cstring>TabletStatsBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>657</width> + <height>527</height> + </rect> + </property> + <property name="caption"> + <string>Form1</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout7</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>X Pos:</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>lblXPos</cstring> + </property> + <property name="text"> + <string>0</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="text"> + <string>Y Pos:</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>lblYPos</cstring> + </property> + <property name="text"> + <string>0</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel5</cstring> + </property> + <property name="text"> + <string>Pressure:</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>lblPressure</cstring> + </property> + <property name="text"> + <string>0</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel7</cstring> + </property> + <property name="text"> + <string>Device:</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>lblDev</cstring> + </property> + <property name="text"> + <string>0</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel9</cstring> + </property> + <property name="text"> + <string>Tilt Information</string> + </property> + <property name="alignment"> + <set>AlignAuto|AlignCenter</set> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel10</cstring> + </property> + <property name="text"> + <string>X Tilt:</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>lblXTilt</cstring> + </property> + <property name="text"> + <string>000</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel12</cstring> + </property> + <property name="text"> + <string>Y Tilt:</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>lblYTilt</cstring> + </property> + <property name="text"> + <string>000</string> + </property> + </widget> + </hbox> + </widget> + <widget class="MyOrientation"> + <property name="name"> + <cstring>orient</cstring> + </property> + </widget> + </vbox> + </widget> + <widget class="StatsCanvas"> + <property name="name"> + <cstring>statCan</cstring> + </property> + </widget> + </hbox> +</widget> +<customwidgets> + <customwidget> + <class>MyOrientation</class> + <header location="local">tabletstats.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + <slot access="public" specifier="">slotNewOrient( int, int )</slot> + <slot access="public" specifier="">slotNewOrient( int, int )</slot> + <slot access="public" specifier="">slotNewOrient( int, int )</slot> + <slot access="public" specifier="">slotNewOrient( int, int )</slot> + </customwidget> + <customwidget> + <class>StatsCanvas</class> + <header location="local">tabletstats.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + </sizepolicy> + <pixmap>image1</pixmap> + <signal>signalNewPressure( int )</signal> + <signal>signalNewTilt( int, int )</signal> + <signal>signalNewDev( int )</signal> + <signal>signalNewLoc( int, int )</signal> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="45">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523250004143a55a6b2e0026630c4f</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="4366">789c6dd7596fe3460c07f0f7fd14c1f26d51702dd9b22d147dc81de776eea4e80375f84a9cd3499c14fdeea5867f0e9a62e30ac6af43cd509c43de9f3f56ae8e0f567efcfcf6b290c5b45c2927f2bcf2a37a9dcf3ffefceb8fbfbf7d4fd395e6bf566725fdfedbb7efc3c54ab972f8705f37e09182d23c2d935670616eb7e032ba1f2c8ddb895bda7027cd1b1704f753bbff32385787761ab8db49889fc2a5c517e3688b7f70237e64eeb4103f89b6f8307e27f1785a8d0eedbc61ee74ac9d37e13e9e8fdcc8ffde8dfb2b18f9d269b0783bb1bb13fa970eece35fb8ad9d42ff599a65663e8f96f07c355ce17939dac6fb0c168fe71ccee1757716269f76e00ae3bf4687785ab811df327713f477e6467bbf7137f578b932c7f6398cfc64c38df84318f9ca96dbdaf934dac67f80f1fc5cbb31df9b6ed4ff39daea59997b09eeb7fcc4fb97118c78eebb91cf89bb6bf9df9b7b09c6aba3adbf0cce905fee467c0ae736bff2d4b8d7eea13ef402e7585f891bf7cfdca8e72eecf53888b6fd29e67e82f13ea3adff1337f65b096788ef455bfdd6828b5ede6b07afc215bc63ee27663987bd1ebde8d09f5cc0785e1ebaf1bc398cfd401f6eece7f03c7dcdbf57847881339b2fbe73a37d0fced1fe116df377067b3ddfcc79827caf61d4438edcd85f29ecf37beab6fee412f6e7b17cf579fba15ed481bd9e63b7b5f3ad394f10bf05fb7e9f9805f35d147066e71d8ddc187f1c6debe10e169cf7095cb7cc7d37de178f8df38ee7c3b3e8506f9ec019bc84bdde5d73cc671a6deba1070beab98cb6fa6fbb313f27708dfcc7e622b57c6923dace7fbbbfccf3bc13fc0257c8f7d98df6697419fabb300bd61f1dc219d6ff3a5c637db4cd458ae7a1687bde63379ea7057791ff73b43ddf0d2c989f81dbe285a3adfdc08df18730e697a2311eea53a27e1cce7be94862f5a002ceccb26a2e529c979bb0cfcf07ecfdcfdcd86f4bb38f276f6e9c0f5dd8ebb11f6df319f68368bdc5e6eb29dae66bcd5ca4c8770ad738ffdfdd589f73b38f4f68f7f165df8df558b9118ff14bd49b6ea22dfe18aeb1ff6a37ceb770be149d52701ebeb8edfd45b730eee7d48df3e63ddac6db71e37df5e8c6fbae6daebcde1d377eaf84f928aa52709e3ec035ced3cc1ce393681befd58df7d71adcc5ef917337ceb3eb689b9ff07ba5cc4ac1fcbec235f6ebc06df3cd8766bf5f166eaccf891bfbf718467df9c08de76b455bbe7b30d60b87f55056558dfecedc961f1d99eb14f5bb73e33c0feff34afbb7e7a347736cafa2edfec28df82bb88b7aecb9b15fc3fc54759d16b6fe6f616f5f8fb6faedba51cf1bd8f3bb8c0eed127e3fd45d374517557017f6f909f35beb5f9985f755380f46e1aff170d17c9858b8e052af5f7d571665f15cf388c73ce1a95e33befdcf35d6cf1dcff95eef7988f1053ff2133f6bdb23bff0825ff98ddf79c91ffcc9abbca6f1ebbcc1a5c5f3a6c66df136ef68ec8077798ff7f9800ff9888f79c8277cca677cce177cc914e245b378d69eaef89a6fb8c509a7dce60e67fadde51ef739e79c98886dbe463c25a1824aaaa8e62e8d684c139ad28c6e35be4b7734a77bbea007b6fa95daff95463fd2133dd30b2de8355c737aa3775aeae7833eb5ffd5d8ff8cd6689d53daa04d5ae8d8cdb5c543bdeb43a3b7b5971d8d1f205e347e97f6689f0e62df877444c7e18e916634a4133afdd2ff199d6befdef7055dd2155dd30db528d1fe979486fe3dff19559c501b7d7728a3aed634a11ef529d7e8a1e8f4ebf3c6fe799f8e859abe45a410ad141f4825b57aa4e32e65fc357f9968fb945e45ef945bb9d359c8b82d737d27dc37f973ef6bfef2a0f18ff224cff2220b79953779d7194bf45beb231ff2f925ff5b59d5b63559970ded719387b225dbb2d3cc70537f19c8ee97fcc7b227fb3a5b4f722087a8d1428ee438440fe5e47ff5bfe33539d53c97dc15963339970beac932cced50b319cba5e63f88fdcff954aee43acca55e7ae736226f349781b4249154dac8bf928eaeef73ad9dfe234fe772896b28039a484fa3fb92175c90ade7b05f3674fd9d86ab2e84ee8ae6af647de3ea22ae34ba2e463c8afb4b576a31b61d3a5cd02a3d84cf2a3c2826c5b4d9c3c5cce28b5931d3091f696547faff7ff5bdd9c468fffffcfeed5fd8c2e305</data> + </image> +</images> +<connections> + <connection language="C++"> + <sender>statCan</sender> + <signal>signalNewPressure( int )</signal> + <receiver>lblPressure</receiver> + <slot>setNum(int)</slot> + </connection> +</connections> +</UI> diff --git a/examples/tetrix/README b/examples/tetrix/README new file mode 100644 index 000000000..869c2dbfb --- /dev/null +++ b/examples/tetrix/README @@ -0,0 +1,28 @@ + Oslo, May 14 1995 + +This code was written to test the very first Qt skeleton. It was in +fact the first Qt application and was written at a time when Qt only +had pushbutton widgets and the drawing engine was limited to drawing +text in a single font and drawing lines (no kidding, those were the +only two drawing operations). In fact the tetrix project doubled the +number of widgets in Qt by introducing the QLCDNumber widget. The whole +application was written in 5 evenings and 1 weekend and is not very +well documented. The tetrix engine is implemented in the GenericTetrix +class and was first made on my good old 10 MHZ AT where I made a DOS +text-mode Tetrix (using about 50 lines) to test it out, it was later +moved to a SUN Sparc 10, where it met Qt. GenericTetrix is totally +independent of Qt, feel free to use it in any way you like. (see the +file gtetrix.h for a brief description of how to use it) + +Enjoy! + + Eirik Eng + ----- + +P.S. Tetrix has later been updated to show new versions of Qt. + +P.P.S The tetrix program uses a special application object called + QDragApplication. Try to guess what it does. + Hint: Try pressing the right mouse button somewhere in the + tetrix window and start dragging.... + diff --git a/examples/tetrix/gtetrix.cpp b/examples/tetrix/gtetrix.cpp new file mode 100644 index 000000000..92b946b44 --- /dev/null +++ b/examples/tetrix/gtetrix.cpp @@ -0,0 +1,502 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "gtetrix.h" + +#include <string.h> + +GenericTetrix::GenericTetrix(int boardWidth,int boardHeight) +{ + int i,j; + + width = boardWidth; + height = boardHeight; + boardPtr = new int[height*width]; // Note the order, this makes it easier + // to remove full lines. + for(i = 0 ; i < height ; i++) + for(j = 0 ; j < width ; j++) + board(j,i) = 0; + currentLine = -1; // -1 if no falling piece. + currentPos = 0; + showNext = 0; // FALSE + nLinesRemoved = 0; + nPiecesDropped = 0; + score = 0; + level = 1; + gameID = 0; + nClearLines = height; +} + +GenericTetrix::~GenericTetrix() +{ + delete[] boardPtr; +} + + +void GenericTetrix::clearBoard(int fillRandomLines) +{ + int i,j; + + if (fillRandomLines >= height) + fillRandomLines = height - 1; + + erasePiece(); + for(i = height - nClearLines - 1 ; i >= fillRandomLines ; i--) + for(j = 0 ; j < width ; j++) + if (board(j,i) != 0) { + draw(j,i,0); + board(j,i) = 0; + } + if (fillRandomLines != 0) + for (i = 0 ; i < fillRandomLines ; i++) { + fillRandom(i); + } + nClearLines = height - fillRandomLines; +} + +void GenericTetrix::showBoard() +{ + int i,j; + + showPiece(); + for(i = height - nClearLines - 1 ; i >= 0 ; i--) + for(j = 0 ; j < width ; j++) + if (board(j,i) != 0) + draw(j,i,board(j,i)); +} + +void GenericTetrix::hideBoard() +{ + int i,j; + + erasePiece(); + for(i = height - nClearLines - 1 ; i >= 0 ; i--) + for(j = 0 ; j < width ; j++) + if (board(j,i) != 0) + draw(j,i,0); +} + +void GenericTetrix::startGame(int gameType,int fillRandomLines) +{ + gameID = gameType; + clearBoard(fillRandomLines); + nLinesRemoved = 0; + updateRemoved(nLinesRemoved); + nClearLines = height; + nPiecesDropped = 0; + score = 0; + updateScore(score); + level = 1; + updateLevel(level); + newPiece(); +} + +void GenericTetrix::revealNextPiece(int revealIt) +{ + if (showNext == revealIt) + return; + showNext = revealIt; + if (!showNext) + eraseNextPiece(); + else + showNextPiece(); +} + +void GenericTetrix::updateBoard(int x1,int y1,int x2, int y2, + int dontUpdateBlanks) +{ + int i,j; + int tmp; + + if (x1 > x2) { + tmp = x2; + x2 = x1; + x1 = tmp; + } + if (y1 > y2) { + tmp = y2; + y2 = y1; + y1 = tmp; + } + if (x1 < 0) + x1 = 0; + if (x2 >= width) + x2 = width - 1; + if (y1 < 0) + y1 = 0; + if (y2 >= height) + y2 = height - 1; + for(i = y1 ; i <= y2 ; i++) + for(j = x1 ; j <= x2 ; j++) + if (!dontUpdateBlanks || board(j,height - i - 1) != 0) + draw(j,height - i - 1,board(j,height - i - 1)); + showPiece(); // Remember to update piece correctly!!!! +} + + +void GenericTetrix::fillRandom(int line) +{ + int i,j; + int holes; + + for(i = 0 ; i < width ; i++) + board(i,line) = TetrixPiece::randomValue(7); + holes = 0; + for(i = 0 ; i < width ; i++) + if (board(i,line) == 0) // Count holes in the line. + holes++; + if (holes == 0) // Full line, make a random hole: + board(TetrixPiece::randomValue(width),line) = 0; + if (holes == width) // Empty line, make a random square: + board(TetrixPiece::randomValue(width),line) = + TetrixPiece::randomValue(6) + 1; + for(j = 0 ; j < width ; j++) + draw(j,i,board(j,i)); +} + +void GenericTetrix::moveLeft(int steps) +{ + while(steps) { + if (!canMoveTo(currentPos - 1,currentLine)) + return; + moveTo(currentPos - 1,currentLine); + steps--; + } +} + +void GenericTetrix::moveRight(int steps) +{ + while(steps) { + if (!canMoveTo(currentPos + 1,currentLine)) + return; + moveTo(currentPos + 1,currentLine); + steps--; + } +} + +void GenericTetrix::rotateLeft() +{ + TetrixPiece tmp(currentPiece); + + tmp.rotateLeft(); + if (!canPosition(tmp)) + return; + position(tmp); + currentPiece = tmp; +} + +void GenericTetrix::rotateRight() +{ + TetrixPiece tmp(currentPiece); + + tmp.rotateRight(); + if (!canPosition(tmp)) + return; + position(tmp); + currentPiece = tmp; +} + +void GenericTetrix::dropDown() +{ + if (currentLine == -1) + return; + + int dropHeight = 0; + int newLine = currentLine; + while(newLine) { + if (!canMoveTo(currentPos,newLine - 1)) + break; + newLine--; + dropHeight++; + } + if (dropHeight != 0) + moveTo(currentPos,newLine); + internalPieceDropped(dropHeight); +} + +void GenericTetrix::oneLineDown() +{ + if (currentLine == -1) + return; + if (canMoveTo(currentPos,currentLine - 1)) { + moveTo(currentPos,currentLine - 1); + } else { + internalPieceDropped(0); + } +} + +void GenericTetrix::newPiece() +{ + currentPiece = nextPiece; + if (showNext) + eraseNextPiece(); + nextPiece.setRandomType(); + if (showNext) + showNextPiece(); + currentLine = height - 1 + currentPiece.getMinY(); + currentPos = width/2 + 1; + if (!canMoveTo(currentPos,currentLine)) { + currentLine = -1; + gameOver(); + } else { + showPiece(); + } +} + +void GenericTetrix::removePiece() +{ + erasePiece(); + currentLine = -1; +} + +void GenericTetrix::drawNextSquare(int,int,int) +{ + +} + +void GenericTetrix::pieceDropped(int) +{ + newPiece(); +} + +void GenericTetrix::updateRemoved(int) +{ +} + +void GenericTetrix::updateScore(int) +{ +} + +void GenericTetrix::updateLevel(int) +{ +} + +void GenericTetrix::removeFullLines() +{ + int i,j,k; + int nFullLines; + + for(i = 0 ; i < height - nClearLines ; i++) { + for(j = 0 ; j < width ; j++) + if (board(j,i) == 0) + break; + if (j == width) { + nFullLines = 1; + for(k = i + 1 ; k < height - nClearLines ; k++) { + for(j = 0 ; j < width ; j++) + if (board(j,k) == 0) + break; + if (j == width) { + nFullLines++; + } else { + for(j = 0 ; j < width ; j++) { + if (board(j,k - nFullLines) != board(j,k)) { + board(j,k - nFullLines) = board(j,k); + draw( j,k - nFullLines, + board(j,k - nFullLines)); + } + } + } + } + nClearLines = nClearLines + nFullLines; + nLinesRemoved = nLinesRemoved + nFullLines; + updateRemoved(nLinesRemoved); + score = score + 10*nFullLines; // updateScore must be + // called by caller! + for (i = height - nClearLines ; + i < height - nClearLines + nFullLines ; + i++) + for(j = 0 ; j < width ; j++) + if (board(j,i) != 0) { + draw(j,i,0); + board(j,i) = 0; + } + } + } +} + +void GenericTetrix::showPiece() +{ + int x,y; + + if (currentLine == -1) + return; + + for(int i = 0 ; i < 4 ; i++) { + currentPiece.getCoord(i,x,y); + draw(currentPos + x,currentLine - y,currentPiece.getType()); + } +} + +void GenericTetrix::erasePiece() +{ + int x,y; + + if (currentLine == -1) + return; + + for(int i = 0 ; i < 4 ; i++) { + currentPiece.getCoord(i,x,y); + draw(currentPos + x,currentLine - y,0); + } +} + +void GenericTetrix::internalPieceDropped(int dropHeight) +{ + gluePiece(); + nPiecesDropped++; + if (nPiecesDropped % 25 == 0) { + level++; + updateLevel(level); + } + score = score + 7 + dropHeight; + removeFullLines(); + updateScore(score); + pieceDropped(dropHeight); +} + +void GenericTetrix::gluePiece() +{ + int x,y; + int min; + + if (currentLine == -1) + return; + + for(int i = 0 ; i < 4 ; i++) { + currentPiece.getCoord(i,x,y); + board(currentPos + x,currentLine - y) = currentPiece.getType(); + } + min = currentPiece.getMinY(); + if (currentLine - min >= height - nClearLines) + nClearLines = height - currentLine + min - 1; +} + +void GenericTetrix::showNextPiece(int erase) +{ + int x,y; + int minX = nextPiece.getMinX(); + int minY = nextPiece.getMinY(); + int maxX = nextPiece.getMaxX(); + int maxY = nextPiece.getMaxY(); + + int xOffset = (3 - (maxX - minX))/2; + int yOffset = (3 - (maxY - minY))/2; + + for(int i = 0 ; i < 4 ; i++) { + nextPiece.getCoord(i,x,y); + if (erase) + drawNextSquare(x + xOffset - minX, + y + yOffset - minY,0); + else + drawNextSquare(x + xOffset - minX, + y + yOffset - minY,nextPiece.getType()); + } +} + +int GenericTetrix::canPosition(TetrixPiece &piece) +{ + if (currentLine == -1) + return 0; + + int x,y; + + for(int i = 0 ; i < 4 ; i++) { + piece.getCoord(i,x,y); + x = currentPos + x; + y = currentLine - y; // Board and pieces have inverted y-coord. systems. + if (x < 0 || x >= width || y < 0 || y >= height) + return 0; // Outside board, cannot put piece here. + if (board(x,y) != 0) + return 0; // Over a non-zero square, cannot put piece here. + } + return 1; // Inside board and no non-zero squares underneath. + +} + +int GenericTetrix::canMoveTo(int xPosition,int line) +{ + if (currentLine == -1) + return 0; + + int x,y; + + for(int i = 0 ; i < 4 ; i++) { + currentPiece.getCoord(i,x,y); + x = xPosition + x; + y = line - y; // Board and pieces have inverted y-coord. systems. + if (x < 0 || x >= width || y < 0 || y >= height) + return 0; // Outside board, cannot put piece here. + if (board(x,y) != 0) + return 0; // Over a non-zero square, cannot put piece here. + } + return 1; // Inside board and no non-zero squares underneath. +} + +void GenericTetrix::moveTo(int xPosition,int line) +{ + if (currentLine == -1) + return; + optimizedMove(xPosition,line,currentPiece); + currentPos = xPosition; + currentLine = line; +} + +void GenericTetrix::position(TetrixPiece &piece) +{ + if (currentLine == -1) + return; + + optimizedMove(currentPos,currentLine,piece); +} + +void GenericTetrix::optimizedMove(int newPos, int newLine, + TetrixPiece &newPiece) +{ + int updates [8][3]; + int nUpdates; + int value; + int x,y; + int i,j; + + for(i = 0 ; i < 4 ; i++) { // Put the erasing coords into updates + currentPiece.getCoord(i,x,y); + updates[i][0] = currentPos + x; + updates[i][1] = currentLine - y; + updates[i][2] = 0; + } + nUpdates = 4; + for(i = 0 ; i < 4 ; i++) { // Any drawing coord same as an erasing one? + newPiece.getCoord(i,x,y); + x = newPos + x; + y = newLine - y; + for (j = 0 ; j < 4 ; j++) + if (updates[j][0] == x && updates[j][1] == y) { // Same coord, + // don't have to erase + if (currentPiece.getType() == newPiece.getType()) + updates[j][2] = -1; // Correct on screen, no update! + else + updates[j][2] = newPiece.getType(); + break; + } + if (j == 4) { // This coord does not overlap an erasing one + updates[nUpdates][0] = x; + updates[nUpdates][1] = y; + updates[nUpdates][2] = newPiece.getType(); + nUpdates++; + } + } + for (i = 0 ; i < nUpdates ; i++) { // Do the updating + x = updates[i][0]; + y = updates[i][1]; + value = updates[i][2]; + if (value != -1) // Only update if new value != current + draw(x,y,value); + } +} diff --git a/examples/tetrix/gtetrix.h b/examples/tetrix/gtetrix.h new file mode 100644 index 000000000..170def596 --- /dev/null +++ b/examples/tetrix/gtetrix.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef GTETRIX_H +#define GTETRIX_H + +#include "tpiece.h" + + +class GenericTetrix +{ +public: + GenericTetrix(int boardWidth = 10,int boardHeight = 22); + virtual ~GenericTetrix(); + + void clearBoard(int fillRandomLines = 0); + void revealNextPiece(int revealIt); + void updateBoard(int x1,int y1,int x2,int y2,int dontUpdateBlanks = 0); + void updateNext(){if (showNext) showNextPiece();} + void hideBoard(); + void showBoard(); + void fillRandom(int line); + + void moveLeft(int steps = 1); + void moveRight(int steps = 1); + void rotateLeft(); + void rotateRight(); + void dropDown(); + void oneLineDown(); + void newPiece(); + void removePiece(); + + int noOfClearLines() {return nClearLines;} + int getLinesRemoved() {return nLinesRemoved;} + int getPiecesDropped() {return nPiecesDropped;} + int getScore() {return score;} + int getLevel() {return level;} + int boardHeight() {return height;} + int boardWidth() {return width;} + + virtual void drawSquare(int x,int y,int value) = 0; + virtual void gameOver() = 0; + + virtual void startGame(int gameType = 0,int fillRandomLines = 0); + virtual void drawNextSquare(int x,int y,int value); + virtual void pieceDropped(int dropHeight); + virtual void updateRemoved(int noOfLines); + virtual void updateScore(int newScore); + virtual void updateLevel(int newLevel); + +private: + void draw(int x, int y, int value){drawSquare(x,height - y,value);} + void removeFullLines(); + void removeLine(int line); + void showPiece(); + void erasePiece(); + void internalPieceDropped(int dropHeight); + void gluePiece(); + void showNextPiece(int erase = 0); + void eraseNextPiece(){showNextPiece(1);}; + int canPosition(TetrixPiece &piece); // Returns a boolean value. + int canMoveTo(int xPosition, int line); // Returns a boolean value. + void moveTo(int xPosition,int line); + void position(TetrixPiece &piece); + void optimizedMove(int newPos, int newLine,TetrixPiece &newPiece); + + int &board(int x,int y){return boardPtr[width*y + x];} + + TetrixPiece currentPiece; + TetrixPiece nextPiece; + int currentLine; + int currentPos; + int showNext; // Boolean variable. + int nLinesRemoved; + int nPiecesDropped; + int score; + int level; + int gameID; + int nClearLines; + int width; + int height; + int *boardPtr; +}; + + +#endif diff --git a/examples/tetrix/qdragapp.cpp b/examples/tetrix/qdragapp.cpp new file mode 100644 index 000000000..409d418b3 --- /dev/null +++ b/examples/tetrix/qdragapp.cpp @@ -0,0 +1,502 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "qdragapp.h" +#include "qptrlist.h" +#include "qintdict.h" +#include "qpopupmenu.h" +#include "qguardedptr.h" +#include "qcolor.h" +#include "qwidget.h" +#include "qfontmetrics.h" +#include "qcursor.h" +#include "qobjectlist.h" + +TQWidget *cursorWidget( TQPoint * = 0 ); + +class TQDragger; + + +class DropWindow : public TQWidget +{ + Q_OBJECT +public: + void paintEvent( TQPaintEvent * ); + void closeEvent( TQCloseEvent * ); + + TQDragger *master; +}; + + +struct DropInfo { + DropInfo() { w=0; } + ~DropInfo() { delete w; } + DropWindow *w; + bool userOpened; +}; + +struct DraggedInfo { + TQWidget *w; + TQWidget *mother; + TQPoint pos; +}; + + +class TQDragger : public TQObject +{ + Q_OBJECT +public: + TQDragger(); + ~TQDragger(); + + bool notify( TQObject *, TQEvent * ); // event filter + void closeDropWindow( DropWindow * ); +public slots: + void openDropWindow(); + void killDropWindow(); + void killAllDropWindows(); + void sendChildHome(); + void sendAllChildrenHome(); +private: + bool isParentToDragged( TQWidget * ); + bool noWidgets( TQWidget * ); + void killDropWindow( DropInfo * ); + void killAllDropWindows( bool ); + void sendChildHome( DraggedInfo * ); + void sendAllChildrenHome( TQWidget * ); + TQWidget *openDropWindow( const TQRect&, bool ); + + bool startGrab(); + void grabFinished(); + bool dragEvent( TQWidget *, TQMouseEvent * ); + bool killDropEvent( TQMouseEvent * ); + bool sendChildEvent( TQMouseEvent * ); + + bool killingDrop; + bool sendingChild; + TQWidget *clickedWidget; + TQGuardedPtr<TQWidget> hostWidget; + TQCursor cursor; + + TQPopupMenu* menu; + TQPoint clickOffset; + TQColor dragBackground; + TQColor dragForeground; + DraggedInfo dragInfo; + TQIntDict<DraggedInfo> draggedDict; + TQIntDict<DropInfo> dropDict; +}; + + +TQDragApplication::TQDragApplication( int &argc, char **argv ) + : TQApplication( argc, argv ), dragger( 0 ) +{ + dragger = new TQDragger; +} + +TQDragApplication::~TQDragApplication() +{ + delete dragger; +} + +bool TQDragApplication::notify( TQObject *o, TQEvent *e ) +{ + if ( dragger && !dragger->notify( o, e ) ) + return TQApplication::notify( o, e ); + else + return FALSE; +} + +void DropWindow::paintEvent( TQPaintEvent * ) +{ + const char *msg = "Drag widgets and drop them here or anywhere!"; + int startX = ( width() - fontMetrics().width( msg ) )/2; + startX = startX < 0 ? 0 : startX; + + drawText( startX, height()/2, msg ); +} + +void DropWindow::closeEvent( TQCloseEvent *e ) +{ + master->closeDropWindow( this ); + e->ignore(); +} + +TQDragger::TQDragger() +{ + dragInfo.w = 0; + killingDrop = FALSE; + sendingChild = FALSE; + draggedDict.setAutoDelete( TRUE ); + dropDict .setAutoDelete( TRUE ); + + menu = new TQPopupMenu; + menu->insertItem( "Open drop window", 1 ); + menu->insertItem( "Kill drop window", 2 ); + menu->insertItem( "Kill all drop windows", 3 ); + menu->insertSeparator(); +// menu->insertItem( "Send child home", 4 ); + menu->insertItem( "Send all children home", 5 ); + + menu->connectItem( 1, this, SLOT(openDropWindow()) ); + menu->connectItem( 2, this, SLOT(killDropWindow()) ); + menu->connectItem( 3, this, SLOT(killAllDropWindows()) ); +// menu->connectItem( 4, this, SLOT(sendChildHome()) ); + menu->connectItem( 5, this, SLOT(sendAllChildrenHome()) ); +} + +TQDragger::~TQDragger() +{ + delete menu; +} + + +bool TQDragger::notify( TQObject *o, TQEvent *e ) +{ + if ( !o->isWidgetType() || o == menu ) + return FALSE; + switch( e->type() ) { + case TQEvent::MouseMove: + { + TQMouseEvent *tmp = (TQMouseEvent*) e; + if ( killingDrop ) + return killDropEvent( tmp ); + if ( sendingChild ) + return sendChildEvent( tmp ); + if ( tmp->state() & TQMouseEvent::RightButton ) + return dragEvent( (TQWidget*) o, tmp ); + break; + } + case TQEvent::MouseButtonPress: + case TQEvent::MouseButtonRelease: + case TQEvent::MouseButtonDblClick: + { + TQMouseEvent *tmp = (TQMouseEvent*) e; + if ( killingDrop ) + return killDropEvent( tmp ); + if ( sendingChild ) + return sendChildEvent( tmp ); + if ( tmp->button() == TQMouseEvent::RightButton ) + return dragEvent( (TQWidget*) o, tmp ); + } + break; + default: + break; + } + return FALSE; +} + +bool TQDragger::isParentToDragged( TQWidget *w ) +{ + TQIntDictIterator<DraggedInfo> iter( draggedDict ); + + DraggedInfo *tmp; + while( (tmp = iter.current()) ) { + ++iter; + if ( tmp->mother == w ) + return TRUE; + } + return FALSE; +} + +bool TQDragger::noWidgets( TQWidget *w ) +{ + const TQObjectList *l = w->children(); + if ( !l ) + return TRUE; + TQObjectListIt iter( *l ); + TQObject *tmp; + while( (tmp = iter.current()) ) { + ++iter; + if ( tmp->isWidgetType() ) + return FALSE; + } + return TRUE; +} + +void TQDragger::sendAllChildrenHome( TQWidget *w ) +{ + const TQObjectList *l = w->children(); + if ( !l ) + return; + TQObjectListIt iter( *l ); + TQObject *tmp; + while( (tmp = iter.current()) ) { + ++iter; + if ( tmp->isWidgetType() ) { + sendAllChildrenHome( (TQWidget*) tmp ); + DraggedInfo *di = draggedDict.find( (long) tmp ); + if ( di ) + sendChildHome( di ); + } + } +} + +bool TQDragger::dragEvent( TQWidget *w, TQMouseEvent *e ) +{ + switch( e->type() ) { + case TQEvent::MouseButtonDblClick: + case TQEvent::MouseButtonPress: { + if ( !noWidgets( w ) || // has widget children + isParentToDragged( w ) || // has had widget children + w->parentWidget() == 0 ) { // is top level window + hostWidget = w; + menu->popup( w->mapToGlobal( e->pos() ) ); + return TRUE; + } + if ( !draggedDict.find( (long) w ) ) { + DraggedInfo *tmp = new DraggedInfo; + tmp->w = w; + tmp->mother = w->parentWidget(); + tmp->pos = w->frameGeometry().topLeft(); + draggedDict.insert( (long) w, tmp ); + } + dragBackground = w->backgroundColor(); + dragForeground = w->foregroundColor(); + dragInfo.w = w; + dragInfo.mother = w->parentWidget(); + dragInfo.pos = w->frameGeometry().topLeft(); + clickOffset = e->pos(); + dragInfo.w = w; + TQPoint p = w->mapToGlobal(TQPoint(0,0)); + w->reparent( 0, WType_Popup, p, TRUE ); + + return TRUE; + } + case TQEvent::MouseButtonRelease: + case TQEvent::MouseMove: { + if ( dragInfo.w != 0 ) { + TQPoint p = TQCursor::pos() - clickOffset; + dragInfo.w->move( p ); + if ( e->type() == TQEvent::MouseMove ) + return TRUE; + } else { + return FALSE; + } + if ( !dragInfo.w ) + return FALSE; + if ( w != dragInfo.w ) + w = dragInfo.w; + dragInfo.w = 0; + w->hide(); + TQPoint pos; + TQWidget *target = cursorWidget( &pos ); + pos = pos - clickOffset; + TQPoint p; + if ( !target ) { + target = openDropWindow( TQRect( pos, w->size() ), + FALSE); + p = TQPoint( 0, 0 ); + } + else + p = target->mapFromGlobal( pos ); + w->reparent( target, 0, p, TRUE ); + DropInfo *tmp = dropDict.find( (long) dragInfo.mother ); + if ( tmp ) { + if ( !tmp->userOpened && noWidgets( tmp->w ) ) + dropDict.remove( (long) tmp->w ); + } + if ( !target->isVisible() ) + target->show(); + } + return TRUE; + default: + return FALSE; + } +} + +bool TQDragger::killDropEvent( TQMouseEvent *e ) +{ + switch( e->type() ) { + case TQEvent::MouseButtonDblClick: + case TQEvent::MouseButtonPress: + clickedWidget = cursorWidget(); + return TRUE; + case TQEvent::MouseButtonRelease: + hostWidget->releaseMouse(); + if ( clickedWidget ) { + DropInfo *tmp = dropDict.find( (long) clickedWidget ); + if( tmp ) { + killDropWindow( tmp ); + dropDict.remove( (long) tmp->w ); + } + } + grabFinished(); + return TRUE; + case TQEvent::MouseMove: + return TRUE; + default: + break; + } + return FALSE; +} + +bool TQDragger::sendChildEvent( TQMouseEvent *e ) +{ + switch( e->type() ) { + case TQEvent::MouseButtonDblClick: + case TQEvent::MouseButtonPress: + clickedWidget = cursorWidget(); + return TRUE; + case TQEvent::MouseButtonRelease: + hostWidget->releaseMouse(); + if ( clickedWidget ) { + DraggedInfo *tmp = draggedDict.find((long) clickedWidget); + if( tmp ) { + TQWidget *parent = tmp->w->parentWidget(); + sendChildHome( tmp ); + DropInfo *dri = dropDict.find( (long) parent ); + if ( dri && noWidgets(dri->w) && !dri->userOpened ) { + killDropWindow( dri ); + dropDict.remove( (long) dri ); + } + } + grabFinished(); + } + return TRUE; + case TQEvent::MouseMove: + return TRUE; + default: + break; + } + return FALSE; +} + +bool TQDragger::startGrab() +{ + if ( !hostWidget ) + return FALSE; + clickedWidget = 0; + cursor = hostWidget->cursor(); + hostWidget->grabMouse(); + hostWidget->setCursor( TQCursor( CrossCursor ) ); + return TRUE; +} + +void TQDragger::grabFinished() +{ + killingDrop = FALSE; + sendingChild = FALSE; + if(hostWidget) + hostWidget->setCursor( cursor ); +} + +void TQDragger::closeDropWindow( DropWindow *w ) +{ + DropInfo *tmp = dropDict.find( (long) w); + if( tmp ) + killDropWindow( tmp ); +} + +void TQDragger::openDropWindow() +{ + TQWidget *tmp = openDropWindow( TQRect(100, 100, 300, 200), TRUE ); + tmp->show(); +} + +TQWidget *TQDragger::openDropWindow( const TQRect &r, bool user ) +{ + DropInfo *tmp = new DropInfo; + DropWindow *w = new DropWindow; + if ( user ) { + tmp->userOpened = TRUE; + w->setCaption( "Drop window" ); + } else { + tmp->userOpened = FALSE; + w->setCaption( "Auto drop window" ); + } + tmp->w = w; + w->master = this; + w->setGeometry( r ); + dropDict.insert( (long) w, tmp ); + w->show(); + return w; +} + +void TQDragger::killDropWindow() +{ + if ( startGrab() ) + killingDrop = TRUE; +} + +void TQDragger::killDropWindow( DropInfo *di ) +{ + const TQObjectList *l = di->w->children(); + if ( !l ) + return; + TQObjectListIt iter( *l ); + TQObject *tmp; + while( (tmp = iter.current()) ) { + ++iter; + if ( tmp->isWidgetType() ) { + DraggedInfo *dri = draggedDict.find( (long) tmp ); + if ( dri ) { + sendChildHome( dri ); + draggedDict.remove( (long) tmp ); + } + } + } + di->w->hide(); +} + +void TQDragger::killAllDropWindows() +{ + killAllDropWindows( FALSE ); +} + +void TQDragger::killAllDropWindows( bool autoOnly ) +{ + TQIntDictIterator<DropInfo> iter( dropDict ); + + DropInfo *tmp; + while( (tmp = iter.current()) ) { + ++iter; + if( !autoOnly || !tmp->userOpened ) { + killDropWindow( tmp ); + dropDict.remove( (long) tmp->w ); + } + } +} + +void TQDragger::sendChildHome( DraggedInfo *i ) +{ + i->w->reparent( i->mother, 0, i->pos, TRUE ); +} + +void TQDragger::sendChildHome() +{ + if ( startGrab() ) + sendingChild = TRUE; +} + +void TQDragger::sendAllChildrenHome() +{ + TQIntDictIterator<DraggedInfo> iter( draggedDict ); + + DraggedInfo *tmp; + while( (tmp = iter.current()) ) { + ++iter; + sendChildHome( tmp ); + draggedDict.remove( (long) tmp->w ); + } + killAllDropWindows( TRUE ); + draggedDict.clear(); +} + + +TQWidget *cursorWidget( TQPoint *p ) +{ + TQPoint curpos = TQCursor::pos(); + if ( p ) + *p = curpos; + return TQApplication::widgetAt( curpos ); +} + + +#include "qdragapp.moc" diff --git a/examples/tetrix/qdragapp.h b/examples/tetrix/qdragapp.h new file mode 100644 index 000000000..f0334b829 --- /dev/null +++ b/examples/tetrix/qdragapp.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQDRAGAPP_H +#define TQDRAGAPP_H + +#include "qapplication.h" + +class TQDragger; + +class TQDragApplication : public TQApplication +{ + Q_OBJECT +public: + TQDragApplication( int &argc, char **argv ); + virtual ~TQDragApplication(); + + virtual bool notify( TQObject *, TQEvent * ); // event filter + +private: + TQDragger *dragger; +}; + + +#endif // TQDRAGAPP_H diff --git a/examples/tetrix/qtetrix.cpp b/examples/tetrix/qtetrix.cpp new file mode 100644 index 000000000..68b49c254 --- /dev/null +++ b/examples/tetrix/qtetrix.cpp @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "qtetrix.h" +#include <qapplication.h> +#include <qlabel.h> +#include <qdatetime.h> + + +void drawTetrixButton( TQPainter *p, int x, int y, int w, int h, + const TQColor *color, TQWidget *widg) +{ + if ( color ) { + TQPointArray a; + a.setPoints( 3, x,y+h-1, x,y, x+w-1,y ); + p->setPen( color->light() ); + p->drawPolyline( a ); + a.setPoints( 3, x+1,y+h-1, x+w-1,y+h-1, x+w-1,y+1 ); + p->setPen( color->dark() ); + p->drawPolyline( a ); + x++; + y++; + w -= 2; + h -= 2; + p->fillRect( x, y, w, h, *color ); + } + else if(widg) { + widg->erase(x, y, w, h); + } else { + p->fillRect(x, y, w, h, p->backgroundColor()); + } +} + + +ShowNextPiece::ShowNextPiece( TQWidget *parent, const char *name ) + : TQFrame( parent, name ) +{ + setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + xOffset = -1; // -1 until first resizeEvent. +} + +void ShowNextPiece::resizeEvent( TQResizeEvent *e ) +{ + TQSize sz = e->size(); + blockWidth = (sz.width() - 3)/5; + blockHeight = (sz.height() - 3)/6; + xOffset = (sz.width() - 3)/5; + yOffset = (sz.height() - 3)/6; +} + + +void ShowNextPiece::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + drawFrame( &p ); + p.end(); // explicit end() so any slots can paint too + emit update(); +} + + +void ShowNextPiece::drawNextSquare(int x, int y,TQColor *color) +{ + if (xOffset == -1) // Before first resizeEvent? + return; + + TQPainter paint; + paint.begin(this); + drawTetrixButton( &paint, xOffset+x*blockWidth, yOffset+y*blockHeight, + blockWidth, blockHeight, color, this ); + paint.end(); +} + + +TQTetrix::TQTetrix( TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + TQTime t = TQTime::currentTime(); + TetrixPiece::setRandomSeed( (((double)t.hour())+t.minute()+t.second())/ + (24+60+60) ); + +#define ADD_LABEL( str, x, y, w, h ) \ + { TQLabel *label = new TQLabel(str,this); \ + label->setGeometry(x,y,w,h); \ + label->setAlignment(AlignCenter|AlignVCenter); } + + ADD_LABEL( "NEXT", 50, 10, 78, 30 ); + ADD_LABEL( "SCORE", 330, 10, 178, 30 ); + ADD_LABEL( "LEVEL", 50, 130, 78, 30 ); + ADD_LABEL( "LINES REMOVED", 330, 130, 178, 30 ); + + board = new TQTetrixBoard(this); + showNext = new ShowNextPiece(this); +#ifndef QT_NO_LCDNUMBER + showScore = new TQLCDNumber(5,this); + showLevel = new TQLCDNumber(2,this); + showLines = new TQLCDNumber(5,this); +#else + showScore = new TQLabel("0",this); + showLevel = new TQLabel("0",this); + showLines = new TQLabel("0",this); + showScore->setAlignment(AlignCenter); + showLines->setAlignment(AlignCenter); + showLevel->setAlignment(AlignCenter); + showScore->setFrameStyle(TQFrame::Sunken|TQFrame::Box); + showLines->setFrameStyle(TQFrame::Sunken|TQFrame::Box); + showLevel->setFrameStyle(TQFrame::Sunken|TQFrame::Box); +#endif + tquitButton = new TQPushButton("&Quit",this); + startButton = new TQPushButton("&New Game",this); + pauseButton = new TQPushButton("&Pause",this); + + // Don't let the buttons get keyboard focus + tquitButton->setFocusPolicy( TQWidget::NoFocus ); + startButton->setFocusPolicy( TQWidget::NoFocus ); + pauseButton->setFocusPolicy( TQWidget::NoFocus ); + + connect( board, SIGNAL(gameOverSignal()), SLOT(gameOver()) ); + connect( board, SIGNAL(drawNextSquareSignal(int,int,TQColor*)), showNext, + SLOT(drawNextSquare(int,int,TQColor*)) ); + connect( showNext, SIGNAL(update()), board, SLOT(updateNext()) ); +#ifndef QT_NO_LCDNUMBER + connect( board, SIGNAL(updateScoreSignal(int)), showScore, + SLOT(display(int)) ); + connect( board, SIGNAL(updateLevelSignal(int)), showLevel, + SLOT(display(int))); + connect( board, SIGNAL(updateRemovedSignal(int)), showLines, + SLOT(display(int))); +#else + connect( board, SIGNAL(updateScoreSignal(int)), showScore, + SLOT(setNum(int)) ); + connect( board, SIGNAL(updateLevelSignal(int)), showLevel, + SLOT(setNum(int))); + connect( board, SIGNAL(updateRemovedSignal(int)), showLines, + SLOT(setNum(int))); +#endif + connect( startButton, SIGNAL(clicked()), board, SLOT(start()) ); + connect( tquitButton , SIGNAL(clicked()), SLOT(tquit())); + connect( pauseButton, SIGNAL(clicked()), board, SLOT(pause()) ); + + board->setGeometry( 150, 20, 153, 333 ); + showNext->setGeometry( 50, 40, 78, 94 ); + showScore->setGeometry( 330, 40, 178, 93 ); + showLevel->setGeometry( 50, 160, 78, 93 ); + showLines->setGeometry( 330, 160, 178, 93 ); +#ifndef QT_NO_LCDNUMBER + showScore->display( 0 ); + showLevel->display( 0 ); + showLines->display( 0 ); +#else + showScore->setNum( 0 ); + showLevel->setNum( 0 ); + showLines->setNum( 0 ); +#endif + startButton->setGeometry( 46, 288, 90, 30 ); + tquitButton->setGeometry( 370, 265, 90, 30 ); + pauseButton->setGeometry( 370, 310, 90, 30 ); + board->revealNextPiece(TRUE); + + resize( 550, 370 ); +} + +void TQTetrix::gameOver() +{ +} + + +void TQTetrix::tquit() +{ + qApp->tquit(); +} diff --git a/examples/tetrix/qtetrix.h b/examples/tetrix/qtetrix.h new file mode 100644 index 000000000..36d8bd041 --- /dev/null +++ b/examples/tetrix/qtetrix.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQTETRIX_H +#define TQTETRIX_H + +#include "qtetrixb.h" +#include <qframe.h> +#include <qlcdnumber.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qpainter.h> + + +class ShowNextPiece : public TQFrame +{ + Q_OBJECT + friend class TQTetrix; +public: + ShowNextPiece( TQWidget *parent=0, const char *name=0 ); +public slots: + void drawNextSquare( int x, int y,TQColor *color ); +signals: + void update(); +private: + void paintEvent( TQPaintEvent * ); + void resizeEvent( TQResizeEvent * ); + + int blockWidth,blockHeight; + int xOffset,yOffset; +}; + + +class TQTetrix : public TQWidget +{ + Q_OBJECT +public: + TQTetrix( TQWidget *parent=0, const char *name=0 ); + void startGame() { board->startGame(); } + +public slots: + void gameOver(); + void tquit(); +private: + void keyPressEvent( TQKeyEvent *e ) { board->keyPressEvent(e); } + + TQTetrixBoard *board; + ShowNextPiece *showNext; +#ifndef QT_NO_LCDNUMBER + TQLCDNumber *showScore; + TQLCDNumber *showLevel; + TQLCDNumber *showLines; +#else + TQLabel *showScore; + TQLabel *showLevel; + TQLabel *showLines; +#endif + TQPushButton *tquitButton; + TQPushButton *startButton; + TQPushButton *pauseButton; +}; + + +void drawTetrixButton( TQPainter *, int x, int y, int w, int h, + const TQColor *color, TQWidget *widg); + + +#endif diff --git a/examples/tetrix/qtetrixb.cpp b/examples/tetrix/qtetrixb.cpp new file mode 100644 index 000000000..26fd2c2d0 --- /dev/null +++ b/examples/tetrix/qtetrixb.cpp @@ -0,0 +1,241 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "qtetrixb.h" +#include "qtetrix.h" +#include <qtimer.h> +#include <qpainter.h> + +const int waitAfterLineTime = 500; + +TQTetrixBoard::TQTetrixBoard( TQWidget *p, const char *name ) + : TQFrame( p, name ) +{ + setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); + paint = 0; + paint_widget = 0; + timer = new TQTimer(this); + connect( timer, SIGNAL(timeout()), SLOT(timeout()) ); + + colors[0].setRgb(200,100,100); + colors[1].setRgb(100,200,100); + colors[2].setRgb(100,100,200); + colors[3].setRgb(200,200,100); + colors[4].setRgb(200,100,200); + colors[5].setRgb(100,200,200); + colors[6].setRgb(218,170, 0); + + xOffset = -1; // -1 until a resizeEvent is received. + blockWidth = 20; + yOffset = 30; + blockHeight = 20; + noGame = TRUE; + isPaused = FALSE; + waitingAfterLine = FALSE; + updateTimeoutTime(); // Sets timeoutTime +} + +void TQTetrixBoard::startGame(int gameType,int fillRandomLines) +{ + if ( isPaused ) + return; // ignore if game is paused + noGame = FALSE; + GenericTetrix::startGame( gameType, fillRandomLines ); + // Note that the timer is started by updateLevel! +} + + +void TQTetrixBoard::pause() +{ + if ( noGame ) // game not active + return; + isPaused = !isPaused; + if ( isPaused ) { + timer->stop(); + hideBoard(); + } + else + timer->start(timeoutTime); + update(); +} + + +void TQTetrixBoard::drawSquare(int x,int y,int value) +{ + if (xOffset == -1) // Before first resizeEvent? + return; + + const int X = xOffset + x*blockWidth; + const int Y = yOffset + (y - 1)*blockHeight; + + bool localPainter = paint == 0; + TQPainter *p; + TQWidget *w; + if ( localPainter ) { + p = new TQPainter( this ); + w = this; + } else { + p = paint; + w = paint_widget; + } + drawTetrixButton( p, X, Y, blockWidth, blockHeight, + value == 0 ? 0 : &colors[value-1], w); + /* + if ( value != 0 ) { + TQColor tc, bc; + tc = colors[value-1].light(); + bc = colors[value-1].dark(); + p->drawShadePanel( X, Y, blockWidth, blockHeight, + tc, bc, 1, colors[value-1], TRUE ); + } + else + p->fillRect( X, Y, blockWidth, blockHeight, backgroundColor() ); + */ + if ( localPainter ) + delete p; +} + +void TQTetrixBoard::drawNextSquare( int x, int y, int value ) +{ + if ( value == 0 ) + emit drawNextSquareSignal (x, y, 0 ); + else + emit drawNextSquareSignal( x, y, &colors[value-1] ); +} + +void TQTetrixBoard::updateRemoved( int noOfLines ) +{ + if ( noOfLines > 0 ) { + timer->stop(); + timer->start( waitAfterLineTime ); + waitingAfterLine = TRUE; + } + emit updateRemovedSignal( noOfLines ); +} + +void TQTetrixBoard::updateScore( int newScore ) +{ + emit updateScoreSignal( newScore ); +} + +void TQTetrixBoard::updateLevel( int newLevel ) +{ + timer->stop(); + updateTimeoutTime(); + timer->start( timeoutTime ); + emit updateLevelSignal( newLevel ); +} + +void TQTetrixBoard::pieceDropped(int) +{ + if ( waitingAfterLine ) // give player a break if a line has been removed + return; + newPiece(); +} + +void TQTetrixBoard::gameOver() +{ + timer->stop(); + noGame = TRUE; + emit gameOverSignal(); +} + +void TQTetrixBoard::timeout() +{ + if ( waitingAfterLine ) { + timer->stop(); + waitingAfterLine = FALSE; + newPiece(); + timer->start( timeoutTime ); + } else { + oneLineDown(); + } +} + +void TQTetrixBoard::drawContents( TQPainter *p ) +{ + const char *text = "Press \"Pause\""; + TQRect r = contentsRect(); + paint = p; // set widget painter + if ( isPaused ) { + p->drawText( r, AlignCenter | AlignVCenter, text ); + return; + } + int x1,y1,x2,y2; + x1 = (r.left() - xOffset) / blockWidth; + if (x1 < 0) + x1 = 0; + if (x1 >= boardWidth()) + x1 = boardWidth() - 1; + + x2 = (r.right() - xOffset) / blockWidth; + if (x2 < 0) + x2 = 0; + if (x2 >= boardWidth()) + x2 = boardWidth() - 1; + + y1 = (r.top() - yOffset) / blockHeight; + if (y1 < 0) + y1 = 0; + if (y1 >= boardHeight()) + y1 = boardHeight() - 1; + + y2 = (r.bottom() - yOffset) / blockHeight; + if (y2 < 0) + y2 = 0; + if (y2 >= boardHeight()) + y2 = boardHeight() - 1; + + updateBoard( x1, y1, x2, y2, TRUE ); + paint = 0; // reset widget painter + return; +} + +void TQTetrixBoard::resizeEvent(TQResizeEvent *e) +{ + TQSize sz = e->size(); + blockWidth = (sz.width() - 3)/10; + blockHeight = (sz.height() - 3)/22; + xOffset = 1; + yOffset = 1; +} + +void TQTetrixBoard::keyPressEvent( TQKeyEvent *e ) +{ + if ( noGame || isPaused || waitingAfterLine ) + return; + switch( e->key() ) { + case Key_Left : + moveLeft(); + break; + case Key_Right : + moveRight(); + break; + case Key_Down : + rotateRight(); + break; + case Key_Up : + rotateLeft(); + break; + case Key_Space : + dropDown(); + break; + case Key_D : + oneLineDown(); + break; + default: + return; + } + e->accept(); +} + +void TQTetrixBoard::updateTimeoutTime() +{ + timeoutTime = 1000/(1 + getLevel()); +} diff --git a/examples/tetrix/qtetrixb.h b/examples/tetrix/qtetrixb.h new file mode 100644 index 000000000..236f02e18 --- /dev/null +++ b/examples/tetrix/qtetrixb.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TQTETRIXB_H +#define TQTETRIXB_H + +#include "gtetrix.h" +#include <qframe.h> + +class TQTimer; + +class TQTetrixBoard : public TQFrame, public GenericTetrix +{ + Q_OBJECT +public: + TQTetrixBoard( TQWidget *parent=0, const char *name=0 ); + + void gameOver(); + void startGame(int gameType = 0,int fillRandomLines = 0); + +public slots: + void timeout(); + void updateNext() { GenericTetrix::updateNext(); } + void key(TQKeyEvent *e) { keyPressEvent(e); } + void start() { startGame(); } + void pause(); + +signals: + void gameOverSignal(); + void drawNextSquareSignal(int x,int y,TQColor *color1); + void updateRemovedSignal(int noOfLines); + void updateScoreSignal(int score); + void updateLevelSignal(int level); + +public: // until we have keyboard focus, should be protected + void keyPressEvent( TQKeyEvent * ); + +private: + void drawContents( TQPainter * ); + void resizeEvent( TQResizeEvent * ); + void drawSquare(int x,int y,int value); + void drawNextSquare(int x,int y,int value); + void updateRemoved(int noOfLines); + void updateScore(int newScore); + void updateLevel(int newLlevel); + void pieceDropped(int dropHeight); + void updateTimeoutTime(); + + TQTimer *timer; + + int xOffset,yOffset; + int blockWidth,blockHeight; + int timeoutTime; + bool noGame; + bool isPaused; + bool waitingAfterLine; + + TQColor colors[7]; + TQPainter *paint; + TQWidget *paint_widget; +}; + +#endif diff --git a/examples/tetrix/tetrix.cpp b/examples/tetrix/tetrix.cpp new file mode 100644 index 000000000..e3cf9c29f --- /dev/null +++ b/examples/tetrix/tetrix.cpp @@ -0,0 +1,24 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "qtetrix.h" +#include "qdragapp.h" +#include "qfont.h" + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQDragApplication a(argc,argv); + TQTetrix *tetrix = new TQTetrix; + tetrix->setCaption("Tetrix"); + a.setMainWidget(tetrix); + tetrix->setCaption("TQt Example - Tetrix"); + tetrix->show(); + return a.exec(); +} diff --git a/examples/tetrix/tetrix.doc b/examples/tetrix/tetrix.doc new file mode 100644 index 000000000..93afca4eb --- /dev/null +++ b/examples/tetrix/tetrix.doc @@ -0,0 +1,15 @@ +/* +*/ +/*! \page tetrix-example.html + + \ingroup examples + \title Tetrix + + This is the Qt implementation of the well known game Tetris. + + <hr> + + Main: + + \include tetrix/tetrix.cpp +*/ diff --git a/examples/tetrix/tetrix.pro b/examples/tetrix/tetrix.pro new file mode 100644 index 000000000..ad8ad831a --- /dev/null +++ b/examples/tetrix/tetrix.pro @@ -0,0 +1,19 @@ +TEMPLATE = app +TARGET = tetrix + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = small-config + +HEADERS = gtetrix.h \ + qdragapp.h \ + qtetrix.h \ + qtetrixb.h \ + tpiece.h +SOURCES = gtetrix.cpp \ + qdragapp.cpp \ + qtetrix.cpp \ + qtetrixb.cpp \ + tetrix.cpp \ + tpiece.cpp diff --git a/examples/tetrix/tpiece.cpp b/examples/tetrix/tpiece.cpp new file mode 100644 index 000000000..71e47e9b3 --- /dev/null +++ b/examples/tetrix/tpiece.cpp @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "tpiece.h" +#include "qstring.h" +#include <stdlib.h> + +void TetrixPiece::rotateLeft() +{ + if ( pieceType == 5 ) // don't rotate square piece type + return; + int tmp; + for (int i = 0 ; i < 4 ; i++) { + tmp = getXCoord(i); + setXCoord(i,getYCoord(i)); + setYCoord(i,-tmp); + } +} + +void TetrixPiece::rotateRight() +{ + if ( pieceType == 5 ) // don't rotate square piece type + return; + int tmp; + for (int i = 0 ; i < 4 ; i++) { + tmp = getXCoord(i); + setXCoord(i,-getYCoord(i)); + setYCoord(i,tmp); + } +} + +int TetrixPiece::getMinX() +{ + int tmp = coordinates[0][0]; + for(int i = 1 ; i < 4 ; i++) + if (tmp > coordinates[i][0]) + tmp = coordinates[i][0]; + return tmp; +} + +int TetrixPiece::getMaxX() +{ + int tmp = coordinates[0][0]; + for(int i = 1 ; i < 4 ; i++) + if (tmp < coordinates[i][0]) + tmp = coordinates[i][0]; + return tmp; + +} + +int TetrixPiece::getMinY() +{ + int tmp = coordinates[0][1]; + for(int i = 1 ; i < 4 ; i++) + if (tmp > coordinates[i][1]) + tmp = coordinates[i][1]; + return tmp; +} + +int TetrixPiece::getMaxY() +{ + int tmp = coordinates[0][1]; + for(int i = 1 ; i < 4 ; i++) + if (tmp < coordinates[i][1]) + tmp = coordinates[i][1]; + return tmp; +} + +void TetrixPiece::initialize(int type) +{ + static int pieceTypes[7][4][2] = {{{ 0,-1}, + { 0, 0}, + {-1, 0}, + {-1, 1}}, + + {{ 0,-1}, + { 0, 0}, + { 1, 0}, + { 1, 1}}, + + {{ 0,-1}, + { 0, 0}, + { 0, 1}, + { 0, 2}}, + + {{-1, 0}, + { 0, 0}, + { 1, 0}, + { 0, 1}}, + + {{ 0, 0}, + { 1, 0}, + { 0, 1}, + { 1, 1}}, + + {{-1,-1}, + { 0,-1}, + { 0, 0}, + { 0, 1}}, + + {{ 1,-1}, + { 0,-1}, + { 0, 0}, + { 0, 1}}}; + if (type < 1 || type > 7) + type = 1; + pieceType = type; + for(int i = 0 ; i < 4 ; i++) { + coordinates[i][0] = pieceTypes[type - 1][i][0]; + coordinates[i][1] = pieceTypes[type - 1][i][1]; + } +} + + +/* + * Sigh, oh beautiful nostalgia! This random algorithm has + * been taken from the book "Adventures with your pocket calculator" + * and I used it in my first implemented and machine- + * run program of any size to speak of. Imagine how hungry I + * was after having programmed BASIC on paper for + * half a year?!!?!?!?!?!? The first program I typed in was a + * slot machine game and was made in BASIC on a SHARP + * PC-1211 with 1,47 KB RAM (one point four seven kilobytes) and + * a one-line LCD-display (I think it had 32 characters) in the + * year of our lord 1981. The man I had bought the machine from worked + * as a COBOL programmer and was amazed and impressed + * when I demonstrated the program 2 days after I had + * bought the machine, quote: "Gees, I have been looking so long + * for a "random" command in that BASIC, what is it called?" + * Oh, how I still get a thrill out of the thought of the + * explanation I then gave him... + */ + +/* + * Sukk, aa vakre nostalgi! Denne random algoritmen er + * tatt fra boka "Adventures with your pocket calculator" + * og den brukte jeg i mitt foerste implementerte og maskin- + * kjoerte program av nevneverdig stoerrelse. Tror du jeg var + * noe sulten etter aa ha programmert BASIC paa papir i et + * halvt aar?!!?!?!?!?!? Programmet jeg tasta inn foerst var et + * "enarmet banditt" spill og ble laget i BASIC paa en SHARP + * PC-1211 med 1,47 KB RAM (en komma foertisju kilobyte) og + * et en-linjers LCD-display (tror det hadde 32 karakterer) i det + * herrens aar 1981. Mannen jeg kjoepte maskinen av jobbet til + * daglig med COBOL programmering og var forbloeffet og imponert + * da jeg demonstrerte programmet 2 dager etter at jeg hadde + * kjoept maskinen, sitat: "Joess, jeg som har leita saa lenge + * etter en random kommando i den BASICen, hva var det den + * het?" Aa, jeg frydes ennaa ved tanken paa forklaringen jeg + * deretter ga ham... + */ + +double TetrixPiece::randomSeed = 0.33333; + +void TetrixPiece::setRandomSeed(double seed) +{ + TQCString buffer; + if (seed < 0) + seed = - seed; + if (seed >= 1) + seed = seed - (double) ((int) seed); + buffer.sprintf("%1.5f",(float) seed); + for (int i = 0 ; i < 5 ; i++) + if ((buffer[i + 2] - '0') % 2 == 0) + buffer[i + 2]++; + randomSeed = atof(buffer); +} + +int TetrixPiece::randomValue(int maxPlusOne) +{ + randomSeed = randomSeed*147; + randomSeed = randomSeed - (double) ((int) randomSeed); + return (int) (randomSeed*maxPlusOne); +} diff --git a/examples/tetrix/tpiece.h b/examples/tetrix/tpiece.h new file mode 100644 index 000000000..11a0ffb49 --- /dev/null +++ b/examples/tetrix/tpiece.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TPIECE_H +#define TPIECE_H + +class TetrixPiece +{ +public: + TetrixPiece() {setRandomType();} + TetrixPiece(int type) {initialize(type % 7 + 1);} + + void setRandomType() {initialize(randomValue(7) + 1);} + + void rotateLeft(); + void rotateRight(); + + int getType() {return pieceType;} + int getXCoord(int index) {return coordinates[index][0];} + int getYCoord(int index) {return coordinates[index][1];} + void getCoord(int index,int &x,int&y){x = coordinates[index][0]; + y = coordinates[index][1];} + int getMinX(); + int getMaxX(); + int getMinY(); + int getMaxY(); + + static void setRandomSeed(double seed); + static int randomValue(int maxPlusOne); + +private: + void setXCoord(int index,int value) {coordinates[index][0] = value;} + void setYCoord(int index,int value) {coordinates[index][1] = value;} + void setCoords(int index,int x,int y){coordinates[index][0] = x; + coordinates[index][1] = y;} + void initialize(int type); + + int pieceType; + int coordinates[4][2]; + + static double randomSeed; +}; + +#endif diff --git a/examples/textedit/editcopy.xpm b/examples/textedit/editcopy.xpm new file mode 100644 index 000000000..cc6fb7a68 --- /dev/null +++ b/examples/textedit/editcopy.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c #8b8bfd", +"X c #3c3cfd", +"o c #000082", +"O c Gray0", +"+ c None", +"@ c Gray0", +"# c Gray0", +/* pixels */ +"++++++++++++++++++++++", +"++++++++++++++++++++++", +"OOOOOOOO++++++++++++++", +"O OO+++++++++++++", +"O OOOO O O++++++++++++", +"O O O+++++++++++", +"O OOOO Ooooooooo++++++", +"O Oo oo+++++", +"O OOOOO o OOOO oXo++++", +"O o o.Xo+++", +"O OOOOO o OOOO o .Xo++", +"O o oooooo+", +"O OOOOO o OOOO o+", +"O o o+", +"O OOOOO o OOOOOOOOO o+", +"O o o+", +"OOOOOOOOo OOOOOOOOO o+", +"++++++++o o+", +"++++++++o OOOOOOOOO o+", +"++++++++o o+", +"++++++++ooooooooooooo+", +"++++++++++++++++++++++" +}; diff --git a/examples/textedit/editcut.xpm b/examples/textedit/editcut.xpm new file mode 100644 index 000000000..2391adda5 --- /dev/null +++ b/examples/textedit/editcut.xpm @@ -0,0 +1,32 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 4 1", +" c Gray100", +". c #000082", +"X c Gray0", +"o c None", +/* pixels */ +"oooooooooooooooooooooo", +"oooooooXoooooXoooooooo", +"oooooooXoooooXoooooooo", +"oooooooXoooooXoooooooo", +"oooooooXooooXXoooooooo", +"oooooooXXoooXooooooooo", +"ooooooooXoooXooooooooo", +"ooooooooXXoXXooooooooo", +"oooooooooXXXoooooooooo", +"oooooooooXXXoooooooooo", +"ooooooooooXooooooooooo", +"ooooooooo.X.oooooooooo", +"oooooooo..o...oooooooo", +"ooooooo.o.o.oo.ooooooo", +"oooooo.oo.o.ooo.oooooo", +"ooooo.ooo.o.oooo.ooooo", +"oooo.oooo.o.oooo.ooooo", +"oooo.oooo.oo.ooo.ooooo", +"oooo.oooo.oo.oo.oooooo", +"oooo.ooo.oooo..ooooooo", +"ooooo...oooooooooooooo", +"oooooooooooooooooooooo" +}; diff --git a/examples/textedit/editpaste.xpm b/examples/textedit/editpaste.xpm new file mode 100644 index 000000000..3f775920f --- /dev/null +++ b/examples/textedit/editpaste.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c Yellow", +"X c #c6c3c6", +"o c #848284", +"O c #848200", +"+ c #000084", +"@ c Gray0", +"# c None", +/* pixels */ +"######################", +"#######@@@@@##########", +"##@@@@@@...@@@@@@#####", +"#@@@@@@.....@@@@@@####", +"@@oOo@@.@@@.@@oOo@@###", +"@oOo@XXXXXXXXX@oOo@###", +"@OoO@XXXXXXXXX@OoO@###", +"@oOo@@@@@@@@@@@oOo@###", +"@OoOoOoOoOoOoOoOoO@###", +"@oOoOoOoOoOoOoOoOo@###", +"@OoOoOoO++++++++++@###", +"@oOoOoOo+ + +###", +"@OoOoOoO+ +++++ + +##", +"@oOoOoOo+ + +#", +"@OoOoOoO+ +++++ + +", +"@oOoOoOo+ ++++++", +"@OoOoOoO+ +++++ +", +"@oOoOoOo+ +", +"@OoOoOoO+ ++++++++++ +", +"#@@@@@@@+ +", +"########++++++++++++++", +"######################" +}; diff --git a/examples/textedit/editredo.xpm b/examples/textedit/editredo.xpm new file mode 100644 index 000000000..46dc03319 --- /dev/null +++ b/examples/textedit/editredo.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c #848284", +"X c #000084", +"o c Gray0", +"O c None", +"+ c Gray0", +"@ c Gray0", +"# c Gray0", +/* pixels */ +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOO.XXXXXXOOOOOOOOOOO", +"OOOXXXXXXXXXXOOOOOOXOO", +"OO.XXOOOOOOXXXXOOOXXOO", +"OOXXOOOOOOOOOXXXOXXXOO", +"OOXXOOOOOOOOOOXXXXXXOO", +"OOXXOOOOOOOOOOOXXXXXOO", +"OOXXOOOOOOOOOOXXXXXXOO", +"OOXXOOOOOOOOOXXXXXXXOO", +"OO.XXOOOOOOOXXXXXXXXOO", +"OOOXXX.OOOOOOOOOOOOOOO", +"OOOOXXXOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO" +}; diff --git a/examples/textedit/editundo.xpm b/examples/textedit/editundo.xpm new file mode 100644 index 000000000..229c1636e --- /dev/null +++ b/examples/textedit/editundo.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c #848284", +"X c #000084", +"o c Gray0", +"O c None", +"+ c Gray0", +"@ c Gray0", +"# c Gray0", +/* pixels */ +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOXXXXXX.OOOO", +"OOXOOOOOOXXXXXXXXXXOOO", +"OOXXOOOXXXXOOOOOOXX.OO", +"OOXXXOXXXOOOOOOOOOXXOO", +"OOXXXXXXOOOOOOOOOOXXOO", +"OOXXXXXOOOOOOOOOOOXXOO", +"OOXXXXXXOOOOOOOOOOXXOO", +"OOXXXXXXXOOOOOOOOOXXOO", +"OOXXXXXXXXOOOOOOOXX.OO", +"OOOOOOOOOOOOOOO.XXXOOO", +"OOOOOOOOOOOOOOOXXXOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO" +}; diff --git a/examples/textedit/example.html b/examples/textedit/example.html new file mode 100644 index 000000000..39b60ff76 --- /dev/null +++ b/examples/textedit/example.html @@ -0,0 +1,24 @@ +<html><head><meta name="qrichtext" content="1" /></head><body style="font-size:12pt;font-family:helvetica"> +<p align="center"><span style="font-size:24pt;font-weight:600">TQTextEdit</span></p> +<p align="justify">TQTextEdit is an advanced WYSIWYG editor supporting richtext formatting. It is optimized to handle large documents and to respond tquickly to user input.</p> +<p align="justify">TQTextEdit supports font styles such as <span style="font-weight:600">bold</span>, <span style="font-style:italic">italic, </span><span style="text-decoration:underline">underlined</span> as well as various <span style="font-weight:600;color:#00007f">c</span><span style="font-weight:600;color:#aa0000">o</span><span style="font-weight:600;color:#005500">l</span><span style="font-weight:600;color:#aa5500">o</span><span style="font-weight:600;color:#00aa00">r</span><span style="font-weight:600;color:#ff0000">s </span>and <span style="font-size:16pt">s</span><span style="font-size:18pt">i</span><span style="font-size:20pt">z</span><span style="font-size:22pt">e</span><span style="font-size:28pt">s</span>. You can select different font families, for example <span style="font-family:Times;font-weight:600">Times New Roman</span> or <span style="font-family:Courier;font-weight:600">Courier</span>. Futhermore the widget supports different paragraph alignments such as justified,</p> +<p>left aligned,</p> +<p align="center">centered,</p> +<p align="right">and right aligned.</p> +<p align="justify"></p> +<!-- Not public API +<p>In addition to the mentioned character styles, the editor supports both bullet lists</p> +<ul type="disc"><li>Disc</li> +<ul type="circle"><li>Circle</li> +<ul type="square"><li>Square</li></ul></ul></ul> +<p>and ordered lists</p> +<ol><li>One</li> +<li>Two</li> +<ol type="a"><li>Two.a</li> +<li>Two.b</li> +<ol type="A"><li>Two.b.A</li> +<li>Two.b.B</li></ol> +<li>Two.c</li></ol> +<li>Three.</li></ol> +--> +</body></html> diff --git a/examples/textedit/filenew.xpm b/examples/textedit/filenew.xpm new file mode 100644 index 000000000..884d7cbb1 --- /dev/null +++ b/examples/textedit/filenew.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c Gray76", +"X c Gray53", +"o c Gray36", +"O c Gray18", +"+ c Gray0", +"@ c None", +"# c Gray0", +/* pixels */ +"@@@@@@@@@@@@@@@@@@@@@@", +"@@@@++++++++++@@@@@@@@", +"@@@@+ +O+@@@@@@@", +"@@@@+ +oO+@@@@@@", +"@@@@+ +XoO+@@@@@", +"@@@@+ +.XoO+@@@@", +"@@@@+ + .XoO+@@@", +"@@@@+ +++++++@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+ +@@@", +"@@@@+++++++++++++++@@@", +"@@@@@@@@@@@@@@@@@@@@@@", +"@@@@@@@@@@@@@@@@@@@@@@" +}; diff --git a/examples/textedit/fileopen.xpm b/examples/textedit/fileopen.xpm new file mode 100644 index 000000000..82effcf7b --- /dev/null +++ b/examples/textedit/fileopen.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c Yellow", +"X c #848200", +"o c Gray0", +"O c None", +"+ c Gray0", +"@ c Gray0", +"# c Gray0", +/* pixels */ +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOooooOOOOoO", +"OOOOOOOOOOOoOOOOooOooO", +"OOOOOOOOOOOOOOOOOOoooO", +"OOOOOOOOOOOOOOOOOooooO", +"OooooOOOOOOOOOOOoooooO", +"o. . ooooooooooOOOOOOO", +"o . . . . . . oOOOOOOO", +"o. . . . . . .oOOOOOOO", +"o . . . . . . oOOOOOOO", +"o. . . ooooooooooooooo", +"o . . ooXXXXXXXXXXXXoo", +"o. . ooXXXXXXXXXXXXooO", +"o . ooXXXXXXXXXXXXooOO", +"o. ooXXXXXXXXXXXXooOOO", +"o ooXXXXXXXXXXXXooOOOO", +"oooXXXXXXXXXXXXooOOOOO", +"ooXXXXXXXXXXXXooOOOOOO", +"oooooooooooooooOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOO" +}; diff --git a/examples/textedit/fileprint.xpm b/examples/textedit/fileprint.xpm new file mode 100644 index 000000000..8701d4609 --- /dev/null +++ b/examples/textedit/fileprint.xpm @@ -0,0 +1,117 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 89 1", +" c Gray0", +". c #101008081010", +"X c #101010101010", +"o c #101010101818", +"O c #181810101818", +"+ c #181818181818", +"@ c #181818182121", +"# c #212118182121", +"$ c Gray13", +"% c #212121212929", +"& c #292921212929", +"* c Gray16", +"= c #292929293131", +"- c #313129293131", +"; c #313131313131", +": c #313131313939", +"> c #393931313939", +", c #393939393939", +"< c #393939394242", +"1 c #424239394242", +"2 c Gray26", +"3 c #4a4a4a4a5252", +"4 c #5a5a52525a5a", +"5 c #5a5a5a5a6363", +"6 c #6b6b63636b6b", +"7 c Gray42", +"8 c #6b6b6b6b7373", +"9 c #73736b6b7373", +"0 c #7b7b73737b7b", +"q c #7b7b73738484", +"w c #0808ffff0808", +"e c #2929ffff2929", +"r c #3131ffff3131", +"t c #5a5acece5a5a", +"y c #6b6bffff6363", +"u c #7b7bffff7b7b", +"i c #84847b7b8484", +"p c #84847b7b8c8c", +"a c #8c8c7b7b9494", +"s c #848484848c8c", +"d c #8c8c84848c8c", +"f c Gray55", +"g c #8c8c84849494", +"h c #8c8c8c8c9494", +"j c #94948c8c9494", +"k c #94948c8c9c9c", +"l c Gray58", +"z c #949494949c9c", +"x c #9c9c94949c9c", +"c c Gray61", +"v c #9c9c9494a5a5", +"b c #9c9c9c9ca5a5", +"n c #a5a59c9ca5a5", +"m c #a5a59c9cadad", +"M c #adad9c9cadad", +"N c #a5a5a5a5a5a5", +"B c #a5a5a5a5adad", +"V c #adada5a5adad", +"C c Gray68", +"Z c #adadadadb5b5", +"A c #b5b5adadb5b5", +"S c Gray71", +"D c Gray74", +"F c #9494c6c69494", +"G c #9c9ccecea5a5", +"H c #bdbdd6d6bdbd", +"J c #c0c0c0c0c0c0", +"K c #c6c6c6c6c6c6", +"L c #cecec6c6cece", +"P c #cececececece", +"I c #cecececed6d6", +"U c #d6d6ceced6d6", +"Y c #d6d6cecedede", +"T c Gray84", +"R c #d6d6d6d6dede", +"E c #deded6d6dede", +"W c Gray87", +"Q c #deded6d6e7e7", +"! c #dedededee7e7", +"~ c #d6d6ffffd6d6", +"^ c #e7e7dedee7e7", +"/ c #e7e7e7e7e7e7", +"( c #e7e7e7e7efef", +") c #efefe7e7efef", +"_ c #efefefefefef", +"` c #e7e7ffffe7e7", +"' c Gray97", +"] c Gray100", +"[ c None", +/* pixels */ +"[[[[[[SDPPPPKKDDCD[[[[", +"[[[[[[D_/////___WD[[[[", +"[[[[[[DKKKPPKKKKDK[[[[", +"[[[[[[SDDDDSDDSSCD[[[[", +"[[[[[KCKDKKKDDDKS[[[[[", +"[[[[[DDSDDDDDDKKS[[[[[", +"[[[[[DSKDDDDDKDKC[[[[[", +"[[[[[KDDDDDDDDDDS[[[[[", +"[[[[[CP/WWWWWWTWNNZ[[[", +"[[[Dc9STPTPTPTWWj427S[", +"[[Dziq0000000pag8<%@2N", +"[DcE(!ERRRRUYGtFn2##O<", +"Db)]]]]]]]]]~ewePa;@X#", +"V']]]]]]]]]]`yru]Q0@ #", +"BRILITRRW^!E!RHUILhO @", +"jAZVBmBnmmNmnmMvzh6o #", +"jZZmBnnnbnbbbbvxxg6o +", +"lmmnbnbbbvcvxxxvjs6O 3", +"jBnnvcvxvcvxvxzjhd8o+C", +"lsdgfgdhgdhhjhjkhg6+l[", +"S9%@$%&&&=--::>>:-:l[[", +"[[C511,:;;;**%++.2c[[[" +}; diff --git a/examples/textedit/filesave.xpm b/examples/textedit/filesave.xpm new file mode 100644 index 000000000..71cbd331a --- /dev/null +++ b/examples/textedit/filesave.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char *magick[] = { +/* columns rows colors chars-per-pixel */ +"22 22 8 1", +" c Gray100", +". c #cab5d1", +"X c #c1c1c1", +"o c #848200", +"O c Gray0", +"+ c None", +"@ c Gray0", +"# c Gray0", +/* pixels */ +"++++++++++++++++++++++", +"+OOOOOOOOOOOOOOOOOOOO+", +"+OooOXXXXXXXXXXXXOXXO+", +"+OooOXXXXXXXXXXXXOXXO+", +"+OooOXXXXXXXXX.XXOOOO+", +"+OooOXXX..XXXXXXXOooO+", +"+OooOXXX..XXXXXXXOooO+", +"+OooOXXXXXXXXXXXXOooO+", +"+OooOXXXXXXXXXXXXOooO+", +"+OooOXXXXXXXXXXXXOooO+", +"+OooOXXXXXXXXXXXXOooO+", +"+OoooOOOOOOOOOOOOoooO+", +"+OooooooooooooooooooO+", +"+OooooooooooooooooooO+", +"+OoooOOOOOOOOOOOOOooO+", +"+OoooOOOOOOOOOXXXOooO+", +"+OoooOOOOOOOOOXXXOooO+", +"+OoooOOOOOOOOOXXXOooO+", +"+OoooOOOOOOOOOXXXOooO+", +"+OoooOOOOOOOOOXXXOooO+", +"++OOOOOOOOOOOOOOOOOO++", +"++++++++++++++++++++++" +}; diff --git a/examples/textedit/main.cpp b/examples/textedit/main.cpp new file mode 100644 index 000000000..db2ad21a4 --- /dev/null +++ b/examples/textedit/main.cpp @@ -0,0 +1,22 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "textedit.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + TextEdit * mw = new TextEdit(); + mw->setCaption( "Richtext Editor" ); + mw->resize( 640, 800 ); + mw->show(); + a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) ); + return a.exec(); +} diff --git a/examples/textedit/textbold.xpm b/examples/textedit/textbold.xpm new file mode 100644 index 000000000..8398e2eca --- /dev/null +++ b/examples/textedit/textbold.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * bold_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ", +" ......... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ........ ", +" ... .... ", +" ... .... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ... ... ", +" .......... ", +" ", +" ", +" ", +" "}; diff --git a/examples/textedit/textcenter.xpm b/examples/textedit/textcenter.xpm new file mode 100644 index 000000000..837152f67 --- /dev/null +++ b/examples/textedit/textcenter.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * center_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ", +" "}; diff --git a/examples/textedit/textedit.cpp b/examples/textedit/textedit.cpp new file mode 100644 index 000000000..a64c9d94c --- /dev/null +++ b/examples/textedit/textedit.cpp @@ -0,0 +1,455 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "textedit.h" + +#include <qtextedit.h> +#include <qaction.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qtoolbar.h> +#include <qtabwidget.h> +#include <qapplication.h> +#include <qfontdatabase.h> +#include <qcombobox.h> +#include <qlineedit.h> +#include <qfileinfo.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qprinter.h> +#include <qpaintdevicemetrics.h> +#include <qsimplerichtext.h> +#include <qcolordialog.h> +#include <qpainter.h> + +TextEdit::TextEdit( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name ) +{ + setupFileActions(); + setupEditActions(); + setupTextActions(); + + tabWidget = new TQTabWidget( this ); + connect( tabWidget, SIGNAL( currentChanged( TQWidget * ) ), + this, SLOT( editorChanged( TQWidget * ) ) ); + setCentralWidget( tabWidget ); + + if ( qApp->argc() == 1 ) { + load( "example.html" ); + } else { + for ( int i = 1; i < qApp->argc(); ++i ) + load( qApp->argv()[ i ] ); + } +} + +void TextEdit::setupFileActions() +{ + TQToolBar *tb = new TQToolBar( this ); + tb->setLabel( "File Actions" ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "&File" ), menu ); + + TQAction *a; + a = new TQAction( TQPixmap::fromMimeSource( "filenew.xpm" ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( TQPixmap::fromMimeSource( "fileopen.xpm" ), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileOpen() ) ); + a->addTo( tb ); + a->addTo( menu ); + menu->insertSeparator(); + a = new TQAction( TQPixmap::fromMimeSource( "filesave.xpm" ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "Save &As..." ), 0, this, "fileSaveAs" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) ); + a->addTo( menu ); + menu->insertSeparator(); + a = new TQAction( TQPixmap::fromMimeSource( "fileprint.xpm" ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( tr( "&Close" ), 0, this, "fileClose" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) ); + a->addTo( menu ); + a = new TQAction( tr( "E&xit" ), 0, this, "fileExit" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileExit() ) ); + a->addTo( menu ); +} + +void TextEdit::setupEditActions() +{ + TQToolBar *tb = new TQToolBar( this ); + tb->setLabel( "Edit Actions" ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "&Edit" ), menu ); + + TQAction *a; + a = new TQAction( TQPixmap::fromMimeSource( "editundo.xpm" ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( TQPixmap::fromMimeSource( "editredo.xpm" ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) ); + a->addTo( tb ); + a->addTo( menu ); + menu->insertSeparator(); + a = new TQAction( TQPixmap::fromMimeSource( "editcopy.xpm" ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( TQPixmap::fromMimeSource( "editcut.xpm" ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new TQAction( TQPixmap::fromMimeSource( "editpaste.xpm" ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" ); + connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) ); + a->addTo( tb ); + a->addTo( menu ); +} + +void TextEdit::setupTextActions() +{ + TQToolBar *tb = new TQToolBar( this ); + tb->setLabel( "Format Actions" ); + TQPopupMenu *menu = new TQPopupMenu( this ); + menuBar()->insertItem( tr( "F&ormat" ), menu ); + + comboFont = new TQComboBox( TRUE, tb ); + TQFontDatabase db; + comboFont->insertStringList( db.families() ); + connect( comboFont, SIGNAL( activated( const TQString & ) ), + this, SLOT( textFamily( const TQString & ) ) ); + comboFont->lineEdit()->setText( TQApplication::font().family() ); + + comboSize = new TQComboBox( TRUE, tb ); + TQValueList<int> sizes = db.standardSizes(); + TQValueList<int>::Iterator it = sizes.begin(); + for ( ; it != sizes.end(); ++it ) + comboSize->insertItem( TQString::number( *it ) ); + connect( comboSize, SIGNAL( activated( const TQString & ) ), + this, SLOT( textSize( const TQString & ) ) ); + comboSize->lineEdit()->setText( TQString::number( TQApplication::font().pointSize() ) ); + + actionTextBold = new TQAction( TQPixmap::fromMimeSource( "textbold.xpm" ), tr( "&Bold" ), CTRL + Key_B, this, "textBold" ); + connect( actionTextBold, SIGNAL( activated() ), this, SLOT( textBold() ) ); + actionTextBold->addTo( tb ); + actionTextBold->addTo( menu ); + actionTextBold->setToggleAction( TRUE ); + actionTextItalic = new TQAction( TQPixmap::fromMimeSource( "textitalic.xpm" ), tr( "&Italic" ), CTRL + Key_I, this, "textItalic" ); + connect( actionTextItalic, SIGNAL( activated() ), this, SLOT( textItalic() ) ); + actionTextItalic->addTo( tb ); + actionTextItalic->addTo( menu ); + actionTextItalic->setToggleAction( TRUE ); + actionTextUnderline = new TQAction( TQPixmap::fromMimeSource( "textunder.xpm" ), tr( "&Underline" ), CTRL + Key_U, this, "textUnderline" ); + connect( actionTextUnderline, SIGNAL( activated() ), this, SLOT( textUnderline() ) ); + actionTextUnderline->addTo( tb ); + actionTextUnderline->addTo( menu ); + actionTextUnderline->setToggleAction( TRUE ); + menu->insertSeparator(); + + TQActionGroup *grp = new TQActionGroup( this ); + connect( grp, SIGNAL( selected( TQAction* ) ), this, SLOT( textAlign( TQAction* ) ) ); + + actionAlignLeft = new TQAction( TQPixmap::fromMimeSource( "textleft.xpm" ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" ); + actionAlignLeft->setToggleAction( TRUE ); + actionAlignCenter = new TQAction( TQPixmap::fromMimeSource( "textcenter.xpm" ), tr( "C&enter" ), CTRL + Key_E, grp, "textCenter" ); + actionAlignCenter->setToggleAction( TRUE ); + actionAlignRight = new TQAction( TQPixmap::fromMimeSource( "textright.xpm" ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" ); + actionAlignRight->setToggleAction( TRUE ); + actionAlignJustify = new TQAction( TQPixmap::fromMimeSource( "textjustify.xpm" ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" ); + actionAlignJustify->setToggleAction( TRUE ); + + grp->addTo( tb ); + grp->addTo( menu ); + + menu->insertSeparator(); + + TQPixmap pix( 16, 16 ); + pix.fill( black ); + actionTextColor = new TQAction( pix, tr( "&Color..." ), 0, this, "textColor" ); + connect( actionTextColor, SIGNAL( activated() ), this, SLOT( textColor() ) ); + actionTextColor->addTo( tb ); + actionTextColor->addTo( menu ); +} + +void TextEdit::load( const TQString &f ) +{ + if ( !TQFile::exists( f ) ) + return; + TQTextEdit *edit = new TQTextEdit( tabWidget ); + edit->setTextFormat( RichText ); + doConnections( edit ); + tabWidget->addTab( edit, TQFileInfo( f ).fileName() ); + TQFile file( f ); + if ( !file.open( IO_ReadOnly ) ) + return; + TQTextStream ts( &file ); + TQString txt = ts.read(); + if ( !TQStyleSheet::mightBeRichText( txt ) ) + txt = TQStyleSheet::convertFromPlainText( txt, TQStyleSheetItem::WhiteSpacePre ); + edit->setText( txt ); + tabWidget->showPage( edit ); + edit->viewport()->setFocus(); + filenames.replace( edit, f ); +} + +TQTextEdit *TextEdit::currentEditor() const +{ + if ( tabWidget->currentPage() && + tabWidget->currentPage()->inherits( "TQTextEdit" ) ) + return (TQTextEdit*)tabWidget->currentPage(); + return 0; +} + +void TextEdit::doConnections( TQTextEdit *e ) +{ + connect( e, SIGNAL( currentFontChanged( const TQFont & ) ), + this, SLOT( fontChanged( const TQFont & ) ) ); + connect( e, SIGNAL( currentColorChanged( const TQColor & ) ), + this, SLOT( colorChanged( const TQColor & ) ) ); + connect( e, SIGNAL( currentAlignmentChanged( int ) ), + this, SLOT( alignmentChanged( int ) ) ); +} + +void TextEdit::fileNew() +{ + TQTextEdit *edit = new TQTextEdit( tabWidget ); + edit->setTextFormat( RichText ); + doConnections( edit ); + tabWidget->addTab( edit, tr( "noname" ) ); + tabWidget->showPage( edit ); + edit->viewport()->setFocus(); +} + +void TextEdit::fileOpen() +{ + TQString fn = TQFileDialog::getOpenFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this ); + if ( !fn.isEmpty() ) + load( fn ); +} + +void TextEdit::fileSave() +{ + if ( !currentEditor() ) + return; + TQString fn; + if ( filenames.find( currentEditor() ) == filenames.end() ) { + fileSaveAs(); + } else { + TQFile file( *filenames.find( currentEditor() ) ); + if ( !file.open( IO_WriteOnly ) ) + return; + TQTextStream ts( &file ); + ts << currentEditor()->text(); + } +} + +void TextEdit::fileSaveAs() +{ + if ( !currentEditor() ) + return; + TQString fn = TQFileDialog::getSaveFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this ); + if ( !fn.isEmpty() ) { + filenames.replace( currentEditor(), fn ); + fileSave(); + tabWidget->setTabLabel( currentEditor(), TQFileInfo( fn ).fileName() ); + } +} + +void TextEdit::filePrint() +{ + if ( !currentEditor() ) + return; +#ifndef QT_NO_PRINTER + TQPrinter printer( TQPrinter::HighResolution ); + printer.setFullPage(TRUE); + if ( printer.setup( this ) ) { + TQPainter p( &printer ); + // Check that there is a valid device to print to. + if ( !p.device() ) return; + TQPaintDeviceMetrics metrics( p.device() ); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + TQFont font( currentEditor()->TQWidget::font() ); + font.setPointSize( 10 ); // we define 10pt to be a nice base size for printing + + TQSimpleRichText richText( currentEditor()->text(), font, + currentEditor()->context(), + currentEditor()->styleSheet(), + currentEditor()->mimeSourceFactory(), + view.height() ); + richText.setWidth( &p, view.width() ); + int page = 1; + do { + richText.draw( &p, margin, margin, view, colorGroup() ); + view.moveBy( 0, view.height() ); + p.translate( 0 , -view.height() ); + p.setFont( font ); + p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) ); + if ( view.top() - margin >= richText.height() ) + break; + printer.newPage(); + page++; + } while (TRUE); + } +#endif +} + +void TextEdit::fileClose() +{ + delete currentEditor(); + if ( currentEditor() ) + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::fileExit() +{ + qApp->tquit(); +} + +void TextEdit::editUndo() +{ + if ( !currentEditor() ) + return; + currentEditor()->undo(); +} + +void TextEdit::editRedo() +{ + if ( !currentEditor() ) + return; + currentEditor()->redo(); +} + +void TextEdit::editCut() +{ + if ( !currentEditor() ) + return; + currentEditor()->cut(); +} + +void TextEdit::editCopy() +{ + if ( !currentEditor() ) + return; + currentEditor()->copy(); +} + +void TextEdit::editPaste() +{ + if ( !currentEditor() ) + return; + currentEditor()->paste(); +} + +void TextEdit::textBold() +{ + if ( !currentEditor() ) + return; + currentEditor()->setBold( actionTextBold->isOn() ); +} + +void TextEdit::textUnderline() +{ + if ( !currentEditor() ) + return; + currentEditor()->setUnderline( actionTextUnderline->isOn() ); +} + +void TextEdit::textItalic() +{ + if ( !currentEditor() ) + return; + currentEditor()->setItalic( actionTextItalic->isOn() ); +} + +void TextEdit::textFamily( const TQString &f ) +{ + if ( !currentEditor() ) + return; + currentEditor()->setFamily( f ); + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::textSize( const TQString &p ) +{ + if ( !currentEditor() ) + return; + currentEditor()->setPointSize( p.toInt() ); + currentEditor()->viewport()->setFocus(); +} + +void TextEdit::textColor() +{ + if ( !currentEditor() ) + return; + TQColor col = TQColorDialog::getColor( currentEditor()->color(), this ); + if ( !col.isValid() ) + return; + currentEditor()->setColor( col ); + TQPixmap pix( 16, 16 ); + pix.fill( black ); + actionTextColor->setIconSet( pix ); +} + +void TextEdit::textAlign( TQAction *a ) +{ + if ( !currentEditor() ) + return; + if ( a == actionAlignLeft ) + currentEditor()->setAlignment( AlignLeft ); + else if ( a == actionAlignCenter ) + currentEditor()->setAlignment( AlignHCenter ); + else if ( a == actionAlignRight ) + currentEditor()->setAlignment( AlignRight ); + else if ( a == actionAlignJustify ) + currentEditor()->setAlignment( AlignJustify ); +} + +void TextEdit::fontChanged( const TQFont &f ) +{ + comboFont->lineEdit()->setText( f.family() ); + comboSize->lineEdit()->setText( TQString::number( f.pointSize() ) ); + actionTextBold->setOn( f.bold() ); + actionTextItalic->setOn( f.italic() ); + actionTextUnderline->setOn( f.underline() ); +} + +void TextEdit::colorChanged( const TQColor &c ) +{ + TQPixmap pix( 16, 16 ); + pix.fill( c ); + actionTextColor->setIconSet( pix ); +} + +void TextEdit::alignmentChanged( int a ) +{ + if ( ( a == AlignAuto ) || ( a & AlignLeft )) + actionAlignLeft->setOn( TRUE ); + else if ( ( a & AlignHCenter ) ) + actionAlignCenter->setOn( TRUE ); + else if ( ( a & AlignRight ) ) + actionAlignRight->setOn( TRUE ); + else if ( ( a & AlignJustify ) ) + actionAlignJustify->setOn( TRUE ); +} + +void TextEdit::editorChanged( TQWidget * ) +{ + if ( !currentEditor() ) + return; + fontChanged( currentEditor()->currentFont() ); + colorChanged( currentEditor()->color() ); + alignmentChanged( currentEditor()->alignment() ); +} diff --git a/examples/textedit/textedit.doc b/examples/textedit/textedit.doc new file mode 100644 index 000000000..53279b93e --- /dev/null +++ b/examples/textedit/textedit.doc @@ -0,0 +1,18 @@ +/*! \page textedit-example.html + + \ingroup examples + \title Text Edit Example + + This example displays a text editor with the user interface written + in pure C++. + + A similar example which uses \link designer-manual.book Qt + Designer\endlink to produce the user interface is in the \link + designer-manual.book Qt Designer manual\endlink. + + + See \c{$QTDIR/examples/textedit} for the source code. + +*/ + + diff --git a/examples/textedit/textedit.h b/examples/textedit/textedit.h new file mode 100644 index 000000000..7b2031f03 --- /dev/null +++ b/examples/textedit/textedit.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TEXTEDIT_H +#define TEXTEDIT_H + +#include <qmainwindow.h> +#include <qmap.h> + +class TQAction; +class TQComboBox; +class TQTabWidget; +class TQTextEdit; + +class TextEdit : public TQMainWindow +{ + Q_OBJECT + +public: + TextEdit( TQWidget *parent = 0, const char *name = 0 ); + +private: + void setupFileActions(); + void setupEditActions(); + void setupTextActions(); + void load( const TQString &f ); + TQTextEdit *currentEditor() const; + void doConnections( TQTextEdit *e ); + +private slots: + void fileNew(); + void fileOpen(); + void fileSave(); + void fileSaveAs(); + void filePrint(); + void fileClose(); + void fileExit(); + + void editUndo(); + void editRedo(); + void editCut(); + void editCopy(); + void editPaste(); + + void textBold(); + void textUnderline(); + void textItalic(); + void textFamily( const TQString &f ); + void textSize( const TQString &p ); + void textColor(); + void textAlign( TQAction *a ); + + void fontChanged( const TQFont &f ); + void colorChanged( const TQColor &c ); + void alignmentChanged( int a ); + void editorChanged( TQWidget * ); + +private: + TQAction *actionTextBold, + *actionTextUnderline, + *actionTextItalic, + *actionTextColor, + *actionAlignLeft, + *actionAlignCenter, + *actionAlignRight, + *actionAlignJustify; + TQComboBox + *comboFont, + *comboSize; + TQTabWidget *tabWidget; + TQMap<TQTextEdit*, TQString> filenames; + +}; + + +#endif diff --git a/examples/textedit/textedit.pro b/examples/textedit/textedit.pro new file mode 100644 index 000000000..eeb206785 --- /dev/null +++ b/examples/textedit/textedit.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = textedit + +CONFIG += qt warn_on release + +REQUIRES = full-config nocrosscompiler + +HEADERS = textedit.h +SOURCES = textedit.cpp \ + main.cpp +IMAGES = editcopy.xpm editcut.xpm editpaste.xpm editredo.xpm editundo.xpm filenew.xpm fileopen.xpm fileprint.xpm filesave.xpm textbold.xpm textcenter.xpm textitalic.xpm textjustify.xpm textleft.xpm textright.xpm textunder.xpm diff --git a/examples/textedit/textitalic.xpm b/examples/textedit/textitalic.xpm new file mode 100644 index 000000000..329e66d3e --- /dev/null +++ b/examples/textedit/textitalic.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * italic_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ", +" ..... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ... ", +" ..... ", +" ", +" ", +" ", +" "}; diff --git a/examples/textedit/textjustify.xpm b/examples/textedit/textjustify.xpm new file mode 100644 index 000000000..75b4a274a --- /dev/null +++ b/examples/textedit/textjustify.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * block_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ", +" "}; diff --git a/examples/textedit/textleft.xpm b/examples/textedit/textleft.xpm new file mode 100644 index 000000000..a63e7cef1 --- /dev/null +++ b/examples/textedit/textleft.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * left_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ", +" "}; diff --git a/examples/textedit/textright.xpm b/examples/textedit/textright.xpm new file mode 100644 index 000000000..3e896bd7a --- /dev/null +++ b/examples/textedit/textright.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * right_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ............. ", +" ", +" ................. ", +" ", +" ", +" "}; diff --git a/examples/textedit/textunder.xpm b/examples/textedit/textunder.xpm new file mode 100644 index 000000000..ec962a74c --- /dev/null +++ b/examples/textedit/textunder.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * under_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ", +" ..... .... ", +" ... . ", +" ... . ", +" ... . ", +" ... . ", +" ... . ", +" ... . ", +" ... . ", +" ... . ", +" ... . ", +" ... .. ", +" ... .. ", +" ...... ", +" ", +" ............ ", +" ", +" ", +" "}; diff --git a/examples/themes/fileopen.xpm b/examples/themes/fileopen.xpm new file mode 100644 index 000000000..880417eee --- /dev/null +++ b/examples/themes/fileopen.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char *fileopen[] = { +" 16 13 5 1", +". c #040404", +"# c #808304", +"a c None", +"b c #f3f704", +"c c #f3f7f3", +"aaaaaaaaa...aaaa", +"aaaaaaaa.aaa.a.a", +"aaaaaaaaaaaaa..a", +"a...aaaaaaaa...a", +".bcb.......aaaaa", +".cbcbcbcbc.aaaaa", +".bcbcbcbcb.aaaaa", +".cbcb...........", +".bcb.#########.a", +".cb.#########.aa", +".b.#########.aaa", +"..#########.aaaa", +"...........aaaaa" +}; diff --git a/examples/themes/main.cpp b/examples/themes/main.cpp new file mode 100644 index 000000000..bf4c31b7e --- /dev/null +++ b/examples/themes/main.cpp @@ -0,0 +1,28 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qwindowsstyle.h> +#include "themes.h" + +#include "metal.h" + +int main( int argc, char ** argv ) +{ + TQApplication::setColorSpec( TQApplication::ManyColor ); + TQApplication a( argc, argv ); + + Themes themes; + themes.setCaption( "TQt Example - Themes (TQStyle)" ); + themes.resize( 640, 400 ); + a.setMainWidget( &themes ); + themes.show(); + + return a.exec(); +} diff --git a/examples/themes/marble.xpm b/examples/themes/marble.xpm new file mode 100644 index 000000000..1c0804962 --- /dev/null +++ b/examples/themes/marble.xpm @@ -0,0 +1,470 @@ +/* XPM */ +static const char *marble_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 240 240 223 2", +/* colors */ +".. c #959595", +".# c #c5c5c5", +".a c #adadad", +".b c #dedede", +".c c #b7b7b7", +".d c #d2d2d2", +".e c #bebebe", +".f c #c9c9c9", +".g c #b8b8b8", +".h c #d6d6d6", +".i c #9e9e9e", +".j c #eaeaea", +".k c #b2b2b2", +".l c #cecece", +".m c #a5a5a5", +".n c #e4e4e4", +".o c #c4c4c4", +".p c #d9d9d9", +".q c #b1b1b1", +".r c #d8d8d8", +".s c #e0e0e0", +".t c #d6d6d6", +".u c #b6b6b6", +".v c #bfbfbf", +".w c #cbcbcb", +".x c #a5a5a5", +".y c #d1d1d1", +".z c #cdcdcd", +".A c #aaaaaa", +".B c #9a9a9a", +".C c #dedede", +".D c #aeaeae", +".E c #e6e6e6", +".F c #d3d3d3", +".G c #c8c8c8", +".H c #bababa", +".I c #c4c4c4", +".J c #cccccc", +".K c #bcbcbc", +".L c #f0f0f0", +".M c #b5b5b5", +".N c #e3e3e3", +".O c #c2c2c2", +".P c #adadad", +".Q c #c9c9c9", +".R c #e1e1e1", +".S c #a2a2a2", +".T c #d1d1d1", +".U c #bebebe", +".V c #dbdbdb", +".W c #dbdbdb", +".X c #c8c8c8", +".Y c #b9b9b9", +".Z c #a8a8a8", +".0 c #d3d3d3", +".1 c #9f9f9f", +".2 c #c1c1c1", +".3 c #ebebeb", +".4 c #b4b4b4", +".5 c #d9d9d9", +".6 c #cecece", +".7 c #e8e8e8", +".8 c #d6d6d6", +".9 c #c5c5c5", +"#. c #b0b0b0", +"## c #dadada", +"#a c #c5c5c5", +"#b c #d1d1d1", +"#c c #afafaf", +"#d c #b1b1b1", +"#e c #cbcbcb", +"#f c #c1c1c1", +"#g c #eeeeee", +"#h c #9b9b9b", +"#i c #c6c6c6", +"#j c #c0c0c0", +"#k c #cbcbcb", +"#l c #bdbdbd", +"#m c #a1a1a1", +"#n c #b7b7b7", +"#o c #a7a7a7", +"#p c #e6e6e6", +"#q c #c9c9c9", +"#r c #bbbbbb", +"#s c #e2e2e2", +"#t c #b8b8b8", +"#u c #cdcdcd", +"#v c #d3d3d3", +"#w c #cfcfcf", +"#x c #e0e0e0", +"#y c #d5d5d5", +"#z c #bdbdbd", +"#A c #cecece", +"#B c #c0c0c0", +"#C c #b7b7b7", +"#D c #e5e5e5", +"#E c #c4c4c4", +"#F c #e3e3e3", +"#G c #d3d3d3", +"#H c #dddddd", +"#I c #dddddd", +"#J c #acacac", +"#K c #a3a3a3", +"#L c #eaeaea", +"#M c #e1e1e1", +"#N c #b9b9b9", +"#O c #d5d5d5", +"#P c #bababa", +"#Q c #d7d7d7", +"#R c #b5b5b5", +"#S c #d1d1d1", +"#T c #c6c6c6", +"#U c #dcdcdc", +"#V c #b4b4b4", +"#W c #c6c6c6", +"#X c #a8a8a8", +"#Y c #a0a0a0", +"#Z c #cbcbcb", +"#0 c #bfbfbf", +"#1 c #cbcbcb", +"#2 c #a4a4a4", +"#3 c #c0c0c0", +"#4 c #bbbbbb", +"#5 c #9c9c9c", +"#6 c #a2a2a2", +"#7 c #dcdcdc", +"#8 c #c3c3c3", +"#9 c #9d9d9d", +"a. c #aaaaaa", +"a# c #d5d5d5", +"aa c #eeeeee", +"ab c #b6b6b6", +"ac c #b0b0b0", +"ad c #b3b3b3", +"ae c #c9c9c9", +"af c #e9e9e9", +"ag c #bdbdbd", +"ah c #a0a0a0", +"ai c #b0b0b0", +"aj c #e8e8e8", +"ak c #cacaca", +"al c #c3c3c3", +"am c #dbdbdb", +"an c #d0d0d0", +"ao c #d8d8d8", +"ap c #c7c7c7", +"aq c #dcdcdc", +"ar c #c7c7c7", +"as c #f0f0f0", +"at c #a3a3a3", +"au c #bfbfbf", +"av c #d9d9d9", +"aw c #dfdfdf", +"ax c #d3d3d3", +"ay c #c0c0c0", +"az c #cacaca", +"aA c #b3b3b3", +"aB c #cfcfcf", +"aC c #dadada", +"aD c #b2b2b2", +"aE c #e2e2e2", +"aF c #d7d7d7", +"aG c #c4c4c4", +"aH c #b8b8b8", +"aI c #cdcdcd", +"aJ c #a6a6a6", +"aK c #d2d2d2", +"aL c #cecece", +"aM c #acacac", +"aN c #dfdfdf", +"aO c #d5d5d5", +"aP c #c9c9c9", +"aQ c #bcbcbc", +"aR c #c6c6c6", +"aS c #cdcdcd", +"aT c #bebebe", +"aU c #f2f2f2", +"aV c #b6b6b6", +"aW c #e4e4e4", +"aX c #c3c3c3", +"aY c #e2e2e2", +"aZ c #d2d2d2", +"a0 c #dddddd", +"a1 c #dcdcdc", +"a2 c #ececec", +"a3 c #eaeaea", +"a4 c #cccccc", +"a5 c #c7c7c7", +"a6 c #c2c2c2", +"a7 c #cccccc", +"a8 c #a8a8a8", +"a9 c #e7e7e7", +"b. c #e4e4e4", +"b# c #d9d9d9", +"ba c #bababa", +"bb c #cfcfcf", +"bc c #d4d4d4", +"bd c #d0d0d0", +"be c #aeaeae", +"bf c #e1e1e1", +"bg c #d7d7d7", +"bh c #cfcfcf", +"bi c #b8b8b8", +"bj c #e6e6e6", +"bk c #c5c5c5", +"bl c #e4e4e4", +"bm c #d4d4d4", +"bn c #dfdfdf", +"bo c #dedede", +"bp c #ececec", +"bq c #bababa", +"br c #bcbcbc", +"bs c #b0b0b0", +"bt c #cccccc", +"bu c #a6a6a6", +"bv c #c1c1c1", +"bw c #bcbcbc", +"bx c #ababab", +"by c #d7d7d7", +"bz c #b7b7b7", +"bA c #b2b2b2", +"bB c #b4b4b4", +"bC c #bfbfbf", +/* pixels */ +"aYbla9a9a9.7#D.N#L#La9.7a9#D#D.7#D#D#DaY#x#xa0ama0ama0am#xbnbnbnaYaYaYaYaY#DaYaYaYbn#x#x#xaY.N#Da9a9a9a9a9a9a9a9a9.7a9a9a9#Da9#D#L#L#L#L#L#La2#La2a2a2a2a2a2#ga2#ga2#ga2a2#ga2a2#L#L#L#Lafa9a9a9bl#Dbl#Da9a9a9#L#L#Laf#L#Laf#L#L#L#L#L#L#L#L#L#La2#La2a2a2#La2#L#L#Laf#L#Laf#L#Laf#L#Laf#L#Laf#Laf#Laf#Laf#Laf#L#D#DblblaYaYaCa0.t.Fb#bnbnaCbnblblblblblaYaY.RaYblblblblblblblbla9a9a9a9a9a9#pa9a9#pa9#pa9#pa9#pa9#pa9a9bl#D#D#D#pa9#pafa9a9a9a9#L#Lafa9a9a9#D#D#pbl#U.V.Vb#.8am#xbn#IaYbl.N.N#x", +"am#I#Da9a9a9bj#D#La9.7#D#Da9#D#D#p#DaYaY#xbna0amamamb#a0a0a0a0bnawaYaYaYaYaYaYaY#xbnaY.R#xaYaY.Nafa9afa9afa9afa9.7a9.7a9bja9bja9#Lafa2afa2af#L#L.3#La2#La2bpa2#La2#ga2a2#ga2a2#g#L#Laf#L#La9afa9bl#Dbl#Da9afa9#L#Laf#L#Laf#L#Laf#L#L#L#L#L#L#L.7a2#La2a2#La2#La2#Laf#L#Laf#Laf#Lafajaf#L#Laf#L#L#Lafajafajafajaf.na9#s#Daw#xbnaCb#bg.Vbnbn.RaYaY#Mbl#pblaYblaYaYaYblblbl#D#Dbl#D#paf#pafa9#pa9afbla9#pa9#pa9#pa9#pa9#p#D#p#Da9#D#pa9#pa9#Da9#Da9af#L#La9.7#D#s#D#MaYbnaCb#aOb#aC#x#UaYaY#M#DaYbf", +"aOambn.sa9bja9.7a9.7a9#Da9bj#D#D#D#DaYaY#x#xa0amaFaFbgb#aF.Va0.VaYaYaYaYaYaYaYaYbn#xaY#xaY.N#D#Da9a9a9a9a9a9a9a9a9bja9#Da9#Da9#D#L#L#L#L#L#La2#La2afa2a2a2a2#ga2#g#La2bpa2bpa2#L#L#L#L#Lafa9a9#p#DaY#D#Da9a9.7a9af#Laf#L#Laf#Laf#L.7#L#L.7#L#L#L#La2a2a2#La2#L.3#Laf#Laf#Lajaf#Laja9#Lajaf#Lajafaja9#La9#La9#La9a9a9blaYaYaYawa0b#b#.paYaYblaY.Rbla9#pblblaYblaYa9#p#D#pa9#pa9#pa9a9a9#pa9a9#pa9bl#pa9#pa9#pa9#pa9#pa9a9#D#Dbla9a9a9a9a9#pa9a9a9#L#Lafa9a9#D#D#Da9awbn.pb#bgamaCbn#xaw#D#D#D.N#x", +"amamaC#x#D#s.7.7a9#Da9#D#D#D.N.N#xaYaYaY#xbna0a0aOaFb#aOb#bg.Vambna0bnaCa0aYaYaY#U.RaYaYaY#Dbl#Da9a9#La9af.7afa9.7a9.7a9bja9bja9#L#L.3#L.3#Laf#Lafa2#L#La2#La2bpa2a2#ga2#ga2a2#g#L#L#L#Lafa9afa9.Nblbl#Da9a9afa9#Laf#L#Laf#Laf#L#L#L#L#L#L#L.7#L#La2#L#La2aja2#Laj#Lafaj#Laf#L#Laf#Lafafajafaf#Lafaj#Lafajafaj#Laja9.n#D#MaY.R#xbga0bnbn.RaYbl#Ua9#pa9#D#Dbl#D#Dbl#Dbl#Dbla9#Da9a9#pafa9af#pa9#p#pa9#pa9#pa9#pa9#pa9#p#D#pa9#Da9a9af#pafa9af.7a9#Laf#L.7a9#s#D#saYaY#Ua0aObgao#x#IaYbl#D#s#D.sbf", +"amaOama0.N.Na9a9bja9#Dbj#D#D#DaY.N#x#x#x#xbnaCa0#H.Vbgb#b#aFbgambnbn#Ubnbnbnbnbn#xaYawaYbl#Da9#Da9a9a9a9a9a9a9a9a9bja9#Da9#sa9#D#Laf#L#L#L#La2a2a2afa2#La2#ga2a2#g#L#g#La2bpa2#L#L#L#Laf#La9a9#pbl#Dbl#Da9a9.7a9#Lajaf#Lajaf#Lajafafajafafajafaf.j#L.3a2#Laf#La2af#Laf#Laf#Laf#L.n#L.n#La9#L#Lafa9afa9aja9#La9af.7afa9#Dbl#IaYawa0a0#UbnaYblblaY#pa9#pa9#D#D#D#Dafa9afa9af#pa9#pa9afa9#pa9a9a9a9#pa9#pa9#p#pa9#pa9#pa9a9#D#Dbla9a9a9a9a9a9.7a9.7af#Laja9a9#D#D#saYawbnaCb#aobn#x.Nbl#s#D#D#D.N.N", +".CamaOao.WaY#D.7#s#Da9#D#D.NaY.N#x#I#xbn#xaY#x#U#xa0a0a0bgamb#ambga0ama0am#xa0a0.RaYaY#Dbl#Dbl#Da9a9a9a9afa9afa9.7a9#D.7#Dbja9.7af#La2#La2af#L#La2a2a2a2a2#L#g#L#ga2a2#ga2#ga2#g#L#L#L#Lafa9a9a9#Dawbl#Da9a9a9.7af#Laf#Laf#L#Laf#L#Laf#L#Laf#L#Laf#L.j#La2afajaf#Lafajaf.Eafaj#Laf#Laf#Lafaja9aj#Lajaf#Laf#Lafajafajaf.n#DblaYaYaCbn#xbnaYaYaY.Rbla9#p#Da9a9.7#La9a9a9a9a9afa9afa9a9afa9afa9afa9#p#pa9#pa9a9#pa9#pa9#p#D#pa9#Da9afafafaf.7a9a9.7#L#Lafa9.n#D#s#D#D#x#Ua0aCaC#x.saY.s#D.7a9.Ebj.N", +"#xa0.8a#.8.Cbf.N#D#D.N.NaY.N.saY#x#xaY#IaYaYaYaYaYaY#x#x#xa0aCam.Vb#bg#yb#.Va0bnaYaYblaY#Da9#D#Da9afa9af.7a9a9a9.7a9bja9#s#Da9.7ajaf#Laf#L#La2#L.3#La2#La2a2#ga2a2bpa2#L#g#La2bp#L#L#Laf#La9af#paYbl#D#Da9a9a9a9#L#L#Laf#Laf#L#Lafafafafaf#Lafaf#La2#La2afajaf#Lajaf.7af#Lafa9aja9aja9#L.n#Lafafa9#L.n#L.n#La9#Laf#La9a9#Mbl#xaY#x#IaYawaYaYaYaYblbl#pa9a9.7#L.7afaf#Laf#Lafa9afa9a9a9a9a9a9a9a9a9#pa9#pa9#pa9#pa9#pa9a9#D#D#Da9af#Lafa9a9a9.7af#Laja9a9#D#D#D#M.N#I#xaCa0#UaY#D.NaY#D.n.7bj#Dbj", +"#x#xa0#vbcaq#xbf#D#D.Nbl.s.NaYbf#x#x#xaYaYaYaYaYaY#M.NaY#x#x.Ca0b#bgb#bgbg.V.p.VawaYblbl#Dbl#Dafa9a9a9a9afa9afa9.7a9#Da9#D#s#Da9af#La2#La2#Laf#La2#La2#La2bpa2bpa2#ga2#ga2#ga2a2#L#L#L#Lafa9a9a9aYaYbl#Da9afa9a9ajaf#Lajaf#Lajafafaj#Lafajafafajafa2#La2#Laf#Lafa9#Lafaja9aj#Laf#Lafajaf#Laf.7afaj#Laf#Lafajaf.Eafajaf.n#Dbl#MaY#IaY#xaY.RaY.RaY#FaYa9a9a9#L#L#Lafa9afafa9#Laf#L#La9afa9afa9afa9#pa9#pa9#pa9#pa9#pa9#p#D#p#Da9a9afa9a9.7a9#L.7.7.naf#La9.n#D#s.N.N#x#UaCbnaY#s#DaY#sa9.7b..7#DaW", +".7aw#x.CaoaB.y.5#s.N#I.Ca0a0ama0#x.N.NaY.NaY#D#Dbl#DblaYawaY#U.CbgbmaBaSaZbma0a0blaYaY#Dbla9a9#Da9af.7afa9a9a9a9bl#D#D#D#D.N#D#D.7a9a9a9a9a9#La9afafafafafaf#Lafa2#La2#L#L#L#La2a2a2af#La9a9#D#DawaY#sbla9b..7#La9a9a9a9.7a9a9a9afa9af.nafafafafafajafajafajafajafaja9a9bl#MaY#s#Da9#Da9#sa9.na9.7af.Eaf.7af#Lafafa9a9bl#M.NaY#Ibn#UaYaYaw#Da9a9.n#p#pa9a9.7.7.7.7a9.7a9.7a9a9#Lafafaf#Lafa9a9a9#pa9a9#pa9#pa9a9a9a9afa9.7af.7.7.7afa9a9a9a9a9a9#L.na9.na9.na9.n#Maw.Nawaw.N#D#D.E.7bj.7#Dbjb.#D", +".7#D.s#x.5.y#va#.NaYbf.Ca0ao#xbn.s.N.N#D#D#Da9#Dbl#Dbl#DaYaYaYbn.p.taBan#uaZ.FbgbnawaYawbl#D#D#D#D#Dbl#D#D#D#D#D#Dblblawbl.N#D#Da9a9a9.7af.7a9a9afafafajafaf#L#L#La2a2a2a2a2#La2#La2af#La9#D#D#DaYaY#D#D#Da9a9.7a9a9.7a9a9a9.7a9#Lafafafaf#Lafafaja9af#pafa9af#pajaf.na9#s#DblaYa9a9.na9a9a9#Da9aj#Lafaj#La9aja9ajaf.nbl#DaYaw#xa0#x.b#xaY#D#D#p#p#p.na9a9a9#L.7a9a9a9a9a9.7a9#Lafafafafafafa9af#p.na9#pa9a9a9afa9af.7a9#L.7#L#La9a9.7a9a9.7.na9a9a9.na9.na9.na9#D#MaYaw.N#s#D.n.7.7.n.7.E#D#D.7", +".7a9aY#xaCam#v#vaCaqa0aqama0#UaY.NaY#D#D#D#D#D#Da9#D#D#Dbl.NaY#Ibnambm#SaZa#a#b#aCa0a0#x#x#xaYbl#D#Da9#Dbl#Dbl#DblaYaYaYaYbl#D#Da9a9a9afa9afafafafafafafafaf#Laf#L#L#Laf#Laf#Laf.j#L#L.n.7a9#s#Daw#x#M#Da9#Daj.7a9.na9.7.na9a9.naf#Lafajafafajafafafajafajafafaf#pa9bl#Mbl#Daw#D.n#Da9#D.na9.na9a9af.7afafajaf#Lafa9a9#sblaY#x#IbnbnaYaYawbla9a9#p#pbl#pa9#D.7.7a9.7a9.7a9a9#L#Lafaf#Lafafa9a9a9a9#pa9.n#pa9a9a9afa9a9#L#Laf.7afa9a9a9a9.7a9a9a9.naf.na9.na9.na9#M.Nawaw#D#s#D#Daj.7aj.7#D.7b.a9", +"a9#saY.s.Ca0aF#v#v.5#vaF.8a0#x#D#D.N#D#Da9bja9.7a9a9bl#D#DaYaY.N.R#Uama#aFaOaFaFb#b#b#a0aCa0#I#xaYblaYblbl#DblaYaw.R#IaYawaY#D#Da9a9a9a9a9a9a9a9a9#p.na9af#La9.7af#Laf#Lafajaf#L#L.3#La9#D#D.NaYaYaYbl#D#D.7a9.7a9.7a9a9a9.7a9.7a9a9a9a9.na9#pa9.n#pa9#pa9#p.na9#sbl#s#Dbl#DblaYa9a9a9.Ea9a9bja9a9.na9#sa9#Da9#Da9.nblbl#D#M#x#x#U#x#UaYaY#Da9#sa9#p.na9a9.7a9a9#La9a9#La9#L#L#L#Lafafa9#La9afa9#pa9#pa9a9a9a9.7#Laf#L#L#L.7#L.7.7a9.7.na9a9.na9.7.n#D#D#s#D#M#D#Mbl.s#D.s#Da9#D.7.na9a9.n.7#D.7", +".N.N.NaY#Uaqamaoa#aB.0a#ambn#xbl#D#D#D#D#Da9.7a9a9.7a9#D#D.s.NaYaY.RaCamamaF.5b#amaob#amama0a0a0#IaYawaYaYaYaYaYbnbnbnaYaYaYbl#D.na9a9.7afa9a9a9a9af#paf.na9afa9.n.7#La9.7a9#L#Laf#La9a9#D#D.N.NaYaY#Dbl.n#D.7af.7a9.na9.na9a9.na9.na9a9#pa9.na9a9a9.na9.na9a9a9aY#MaYbl#sbl#s#D.n#Da9#Da9#sa9.n#Da9a9.7a9.na9.na9a9#DawaY#x#x#xbnbnaYawaYbla9a9a9a9#pa9#Da9a9.7a9.7af#L#L#La9#Laf#Laja9.7a9.7a9a9.n#pa9a9.7#Da9a9#L#La9#Laf.7afa9a9a9.7a9a9bja9#sa9#D#M#D#M#D#sbl#saY#saY#s#D#s.7a9.E.7#D#D#D#D", +"#I.N#I#xamaCamaFaB.Gaz#u.8am#xaY#D#D#D.7a9bja9.7.7a9.7a9#D#D#D.N#Ubna0aCama0amao.Va0amaCama0aC.Cbnbnbnbn#x#Ubn#Uam#Ua0awaYaYaw#D#pa9a9#pa9a9a9#p.na9a9a9a9a9.7a9.7a9af.7afa9a9a9aj#La9.E#D#D#saYaY#Mbl#Dbja9.7.7a9a9a9.7a9#sa9#D#p#D#pbl#sbla9#D#sblbl#Dblbl#sblawaY.N#MaYbl#Dbla9.Ea9.na9.7a9a9#D#s#D#s#D#D#D#D#D#MaYbl.Naw#x#Ibn#I.R#xaY#Da9#Da9a9a9a9.na9a9a9.7a9a9#La9#La9a9#L#Laf#La9a9#Dbj#pa9a9a9#Da9.7.7afafa9.7a9.7#L.7a9.7a9a9#sa9.na9#D#D#D#s#D.sbl#Dawbl#saY#sbj#Da9#s#D.Nbl.saY.s.N", +".Cbf.C.Cam.5aoa#.la5.G.waZ#va0.C#D#D#D.7a9a9#L#La9#L.7.7.7#D#D#D#x#x#x#x#x#xa0bnam.Va0.Va0a0#xbnaY#x#Ia0a0aCa0aCa0ambnbnaYawblbl#Dbl#M#Dblbl#D#Mbl#pa9a9#Da9a9.7a9.7a9.7a9.7a9a9#La9.n#D#D.NaY.NaYaY#D#Da9#Daja9.7a9a9a9a9.7a9.n#D#M#D#sbl#sblbl#D#M#D#M#D#M#D#M#x#xawaY#Dawa9#Ma9#Da9#Da9#sa9#s#D#D#D#D#D#s#D#sbla9blaw#x#x#xa0#UbnaYawaYbl#D.na9a9a9a9a9#Da9#pa9#La9#L#La9.7af#L#L#L.7#L.7.7.na9a9#D#s.7#D.7.7afa9#La9af.7a9.7.na9.na9a9a9#Da9#s#Dawblaw#D.sbl#sbl.s#D#D#s#D#saY.Naw#xaYbf#x#x", +"aqaoamavam.8a##v.5#Saza7.w#u#vam#Da9#D.7a9.7a9a9.7#L.7#La9bj#D#D.Cbn#xbnaYaY#x#x.pb#.Vamaobnbn#xbnbn#xbn#xbn#xa0a0b#aCa0aw.R.Nblaw#Dbl#Dbl#Dblbl#pa9#Ma9a9.nbja9a9a9#La9a9a9.7a9.na9#D#D#DaY.N.NaYaYbl#D#sa9a9#La9.Ea9.7a9a9#Da9#M#Dbl#Mbl#sbl#s#Mbl#sbl#D#MaY#sa0#I.NaYaYblbl#Da9a9.na9.Ea9a9a9#D#D#s#D#s#D#D#D#Dbl#saY#x#xaC.Ca0#x.R#xaY#D#Da9a9a9a9a9a9#p.na9a9a9a9#La9#La9a9#L#L#L.7#La9.7.7a9a9a9#Da9.7af.7a9afa9.7a9.7#L.7a9a9bja9#s.7.na9#sbl.s.saYaw#saY#saY#saY#s#D#s#D#xaY#x.W.C.C.Waq", +"amaFaOaFaOaFama0aY#x.8.0#u#uan#uam#xaY#Da9a9.7a9#Laf#L#La9#D#D.sbl#D#sbl#xaYaw#x.Rbn#Ub#.Va0b#b##Ubnbnbnbna0#xbnbnaYaYaYbnbn#UbnaYaYblaYblawblawa9.n#p#pa9#pafafa9a9a9.na9a9a9a9bl#Dbl#Dbl#sblblawaY#D#Da9.7.7#Laf#Laf.n.7#D.7#D.NaYawaY#xbn#Ua0#U#Ubn#UbnaC#UaY#xawaY#M#D.na9ajaY.N#Dbla9a9.na9.nbl#DblaYaYaw#x#MblaYawbn#Ibna0.b#U.RawaY#Mblbl.na9a9a9a9a9afa9#Dbj#D#D#D#D#D.7#Lafa9afa9.7#Da9#sa9a9a9#Da9.7.7afa9a9a9a9#D#s#D#D#Daw.N.NaY.NaY#D#sbl#saY#saY.N.na9#D#s#DaY.N.N#I#x.CamaoaFbya#", +"bgb#amam.5aCa0.C#M#xa0aFaZ#uaB.0aO#xaY#Dafa9a9a9#L#L.7af.7#D#D#D#D#DaY#D.N.N#xaY.Cbna0a0b#aFb#aF.Vbnbna0#Ubnbn#x#U#x.R#xawaYbn#x.R#I.Raw.RaY#x.R#p#p#pbl.na9a9a9a9a9a9#Da9#s#D#M#Dblbl#sblbl#DblaY#Dbla9#Da9af.7ajaf#L.7a9.n#Da9#M#DaYaYaYaYbnaCbn.paCa0bgaoaC#UaC#I#xaY#MaYblbl#Mbl#M#D.na9a9.n#D#M#D#M#DaY#DaY#M#pawaY#Ibn.Ca0aYbnaY.RaYblbl#Da9a9.na9afa9a9af#D#D#D#D#D#Da9#Daf#L.7a9.7#Da9#D#pa9.na9a9b.a9.7.7a9.7a9bja9#D#D#D#D#DaY#Daw#Daw#D#D#M.N#saY.saY#sbl#sbl.Naw.Nawbna0aCa0.8a#aF.5", +"amamaCa0a0#x#xaYblaY#Ia0bc#u#ua#amam#x#D#Da9.7a9#Laf#La9a9.7#D#Dbl#D#D#MaYaYboaYbna0a0aoamb#aOb#b#am.Va0bnbn#Ubnbn#xaYaY.R#xawaYbn#UbnaCbn#Ubn#U.RawaYblaYblawbl#D#D#D#Dbl#Dbl#Dbl#Dblbl#Dblbl#DaYaw#D#Da9bj.7#La9#Lafa9a9bja9bj#D#MblawaYaw.R#Ubn.V.8#vaB#S#waOaoa0aC#x#x.N#I.NaY.NaY#D#D#D.n#Dbl#sbl#Dbl#saYaYblawaYaYbnbnaCbn#U.baYawaY#M#Dbla9.na9a9.na9.na9#s#D#s#D#s#D#D#D.na9a9a9a9#D#D#D#pa9a9#Da9#D#L.7a9.na9#D.n#D#D#D.saY.saY.NaY.saY#sbl#s#Daw#DaY.NaY.NaY.saY.NaY#x.Wa0a0a0aOam.8a#", +"#x#x#x#xaYaY.N.N.7#D#x#xb#aZ.ya#amaObn#Da9#Da9bj#L#L#D.7#Da9.7a9a9.nbl#D#DaYaY.NaC#xa0.Vamb#aFaF#vaFbga0a0bn#xaY#Ubn#U#xaYaYaYaYbn#xa0a0a0a0aCa0bn#Ubn.baYaYaYaYbl#D#M#Dbl#D#Dbl#Dbl#s#D#D#D#D#MaY#Dbl#D#Da9.7a9ajafaj.7a9a9#sa9a9#M#DaYaYaY.b#xbgb##vaBa7.Q.z#S.5aO.8aoao.Ca0.W#x#I.Naw.NawaY#DawaYblawaYaYawaYawaYaY#U.C#U.Ca0aY#x.RaY#xblbl#D#Dbla9a9a9a9a9a9#D#D#D.NaY.N#s#Da9a9#sa9a9#M#Dbl.na9a9a9a9bja9.7a9a9a9.7#D#D#D#saY#DaY#Daw#DaY.N#M#D#s#Dbl.s.N#M.Naw.N#xaY#x#I#x#Ua0a0aCamama0am", +"aYaYbl.s#D#D#D#Da9#D#s.N.CaOa#aF.5ao#x#Dbl#Da9#Da9a9.7a9.7a9a9.7a9a9a9#Dbl.NblaY#x#xbna0a0amaFaFbmaFaFamaCbn#U#xbnbnbnaY.b#x.R#xaYbn#xbnaCa0bna0#Ubn#Ubnbn#I#xaY.NblaYaYawaYaw#Dbl#Dbl#D#M#Dbl#DaYaY#Dbl.na9.7a9#La9#La9a9bja9#D#MaYblawaY.R#x#U#S#SaB#uaz#u#vaO.8aOaOaOaOaOaOaO.Caoa0.W.C#I#x#I#x#I#x#x#I#x.NaY#x#Ubn#UbnaCbnaC#I.R#IaYawbl.sbl#M#D#Ma9#D.n#Dbl#D#D#s#D#D#D#D#D#Ma9bl#D#D#DblaYa9#p#sa9#D.n.7.7.na9#s#D#s#D.NaY.saY.saY.NaY.saY#s#D#p.s#saYaY.N#IaYaYaw#x#IaY#I#x#x#I#x#x#x#x#x", +"#D#D#D.7.7.7.7.7.7a9a9#DaY.CaO.y.5.5bnaY#D#D#D#D#D#Da9bja9a9.7a9a9a9#Da9#sbl.N#MaYaY#xawbna0aCb#aOaFbgb#b#a0a0bn#Ibnaw#xaYaYaYaY#Ubn#IaYaYaYaYbnbn.R#xaw#x.R#Ibnaw#IaY.sbl.Nbl.N#D#M#Dbl#D#M#DblawaY#M#D#D#s.7a9aj#L.na9.n#D#s#D#DaY#IbnaY#UbnaCaB#SaB#u#uaBaO.5amaoam.8.5aO.y#1#1#u.yaOamamaoamamamaC.C.C#xbn#x#Ua0aC.CaCa0#Ia0.R#x#UaYaYblaY.N#D#p#D#sbl#Dbl#D#s#D#D#D#D#s#D#Da9#p#MblblawaYaY#Ma9bl#sa9bja9.7#Da9a9.7a9#Daw#DaY.saY#Daw#DaY#D#M#D#sbl.N#saY.saY#xbo.N.N.s.N.Naw.N#D#D#D#Da9#D", +"a9.7.7af#Lajbp#L.7#L#La9#DaYa0#va#a0a0.Cbl#D#D#Dbj#D#Da9.7a9#L#L.na9a9a9a9#D#D#Dbl#DaYaY#xaYbna0b#aFb#b#aob#aoambnbnbnbn#U#x.R#xaY.RaY.R#IaYaYawblblaYblaYaYaYawbn#I#x#UaYawbl#Daw.N#D#D.NaY.NawaY#xbl#D#D#Da9.Eafaf#La9#D#D#D#D#I#x#xaCa0aCaoaO.FaO#v#u#u#uaFbgaC.Caoa0ao.5aB.z.U.Oaz.y.y#vbm.y#v#v.5amaoamao.8amaoa0aoa0#Ua0#x#U#xbnaw.N.saY#sbl#Dbl#Dbl#D#M#D#D#D#D#D#D#D#D#D.nbl#Dbl#xaYaYaY#pbla9bl#D#s.7.7.na9#Da9#s#D.NaY.NaY.Naw.Naw.Naw#D#M#D#D#Maw.Naw#x#IaYaY#s#Da9.nbj.7.7b..7.7bp#L", +"#L.7#L#Lbpbp#Lbp.7#L#L.n#D.N.C.5a#amaCaoaY#D#D.N#Da9#Da9#La9#Lafafa9a9#Da9bl#Dbl.n#D.nblawaY#x.Ra0.Vbgamb#amaFaF#Ubn#U#xbnbnaYaYawaYawaYaYblaYaY.bblaYblblblaYaYaYaYaY#I#x#I#x#I.NaYaY.sbl.sbl.NaYaw.N#M#D#sa9.7a9a9.na9.n#D#s#D#xaCa0aoaob##SaBaOaF#S#uaB#v.5aoa0aCamaoao.8#v#v#3ar.wanazaz#3#C#3aX.w.yaOam.8amaCambga0aoa0aCbn#U#x#IaYaw.NaY.NaYaY#sbl#sbl#D#M#D#D#D#D#s#D#D#DblblaY#MaY#IaYawbl.nbl.n#D#Da9#D#Da9.Ea9#D#D#Daw#D#saY.Naw.NaY.N#M#D#s#D.saYawaY#I.N.N#sa9a9.7af#L.E#L#Laj#L#L#g", +"#L#L#L#L#La2bpa2#L.j.7.7#D.Nbf#IaFaBa7an.5a0#Daf#D.7#D.7a9a9#L#L#D#Da9#D#M#D#Dbl#Dbl#Dbl#Dbl#sblaw.RbnaCb#aOaFa#bg.VambnaCbnaw#x.RaYaYaY.baYawbl#pbl.n#Da9a9#D.7#s#D#D#D#D#D#MaYaw#IawaY#x.N#I#x#IaYaY#D#Da9.na9aja9.n#D.N.N#x.CaCb##vaB#uaBaB#v#SaOaOaOaObg.8am.W.WaCaCamaOaB#u#a#faz#Sa#aBaBaz#u#u#uaz.w.wa7#u#uaB.yao.5aC.C#Ia0.pa0aCbnawaY.sbl#saYaYaY#DaYaY#D#s#D#D#D#D#D#D#s#D#sblaY#x#I#x#D#D#D#Da9.n#D#sa9#D#D#D#s#D#D#D#sbl#s#D#saY.saY#MblaY.C.W#I.N#s#Da9#sa9.7.na9.7#L#L#L#L#L#L#L#L", +"bpaj#Lbp#Lbp#Lbpa2#L#L.7#D.Nbfbf.Va#an#uaB.8bn#D#Da9#Da9.7a9ajafa9bl#Dbl#D#D#M#D#D#Dbl#D#Dbl.NblaYawbnamb#aFbm#Sb#.Vaobn#xbnaYaY.baY#MaYblaYblaY#pbl#p.n#Da9.n#D#D#D#s#D#s#D#D#saY.s#x.s#I#x#Ibn.W#I#xaw.N#s#D#D#D#D.NaY#I#x.WaCaCaCaF#SaB#v#SaOaOaOb#aOb#bgamao#x#I.CaCao.8#u.w.OaG.G#SaBaBbmaB#v#v#va#aB#u.G.Galbk#Taz.w#v#v.5bg.5bga0ao.C#IaYaY#Dbl#DawaY#D#M.NaY#D#s#D#D#s#D#D#MaYblaY#I#x#x#M#s#D#s#D#D#D#D#Dbj#s#D#D#D#s#D#D#s#D#Daw#Daw.N#M#s#x#I.Cbf.s#D#D.n.7a9.7a9.7.E.7#L.7#L.7#L#L#L", +"#Lbp#L#g#La2bpa2a2#g#La9bj#D.Nbf.RaCaOaZ.yaFa0aY#D#D#s#Da9a9a9a9#D#Da9#Dbl#D#Dbl#D#M#D#D#M#Dbl#saY#xbnaCa0aOaF#Sb#bg.VbnaCbnaY#xaYaYaY.baYblaYbl#Ma9#p#Da9a9#D.7#D#sbl#Da9#Da9#D#D#D#saY.N#I#I#Iaoao.W#xaY.Naw.N#I#I#U.WaCaoamaobnaCaO#vaF#vaOaFbgambgambg.5.8amav.WaC.CaoaF#uaza6.OazaZaB#vaF#vaFaFam.5aF#v#SaB.G.O#3bv.G.GaPaP.w#u#vaFama0.C.C#IawaYawaY.NaYaYaY#MaYaYaYblaYawblaYaw.NaY#I#x#I#D.N#M#D#D#s#D#s#D#s#D#D#s#D#Dbl#s#p#saY#s.Naw.Nblaw#I#xaY.N.N#sa9.7a9.Ea9.Ea9#L#L#L#L#L#L#L#L#L", +"#La2bp#L#Lbp#Lbp#L#L#L.7#Dbj#D.NaYbna0aoa##vam.C#D#D#D#D.7#D.7a9a9#D#Dbl#D#Dbl#Dbl#Dbl#Dbl#D#DaYaYaYawbna0b#aO.Fbgb#ama0bnbn#IaY.bblawblaYaY#MaYa9#p#sa9a9#Da9#Da9a9a9a9a9.na9a9#s#D#D.saY.NaY#x.C.C.C.W#I#x#I.WaF.8a0a0a0a0aCa0aCaCb##vaFaO#vbgaob#aoaoamaoaCam.W.Caoa0.8#v#ubkab#aan#vaZ#vaFa#aoaobga0aoamamaOa#aBaZ#u.w.w.G#3#3#a.w.y.yaOb#aCbnbn#I#xbn#UaYawbfaYbfaw#x.s#xaY.NawaYbl#x#Ibn#I#Daw#D.s#D#s#D#D#D#D#D#D#D#D#s#D#D#Dbl#saY#saY.saYaw#xaw.N#s#D#D.7.n.7a9.7a9.7#La9aj.7#L.E#L.7#L", +"bp#L#L#g#L#g#La2#g#L#L#L.7#D#DbjawaYaCamaoa#.8aF.N.s#D#D#D.n#Da9#sbl#D#D#M#D#D#M#D#M#D#Dbl#sbl#saYaY#x#UbnaCb#b#bgb#bga0aCbn#x.RaYaYaYaYawblaYbl#p.n#pa9a9.nbja9.7a9.7#sa9#D.7.na9a9#D#D#D#saY.s#x#I#I#x.C.Wa0aoaoama0.W.C.Wa0#Ibn.paO#S#v#v#S#Sbgaoaoa0aoa0avaCaqaoavao.8#v.w#T.Y#3an#va#aOamaOa0bnaoambgamaoam.pa0bgb#aoaFaO.ybk#T.GaXaz.waBbyaCa0a0bnaCa0#Ibn#I#x#x#x#x#x#xaC#x#I#x#I#x#I.C#IaY#saY#saY#D#M#D#s#D#M#D#M#D#D#D.n#M#D.s#DawaYaw#x#IaYaw#sa9.7.n.7#L.7aj.7#L#L#L#L#L#L#L#L#L#L#L", +"#L#g#L#g#g#gbp#L#L#L#L.7af.7.7.7#D.N#xaob#.8a#a##DaY#D#D#D#Da9bjbl#D#Dbl#Dbl#D#DaY#DaY#D#M#DaYaYaYawaY#x#Ibna0aCbgb#bg.VaCbn#U#xaw.Raw#FaYblaYbl#D#p#Da9#Da9a9#Dafaj#Laf#Lajaf.7a9#Da9#sa9#D.Nbl.NaY.NaYaY#I.C.Wamaoaoaobga0aoa0aCam#vaBa##SaBaBaobgaoaoaC.Waqaoav.8ao.5aOaBazaX#4alaza##vaOam.5aC.Wa0.Wa0aob#.8bnaCaCaCaC.W.WaC.y.yaB#ubkbkaX.Oazae#vaO.5ao.pbga0a0a0#Ua0aCa0ao.CaCaCa0#IaCa0#IaYaw#D.sbl#s.N#s#Dbl#D#s#D#D#sbl#D#D#saYaw.saw.NaC#xaw#D#sa9.n.7a9aja9#La9aja9#L#L#L#L#L#L#L#L#L", +"#Lbp#ga2bpa2#L#g#L#L#L#L#L#L#LafbjaYaY#xama0.5aO.N.NaY.s#D#D#Da9#Dbl#s#Dbl#Dbl#D#M#D#M#DaYblaw#D#MaY#I.R#U#x#U#Ub#b#bga0aCa0#x.R.Raw.RaYawaYblaw#p.n#pa9.na9#Da9aja9af.Eaf#Lafajafaja9#Da9#s#Daw#D#s#D#s.NaY.NaY#U#Ua0.paobgb#bgaO#vaB#u#u.y#ua5aObgaoamaoamaoavam.8.8#v#v#u.w.GaTbw.G.0#vaFaoamaoa0aoama0aqamaoamaCaqaC.W.W#I#Iaxbgaobg#va7.Oau.U#3#3a5#uaB#vaFaoaoa0amaCamaob#aoamaoaoa0aC#Ibn.sawaY.sbl#saY#s#D#s#DaY#saY#D#D#s#p#s#DawaY#Iaw.C#I.N.naf.Ea9.7aj#L#Laj#L#L#Laj#L#L#L#L#L#L#L#L", +"a2#L#g#g#g#gbp#L#L#L#L#L.7#L.7#L.N.N.s#x#xao.5b#.NaY.N#D#D#D#D#D#M#D#Dbl#D#D#sbl#D#Dbl#Dbl.sblaY.NaY#x#I#x#U#UaC.Vbgb#bgaCaC#U#I.R#x.baY.RaYblaYa9#pa9#Da9#Da9bjaf#Laf#Laf#L#La9#La9a9a9.7#Da9#D#sa9a9a9#D.NaY.Na9#paY#Ua0aoaO.yaBaBazazan#u.Gbk.daOaO.8aoavao.8.8.8bd.yaL#uazaX#0#4#TaZaOaO.5aoa0.Camaoamaoamambcby.8.C.C.W.W.W#U.rbgaO#S.yaB#uaP#3.U#3arbk#u#vaFbgbgaob#aob#bgamaOaoaoaoaC#U#IawaY.sbl.s#D#Daw#DaY#s.N#M#D#s#D#s#D#M.NawaY.s#xaC.C#Ma9aj#L.7.naf#Laf#Lafaj#Laf#L#L#L#L#L#L#L#L", +"#g#g#Lbp#Lbp#Lbpa2a2#L#L#L#L.7#L#D.N.NaYbo.C.C.W.Vbn.N#Dbjbj.E.7#D#D#D#D#s#D#D#D#D#s#D#s#D#D#D#sawawaYaw#x#U#xaCa0aCa0aC.Vamb#a0aYaw.RaY#M#p#M#pajafaj#pa9a9#Mbl.na9a9a9a9a9a9afajafaja9#D#s#D#Dbl#D#s#D#s#D.n#Dbl#saYaYaw#x#IaCaOaB#1a5.w.wbkaV.Qbt.ybcbc.8bcbcaBaB#u#uaz.waP#T.O#zbw.6aF#vaOaFambga0amamaOaoaOaoaCa0.WaC.W.C#I.WaCaoaOaoaOaobg#v#v#S#1.Q#3agaV#1aB.8aOamaoaCbg#v.8aoa0aC#x#U#Iawaw#D.s#D#s#D#s.N#saY#s#Daw#D#Mbl#saYaw#x#I#xaC#D#sbj#D#D.7#s.7.7.E#L.7#Laf#L#La2a2a2#ga2#g#g#g", +"#gasbp#g#Lbp#Lbp#L#g#L#L#L.7af.7#D.NaYbf#x#x#x#xaCbn#I.N#Dbja9.7#D#D#D#D#D#D#D#D#D#D#D#D#D#s#D#DblawaYawbn#I.WbnaCa0.pa0aoa0aoam#UbnaYaYaYblblbl#paf#p.n#pa9bl#Da9a9a9aja9af.na9.7af.7a9a9a9#D#sa9#M#D#D#D#D#D#D#D#D#M.NaY#x#x#xa0am#vaB.z#u#Ebi#nbCaX.Q.y.y.QaXbka5#u#u.w.wbkaP.O#4#4.wa##v.5a#aoamambg.5aO.5a#aoamaC.WaC.W.W#IaCaC.WaCaoaoaoao.8bg.8#v#v#u#uaPagagaXbka5aBaBaB.y.z#S.8bgaoamaC#x#IaYaw#D#sbj#D.sbl.sbl.N#saY.s#D#MaYawaY#U#x#Ibj#s#Db.#Db.#Dbj.na9#La9aj.7#L#La2#ga2a2#g#gas#g", +"#ga2#ga2#g#g.7bpa2a2#L#L#L#L.7#L#D#D.N#M.N#I#x#xa0a0#x.s.N.N#D#D#D#s#D#D#D#D#D#s#D#s#D#D#s#D#D#M#D#MblawaYaw#x#I#Ubn#Ua0.pa0.pa0aCbn#Ubnaw.Rawbl.n#p#p#pa9a9bl#Dafa9a9#pa9a9a9afajafaja9.7#D.n#D#Dbl#D#s#D.n#D#s#D#D#DaY#saYaw.N#UbnaCaOaO#vaBbkbq#Rbqag#3.U#zaVau#Tazazbkbkbv#3#E#0ab.2#uaOaF#vaFaOaOaFaObyaO.8aCaCaC.C.W.W#I.W.WaCaC.WaC.WaCaCaCaCaoao.8.8#v#vbbbbap#3.U.U.U#4a5#E#1#SaFaOaOaFaC.W#x#IaY.s#D#saY.s#xawawaY.saY.sbl.NaY.s#x#x#Ia9.7.E.7.E.7.n.7a9#L.E#L.7#L#L.7#L#L#L#L#ga2bpbp", +"#g#g#L#gbp#g#Lbp#L#g#L#L#L#Laf.7#Da9#D#DaY.N.N.sbn#Ua0.C#x.N#s#D#D#D#D#D#s#D#D#Da9a9.na9a9a9a9#Dawbl#saYawaY#U#x#U#x#Ubn#Ibna0aCa0a0#UbnbnbnaY.Rbl.n#D#p.n#pa9bla9af.nafa9afa9a9#Laf#La9a9a9bja9a9a9.na9a9.7a9.7a9a9#s#D#DaY.Naw#xaw#xaCamaoaOaB.v.O.Obqadbx.abzbi.U#3#T#3bvagag#3#4#caT.w#vaF.y#v.5#vaOa#ao.5.5aC.CaC#I#I#I#Ibo#I#Iaw#Iawaw#I#U#7.W#IaC.WaCav.W.8#v#v.y.w.G#T#3.Oag.O.w#uaB.ya#aoamaC#x#I#x.N.s#xaw#I#x#Ibfaw.Nbl.s.Naw.NaY.saY.E.7af.Eaf.7#L.E.7aj.7#La9aj#Lafajafaja2#L#ga2#g", +"#ga2#ga2#Lbp#Lbpa2a2#L#L#L#L.7#La9.7a9#D#D#DaY.NaY#xa0#U.CaYbl#D#D#D#D#D#D#D#D#Da9a9#Da9#sa9.na9#D#M#Dbl#saYawaYawaYaYawbn#Ibn#IbnaC#xbn#Ibna0bnblblbl#Dblbla9a9.na9a9a9a9.na9a9af#L#L.na9bja9#D.na9a9a9.n.7.n.7.Ea9.7a9#s#D#D#D#sblaw#IaCaobg.d.O#ia5.G#zadadadabadaVaVbq#3#3bvbqaba8.YbkaBaO#uaFaOaFao.5aoaqaC#I#I#Iaw#I.s.sawbobo.sbo.sbobo.s#M#M.s#7aw#Iaw#I#U#IaCao.8aO#v#u.Q#3biag#3aXazaZ#vaOam.C#x#I#IaY#I#x#I#I#x#I#xaw.Naw#D#s#D#s#Da9#Laj#L#Laj#Laj#L#La9#L.E#L#L.7#Laf#Laf.7#L#L#L#L", +"a2a2#L#g#L#L#L#La2bp#L#L#L#L#L#L#L.7#La9.7#Da9#D#DaYbnama0#xaY#s#D#D#s#D#D#D#D#Daj#Lafajaf#La9a9.na9#M#D#MaY#MaYbl#MawaYaYaYaw#x.RaY.b#xbnbn#Ibnaw#xawbl#D#Ma9#pafa9afa9afa9afa9aj#Laf.7a9.n#Da9ajafa9aja9#L.7#Laf#L.E#L.7.Ea9#sblawaw#xaCaCaO.8aBazbka5.Gbk.U#3biad.a.a.DaVaVaV.M#d.S.Yaz#u.0.y#vaF.8a0.W.C#I.C#Iaw.Naw.s.s.s#s#s#s#s#s#s#s#s#s#s#s#s#M#s#s#s#s.n.n#M.raC#OaO#w#u#E.vbkazbkbkbk.w.yaOamaC.C.C#I#I#I#x#I#x#I#x#Ibf.s.N#s#D.7a9.E#L.E#L.E#L#L#L#L.7aj.7af#L#L#L#Laf.nafaj#L#L#Lbp", +"#gaa#ga2#L#L#L#Lbpa2#L#L#L.7#L.7#Laf#L#L#La9.7#D#saY#xa0ama0aYaY#D#D#D#D#Da9#D#Daf.7aja9#L.n#Laj#p.n#p#Dbl#s#DaY#sbl#D#MawaYaYaY#Mblbl.baYawbnbnaYaYaYaYbl#D#pa9a9a9a9a9a9a9a9a9afafaja9a9bja9#Dafafajaf#L.Eaf.Ea2#Lafaja9a9#s#D#sawaw#IaC.WaoaoaO#uae#1#u#uaz#u.O.Ubi.D#d.D#J.D.abu#6.Y.G.w.yaZ.8aoam.W#xaw#I.saw.saw.s.s#s#sbj.Eb.#sb.b.#sb..E#s#s#s#s.s#s.E#s#s#s#s.r#U#IaCaCbd#1#SaOao.ya5bkaza5.waOamaoaC#x.WaC.W#I#x#I#x#I.Naw#D#D#s.7#L.7#Laj#L#Laj#Laj#Laja9#L.E.7.n.7.Ea9a9a9a9a9.7#Laf", +"a2#g#L#g#L#L.7#La2#g#L#L#L#L#L#L#La2#Laf#Lbja9a9#DaY.C.VaFa0#xaw#D#D#D#D#D#D#D#Dajafaf#Laf#Lafaf#p.nbl.n#Dbl#M#D#Ma9#M#DaYaw#Dawbl#MaY#Mbn.RaYawbn#xaw#x#Mbla9.naf#paja9af.nafa9aja9#La9a9a9#s#Daja9#La9#Laf.7#L#Laj.n#L.7.n.7#s#Daw#x#I.CaC.8.8#v#v#v#vaO.z#1.z.Gbk.O#zbibBbBad.x#5#9.YaPaz.y.0bgaoam#Iaw.N#s#Dawaw.s#s#D#s#s#s.E.7.E.7.E.E.E.Eb..Eb..E.E.E.E.E.s.saw#IaC.WaC#Oam.d#vao.8aFaO.8.G#3.OaB.8amaCaCaC.Wa0#I#I#I#I#x.s.N#s#D.na9.n#Laj#L#Laj#Laj#Laj.7#L.7af#L#Laf#Lafa9a9.na9a9.7.7", +"#L#L#L#L#L#L#L#L#La2bpa2#ga2bp#L#L#L#L#L.7a9.7.7.NaY#xbnao.VaF.V#xaY#Ma9.na9a9#D#La9aja9aja9aj.7.na9.na9.na9.na9#p#s#p#D.na9a9.n#p.nbla9#sbl#saYaYaYaYaYaYaYaYaY#pa9#p#pa9#pa9.nafafaja9#D#D.N.N.nafajafaja9ajafajaf.7.na9#D.n#D#Dawaw#I.W#IaCaCaobdaO#v#v.y.y.y#u.QaX.9#TbC#r#r.aatatbB.2aX.GanaC.W#Ibobf.sbf#I#s#s#s#sb.b.bj#s.7.E.E.E.7.Ea9.Eaj#Lajajajajajaj.s#s#I.s.s#I.s.WaCaCaCaCa0.W.W.W#v#vbtbkbk#uaB.0aObgaoaoamaC.C.W.n.na9.E.7.E.7#Lbjb..Ea9aj#L#La2a2.jbpaj#L.E.7bjajaf#La9#Laf#Laf", +"#L#L#L#L#L#L#L#L#L#ga2a2bpa2a2a2#L#L#L#L#L.7#L.7#DaY#Ibnb#b#aOb##xaY#D#Da9.n.7#Dafajaf#Laf#Lafafa9aja9a9.na9.na9.na9.na9#p.na9a9afa9.n#p#D#M#DblaYawaYaw#xaw#xaY#p.na9a9a9a9#p#pafaf#pa9#D#s.N#sa9a9#La9#Laf#Laf.7aja9.n.7.n#Da9.saYaw#x#I#x.W.WaCao.8.8aObc#v.y#v#ubkbvbvaXbvbC.k.Dai.UaXbv.Ga7aOaoaNboaWbo.s.Nb.#sb.#D#s#sbjb.b.a9b.a9.E.7.Ebjajaja2aj#Laj.naj#D#s.sbo#I.sbo.saCaCaC#I#I#I.W#xavaoaO.y.z#1bkbkaBaBaO.5aoaoav.Wa9#s#L.E#L#L.7.E.7#D.7.E#L#L#Laja2bpa2#L#L#L#L.7af.7afajafaj#L#L", +"a2#La2#ga2#ga2#ga2#L#ga2a2#g#L#g#L#L#L.7af.7a9.7#Daw#x#xam#SaZa#aC#xaYa9a9a9#Da9aja9#L.n#L.n#Lajafa9.naf.na9a9.na9a9.na9.na9a9.n.na9a9.na9#D#D#saY#x.R#xaYbn#x#xblblbl#Mblbl#Dbl.n#p.nbl#D#D.N.N.naf.nafaja9#L.n#L#La9.7.n#D#s#saYaw#I#I#I#U#Ia0.Wao.8aObc.8.y.y#u#ubk#3bCapbkag.kbqaX.Q.Qbka5#u#v#vamava1bob..E.na9b..E#s.7.E.E.7.E.7.E.7.E.7.naj#L.jaja2ajajaj.n#D.s#I.s#I.saY#I#U#x#I#x#x#Ibo#x#I.CaoaO#v.y#1bkbk#u#vbcam.C#I#sa9.n.7.E#L.E.7#s#s.7.n#Lajbpa2bp.jbp.j#Laj#L#Lajafajaf#La2afa2", +"#ga2#ga2a2a2#g#La2#ga2#g#L#ga2a2#L#L#L#L.7.7#La9#D#D#xaCaF.0aZana0#xaYbla9.na9#D#Laf#Laf#Laf#La9af#L.na9af.nafa9ajaf#Laf#Lajaf#Lafajaf#L#D.n#D#DawaYaY#IaY#I#x#IaYawaYaYaYawaYawbl#Mbl#D#sbl.s#Da9.na9.7afajaf#Laf.Ea9.Ea9#sa9#s.N#I#x#I#x#Ia0#I.Wao.8.8aObc.ybba5bkaXaX#3bvag#n.c.#bt#baLbcbdaBaB.y#vam.Wbfb..7#s#s#s.7.E.E.E.7#s.E.E.7.n.7.E.7aj#g.ja2.jaja2#L.E.n#s.s.s#I.s.s#x#I#I#x.s#I.Nbo#x#I#I.CaoaoamaObkaz.Q.z#v.8.Wbf.N#s.N#s#D.sa9.E#D#D.E.7#L#Laj#Laj#g#L#g#L#gbp#L#L#L#L#L#La2bpa2", +"a2bpa2bpa2bpa2a2#g#La2bpa2a2bpa2#L#L#La9#L.7a9.E.7aYaY.Cam#vaZaZaobn#xbla9a9a9#s#L.n#L.n#L.n#Lajaf#Laf.na9a9ajaf#L#Laj#Laf#L#Laj#L#L#Laj.7a9.7a9#D#Dbl.NaYaY#xaY#xaY#x#U#xbn#IbnblaY#MaY.NaY#s#D.na9aja9af.7af.E#Laja9a9b.#D#s#Daw#x#I#I#x#I.Wbn.Wa0aoao.5.8.y.QazaX#3.O#3aVai#n#8aLax#O.W.Wao.8#1aB.y.5.Ca1bo.sbo#D#sb.#D.E.7aj.7.E#D.E.7.E.7.7.ja2.j#gbp.jaj.j.7#s#s#s#s.N.s#Iawaw#D.saw.N.s.s#D.s#x.W.WaoaC.8.0.y#v#v#v.d.8ao#I#Ibf.s#Db.bj.7#Dbj#L#Laj#L#L#La2aj#gaj#ga2asasa2a2a2a2#La2a2#g", +"#ga2a2a2#ga2a2#ga2a2#ga2a2#L#ga2#L#L#L#La9.7.7a9.7.N.s#xamaF#va#.5am#x.N#D.na9.7af#Laf#Laf#Lafa9#L.n#La9.naf#Laf#Lajaf#L#Laj#Lafa2ajaf#Laf.7.7.na9.n#D.nbl#D#DawaYawaY#U#x#U#x#UaYaw.Nblaw#D#D#sa9.na9.nafajaf#Lafaj.7.na9#sa9#saY#I#I#xaC#xao.CaCavaoao#v.yaI.Qae.O#zaV.Dah#Xag#b#O.r#7#7#7.W#QaObdaB.y#vaoaqbo#Ibobf.N.Ebj.E.7.E.E.7.E.7.E.7.Ebp.j#g#g.ja2#L.j.E.7#s.nb.#s#D.saw.Naw.s#D.s#s.N.s.sbo#I.C.Wam.8bgbgamao.C.8axbcaxaoaobo.N#s#Db.#s.7.E#L#L#L#Laj#L#g#La2#gas.jasbp.j#L#g.j#g#L#g", +"a2asa2asa2aa#ga2#g#L#g#Lbpa2#L#L#L#L#L.7.7.n.7.7a9.saYaY.Wa0amam.5am#IaYbla9a9a9aja9aja9aja9ajaf#Laf#L.na9#L.n#Lajaf#L.jafa2a2.ja2a2#Laj#Laja9#L#Laf#Lafa9.n#D#DaY#xaYaYaYawaY#U#xbnawaY.Naw#D#sa9.na9af.na9.na9.Ea9.na9.E#D#s#D#I#x#I#x.WaCaoaoao.8.8.8.y#1#1.Q#T#3bq.D#m#haibkavao#7aE.sbo.W.W.s.Wbd.GazaBbc.8##avbobfbobjbjb..7.7.E.7.E.7.E.7#g.j#g.j#g.jaja2.Eaj.n#D.nb.#sb.#D#s#s#D#s#D#s#s.s.N.N#I#x.Wam.WaC#x#I#xaCa0av.8.8.8ao.W#Ibo#s#s#Dbj.7#Lajaj#L#Laj#gaj#g#gasasaU#g#g#ga2bp#ga2#g", +"a2a2#ga2a2#ga2a2a2#ga2aja2bp.ja2#L.7#L#L.7a9.7a9bj.N.N.N#xa0a0aCaF.5bnaY#D.na9.7af#Laf#Laf#Laf#L.n#L.na9.naf#Laf#Laja2#La2aja2#La2aja2#Laf#L.E#L#Lajafaj#La9#L.nblblbl#MblaYaYawbn#U#x#xaw.N.s#D.nafa9.na9a9a9.na9aj.7#sa9#sa9#s#x#I#x.Wbnavamaoao.8aObd.ybt#ubbag.O#3bA.iaJ#3bbav.h#7b.b.boa1#IaE#I#QaB#uaPaz.Gbcbcavavbobfb.bj.E.7.E.7.7.E.7#L.j#g#g#gaj#g.jajaf.E.n#s#s#D.E#D#s#s#D.s#Db.aW#sbf.Nbo.C.Wav.Cam#Mblaw#x#Iaoaqaoaqavavaoav.s.Nb.#D#s.7.E#L#Laj#g#Lbpa2asas.jaUaU#ga2bpa2#g.jbpa2", +"#ga2#g#g#ga2#g#ga2#g#g#ga2#g#Lbpa2#L#L#L#L#La9.Ea9a9#saY#I.C.Wam#x#U#x#IaY.N#D#Daj#Laj.7.7a9.7.7a9#Laf#L#L#L.n#Lafafafajafaf#Laj#L#L#Laj#Laf#Laf.jaf#Laf#Laja9#Da9.na9#Da9.n#D#DawaYawawaYaY#MaY.7.n.7.n.7.Ea9.7ajaf.Ea9#s#D#D#D#Ibn#UaCaoao.8#vao.d.d.y.z.y#1bbagaX#3aAbx.caLav#7#I.s#7b.#sb.b..sbo#Iav#QaOaKbtau.GaZaFaq#Ibf.s.7.n#L.E#L.7aja3.Ebp.jbpbpajbpa3#s#D#s#s#s#s#D#sa9.n#D#s#D#s#D#s#x#Iaw#I.N#s#s#D#saY#saYaY#I#I#I#I#U.W#IaC.8ao.C#sa9#L.7.n#L#L#L.ja2.j#gasasas.jas#g.jas#gas#gas", +"a2#ga2#ga2#g#ga2#ga2a2bp#ga2bp#Lbpa2#L#Laja9.7#La9#D#D.N#x#x.C.CbnbnbnaYaY#D#D#D#L#La9aja9.7.E#D.nafajaf.Eafafaj#Lajaf#Lafajafaf#Lafajaf#L#Laj#L#La2afaj#La9a9.na9bja9.na9#D.na9awblaYawaYawaYawa9.na9.Ea9a9.na9ajaj#L.n#D#s#s.N#U#Ibn.WamaO.8#v#OaObdbd.yaLbb.Q#8.v#3aV.abCbd.8#7#7.sb..sb..sbj#s.s.s#I.Cav.8.8#u#uaB.ybcao.Wbf#D#s#D.7.E.7.Ea3ajbpajbpajbp#L.E#s#D#s#D#s#D#s#D.n.7#s#D#s#D.s.N#x#I.NaY.s.N#s#D#s#D#M.N.s#I#x#I#x#I#x#IaCbd.8ao#s#D#s#L.7aj#L#L.j#gas#g#g.j#gas.jas#gas#g.j#g#g", +"#g#La2#ga2#ga2bpa2bpa2#L#L#L#g#La2aj#L#L.7.7a9.7.n#D#saY.s.N#x#I#x#xawaY#Ibl.N.Naf.E#La9.7#sa9#D.n#Laf#Laf#La9afaf#Lajaf#Lafaj#Laj#L#L#Lajaf#Laf.j#Laf#Laf#La9a9a9a9.n#Da9.na9#D#D#s.N#s#D#s.N#s#D.Ea9a9.Ea9.7.na9.na9#s#D.s.N#x#Ibnbn.Waobg.8.8.d.d#vbd#v.z#1bb.QaX#3aA.kaXbcao#7.s.sb.b.b.b.#s#s#D.s.N.s#x.CavaFam#v.y#u.ybyby#Ibf.s.Nb..7.E#L.7.E#L.7.E.7.E.7#s#s#D#s#D#s#D#s#D#s#D#s#D.s.N.s#x#IaYbo.s#D#saW.n.7#s#D#s.N.s.s#I#I#I.CaCax#vaO.saw#s#D.n#Lafaja2a2.j#gas#g#g#g#g#g.j#g#gas#g.j", +"#ga2#ga2#g#L#ga2#ga2#g#L#g#L#L#L#g#L#L#L#L.n#L.7#D#D#D#DaYaY.N.NawaY#xaY#x.NaY#Ma9.7a9.Ea9#D#Da9a9af.7af.Eafaj#Lajafafafaj#Lafaf#Lafaj#Laf#Laj#La2af.j#Laf#La9.7a9.7a9.7a9#Da9a9#s#Dbl.saY#saY#s#D#s#D.na9.Ea9.7a9.n#D#s.N.s#xbobna0aCa0am.8aOaO.8#vbd#vbd.yaL#1.Qbk.Obi#R#8#v.rbo.saE#sb.#sbjb..7.E.n.E#s.s#I#xbo.Wavbc.y#u.yanaoaq.Cbo.N#D.E.7.E.7#L.E.7.E.7#s#D#s#D#s#D#s#D#D#s#s#s.N#s.Naw.N#x#xaw.N#s#D#sbj.n.7.E#DaE#saYboaCaCaoaoaoao#Oao#Iawaw#s#D.n.7a9aj#g#L#g.j#ga2#g.jas#gas.j#gasas", +"a2bp.jbpa2#ga2bpa2bpa2#L#Lbp#L#L#La2#L.7#L.7a9.7#s#D#D#D#D#s.NaYaYaY.s#x.s#xaYaY#D#s#D#D#D#s#D#sa9ajaf#Laf#La9af#Lajaf#Lafajafaj#L#Lafaj#L#L#L#L#L.jafa2#Laja9a9.na9a9.na9.na9#s#D#D#s#D#s#D#s#D#sa9#sa9#Da9.n#D#s#D#D.saY#xaY#IamaCamaobgaObcbdaOax#vbd#v#v.yaL#1.Qa5#3#R.vbc.W#7#s.sb.b.bjb.bj.E.7.Ea9bj#s#Daw#s.Nbo.C.8#van#ubc#v.8a0bf.s#D#sbj.7bj.7#D.7#sbjawaY#saY#s#D#s#Daw#DaY.saY.NaY.saY.saY.N.s#D#s#D.Ea9#s#s.N.sboawao.8.d.daoaC#I#x.sawbo#M#D#Daj.7#L#L.jbpa2bpa2#g#g#g.j#gas#gas#g", +"#ga2#ga2#g#L#g.ja2#g.jbpa2aj#Lbpaj#L#Laj#Laf.7af#D#D#s#D#D#D#D#D.N.saYaY#xaY#x#IaY.N#D#D#s#D#Da9#L.na9.na9ajafajaf#Lafajaf#Laf#Lafaj#L#Lajaf#L#La2a2a2#Laf#La9a9.7a9.7#Da9bja9a9.7#sa9#D#s#D#s#D#s#D#D#s#D#s#D#sa9#s.NawaY#I.C.WaF.8b#ao.8bg#vbd.8#vbd#vbd#v.d#v#1#1.wagbi#8ao#O.saE.sb.#sb.#s.Eaf.Ea9.E.n#D#s#Db.#s.N#Iaqambca#aB.y#vaO#I.Cbf#I#s#Db.#Db.#Dbj#saYawaw#D.saY#M.N#M.N#saY.s#x.s#x.s#x.s.N#s#Db.#D#Db..N.s.N#Ibo.W.CaoaxaoaxaCaC#I#x#I#I#Iaw#s#D.n#Laj#L#Lbp#L#L#L.j#ga2#g.ja2.j#g", +"#L#g#L#g.j#ga2bp#g#L#g#L#Lbp#L#L#La2.7#L.7.Ea9.EaY#D#D#s#D#s#D#saYbl.NawaY#UbnbnawaYawbl#D#p.na9afa9.n#La9#La9#Lajaf#Lafajafajaf#L#Laf#L#L#La2.ja2#La2#L#Laf.7a9a9a9a9.na9.na9a9.7a9#s#D.n#D#s#D#s.N#sbj#D#D#s#DblaYaw#x#I.CaCamaOaF.8.8aO#vbdaO#v.d#vaO.8aObd#v.zaBa5.O#r.Q#O.Wbo.s.sb.aEbjb.bjb.a9.E.7.n#s#D#s#D#D.s.N#Ibf.W.C#v#va#aOaF.8aoam.s#D#s#D#s#D#s.saYawaYaYawblaYaw#DaYaYaYbl.N#x#xaY.saY.N#s.N#saWawaY#I#x#I#x#IaC.C.WamaCaC.W#I#I#I#x#I#I#I.s#sa9.E#L.E#Laja2bpa2a2.j#ga2#ga2#ga2", +"aj#g.ja2#g#L#ga2#ga2#ga2bpa2#L#L#Lajaf.Eaf.7a9.7aY#s#D#D#D#Da9a9.saY.saYbn#x#xa0#I#x.NaY#M#Da9.na9aja9a9.nafajafafafajaf#Laf#Lafaj#Lajafaja2#L#La2.3#L.jaf#L.na9.7.n.7a9bja9#D.n.7#sa9.n#D#s#D#s#D#s#D#D#s#D#s#DawaY#Ibn#Ia0aoa0#v#vaOaFaObd#vax.ybc.d.8.8.8.8bd.y#1a5aX.v#1ao.W#7.saE.s#sb.#Db.#s.7.E#D#s#D#sa9#s#D#s#D#s#D.s.saFaFamaO.y#v#v.5#I#Iawbf.s#x.s#xawaYawaYblaw#DblaY#Mbl#saYaw#x#I#x.Naw.N#sbj#s#D#I.WaC.WaC.Wamao.8aoao.W#IaY.NaY.N.N.s#D.saw#s#D.n.Ea9aj#Laj#Laj#ga2#gas.j#g.j#g", +"a2#ga2#ga2aj#L#L.ja2a2aj#L.E#Laj#pa9a9#pa9.n#pa9#M#Dbl#Dbl#MaYaYaYawaYaYawaY#UaYa0.p.VbnaYawa9#La9a9ajaf#L#Lafaj#L#L#Laj#Laj#L#Laf#L#L#L#L#La2#La2a2#La2#La2#L#L#L#L#L.Ea9.7#s#D#La9.E#D.na9.na9.n#s#D#saw.Naw#xaw#I#x#I#U.CaCaoao.VaoaoaO.8aO.8#Oaoaxao.haC#Oao.daO#uagbibk#vav.W#I#s.E.Eaj.Ea3aj.n#L.E.7.nb.#s.N.saY.N#I.N#IaY#I#I.C.8#v.yaBaPaBa#aFa#.5aqaqaN#xbfbf.N.NaY.Naw.NaYaY.Naw.NbfaYawaYaYaw#x#I#xa1#U#I#U#I#x#I.N.s#D#s#D#Dbj#sbj.E.7.Ea9.7.7#L.7.7.7.7.E.7#L.7#Lbpa2.jas#g#gas#gas", +"a2.ja2#L.j#L#La2a2#g#L#Laf#L.7#La9#pa9a9#pa9#pa9bl#Dbl#sbl.NblawblaYblaY#xaYaY#Ubna0b##UbnaY.n.7#s#Da9.na9.n#Laf#Lajaf#Laf#Lafaj#Lajafaj#L#L#L.j#L.j#La2af#La9a9#L.7#L#La9.7a9#Da9.Ea9.n.7.n.7#s.na9#M#Daw#x.s#xawbn#I#U.CaCaCaCaobgaCaoaOaOax#vao.hao.W.W.Wav.haoax.y#E#zagapbc.Wbo.s#s.E.Ea3.E.7aja9.Ea9b.a9.EaY.Naw.Naw.Naw.N#I#x#Ia0amaF.yaBa7#u.ya#aoaqavaq#x.C#x#I.Naw.NaYaw#x#I#I#x.s#xboaYaY#I#x#I#x#IbfblaYbl.NaY#D.N.N#Dbj#sbj.Ebj.7bja9#L.E#Laj#Laj#L.E#L#L.7aj#La3ajas#g.jas.j#g.j#g", +"a2#gas.ja2#L#Laja2#Laj#L#L#La9.7.na9a9#Da9#Da9a9#s#D#D#s#D#s#D#Dbl#sbl#D#M#DaYaYaY#Ubga0bnaY#s#D#s#Da9a9.na9ajafaj#Laj#Laj#L#Laf#L#L#Laf#L.j#L#La2a2#La2#Lafa9a9ajafaja9a9#s#D#s#Da9.n#D#sbl#s#D#M#s#D#Maw.N#I#I#I#I#x#I#IaC.CaC.paCaCaoao#O.8ao.h.W.W.W.W.W.W.W#I#Q#v.w.Obiagbk.W.r#I#sb..E.E.Eaja9.E.n.7.n#D.saY.saY.Naw.NaY.Naw.N.s#xaCaq.8aF#Sa7a7#u.yaFam.5ao.Ca0.C#x#x#x#Ibn.R#x#x#xaY#xaY#Ibn#UaC.W#xbf.sbl#s#D#sa9.Ea9.7.E.7.7#L#L#Laj#Laj#L#L#L#L#L#L#Lbpajbp#Lbpbp#Lbp#g#gas#g#gas#gas", +"a2.ja2#La2aja2#L#L#Laf#L.Ea9aja9a9a9a9.na9a9.na9#D.n#Da9#Da9a9.na9a9#sa9#D#D#D#saY#xaCa0#U#x.N#s#D#D.na9a9.n#La9#L.n#Laf#Laf#Lajafaj#Laj#Laf#L#Lafajafafaj#L.Ea9#La9a9.n#D#D#D#D#D#s.Nbl#D#s.N#M#D#M#D.saYawaw#IaY#I#U#I#x#IaC.WaC.CaC#IaCavao.W.Wav.W.Wbo#I.W.Wbo.W#Q.y.w.Uau#3bd.8bo.s#s#sbjb.a9.E.n.7b.#sbj#s.Naw.Naw.NaY.saY#s#s#D#I#x#Ia0aoaFa#aBaBaBa##va#aoa0aoa0aoa0aC.Ca0#xaCbn#I#xaw#xa0aCa0#x.Caw.N.Na9a9a9a9.7a9.Ebj#L#Laj#L.E#L.7#L#L#Laj#L#Laj#Lajbp#L#Lbpajbpaj#Las.j#g.jas#g.j#g", +"a2a2a2.ja2#Laf#Lajaf#Laja9a9.7a9a9.na9a9a9a9a9a9.7a9.7.n.7.7a9.7.7#L.7a9#s#D#D#D#D#Mbnbn#x#xaY.N.s#D#D#sa9a9#Laj#L#L#Laj#Laj#L#L#Laf#Lafaj#Laj#La2a2afajafafa9a9a9.na9#Da9#s#D#D#MaYblawaYawaYbl.s.Naw#D.saYawawawaw.s#I#I.C.W.W#U#I#I#x.WaC.W.W.W#I#Ibo#xbo#I#Ibo.Wavbc.y#u.G#3.Qbc.Wbfaw.s#sbj.n.7.n.7#s#D.s#D.saY.NaY.N#M.NaYb.#D#s#Daw#Ia0#UaFaOamam.5.8.yaB.8aO.5ao.5amam.8amaCa0a0#x.C#I#Iaoam#I#xaY#D.N#Da9.7.7.7a9.7.7.7aj#L#L#L#L#Lajbp#Lbp#L#Laj#L#L#L#Lajbpaj#L#Lbp#L.j#gas#gas#gas#g", +"a2a2.j#La2#L#L#Laf#Lafa9a9a9#D#D.7#Laf#L#Lajafaj.7aj#L#L#L#Laj.7aj#Laj#Lbj.7.7b.a9#D#D#xaCa0.W.NaYaw#D#Da9.na9af#Lafajaf#Laf#Lafaj#Laj#L#L#Laf#L.3ajaf#La9aj.7a9a9a9a9a9bl#DblaY#DaY.NawaYblawaY.NaYaw.sbl#s#Maw.N.saw#x#I#I#I.C#I#x#I#I.W#Ibo#Ibo.Wbf#Ibo#Ibfbo#Ibo.W.8#Qbc.ybkbv.Q.8#I.s.s#s#sb..nbj#s.N#sbj#saY.Naw.saY.NaY.s#D#s.Nbo.N#I#I#xaCamao.Ca0b#aobyaOaF#v#vaB.y.ya#aOaF.5aCa0aC.CaCbn#xaY#D#D#D.7#D#Laj#L#Laj#L.7#L#Laj#L#Lajbp#Laj#L#gaja2bpa2bp#g.jas#gas#gas.j#gas#g#g#g.j#g.j#g", +"a2.ja2#L.j#Lajafajafa9a9a9#Da9.n#L#L.7#L#L#L.7#Laf#L#L#Laf#Laf#L#L#L#Laj#Laj.7.7#L.n#DaY#x.W.C.C.s.NaY#s#D#Da9#s#Laj#L#Laj#Laj#Laf#Laf#Lajafaj#Laja2afajafafa9.na9#pa9#M#Dbl#DaYaYaYawaY#xaYaYaYaw.Naw#D#sbl#s#M#s#saY.s.s#x#I#I#Iawawawbo.N.s#I.s.s.sbo.N.s.s#I#I#x#Ia1.Wao#vaLbkap.yaobo.N.N.s.7#s#sbj#s#D.sbjaY.saY.Nbl.saY.N.s.N.s.N.N#I#x.sbfbf.C.WaCaqamaq.5aoa##v.0#u#u#ua##vaOaFama0#x#xaYaY#D#Da9.7#L.Eaf#Lafaj#Lbpbp#Lbpa2bp.jbpa2#L#ga2aj#g#L.jbp.j#L#g#g.j#g.j#gas#g.j#g.jas#gas#gas", +"a2#L.ja2a2#L#L#Lafafa9.na9a9a9#D.7#L#Laj.7#L#L#L#L#Laj#L#Laj#Lajbpaj#Lbp#L.7.7bj#L.7#DaY#xa0.C.WaYaw.N#D#D#D#sa9aj#L.Eafajaf#Laf#Laj#Laj#L#L#L#L.3#L#Laf.7#La9a9a9a9#p#Dblbl.NblawaYaYaYaYawaYawaY.NaY.sbl#sa9.n#D#D#saw.s#I#I#xaw#x.saY.s.s.N.s.N.s.Naw#D.s.N.sbn#I#Iboa1#b.d.8#Tap.Qbcbo#D#sbo.nb.#D#s.Nb.#D.s.Naw.Naw.NaY.Naw.Nbf.s.N.sbfaY.N.saY.sbf.C.Waqavbga#a#a#.yaZ.0anaBbm#vaOaobn#I#xblaY#Ma9a9af#La2#L#L#Lbp#Lbpaj#L#g.ja2bpa2aj#gaja2#g#L#g#L#g#L#g.j#gas#gas#g.j#gas#gas.j#g#g.j#g", +"as.j#g#La2aj#Laja9ajaf#L#L.n#Laf#Laj#L#L#La2#ga2#ga2a2a2#ga2a2#g#L#Lbpaj#Laj#Laj#D.s#DblaY.VaObm.C#IaYaw#D#s#D#Dbl#Ma9a9af.7aj#Lajaf#Laf#Lajafaj#Lajafaj#Laj#L#Lajafa9a9.7#sa9#DaYaYaYaYaY#xaY#x.N#s#D#s#D#s#Db..n#sbj.n#D.sbfbo.s.s.N.s.N.s.s.N#s#D#s#D.s.N#Ibf.s#Ibo#I.Wav.8bcbta5.U#3aB.5.W.N#x#I#x.saY.s.N.N.s#D#Ma9b..E.7.nbfaw.NaY#xaY#Ibf#D#s.N.N#x.Waqavb#ambga#aO.0.y.yaoaCa0#x#xaY.N#D.Ebj.7.7.7.7.7.7#ga2#ga2#ga2#g#ga2#ga2aj#g#g#L#g#g#L.jbp#Lajbp#L#g.jas.jas#gas.j#ga2#ga2#g.jas#g", +".ja2#Laj#L#L.7.7af#Lafajaf#Laf#Lbpa2#La2#L#L#Lbp.ja2#g#ga2#ga2#g#L#L#L#L#L#L#L#L.7#D.NaYaYaobmaZamaCbn#x.NaY.N.N#Mbla9.nafajaf.7a9#Laj#Lajaf#L#Laf#L#L#Laf#Lafaja9af.7.n#Da9bja9#xawaYaYawaYaYaw#Dbl#s#D#D#s.7.n.7b..nbj#sbj.s.saw.s#D#saw#D.s#D#s#s.s.N.sbfawbf#Ibf.sbo#Iav.8bc#uaz#3bi.G#vaq.W#I#x#I#x#x#x.s#DaY#s#D#s#D#s#Db.aY.saY.N#I#I#x#x#I#x#I.C.WaqamamaFaObm#vaBaZ#va#bna0#xaYaw#D#D#Dbj.7.7.7.7.7.7.7#g.ja2#g.j#ga2bpa2a2a2#g#La2#L#g.j#g#gajbpbp#Lbp.j#gas#g#g.j#gas#g.j#g.ja2a2#ga2", +"#L#L#L#L#L.na9.n#Lafajaf#L#L.ja2#L#Lbp#Laj#g#L#L#gbp.j#L#gaj#ga2aj#g#Lbpajbp#Laj.7#D#sblaYb#aOa7b#amaoa0aC#x.baYbl#Mbla9#D#L.na9aj#Laf#L#Laj#Laj#Lajafaj#L#Laj#Lafajaf.7a9a9#Da9#Dblblblblblblbl#D#s#D#D.n.7.E.7.E.7.7.E#s#s#D.s.N.s#Db.#D#s#D#sbj#s#D#s.N.sbfboaYbo#Ibf.Wavbcbc.wa5au.M#3.w#v.5#Ibn#I#IaY.s.N.N#saY#s#D.s#D.s.NawaYawaY#I.C#Ibn.Wa0amamao.5.8.5#uanaB.ya#aoama0awaYaY.NaY#D#D#D#L#L#Lbp#L#L#L#Laj#gbpa2bpa2.j#g.j#L.j#L.jbp#g#Las#ga2#ga2aj#L#L#g.j#g.j#ga2#g.ja2#ga2#g#Laj#Laj", +"#D.na9#sa9#Da9#Daj#L#L#Lajaf#L#L#g.ja2#g#g#g.j#ga2a2#g#ga2#ga2bp#ga2#ga2#ga2#g#g#Lb.a9aY#UambmaZaO.t#SaFb#a0a0#UblaY#s#D.na9.7.n.7aj#Lajaf#Laf#Laf#L#Lafaj#Laf#L#Laf.7af.7.n.7#D#M#D#D#D#D#D#D#s#D#Da9#sa9.Ea9aj.7.E.E.7.7b.#sbj.s#s#D#s.N#saW#s.N#s.Nb..N.Nbo.N#xbo#x#I.Wav.8.yaz#T#3#z#z.O#uaF.CaC.C#x#I.Naw#D.sbl.saY.s.Nbo#Ibn#U#x#Ua0#Ua0aCb#am.8a##va#aBan#u#u.0aFama0#xaY.NaY#D#s#D.7.7.7#Lbpaj#Lbpajbp#Lbp#L#L#L#Lbp#L#L#L#L#Lbp#L#Lajbpas.ja2.j#ga2bp#Laja2#L#La2aja2#L#L#L#Laj#L#Laj#L", +"a9a9a9a9a9.na9a9#Lafajaf#L#La2a2aj#g#ga2#L#g#L#g.j#g#g.j#g#g.j#ga2#gaj#ga2#ga2#g#L#L#L#s#xb#aOa#.t#SaZaBbmbga0bnawaYblbl#Da9.n.7#Laf#L#Laj#Laj#L#Lajaf#L#L#Laj#Lajafajaf#La9a9a9#D#D.na9a9.na9a9a9.na9.7a9.E#L.Eafaj.7.E.7.nbj#s#Db.#Dbj#sbj#sbj#sbj#D#s.N.s.N#x.W#xbo#xavambcbb.O.O#a#a.Oba#3aBamaoa0.W#x.s.N#saY#saY#I#x#I#x#IaCa0aoamaob#aoamaF#v#vaB.0aB.0#ua#a#.5ao#xaY.Nbl#sbl#Da9.7.n.7.7aj#L#L#L#L#La2#Laj#Laj#L#g#L#L#Laj#Laj#L#L#Lbp#L.j#g#L#L#Laj.7#L#Laj#Laj#Laj#Laj.7aja9#La9aja9a9", +"#Da9#s#L.n#L#L#Laj#L#L#g#L.jbpa2#ga2#g.j#gas#gas#g#g#g#g.j#g#gas.j#g#g#g#g.jas#g#gaj#L#D#xaOaZan.FbmaBaZbmaFb##UaYblawaY#s#Da9.7.n#Laj#Laf#Lafajaf#L#Lajafajaf#L.3#Laf#La9aj.7a9#Ma9a9#Da9#Da9#Da9#D#La9aj.7aj#L.E#Laj.7.Ebj.nb.#s#D#sbj#s.N#s#D.s#D#sbj.N.sbf.s.C.Wa0.Wam.8.ybb#a.O.GaPaz.M#C.faOaoaq.W#xaw#D.s#D#I.N#I#xaCamaoaFaO#vaO#S.y#S#v#v#S#va#aOaFaOaFamaoa0#xaY#D#sa9#D#Da9.7.7#L#L#La2#L#g#L#g#Lajbp#L#Lbp#Laj#Laj#L#Laf#L#Laj#Lajbp#L#Laj#L.n.7a9#sa9.n.7.nbj.nbj.na9a9a9.na9#Da9a9", +".7#L#L#L#L#Laja2#L.jbp.j#L#g#L.j#g#g#gasas.jas#g.jas.jasasas.jas#gas.jasas#gas#gasbp#L.7awam.yan.Fbm.TaZaBaFam.R#IaYawbl.N#s#D#D#Lajaf#Laj#L#L#L#Lajaf#L#L#L#Laj#L.jafajafafafaja9#Da9a9a9a9a9.n#Lajaf.E#L#Laj.7.j#Laj#L.E.7.E#D#saW#D#sbj#sbj#Db.#DaE#D.sbf#IbfaCaq.Waoao#v.y.wbkaz.w.waz#3biau#uaOamao#xboaw.N.s#x#I#xaCambgbg#uaBa7#ua7an#ubh#vaFaOama0aCa0a0a0bn#UaY#sa9af#L#sa9.7a9aj#Lbpaj#g#L.j#gaj#g#L#Laj#Laj#L#L#Lbp#L.E#L.E#L#L#L.7#L.n.7a9#D#D.N.s.Na9#s#Da9#sa9#D.n#D#D#s#D#D#s#D.7", +"aj.7aj#gaj#gas.ja2bpa2#L#gaja2bpas.jas#gas#g.jasasasasas.jasaU.j#gas#gas#gas#gas#g.ja2#LaYa0.0aZ.Fa#aBaZa#aFbn#UaYaY.N#MaY#D#D#Daj#L#Laf#Lafajafajaf#L#Lajafaj#L.3#La2af#L.Eaf.7a9a9.n.7a9.n.7a9af#Laf#Lafaj#L#L.j#g.E#L.E.7#s.Ebj#s#sbj#D.s#Db..N#s#D.s.sbf.s#Iaqa0ao.C.8#vbbaPbk#u.w.Q.w.wau#N.Q.yavam#I#x.sawaY#I#IaCaoaoaO#vaz.Gaz.GazaS#uanaoaCa0.Wa0.CaC.CawaY#Da9a9#La9aja9a9.7aj#L#L#Lbpaja2bpa2bpa2#Laj#L#L#L#L#Laj#Laj#La9#L.7.7.E.7.E#D#D.N.s.N.s.N#x.7.7.n.7a9#sa9#D#s#D#D#D#D.7#D#D", +"#g#g.j#g#g#g.j#g#g.j#g.j#g#g#g.j#g#gas#gas#gas#g.jasasasas#gasasas#gas.jas#g.jas#g#g#ga2a9.C#SbhaFbgamam.8amaCa0aYaYaY#Da9.E#Laja9#Laj#Laj#L#L#L#L#Lajaf#L#Laf#Laja2ajaf#Lafa9a9.na9a9a9a9.7a9a9af.n#Lajaf.7#L.E#Lbpaj#g.n.7#s.N.s#DaY.saY.Naw#x.saYbo#x#x#I#x#I.8amaob##v#u.G.2bkaz#ubbaP.w.G.2.u.Oa#aoav#Ibfboawbo#xaoamaBan.Gba#a#ua#ao.5#Qaq.W#x#x#x#I#x#xaY#xawaYbl#D#M#Da9a9a9a9a9.7a9a9a9#L#Lajaf#Lajaf#La9.n#D#saY.NaYaY.N#sbl#D#MaY#M#D#D.n#Da9#D#D#D.n#Laj#L#L.E#Laj#L.7aj#Laj#Laj#Laj", +"#g.j#gas.j#gas.j#ga2a2#ga2.jas#gas.j#g.jas#g.jas#g#g.j#gas#gas#g.jas#gas#gasas#g#g#La2.j.7bnaF#ub#b#amb#ama0bn.CaY#M.N#sa9.na9#Lajaf#Laf#Lafajafaj#Laf#Laj#Laj#La2afafaj#L#La9.7a9.7a9.7a9a9a9.7afafafa9#L.n#L.7ajaja2.j.7.E#D.N#Daw.Naw.N#I#x#x#I#x#I#x#IaC.CaC.5bg.8aO.0.w#T.2.G#u.ybbbb#u.GaX.e#z#SaoaC.s.W.W#I#Iaoam#v#u.G#TarazbmaoamavaN.C#x#xawaY#x#IaY.saY#Daw#D#Da9a9a9#sa9.na9a9.na9.na9a9a9#sa9#Da9#sa9a9a9#D#Mbl.NawblblaY#MaYaYaYaw#D#D#s#D#D.n#D#D.n#La9ajaf#Laf#Laj#L#L#L#L#L#L#L", +"#g#g#g#gas#g#g#ga2.j#g.j#gas#g.j#g#gasas#g.jas#g.jas#gas.jas#gasas#gas#gas#g#gasa2aj#g#La9aYa0bmbgambgama0.C#x#xawaY.N#Da9.7#L#Laf#Laj#Laj#Laf#L#Lafaj#Laf#Laf#Laja2#Lafaf#L.na9.na9a9a9.Ea9a9.7ajafajaf#L.7#L.7bp.Ebp.Eaj.7#s.Naw.Naw.Naw#x#I.N#I#x#I.C.Wa0aoamao.5ao#vaBazal#3aB#vaF.y.yaB#u.wa6#z.w.8.C.Wam.CaoamaO#v#uaz.G.GaBaFama0#xawbfa1aY.NaY.NaYaY.NaY.N#D#D#D#Da9a9a9a9.7#D.n#D.7a9a9#D#s#D#D#D#s#D#Da9.na9a9#D#Daw.N#D#s#D#D#D#s#D#D.7.7.7.7.E.7.7.7#L#Laj#L#Laj#L#L#Laj#Lajbpaj#Lbp", +"as.jas.j#g.jas.ja2#ga2as#g.j#gas.j#g#g.jas#g#gas#g.j#g#gas#gas#gas.j#gas.jasas.j#ga2#gaj#LaY#Uamb#ama0a0aCbn#Ibn.Nblaw#Da9aja9aj#Laj#L#Laf#L#Lafaj#L#Laj#L#Laj#L.3aj.3#L#L#La9.7a9a9.7a9a9.7a9a9afa9#La9aj#L.n#L.E.7aj#L.E#D.sbfaw#M.NaY.s#x#IaY.C.W.C.W.Caqaqao.5aoaF#v#uaz#T.o#vaO.8.8bcbcaB#ualbaa5#vaoa0avaoaF#vbm#uaz#u#uaZa0am#x#M.N.N.N.N#D.Naw.N#s#D#D#D#D#sa9#Da9.n#L#L.na9a9.7a9a9.7#s#D#D#Da9#Da9#D#s#Laf.7a9.n#Da9a9#L.7#L.7aj.7#L#Laj#Laj#L#L#Laj#L.j#L#La2#La2#La2ajbp#Lbpa2#L#ga2", +"#g#g#g#gas#g#gas.j#g.j#g#gas#ga2#gas.j#g#g.jas.j#gas#g.jas#gas#gas#gas#gas#gas#gaa.j#g#L#LbjaY#Ua0aCa0a0#xbn#xawbl.N#D#Da9.7#L#Laf#Lafaj#Laj#L#Laf#Laf#Lafajaf#L#La2#Lajaf#La9a9.n.7a9a9a9a9a9#Lafafajafaf.7#L.7#L.7#Laja9#saY#IaY.saY.saY#I#x.s.C#xaC#x.Caoaqamao.8a##v#u.Ga5azaOaOaoao.8#v.ya5ba#z.w#vao.Wam#vaB#uaB#uaZa#aF.5#xawaYbla9.E#D#sa9#sa9#D.7.7a9#s.7a9.7.7#L#L#L#L#L#Lajaf#L#Lajafa9.7.na9a9.7a9a9.7aj#L.7#L.E#Lajafajaf#Laf#Lajaf#L#L#L#Laj#L#L#L#La2aj#gaj#gaj#g#La2.jbp.jbp.jbp", +"as.jas#g.jas.j#ga2as#gas.j#g.j#g.j#gas#ga2#g#gas#g.jas#gas#gas.j#gas#gas#gas#gas#g#ga2bp#L.na9bla0bnbn#UaYawaYaYaYbl#Da9.n.7afaj#Laj#L#L#L#Lafaj#Laj#Laj#L#L#L#L.ja2a2a2af#L.n.7a9a9a9a9.7.n.7a9afaf#Lafaj.7af.E#Laj#L.Ea9aw#x#IaY.saY.NawbfaY#x#I#x#I.C#I.C.Wa0.8am#v.0#u.G.w#uaO#v.8#Q.8bdbb.Q.K#z#u#vaFaoaBa7a7#u#SaFaoamaCbnaYaY#Da9aja9a9bj.7a9.7a9.Ea9.7.7af.7#L#Laj#L#La2ajafaf#L#Lafafafaj#Laf#Lajaf#L#La9#L#Laj#La2a2a2#ga2.j#g.ja2a2#gaj#gaj#g#La2bp.j#g.j#ga2#ga2#g#g#g.j#g#g#ga2a2#g", +"#g#g#g.jas#g#gas.j#g.jas#gas#ga2as.j#g.j#g.jas#ga2#g#g.jas#gasasas.jas#g.jas#g.jasaa#g#Lbp.7afajbn.RaYaYaYaYaYaYbl.N#D#D.7#L#L#Laf#Lafaj#L#L#L#Laf#Laf#L#La2#L.3#La2#L#L#Lafa9a9.n.7a9.7a9a9a9.7afaf#Laf#La9aj.7.7.7aja9#saw#x#I.N#saY#I.NaY.s#I#x#I#x#I#xaC.CaoamaO.yaB.waz#uaZ.8bc.8.8#Q.y.Q.w#4#4.wa##vaB.Qaz#vaFama0#x#x.N.s.N#D#sa9.7a9.E#D.E#L.7aj.7#Laja9aj.7#L#L#La2.ja2af#Lajafajafaj#Lafafajaf#Lafajaf#L#L#La2a2.j#ga2.jas#gas#g.jas#gasa2#g.j#g.j#g#g#g#g#g.j#g.jas.ja2#gas.ja2.j#g#g", +"as.jas#g#gas.j#ga2as#g#gas.j#g.j#g#g#ga2a2#g#g.j#g.jas#gas.jas#g#gas#gasas#gasasa2#g.jbp#LajafafaYbnaYaYblaYaY#MaY#D#sa9a9.7#L#L#Laj#L#La2afa2#L#L#Laja2#Laf#L#La2.j#L.3aj#La9.7a9a9a9a9.n.7a9a9afaj#La9aj#L.7#L#D.na9#s.naw#x#Ibl.Naw.Naw.NaY#xawaYaw#x#I#xaC#I.8aO.yan.w.G.w#vb#by.8.8bc.ybb.Qay.Y.G#u#1a5.GaBamamaobn.s#Da9.7aY#Da9.7a9.7.7#Da9aj.7af.7af.7#L.7afaj#La2a2a2.j#Laf#Laf#Laf#Laf#La2#La2#La2a2a2.7.j#La2#gaa.jasas#gas.jasasas.j#g.j#gas#gas#gas.jas.j#gas#g#gas#ga2.j#ga2#ga2a2", +"a2#ga2.jas#gasas#gas.j#g#g#gas#g.ja2a2a2.ja2a2#ga2#ga2.jas#gas#gas#gas.j#gas#gas#g.j#ga2bp#L#Laj#L.naY.R#xaYaY#D#Dbl#D.7#saf.7.n#L#L#L#L#Laj#L#Laja9#La9aj#L#L#La2a2a2.j#L#Lajafa9#sa9.7a9a9a9.E#Lafafajafa9.na9aj.na9#s#D.N#IaY#s.sbl.s#D#s#D#s.N#I#x.W.Cavam.5.8aF.0azal#T.w.0.8#v.8byaKbbaIaP#aba#N.O.GazaB.5#xaw.N.NaY#D#D#s.7.n.7#L#La9.7a9#L.7af.E#L.E#L#L#L#L#La2#La2bpa2#L#Laj#La2#L#Laja2aja2#ga2.jbpa2as#gas#gas#gas#g.j#g.j#g#g.j#gas#ga2.j#g.j#g.j#g#ga2#g#ga2.j#ga2a2#g#ga2#g.j#g#g", +"#g.j#g#g#g.j#gas.j#g#gas.j#g.j#ga2a2#ga2#g.ja2a2#g.jas#g#gas#gasas.j#gas#gas.j#gasasas#g.j#g#Lbp#La9#Dbl.RaYaY#D#D#Da9#D.7a9.7#L#L#Lbp#L#Lbp#L#L#L#L#L#g#La2a2#Las.ja2a2#Laf#L.7a9.7.na9a9.7a9a9af#L#La9#Lafaja9.na9.n#D.s.s#x#I.Nbl.s#D#M#DaY.saY#I#xaC.Caqao.5bgaO#uaz.G.G#u.y#x.W.8#v#v.y.0.ybabaay.f#uaB.8a0bfaYaY.N.N#D#D#Da9.7.7af.7.7af.E.7aj.7#La9#L.n#L#L.jaf#L#gaja2#L#La2#Lafaj#La2#L#g#g#L#g#L#ga2#g#gas#gas.jas#gasasas#gas#gas#g#g.j#g#gas#ga2as#g#ga2#g#L#gbpa2bp.j#L#gajbpa2bpa2", +"a2a2#g.jas#gas#g#gas.j#g#gas#g#g.ja2a2.ja2a2a2.jas#gas#gas#g.jas#gasas#gas#gasas#g#g#ga2#g#L#La2#La9a9#DaYbl#Dbl#Da9#Da9a9.7#L#La2#g.j#g#ga2#ga2.j#ga2.j#g#g#g#ga2a2#g#La2aj#L#L.n#Da9a9.na9a9.7#Lajafajaf.7a9.naf.na9aE.N#I#Ibn.saY.Naw.NaY.saY#x#I#x.Wa0ao.5.8aoaO#u.G.Gaz#ua##IaCaCaobg#va7azaH#zaz#uaFam#x#xaw.N.N#D#D.n#D.7.E#L#L#Laj#L#L#Laf.7#L#L.E#L#L#L#L#La2#La2#L#gaja2#L#La2#L#L#La2a2#g.j#ga2#g#L.jas#g.jas#gas#gas#g#g.j#gas.j#g.j#ga2.jas.j#g.j#g.j#ga2.j#ga2#g#L#g#gaja2bp.j#L#g", +"a2#g.jas#g#g.jas.j#gasa2#g.j#g.ja2a2#ga2#La2a2#g.jas#gas.jas#gas#gas#gas#gas#gasas.j#ga2#gaj#Lbp.j#La9a9#D#Dbl#Dbl#D.7a9.7.7af.7a2a2a2a2a2a2.ja2bpaj#Lbp#Lbpa2#L.j#g#La2#L.7#L.7a9a9a9.7a9.7a9.n#Lafaf.7afafaja9.na9.n#D#s#I#x#IaY.sawaY.saYaw.N#I#x#I.C.W.5av.5bgaOaB.G.O.G.y.5aO.8bgaFaB.Gau#N#zaz.0aFa0#x.NaY.N.N#D.n#D.7.7a9#L#La9#L.7#L.7#L.E#L#L#L#Laf.7#L#La2#L.jbpa2#La2#La2#Lajafa2#L.j#L#g#L#gaja2#g#g#gasasas#gasasas.jasasas#gas#gasa2.j#g#gas#gas#g#ga2bpa2bpaja2aj#ga2#L#g#La2bpa2", +"a2#ga2#g.jas#g#g#gas.j#ga2a2as#ga2aja2.j#g.j#La2#g#g.j#gas#g.j#g.jas#g.jas#g.jas#gas#ga2#g#La2#L#L#g#La2a9a9#D#D#Da9#Da9.7a9#L.7a2.j#g.ja2aja2#L#L#g#ga2.j#L.j#g#La2#Laj#L#La9.7.na9.na9a9a9a9a9#L#Lajafaja9a9.naf.n#s#s.N#I#x#U#I#x#x#I#x#I#x#I#x#I#x.Wamao.5.8ao#v#u.Garaz#ua#.y.0#u#u#aau#3alaza#b##I#xaw#D#sa9#s.7a9.7a9aj#L#La2aj#L#Laf#La2#L#La9aj.7#L#Laja2#L#g#La2#L#g#Laj#L#La2#L#La2#L#ga2#ga2#g#g#L#gas#g#gas#gasasasas#g#g.jasas.j#g#gas#g.j#g.j#ga2.jbpa2bpa2bpa2bp.jbp.jbp.jbp.jbp", +".j#g.ja2#g.j#ga2.j#ga2.j#g.j#g.ja2#ga2a2a2a2a2#g.j#gas#g.j#gas#gas#gasas#gas#gasa2.j#gaj#g#Lbp#La2#La2#L#La9#Dblbl#Da9bja9#L.7#L#L#Laf#L#L#Laf#Laj#L#L.7#L#L#L#L#L#L#L#L#La9#L.7a9#Da9a9.7a9.Ea9#Lafaf#Lafa9.na9.na9.E#D#s#x#I#I#I#I#x#I#x#I#x#I#x#I#x.WaC.5.8.8.5aBa5#a#TaPaPbk.U#3al#3#T.G.w.0aFaC#x#x.N#D#Dbj#Dbj.7.7aj#L#L#La2#L#La2#La2aj#L.7#L#L#L#L#Laf#Lbp.j#La2bpa2aja2#La2af#L#Laja2#L#g.jbpa2bpa2#g.j#gas.jasas.j#gas#gasasas#g#gas#ga2.jas#ga2#g.j#g#L#gaja2aj#gaja2bpa2#L#L#L#g#La2", +"a2#ga2#ga2a2#g.j#ga2#ga2a2#g#g#g.j#L.j#L.j#La2a2#gas.j#gas#g.jas#g.j#g.j#g.j#gas.j#ga2a2#gaj#L#L.ja2#g.j#g#L#Dbl#Da9a9a9.7a9.7a9a9a9a9a9a9#sa9#Da9a9.na9a9a9#Laf#Laj#L.7a9.E.7a9.n.7.n#Da9a9a9a9#Lajaf.Eaf.na9.naf#Ma9.s.s#I#x#I#x#I#x#I#x#I#x#I#x#I.CaCaq.8am#vaO#u.G.Uay#3#3bv.M#C.O#u.y.5am.C#UaYaYaw.N#D.7.7.7.7aj.7#L#Laj#ga2#ga2a2.ja2a2a2ajaf.7#L.7aj.7#La2a2bpa2aja2bpa2#L#Laja2#La2#L#ga2bpa2.j#g#ga2#gas#gas#gasasas.jas#g.j#gas.j#g.j#ga2a2.ja2a2#gas.j#L#g#L#g#L#gaj#Laj#L.j#La2aj#g", +"#g.j#g.j#g.ja2a2#ga2.j#g.j#g.j#ga2a2a2a2#g.ja2#g.j#gas.j#gas#gas#gas#gas#gas#g#ga2#g.j#L#g#La2bp#La2#gas#g#La9bl#D#Da9bja9.7.n.7a9b.#D#s#D#D#D#s#p.nbl#p.na9a9a9#L.7#L#L#La9.7.7a9#Da9.na9.n.7a9#Laf#Laf#Lafa9.na9.n.E#s.N.s#x#U#I#x#x#I#x#x#I#x#I#xaC.Wa0.8.8.8.yaB#T#4beaM.Y#T.fa7#uaOa0bf.s.N#Mbl#s#D#D.s#DaW.E#L#L#Laj#L#g#ga2a2.ja2a2a2aja2.7#Laj#Laf#L#L#L#L#ga2#L#g#La2#L#La2#L#L#L#La2aj#ga2#g#g#ga2#ga2as#gas#gas#g#gas#gasas.j#g#gas#g#g.ja2#g#g.ja2.j#L#g#L.jbp.j#La2aj#L#Lbpaj#g#L#g", +"a2a2a2#La2a2.j#ga2.ja2a2a2a2#ga2#ga2#ga2a2a2#ga2asaa#ga2#ga2#L.j#La2#L#Lajafa2#L.ja2#ga2#La2#L#L#L#Laf#Laj#L#L#La9bl#Da9blaYaYaYblbl#DaYaYawaYaYblblblblblblbla9#Da9#D#sa9#Da9#D.na9.7a9.7a9a9.n#Laf.Eaf.Eaf.naf.na9#M#D#saY.saw.N#s#s#D#s#s#D#s.C#I#I.C#Iao.5#v#u.OaVadbi#3#1aBbdaO.W.C#IaYbf.N#D#s.7#L#L#Laj#L#Lbp#Lbpbpa2bpa2.j#g#g#Lbp#Lbp#L#L#L.7.7.E#L.7#La2a2a2.ja2#ga2.ja2#L.3a2a2#g#g#g#L#ga2#ga2#g#ga2#ga2#ga2.j#ga2#g#gas#gas#g.jas.ja2#g#L.j#L#g#g#L.ja2a2#L#L#L.7#L#L#L#La2#L#Laj#L", +"a2a2.j#L.j#La2a2a2a2a2a2#ga2a2a2.ja2a2.ja2#ga2a2asa2asa2.j#L#g#La2#L.jaf.3#L#La2aa#ga2a2#L#Laj#Lafaj#L#L#Lbpaj#La9#D#p#Dbl#DaYaYbl#DblaYaw#xaYaYbl#Dbl#Dbl#Dbl#Da9#sa9#D.7#D.7#D.7a9a9a9a9a9.7a9.n#Laf#Laf#La9a9.n#s#D#M#DawaY#I#s#D#s#s#D#s#D#sbf#Ibf#I#Ia0bc.y.G#zad#4aXbk#v.8bgao.C#x.N#x.N.s.7bj#L.7aj#Lbp#Lajbp.j#L#gaj#g#L#gbpa2bp#L#La2#L#L#L#Laf#La9#L#L.j#ga2#ga2a2a2a2a2#La2aj#L#g#L#ga2#g#ga2#ga2#ga2#g#ga2#g#ga2bpa2as.j#g#g.j#ga2#g#L#Laj#Laj#Laj#L#gaja2ajafaj#L.Eafaj#L#Lajaf#L#L", +"a2#La2a2a2.j#ga2.j#L.j#ga2a2#ga2#ga2#ga2#ga2a2asa2.jasa2#ga2#La2#La2#L#L#Laf.j#L.j#L.jafaj#Laf#Lafafaf.7#L#L#Lbpa9#pa9#D#Dbl.sbl#D#MblaYaYaYaYawbl#D#M#Dbl#D#Mblbja9bja9#D.n#Da9.na9.7a9.7a9.na9#Laf.Eaf.Ea9.n.n#D#M#saYaw#IaY#IaY.s#D#s#D#s#D#s#I#x#I#I.Cao.y#1#T#rbq.G#u.yaOaCamaC#xawaY.s.N.N.7aj#Lbp#Lbpa2#ga2#Lbp#L#g#L#g#L#ga2#gaja2bp#Lbp#Laj.7aj.7aja9#L#L#L#L#L#Laj#L#L#L.j#La2#ga2#g#g#L#ga2#g#g#ga2#g#ga2#g#ga2#g.j#g#gas#g.jasa2.j#gaj#L#Laj#L#Laj#La2a2a2#L#L#La9#Lajaf#Lajaf#Laj#L", +"a2.ja2.ja2a2a2#ga2a2#ga2a2#g.ja2a2a2a2a2a2.ja2a2asas#ga2a2#L.j#La2aja2a2a2#Laf#Lafa2af#Laf#Lafajaf.E#Laj#L#Lbpa2a9.na9#Da9a9#D#Dblbl#DaYaYaYaYaY#Dbl#Dbla9#D#D#Da9#Da9#Da9bja9bja9.7a9a9.na9#Da9#D.na9a9a9a9#D#sbl#saYaw.s#x#I#I.saw.saY.s.Naw.N.s.s#IaCaoao#u.G#z.UaX#uaOaOao.W#x#IaY.N.N.N#D#D#L.7#Laj#La2#ga2#gbpa2bp.jbpa2bp.ja2#g#L#Laj#L#La9.7a9.7a9.7.7a9#L#L#Laj#L#L#La2af#La2#L#L#g#L#ga2#g#ga2#ga2#g#ga2#g#ga2bpa2bpa2#g.ja2#ga2#g.ja2#Laj#Laj#Laj#L#La2.j#Lajafaj#L.E#L#Laf#L#L#Laf#L", +"a2bpa2#La2.j#ga2aja2a2a2.ja2#ga2#g.j#ga2#ga2#ga2a2aa#ga2#ga2bpa2#La2afaja2afa2#Lajafajafajafa9a9af#Laf#L#L#L#Lbpafa9a9a9a9a9#D#D#Dbl#DblawaYaYaY#D#Dbl#D#Dbl#D#Da9b.a9.7a9#Da9#Da9.na9.7#D.na9.na9a9#D.n#D#s#D#M.NawaY#I#x#I#Ia0#IaY#Iaw.Nawbo#x.s#x#I.WaF.yaz#3.a#4a5#v#vaoaC#IaYaY.saYaw#D#sbj#Laj#Lbp#L.j#g.jbpa2aj#g#L#g#L#g#g#L#g#L#g#Lbp#L.na9a9.na9a9.na9#Lajaf#L#L#L#Laj#Lafa2#L#g#L#g#g#L#ga2#g#ga2#ga2#ga2#ga2.j#ga2#g.jas#g.j#g.j#ga2aj#L#Laj#L#Laj#Laj#La2#L#Laf.7af#Laj#Lajafaj#L#L", +"a2.ja2.j#L#ga2a2a2#ga2#ga2#ga2a2a2a2a2a2a2a2.ja2as.jasa2.j#La2#La2#La2a2#La2afajafafafafaf#pa9.n#Laf#L#L#L#L#g#Lafa9a9a9a9a9a9a9a9#DblaY#DaYawaY#D#M#D#D#M#Da9#Da9#Da9bja9.7#s.7a9.7a9.na9a9.7#D#s#D#s#D#Dbl#s.N#M.Naw#I#I#IaC.W#I#xbo#xbo.N#IaYbo.W.Wa0#vaz.Y#.aVapaOaO#O#I#I#xawbl.N#D#D.7a9.E#L#L#L#gaj#g#g#ga2bp#gbpa2bp.j#La2#g.j#L#La2#Lbpa9.7#D#D#s#Da9#D#L#L#L#L#L#L#L#L#L#La2#L.j#Lbpa2#ga2#g#g#L#ga2#g#g#ga2#gbp#g#L#g#g#g#ga2a2#g.ja2aj#Laj#L#Laj#Laja2#Lajafaj#Laj.7aj#Laf#L#L#Laf#L", +"a2#La2#ga2.ja2#ga2.ja2a2a2a2#g.j#ga2#g.j#ga2#ga2#gaa#ga2#ga2aja2#L.j#La2#L.jafaf.3ajaf.n#p.n#pa9afajaf#L.7#L#L#L#L#La9a9#D.7a9#Da9a9bl#DblaYaYaY#D#D#D#D#D#D#D#Da9bja9a9.7#Da9#Da9a9a9#Da9#sa9a9#D#D#D#D#s#D#saYaw#I#x#IaC#x.WaC#I#I#x#I#x#I#I#xa1ao#Q.8.w#4.P.4#u#Sao.WaCa0bobfbl#s#D.na9#L.7#L#Lajbpa2a2#g.jasbpa2#L#g#g#L#gbp#ga2#g#Lajbp#Laja9a9#M#Dbl#D.na9.7a9.7a9.Ea9a9.7af.jaf#La2#L#L#g.j#ga2#ga2#g#L#ga2#ga2bpa2a2.j#g.j#g.j#g.ja2#g.j#Laj#Laj#L#Laj#L#Lajaf#L#Laf.7af#Laj#Lajafaj#Laj", +"a2.j#L.j#La2#L.ja2a2#ga2#g.ja2a2a2a2a2a2a2a2a2a2asa2asa2a2a2bpa2af#La2afa2#L#Lajaf#pafafa9#p.n#p.7af#L#L#Laj#Lbpaf#La9.7a9a9bja9a9#D#Dbl#DaYaYaY#D#D#D#Da9#Da9#D#sa9a9bja9a9bja9.Ea9.7a9.Ea9a9a9#s#D#s#D#Dbl.s#Daw#x#IaC.WaCaCao.Wav#Ia1#I.Ca1#I.Cav.8aO.G#dbs#BaLaB.8aC#I.WaYbf#sbl#Da9a9.n#L.E#L#L.jbp.j#gasasa2bp.j#L#ga2bpa2#g#L#g#L#g#L#L#La9#Da9bl#s#p#Da9.7a9.E.7a9.7.7.n#Laf#L#L#gaj#L#g#ga2#g#gbp.j#ga2#g#ga2#g.jbp#gbpas#ga2#ga2#g.ja2.E#Laj#L#Laja2#Laja2aj#Laj#L.E#L.Eafajaf#L#Laf#L", +"#L#L#L#L#La2bpa2#Laj#L#La2bpa2bp.L.L.jasaa#ga2#gaja2a2a2a2#La2#La2a2#L.j#La2afa2.3aj#p#Mbl#D#D.7ajaf#Laj#L#Lbp#Laj#Laf.n.7a9a9.7#pa9#p.NaYaYbl#Dbl#D#Da9#Da9.7a9a9a9a9afa9.7a9.7#Dbl#Dbl#D#D#D#D#xaYaYawaYaYaY#Ubn#I#I#I.Wao#v#vaC#I#x.W#Ibo.C.WavaoaZ.o.Yab#3.QaOaoaC.W#I#x.s.Nbl#sa9a9aj#La9#L#L#g#L#ga2#g#L.j#g#g#g#ga2bp#ga2.ja2#L#Laf#La9.7bl#DblblaYaYaYaYaj#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2#ga2a2a2#g#La2#La2#g#La2a2#L#L.ja2.ja2.j#L#Laj#L#L#Laj#Laj#Laj.3#Lafajaf#Lajafa9.na9a9.na9.na9", +"#L#Laj#L#Laj#La2bp#L#gaj#L#L#Lajaa.jaaaaa2#ga2bp.3#L#L#La2#L.j#La2a2a2#La2#La2#L.3af#pblbl#Da9a9afaja2#La2#La2#L#Laf#L.7a9a9bja9a9#p#DblaYaw.Nbl#Dbl#Dbl#D#D.7a9a9afa9a9a9a9aj.7bl#D#D#sbl#Dbl#MaYawaY#xaY#xawaY#x#U#x#I.Cao.8aBaxav.W.C.Waoao.8aO#vaPay#daVbk.0#OaoaC.W#x#I.N.N#Dbl.na9a9#L.7aj#g.j#ga2bpa2#g#gasas#g.j#g#ga2#g#La2.ja2#Laja9a9a9a9bl#DaYawaYaY#La9.Eaf#L#Laj#L#L#Laj#L#L#L#L#Lbpa2#L#g#La2#g#L#gaja2#ga2#ga2#La2a2a2#La2a2.3#L.jaf.jaf.j#L.3#Laj.3aja2#Laj.3#Laja9af.n#L#Laf#L", +"a9ajafaf#L#L#L#L#L#L#L#L#L#L#L#Laa#ga2#g.j#gbp#La2#L.ja2#La2#La2a2#La2a2a2#L.j#L.jaf.n#pbl#sa9.Eaf#Lafaj#Laj#L#Lajaf#La9a9bja9a9#Ma9bl#DaYaYbl#DaYbl#Dbl#Da9a9a9a9#p.naf.7a9.7a9.n#Da9#D#D#s#D#DaYblaY#MaY#MaYaY#MaYaw#I#IaC.8aObgaoaoao.8ambc#v#uar.M#d#4.G.y.8bgaoaC#x#I.N.N#s#pa9a9.7ajaf#L#La2bpa2.j#g#gaj#g#g#gas#ga2#g#L#La2a2#Laf#Laf#La9a9a9a9#D#Dbl.Nbl.E#L.7#L.7af.7#La9#L.7#L#L#L#L#La2#ga2#ga2#g#La2#L#ga2#L#g#L#Laj#L#Laj#Laj#Laj#Laf#L#La2afaj#Lajaf#Lajaf#Laj#Laja9afajaf#Lajafaj", +"afaf#Lafajafajafajaf.Eaf#Laj#L#L#La2#L#L#gbpa2bp#La2#L.3#L.jafa2#La2a2#La2a2#L.3afaf#p#Mbla9a9.7afajaf#L#L#L#g#L#La9aja9a9#Da9.7#pbl#DaYaYaYbl#DaYblaY#Dbl#D#D#Dafa9afa9a9a9.7.7.7#Da9bja9#D#D#s#D#D#saYbl.NblaY#M#D.saw#I.WaOaB#vaO#v.8aOaO#v.y#3ad.Z#.#T#vav.haoaC#x#IaY.s#D#D.n#Dajaf.7#Laj#L#ga2#g#gbpa2#ga2a2as#ga2#ga2bp#La2a2a2a2a2#L#L#La9afa9#M#DblawaY#L.7af.E#Laj#L#L#Lajaf#L#L#L#L#Lbpa2#L#g#La2#gaja2#L#ga2#g#La2a2aj#L#L#L#L#Laf#L#Laj#Laj#L#Laf#Laj#L.7aj#L.Eaf.7.na9#D.n#Da9#Da9", +"a9.na9a9a9a9#pa9a9a9a9a9a9a9a9.nafaj#L#L#L#Lbp#La2aja2#La2#La2a2#La2a2a2a2a2#La2aj#p#pbla9a9#Lajaf#Lafajafaj#L#Lajaf#La9.7.nbj#Da9blaYaY#x.N#DblaYblaY#DaY#Dbl#Da9a9a9a9.7a9.7.7a9.7.E.7.7.7.7a9#D#D#D#D#s#D#s#D.sbl#s.s#xaoaO#S.yaBaB#u#u#ubk#E#.ab#4#3.G.y.8bo#U#I#x.s.N#D#s#Da9#L.7aj#L#La2bp.jbpa2#La2#g#L#g.jas#g#ga2#Laja2#L.j#La2af#L#L#La9.7a9bj#Daw.Nbl.E#L.7#La9#L.7#L.7#L.7#L#L#L#L#La2#ga2a2#ga2#L#g#La2bpa2#La2bp#L#Laf#L#Lafaj.7ajaf#Laf#L#Laj#Laja9.na9.7afa9.Ea9a9a9a9a9a9.na9a9", +"a9a9a9a9a9a9a9.n#paf#paf#p.n#p#pbl#D.na9a9#L#L#L#La2#La2#La2#La2a2a2a2#La2#La2afa9#p#M#pa9.nafa2afajaf#L#Lbp#L#L#Laf#La9a9#Da9a9#D#DaY#x#xaYaY#DblaYblaY#Dbl#Dblafa9afa9#Da9.7a9#L.7a9#Laf.7.n.7a9a9#s#D#D#D#D#D#s#D.s#x#I.8#Saz#u#u#uaZ.w.GbiaV#4.U#3ara5#vao.W#x#IaYaw#D#sa9a9#L.n#Laf#L#gaj#L#ga2#g.ja2#g.j#gas#gas#gaja2bp#La2a2a2a2#L#Laf#L#L#La9a9#Dbl.NaY.7#L.n#L.E#L#Lafaj#L#L#L#L#L#L#Lbpa2#L#g#L#ga2#ga2#ga2a2#gaja2#L#L#L#Laj.7#La9#L#L#Lajafaj#Laf#L.n.7a9.Ea9.Ea9.n#D#s#D#s#D#D#s#D", +"a9.n#pa9.n#pa9#pa9.n#p.n#p#p#p.nblblbla9.na9#Laf#Lafa2aj.3#L.j#La2#La2#La2aja2#La9.nblbl#pa9#L.j#Laf#Laja2#La2aj#L#Laja9a9.7#D#s#p#DaY#x#x#xaY#DblblaYaYbl.Nbl#D#Dbl#D#Da9#Dbj#D.7#L.7#L.7af.7#L.7.na9a9.na9a9.n.NaYbobfaoaFaBazaz.w#uaP#3#4ad#4ap.O.O.O.w#S.8.5#Uaw#x.saY#s#D.n.7#L#Laja2aj#gas#L#gbp#gbpa2bpa2#gas.j#g#g#L#La2#La2#La2#L#L#L#L.7#L.7.7.E#D#s#D.na9#L.7af#L.7#L.7#La9#L#L#L#L#La2#ga2a2#ga2#L#g#La2bpa2#ga2#ga2.7a9.7#La9.7.7a9ajaf#L#Laf.7.na9#D.Ea9.7a9.7a9b.#D#D#D#D#D#D#D#D", +".n#pa9#paf#p.n#p.n#p#p#p#p#p.n#p.b.R#Mbl#p.nafajafaja2#La2#L.3#La2a2aja2#L.3#L.ja9#pbl#Mbl.nafa2afajaf#La2#Lbp#L#Laf#La9.n#D#s#DblaYaY#xbn#xaY#DblaYblaYblaY#Dbla9bla9#D#D#D#Dbja9#La9#La9.7.7a9.7a9.7.7.7.E.7#D.N.sbf.Wam.y#uaz.Oar.Gal.Mbxadalbkbkbkbkbka7.yaF#I#IaY#s#Da9#s#Daj#Laj#L#g#L#g#g#gaja2a2a2#ga2#gas#gas#ga2#g#gaja2a2a2af#Laf#La9#Lajaf.7a9#D#s#Da9.Ea9.E#L.E#Laj#L#L#L#L#L#L#L#L#L#g#L#g#La2#ga2#ga2#ga2#L#g#La2#L#L#L.7#Laf#La9#L.E.7.7.Ea9.n.7.n.7a9.7.n.7.na9#D#D#s#D#s#D#s#D", +"#Lafaj#L.7#L#L#Lafafajafaja9#pa9aYawaYaYawblblblafafaf#Laf#L#L#L.jaaafa2#L#Lafaf.n#F#M#pa9afaj.7#Lbp#Lbpbpaj#L.Eaf#Laj#D#D.N#D.N.naYaYbna0a0bnaY#DblaY#x#xaYaYblbl#D#Da9a9.7#L#L.7.7.7.7.7.7.E.7#Dbj#D.s.N.N#DboaY#MaY.W.8aZal#P#PaT#P#.a.ad.ObkaX.G.O#Taz#SaoaC#x#x#I.N.s#D.E.7af.7#L.E#L.Eaf#Laj#g#gbp.jbpa2aj#ga2#g#L#ga2#ga2#L#L#L#L#L#L#L#L.7#L.7a9.E#Da9#D.Ea9.7a9.7a9#La9#L.7aj#L#L#L#L#L#L#L#L#L#Lbpa2#L#L#g#L#ga2a2#ga2bpa2#La2#L#Laj#L#Laf#Laj#L.7#L.7af.7.E#L.7#L.7#L#sa9.7a9.7#L.7#L", +".E.7.7#La9aj.7#Lafajafafafa9a9.nblbl#MaYblbl#Dblafajafaj#L.E#L#Laaa2a2aja2afajaf#p#p#pa9.naf.7#L#gaj#Lajbp.7#L.7ajafa9#D#D.NaY#xblaY#x#xama0a0aY#p#Dbl#xbnaYblaY#Dbl#Da9a9.7af.7.7.7.7.7.7.7.7.7#D#s#D.N.N.N.N.N#IaY.N#Iamanay.P.PaDaD#..M.O.G#u#u.w.GaP#u.ybgaCaC#x#IaY.N#s.7a9.7aja9#La9#L.E#L#L#ga2a2#ga2#ga2#g#L#ga2#ga2#g#g.7#L.7#L.7#L.7.7af#L#L#La9#Db.#Da9.7a9.Eaf.7a9.7#L#L#L#L#L#L#L#L#L#L#L#L#La2#L#L#ga2a2#g#L#g#La2#ga2#g#L#ga2#La2#L.7#L.7a9aja9#L.E#La9aja9#L.n#L.na9aj#Laja9aj.7", +"#L#Lafaj#L#Laf#Lajafaf.Eaf#sa9a9a9a9#pbl.nbl.n#p.nafa9#Laf.7#L#L#L.ja2#La2af#L.n#p#Mbla9a9aja9#Laj#Lbp#L#L#L.7.7#D#D#saYaw.N#xbf#MaYaw#xbna0a0aYblaYaY#xbn#xaYaYbl#D#D#Da9#D.7#L.7.7.7.7.7.7.7bj#s.7#D#s#D.N.sbfa0#UaoaO.yan.2.g#m.AbA#4ar#u.0#u#S#vaBaB#uaB#v.5aoamaC#x#IaY.N.na9.7.E#L.7af#L#La2#g#L#g#L#gbp#ga2#ga2#g#g#ga2#g#L#L#L#L#L#L#L#L#L.E#L.7.7a9#Da9.Ea9.7a9.7.7#L#L#L.7#L#L#L#L#L#L#L#L#L#L#Lbpa2#La2bpa2a2#ga2#ga2#L#ga2a2a2#g#La2#Laj#L#L#L#L#L#La9#L.7#L.7aj.7#La9.7#La9.7#La9#L", +"#L#L.7#L.7#L.7#Lafaf#Laf#La9a9.na9#Da9.n#Da9#D#Dafaf#Lafaja9aj#La2a2af#Laf#Laja9#p#D#p.na9.7aj#L#L#L#L#Laj.7.7b.#D#saY.NaYbf#x#x#DaYaYaY#xbna0#xaYaYaY#xaYaYaYaY#Dblbl#D#Da9.7.7a9.7.7.7.7.7a9.7af.7#D.N.s.N#x#IaF.8amaF.0#uaybe#.ba#aaz#ua##vaOaOaO#v#v.y#uaBa#b#bga0a0awaYbl#D.Ea9a9a9.E.7a9.7#Laj#L#gaja2a2a2#ga2#g#ga2#ga2#g#L#L#L#L#L#L#L#L#L#L#L#La9.Ea9.7.7.n.7.n#La9.n.7af#L#L#L#L#L#L#L#L#L#L#L#La2bp#La2#ga2#g#La2bpa2#ga2#L#g#L#ga2#g#L#L#Laf.7#L.7#L#L#Laj#L#L#Laf#L.7#L.E#L.n#L.E#L", +"#L#Laj#L#L#Laj#L#L#Laj#L.7.7a9.7a9a9a9#Da9a9.na9.naf.Eaf#L.7#La9ajaf#Lajaf#La9a9#M#pbla9a9#L#L.7aj#Laj#Lbjbj#sbjaY.N.Naw.N.Nawbf#DblaYaYaY#xbn.CbnaYaYaYaY#xaYa0bl#D#D#Da9#D.7#L.7#La9#La9#L.7.7a9#sblaYaYbnaCa0.5amaFaB#u#a#4abarazaBa#aO.5ao.5aoaoamaOaB#u#uaZaCa0bn#xaYaY#Dbla9a9.na9a9a9#La9#La2a2#L#g#g#L#g#g#ga2#ga2#g#ga2#ga2a2#ga2a2#La2#L#L#Laf.7.7.7a9a9.7a9.7.7.7#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#g#La2bpa2#ga2a2bpa2#ga2a2#g#La2#L#L.7#Laj#L#Laj.7af.7#La9#L.7ajaf.7#L#L#L.7af#L", +"#L.7af.7#La9#L.7a2#L#L.7#L.n.7.na9a9.na9a9a9a9a9afaf#Laf#Laf.E#Lafajafaf#La9.na9#D#p#sa9.n.7aj#L.7#L.7a9.Ea9#Da9.NawaY.N.NaY.N.N#D#D#D#MaY#x#xa0ama0#xbnaYaYbn.CaYaYaY#D#D#D#D#Da9a9a9a9.7#Da9#s#D.NaY#x.Ca0amamaFaB.f.Oau#aazan#v#vaFam.5aCav.CavaoaoamaOaB#uan.Ca0#xawaY.s#D#s#Dbja9bja9.7a9a9a2#La2#La2a2a2a2#ga2#ga2#g#ga2#ga2#ga2a2#ga2#ga2#L#L#L.7a9.7a9.7.Ea9.Ea9.7af.7af#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2a2#ga2#ga2#L#ga2#g#La2bpa2a2bp#L#L#L#L.7#L.7af#L#L#L#Laj#L#L#L#Laj#L#La9aj.7#L", +"#L#L#L#Laj#L#L#Lajaf#Laja9.7.7a9.7a9a9a9a9.na9a9aja9#Laja9#L.7#Laf#Lafaja9a9#D#D.nblbla9b.#L.7.E.7.n.7.n#D#D#s#D#D#D#D#s#D#D.n#D#D#D#s#Dblawa0.Cama0a0aYaY#xa0amblaY#D.N#D#Dbj#Dbj#D#D#D#D#D#D#D.N#x#x#xbg#vbmaBbk#a#Ea7a7aZ#va#amb#ao.C.W.Cbf#IaqaoaoaoaO#SaZ#ubn#I#xaY.Na9a9.7a9a9a9a9a9a9a9a9#Lajaf#L#L#L#La2a2#g#g#ga2#ga2#ga2a2#ga2a2#ga2a2#L#L#L#L.7.Ea9.7a9.7a9#La9#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#g#L#g#La2bpa2#g#La2#ga2#ga2#ga2#L#L#Lajaf#L#L#L.E#L.7#L.7#L.7#L.7af.7aj.7af.7#L", +".E.7.n#L.7#L.7af#L#L#L.7aj.7a9.Ea9a9a9.7a9a9.7a9afafafafaja9aj.7afaja9#La9a9#s#D#p#M#D#s#D.n.E.7a9.na9#D#sa9#D#D#D#s#D#D#Da9a9.n.N#D#D#Dbl#xa0ama0ambnaYaYbnama0aYaYaY.N#D#D#Dbj#D#D#D#D#s#D#Daw.C#I.Caobm.G#faG.yaBbh.l.taFb#.5a0a0aoa0#xbo#xboaqavaoamaC#Sa7an#I#x.N.s#Dbjaj#L.n#Da9#sa9a9a9a9#Laf#L#Laf#Laf#L#ga2#ga2#ga2#g#g#ga2#ga2#ga2a2#g#L#L#La9.7a9.7.7.7.n.7.7.7#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2#ga2a2#ga2#ga2a2#g#L#g#La2bpa2#L#L#L#L.7#L.7#L#Lafaj#L#Lafaj#L#L#L#La9#L.7aj#L", +"#L#L#L#Lajafaj#Laf#Lafaf#Lafajaf#L.jafajaf#Laja9aj#Laj#L#L#L#Laj.7.7.E#Laj#L.7.7bl.NawaY.NaY.N.s#s#D#sa9bj.Ea9.Ea9.na9.n#D#s#D#Da9.n#D#D.saY.s#x.R.Rbn#x#x#xaY.NbnaYblbl.na9.7.7#D.N.N.N.Nbfbfbfavama#aSaG#z.G.0aoa0aC#xaCbn.Wbn#I#xaY#I#x#x#I#x#Ia0avao#v.0aBa7#IaYa9.7.E.7#D#Da9a9a9a9.7a9.7afa2a2a2a2a2#g#ga2#ga2#g#ga2#g#ga2#ga2#g#ga2#g#ga2a2#g#L#L#L.7a9.7.na9a9afaj#La2a2#L#Laf#L#L#La2#L#L#La2#La2#La2#La2#L#L#L#L#L#L#La2a2a2a2#g#ga2#g#La2#La2#Lajafa2.7#L.7af.7#L.7afaj#L#Lajafafaf#L", +"#Lafajaf#L#Laf#Lajafaj#L#Laf#Laf#Laf#Lafajaf#Da9.7a9.7.7af.Eaf.7.na9a9a9.7.7.n.7awaYawaYaw.s.N#D#Da9#D.na9.7a9.7.n.7.7.7#D#D.7.7#Da9#s#D.N#x.N#x#Ua0a0bna0bn#IaYb#am#xaY.N.N.N.Nbj#D.N#I#xaqaoa0a0a#a7#fa6az.0.5bnaCbnbn#x#x#x#xaYboaYbfaw.NaY#I#x#Iao.8.5#v#u.T#I.N#sbja9bj.7bj#sa9.Ea9a9.7a9a9#L.ja2a2.j#ga2#g.j#ga2#g#ga2#ga2#g#ga2#g#ga2#g#g#ga2#L#L#La9aja9a9af.7af#L#L#L#gafa2#La2afa2#La2.3#La2#La2#La2#La2#La2a2a2a2a2#La2a2#L#g#La2bpa2bpa2#ga2#L#La2#L#L#L#L#Laj#L#L#La2a2afafaj#Lajaf", +"#L#L#L#L#L#Laj.7af#Laf#Lajaf.Eafajaf#Lafa9a9.n#D#D.n#Da9#s#D#D#D#D#s#D#s#D#D#D#sbl#s#D.s#D#s#D#s.7aj.7#L.7aj.7#L.7af.Ea9#L.7a9.7.na9#D#D#D.NaY#xa0.Vaoamama0ambna#b#amambn#x.C.Cawbf#xa0amamaF#v#vaBazaSa7a#aq.W#x#x.s#xaw#xaw#x.N.NaY#xaY#x#I.N#I#xavam.8.yana7#U#x#D.7b..7a9#Da9a9a9a9.7a9af.7a2#La2#L#ga2#g#g#ga2#ga2#g#ga2#ga2#g#ga2#g#ga2#ga2#L#L#L#L.7a9.7a9a9a9#La2#La2a2#L#Lafa2#La2#La2#L#L#La2#La2#La2#La2#L#L#L#La2#La2a2a2a2#g#ga2#g#La2bpa2a2#Laj#L#L#L#L.7#L.7#L.7af#L#Laf#Laf#L#L", +".7#L#Laj#L#La9#La9a9a9a9a9a9a9a9af#L#D.n#D.7#D.7#D#D.N.s.N.N.N.sbl.NblaYblaYawaY#M#D#Ma9#D.nbj.7#L#L#Laj#L#Laj#Laj#L#L#L.7a9.E.7a9a9a9#DaY.s.N#xaCb#a#aFa#amamam#vaFamam#xa0#xam.CaCamamaObma7aza7aZbm.tam.C.Cbfaw#xaYaY.NaY.NaY#DaY.s#xawbfaY#x#x#Iaqao.8aZ#ua7ao#xaw#Da9b..7#Da9#s.7a9af.7a9a9a2#La2#La2#ga2#ga2#g#g#ga2#g#ga2#g#ga2#ga2#ga2#ga2#g#L#L.E#L.7afa9afa9#Laf#L#ga2#La2#La2#La2#La2af#La2#La2#La2#La2#La2a2a2#La2#La2a2#La2#La2bp#g#L#ga2a2#g#La2#L#L#L#L#L#L#Lafaj#Lafaj#Laf#Laf#L", +"a9a9a9a9a9a9a9.n.7a9.n.7a9a9.n#D.na9#s#D#D#D#D#D#D#D.sblaY#saY#DaY#MaY#saYblaY#D#D#s#D.7.n.7bj.E#L#Laj#La2#La2#L#L#L#L#L.n.7a9.7a9.E#D#D.NaY.N#Iamam#v.0a#aFa#a#bmbgamaCbna0aoa0amaF#vaBa7a7.l.TaFb#b#amam#x.Nbj#x.N.s.NaY.NaY.N.N.NaY#x.N#IaY#I#x#Iaoaq.8.ybhazb#bn.N.N.7a9#D#s.7a9a9a9.7a9#La9#Lajaf#L#L#Lbp#L#ga2#ga2#ga2#g#ga2#g#ga2#g#ga2#ga2#L#L#L#L.7a9.Ea9a9a9a2#L#La2#g#La2#La2#La2#La2#La2#La2#La2#La2#La2#L#La2#La2#La2a2a2#ga2#g#ga2#ga2bpa2a2#L#L#L#L#L#L#L#L.E#L.7a9a9a9a9a9a9.7a9", +".7a9a9a9.n.7a9a9#s#Da9#Da9#D#D#D.7#D#D#DaY.Naw.Naw.NaY.NaY.NaY#s#D#D#D#D#s#D#s#D.na9a9.n.7.7.7#L#g.ja2#g.j#g.j#g.j.3aj#L.7aja9.Ea9a9a9#D.N.s#x#x.Cb#aF.yaZa#a##Sa##SaFamamaOa#aZazazaza7a7bmaFaFa0a0a0bn#IaYaY.Naw.NaYaY.N.N.Naw.NaY.Naw#x.N#x.N#x#I.Cao.5.ya7az.5aoaY.s#D.E#D#Da9.na9.7.na9a9a9#Laf#L#L#L#L#Lbpa2#g#ga2#g#ga2#ga2#ga2#g#ga2#g#ga2#g#L#L#Laf.7#La9afa9#L#L#La2a2#La2#La2#La2#La2#La2#L#L#L#La2#La2#La2#La2#La2#La2a2#L#g#L#g#L#g#La2a2bpa2#g.j#L#L#L#L.7af#L#L#La9.7a9a9.Ea9a9a9", +"a9a9a9a9a9a9.na9#D#D#s#D#s#D#s#D#D#D.saY.s#xaY#x#D#M#D.nbl.nbl#Da9.Ea9.7a9.7a9.7#Laj#Laj#Laj#Laj#gas#gas#g#gas#ga2#L#La2af.7#L.7a9#s#D#D.NaYaYboa0a0aOa#a#a#aBbh.GaPa7az#uaS#TalbaaGa7aZaFaoambnaCa0#x#I#D#DaYaw.N.N.s.N.N#D.N.N.N.N#I.NaY.saY#I.N#I.C.8.5.ya7azaOb##x.N#Da9a9#sa9a9#D.na9.7a9.7a9a9.7#L#L.7bp#L#ga2#g#ga2#g#ga2#g#ga2#ga2#ga2#ga2#L#L#L#L.7a9.7.na9.7a2af#L#ga2#La2#La2#La2#La2#La2#L.3#La2#La2a2#La2#La2#La2#La2a2a2a2a2#g#ga2#ga2bp.ja2bpa2#L#Laj#L#Laj.7#L.7.na9a9.7a9a9.7a9", +"afa9afa9.na9a9a9#s#D#D#D#D#D#D#D.saY.NaY.Naw.NaY.n#Da9a9a9a9a9#Daj.7#L#Laj#Laj#Laj#L#L#Laj.7bp.7as.jas.jas.jas.ja2.ja2#L#Laja9aja9a9#D#D.Naw.N#x#xa0am#va#a#bmaB#l#0.2.2.2#0ab.4arazaZa#aFa0.W.C#x#x.NaYaYaYblbl.N.N.N.Nbj#Dbj.NaY.NaY.N.NaY.NaY.NaY.Waqao.0#ua7aBaO.Waw#D.na9#Da9.na9a9a9a9a9af.7afa9.7#L.7.7bpa2#g#ga2#ga2#g#ga2#ga2#g#ga2#g#ga2#g#L#L#L.7.Eafa9afa9#L#L#La2#g#La2#La2#La2#La2#La2#L#L#L#La2#La2a2#La2#La2#La2a2#La2#L#g#L#g#L#g#La2#Lbpa2#La2#La9#L.7#Laf#L#La9.7.na9a9a9.na9", +"#D#Ma9#Da9bl#M#DaYaYawaYblawaYaYaYawaYaYbl#D#D#s.7af.E#L.7aj.7#L#Lajbp#Lbp#L#L#L#ga2.j#g#g.j#g.j#g#g#g#g#g#g#g#g#ga2a2aj.7a9.7.7a9.na9#M#DaY.Nawbn#UaoaF#v.8am#va6a6ba#V.Z#oab.I.TbmaFaoam.C.C#I#x.s.N.N#D#D#D#DaY#DaYbl.NaY.N.s#D#M#D#D#s#D#D#s#Daw#x.CaC.5bc.yaBaZ#vam.Nbj#Db.#D#D.7a9.7#D#D.Na9a9.7a9#L#L#L#La2a2a2#ga2#ga2a2#L#L#L#L#L#L#L#L#Laf#L.na9a9#D#Da9a9a9a9#L#L#L#La2#La2#L#L#L#L#La2#La2a2a2a2#L#La2#La2#La2#La2#La2a2a2a2a2a2a2a2#L#L#L#L#L#L#L#L#L#L#L#L#L.7a9.7af#La9.7a9bja9#D", +"bl#D#D#M#D#Dbl#D#MaYbl.saY.NblawaYaYaY#M#D#s#D#D.7#L.7#L#L#L#Laj#g#L#gaja2aj#gajas.jas#gas#g.j#gas.jas.jas.jas.ja2.j#L#Laf.E#D#Daja9a9#DaY.s#x#IaCamama##uazaz.G#.a..Z#Valarak#aaZ#Sa#ama0#U.C.CaYaY.NawaY#D#D#DaYaY.sbl.N.s.N.Na9a9a9a9#D#D#D#D#s.N.N#I.CaobybcbhaB#vaF.WaY.s.Nbl.s#D.na9#D#DaYafa9a9a9#L#L#L#L#ga2#ga2#gaaa2as#L#L#L#L#L#L#L#L#L#L#La9a9#D.7#D.na9#D#L#L#L#L#L#L#L#L#La2a2a2a2#L#La2#L#L#La2#La2#La2#La2#La2#La2a2#La2#La2#La2#L#L#L#L#L#L#L#L#Laj#L#Laja9.7.Eafaja9a9#sa9#D#D", +"#D#M#Dbl#D#M#DblaY.NaYbl.NawaYaYaY#M#D#D#D#D.7afaja9#Lajbp#Lbpbp#Lajbp#Lbpbpa2bp#g#g#g.j#g#gas#g.j#g#g#g#g#g#g#ga2a2aj.7a9#Da9#Da9a9#s#D.s#x#I.Ca0aO#uazal.Y.A.1a.aHaGaz.Ta#bma##SaFaFbgama0.C#x.s.NaY.N.N#s#D#Dblbl#Dbl#D#D#D#D#Da9#D#D.7.E.7a9#D.saY#x.Wa0.8.5#S#uaB#S.5.C#x#x.NaYbl#Da9#D#D.Na9a9.7a9#L#L#L#La2asa2aaa2#ga2a2#L#L#L#L#L#L#L#La2af#L#La9.7a9#Da9a9.7#La9#L#L#L#L.3#La2#L#L#La2#Lafa2#La2a2#La2#La2#La2#La2#La2a2a2a2a2a2a2a2a2#L#L#L#L#L#L#L#L#La2.7#L#L.7af.7a9a9a9bja9#D#D#D", +"aYaYaYawaYaYaY.saY#M.NawblaY#Daw#Dbl#D#s#D#La9.7#L#L#L#L#L#L#Lbpa2bpa2aj#ga2bpa2as.j#gas.j#g.j#g#gbp.j#L#gaja2bp.j#Laf#L.7#s.N#sbjb..N#Ibf.Waq.8#vaz#zaHbs.m.B.BauaSa#aFaFbgama0ambga#aFamam.W.CaYaY.NawaY#D#D#D#sbl#D#D#D#D.Nb.a9a9.n.7#La9.7b.#Da9.s.Nbo.C.Cava#aZaBaBaOaOb#ao#x#IaY#D.n#Da9#Da9a9a9#L#L#L#L#La2a2#ga2#ga2#ga2bpa2#ga2a2#ga2a2#La2af#L.7a9a9.7a9a9#D#L#L#L#L#Laf#L#L#La2a2a2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#L#L#L#L#L#L#L#L#L#L#Laf#L#La9.7.7a9.7a9#D#D#s#D#D", +"aYboaY#x#x#I#x#x#I#xaYawaY.NaYaY#D#M#Da9.7.7aj#L#L.E#L#Lbp#L#L#Lajbp#Lbp#Lajbpaj#gas#g#gas#gas.j#L#Lbp#Laj#gbp#L#Laj.7a9.7#Dbj.N.N.sbo.Caq.8#v#u#3adbe.A#Y#9.PbranaBb#amamaYaYaYa0am#vbmaOb#.C#x.s.N.NaY.N#Da9#D#pa9.na9#Da9.7a9.7a9.7a9.7.7.7.7a9#D#D.N.N#xbo.Cb#aOaF#vbma##vbmamam#xbl#D#D#D#Da9a9.7#Laf#L#L#L#g#La2bpa2#L#ga2a2bp#Lbp#L#Lbpa2#L#L#La9a9.7a9.7a9af.7af.7#L#L#La2#La2a2#L#La2a2#La2#La2#La2#L#La2#La2#La2#La2#La2a2a2a2a2a2a2a2#L#L#L#L#L#L#Laj#Laj#L.7aja9#L.na9#D#s#D#D#D.N.N", +"#x#x#x#I#x#x#IbnaYaY#IaYaY#MaY#M#D#D#Da9.7#L#L#L#L#L#L#L#Lbp.E#Lbpa2bp.j#L#g#L#g.j#gas.j#g.j#g#g#Lbpajbp#Lbp#Laj#L#Laj.7.n.N.N.sbf.C.Caoa#.w.ObB.u#.#oa8aMabalanaBa#a#a0#xaYaYaY.Wamb##Sa#b#a0.C#xaY.NaY.s#D#D#D.nbla9a9#D.n.7a9#L#L#L#Laj#L#L.7.E.7b.a9.s.N.N.s.Camam.8aF#vaZ#uaFb##xaYaY#D#D#sa9a9a9.7#L#L#L#La2a2#ga2#ga2a2#g#L#L#L#L#L#L#L#L#La2af.7a9a9.7a9a9a9#D#L#L#L#L#La2#La2#La2#La2a2a2a2a2#La2#L.3#L#La2#La2#La2#La2a2#La2#La2#La2#L#L#L#L#L#L#L.7#L#Laf#L#L#L.7a9.7bja9#D#s#D.N.saY", +".CaC.Ca0.Ca0#x.CawaYaY.Nbl.N#D#D#Da9.E.7aj#Lbp#L#L.7#Laj#L#Lbp#Lajbpaj#Lbpaj#Lbp#gas.j#gas#gas.jbpaj.7#Lajbp#Lbp#La9a9#D.N.s.N#x.WaqaO#ubk#zaHbA#Pbsbeab#a#ua#ambm.Fa0bn#xaY.N.s.Nbnb#bmaBa#aC.Caw.NaY.NaY#D#D#D#pa9a9a9a9.7a9#Laj.7#L#L#L#L#L#Lbja9bjbj#D.7.N.Nbo.C.Ca0a##vana7an#Sa0aYawbl#D#Da9a9.7af#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Laf#La9.n.7#Da9.7afa9#L.7a2#L#g#La2#La2#La2#L#L#La2a2#La2#La2#La2#La2#La2#La2#La2a2a2a2a2a2a2#L#L#L#L#L#Laj#Lafaj#L#L.Eaf.7#La9#s#D#DaY.NawaY#x", +".C#xa0#x.W#x#x#x#DaY#Dbl.sblaY.Na9#D#L.7#L#L#Laj#Laj#L#Lbp#L.7#Lbpa2#L#g#L#g#L#g.j#gas#g#g.j#g.jbp.7#La3#La3aj.7.7aj.7#s.N.N#Ibf.8aF.y#3ad.A.MaT.P#V#P#Tan.5.C#Ia0b#bga0#xbf#xbf.N#xa0bm.T#Sao#x#x.NaY#s.N#D#D#D#p.nafa9.na9#L.7#L#L#L#Lbpaja3#L.Ebj.E.7#sbj#sbjbf.s#xavama#aBana7aZbgbnaY#D#D.7.na9a9.7#L#L#L#L#L#L#L#Lbp#L#L#L#L#L#L#L#L#L#L#La2a2#L.7a9a9a9.7a9a9a9#L#L#L#g#La2#La2#La2#La2a2#La2#La2#La2#La2#La2#La2#La2#La2a2#La2#La2#La2a2#L#L#L#L#L.7#L.7afaj#L#L#L.7a9#LaY.Naw.Naw#x#x#I", +"aY.saY.NaY#DaY.N.na9.na9a9a9a9aja9a9a9a9.7a9.7a9#Laf#L#Laj#L#gaj#Lajbpaj#Lajbpaj#Lafaj#L#L.7.Ea3#L.Ebj#D.s.N#Db..7.7.N.N.WamamaOakaybs#Y.maDbaaHaga7#SamamaC.C.CaYamb#aFb##xaY#D.n.Nawa0#vaZaZa##xaw.N#Daf.na9#s#Da9a9a9.7af#Laf#La2#g#g#L#Lbp#L#L#L#L#L#L.7.7.7.7bj.N.Caoam#vaZaz.fanama0aY#Ma9aY#D#Da9a9.7.7#D#L#La2#La2#L#L#La2a2a2a2a2a2a2a2.7afa9a9#D.7#D.7af#L#L#L#La2#ga2a2a2a2a2#ga2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#L#L#La2#La2#La2a2a2#La2#L#Lafa9a9a9bja9#D#D#DaY.s.N#x#Ibn#x#x#x#x#U#x", +"aY.Naw#D#D#s#D#Da9a9a9a9a9afa9a9a9a9.Ea9a9.na9a9afajaf#La2#L#L#Lbp.7bp.7bp.7bp.7a2a2#Laj.7.E.7.E#L.E#D.s.N.Nbjbj.N.s.N#xa0aO#u#E#V#2....#KaD.YaGa7bmaFaFaoama0.CbnaCb#aOama0.N#D#Dbl#xa0bmaB#ua##x#xaY#sa9.7a9.7#D#D.7a9a9aj#L#L.j#La2bpa2#Lbp.E#Laj#L.E#L.7b.#Db.#D.s#xa0.8a##v.6azbhaOam#xaYbl#Dbl#Da9#Da9.7.7#La2#La2a2a2a2#La2a2a2a2a2a2#La2#L#L#L#D.7a9#Da9#L.3afa2#La2bpa2bp#g#L#g#La2#L#g#La2#La2#La2#La2a2#La2#La2a2a2#La2a2a2aja2#L#La2#Lafaj#La9.E#Da9#s#D#Daw.NaY#IaYaYaYawaYawaYaYaY", +"a9a9a9a9.na9a9.na9.na9.na9.na9a9a9.7a9a9.7a9.7a9#L#L#L#L#Laj#L#Laj#Laj#Laj#Laj#L.jbp#L#L.E#L.Ea3.n#D.Nbf.Cbo.Caobf.CamaOaBaz#EaraQ#.#o.Abzay.Gana#aFaFaOamam.C.Wbna0a0b#ama0#I.N#D#M#x.CaoaZbhaBa0#IaY#Da9#s.7a9#sa9#Da9a9#Laf#L#L#ga2#g#L#Lbpbp#L#L#L#L#L.7.7.7.7#D.NaY.Cambga#a7.6#ua#b#aoa0#xbl#D#Da9.7a9#Laf#L#La2#La2a2a2a2#L#L#L#L#La2#La2.7afa9a9#D.7#D.7afaf#L#La2#L#L#ga2a2#ga2#ga2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#La2#L#L#Laf#L#Lafajaf#L#Lafa9a9a9#Db.#D#DaY#DaY.N.N.N.s#D.N#D.N#D#s#D", +"aj.7aj.7.7.7.7.7#Da9#Da9a9a9a9.7a9#Da9#s#D#D.n#Da9a9.na9.7.7bj.7bp#L#L#L#L#L#L#Laj#Laj.E.Ebjb..N#MawaCaoaoama0.Cb##va7#a.Oaz#uaZaZanaz#e.6anaZaFaBaOaF.5amama0a0#xaCa0ama0a0#xaYbl.NaY#xa0#vaZ.lama0#x#Mbl#D.7#D#Dbja9.Ea9af#L#La2#L#La2bp.j#Lbp#Laj#Lbpaj.7bj.7#s#D.s#x.Wa0amamanaB.0a##va#bgamaYaY#Da9a9a9#L#L#L#Laf#L#L#L.7#La2a2#La2#L#La2#L#L#L.7a9.7a9#Da9#L.3#La2#L#L#La2bpa2#g#La2bpa2bpa2#La2#La2#La2#La2#La2#La2a2#La2.3#L#La2#Laf#L#Lafaja9a9.7#s#D#D#Da9.s.N.s.Naw#Dbj.7b..7b..7bjbj", +"#L#Laf#Lajafaj#Laf.7.7.7.7.7a9.Ea9bja9#D.7a9bja9a9.7a9.7a9.7.Ebjaj#Laj.7.E.E.7.E.7.E#D.s#xbo.C.WaCamb#a#.y.0.yaB.Gazazazbhbma#aFaFa#a#aZaBa#.5.5#SaFambgama0amam#x#xbna0a0aCa0#xaYawaY#Ia0aO.lbh#vb#bnaY#s#D#s#D#Da9#Da9.7ajaf#Laja2bp#g#L#Lbp#Lajbp#L#L#Lbj.7.7#Da9#DaY#x.CaCam.5a#aOa#a##va#a##xawaY#Da9.7#L#L.7af.7#La9#Laf#L.7af#Laf#L#Laf#Laf.7a9.7a9a9#D#Daf#L#La2#L#L#L#La2a2a2#ga2a2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#L#L#L#Laf#Lafa9a9a9a9a9a9a9bj#D#D#D#D#D#D#Da9#Da9#D#s#L.7#L.7#L.E#L#L", +"#Laj#Laj#L#L#L#L.7.n#La9aja9#L.7a9#s.7#Da9#Da9bj.n#Da9.7.E#Dbj#D#D#D#Da9#Da9#Da9.N#I#x.Wam.8.5#va#aBaP.G#a.U#4.Uaza7aZa#aFaFbmb#a#b#aFa#.8ama0ama0a0a0a0a0aC.Ca0#I#x#xa0b#a0a0a0aYaY.N.N#Iambm.lbmaFaobnaYaY#Dbj#D#s.7a9a9af#L#L#La2aj#ga2bp#Lbp#L#L#Lbp#L.7.E.7#D#D#D.saY#x.C.CaC.5am#v.5a#.0#va0bn#x.N#D#D.7.7a9.7a9.7a9.7.7a9#L#L#L.7af.7#L.7#L#L.7a9a9bja9#Da2afa2#La2#L#L#L#L#g#L#g#L#g#La2#La2#La2#La2#La2a2#L#L#La2afa2af#L#L#L.7a9.Ea9.7.n.7#Da9#s#D#D.N.N.sbj#sbjb..7bj#Laj#Laj#L#L.7#L", +"bjbj.7bj.7.E.7.7.7.7a9.7a9.7a9.7#D#D#D#D#s#D#D#D#D#D#D#D#D.N.s.N.sbfbobf#Ibf#xboa0.8.5#v.yan.w.G#TabaMa8#cabalaZa#aFa#b#b#a0b#b#ama0aoa0a0#x#x.CawaYaY#Ubn#xaYaY#x#x#x.Rbna0a0amaYaY#D#DaY#UaF#GaZ#S.V#UaY.s#Dbj#s#Da9.n.7#La2af#L#La2#g#gajbp#L#Lbp#L#L#L.7bj.7a9#s#Dbl.N#x#x#x#x.C.Cam#va#a#.0aF.8a0#x#x#D#D#Da9#D.7#Da9a9.7.7#Laf#L#L#L#Laf#Laf.7a9a9.7a9#D#Daf#La2#La2#L#L#L#ga2#ga2a2#ga2bpa2a2a2a2a2a2a2a2#Lafa2#L#L#L#L#Laf#La9a9#La9a9a9a9#D.7#D#D#D#D#D.s.Nbja9.7.7a9.E#L.7.7.7.7aj.7aj", +".7a9b..7.7bjbj#D.Eaf.7#L.7af.E#L#D#D#D#D#D#D#s#D#D#s#Dbj#D.s.N.N.C#x.C.C.C.W.C.Wby#vaBaz#T#4aH#..ga8bsbr.2al#TaZaFaFb#b#ama0a0a0.Cama0#xaY#x#x#xaYbl.NaYaYaYblaYbf#x#x#xbna0a0aobn#xaw#D.sa0.t#SbmbmaOa0#U.N#D#D#D#D#Da9a9#Laf#L#L#La2#L#g#L#Lbpa2ajbp#Laj.7.7.7#Dbl#DaY.N.N#Ibf.Naw.Cao.5.5a#a##va#ama0bf#D.N.N.7#Da9#D.7a9.7a9#L.7#La9#La9#L.7#L#La9.7a9bja9#Da2af#La2#L#L#L#L#g#La2bpa2bpa2#La2a2#La2#La2#La2#L#L#Laf#L.3#Laf.7a9af.7a9a9.7a9.7#D.n#D#D#D#D#Dbjbj#Dbj#s.7.E#La9.n.7.na9.7a9.7", +"#Laj#Lafajafaj#La9#D#s#D#D#D#DaYaYaYawaYaY.NaY.N.C.C#x#IaYaY#M.namav.8.5#v.0.w.G#aau#4#4#z#3.Ga7#Z#0aM.gaTayaZa0a0a0a0#xbn#x#U#xawblawaY#D#M#D#D#D#Da9#D#sblaY#Mbl#Mblbl#DaYaYaYa0#IaY.N.NaY#Ua0.t.tbm.Fam#x.Nb.#Da9a9.7af#L#La2aj#L#L#L#L#Laj#L.7#L#L#L.7#L.7af.7.7a9.7.n#D#D.NawaYaY#x.CaCamao.0a#aB.0.taFb#.VaY#Da9a9af.7#D.N#Laf#L#L#L#L#Lafa9a9a9a9a9.7.7.7a2#La2a2a2a2a2a2a2a2a2a2a2a2a2a2#g#L#ga2a2#ga2a2a2a2a2a2#L#Laf.7#pa9a9a9#Dbj#D.N.na9a9a9b.#D#D#D#D#s#D#D#D#s#D#D.n.7#L#L#Laj#L.7", +"aja2afaj#L.7.7#L#sa9#D#D#s#D#D.N#D#D#D.N.N.N.N#DaY.N#x#xaCamb#aF#SaZanaz.Galba.4.O#aaz#uaB.0aBan#Tbz.mab.2az.5#xa0bnaYaYaYaYaYaY#DaY.NaYbl#D#D#D#D.n#D#Dbl#Dbl.Na9bl#Dbl#DawaYaYbnaYaY#D.s.N#xaCbm.Fbm.tb#aC.N.Nbl.na9a9aj#L#L#L.7#L.7#L.E#L.7#L#L#L#L#L#L#Laj#La9aj.7.7.7#D.N#D#Dbl.N#xbn.Ca0ama##va##v#vbm#vaF#x#x#Da9a9#D#D#D#L#La9#L.7af.7#L#pa9afa9.7#D#La9#La2a2#La2#La2#La2#La2#La2#La2#La2#ga2a2bpa2bpa2a2a2a2a2a2#La9afa9.na9a9#D#D#Dbja9.nbj#D#D.NaY.saY.Nbl.sblaYaY.Na9.7#Laj.7.7#L.7", +"#Laj#L#Laja9.E.7#La9.Ea9#D#D#s#Db.#D#D.Nbo.Caqaq.bbnbga#aZaS.G#q#t.HaQauaGar#a#a#vaOaF.5b#.8#vaB.2.A.1aDaka#amaYaYaYaYaYaYaY#D#D#D#D#s#D#D#D#D#D.7.7a9#D#D#D#Dbla9a9.n#D#D#D#Dblaw#xaw.N#DaYaYbnb#aF.taOb#.C#I.Na9a9.7a9a9#L.7#L#L#L#L#Laf#L#L#L.n#L#L#L#L#L#L#L#La9a9.7a9.Ebj#D#D#D.s.N#x#x.W.Ca0amamaFa##vbmaBb#bnaY#D#D#Da9bjaf#L#L#Laf#L#L#La9a9a9a9a9a9.7.7a2af#L#L#L#L#L#L#L#La2#La2#L#L#L#L#L#L#L#L#L#L#La2#L#Laf#La9.7a9a9afa9a9bj#s#D.Nbl.NblaY.NaY#xaYawaYawaYbl.sbl#M.7.E#L.7#L.Ea3.E", +".7.7.E.7.Ebj.7.7.n.7a9.7#s.N.N#DaY.N#x.Cam.5a#aZaF#SaZa7arala6ay#W#W#kbhbmaFa#.5#x#x.CaCaoamaOaB#P#obsba#uam.C.NaYaYaY#D#D#D#D#Da9#Da9#D.7#Da9a9#La9.7.7a9bl#s#Da9a9a9bla9bl#D#DaY.NaYawaYaY#IaYa0aCb#.Va0a0#U.N#D#Da9.7a9.7aj#L#L#L#Laj.7#L#L#L#L#L#L#L#L#L#L.7#L#L.E#La9.7.7.7#D#D#DaY.s#x.C.C#x#Ia0aCama#a#aZa#.8a0#xaY#Da9af.7#Da9#D.7#Da9#Dafa9afa9.7a9#La9#L#L.3#L.3#L.3#L.3#Laf#L#L#L.3#L#L#L#L#L#L#L#L#L#L#L#L#La9.7a9a9a9#D.na9bl#DaY#s#x#x#x#Ia0#I#x#xawaYblaw.NaYaYaY.7#D.7.Ebja3.7.7", +"#Db.#D#D#s.N.s.NaY.Naw.N.NaYbo#xa0b#a#bmaS#aa6.Kbaba#a.faZaFb#amb#b#ama0.C#xbf#xbobf.NaY#xao#v#u.q.qaGanamaYaY#DaY#sbl#Da9.7#L.7.7.E.7a9.E#L.7.E#L#L#La9.nbjbl#Da9a9.7a9.7#D#D#DblaY#xaYaY#IaYaY#xbna0bnbna0aCbn#sbl#Da9.7af.7a9#L#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La9.7af.7a9aj.7#D#D.N.Nbo#x.Nbl#Ia0am.5aO.0aB.0b#.CaYbla9a9a9.7a9.7a9.7a9a9a9#pa9a9a9bj.7.7#L#L#L#L#L#L#L#L#L#L#Laf#L#L#L#L#L#L#L#L#L.7#La9#Lafa9bja9#D#D#D#Dbl#DaYaYaYaYaY.C#xama0.CaC.C.C#x#xboaYaY.NaY.N#s.N#D.N.s.NaEaW", +".N.N.s.N.Nbf#xbfaCa0a0a0a0amam.8aZbhazaGau#j.e.e.6ana#.5ambn#xaY#I#x#xbo.N.N#saW#x#Ibfaw#x.5aZ.G.q.KaBam#xaY.s#D.7#Da9.7.E#L#L#L#Laf#L#L#L#L#L#L#Laj#L#L.7#Da9#Da9.7a9#D#D#Da9#D#DawaY#IbnaYaY.Naw#xbnbnbna0bna0aY#D#D#Da9.7#L.7#L#L#L#La9#L#L#L#L#L#L#L#L#L#L#Laj#L#L#L.n.7.7.7#La9.E.7#D.N.N.N#saY.N#x.Wa0.5aF.0aZ#v.5a0aY#Da9.7#Da9bja9#D.7#Dafa9afa9.7a9#La9#La9#La9#La9#La9#La9#L.7a9af.7af.7#L.7.7#L.7af.7.7a9.7#D#D#D#D.N.saYaY#x#I#xbnbnaOaoaoamaCa0a0bn#Ibn#x#x#x#x#I#x#xaYboaY.N#xbf#x", +"#x#xa0.CaCa0aoa0aFa##v#vaZ#uaZaZarazazanbmaF.5a0.C#x#x.N#D#D#D#D#D#D.Nblbj#D.N.sbf#x#I.CbgaBaz.2baazaF#x.n.7#Dbla9.7.7#L#L#Lajbp#L#L.E#La9#L.7#L#Lbp#L#L.7#L#D.E#L#L.E.7.7.7.7#Dbj.N#xbna0#I.N#DaYawbna0bnbn.V#U#D#D#D#D#D.7a9.7#Laja9#Laj#L#L#L#L#L#L#L#L#L#L#L#La2#L#L#L#Laf.7#L#L#La9.7#s.N.N.7#D.N.N#x.CaCaq#vaZaBa#aF#xaYbl#D#D#D#D#D#D#D#Da9a9a9a9a9a9.7.7#L#La9.7a9a9#L#L#La9a9a9.7a9.7#L.7af.7af.7a9.7.7#D#D#D#D#D.N.NaY#x#x.Ca0b#ambgamaOb#aCa0.C#I#xaYa0a0#xbn#x#xbna0aCa0a0a0ao.CaCaq", +"aoa0aoaO.5.8aFaO#u#uaSazaG#3araza#a#amam.C#x.s.Nafaf#La9bjaWbfbf.N.NaY#xawaYaYaY#x.C#xaCamaB#aaT.GaF.C#D#La9#L#D.7#Laj#L#Lbpbp#Lajaf#L#La2#L.j#Lbp#L#Lbpa9.7#Da9.7#La9#La9.7a9.7#Dbl#xaCbn#xaY.s#D.N#Ubnbnbnbna0bl#D#D.7a9.7#L.7a9#L#L#L#L#L#L#L#L#L#L.7#L#L#L#L#L#Laj#L.7#L#L.7a2.7#L.7.7#D.N.Nbj#D.s.N.N#I.Ca0aFaZaBaZ#vam#xaY.7#Da9#D.7#Da9#Dafa9afa9.7a9.7a9#L#Lafa9#La9#L#La9af.7a9a9a9afa9a9#L.7.7a9#L.7af#D#D#D.N.N.NaY.s#xama0.8aF#Sa##va0a0a0#xbnaYaYawbn.WbnaCbnaCa0aCaFb#aO.5aOaF.8aF", +"aZ.ya#amaoaFaB.Taka6aGaraBaFa0#xbnaYaYaw#D#Da9#D#L.Eaf.7a9aj.7.7aja9.n.7#D#D.sbfaw.N.Wam#v.w.Ga7.C#IaY#D#s.7.n#Laja2#L#ga2#ga2#g#L#Lajafaj#L#L#Laj#L#L.na9a9.na9a9a9.na9a9#L.Ea9a9#saYaY#x.C#x#xaYbn#x#U#x#xa0aCbn#D.7#L.7a9a9#paj#L#L#L#L#L#L#L#L#L#L#L#g#L#L#L#L#L#L#L#L#L#L#Laj#Laf.Ea9.7.7a9#Da9#D#D#DaY.NawaY.pa#.0.0a#ambn.N.N#D#D#D#D#D.7a9af#L#L.7#L#L#L#L#L#La9a9.7a9#Da9a9#Da9bja9bj#D#D#D#D#D#D#D#D#D#s#D.saY#xbn.8aFaZaBaZa#aFama0aqaC#x.N#MaY#x.Ca0aFb#b#amamb#.5aFaoaOaFaOa#bmaZ.y", +"aZa#aOa##v#vaB.T#4#z#a#uaFa0aC#xaYawaYbl#Da9#Da9.7a9.7#L.7a9.7a9af.Ea9.7#s.N.N.N#D#Ia0.8a#bkaraZ#IaY.s#D#Da9.7#Lbpa2bpa2#g.j#ga2ajaf#L#L#Laja2#Laf.7#L.7a9.7#Da9afa9a9a9a9.7a9#La9#Dbl#x#x#I#x#xawaY#U#xbn#Ia0.CbgaYa9#L#L#Lafa9#Laj#Lbp#Lbp#Lbp#Lbp#L#ga2#g#La2#L#L#Laj#Lbpaj#L#L.7#La9.7.7a9.7.E#D#D#D#D.saY.N#Ua0#va##S.0aOamaY.N#D#D#Da9#D#Dafa9a9af#L#L#L.7af#Laf#La9#Da9.7a9a9.7#D#D#D#D#Da9bja9a9#D#D#s#D.N.N#x.Ca0aoaF#vaZbmbmaOa0.W.C#x.C#xbl.NawaY.CamaCamaCamamambgamb#.5aOa##Sa#.yaZ", +"#vaFaO#v.ybmaZazbaauazb#a0#x#xaYaYaY#D#sa9#D.E.7aj#L.7aja9aj#L.7aja9.n.7#D#D.sbfaY.WaCam#u#3a7aFaYaY#D#D.n.7ajafaj#gaj#g#L#g#Laj#L#Lajaf#Laf#Laj#L#L#La9a9#Da9a9.na9a9.7.n.7.7a9.na9aY#x#x#x#x#xaYaY#x.R#IbnbnaC.t.VaYa9.7aj#L#L#Lbp#L#Laj#La2#L.j#La2#g#g#g#gajbp#Lbp#L#L#L#Lbp#L#L#L.7a9.7.7.7a9#D#s#D#DaY.NaYaYa0ama#a#.yb#a0.N.N#D#Dbj#D#Da9a9a9.7a9bja9.7.7a9a9a9#D.7#D#D#D#D#Da9#Da9#D#D#Da9a9.n#D#DblaYaY.8b#.8aOaFaOaFaOb#bgama0#x#x#x.N#U#x#I#x#x#xaoama0bna0bnaoam.5amaOaFaFaF#va##vaZ", +"aOaOaF#va#a#az#faS#ubmb#a0#xaY#Dbl.n#Da9a9.7#L#L#L#L#L#L#L#Laj#L#L.Ea9a9#s.N.N.s#x.Wb##v#Ebk#va0aw#D#D#Da9#L#L#Lbpa2#L#ga2#ga2#g#Laf#L#L#Laj#Laf#L.7#L.n.7#D.na9a9a9a9a9a9.7a9#La9#sbl.NaY#xaYaYblaYaw#x#x#x.C.C.Fb#bnbl#Da9.E#L#Laj#L#Lbp#Lbp#Lbp#Lbp#L#g#L#g#L#Laj#Lbp#Lbp#L#L.7#L.n#L#L.7af.7#Da9#D#D#D.NaY.saY#Ibn.5a#a#aFambf#x.NaY#D#D#D#Da9a9a9.7a9.7.7#L#D.nbj#D#D#D#D.Na9b.bl#Daw#xaYaYaYaYaY#Ia0a0aoam#uanaBa##vb#bgb#bnbnaYaYaYaYblaw#x#x#x#Ua0.Wa0a0.W.C.Wama0ambg.5aFaFa##va#a##va#", +"b#ao#vbmaB#uaz.Gb#b#ama0#xaw.N#D#Da9a9a9.E#L#Laj#L#Laj#L#L#L#L#L.Ea9.n#D#D.N.N#x#Iao.5#u.Oazam.C#Dbl#sa9ajaf#La2.jbp.j#L#gajbpaj#Laj#Lajaf#L#Laj#L.n#La9a9a9a9#D.na9a9.Ea9.n.7a9a9#DaYaw#x.sbl#D#sblaYbl#I#x#Ua0b#bgb#bn#D#D.7#Lbj.7.7.7.7.E.7.7#L.j#La2#g#L#La2bp#L#Laj#L#Laj#L#L#L#L.7af.7.7.7a9.7#D#D#s.Nbl.NaYaY.CaCby#va#.8#xbfaY.N.s#D#Dbj#D#D#D#D#D#D#D#D#D#D#D#D.Naw.NaY#D.NaYaw#x#xa0aoamamaFaF#v.0bbanaBaZ#vaFb#am#x#xaYaYaYaY#IaY#D#D#x#x.Ca0avamama0.C#x.Ca0aoamaFa##uaZaBaZ.y#S.0.y", +".8aOa##Sazar#ua#a0am#x#x#x.N#D.7.na9#L#L#Laj#Lbp#L#Lbp#L#Laj#Laj#La9.7.n#D.sbo#x.Wao#v.f#f.ya0bf#M#D#Da9a9#L.ja2#La2bp.j#L#ga2a2#Laf#Laf#Laj#Laf#L.7aj#Da9b.bl#Da9.na9a9a9a9.7.n#D#MaYbfaYaY#Da9#D#D#Daw.NaY#x#Ib#b#bg.VaYbl#s#L.Ebj.7b..7.7.7.7#Lbp#Lbp#L.jbp#L#L#Lbp#Lbp#Lbp#L.7aj#La9.7a9#L.7a9#s#D#D#DaY.Naw.N.s.CamamaOa#a#.W#xbf#xaY#D#D#Da9#Da9#Da9bj#Dbj#D.N.Naw.N#x#xbfaYaw#x.Ca0a0aFbma#aBaZbbaZ#uaZ.0bgb#a0am#x#x#xaYblaY#MaYaY#Dbl#DaY#xaCamamaoaqaC.C.Wamao.5a#a#.yaSazaZ#uaZ.yaOaF", +".5aF#Sbhaza7aFa0a0bn#xaw.N#D.7.7af#L#L#L#La2#L.j#g#Lajbp#Lbp#Lbpaja9.n#D#s.N#I#I.WaF#uarazaF.W.Nbl#D.n#Laj#La2a2aj#g#L#g#L.jbpaj#Laj#L#Lajaf#Laj.7afa9.na9#D#D#Ma9#p#s#D#sa9.na9#DblawaYaw#Da9a9#D#D#saY.Naw#x#xaCb#.VaC.V#xaY#Dbj.nbja9bj#s.7.7aja2#L.j#Lbp#La2ajbp#L#L#L#L#L#L#L#L#L.Ea9.7.7a9#D.7#D#D#D#DaY.N.N.N#I.CaoaFa#aB.C#x#xbf#x.N.NaY#Dbl#D#D#D.N#D.NaY.saYaY.C.W.C.W.Caqa0.8a#aZaBan#u#uan#Sa#b#ama0bnaY#xaYaY.NaY.N#s#DaY#DblaY#Dbl#I#xam.8.5aOam.Cama0aoaFbmaBbha7#a#ea7an.y.yaF.8", +"bc.y.wara7b#a0aoaYaYaYbl#Da9.7.7#Laja2#L#g.j#g#ga2bpa2bp.jbpaj#Laf.Ea9#s#D#I#I.C.WaOaz#EaZb#.C.N#sbla9afafaj#L.j#L#g#L.jbpa2bpa2#Lafajaf#L#L#Laf.E.7.n#Da9#D#sbl.n#D#M#s#D#s#D#s#DawaY.NaY#Da9.n#D#D#D#DaY.NaY#I.CaCam.Vb##U#xawa9bj.7b..7bj.7bj#Laj#Lbp#La2#L#Lbp#L#Lbpaj#Lbpaj.7#L.7af.7a9.7.Ea9#D#D#s#D.N.saYb..Nbf.Wa0aF.0#ua0.W.C#Ibfaw.NaY#saY.N.N.N.N.N.N.N#xaY#I#x.W#x.C.Wam.8aZ.waz#ubha#aFaFb#ambn.bblawaY#MaY.N.s.N.N#D#D#D#DaY.saY#I#xaCam.8aFbyaoaCaoamama#a7azararaya6.G.Gaz#u#v.8", +".J.far.laobn#xaY#D#sa9#D.7a9aj#L#L#L#L#L#Lbp#Laj#g.j#ga2#L#L#Lbp.na9.7#s.N#I.Caobh#EaBaCbn.s#IaY#Ma9.n.7#L#L#L#Laj#Laj#L#Laj#L#L#L#L#L.7aja9.Ea9bl#M#D#M#DblaYblaYawaYaYawaY.NaYawaY#Mbl#D#D#D#Da9.n#D#s.Nbl.saY#x.RaY.N#xa0aFbm#IaYaY.N#s.7.E#L#L#La2#L#L#Lajbp#L#La2#L#L#L.7#La9a9a9.7#L.7.7.7#Da9#D#D#DaY.N.NaYaY#Ia0.5.8a#an.0.5bn#xbl.N#x.C#Dbl.sblaY#I#x.W.R#Ibna0aOa##vaZazararaz#ua#aFaO#x#I#x#Ibn#x#xaYaYaY#DblaY#Dbl#Dbl.NblaY.NaY#x#xaoaobnaY#xaCa#.0aOaOaOaFaFaFaFaF.l.Ta7bh.G.G#q#e", +"araza7aFam#xaYawa9#Da9a9a9#L#L#L#L#Lbp.j#L#La2#Las#ga2#gbp#Laj#L.7.7.n#D#M#xaCaFbk#iaOaC#xblaY.Na9a9a9afaja9aj#L#L#Laf#Laf#Laf#Lajafaja9#L.7a9.Ebl.n#D#M#DawaYawbn#Ubn#I#x#I#xawaYawaYaY#D#s#D#D#D.n#D#DaY.s#x.N#U#IawaY#xbna0aF#x.W#xaw.N#D.7b.afajaf#L#Lbp#L#La2#L#L.E#L.7a9.7a9a9.na9.7a9.7.7#D#s#D#D#D.Nbl.Naw.N#x.CamaF.0.y.yaF.CaYaw#x.Caq#Ibn#x#x#x#xbna0aoamaF#vana7.wazaZan#uaZaOamamamaY.RaYaYawaYaYaYaYblaY#D#Dbl#DaY#DblaY.N#xaY#I#xbnbnawaYbnam#va#ama0a0aoamamaoam.taFbmaZ.6ar.2#4", +".faBb#a0aY#xbl#Da9a9#D.E.7#L#L#L#g#ga2#g#g#g#g#g#g#g#ga2#L#L#L#L.n.7a9a9.N#Iam.8#f.Gb#bn#UaYaw.Na9.na9.7af#Laf#Lajafaj#Laj#Laj#Laf#Laf#L.na9a9#D#Mbl#M#DawaYaw#x#I#U#x#U#Ibn#I.NawblaY#s#D#D.N.sa9#s#D#M.NaY.s#xawaY#D.s#D.Nbnama0a0aC#x#xbl.NaY#La9#L.E#L#L#L#Laj#L#L#La9.7aja9a9a9a9#D.n.7a9.7#s#D#D.Naw.N.NaY#Dbl#I#xaC.5#va#aBaFa0aC.C.Caoa#ama0a0ambgaF#va##uan.w.wan.wanaZ#vaFb#ama0a0#x#xaYbfaY#xaY.Nbl.Nbl#D#D#Dbl#D#D#D#DaY#saY.N#x#x#xaYaYaYaY#Ia0bg.5bn#xbn#xbna0a0amaCb#ao.t#SaZar#a", +"aFama0aY#xaY#Da9#D#Da9a9#L#L#L#g#ga2#gbpa2bpa2bpa2#ga2#gbpajbp#L#Da9.7#saYaY.W.5#EaraFa0#U.NblaYa9a9a9ajaf.E#La2#L#L#L#Laf#Lafaj#Lafaja9#D.n#D#D#s#DblawaY#I#x#Ibnbn#I#U#x#IaY.N.Rawbl#D#D#D.s.N#D#D.saY.saY#I#x.N#s#s.7bj.N#xa0aob#amaoa0#I#xaY#D.na9.7a9bpaj#L#L#L#La9.Ea9#D#D#D#D#D#D#D#Dbj#DaY.Nbl.N.N#x#xbfaw.NaY#xama0aOa#aBa#bgama0.5a#.0aFaOaF#SaZan#ua7bhazaBbhaBa#aFb#b#aCbnbn#x#xaYaw.Nblaw#D#Dbl#D#D#s#D#p#Da9#D#D#Dbl#DaY#x#xaw#x#xaY.NaY#x#x.C.C.CawaYaw#xaw#x#Ibn#x#Ua0a0amaFbmbm", +"bn#xaYaYaY#Ma9af.7.n#L#L.7#L#ga2bp#ga2#g#ga2#ga2#ga2#L#L#L#L.7.7#s#D#s#D.N#xamaoaS.OaBam#xaYaw.N.na9a9#Laf#L#La2ajafaj#L#Laj#Lafaf.na9a9a9bl#D#Mbl#saYaw#x.b#x#x#U#Ibn#I#xawaY.saYaYbl#D#D#D.N#D#M#sblaw.N#I#x#I#D#sbj#Db..N.N.Camamb#am.pa0a0bn#D#Da9.7.7aj#Lbp#L#La9.7a9a9#s#D#MaY#D#Dbl.saY.N.N.N.s#x#xbf#I#x.NaY#I.CaCamam#vaBbm#SaF#va#a#aB#ubh#uanaBaBbmaZ.FaFb#b#a0aCbn#I#x.RaYawaYawaY.N#D#D#D#D#D#D#D#Da9#Da9#Da9#Da9a9.saYaw.Naw.N#xaY.N#x#xaY#xaC#xaYblaYaYaYaYaYaY#xaYblaY#Ua0a0.Vbn", +".NaY#D#Da9a9a9#La9.7.7#L#L#g#L#ga2bpa2bpa2bp#gbp#g#Lbpaj#L.7.Ebjbj#D#Dbl.s#xaoa##TalaBam#x.NaY#Da9a9a9af#L#L#L#L#L#Lafaj#Laf#Lajafa9a9#p.n#D#M.NblaYaYawaY#x#I#x#Ibn#U#Ibn#I.NaYawaY#sbl#saY.s.N#sbl#s.NawaY#I#x#I.N#D#s#D.N#Ibnaoa0#Ia0a0b#aoamaw.N#Da9.7#L#L#L.7.n#L.7#s#DaW#DaYaYaY#I.NaY.N.N#I#x#xbf#x.C.C.C#x#I.Ca0amama#a#a7azaza7aZaB#uan#uan.laZ#SbmaFaF.V#Ubn#UaYaYawaYaYawaY.NaY.N#D.N.n#Da9#D.n#D.7a9#Da9bj.nbja9#s#DblaY#D#x#xaYaY#x#M.N#x#I#x#x#xaY#Dbl#DaYaYaY#xaw#x#IaYaYaY.baYaY", +"#D#D#Da9a9#Lafaj#L#L#Laj#Lbp#ga2#g#ga2#g#ga2#ga2#g#L#Lbp.7.7.7#D#D#s#D.saY.C.8aB#4#zaZa0#xaYaw#Da9.na9#L#L#Laja2#Laj#L#Lafaj#L#L#p.n#pa9blblaYaYawawaYaY#I#x#x#Ibn#Ibn#I#x#U#x#IaYblaYaY.Nbl.saY#s#Daw#Dawbf#I#x#I#x.s.N.s#xa0aC.C.Ca0.CaCa0ambg#x.N.s#D.7aj.7aja9.7a9#sa9#D.s.NaYawaYaYaY.NaYaYbf#x.C#x.W.C.Caqavaqa0ao.5#va##vaS#W#aazazanbm#SaFaFa#aFaOaFbgb#aCbnbnaw#x#x.N.N#sbl#D#s.N.N.N.N.7.7.7.7.7.7a9.7.7.7a9.7a9.7.7.7aY#DawaY.NbfaY#x.NaY#x#x.C.WaY#D#M#DaY.NaY#x#x#x#x#x#xaYaY#Da9#D", +"a9.7.7.7afaj#Laf#L#L#L#La2#La2#gbpa2bp#g#L#g#L#g#Lbp#L#L.7.7.7bj.s#D.NaY.Nao#v.QaD#za#am#xaY.N#D#pa9a9ajaf#Laf#L#Lafa2#La2#Lafaja9#p.na9#MblawblawaYaY#I#x#I#x#x#Ubn#Ibnaw#x#IaYaYawaY#M.saY.N.s#D#M#D.s.Naw#x#I.W#x#I.s#x.W#Ua0.Cava0.W.Ca0a0a0#I#IaY#D.7#L#L#La9.E#D#D#D.N#D.sbnbn#x#x#x#x#I#x.C#x.W.Caqamavam.C.5.5aFbya#.y.0.Gakar#e.TaBaFaF.5aFaOamb#a0aoambn#Ua0.C.Ca1bfbf.Nbl.N#D.N.N.N.Na9aj.7af#Laf#L.Eaf#L#L#L.7.n.7.n#DaYblbfaYaY#x#x.s#xbo#x.C#x.Na9#D#DaY.N#x#IaY#xama0bn#x#D#D.7#L", +"#Laj#L#L.7#L#L#Laj#L#Lbp#g#g#g#La2a2a2a2#ga2#L#L#L#L#L#L.7a9.7a9#Da9.s#Iama##u#.bA.faFaYawaYaYbfa9a9afa9#L#L#Lajafajafafajaf#Lafafafa9a9bl#Dbl#s.RawaYaY.R#U.R#Ubn#Ubn#Ibn#U#x#x#M#D#D#Daw#D#s#DaYaw#s.n#D.s#I.Caoaoam.8.5aO##am#va#byaFbcaqav.CaFaOaFaC#x.N.saW.N#D.N.s.N#I#xbn#U#xaw.R#x#xbna0#U.Vamb#b#aFa#bmaBaZ#vaZ#v.0aB.yaFaO.5bgamamamaobn#U.C#Ua0aCbnbnawaY#MaYblaY.saY.7.n.7.na9.E.7.7#La9#Laj.7#L.7af#Lafaja9a9a9#Da9.Nbl.Naw#x.s#xaY#x#xbn#x.baYaY#Da9.na9#DaY#x#x#x#IaYaY#sbla9.na9", +".7af.7#Lajaf.7#L#Lbp.j#L#g#L#g#ga2#ga2#g#La2#L#Laj#L#L.7a9.7.n.7#sbl.NaYaoa#azbAa6a7am.RaYaYaY#xafa9a9af#Laf#L#L#Lafaj#Laf#Lafajafaja9.n#D#M#DaYaw.R.RaY.baY#UaY#Ubn#UaYbn#x#I#x#M#D#M#D.s#D#s#D.s#Dbl#s#s#MbfavaCbgaCaoaC.5ao.5#vaOaOam.8.8amavb#b#aoaC#xaw.N.N#s.s.NaYaw#xbnbnaCa0a0a0amamaoaFaFaFa#.yan#u.G.6aBaBbmaO.5b#.5b#amaoa0a0amaCa0a0aY#xbn#Ibn#Ibn#IblawaYaY#M.Nbl.N.n.7a9.7a9.7afa9.7aj.7#L#L#L#L.7#Laf#La9a9#D.7#D#s#DaYaY.NaY#x#xbn#x#x#U#xaYawaYa9a9a9bl.NaY#x#x#xaYaYbl#Da9.7a9", +"#L#L#L#L.7#L#L#L#La2#L#L#ga2#g#L#ga2a2a2#ga2#L#L#L.7#Laf.E.7.7#DawaY#I.CaoaBazbaaSa#.VbnawaYaY.N#pa9afa9a9#Laja9af#Lafafajaf#Lafa9#pa9blblbl#MaYaYaYaw.R#x#UaYbnaw#x.R#I.R#I#x#xaYaw.NaYaw.N.N.s#D.s.saw#I.CaoaoaO.F#vaOaO.8#vbc#va#aO#vaO.5.8aCaFaO#SaOaOao#I#x#MaYawbnbnaCa0b#a##va#a##vaZaZ#uazazbh.Galay.2alaFaOaFamaCa0aC.C#I#x#x#I#x#xaY#IaY#I#x#I#x#x#I#xbl#D#M#D#D#s#D#D.n.7.n.7.n.7.7.Eaf#L#L#L.7aj#L#Lajaf#La9.7a9a9.7bl#DaY.NaYaY#x#xaCa0#x#xbnawaY#D#Da9#D#DawaY#x#I#xaYaY#D#Da9a9a9", +".7#L.Eaf#L#Laj#L#L#L#g#L#g#L#g#g.ja2a2#ga2bp#L#L#Laf#L.7.7a9.7#Dblaw#x.W.5az#aalaZb#a0bnaYaY#DaY#p#Da9afa9a9#L#Laja9aja9#La9aja9.na9#sbl.n.NblaYaw.R#xawbnaY#U#U#x.R#Ibn#I#x#I#xawaYaY.saY.s.N.N.s.saw.W.Waobc.yaBaB#u#S.y.y#va#aB#u.Qaz.waBaZ.yaZaB.0aBaB#vaO.5bn.Vb#am#Sa#aB#u.wbhazazbh.waz.GarazaSaz#a#a#a#ea0a0#Ubn#x#I#x#xaY#MaYblblawbl.NblaYaYaY#U#IaYaY#D#M#D#s#D#D.n#D.7a9.7a9.7a9.7a9#L#L.7af#L.7af.7af#L#L.na9a9bja9#D#D#DawaYbfaw#xbna0#x#UaYaYaYbl.n#Dbl#DaY.N#xaY#xaYaY#D#Da9a9.7", +"#L#L#L#L.7#L#L#L#g#ga2#g#g#ga2bpa2#ga2a2#ga2#L#L.7#Laja9#La9#sa9.NaYaY.Wambk#zaraFamambnaYblaYbl#Dbla9a9.7a9.7a9a9.7a9a9.na9a9a9#Da9bl#DblawaY.N.RaYbnbnbn#Ubnbn#I#U#x#x#x#I#x#Ibl.Naw.NaYbf#I#x.s#x.WamaO.y#uazal.U#z.U#T.G.GaP#Tal#z.U#3al.Ualal#T.G#T.G#e.w.wa7#ua7a7aS.G#e#TaS.w.wanaz.wazaS#vaOa##va#aFaFam#UaY#xaYaY.NaY.s#D#D#D#s#D#D#D#s#D#saY.saY.NaY#sbl#D#M#D#D#Dbj#D.n#L.E#L.E#L#L#L.E#L#Laj#L#L#L#L#Laf#La9.7#Da9#D#D#DblbfaY.N#xaY.C#I#x#xaYaYaY#Dbl#D#D#Dblaw.NaYaYaYaY#D#pa9#La9", +"#L#L.7aj#L#L#L#L#g#L#gbpa2bpa2#ga2asa2#g#La2#L#L#L#L#La9.7.7#D#sbl.N#Ia0#vaz#z#eam.Va0bnaYaYaYaY#Dbl#D#Da9a9.7.7a9a9a9.7#Da9#sa9bl#sbl.sbl.NblawaYbn#Ubn#Ibn.C#Ubn#x#U#x#I#x#IbfaYaw.NaY.N.saYboaYaCam.y#u#aau#4aH.4#..4aHbrbw#0.2bw.2aT.2ay.YaH#4#zal.o#T#Tal.U#aar.G.Ga4aPa4a4.ya#aZ.ya#a#a#aOa0bnaCbnaCbn#I#xblaYaY.s#D#sa9#Da9.na9a9a9.na9a9#D#D#D#D#s#D#s#D#D#s#D#D.n.7.E.7.n.7#La9#La9.E#Laf#La9#L.7#L.7afaj#L#La9a9.n#D.7bl#D#DaY.NaY#x#xbn#x.R#xaYaYaY#DaY#Dbl#D#D#DaYaYaYaYaY#D#Da9a9a9", +"#L#Laf#L#L#L#L#La2#ga2#g#ga2#g#La2a2#ga2#ga2#L#L#L.E#L.7.n.7a9#D#D#I#xaoby.w#zaSa0aCa0bn#x.Rblblbl#D#D#D#D.7a9.Ea9.7a9a9.n.7a9a9#sbl#DblaYaw#x#x#xa0#xa0a0a0aCa0#I#U#x#I#x#I#xawaY#x#I.Nawbf#x#IaCbgaBaza6aT#P.uaybaay#3#aar.Gazaz.Gazaz.Gar#aa6.w#u#uaBaZaB#uazazazaS.0#S.0aFa#am.5aoa0am.Wam.C#I#x#x#I#x#I#xaw.N.N#s.N.N#Dbj#s#D#D.7.7.7#D#s.7a9.Ea9a9a9a9a9a9#s#p.na9bj#Dbjbj#Lajafaj#L#L#Laf.E#L#L#L#Laj#L#Laf#Laf.7a9bja9#D#D#DawaY#x.s#xaY#x#x#x#IaYaYawaYbl#D#D#DblaY#s#DaYaYaw#D#Daf.7af", +"#L.7#L#L#L#L#L#L#L#gbpa2bp#g#L#La2#ga2a2#g#L#L#L#L#L.7a9#L.7#D#saY#x.C.8#va7albh.Ca0a0bnaY.RblblaY#Dbla9#Da9.7.7a9a9a9a9a9#D.n#Dbl#Dblaw#DaY#x#IbnbnaCa0#Ua0aCa0.CaC#x#I#x#I#Ibf#x#I#x#I#x#Ibo.C.paOa7#aay.K.K.K#Ear.faZa7#uaBaB#vbmaBaZa7an.TaZaOaF.FaFaOb#b##SaZ#va#aOama0.W#xavam.C.W.C#xaw#x#x#Ibfbf#xbf.N.N.saYaY#D.N.E#D.7a9#D#s.7#s#D#D#sa9.7a9.7.E.7.Ea9#s#D#s#D#s#D.Ea9.Eaf.E#Lajafaj#L.7#L.n.7#La9#L.E#Laf#L.na9#D.7a9#Dbl.NaY.NaY#x#x#x#U#x.RaYaYaYaY.N#xbl#D#D#D#DblaYaYaYbl#Da9a9.7", +"#L.3a2a2a2a2asa2#ga2a2#ga2a2#ga2#ga2#ga2a2#ga2#L#L#Laj#L#L.7b..7#x#I#x#xaC#uar#e#Sa0.CaYaY#DaYaYa9#p#pa9a9a9a9a9#s#D#sbj#D#D#D#D#saYaY.Naw#x#x.Ca0aoa0a0aCbn#Ibnaw#U#U.CaCamaCaCaw#Mbn#UbnaCbgaoaZanaral.2alaPan.y.0.yaB.0a#a#a#.8aF#v.0#u.0#v.5aCam.8amaOamaoam.F.tbg#x.C.C#xaY.NaY.saY.Nawbf.N.N.N#D.s#D.N#D.Nbl#sbl#s#D#D#D.7.Ea9.7a9.7a9.7.7a9#s#D#D#Da9#D#D.na9.na9.na9a9.na9a9a9.naf#Lafaf.E#L.7#L#L#L#L#Lafaj#L#L#La9.na9bl#MblaYaY.baYaYbl#Dbl#DaYawaYaY#M#D#DaY#Dbl#D#DaYblbl#D#p#Dafa9", +"afa2#La2a2#gaa#ga2a2bpa2#L#g#L#ga2a2#g#L#g#La2#g#L#L#Lbpaj#D.7bjaY.N.N#Iao#u#aayaFa0bnaYaYblaYaY#pa9a9blbl#D#M#D#Da9#Da9#Da9#s#Dbl#D#MaY#x#x#x.Wama0a0aCa0a0amao#Uaobg.8am.8amama0bgb#.8aFa#.0aZ#ua7#uaS#uanaBa#.8aFaOamaOamaCamb#ao.5a#.0#vaF.5a0a0aC.Ca0.Wa0am#ybgaC#xbf#I.NawaY.NaY.saY.NaYaw#D.s.N.N.N.s.N.sbl#sbl#D#D#D.n#D.7a9.7.n.7.n.7.n#D#D#s#D#s#Da9#Daja9a9.nafa9aja9aja9aja9af#L.n#L.7af.Eaf.E#L.7#Laf#Lafaf#La9.7a9blblblawaYaY.baY#Mbl#DaYaYaYaYaY.NaY#Dbl#s#Dbl#D#MaYa9bl#D#Da9a9", +"afaf#La2a2a2#ga2#ga2a2#ga2a2#ga2bpa2a2#ga2#ga2#g#L#g#L#L#Lbj.Ebjaw#D.s#xaoana6abaOam#xaYaY#DaY.N#pa9#p#sbl#Dbl#D.n#D.na9.na9a9a9#sbl#DaY#I#x.Wbnb#bgb#amamao.8aFamaO.yaZ#u#u#S#vaZan.yaZaZ.6aSa4aBaZbma#aF.5ama0aCa0.CaCa0a0a0.Wbna0a0aoam.5aoa0#I#x#xbn#I#x#x#x.p.Vbn#x#I.NaYbl.N.NaY.N.NaY.N.NaYaY#DawblaY#DaYblaYblawaY.s#D#D.na9a9a9a9a9a9a9a9#D#D#Da9a9bja9a9.nafa9.Ea9a9.na9.na9.n#Lajaf#L.n#L.7#L#L#Laj#Lajaf#L#Laja9a9a9blblblaYaYaYaYaYbl#D#MblaYaYaYaYbl#saY#D#D#D.NaYblaYbl#D#p#Dafa9", +"afajaf#La2a2a2a2a2#g#L#g#L#g#La2#ga2bpa2#La2bpa2aj#Lbp#Lajbj.7#s#D#Daw.C#v.GaTaD#vb#a0bnawaYaYaYaYblaYaYaYawaYaw#D#D#D#D#D#D#s#Dbl#saYaw#xa0a0a0bgamaOamaOa#a#a#.yan#u.G.Gaz.w.w#u#uan#uan.w.6.GaFaOaFaoaobn#I#x#I#x#I#x#x#I#xaY#x#I#xbn.CaC.Ca0#x#x#IaY#xawaYaw.R.bbnawblaYaw#DaY.saY.Naw.N#M.N#D#s#DaY.N.saY.NawaYaw#Dbl#DaYaY#D#s#D#s#D#s#Db.a9#D#s#D#s#D.n#Daf#L.na9aja9aja9afa9aja9afaf.7af.7#La9aj.7a9#L.7afaj#Laf#La9a9a9.na9blblaYawaYaYblbl#Dbl.saYaYawblaY#D#Dbl#DblblaYblbl#Dbl#Da9a9", +"a9a9#L#L#L#L.jbpa2a2aja2#ga2#ga2#L#ga2#ga2#ga2#L#g#L#L#L#Lbj#s#D#saw#Iaq.y#3aH#Pa#bga0#UaYaY#xaYaYawaYaYaY#x.N#x.Naw.Naw.N.NaY.s#DblawbnaCamb#bgaFbma##S.0aB#u.yaz.w.waz.w#u.0a##SaFbma##Sa##Sa#amamaoa0#x#IaYawaYblawaYawaY#M.NaYaYawaY#I#x#x#U#x#x#xawaYaY#D#MaY#x.b#x#UaYaY#Daw#DaY#D#D#D#D#Dbl#Dbl#sblblbl#MaY.RaYaYawaY.s.Nbl#Dbl#D#Dbl#Dbl#D#s#D#D#D.7#D#Dajaf#La9.na9a9.na9.na9a9.n#Lajaf.E#L.7#La9aj.7#Lafaf#Laf#La9.Ea9a9#p.nblblaYaYaY#Dblbl.NblaYaYaY.Nbl#D#D#D#DaY#DaYblblbla9#Dafa9", +"a9afa9ajafbpa2#L#ga2bpa2#L#g#La2bpa2a2bpa2#L#ga2#L#Lbp.7aj.7#Db.bl#x.Waobb.2a6ak#vb#a0#x.RaY#xaYaYaY.R#x#x#x#I#xawaYaYaYaY#xaw#xaYaw.Ca0b#aF#vaZaZana7.waz.G.Ga7#uaBaB.0a#aFamambnbnaCa0a0aCa0a0aoa0#IaYaw.Nbl.NaY#MaYbl#DblaY#DawaY.Nblbl#xbn.Ca0#I#xaY.N#Mbl#DawaY#Ibn#Ubn#I#x#D#D#D#D#D#D#s#D#D#saY#Dbl.s#DaYblaYaYawaYaYaYblbl.nbl.nbl.nbl.n#D#D#D#s#D#D#s#D#Lafaja9#paja9aja9af.naf.naf#Laf.7aja9aj.7#Laf.7afajaf#Laja9a9a9afa9#Dbl#sbl.Nblbl#sblaYaYaYaYaY#DaYaY#Dbl#DaYblaY#MaY#Dbl#Da9a9", +"a9a9afa9#L#L#La2#ga2#La2#ga2a2#ga2#ga2a2#ga2a2bp#L.j#L#L.7#sbj#saY#Iaq.y.waXaraS#vb#a0#UaYaYawaYaYaYbn#x#U.Cbn.Caqaqavaqavaqaqaq#Ia0ao.5#vana7bh.Ga6al#aarbkaz#uaOamam.Cao#x#IaY#I#x#I#x#I#x#xawbn#xaw#D#D#D.sbfaY.N.saY.saY#D#D.Naw.N#saY.s.Cava0am.C#IaYaY#D#M.N#x.bbnaCa0a0#x#s#D#s#D#Da9#Da9blblbl#Mblblbl#MaYawblaYaYawaY.saYaYaYaYblblblbl#s#D#D#D#D#s#D#Daja9af.nafa9.na9.na9a9.na9#Lajaf.7af.7#L.n#L.E#Laf#L#Laf#La9a9.7a9a9a9a9#D#D#M#Dbl#Dblaw#DaYawaYaY#saYbl.Naw#DaYawblaYblbla9a9af", +"afa9.7a9#L#L#L#L#La2#g#La2bpa2bpa2#L#g#L#g#L#ga2#Lbp#Laj.7bj.s#D.Waoao.waX#aazaSaFa0#xaYaYaYaYaYaYaY#xa0a0.Caoa0.8.8.5ao.5amaoamaCaoam#v#ubh.G#eayaTay.Gaza7aBa#aoaC.CaC.CaYaY#Mbf#x#xaY#xawaYaY.NaYaw#D#s.N#xaNaw.Nbl.Nbl.N.N#s#x.NaY#D.NaY#xaqa0aoa0#x.NaY#MaY#x#xbnbn.Vamaoam#D#D#D#s#D#sbja9.N#M.Nbl.N#M.NblblaY.RawaYaYaYaYblawblaYawaYawaY#D#s#D#M#D#D#D#Daf#L#La9a9.naf#La9af.n#L.nafafa9aj.7aj.7#L.7#L.Eafaj#Laf#La9a9a9aja9a9.na9bl#D#D#DblblaYaYaYaYaYaY#DaY#DaYblbl#DaYaYbl#sbl#Da9a9", +".7a9a9.7a9a9.7a9#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Lafa9a9#D#sbl.s.Waoan.G#Ea7aBaZ#vaFama0aCamamamb#.Va0aC.VaO.0#uaSaSazazan.Gak#a.Iay.Iar.Xar.Gazaz#uaB.yaO.5aoa0#Iaw.NaY.saY.N.N#D#s#D.N.N.N.N.s.NaY.NaY.NaY.saYa9bl#sbl#sbl.nbl#D#s#DawaY.saYawaY#x#U.CaC#xbf.N.s#I#x#Ia0aoamambf#I.N#D#DaYaY#Dbl#D#Dbl#D#Dbl#D#M#Dbl#Daw#D#M#DaYaYawaYblblaY#D.na9a9.na9.najaf.nafajaj#L#L#Laj#L.E#L.n#L.E#Lajaf#Laja9aja9.7a9#Lafafaj#L#Lajafa9a9a9bja9#D#D#sblaY#MaYaYaYaYaYaYaYawaYaYaY#xaY#UaYaYbl#Dafa9#L", +"a9bja9a9.7a9a9.7#L#L#L#L#L#L#L#L.E#L#L#L#L#L#L.7aj#L#sa9#saY.saYbo.5.w.GazaB#San.l#vbgama0#xama0ama0a0bgaFbmanazak#aar#eazaz#aa6.e.e.XaraSazbhan#S#v#vaFaoa0aC.Cawaw.Naw.Naw.Naw#Da9#s#D.s.N.s.N.NaY.s.Naw.NaY.Nbl#saYblbl#Dbl#D#D#DaY#D.NaY.N#x#Ibna0a0a0.C#I#x#x#I#xaCamaFaOamaYaYaYaY.N.Nawbl#s#Dbl#D#sbl#D#Dbl#Daw#Dbl#Dbl#D#Mblblblaw#Dawbl.na9.na9.na9a9.naf.n#L.7aj#Laj#Laja9aj.7aja9aj.7#L.Eaf.7#L.7af.7afaj#L#Laf#Laf#La9.7a9a9b.a9#D#DaYblaYaYblaYaYaw.RaYbnaY#U#xbnbna0aYaYaYbl#Da9a9", +"a9a9a9a9a9a9a9a9#L#L#L#L#L#Laf#Laf#Laf#L#Laf#Lafa9a9a9#D#D.Naw.N#x.8.w#e.lbma#az#uaZaFa0aC#x#x#x#x.WamamaF.y#ealayaG.G#eanaS#e#a.I#a.X.JanaZ#Sa#aOambga0.W#x#x.saY#saY.NaY.NaY.N#D#D#DaY.NaYaY#xawaYaYaYaYaY.saY#Dbl.N#M.Nawbl#D#M#D#MaYawaY#x#xbnaCam.8.5amamaCa0a0aob#aOaObm#v#x#I#x#xaY.N.NaY#Dbl#Dbl#D#Dbl#D#Dbl#Dbl#Dbl.sbl.N#Daw.NblaYblaYa9.n#p#sbl#Ma9bl.na9.na9.7.E.7.7.na9.na9a9.Ea9.n.7aja9.na9.Ea9.7af.7af#Laf#L#Lafa9a9a9#Da9#D#D#DblaYblaYawaYaY.R#xawaYaYaYbn.Cbn#xaYaYaY#D#D#D#D", +"a9a9a9a9a9.7a9a9a9a9a9#Laf#L#L#La9.7.na9a9a9a9a9a9a9#s#D#s#D.Nbl#I#v.G.G#uaF#van#uaZ.8a0bnbnawbnavam.5#van#ealbra6#a#e.wana7#e#e.fakaz.TaBa#a#aFa0aoa0.Wbn.s#M.N#saY.sbl.saY.saY#s.Naw.Naw.N#I.N#x#I#x#x#IaYaY#IaYawaYawaYaY#xawaYaYaY.NaY#x#x#Iamb#aFa#a#aOamamamaob#b#aF#Sbmbmaoa0#x#xawbl#D#D#Dbl#D#sbl#Dbl#sbl#D#D#sbl#D#D#D#Mbl#DawblaY#saY#Mbl#Dbl#M#D#M#M#Da9#sa9.n#D#D#sa9.Ea9b..na9.7a9.na9.n.7.7a9.7a9aj#Lafaj#Lafaj#La9.Ea9.7#D.E#D#DblaY#MaYaYaYaYaYaY.R#x.R#xbn#U#xbnbnaYaYbl#Dbl#D", +"a9a9a9a9afa9afa9af.nafaf#Lafa9a9afa9a9a9a9.na9.n#D#D#D#D#D#Daw.N#I.y.GazaZb#aOa#anaBa#aoa0aCbna0a0.5.8an.G.2.K#P#q#e.6anan.wazakazbha7aZaFam.8am#xaC.C#I#IaY#D#saY#saY.NaY.NaY.NblaYblaYaY#I#x#x#x#x#I#x#x#x#xaYaYbn#xbn#U#x.baY#x.s#x#x#I.Ca0.CbgaF#vbma#a#aOambgamb#aoaFaFaOaF#va0#x#I#x.Na9#D#s#Dbl#D#Dbl#D#Dbl#Dbl#D#Dbl#Dbl#DaYblaY#Dawbl#DaYaY#MaYawaYawaY.nbl#p#sa9#sa9#D#s#D#Da9#D.n#D.na9.na9a9.n#Da9#D#Lajaf#Laf#Laf#La9a9a9#Da9#Da9#DaYblaYaYblaYawbnawaYaYaYaYbn.Cbna0.Cbn#xaYaY#Da9", +"#pa9a9a9a9a9a9a9a9a9a9a9a9a9a9.na9a9a9a9a9a9#Da9#D#s#D#s#DaY.NaYaCaZ.6az.0aOaF#van#uan#vamamamamaOa#analba.g#P#P#a#Tan.y#uaZaza7an.laZa#bgama0.C#U.C#U#I.N#s#s#D#s.Naw.N#M.NaY.saYaw.Naw#x#x#x#U#x.baYbnaw#xawaY#Ubn#U#x#Ubn#xbn#xbn#Ia0a0a0aCa0b#.t.tbma#aFaFb#amamamam.Vb#b#.V#Sbga0#x#xbl#D#Dbl#Dbl#Dbl#s#Dbl#D#M#D#Dbl#sbl#Dblaw#DawblaY#DaYawaYaYaY#Ibn#Ibn#Mbl#s#D#D#Db.#D#sa9#s#s#s#D#s#D.n#D.na9#D#D#s#Dafafaf#L#Laf#L#La9a9.7.nbja9bj#DblawblaYaYaYaYaYaYaY#x.R#x#xbnbnbnawaYaYbl#Da9a9", +"a9a9#pa9#pa9#pa9a9a9a9a9a9a9#pa9a9.n#p.nbl.n#pa9#D#D#D#D#D.Nawbfbn#vazaS#SaF.8#vaZ.6aBa##va##v.0a7.faG#PaD#V.Kay.XazanaB.0#vbm#SbmaZ#vamama0aC#xa0.W#x#x#I.N#D#s.N#M.NaY.NaY.saYaYaYaYaYawbn#x#x#x#xbn#Ibn#x#x#xbn#xa0bna0bnaCbn#xa0#x#xbn.Ca0am.V.Vb#aOaFb#bgamaC.C.CaCa0a0aCa0a#aFbgbnaY.N#D.7#D#M#D#Dbl#Dbl#D#D#Dbl#D#Dbl#D#D#M.NblaY#DawblaYaY#Ibn#Ibn#Ubn#IaYawaYawaYawaY.s#D#s#Da9#sa9#s#D#sa9#Dbl#s#D#D#Daj#L#Lafaj#Lafaja9a9a9#Da9#D#Da9blaYblaYawaY.R#xaY#M.RaYawbna0#IaYbl#Da9a9afafa2", +"#pafa9afa9a9a9a9#pa9#pa9afa9a9a9#p#p#D#pbl#p.na9#D#D#D#DaY.NaY#Ia0#v.Gaz.0#vaF#vanaz.w#u.0#u.waP#A.f.Xa6.Ia6akaSanaZa#aFaoaFaOaF#SaFaFama0aC#x#x.Wa0.W#Ibf.N#sbj#M.N.saY#s.NaY.NaYaYaw#xaY#x#I#x.R#x#x#x#xaYbnaY.Cbnbn#xbn#x#xbn#x#I#xbn#xa0.Ca0.pb#b#aFb#aFb#.V.C.C#x.CaCa0#xa0.FaFaOa0aYbl#D#sbl#D#Dbl#Dbl#s#Dbl#D#M#Dbl#D#M.Nbl#DaYblawaY.saY#UaYbn#x#U#x#Ubnaw.Rawblaw.NawaY#s#s#s#s#D#s#D#sbl#Mbl.n#Dblbl#Dafaj#Laf#Laf#L#La9.7a9.7#s.7#DbjblaYblaYaYaYaYaYblaY#xaY#x#xbnaYbla9#p#p.naf#La2", +"#L#La9a9a9afa9af.j#L#La2af#La9a9#sa9#s#D#DaYaYblawaYaY#I#xbn.Ca0#Ubg.laz#uaBanaBa6#a.Xa6#aak#ebh#Sbm.Fa#aFb#amaoa0aCa0aoa0amb#.8b#aoa0aCa0#xaC#x#I#xaY.N#M#D#D#s#D#sa9.7a9.7.n.7#D#D#D#s#DaYaYaY#sbl#Mbl#Dbl#D#Dawbl.Naw.NaYaYawaYaYaYaw#DaYbl#DaY.RaYaYbnbna0a0#Ubnbn#x#x#x#I#xa0bgaBb#a0.s.s#L.NaY.N.saY.N.NaYbl.NblaY#I#x#x#x#Mbl#MaYaY#x.b#x#xbn.Wambgamamam#Ua0bnaCa0a0amaoaw#x#x#x#I#Iaw#Mblbl#sblbl#D#D#Da9#pa9a9a9a9#Laf.na9a9a9a9#paf#pa9a9#MaYaY#x#xbnaw.RaYbna0a0a0aY#D#pa9a9#La9#L#L", +"#L.7#Laf.7a9.7a9#Laf#Laf#La9.7#Da9a9blbl.Nbl#DaY#xaYaY#xaCa0amam.t#uazar#e#T#a#zacbaayaraS#uaZa#aFaFaFb#amaoama0a0a0aCa0a0ama0amaoa0a0a0aC#xaC#xbn#I.saY.s#D#sa9a9#sa9a9.Ea9.7a9#D#s#DaY#D#D#s.Nbl#D#D#D#D#Dbl#DaY#DaY#Dblbl#DaY#D#Dbl#DaYbl.NaY.baYaYaYa0#Ia0a0#x#UaY#x#U#x#xaYbnam.FaOa0#x.s.7aY.saY.NaY.NaY.sblawaY.N#x#Ibn#xaYawaY#xawbnaY#U#x#IaCa0aCbg.paobn#U#Ua0aCaCaCb#aCaC.C.Wa0.C.baYawawaYblaw#D.s.Nbla9#p.nafa9ajafa9#pa9#pafa9a9a9#pa9blaYaY.b#xaYaYawa0#xa0a0#UaYbla9a9a9a9#L.7#L", +"#Laf#La9.7af.7af#L#Laja9.7a9a9bj#D#D#D#MaY.NaYaY#MaY#Ua0amam.5.5aSal#PabbrayaTaTaGara7aZaZaZbm#vb#amamaCa0#x.C#x#I#x#x.CaC.CaC.5b#aob#aCamaC#xbn#I#xaY.s#D#sa9#s#Da9.Ea9.7a9.Ea9#D#D#D#D#s#D#D#D#Dbl#D#M#Dbl#sbl#DaYblaY.saY#DaY#MaY.Nbl.sbl#D#DaYaY.baYaYbn.CbnbnaYaYbn#x#x#x#xaYbnam#Sama0.N#s.NaY.Naw.Naw.NaY.NblaYaw#x#x#x#IaYaYawbl#x#I#xa0#Ia0aC.pbgb#bgb#.pa0.V.pb#.Vb#bgbm.taOaFaFao#U#x.bbn#IaYaYaY.NaYbl#Dbl#Da9a9a9a9a9a9a9a9a9a9.na9a9a9bl#DblaY#x#xaY.R#xaCama0#x#xbl#s#Daf.7af.7#L", +"#L#L.7a9.7a9a9.7af#La9a9a9#D#D#D#D#MaYaY.N#x#I#x#xaY#x#xamaO.0bbaT#PaD#VaTaRar#eaBaZbmaFaFamb#ama0aCama0.C.C#x#I#xaY#I#x#x.W.CaCaOaFaob#aoamaC.C#I.b.NaY#s#Da9.7.n.7a9.7.n.7a9.7#D#D#D#D#D#D#D#D#D#M#D#Dbl#D#Dbl#D#D#sbl#Dbl#D#D#D#D#Dbl#D#Dbl#DaYaYaYbn#x#x#x#IaYbnaY#IaY#xaY#IaYbna0aBbmao#x.NaY.saY.NaY.NaY.saYaw.NaY#x#I#x#xaw#x.N#I.C.CavaCaFaOa#aBa##vbm#Sbm.taFbmbmaZaBbh#kbhbhaZ#Sa#b#a0aCa0a0#U#xaYaw.Nbl#Mbl.n#D.n.7a9a9.na9a9#sa9#Da9a9a9.n#D#D#xaY#xawaYbnama0ambnaYblbl#Da9#Da9#L.7", +"a9a9a9afa9#La9a9.na9a9bj.n#D#D#saY.NaY#x#x#x#x#x#Ubnambga#.0#u#uaH#4#aazanaBaZbm#SaFaOb#bgamamama0.C.C.W.C#Ibf#xbf#I#x#x.C.Cao.8a#aOaOamaoa0.Wa0aY#xaw.N#D#s.7a9.7.n.7a9.7#L.7aj#D#D#s#D#D#D#s#D#D#Dbl#D#Dbl#D#Dbl#D#D#Dbl#D#Dbl#D#Dbl#D#D#D#DblaY.NaYawaY#xbn#xaYaYaYbn#x#x#x#x#U#xamaBaBaBa0.Caw#xaY#IaY#xaY#x#x#x#Ibn#xa0.Wa0.CaoamamaCamao.5azaz.G.Gar#e.G#a#eaz#ear#e#a.X#a#jaGak.faSaZ#vb#ambga0a0a0#I#x#xaw#xblaY#Da9#Da9#D#D#Da9#Da9#Da9.na9a9#D#DblaY#x.Rbna0.Cama0#x#xbl#Dbla9#D.7.7a9", +"a9.7a9.7a9.na9.7a9.7#s#D#D#D#D.N#x#x#x#I#x#x.Ca0amaOa#.yanaBan#u.6aBa#amb#a0b#amamb#amamamaoa0aoa0aCambn.C.C#x#Ia0.C.CaCamao.5aO#vaFaOb#aoa0a0.WaYaw.NaY#s#D.7.n.7a9.7.n.7a9.7a9#D#D#D#D#D#D#D#Dbl#D#Dbl#D#Dbl#D#D#Dbl#D#D#D#D#Dbl#D#D#D#Dbl#D#D#sbl#D.NaYaYaY#xaYaYaY#xaYaYaY#xaYa0a0bmaz#uaOam.C.W.C.C.C.C.W#x.W#xamamamaoam.5aoaF#v.y.0#uaB.wal.2ayal.2aya6aTa6alaR.2ayayaT#P#t.K.e.X.GaSaZaBaFb#amaoa0a0bna0aYaYawblbl#sa9bj.n.7#D.7a9bja9#Dafa9afa9bl.Naw.N#U.CaCaFaoamama0aYaY#D#D#Da9#L.7", +"a9a9.na9.7a9a9a9a9#D#D.N#s#DaY.saY#x.C.Ca0aoamao.0aZaBaZaB.0aBa#amb#a0aCaC.pa0a0aob#ama0am.C.Ca0.5b#amaCam.W.C.CaCa0ao.5amaOaF#vaF.8amamama0aqa0aYaw.Naw#D#Da9.7.n.7a9.7.7af.E#L#Da9#Da9#Da9#Da9#Da9#Da9#Da9#Da9a9a9afa9afa9afa9a9a9a9a9a9a9a9a9bl#D#Dbl.N.NaYaYaY.RawbnaY#x#I#xawa0b##Sazbha##vamaqao.Cavamao.5ao.5.8.8aF#v.0.yaZaB.waza7az.G.G#aararar.X#a.Xar#eazazaralalalayayaya6.Ial.XaSaS#va#aFaO.5aC.CaC#xbnaY.N#M#D#D#D.7a9.7.Ea9.7.7.Eaf#La9#D#D.N.NaYbnbnamamb#aoama0aYawblaY#D#D#D.7", +".7a9.7a9a9a9.Ea9bja9#s.NaYaw.NaYa0.Wa0aCamamao.5a7az.waZa#aFaFaFamamaC#xbn#xam.5amamamaoama0aoa0aOaFaoambgamaCam.8aFaOaFaOaFaF#vaFaFaOb#aoamaCamawaY.Naw#D#D.Ea9.7a9.7.n.7.7a9.7#D#D#D#D#D#D#D#D#D#Dbl#D#Mbl#D#Ma9a9a9a9a9a9a9a9.na9a9.na9a9.na9#D#D#D#DblaY.saYaYaYaY#xaY#xaY#xaYbnaObmazaZ#Sa#.8.8.8.5am.8.5.8a##va#.ybbbb.w#uazarar#a#eazaSaz#ua7aZaZaZaZ.Tbm#SbmbmaZan#uaSaz#aalaR.2.IaGaraSaZaBa#aFaoama0aC.R#IawaYbl#D#D#Da9.7.7a9.7.7a9.7af#L.na9#D#s.N.NaYaCamaoaFamama0aYaYaY#D#D#Dbj#D", +".N.N.N.N#D#D#D#DawaY.Nbf#xaqaqavamamaF#v.0#u.w#e#va#b#.5amamamaF#I#x#x#x#Ia0#x#x#x#I#x#xa0ao.5amamaoaFa#a#aBaZaZ.TaBaZ#SaFaFaF.5ao.5aoam.C.W#x#xaYaY.saY.N#s#D#Dajafaja9a9a9.7a9#Da9bja9#D.7#Da9#Dbl#Dbl#D#Dbl#D#Da9.7a9.7a9a9bja9#Da9#D#D#Dbl.Nbl#Dbl#D#D#Dbl.NaYaYaYaYaYawaYaY.Nbfa0b#bmaBana#bma#bm#u.6#T.oaR.Gararal#aalalal#Taraz.6#uan.0.0b#.8b#aob#aoambgamam.8aoamaO.8aFaBbhaz.Gar.X.X#abhazan.TaZbmbma#aCa0#xaYbfaY#s#D.s.N#D#D#sa9.7.7#s.7.7.7a9a9#D.7#DaYam.5aOa#amambf.N.N#s#D.NaYbf", +"aYaYaY.saY#s#D#D#D.s#x.Wao.8aq.5.yaB#uanaBan#uanaFaOamaob#aoamaobn#x#U.Ca0.C.C.Wbna0a0aoaF.5#va#.ya#.yaBaZaBbh#u#SaBaZaOa#.8aFbg.5aoamaobn.Cbn#x.sbl.NaY#D#Da9#Daf#L#La9.7a9a9.7#D#D#D#D#D#D#D#Dbl#Dbl#DaY#DaY#D#Da9a9.7a9#D.7a9a9a9a9#Dbl#D#D#D#D#D#D#D#D#D#D#DaYaYaYaYaYaYaYaY.N#x#xbgaFaZ#ua#bgaF#vanaz#ealalazazaz.Garaz#q#ebhananaZaZa#a#a#aCama0a0aoa0ama0aqaoamamaFaoam.8a##SaZ#uana7aSbhaBaZaZbmaOaFaOaFb#ambnbn#IaY.NaY#D#D#D#D.7.7b..7#D#Da9.7#s#D.n#D#MaY#Iama#aFaoa0#x.saY#D#Dbl.N#x", +".Nbo.N.N#xbf#xbf#x#Ia0a0aOa#aBaz.GaP.wan.ya#a#a#aCamambgama0a0a0.Wa0.C#xa0a0a0amamaoaFama#a#.0#vaSazbh#uanaBanaZa#aOaFaO.5aOaqamaoama0.C.C#Ibn#IaYaYaw#D#s#D.E.7#Laf#La9a9.7a9a9.7a9.7a9.7a9.7a9#D#D#D#D#Dbl#D#Da9.7#Da9.7a9.7#Da9.na9a9#D#Dbl#Dbl#Dbl#Dbl#D#D#p#D#D#D#D#D#D#D#D.N#DaYa0b##SaBaZamamaF#v.0#u.6.wan#u#uaSananaZaBa##vaFaFaoamamama0a0aCa0bna0#xaCa0a0.Cao.CaoamaoaF.5aOaFaFa#aFaFaF.5aoamaFamaFaob#bga0aobnbn#x#x#M#Dbl#s#Da9.7a9.s#D#D#D.N#DaY.N#Daw#xa0aoaF.5b##IaYaY#DawaYaw#x", +".N.N#Ibf#x.W.C.W.5#v.yaZ.G#z.Kba.o#e.w.0a#a##va#amamaOaFaOaFbgamama0amaoam.8.5.5a#aFaFa#aBan#ubh#a.Xar.Gbh#uaZaBaO.5aoamamaC.C.Wa0a0.W.C#I#x#x#xaY#saY#D#D.7af.7af#L#La9a9.7#D.7#Da9.7a9.7a9bja9a9a9a9a9a9a9a9afa9.7a9.7#L.7a9afa9a9a9a9a9#Da9#D#Dbl#D#D#D#p#D#D#D#D#Dbl#Dbl#Dbl.s.NaY#xa0a#aB.0amamamaFa#a#a#a#aBaZaZaZ#va#.0a#b#b#bgamambn.Cbn.Wa0.C.C.C.Wa0.C.C.C.Wa0.Ca0.Ca0aoamama0a0bn#Ubn.Wa0.Ca0.W.C#U#xb#.Vb#b#a0ama0a0aYaY#D#D#D#s#D#saYaY.s.NaYaw.NawaYaY#Ia0amamaOam.C#x#xaYaw#x#x.C", +".C.W.Caqaq.5.5.5anaP.o.Ya8#obs.g#TaS.wan.0#va##v.0bm.0a#.0a#a#.yamaoaFamaOa#aOa##va##S.0aZ#uaSaz#aaG#a.Gaz#uan#u#vaOam.8aCaq.W.C.C.Wa0#x#x#x#IaYawbl#D#sa9a9#L#Lajaf#L.na9a9.7a9.7a9#D.7#Da9.7a9a9a9af.7afa9.7a9.7af#L#Laf#La9.7afafa9.na9a9bl#Da9.na9a9a9a9a9afa9.na9a9.7a9a9a9.N#D.N#M#xaOaZaBamaOam.8am.8a#.5a##va#aoaFaFamamaoa0a0bnaC#x#x#x#x#I#xaY#xaY#xaY#I#x#x#x#I#x#I#xa0bn#I#xawbl.Nbl.Naw.NaY.NaY#xaYaCa0ao.Vbgb#b#b#awbnaYaYblblaYbl.NawblaY.NaYaYaYawaY#x#Ia0bga#aOamaC.C#xa0.Wa0am", +"aoaFa#aOa##v.y.ya4.2#4.4a8aDaTaRanananaZaBaFaFaF#v.0#v.0#v.0#v.0amb#aob#amam.5aFamaOaFa##v.0.yaZaz.wanazaz.w.w.waO#vao.5aoamaCam.Wa0#x#xaw#xaYaY#D#M#Da9a9.E#L#L#L#Laf.7a9.7#Da9.7a9#L#L#L#L.7#L#L#L#L#L#L#L#La2#La2#L#L#L#L#L#Lafajafafa9a9a9afa9a9a9a9a9afa9a9a9.7a9.7a9a9.7a9.N#D#D#DaYam#SaZaF.5aFamamamamaoaFamamb#amamaoa0a0bnaC#x#x#xaY#IaYaYaYaYaYaYaYaY#xaY#IaYaYaYaYaY.s#xaY#D#D#D.7.n#D#D#D#M#D.N.saY#xa0a0amamambgambnbn#UaY#x#xaY.saY#x.NaYaw#x#I#x#x#I#xa0a0aF#vaZ.5a#amaCa0am#v.5", +"an#uan#uan#ua7#uaz#a.Gaz.GaSaZaZ#vbybca#.5aoamb#.5b#amb#amb#amb#aCama0amamaob#amaCa0a0aoaFaFa#byaOby#v.yaZaB#u#ua##v#S#v.5ao.5aoa0#I#xaY#x#IaYaw#Dbla9#s#L#L#La9#Laf#La9#La9.7a9#L#L.7af.7af#Laf#L#L#L#L#L#L#L#Laf#Lafa2af#L.3#Lafafafafa9afa9a9#Laf#Laf#L#Laf#L#L#L#L#L#L#L#L#L.s#D#s.7#DaCa##ua#.0.5.5amama0a0amaoamaCamaCa0#xbn#x#x#x#xawbfaY.N.N.N.s.N.N.s.Nbl.Nbl.NaY.NaY.Nbl#D#D#s.7.7#D.7a9.n#p#Dbl#DblaY#x#x#xbnbnama0am.Vama0b#aCa0#x#xbn#I#x#x#xbnbn#x.Ca0a0aCam#van.wan#vbyaF#va#.yan", +"alal.Ga7bhaZaZaZa##Sa#aFb#ao.5.8aFaFamama0amamaobn#Ubn#Ua0#Ibn#Ua0a0a0aCa0amamao#x#xaCa0aoamao.5avam.8.8#v.yaB#u#SaBaB#u#S#vaO.8amaCbn#x#I#xawaYbl#sa9a9#La9.7ajafaj#La9#L.7#Da9.7#Laf#L#L#L#L.7a2#ga2a2a2a2a2a2#La2#L#La2#L#L#La2af#Laf.na9a9a9af#Laf#La9af.7af#L#L#L#L#Laj#L#L#D#D.7#s#D.CaBbhbb.y.0aOama0aoa0ama0ama0bnbn#xaYaCbnbn#x#xaYaY.Naw.NaY.NaY.NaY.NaY#DaY#M#Dbl#M#D#Da9.7a9#Dbjb..7afa9.na9bl#DaY.N#Ibf.W#xaC.Ca0amamb#b#a0ama0ama0#xbn#x#U#x#U.C#UamaCama0ao.0.w.6.wan.yan.yan.waP", +"#q.6a#aF.5aCa0a0bnbna0aCa0amb#am#U.Vbnbn#xa0.C#x#x.NaY.NaY.N.N.N#D#s.NaY.NawaY.N#M.s.N#x.C.Wamaq#UaCaCb#bgaOa##vbg#v#v#u.w#uaZ.yaO.5aoama0.RaYaw#D#D.7.n#Laj#L#L#L#La2#La2#La2#g#Laf#L#L#L#La2#La2#L#La2#La2#L#La2af#L.3#Laf#Lafajaf#La2#La2#La2#L#L#Laf#La2#L#L#L#La2#L#Laf#L#La2#La9#D#x#xaoaO.Xbha#ama0#x#x.CaC.Ca0aC.C#x#IbnaYaYawaYaYaYaYaY.N#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D.7.E.7.7.7af.7.7aj#L#L.7.E.N.N.NaY.N.N.N.NaY.NaYbl#IaYbna0aoaFaOamaoamamamaFaF.5b#aOa#a#aZ#u#a.2.waP.w.w.waZan#u", +".GanaB.5a0a0#xaCbn#Ibna0a0a0amam.Va0bnbn#x#x#I.C.NaY.Naw.N#s#D#D#D#D#s#D#D#D#saY#D#DaY.saY#x.W.Cbn#Ua0aCaoamaOaFaob##v#uaB.y#vaOa#aO.5bga0#U#x.R#D#D.n.7.7#Lbp#L#La2#L#g#L#g#La2#L#L#Lafa2a2#La2#L#La2#La2#La2#Lafa2#L#La2#La2#Laf#L#Laf#Laf#L#L#Laf#L#La2#La2#La2af#Lafa2#L.3#L.j#La9#DaY#xa0#v#aa7a#b#a0bn#x.C#x#x#x#x#xbn#x#x#IaYaYaYaYaYawaY#D#D#D#D#D#D#D#D#Da9#D#D#Dbj#Da9a9#La9af.E.7a9#Laf#Laf.7a9#D.N.N.saY.Nbl#DaY#D.NaYaYaY#xa0b#.5aFbga#aFaFbma#.ybm#vaZ#SaBan.G#q.2.w#u.6#uan.y.0.0", +".6#u.0b#a0#x#xa0bnbn#x#xbn#Ibn#x.RawaY#x#I#x#xbfaYaw.N#D#D.7.7.7a9#D#Da9#Da9#D#Da9a9#D#D.N.N#x#x#I#x#Ia0ao.8am.8aCa0bg#v#vaOb#aoaFaOaFama0a0#Ubn#s#D#Da9.E#L#Lajbpa2#ga2a2aja2#gafa2#La2#La2#La2#Laf#La2#L#Laf#La2#Laf#Laf#Laf#L#Laf#L#Laf#La2afa2#La2af#La2#L.3#La2a2#L#L#L#L#La2#La9#s.N#xa0bg.Xana#aFamam.C#xbn#xbn#x#x#x#xbnaYaYaYawaYaYaYaY#Da9#Da9#Da9#Da9.7#D.7a9.7a9a9.7.7.7.7.7a9#L.7.n#L#Laja9a9#D.saY#D.N#D#D#D#D.saY#DaYaYa0a0amb#aFbm#SbmaBaB#ubha7aB#u#uazaz#Tal#q#uanaB.0a#.0a##u", +"azaBa#aobn#x#x#x#x#x#Ibn#xaY#xaYaYaYaYaY.NaY.NaY#D#D#D#D#D.7a9.7#sa9a9bja9.7#D.Ea9bj.n#D#D.NaY.N#MaYaY#Ia0aoaoam#IaCa0ao.5ao.CaCbg.5b#aoa0aC#xa0aYaY#s.7a9#Lbp#La2bpa2#L#g#L#ga2#Laf#L#La2#La2#La2#La2#La2#La2#Lafa2#Laf#L#L#L.3aj#L#La2ajaf#L#La2#L#La2#La2#La2#La2#La2a2a2afa2#La2#L#DblaY#IamazaSaBaFama0#x.C#xaY#xaY#x#U#x#xaYaYaYaYaYaYaY#D#D#D#Dbj#D#Dbj#Da9a9a9.7a9a9bja9.7afa9aja9.7af.7#Lafa9a9#D#D#D#D#D#D#D#D#D#D#D.NaY#I#xbnaoamam.5a#bma#aZaZaZaZ#uaZanaz#q#TaR.o#q#uaB.0a#.0#uaZ#u", +"an#vb#a0#x#x#xaYaYblaYaYaYaYaYaYaYaYaYblaY.N.N.sbl#D#Da9#D.7a9#L#D.7#sa9.7a9.7#Da9a9#Da9a9#s#D.Naw#Daw#xaCa0.C#x#U#xaCaoaCa0#Ibna0a0aoa0aCa0a0#UaY#M#D#Da9.7#L.7a2a2#ga2a2#ga2#g#La2#La2#La2#La2#La2#La2#Laf#L#Laf#Lafaj#Laf#L#Lafa2af#L#La2#Lafa2#Laf#La2#La2#La2#La2#L#La2#L#La2#Laj#Dbl.NaY#UaZ.TaBaFam.C.C#xaYaYaYaYaYaY#x#xawaYaYaYaYaY#Dbl#D.Ea9a9.7a9a9.7#D.7#Da9bja9.7a9a9.n.7a9a9a9.na9a9a9a9.na9a9a9#D#D#D#D#D.7#D#D#DaY#x#x#xbna0aCamaFaOa#bma#bmaBaZaZaB.6.Gal.o#e.GazanaBaZ#u#u#uan", +"#vaFama0awbnaYaYaY.NaY#D#DaY#D#M#Dbl#s#D#D#s#D#D#Dbl#D.n#Daf.E.7a9a9.7a9a9a9a9a9.7a9.7a9.7a9a9a9#D.n#D.N#x#I#I.W.C#I.Caoam#U#xaw#Ia0#I#x#x#I#x#IaYaY#Dblbja9a9#L#La2bpa2bpa2#La2#Laf#Laf#La2#La2af#L#La2#La2afa2#Laf#L#Lafaj#Laf#L#L#La2#Laf#La2#L#La2#La2#La2#L#La2#La2#L#La2#L#L#Lafa9#sblaY#xb#bm#SaFambn#xaYaYaYaYaYaYaYaYaYaYaYaYawaYaY#Dbl.7a9bja9.7a9bja9#L#L#La9.7a9a9.7a9.7a9a9.7a9.7a9a9a9a9a9a9a9a9a9#D#Da9#D#Da9#Da9.N.NaYaY#x#x#xaYa0ama0am.5aF.5a##vaZan#TaR.Gazana7.wan#uaZan#uaZ", +"b#a0#xaYaYaYaY#x#DaY#D#D#M#Da9a9#D#D#D#D#Da9#D#p#Da9#D.7a9.7#L#La9a9a9.7#L#L.7a9.na9a9.7af#L#L#L#La9.7#s.N#I#x#x.C.CaCa0.W.W#xawaYawaYawaY.NaYaYaYawaY#sbl.7#D.7#L.ja2#ga2#ga2#g#La2#La2#Laf#L#L#La2af#L#L#L#Laf#Lajaf#Laf#Laf#Lajafaf#Laf#L#La2#Laf#Lafa2#La2#La2#L#L#L.3#Laf#La2#L#La9a9#D#MaY.b#yaFbgam#x.N#saYaYaYaYaYaYaYaYaYaYaYaYaYaY#Dbla9.7#L#L.7#L#L#L.7af#La9#La9#La9afafafafa9a9a9a9a9.na9a9a9.n#pa9.n.7a9.7a9.7a9.7#D#D#D#s#DblaYblaY#x#xaCa0aCa0amaOaZ#u#q.G.6#uaBana7azaZaZaZaZa#", +"a0a0a0aYblaYaY#xaYaY#Dbl#Da9a9af.7.7#Da9a9a9a9a9a9a9.n#Da9.7#L#L#La9.7af#L#Lafa9.7a9#L#Lajafa2aj#L.7.n#D.N#xbo#I#x.Waq.8aoa0#I.Nawbl#sbl#DaY#saYawaYaYbl#D#Da9a9#L#Lbpa2#L#g#La2#Laf#Laf#La2#L.3#Laf#L#Lafaf#Laf#Laf#L#Laf#L#Lafaf#L#Laf#Laf#Lafa2#La2#L#La2#Laf#L#L.3#L#L#L#L#L#L#L#L.na9a9blblbn#Hbga0#xaYaYa9blaYblaYblaYblaYaYawaYaYaYaYbl#Da9a9a9a9a9a9a9a9#L#L#L.7a9.7a9a9#La9a9a9a9af.nafa9#pa9#pa9#pa9a9#Da9#D.7#Da9bja9a9.7a9a9a9#D#Dbl#D#saYaY#x.Cbn.WaF#San.Ga4aZa#a#aZ#uanaZaBa#bma#", +"bnaYaYawaYaY#M.N#D#D#D#D#D#D#Da9a9#D.nbja9.7a9.7a9.7.7a9#La9a9a9.7a9#L#L.7af.7a9#Laf#Lafa9.7a9a9#L.7#La9a9#DaY#Ua0#UaCa0#I#x#I#I.N#s#D#D#sa9#D#Da9#D#s#D#Daw#DaYajaf#L#L#Laf#L#La2a2a2#La2#La2#L#La2a2a2a2bpaj#Lajaf#Lajaf#Lajafaja9ajafajaf#L#Lafafafafa2#L#L#La2#L#L#L.3#L.3#L#La2#L#Lafa9.na9aYbnb#b#am.C.NaWa9bj#D#Dbj#D.N.NaYaY#DawaY#DaY#D#D.7a9.7a9.7a9a9#Laf#Laf#Laf#L#Lafafaf#La9#D#D#D#L#Lafajaf#Laf#L#L#L#L#L#L.7.7.7a9a9.7a9#D#D#D#DaYaY.N#x#Ia0.Ca0aF#vaF#vaOb#aob#aoaFaBaZ.0a#.5am", +"#U#x.RaYaYaYbl#D#D#D#D#s#D#Da9#D#D.7#Da9.7a9bja9.7a9af.7a9a9.7a9af.7a9af#L#L#La9a2afaj#L#La9.7a9aj#L#La9.nblaYaY#Ia0aC.W#x#I.N.s#D#s#D.n#D#D#D#sa9a9a9#Dbl#D#D.Na9a9a9a9a9#La9#L#Laf#Laf#Laf#Laf#Laj#L.7aj#L#L.7afajafaf#Laf#Laf#Laf#L#Laf#L#Lafafafaf#Lafa2#L#L#L#La2af#L#L#L#La2a2af#L#La9bja9.Rawa0.8a0.C.Nbj#Da9a9#Da9#D#DaY#DaYbl.Nblaw#Dbl#D.7a9a9.7a9a9bjaf#Lajaf#L#Laf#Lafafafa9a9#Da9#D#Laf#Laf#L#L#Lafaj#L#L.7#L.7af.7#La9a9.7#D#D#D#D#D.NaY#x#x.C.CaoaFaFaOaOamamamamaCaF#v#v.0#vb#am", +"bnbnawaYaYaY#Dbl.n#D#D#Da9bja9bj.n#D.7a9#D.7a9a9a9.7a9a9#La9a9a9#L#L#L#L#Laf#L#La2a2a2af#La9a9a9#L#Laf.7a9#D#IaY#UbnaC#xaY.N.saY.s#D#Db.#D.n#D.7a9a9#Da9#D#D#D#Da9bja9#Da9#Da9#Da9a9a9a9a9a9a9a9#Laf#L#Lafafajaf#La9#Lajaf#Lajaf.7#Laf#L#Lajaf#Lajafaf.3#L#L#L#Laf#Laf#La2a2#La2#La2#La2af.Ea9.naY#xaCamam#x.Nbj#s.7#D#D#D#Dbj#D#Dbl#Dbl.Nbl#Dbla9a9a9a9a9a9a9a9afafafafajafafajafaf.na9a9a9#D#D#Lajaf#L#Lafa2#L#Laf#L#L#La9.7a9a9.7a9a9#Da9#D#D#D#MaY#x#x.CaCa0aFaOaFamaFaCa0a0bnaCb#aOaFaOama0", +"#IaYaYaYawaYaw#D#D#D#s#D#sa9#sa9.7a9a9a9.7a9#L.7#La9af.7a9a9.Ea9afaj#Laf#L#La2#La2a2a2#La2#La9#L#L#Laja9a9blaYaY#I#U#xaw.Naw#D#Da9#sa9#sa9.7a9.7ajaf.Ea9a9.7a9#D#D#D#D#Dbj#D#D#Da9#D#D#D#sbl#D#sa9a9a9a9a9#Da9#Dafajafaf.Eaf.7afajaf#Lajafaf#Lafafafajaf#Laf#L#L#Laf#L#L#Lafa2#La2a2af#L#La9a9a9aw#x.Vaoa0#x.Nbja9#D#D.7#D#D#D#Dbl#DaY#DblaYaY.Na9a9a9a9a9.7a9a9#La9afa9afa9af#pafa9#pa9a9a9.7a9#Laf#Laf#L#L#L#Laf#L#Laf.7a9#D.7a9.7a9.7#D#Dbj#Dbl.NaY#x#I.Ca0aqbgaFamaoambn.Cbn#U#xbna0aCama0a0", +"aYaY#IaYbl.N.N#D#s#D#D#D#D#D#Da9a9a9.7a9a9a9a9#Laf#L#Laf#L#Laf#L#Lafa2a2a2a2a2a2a2a2a2a2a2#L#Lafa2#L#La9a9#DaY#Ubn#I#xaYaw#D#s.sa9bj.n#Da9.Ea9.7#L.7#L#L.7a9.7#L#Da9#Da9#Da9#Da9#Dbl#Dbl#D#Dbl#Dbl#s#D.na9#s#D#Ma9a9.n#Laf#Lajaf#Laf#Laf#L#Lafajafafafaf#Laf#L#L#La2#L.3#L#L#Lafa2a2#L#Lafa9.na9#Dawa0bga0#x.N#s#Da9#D#D#D#D#D#D.Nbl#DaYaYaYawaYa9.na9#La9afa9afa9a9a9a9a9a9a9a9a9#pa9a9a9a9a9a9#L#Lafaj#L.3#La2afafa2af#La9a9a9afa9.7a9#D#D#D#D#DaY.N#x#xa0a0aoaFbgama0a0a0aCa0aYaY.baYbnbnaC#x", +"aYaYblbl#D#Da9.7a9a9a9a9.na9a9.7ajafaj#L#L#La2#L#L#L#L#Lafaj#Lafa2a2#L.j#La2#La2a2a2a2#La2af#L#L#L#L#L#La9#MaYaY#Ibn#MaY#D.s#D#s.7.na9.Ea9.7aj#La2aj#L#Laj#L#L.7.7a9.7.7a9.7a9.7#M#Dbl#MblblaYbl.sbl#Dbl#D#Dbl#Daf.Ea9af.Eafa9af#Lafaj#L#Laf#Lafafafafafaf#Laj#L#Laf#L#La2afa2#La2#L.3#L#L.7#Da9#DaYaCama0#Ibla9#Dbj#D#Da9#D#D.N#MaY#DblawaYaYaY#pa9a9a9#pa9a9a9afa9afa9#p.na9a9#Mbla9a9a9#La9.7afaj#Laf#L#Laf#Laf#Laf.7afa9afa9a9.7a9#D.7#D#D#D#Dblaw#x#x.WamamaOb#aOa0aC.Cbn.C#U.RaYaY.b#xbna0", +"aYaY#D#D#D#s.7.7a9.7a9.7a9a9.7a9#Laf#Laf#Laf#Lafa2a2a2a2#La2a2aja2a2.3a2a2a2a2a2aaaaa2a2a2a2a2#La2#L#La9a9#DaY#I.RaYaw#D#M#D#s#D.n.7a9.n#L.7af#La2a2a2#La2#L#L#La9a9.7a9a9.7a9a9a9#pa9a9a9.n#pblaYaY#IaY#IaYaw#x.na9af#Laf#Laj#Laf#La9afajaf#L#Lafafafaj#Laf#L#Lafa2#L.3#L#L#L#La2a2#L#Laf.na9.n#D.NbnaCaobn#D#s#D.n#D#D#D.N.NaY#DaY#Dbl.NaYaYaw#D#pa9#p.n#pa9#pa9a9.n#pa9#pa9#pa9#D#pa9afafajaf#Laf#L#Laf#L#Laj.3af.3afafa9a9a9.7a9.7a9#D#D#D#D.NaY.N#xa0ama0aob#ama0a0a0bn#Ibna0#x.bbnaY#Uamam", +"#MaY#s#D#D.7#La9#L.7.na9a9.7a9a9#L#L#L#La2#La2#La2a2a2aja2#La2afa2aja2#La2a2a2a2#gaaa2a2a2a2a2a2a2#L#La9a9blaYaYaY#MaY#M.N#D.n#D.na9.n.7#L.E#L#L.ja2a2a2#g#L#L#L#Lajaf#Lajaf#L#La9a9#pa9#pbla9.naYawaYaYaY.RaYaY.na9.na9aj.7af.n#Lafaj#Laf#Lajafafajafafaf#L#L#L#Laf#L#La2afa2af#L#La2af#L.7a9a9.7aw#xaCa0#IaYa9#D#D#D#D#D.NaY.saY#Dbl#DaYaYaYaY.na9#pa9a9#p.na9af#p#pa9a9a9#pa9#Dbl#Da9.na9#L#Laf#L#Lafajaf#Lafafafafafafafa9a9afa9a9bja9bj#D#D#D#DaY#x.Wa0av.5.pamaCa0#Ua0#x#xa0bnaYaw.R.Cb#am", +"amam#xbla9a9a9a9a9a9.7a9.7afa2#Laf#Laf#La2#La2#La2a2a2a2a2a2a2a2#Laf#Laf#La2#L.3a2a2a2a2asa2#La2#gafa9blaYawaYaYawbn#IaYawaw#D#Da9.Ea9#Lafaf#L#L#L#La2a2a2a2a2a2a2a2#La2af#L#Lafajaf#L.na9bja9#D#p#pbl#M#x#Ia0bn#I.NaY#D#Da9a9.7af.Eafa9aja9#Lafa9a9a9a9#Lafa9afajafafafaf#Lafafa2.ja2afajaf#L.na2a9aY.Cbgam#x#Ma9.n#Lajafa9.N.N#pa9bl.N#MaYaYaY#p#pa9#pa9#pa9#p#pa9#p.n#p#p.n#pa9#pa9a9#paf#pa9a9.n#pafafafafafafafa9afa9afa9a9.na9a9a9a9a9#D#D.n#paYaYa0amb#amb#a0a0a0.Ca0#I#xaw#xaY#x#xaCa0aC", +"ama0#xbla9.na9a9bja9#Da9a9ajaf#La2aj#Lafa2#La2#La2a2#La2#La2#La2af#Lafa2#Laf#L#La2a2a2asa2a2a2a2a2#La9blaYaYaYawaYaY#xawaY.N#s#Daja9#Lafajaf#Laf#L.j#La2#La2#La2#La2#La2#L#L#L#L#L#Laf.7a9#D.n#Da9.nblblaYaY#xaC#x#IaY.s#D#sa9.na9a9a9a9a9a9a9a9a9afa9afa9a9#La9afafaj#Lafaf#Lafa2#La2#Lafafaj#La2.naw.CamaC#xaY#D#D#La9a9#sbl.Na9#M#DblaYaYaY#xbla9#p#pa9#pa9#pa9#pa9#p#pa9#p#p#pa9.n#pa9a9a9af#pafa9afa9a9afa9#La9af.7afa9afafa9afa9a9.na9#Dbl#p#pblbn#U.5bg.5a0aoa0a0#Ua0#xbnaYaYaY#U#xbn#xa0", +"amaCaYaYaw#Dbl#sa9#D.7a9.7af#L#Lafaf#L#La2#La2#La2a2a2a2a2a2a2a2#L#L#Lafaja2#L.3a2a2a2#La2a2a2a2#ga9#D#MaYaY#UaY#xaw#Ibl.Naw#D#Dafafaja9#L#Laf#La2#La2a2a2a2a2a2a2.jafa2#Laf#Laf#Laf#La9a9.7#Da9a9a9#sblawaY#x#x#IaY.NaY#D#D#D#D#sbl#s#D#sa9a9.na9.na9a9.nafa9afafafafafafafajafa2#L.3#L#Laja9#Daj#DaY.Ca0aoa0aY#D#Ma9.na9#D#DaYblblblaYaYaYaYaYbl#pa9#pa9#pa9#pa9#p#Ma9bl#p#D#pa9a9#pa9#pa9#pa9#pa9#pa9#paf#pa9afa9afa9afa9afa9a9a9a9a9a9a9#Da9bla9awaYa0a0ama0b#a0a0a0#x#U#x#xaw#xaw#xbn#I#xa0", +"b#b#aCaYaYbl#Dblbja9#D.na9#Lajaf#L#L#Lafa2#La2#La2a2#La2#La2#La2afafaj#L#Laf#L#La2#La2a2a2a2#La2#La9blaYbnbn.R#IaY#U#xaYaw.N#D#s#L.Eaf#Lafaj#L#L#La2#La2#La2#La2afa2a2a2#L#L#L#Lafajaf.7.n#Da9b.afa9a9a9#DaY#I#x.NaY#saY#s#D#s#DaYaYaYblaY#DaY#Dbla9a9a9a9a9a9a9.na9a9.na9a9a9a9#La2aj#Lafa9a9a9af#Mawa0aCa0a0bn.NaYbl#D#M#DaY.NaYaYaYawaYaYawaYbl.na9#pa9#pa9#pblbla9#p#pa9#p.na9#pa9.n#pafa9af.naf#pajafafafafa9a9a9afa9af.7afaf.nafa9a9af#D#DblblaYaY#xaCa0.Ca0aobnaCbn#xawaYaY.RaYaYaY#xbn#x", +"a0bnbnbnaYaYbl#D.n#D#sa9a9#Laf#L#L.3#L#L#La2#Lafa2a2a2a2a2a2a2a2#L#Lafaf#L#La2#L#La2#L#L#La2#L#Laf.nblaY.bbn#U#x#Ubn#Ibl.NaYa9.7a9afaja9#Lafaf#La2a2aja2a2a2a2a2a2a2a2a2af#Laf#L#L#L#La9a9.7#Da9#Laja9#D#D.NaYaY#s#D#D#DaY.NaY.saY.saY.NblaY#DaY#sbl#sbla9#Da9#Da9a9.na9a9afa9ajafaf#Lafa9a9#D#sa9blaY#Ua0aob#aC#xaYaw#D#DblaY#IaYawaYaYaYaYaYaYbl#pbla9#pa9#pa9bl#M#p#D#p#M#p#pa9#pa9#pa9a9#pa9#p#pa9#p#pafafaf.nafa9a9#La9afafa9afa9a9afa9#Da9bl.NaYawbn#x#x#x#Ubna0#xbnaY#xaYawaYaw#xawaY#x#U", +"#Ubn#Uam#UaYaYbl#Da9bja9a9#L#Laf#L#Laf#Laf#La2#La2a2#La2#La2#La2af#L#L#L#Laf#La2af#L#La2#L#La2#Lafa9bl.Ra0.pa0bn#U#xawaY#M.N#s.7.na9#Lafaj#L#Lafa2a2a2a2#La2#La2a2a2a2a2#L#L#L#Laf#Laf.7a9#D.7#Dafaf#L.na9#Daw.N.n#D#D#s#Daw#DaYaYaYaYawaYaYawbla9bla9bla9.n#D#Ma9a9a9#Da9#sa9#p#Laf#La9.7.n#D#D#DaYawa0a0aob#amaCa0aYaYaY#DaY#xaYaYaYaYaYbl#Dbl#p#pa9#pa9#pa9#p#pbl#p#pa9#pa9bl#p.na9a9#pa9#pa9af#pafa9af.na9afa9a9aja9a9afa9#Laf.7afa9.7afbl#D#D#DaYaYaY#xaY#xa0bnbn#U.RawaY.baYaYblaY.R#IaYaY", +".Rbnb#a0a0#xaYbl#s#D#sa9.Eaf#L#La2#Laj#La2a2#L#La2a2a2a2a2a2a2a2#La2afa2afa2#Laf.7af#La9a9#Lafa9a9a9.R.Ra0.V#UbnaYaYaY#D#D#D#D.7afajaf.Eafaf#L#La2#La2#La2a2a2a2a2a2#La2#L.3.7#Lafaj#La9a9.n#Da9#Laj.7a9.7#D.N.Na9.n#D#DaY.NaY.sbl#Mblbl#Dbl#Dbl#D#Dbl#s#Dbl#Dbla9#Da9.nbla9a9#Dajaf.na9#D#D#D#sblawaY#x#Ub#b#aO.5a0aCaYaYawaY#x#xaYaYaY.sblbl.na9#pa9#pa9#pa9#pblbla9#M#p#Dblbl.n#p#p.na9#p.n#p.na9#pa9#pa9af#pa9afa9a9af#Laf#Lafafa9afa9a9#Da9bl#D#M.NaY.Naw#x#UbnbnaYaYaY#xaYbl#MblaYaYaYaY#I", +"#Fbn.Vaoa0bnaYblbja9#Da9a9#Lajaf#Laf#Laf#L#L.3#La2a2#La2#La2#La2af#L#L#L#Lafaj#La9#L#La9a9#L#Lafa9blaw.R#Ua0bnbn#IaYaw#D#s#Da9#s#La9#Laf#L#L#L#La2a2a2.j#L#La2#La2a2a2a2#L#Laf#L#Laf#Laf.7#D.7#s#L#L#La9.7#D.sbf.n#Da9#Daw#DaY.N#pbl#M#D#p.n#pa9#sbl#D#D#Dbl#D#D.na9#Dbl.n#Da9a9af#La9.7a9#s#DaYaY#x.baYbnaoamaFaFaoa0#IbnaYaY.R#x#xaYaYbl#Da9#pa9#pa9#pa9#pbla9#M#pa9#pa9#p#Mbl#pa9a9a9#pa9a9#pa9#paf.naf#pafafa9a9a9afa9af.7afa9#L#La9a9af#D#D#D#DaY#D#DaY.NaYbnbn#U#x.baYaYaw#paY#D#MaY#IaYaY", +"blaw#xa0ambn#xaYawblbl#D#pa9afafa2a2a2a2a2a2#La2#L#La2#La2#La2#La2a2a2afa2#La9a9a9a9a9#D#D#D#D#D#pbl#paY.Rbn#I#x#pa9a9a9a9.7.7a9afajaf.n#Laf#L#L#L#L#La2a2a2#ga2a2bpa2#L#L#L#L.7af#Laf.7a9a9a9#Da9a9#sa9#D#D#D.Na9a9a9#sbl#D#Ma9bl#Dblbl#Dblblbla9a9a9afa9a9a9a9a9a9afa9a9a9a9.nafa9a9.na9a9#D.naY.RaYbna0a0b#aobgb#bg.Va0aCaY#D#Mbl#Mbl#Dblbl#Dbl#Dbl#Dbl#Dblbla9#pbla9#p#pa9#p#p#p#p#p#pa9#pa9#p#p#p#pa9a9afa9aja9afaf#Lafaf#La9afa9#Lafa9a9af#sa9#Dbl#DaYbl.N#UbnbnbnaYaY#IaYaY#MaY#xaYaYaYaY", +"aYaYbn.Ca0a0#I#xaYaYblbl.naf#Lafaja2#La2#La2a2a2#La2#La2#La2#La2a2a2#L#L#L#L#L#Lafa9af#D#p#Dbl#D#F.nblblaYaYaYaYa9.n.7a9a9.7a9.7afafaf#L#L#L#L#La2#ga2#ga2bpa2#L#ga2a2#L#L#L#L#L#Laj#Laf.7a9bja9.7#D.7#D#D#D.Naw#D#M#D#p#D#p#D#Dbl#sbl#Dblbl#Dbla9.na9.naf#paja9afa9.na9a9afa9a9afajafa9a9a9blblaYawaY#Ua0aC.5am.V.Vb#ama0aYaY#xblaY#DaYbl#M#Dbl#Dbla9bla9bla9bl#D#p.n#pbla9bl#p#p.na9#p.na9#p.na9bl.na9afa9a9a9a9afa9#La9af.7afa9a9#Laf#Lafa9a9a9a9a9#D#DaY#saYbnbn#U#x#UaYaYaYaYaYaYawaYaYaY#x", +"aY#xbna0a0a0a0bnaYaY#Mbla9a9a9af#L#Laf#L#L#L#Lafa2#La2#La2#La2a2#La2afa2af#L.7#La9a9#D#D#D#D#DaY#pblbl#MaYaYbl.Na9a9a9.7a9#L.Eaf.naf#Laf#L#L#L#La2a2bpa2#ga2#ga2a2#L#L#L#L.7a9a9a9a9afa9a9#D#D#sa9.nbl#DaYblaYaYbl#D#D#D#M#Dbl#sblbl#Dbl#sbl#D#Ma9a9a9a9a9a9a9a9a9a9a9a9.na9a9a9.n#pa9a9#D#sbl#saYaY.RaY#xa0a0aCa0#Ua0aCbnaYaYawbl#sbl#M#Dblbl#D#pa9a9a9a9a9a9a9#p#p#D#p.n#pa9.n#p#p#pbl#pa9a9#p#pa9#p#pa9a9afa9af#Lafaf#Lafaf#La9a9afa9af#La9afa9a9bl#D#p#DaY#DbnaCbnbnaYaY#IaYaYaw#xaYaYbn#I.R", +".Raw#xa0aC.Ca0a0.baYaYblbla9a9af#Laf#L#La2afa2#L#La2#Lafa2#La2a2a2a2a2#L#L#Laf#L#D#p#Dbl#DblaYaY#pblblbl#Dbl#D#Dafa9af#L#La9#L.7afaf#Lajaf#L#L#L#L#ga2a2#La2bpa2#L#L#Laf#La9.7#Da9a9a9#D#Dbl#DaYblblaYaYaYawaYaY#xawaYaYaYaYaYaYaYaYaYaYaY.NblaYa9a9#pa9a9#pa9#p.n#Da9a9a9#Da9#D#pa9bl.na9blaYblblaYaY#IaYbnbna0#Ua0b#b#a0aYaYblblbl.Nblbl#Dbl#Da9a9afa9afa9afa9#Ma9#pa9#pbl#pbl#p#p#pa9#pa9#pa9a9bl#p.na9a9a9a9#La9af.7afa9#La9afa9a9af.7afafafa9a9a9#D#D#DblaYbnbn#Ibn#IaY.RawaYaYaYaYaYaY#x#x", +"bnbnbnbna0a0a0amaYaYaYaY#D.na9a9afa9afa9#L#L#Laf#L#L#La2#La2#L#La2#L#Laf#L#L#Laf#D#Dbl#DblaYaYaYa9.nblbl#D#D#Dblafaf#L#L#L#L#L#L.naf#Laf#L#L#L#L#ga2bpa2#ga2a2#gaf.3af.7afa9a9.n#D#Dbl#sblbl.NaYaYaYaYawaY#x#xaYaYaYaYaYawaYawaYaYawaYawaYblaYblblbl#Dbl#M#Dblbl#Dbl#D#Dbl#s#Dbl.n#pa9blawblawaYaw.RaY.RaY#U#xbn#UbnaCaOama0aYbl#Dbl#Mbl.Nblbl#Da9.na9a9a9a9a9a9a9#pbl#pa9#pa9#p#p#p#M#p#p.n#pa9.n#pa9#pa9a9afa9#Lafa9afa9#Lafafa9afafa9af#La9#La9af#Dbl#Daw.NawbnbnbnbnaYaY#xaYbn.baY.RaY#xbnbn", +"ama0bna0#Uambgb#aY.RawaYbl#Da9a9a9.7a9.7a9af.7#L#La2af#Laf#L#L#La2a2#La2#Laf#L.7#pblblaYaYblaYaYblblbl#Da9a9a9.7afajaf#L.3#L#L#L#Lafaf#L#L#L#L#L#L#ga2a2bpa2bpa2#La9#Lafa9af#D#D#Dbl#DaYaYaw#xaYaYawaYaY#xbnbnaYawaYaYaYaYbnaYaYaY.RaY.RaY.baYawbl#Mblblblbl#Mblbl#D#D#M#Dbl#D#D#pbl#MblblaYaYaY.RaYaYawbnaYbnawaYaYa0aO.Fa0#x.R#Dbl.Nbl#Mbl#sbla9a9a9a9afafafaf#p#p.na9bl.nbl#p.n#p#pa9#pa9a9#p#pbl#pa9a9a9a9a9#La9afa9a9afa9#Laf#La9afa9af#Lafa9a9#D#Dbl#DblaYbna0#Ubn#I.RawaYawaYaYaY#UbnaCbn", +".Va0bna0.V.Vb#.5bn#xaYaYaY#Da9a9a9#La9#La9#L#Laf#L#L#La2#La2afa2#La2#Laf#La9a9a9blaY#MaYaYaYaYaYbl#Dbl#Dafa9#L#Lafa2a2a2a2a2#L#Lafaj#Laf#L#L#L#La2a2bpa2#ga2a2#gafafafa9a9a9bl#pbl#DblaYaYaYaY#xaY.Rbnbn#Ua0a0a0aYaYaYaYaYaYaY#U.R.b.R.R#U.Rbn.RaYaYawblaYblaYbl.N#MaY#DaYblaYbl#sblblblawblaYaYawbnaY.RaYaw.RaY#IbnaCb#aOb#.Vbn#DblblawaYblbl#Da9a9a9a9.7a9.7a9#D#pbl#p#p#pa9#p#p#p#pbla9#pa9a9#pa9.n#pa9.na9a9afafa9a9afa9#Laf.7af#La9afa9#Lafa9a9a9bl#s#DaY#sbnbnbnbnaYaY#x.Rbnbnbnbnbn#xa0a0", +"a0.Vbn.bbna0b#b##UbnaYaY#D#Ma9a9.Ea9a9a9.7a9.7#Lafa2a2#La2af#L#La2a2#L#L#Laf.7.7blblaYblaYaYaYaY#DaYa9a9a9#La2#La2a2#La2#L#ga2#Lafafafa2#L#L#L#L#L#ga2#g#La2bpa2afafa9af#p#Da9#D#DaY#D#DaYaYaY#x.RaYaYbnbna0a0a0aYaYaY.RaY#UaYaYaYaYaYaYaYaYaYaYawblaYaYaYblaYblaYbl.NblaY#s.Nblblbl#MblaYawaYaY.Raw.RawaY.b#x.baY#xa0aob#bga0bnbl#sblaYaYbl#sbla9.n.7a9.n.7a9a9#pa9#pa9#p#D#pbl#p#p.na9#p.na9#p.n#pbl#pa9a9a9af.7a9afa9.na9a9afaf#Lafa9afa9af#La9.nbl#D#D#DblaYbnbn#UaYaYaYawaY.RaY.Rawbnbna0a0", +"aYaYaYaYaYaY.N#xaYaYawbnaYaYaYaYbl#Dafa9afa9.7#L#L#L#L#L#L#L#L#L.3a2afafa9#D#DaY.R.R#x.RaYawaYaYa9.7a9#L#L#Lafa2a2a2a2a2#g#L#L#Lafafajafafa2#L#L#L#L.7#L#L#L#L#L#L#L#Laf.7#La9a9a9.7a9#D#D#D#D#Dblbl#IaY#xaY#xaYaYaYaYawaYaYaYaYaYawaYaYawaYaYaw#Fbl#M#FblaYaYaY.R.R.R.R.R.R.R.RawaYaYaYaYaYaYawaYbl.NaYaYaYbn#Ibn.baY#Ua0aOb#.Vbg#HaY.bbla9a9.na9a9a9a9.7a9a9.Ea9#p.na9a9.n#pa9#pbl#p#pa9#p#pa9#p#pa9#pa9#pa9a9#pa9.na9afafaf#L#Laf#L#L#L#L#Lafa9a9a9#pblbl.Nbl#x.R#xaY.R#x#xaYaw.RaYaYaYaYaY#D", +"aYblaYaYaY#IaY.NblawaYaYaYaYaYaY#Dbla9a9a9a9a9#L#L#L#L#L#L#L#L#L#Laf#Lafa9#Dbl.N.R.Raw.RaYaYaYaY.7#Da9.7af#La2#La2#ga2#ga2#L#L#Lafafafaf#L#L#L#L.7#L#L#L#L.7#L.7a2a2#L#Laf#La9bja9#D.7#D#D#D#D#D#D#DaYaYaYaYaY#xaYaYaYaYaYaYaYaw#xaY#xaYaYawaYaYbl#FblaY#MaYblaw.R.b.R#MaY#FaY#FaYaYaYblaY#MaYaYblawaY.RawaYawaYbnaY#Ibnao#SaBaF.p#H#U.RaY#Ma9#Da9a9.7a9a9a9a9a9a9a9a9#pa9#pa9.na9#pa9a9#pa9#pa9#p#D#p#s#pa9a9afa9af#pafafafafaf#L#L#Lafaj#Lafaja9#pa9a9#Dbl#DblaY#UaYaYaw#x#xbnaYblaw.RaYaY#Dbl", +"blaYblaYaY#D.NaY#pblblaY.RaYaYaYbl#Dbl#Da9a9.7a9#L#L#L#L#L#Laf#Laf.nafa9#D#DaYaYbn.RbnaYaY.R#xaYa9.7a9#L#L#La2#La2a2#g#L#L#L#L.7afajafaf#Laf#L#L#L#L#L#L#L#L#L#La2#La2a2#L#L#L#L#L#La9.7#Da9bj#DblblaYaYaYaYaYaYbl#Dbl#D#Dbl#Dblbl#Mbl#MaYblaY#Mbl.nbl#pa9aYblaYblaYaYaY.RawaYaY#M#F#M#Fbl#F#F#M#p#p#p#MblaYaYaY#UbnbnaCam#SaBbm#H.p.p.RaYaYbla9.na9a9.na9a9a9a9a9#pa9a9#pa9#pa9#pbla9#pa9#pa9#pa9#p#p#pa9#pa9#pa9#pa9a9afafafaf.3afajafafafafafa9.n#pa9#p#Dbl.N.RbnaY.RaYbnaY#x.b.RaYaYblbl#Dbl", +"#DblblaY#Dbl#D#Dbl#DawaYaYawaYaYaYaYbl#Dbl#D#Da9#Da9#Da9#Da9.7a9a9#p#Dbl#DaYaYaw.R.RaYbnaYaY#xaY#D#Da9.7#L#L#L#La2#ga2#L#L#L.7afafafafafaj#L#L#L#L#L#L#La2#L#L#La2a2a2#La2#L.7#La9#L.7a9.7#D#D#D.N#Dbl.sbl#D#Dbl#D#D#D#Dbl#D#D#Da9#D#D#Da9#D.n#D#pa9#pa9a9blblblblaYblblblblblbl#p#Fbl#p#pbl#pbl#p#M#pblbl#Faw#FbnbnaCamaCaF#SaZ#Hb#bgbnaw.Raw#Da9a9a9a9a9a9.na9afa9a9#p.na9a9#p.na9#pa9#pa9#pa9#M#p#D#p.na9a9a9af#pajafafafafaf#Lafa9afa9a9afaf#paf#p.n#Dbl#DblbnaYbn#Ubn#x#U#xbn.baYblaY#DaY#D", +"blblaY#DaY#D#D#Dbl#Dbl#DblaYaYaYaYaYaYaY#M#Dbla9#D#D#D#D#D#D#D#Dbl#Dbl#DaYaYaYaYbn.R#U.RaY.R#xaY.7a9.7#Laf#La2#La2a2#L#L#L#La9.7afafafaf#Laf#L#La2#g#L#g#L#ga2a2a2a2#La2a2#La2#L#L#Laf.7a9a9#Da9#DblaYaYbl.Nbl#Da9a9a9a9a9a9a9a9.na9.na9a9.na9a9ajafa9.na9a9.na9blblbl#Dblblblbl#M#p#p#p#p#p.n#p#p#p#p#M#pblbl#MbnbnbnaCa0aF#SaZ.V.V.VbgbnaYaYaYbl#D#D#D#D#D#Dbla9#p.na9#pa9#pa9#pbla9#pa9#pa9#pa9#pa9#pa9#pa9af#pa9#pafafaf#Lafa9a9a9a9a9afa9a9afafa9#p#Dbl#saY#x.bbn#xbn#I#xbnbnbnbnawbl#Dblbl", +"a9#pa9bl#M#Dbl#Da9a9#D#D#D#D#D.Nbn#U.RaYaYaY#D#Dbl#D#Dbl#D#Dbl#DaYblaYaYaYawaYaYaY.RaYbn#xaw#xaY.7a9#D#L.7a2#Laf#L#Laf#La9a9#Da9afafajaf#L#L#L#Lbpa2a2a2#ga2a2bpa2a2a2a2a2a2#La2.3#L#L#La9.7a9.7bl.NaYaY#D#pa9#pa9a9a9afafa9a9a9afafafajafafafafafajaf#La9a9a9bj.na9#D.n#Da9#s#D#p#p#p#p.n#pbl#p#p.n#pa9bl#Mblbl#UaY#U#x#Ub#aB.l.V.V.V.VaCbnaY.R#D#Mblbl#Mblblbla9#pa9#pafa9a9#pa9#p#pa9#pa9#pa9#pbl.n#D#pa9#pa9afafafafafafafafafa9#p.na9a9a9a9afafafa9#p#DaYaY.Rbn#x#Ubnbn#xaCa0aCbnaYaYblbla9", +"#pa9#p#Dbl#Da9#Da9afa9bla9bl#DblaYaYbnaYaYaYaYaYblaYblaYblaYaYblaYaYaYaYaYaYaYaY.Rbn.R#xaY.RaYaYa9.7a9#Laf#L#L#Lafaf#Lafa9a9a9.nafafafaf#Laf#L#Laa#ga2#ga2a2#ga2aaasa2a2#La2a2#L#L#L.3#La9.7a9#DaYblaYblbla9a9ajaf#Laf#L#Lafajaf#Lafafaf#Laf#L#La2#L#L#L#L#L.7.7a9a9a9a9a9.na9a9.na9a9a9a9a9a9.na9a9.n#D#D#D#D#D#MblawawbnaC.F.t.Fb#.Vb#.Vbnaw#xaYaYaYaY.NaY#D#Da9#pa9a9#p.n#pa9.nbla9#pa9#pa9#pa9#p#p#pa9.na9afafafafafafafafafa9a9afa9af#pafafafafa9#p#Dblblaw#xbn#Ubn#x#IbnaCb#aCbnawaY#D.na9", +"#pa9#pa9a9#Dbla9a9a9af#D#Da9#D#D#xbn#xbnaYaYblaYaYaYaYaYaYaYaYaYbnaYaYaYaYaYaYaY.R.R.RbnaYaYaYaY#D.7#Da9#La2#Lafajafafa9a9a9a9#Dafafafaf#La2#L#La2a2#ga2a2#gaaa2asaaa2a2a2a2a2a2a2#L#L#La9a9.7a9#D.saY#D.n#pafaf#Lafaj#L#Laf#L#Laf#L#L#L#L#Lafaja2a2a2a2#L.E#L#La9a9a9.7a9a9a9a9a9.7a9.na9a9a9a9.E#L.7.7#D#s#D#s#Fblbl#M#xbnbg.t.F.t.V.V.VaCa0aY#DaYaYaYaY.Nblbl.na9#p.na9a9#pa9#p#pa9#pa9#pa9#pa9#p#D#pa9#p#pa9afafafaf#Lafafa9af#pa9#pa9afa9afafaf#pa9a9#D#DaYbnbn#xbn#Ua0bna0bg.Va0aYblbl#pa9" +}; diff --git a/examples/themes/metal.cpp b/examples/themes/metal.cpp new file mode 100644 index 000000000..02b0c02b2 --- /dev/null +++ b/examples/themes/metal.cpp @@ -0,0 +1,486 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "metal.h" + +#ifndef QT_NO_STYLE_WINDOWS + +#include "qapplication.h" +#include "qcombobox.h" +#include "qpainter.h" +#include "qdrawutil.h" // for now +#include "qpixmap.h" // for now +#include "qpalette.h" // for now +#include "qwidget.h" +#include "qlabel.h" +#include "qimage.h" +#include "qpushbutton.h" +#include "qwidget.h" +#include "qrangecontrol.h" +#include "qscrollbar.h" +#include "qslider.h" +#include <limits.h> + + +///////////////////////////////////////////////////////// +//#include "stonedark.xpm" +#include "stone1.xpm" +#include "marble.xpm" +/////////////////////////////////////////////////////// + + + +MetalStyle::MetalStyle() : TQWindowsStyle() { } + +/*! + Reimplementation from TQStyle + */ +void MetalStyle::polish( TQApplication *app) +{ + oldPalette = app->palette(); + + // we simply create a nice TQColorGroup with a couple of fancy + // pixmaps here and apply to it all widgets + + TQFont f("times", app->font().pointSize() ); + f.setBold( TRUE ); + f.setItalic( TRUE ); + app->setFont( f, TRUE, "TQMenuBar"); + app->setFont( f, TRUE, "TQPopupMenu"); + + + + // TQPixmap button( stonedark_xpm ); + + TQColor gold("#B9B9A5A54040"); //same as topgrad below + TQPixmap button( 1, 1 ); button.fill( gold ); + + TQPixmap background(marble_xpm); + TQPixmap dark( 1, 1 ); dark.fill( red.dark() ); + TQPixmap mid( stone1_xpm ); + TQPixmap light( stone1_xpm );//1, 1 ); light.fill( green ); + + TQPalette op = app->palette(); + + TQColor backCol( 227,227,227 ); + + // TQPalette op(white); + TQColorGroup active (op.active().foreground(), + TQBrush(op.active().button(),button), + TQBrush(op.active().light(), light), + TQBrush(op.active().dark(), dark), + TQBrush(op.active().mid(), mid), + op.active().text(), + TQt::white, + op.active().base(),// TQColor(236,182,120), + TQBrush(backCol, background) + ); + active.setColor( TQColorGroup::ButtonText, TQt::white ); + active.setColor( TQColorGroup::Shadow, TQt::black ); + TQColorGroup disabled (op.disabled().foreground(), + TQBrush(op.disabled().button(),button), + TQBrush(op.disabled().light(), light), + op.disabled().dark(), + TQBrush(op.disabled().mid(), mid), + op.disabled().text(), + TQt::white, + op.disabled().base(),// TQColor(236,182,120), + TQBrush(backCol, background) + ); + + TQPalette newPalette( active, disabled, active ); + app->setPalette( newPalette, TRUE ); +} + +/*! + Reimplementation from TQStyle + */ +void MetalStyle::unPolish( TQApplication *app) +{ + app->setPalette(oldPalette, TRUE); + app->setFont( app->font(), TRUE ); +} + +/*! + Reimplementation from TQStyle + */ +void MetalStyle::polish( TQWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if (w->inherits("TQPushButton")){ + w->setBackgroundMode( TQWidget::NoBackground ); + return; + } + + if ( !w->isTopLevel() ) { + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( TQWidget::WindowOrigin ); + } +} + +void MetalStyle::unPolish( TQWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if (w->inherits("TQPushButton")){ + w->setBackgroundMode( TQWidget::PaletteButton ); + return; + } + if ( !w->isTopLevel() ) { + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( TQWidget::WidgetOrigin ); + } + +} + +void MetalStyle::drawPrimitive( PrimitiveElement pe, + TQPainter *p, + const TQRect &r, + const TQColorGroup &cg, + SFlags flags, const TQStyleOption& opt ) const +{ + switch( pe ) { + case PE_HeaderSection: + if ( flags & Style_Sunken ) + flags ^= Style_Sunken | Style_Raised; + // fall through + case PE_ButtonBevel: + case PE_ButtonCommand: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + (flags & (Style_Sunken|Style_On|Style_Down)), + TRUE, !(flags & Style_Raised) ); + break; + case PE_PanelMenuBar: + drawMetalFrame( p, r.x(), r.y(), r.width(), r.height() ); + break; + case PE_ScrollBarAddLine: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + flags & Style_Down, !( flags & Style_Horizontal ) ); + drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowRight :PE_ArrowDown, + p, r, cg, flags, opt ); + break; + case PE_ScrollBarSubLine: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + flags & Style_Down, !( flags & Style_Horizontal ) ); + drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowLeft : PE_ArrowUp, + p, r, cg, flags, opt ); + break; + + + case PE_ScrollBarSlider: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), FALSE, + flags & Style_Horizontal ); + break; + default: + TQWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt ); + break; + } +} + +void MetalStyle::drawControl( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how, + const TQStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + const TQPushButton *btn; + btn = (const TQPushButton*)widget; + int x1, y1, x2, y2; + + r.coords( &x1, &y1, &x2, &y2 ); + + p->setPen( cg.foreground() ); + p->setBrush( TQBrush(cg.button(), NoBrush) ); + + + TQBrush fill; + if ( btn->isDown() ) + fill = cg.brush( TQColorGroup::Mid ); + else if ( btn->isOn() ) + fill = TQBrush( cg.mid(), Dense4Pattern ); + else + fill = cg.brush( TQColorGroup::Button ); + + if ( btn->isDefault() ) { + TQPointArray a; + a.setPoints( 9, + x1, y1, x2, y1, x2, y2, x1, y2, x1, y1+1, + x2-1, y1+1, x2-1, y2-1, x1+1, y2-1, x1+1, y1+1 ); + p->setPen( TQt::black ); + p->drawPolyline( a ); + x1 += 2; + y1 += 2; + x2 -= 2; + y2 -= 2; + } + SFlags flags = Style_Default; + if ( btn->isOn() ) + flags |= Style_On; + if ( btn->isDown() ) + flags |= Style_Down; + if ( !btn->isFlat() && !btn->isDown() ) + flags |= Style_Raised; + drawPrimitive( PE_ButtonCommand, p, + TQRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1), + cg, flags, opt ); + + if ( btn->isMenuButton() ) { + flags = Style_Default; + if ( btn->isEnabled() ) + flags |= Style_Enabled; + + int dx = ( y1 - y2 - 4 ) / 3; + drawPrimitive( PE_ArrowDown, p, + TQRect(x2 - dx, dx, y1, y2 - y1), + cg, flags, opt ); + } + if ( p->brush().style() != NoBrush ) + p->setBrush( NoBrush ); + break; + } + case CE_PushButtonLabel: + { + const TQPushButton *btn; + btn = (const TQPushButton*)widget; + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + int dx = 0; + int dy = 0; + if ( btn->isMenuButton() ) + dx = ( y2 - y1 ) / 3; + if ( btn->isOn() || btn->isDown() ) { + dx--; + dy--; + } + if ( dx || dy ) + p->translate( dx, dy ); + x += 2; + y += 2; + w -= 4; + h -= 4; + drawItem( p, TQRect( x, y, w, h ), + AlignCenter|ShowPrefix, + cg, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, + (btn->isDown() || btn->isOn())? &cg.brightText() : &cg.buttonText() ); + if ( dx || dy ) + p->translate( -dx, -dy ); + break; + } + default: + TQWindowsStyle::drawControl( element, p, widget, r, cg, how, opt ); + break; + } +} +void MetalStyle::drawComplexControl( ComplexControl cc, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how, + SCFlags sub, + SCFlags subActive, + const TQStyleOption& opt ) const +{ + switch ( cc ) { + case CC_Slider: + { + const TQSlider *slider = ( const TQSlider* ) widget; + TQRect handle = querySubControlMetrics( CC_Slider, widget, + SC_SliderHandle, opt); + if ( sub & SC_SliderGroove ) + TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, + SC_SliderGroove, subActive, opt ); + if ( (sub & SC_SliderHandle) && handle.isValid() ) + drawMetalButton( p, handle.x(), handle.y(), handle.width(), + handle.height(), FALSE, + slider->orientation() == TQSlider::Horizontal); + break; + } + case CC_ComboBox: + { + // not exactly correct... + const TQComboBox *cmb = ( const TQComboBox* ) widget; + + qDrawWinPanel( p, r.x(), r.y(), r.width(), r.height(), cg, TRUE, + cmb->isEnabled() ? &cg.brush( TQColorGroup::Base ) : + &cg.brush( TQColorGroup::Background ) ); + drawMetalButton( p, r.x() + r.width() - 2 - 16, r.y() + 2, 16, r.height() - 4, + how & Style_Sunken, TRUE ); + drawPrimitive( PE_ArrowDown, p, + TQRect( r.x() + r.width() - 2 - 16 + 2, + r.y() + 2 + 2, 16 - 4, r.height() - 4 -4 ), + cg, + cmb->isEnabled() ? Style_Enabled : Style_Default, + opt ); + break; + } + default: + TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, sub, subActive, + opt ); + break; + } +} + + +/*! + Draw a metallic button, sunken if \a sunken is TRUE, horizontal if + /a horz is TRUE. +*/ + +void MetalStyle::drawMetalButton( TQPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat ) const +{ + + drawMetalFrame( p, x, y, w, h ); + drawMetalGradient( p, x, y, w, h, sunken, horz, flat ); +} + + + + +void MetalStyle::drawMetalFrame( TQPainter *p, int x, int y, int w, int h ) const +{ + TQColor top1("#878769691515"); + TQColor top2("#C6C6B4B44949"); + + TQColor bot2("#70705B5B1414"); + TQColor bot1("#56564A4A0E0E"); //first from the bottom + + + int x2 = x + w - 1; + int y2 = y + h - 1; + + //frame: + + p->setPen( top1 ); + p->drawLine( x, y2, x, y ); + p->drawLine( x, y, x2-1, y ); + p->setPen( top2 ); + p->drawLine( x+1, y2 -1, x+1, y+1 ); + p->drawLine( x+1, y+1 , x2-2, y+1 ); + + p->setPen( bot1 ); + p->drawLine( x+1, y2, x2, y2 ); + p->drawLine( x2, y2, x2, y ); + p->setPen( bot2 ); + p->drawLine( x+1, y2-1, x2-1, y2-1 ); + p->drawLine( x2-1, y2-1, x2-1, y+1 ); + + +} + + +void MetalStyle::drawMetalGradient( TQPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat ) const + +{ + TQColor highlight("#E8E8DDDD6565"); + TQColor subh1("#CECEBDBD5151"); + TQColor subh2("#BFBFACAC4545"); + + TQColor topgrad("#B9B9A5A54040"); + TQColor botgrad("#89896C6C1A1A"); + + + + if ( flat && !sunken ) { + p->fillRect( x + 2, y + 2, w - 4,h -4, topgrad ); + } else { + // highlight: + int i = 0; + int x1 = x + 2; + int y1 = y + 2; + int x2 = x + w - 1; + int y2 = y + h - 1; + if ( horz ) + x2 = x2 - 2; + else + y2 = y2 - 2; + +#define DRAWLINE if (horz) \ + p->drawLine( x1, y1+i, x2, y1+i ); \ + else \ + p->drawLine( x1+i, y1, x1+i, y2 ); \ + i++; + + if ( !sunken ) { + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + p->setPen( subh1 ); + DRAWLINE; + p->setPen( subh2 ); + DRAWLINE; + } + // gradient: + int ng = (horz ? h : w) - 8; // how many lines for the gradient? + + int h1, h2, s1, s2, v1, v2; + if ( !sunken ) { + topgrad.hsv( &h1, &s1, &v1 ); + botgrad.hsv( &h2, &s2, &v2 ); + } else { + botgrad.hsv( &h1, &s1, &v1 ); + topgrad.hsv( &h2, &s2, &v2 ); + } + + if ( ng > 1 ) { + for ( int j =0; j < ng; j++ ) { + p->setPen( TQColor( h1 + ((h2-h1)*j)/(ng-1), + s1 + ((s2-s1)*j)/(ng-1), + v1 + ((v2-v1)*j)/(ng-1), TQColor::Hsv ) ); + DRAWLINE; + } + } else if ( ng == 1 ) { + p->setPen( TQColor((h1+h2)/2, (s1+s2)/2, (v1+v2)/2, TQColor::Hsv) ); + DRAWLINE; + } + if ( sunken ) { + p->setPen( subh2 ); + DRAWLINE; + + p->setPen( subh1 ); + DRAWLINE; + + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + } + } +} + + + +int MetalStyle::pixelMetric( PixelMetric metric, const TQWidget *w ) const +{ + switch ( metric ) { + case PM_MenuBarFrameWidth: + return 2; + default: + return TQWindowsStyle::pixelMetric( metric, w ); + } +} + +#endif diff --git a/examples/themes/metal.h b/examples/themes/metal.h new file mode 100644 index 000000000..95ff6111f --- /dev/null +++ b/examples/themes/metal.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Definition of the Metal Style for the themes example +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef METAL_H +#define METAL_H + + +#include <qpalette.h> + +#ifndef QT_NO_STYLE_WINDOWS + +#include <qwindowsstyle.h> + + +class MetalStyle : public TQWindowsStyle +{ +public: + MetalStyle(); + void polish( TQApplication*); + void unPolish( TQApplication*); + void polish( TQWidget* ); + void unPolish( TQWidget* ); + + void drawPrimitive( PrimitiveElement pe, + TQPainter *p, + const TQRect &r, + const TQColorGroup &cg, + SFlags flags = Style_Default, + const TQStyleOption& = TQStyleOption::Default) const; + + void drawControl( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how = Style_Default, + const TQStyleOption& = TQStyleOption::Default ) const; + + void drawComplexControl( ComplexControl cc, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how = Style_Default, + SCFlags sub = SC_All, + SCFlags subActive = SC_None, + const TQStyleOption& = TQStyleOption::Default ) const; + int pixelMetric( PixelMetric, const TQWidget * ) const; + + +private: + void drawMetalFrame( TQPainter *p, int x, int y, int w, int h ) const; + void drawMetalGradient( TQPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat=FALSE ) const; + void drawMetalButton( TQPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat=FALSE ) const; + TQPalette oldPalette; +}; + +#endif + +#endif diff --git a/examples/themes/metal.xpm b/examples/themes/metal.xpm new file mode 100644 index 000000000..0d72650e3 --- /dev/null +++ b/examples/themes/metal.xpm @@ -0,0 +1,130 @@ +/* XPM */ +static const char *metal_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 154 77 46 1", +/* colors */ +". c #040204", +"# c #4c4e4c", +"a c #6c767c", +"b c #5c6264", +"c c #848a8c", +"d c #545a5c", +"e c #7c8284", +"f c #646e74", +"g c #3c3e3c", +"h c #444644", +"i c #8c9294", +"j c #4c565c", +"k c #7c7e84", +"l c #646a6c", +"m c #747e84", +"n c #4c525c", +"o c #74767c", +"p c #64666c", +"q c #8c8e94", +"r c #5c5e64", +"s c #84868c", +"t c #6c6e74", +"u c #444244", +"v c #4c4a4c", +"w c #4c5254", +"x c #5c666c", +"y c #848e94", +"z c #545e64", +"A c #7c868c", +"B c #3c4244", +"C c #444a4c", +"D c #8c969c", +"E c #747a7c", +"F c #6c7274", +"G c #4c4e54", +"H c #5c626c", +"I c #848a94", +"J c #545a64", +"K c #7c828c", +"L c #3c3e44", +"M c #44464c", +"N c #8c929c", +"O c #54565c", +"P c #646a74", +"Q c #747a84", +"R c #6c727c", +/* pixels */ +"DNDDDDDDDDDDNDNDNDNNiNNiNiNyiyiyqyyyyIyIcIcIcAsAsAAKAKeKememkmmmQEQEEaoaoaaFRFFFftftlfPllllpxpxpxHbbbrbrzrzrJddddOdOOjOjOnwwwwwGwGG#GCGC#CCCCCCCMCMMMhMBhB", +"DDDNDNDNDNDNDDNDiDNDNDiyNNiNNyNyiyqyqyIyIIcIcIAcAsAseAKeKekemkmkEmEQEEoaoaoRFRFFtFtftltlPllplpxpbpbHbbrbrrzrdrdJdddOOOOjOwOwOGwwwGwGGGCGCG#CvCCMCMCCMMMMMM", +"NNDNDNDNDNDNDiDNDNiNiNNDNNyNyqNqyqyqycyIcIcIAIAsAsAKAKKeKkKmkmkEmQQoQoEaoFoaFRtRFftftfPlPpllpxpbpbHbbbbrzrrdrdrdddOddOOwOOwOwwwwGwGwCGwCGGCvCCvCCChCMCBhMB", +"DDiDNDNDNDiDNNNiNNDiNyNiyNiyNyyNyyyIqIIcIcIAIcAsAAseKeKemKmkmkQmEEQEoaEaoaFRoFFtttftltlPlPppxppxbpbHbrrrrzrzrdddJdOdjOOOjwOwwOGwGwGGw#CGGCvCvCCCMMCMhCMCBM", +"iNNNiNiNiNNiDNDNNiNyNiNiNyNyiyqyqIqyIIyIcIcIcAsAsKAKAKeKeekmkmEkQQEEQaooaRoFFtRFFftltflPllllppxpHbpbHbbzrrdrdrOrOddOOjOwOOGOwGwwGwGwCGGCGCCGCCMvCCMCMMhMMB", +"NiNNNNNNNNiNiNiNiNNNiyNyiqyNyqyyyyIyIcIcIAcAsAsAAAseKeKmkmkmkQmEEQEoaEaoRoFRRFtfttftlPtllppxpxpbpbbrbrrbrzrdddddOdOOdOOwOwwOGOGwGGGGwCGGCGCCvCvCMMCMhMBChM", +"iNNiiNiiNiNNiNiNyiyNyNyNyyqyqyyqIqycIcIcIsIsAsAAseKeKeeeKmkmmkQQQoEQooaoFaFRFFRFtftPtlllPplpxpbpbbHbbbrrzrrdrdrdddOdwOOjOwOwwwwGwGwCGGGCGCGCGCCCMCMCMCMMMB", +"NyNiNiNiNiNiyNiyNNyiNyqyNyyqyyqIIIIIcIcAIAcAsAsKAKKeKkmkmkmkQEQEEQaoaoaaoFRFFtftftflPlPllpxppxpbbpbbrbrzrrdrdOJOdOOOOOwOwOwwOGwGwGGw#CGCGCvCCCvMCMMMhMhBMh", +"yNiyNyNyiyNyiNyNiyqyyiyqyqyyyIIIycIcIAsIcAsAsAKAeKeKeeKmkmkmEmQEQoEEaoRoRFRFRtFttltftlPlplppxpbpbHrbbrrrrdrddrOrdOdOdwOwOwOGwGwwGGwCGwCGCGCCvMCCMCMCCBMMMB", +"qyNyiqyNyNyNyyqyyNyqyyqyyyqIIyIycIcIcIAcAsAAAKsKKeKemkmkmkmQkEEQEoaoaoaFFRFFtRftftlPllllpxpxpbbHpbbrrrzrzrdJrOdOOdOjOOOwOwwwOGGwGG#GGCGCGCvCCvCMCCMhMCMBMh", +"NyqyqyNyqyqyqyNyqyqyqyyIqIIyIcIcIIcIAsIAsAsAsAeAKeKkKkKmkmEQEQEQaoEaoaRFoRFRfttftPflPlPplpxppHpbbrHbbzrrzrdrdddddOOdwOwOwwOwGwGwGwCwCGGCGCCGCCCCMMCMMMMhMB", +"yqyqyyqyqyqyqyqyyqyyIyqIyIyIcIIcIsAIcAsAAsAKKKKeeKmemmmkmQkQEQEoEaoaoFoFRFFtFtftftltlllpplpxbpbHbbbrrrzrdrdddJdOdOOOOjOwOwwwwwGwGGGGGCGCGCvCCGMMCMMhMBCBMB", +"yyyyyqyyqyyqyyyqyyyIyIyIIcIcIIcIAIcAsAsAsKAeAKeKekKmkkmQkmQEQEoQaooaoaFRFRtFttftPlPllPplpxpxpbpbbHrbzrrrrdrdrOddOdjOwOwOwwOGOGwGw#GGCGCGCCGCCMCCMChCMMMhMB", +"IqyqyyqyyyqyyqIIIIqIIIIcIIcIccIscAsAsAAAKAsKeeKekmekmmkmEEEQEEoaoaoaRFoFFFtftftltlPlPplpxpxpbbbHbrbrrzrdzddddddOOOOOOwOwO#wGGwGGGCw#GCGCvCCvMCMCMMMMBCBMBM", +"IyIIIIIIIIIIIIyIyIIIyIcIccIcIcAIAsAsAAsKsKKeKeKmeKmkmkEmQQQEQaoEaoaRoFRFRtRFtftfltlPlplxpppbbpHbbbrbrrzrdrdrJOdOdOdwOwOwwwOwwGwwGwCGCGCGCCGCCCvMCMCMMhMhMB", +"IIIyIyIyIyIyIyIcIcIccIcIcAIAcAsAsAsAsKKAeKeKekKkkmkmkmQkEEEQoEoaoaoFRFRtFftftftlPlllplppxxpbpbbbrHrzrzrdrddOddOOOjOOwOwOwwGwGwG#GGGCwCGCvCCMvMCMMMhMBMBMBh", +"cIcIcIcIcIcIcIcIcIcIcIcIAscsAIAsAAsAKAKeKeKkeKmemkmkQmQEQEQoEoaoaoFRRFFRtFttltPltPpPlppxppbpbHbHrbrrrrdrdrOrdOddOdwOjOwOGOwwGwGGwCGGvGCGCCvCCCMCMCMhCMMhMB", +"IcIcIcIcIcIcIcIcIcIAIAcAIAAsAsAsAsKAKseKeKeKmkkmkmmQmkEQEEoaEaoaaRaoFFtFftftfPtllllppxppxbpbbbbbrrzrzrdrdddOdOdOOOOwOwwO#wGwGwG#CwCGCCvCvCCCMCMCMMMBMBhBMh", +"IAccIcIcIcIcIccIAIAscsAsAIsAsAsAAKAeKeKeKemkemkmmkQkEQEEQoQoaoaoFoFFFRtRttftltllPlPllppxppbHbpHrbbrrrdrddrddOdOOOjOOwwOwwwwGwGGwGGGCGCGCCCvCvMCMhCMMhMMMBB", +"csAIAsAsAsAAsAsAcsAIAAsAsAAAAAKKsKKKeKeKkeKmkmkmkQmEQEQoEaoaoaoRRFRFRtfFftftPlPlPlppxpxpbbHprrbrrzrzrdrdrOOddOOjOwOwOwO#OGwGwG#CwCGGCGCGCGMCMCMMMMBCBMBMhB", +"IAsAIAIsIAsIAIAIAsAsAsAsAsAsKsAKeAeeKeKemkmkmkmkQmEQEQEaQoEaoaFoRFRtFFtttftlfltPplplppxpHpbbbbrbbrzrrdrdOdddOdOOOOwOwOwwGwGwGGwGGGCGCvCvCCMCCMCMCMhMMhMBMB", +"sAsAsAsAsAsAsAsAsAsAsAAAKAKKKeKeKeKeekmKkmkmkmQmEQEQEEoEaoaoaoRFaFFRttftftltlPlpllpxpxpbxbpbHrbrrrrdzdrdrOdOdOjOjOwOwwwOGwwGGGCwGCGCGCCCGMCCMCMMhMBMBMBhBu", +"sAAsAsAAAsAAsAAsAAAAAsKsKKsAeKKeKeeKkKmkmkmkmmQEkEQEoQaooaoaRFoRFRFFfFtftftlPlPlplpxpbpbpbbrbrbrzrzrdrdOddOdOOOOOOwOwOwwwwGwGwGGGCGGCGCGCCMvCMMCMMCMMBMuMB", +"AAsAAAAsAAAsAAsKAsKKAKKKeKeKeKeKekkmmemkmmkQmkEQEQEEoEoaoaoRoFRFFttRtftfftlPtllpPpxpxpbbHbHbbrrzrzrdrddrOddOOjOwOwOwO#wGOGGGw#CGCGCCvCvMCvCMMMCMhBMhhMBMBu", +"KKAKKsAKKsAKAKKAKKKKKeAeKeKkKeeekKmKmkmkmkmQEEQEQEoQaoaoaoFaFRFFRFFtfttltlllllplpxpppbpbpbbrbrbrrrdrdrdddOdOdOOOwOwOwGOwGGwGwCwGGCGGCGCCMCMCCMMMMCBMBMBMBB", +"eAeKKeKKKKKKeKAeKAeeKeKeKeeKkmkmKmkmkmkmQmEQQEQEooQaooaoaRoFRFRFttfttfftlPPlpPppxppxbxbHbrbbrzrzrdrddddOddOOjOwOwOwwwOGwGwGGGGGC#CGCCCvCGMCMMCMhMMMhBMhBuB", +"eKeKeKKeKeeKeKeKeeeKeKeKeKmemkKkmkmkmkQQkEkEEQoEQEaEaoaFoaRFRFFRftFftftPltlPlllxppxpbpbpbHbrbrrzrzdrdrdJOdOdOOOOwOwOwwwwGwG#wCGGCGCvCGCCMCMCMhMMCBMBMBMBMB", +"KeKeKeeKeKeKeKeKeKeKekkkmekmKmmkmmkQQmEQEQEQEEoQaooaoaoRFFFRFFtFtftftlllPllpppppxpxbpbbrbrbrrzrrdrdddOddOdOjOwOwOwO#wGwGwGGGCwGCGCGCvCCvCMCCMCMhBCMhBMBuBu", +"kkKeeKeKeeKeKkKkkkkkKmKmkkmkmkkmmkEmmEkQEQEQoQaoaoaoaaFoFRRFFRtFfttltPtfllPllxlpxpbpbpbHbrbrzrrdrdrdrddOdOOOOdwOwOwwGOwwGw#wGGCGCGCGCCCMCMCMMMMMMhMBMMBMBB", +"KmekmekekKmememKmKmemkmkmmkmmmmkQQmkEEQEQoEoaEoEaoaaoFRRFFFRttfttfftllllPlppppxpxpbbHbbrbrrrrzrzdrOddOddOOjOwOwOwwOwwGGGGGCGCGG#CGCCvCvCMCMMChMBMBMMBhBuBu", +"ekmKkmkmkmkkkmkkmkmkmkmkmkmkmkQQEQEEQEQoEEaQoaoaoaoFRFoRFRFtFtFftPtfPltPplplxppxpbbpbHbHrbzrzrrdrdddJddOOdOOOjOwOw#OwwGwwGwGwCGCGCCGCCMCvMCMMMhCMMBMBuBMBB", +"kmkmkmkmkmkmkmkmkmkmkmmkmQmQQEEmkEQEQEEoQooaooaaRoFRoFFFFttFftftftlltllplPpppxpxpbpbbrbrbrrrzrdrddrOdOOOdjOwOwOwwOGGwGwG#GCGCG#CvCvCMGMCMCMMCMBMBMhBMBMBuB", +"mkmmmkmmkmmkmmkmmkmmmkQmQkQEkQEQEEQoEooEaEaoaoaoFaRFFRtRtRtfttftPltPllPllplxpxpbpHbbHbrbrrzrdrddrddOdddOOOOOwOwOwwwwwGwGGGGGGGCGCCGCCMCMCMChMhCMMBMMBuBuBB", +"QQQkQmkmmkmmkQQmkQQkEQEQEQEQEEQEoQoEoaQaoaoaaaoFRoFRFFFtFfttfftlftllPplppxpxpxpbbbprbrbrrrzrzdrdddddOOOjOjwOwOwwOGwOGwG#GCwC#CGCGCCvCCCMCMMMMBMBhMBhBMBMBu", +"EkmEkQQkQQkQQEkQEEQEmQkEQEQEEQoEQoEaQaoaoaoaoRFRRFFFRtRftFftftltllPllPlxppxpbpbbpbbHrbrbzrrdrrddrOdOdOdOOOOwOwOwwwGGGGwGwGGGCGCvCCvCCMvCMMCMhMMMMBuMBuBuBB", +"QEQEQEQEQEQEmQEQmEQEQEEQEEQEoEaQaoaooaoaoRRFFoFRFFRFtFtFftftlPflPlplppppxpxpbxpbbbrbbrrrrzrzdrddOdJOdOOjOwOwOwwOGwwGwG#CGCGCGCGCGCCMvCMMMCMhBCBhBMBMBMBBuB", +"EQEQEQEQEQEQEEQEEEQEEQEEQEoQaQooEaoaoaoaFoaoRFRFFRtFftftftftltltlPlPplxppxpbpbbHbHbrbzrzrdrdrddOrdOdOjOdwOwOwwOwGwGwGGwGwC#GCGCvCMGCCMCCMMMMMMMBMMBMBuBuBB", +"QEEQEEQEEQEEQEQEQEEQooaooaoaooaoaoaaaoRFoFFFRFFFttFttftftPtlPllplpplpxppxpbHbpbbrbrbrrrzrzdrddrOdOdOOOOwOOwOwO#wO#wGGwCGGGCGCGCCvCMCMCMMMChBChMMBhBMBBuBBB", +"EaoEoEoQoEoQoEoEoooEaEoQaoEoaoaoaoaoRFoRFRRRFtRtRttfttftltPltlPlPllpxppxpxbpbbbHbrbrrrzrrdrOrdOdOdOdOjOOwOjwOwwGGwGwGGG#GCGCGCCGCCvCMCMChMMMMBhBMBMBuuBBuL", +"oQaoaoEaEoaEoaoaoaQaoaoaoaaoaaoRRoFFRFRFRFFFFtFtfFftftftlPlPlPlpppplpxxpbpbbHbrbrbrrzrzrdrddddddOdOOOOwOwOwwwwOGwGwG#CwCGGCGCvCCCGMCMCMMMMBCMMBMhBuBBBuBBB", +"oaoaQoaooaEaoQaooaoaoaoaoaoaoaFoaRFoaRFRFFRttRfttftftltfPltlllplllxpxpxpxbHbpHbrbrbrzrrdzddrdOdOdOOjOjOwOwO#OwGwGwGGGwGGGCGCGCCvCMCMCMMChMMMhBMMBMBuMBuBuL", +"oaoaoaoaaoaoaoaoaoaoaoaaoRFRFoFRFFRFFFFFttFtFttftftfltlllllpPplppxppxpbbpbbbrbrbrrzrrzdrdrddOddOOOOOOOwOwwOwGwwGwGGwCGCGCGCGCvCCCCMvMMCMMBCBMMBhBuBBBuBBBB", +"FoaoaaaoaoaoaaoaaoRoaRoFFoRoRFRFRFFRtRttFRtfftftftltflPltlPlplppxppbpbbpbbHbbrbrzrrzrdrdrddddOdOdjdwOwOwOw#OwwGwGwG#GGwCGCGCvCCMvCCMCMMhMMhMhBMBMBMBMBBuBL", +"aRaFaoRoRRoRoFaFoFaFRoFRaFFFRFFRFFFFtFtftfttftfftlPlPtlPpplplpxpxpxpbpbbbprbrbrrrzrzdrdddOrOOdOOOOOjOwOwwOwGwwGwG#GCwCG#CGCCCGCGMMCMMMCMBCBMBMuBMBuBuBuLBB", +"RFoFoRFFoRFRFRoFRRFRFFFRFFRFFRFFRttRttFfttfftfltPltPllpllplpxppxpbpHbHbHbrbrbrbzrrdrdrdOrdOdOdOdOOwOwOwOwwwwwGwGGwGGGGCGCvCvCCCMCMCMCMMhMMMhMMBMBuBBuBLBBL", +"RFRFFFRRFFaFRFFRFRoFRFRFRFFRFtFtFttftfttfftftltllPllPlPplppppxpxpbxpbpbbHrbrrzrrzrzdrddrOOdOdOOjOjOOwwOwwOGwGwGG#CwCGCGCGCGCCvMCCMCMMMBCBMBuBMBuBMBMLBuBLB", +"RFtRFRFFFRFFFRFRFFtFRFtFtttttRttfFftftftftltlPlPllPllpplxlxpxpbpbpbbbrHrbrbzbrzrdrdrdddOddOdOdOOwOOwOwwOwGwGwGwGwGGGC#GCGCCvCCCvMCMChCMMMMBMBMBMBuBBuBLuBL", +"tFRFtFRFFFFRFFFtRFtFtFtRtFtfFftfttftftfltlflPtllPllplplppxpxpxpbHbprbbbrbrrrrzrrzdrddrOddOdOOjOOOwwOwOw#wwO#GGG#GCGCGCGCCvCCCvMCMCMMMMBhBMMhBMBuBBuBBBBBLB", +"fFtFtFtttttttttFtFtRfttftfFtfttftftftltfPltlllPlllpPpxpxppxpbpbbpHbbbHrbrbzrzrdrdrdrOdddOdOOOOjOwOwOwwGOwGGwGwGwCGGGGCGCvCCvCMCMCMMMMhMMhMBMBuBuBMBBuLuLBL", +"ttfttttRtRtFtfRftftftfttftftftftfltlPllltlPlPlllpPppppxpxpxpbHpbbbrHrrbrrrrzrzrdrdOdddOdOOdjOjOOwOwwOwwGwGwGG#GCwGC#CGCvCCGMCMCMMMChBCBMBMuBMBMBBuBLBBBLBL", +"tfttfftfftffttftttftftftftftftPltflPltPPlPlplpplpplxpxppxpbbpbbHbHbbrbrrrzrzrdrdddrdOddOdOOOwOOwOwwOw#OwwGwGGGGwCGCGCvCCGCMCCCMCCMMMMMCBhMBMBuBuBBuBuLuLBL", +"ftffttftftftftftfftftftfftlltlftlltlPlllplpPplppxpxpxpxbpbbpbbbrbrrbrrzrzrzdrddrddOddOdOOjOOOwwOwOwwwGGGwGG#GCwGGCGCGCGCCCvCMMCMMMhBCuMMBMBMBMBBMBBBBBLBLL", +"ltftffftftftfftfPtltltltlltPlPlllPlPlllPplplppxpxppxpbpHbpHbbHbHrbbrbrrzrrdrdrdddOddOdOdOOjOwOOwwwOGOwwwGwGwGwCGCGCGCvCCvCMCMCMMMMCMMBMBMBMBuBuBuBLuBLBLBg", +"PlPtltlltltltlltlflPlPlPlPllPtlPlplplpplpppxpxppxpxpbxpbbbbbprbrbrrrzrzrzdrdrOdrOdOdOOOjOjOOwOwOwwwwGwGwG#GCG#GCGCGCCCvCMCCMCMMCMhBMMhBMhBMBMBBuBLuBLBuLLL", +"ltllPltlPlPlPltPltltlfPlltlPlplplPlpPpPpplxpppxpxpbbpbbrpbHbrbrbrrrrzrrdrdrddddOddOdOdOdwOOwOwwwwOGwwGwGGwGwCGC#GCvCvCCGCMvCMCMhMMCBMBMMBMBuBBuBBBBLBLBLBg", +"lPlPllPlPlPllPlllPllPtllPplllPplpplpppxpxppxxpxpbpbpbbpbrbrrbrrrrzrzrzrdrddrOdrOOdOOOjOOOwwOwOwOw#wO#wGG#GCwGCGCCGCCGCCMCMCMMMMMhBMMhBMBhBuBuBBBMLuBLBLLLL", +"lllllPlPllPlPllPplpllppllplplplplpplxpxppxxppbpbpbHrbHbrbHbbrbzrzrrzrdrddrdddOdOdOOdOOjOwOOwOww#OwwGGGGwGGwCGGCGGCCvCCCMvCMCMCMMMMhMBMMBuBMBuBuBLBBLuLBLBg", +"lpPlPllllPlllPplPlpPpllpPplpppxpxpxppxpxpxpbxbbbbbpbbbbHrrrrrrrzrzrdrddrOdOdddOdOOdjOjOOwOwwwOwwGGGwGw#GCG#GCGCGCGCCCvCCMMCMMMhBCBMBMBhBMBBuBBBuLBLBLBLgLL", +"PplppppppppppplplplplppppppxlxpppxpxxpxpbpbpbpbpHbrHrbrrbrbzrzrrzrdrdrdOrdOrOOdOdjOOOwOwOwwOww#OwwGwGGGGwCGCGCGCCCCGCCMCMCMMCMMMMCBhMBMBuBuBBMBLBuBLBLLBLg", +"pppplplplplplppppppxpxlxxpxppxpxxpbppbbpbbbbbbHbrbbbrHrbrzrrzrzrdrdddddddOdOOdOOOOjOwOwOwOwwO#wGGwG#G#CGGGCGCGCvCvCMCMCMCMMMhMBChBMMBMBuBuBuBLBuBLLBLLgLLg", +"pxxpxpxpxpxpxpxpxpxpppxppxpxpxpxpbpbbpbbHbpHrprbbHrrbrrzrrrzrzrdrdrdrdrdddOdOOdjOOwOOwOwwwOwwGwwGwGwGGwCGC#GCvCCvCCvCMvCMMCMMMhMBMMBMBMBMBBBBuLBLBLBLBLBLg", +"xppxpxpxpxpxpxpxpxpxxpxpxpxpbpbpbHbHpbHprbbrbrbrrbrbrrrrzrzrdrddrdOddOOdOOdOdOOOjOOwwOwOwwGwGwGwGG#GCwGGCGCCGCGCCCvMCMCMMMMhBCBMhBhBMBuBBuBMLBBuLBuLLgLgLL", +"xpxpxpxpxpxpxpxpxpxpbpbpbbpbbbbbpbpbbbbbbbHbHrbbrrrrzrzrrdrdrddrddrdOdddOdOOjOjOOwOwOwOw#OwGOwGwGwGGG#GCGCGGCvCCGMCCMCMCMCMMMMMMBMBMBuBuBMBBLuBLBLLgBLBgLg", +"bpbpbpbpbpbpbpbpbpbpbxpbHpbHpHprbbbHbrHrbrrrbrrrbzrzrrzrzrddrdrOddOddOOdOOOOOjOwOwOwwO#wOGGwGGGG#GCwCGCGCGCCCCvCMCCMCMMMMhBCBhBMhBMBuBBuBBuLBBLBLBLBLgLLgL", +"pbbbbpbbpbbpbbpbHbbbpbbpbbbbbbbbbHbbHbrbrbbrrrbzrrzrrzrdrddrddddddddOdOOdOOjOwOOwOwwOwwwGwwwGwGwGG#GGCGC#CGCGCCvCMvCMCMCMMMhMMMBMBuBMBMBuBLBuLLuBLLLBLgLLg", +"bbpbbbbpbbpbbpbbpbpbbHbbHbprbrHrHbrrrbrbrrrbzrzrrzrzdrdddrddrOddOdOOdOOdjOjOOOwwOwOwwwOGwGGw#GG#CwCGCGGCGCvCCvCCCMCMMMMMhBCBMBMhBMBMBuBBBBuBBLBLLLBgLgLLgL", +"bHbbpbHbbHbbHrbHbbrbHbrbrbrbHbbrbrbbrrrrbrrzrzrrzrdrdrdrdOrOddOdJOdOOOjOOOOOwwOwOwwwOwGwGwwGGwGGGGC#GCGCvCCvCCMCMCMCMChMMMMMBhMBMBuBuBBMLuLBLuBLBgLLgLLgLg", +"bbrHrbrHrbrHbbHrbHbbrbHbrHrbrrbrrrrrbrzrzzrrzrddrdrdrdddrdddddOdOOOdOOOjOwOwOOwwwOww#wwGwGGG#GCwCGGCGCvCCGCCCGMCvMMMMMMBCBMhMBMBMBMBBuBLBBuLBLLLLLBgLLgLgL", +"rbrbrbrbrbrbrrbrbrrHrbrrbrbrbrrbrbrrrzrzrrzdrdrrddrddOrdddOdOOdOOdOOOjOOwOwOwwwOw#OGwwGwGwGwCGwCGGCGCGCCvCCvCMCMMMCMCMhMMCBMBMBMBuBBuBuBuLBBLBBgBLgLLgLgLg", +"rbrbrbrbrbrbrbrbrbrrrrrbrrrzrrzrzrzzrrzrzrrdrdddrdddrdOdOddOddOOdOjOjOOwOwOwOwOwwwGwGwGGG#GGGGCG#CGCGCGCCCvMCMCMCMMMMBCBMBMhBMBuBMBuBBBBBBLBLBLLLgLgLLgLgL", +"zrrrrrrrrrrrrrrrrrrbrbrrrzrrzrzrrzrrzdrdrddrddrddOrddOddOdOdOOOOOOOwOOwOwOwwww#OwGOGwGwGwGG#GCGGCGCGCvCCvCCCMCMCMMCMhMMMMhMBMBMBuBBuBLuLuBLuBLBLBLgLLgLgLg", +"rrzrzrzrzrzrzrzrzrzrzzrzrrzrrrzrdrdrdrdrdrdddrddddOdOdOdOdOOOOOjOjOOwwOwOwwOwO#GwGGwGGG#G#CwCw#CGCvCCCvCCMCMCMCMMMMBCBMBhBMBhBuBBuBBBuBBLLBLLLgLgLLgLgLgLg", +"rzrrzrrzrrzrrzrrzrrzrrzrzzrzdrdrdrddrdrddddrdddOrddOdOdOOOdOOjOOwOjwOwOwwOwOwGwwGwwGGwGwCGwCGGCGCGCCvCCvCCMCMCMMChMhMMhMBMBMBMBMBuLMBBLBLuLBLBLBLLgLLgLgLg", +"zrzrzrzrzrzrzrzrzrzrzrdrdrdrdzrddrdrddddrOddOJddOOOdOOOOdOOjOOjOjwOOwOwwww#GwwwGwG#Gw#GGGCGGCGCvCCvCCCCMCvMCMMMMMBCBMBMBMuBuBuBBuBBBuLBLBLBLLgLgLgLgLgLgLg", +"rdrdrdrdrdrdrdrdrdrdddrdrdrdrddrJdddOrJOddddddOOdOdOdOdOjOjOOwOwOwOwwwwOwOwGOGwGwGwGGGCGCGGCGCGCCvCvCGCCMMCMCMCMMMMMhMhMBMBMBMBuBBuBLBLuLBLBLBLLLgLLgLgLgg", +"drddrddrddrddrddrdrdrddrdddddrOddrdddOddrOOOdOddOOOOOOjOOjOwOjOwOwwwOwww#Gww#GGGGG#GCwGGCGCGCGCvCGCCCMCMCCMMMMMhBCBMBMBuBMBuBBuBBuBLuBLBLLLgLgLgLLggLgLgLg", +"ddrddrdddrddrddrdddddrddOrdrddddOdOJdddOOOdOdOOOdjOOjOOOwOOwOwOwwwwO#OwGOwGwGwGwGwCGGCGCGC#CvCGCCCMvCCMvMMCMCMCBMhMhMBMBMBMBuBBuBLBBBLBLBLBLBLgLgLgLgLgLgg" +}; diff --git a/examples/themes/qtlogo.png b/examples/themes/qtlogo.png Binary files differnew file mode 100644 index 000000000..4e1a14726 --- /dev/null +++ b/examples/themes/qtlogo.png diff --git a/examples/themes/stone1.xpm b/examples/themes/stone1.xpm new file mode 100644 index 000000000..34cd5625f --- /dev/null +++ b/examples/themes/stone1.xpm @@ -0,0 +1,353 @@ +/* XPM */ +static const char *stone1_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 250 2", +/* colors */ +".. c #343e34", +".# c #94a28c", +".a c #64726c", +".b c #c4d2c4", +".c c #7c8a7c", +".d c #acbaac", +".e c #4c5a4c", +".f c #dceadc", +".g c #949284", +".h c #7c7a6c", +".i c #acaaa4", +".j c #c4c2b4", +".k c #64625c", +".l c #dcdad4", +".m c #8c967c", +".n c #a4ae9c", +".o c #6c7e74", +".p c #f4f2ec", +".q c #444e3c", +".r c #bcc6b4", +".s c #8c8a7c", +".t c #5c6654", +".u c #ccdecc", +".v c #7c826c", +".w c #a4a294", +".x c #949a8c", +".y c #bcbaac", +".z c #747264", +".A c #5c5a4c", +".B c #c4cabc", +".C c #d4d2c4", +".D c #ecf2e4", +".E c #acb2a4", +".F c #646a5c", +".G c #8c867c", +".H c #54524c", +".I c #9c9a8c", +".J c #849284", +".K c #7c827c", +".L c #44463c", +".M c #9caa9c", +".N c #b4c2b4", +".O c #dce2d4", +".P c #cccabc", +".Q c #b4b2a4", +".R c #94a29c", +".S c #848a7c", +".T c #f4faec", +".U c #6c6a5c", +".V c #6c7a6c", +".W c #acbab4", +".X c #546254", +".Y c #4c564c", +".Z c #a4aa9c", +".0 c #747a6c", +".1 c #ccdacc", +".2 c #545a4c", +".3 c #74867c", +".4 c #4c4e44", +".5 c #bcc2b4", +".6 c #5c6254", +".7 c #d4dacc", +".8 c #fcfaf4", +".9 c #3c463c", +"#. c #6c7264", +"## c #e4eadc", +"#a c #949294", +"#b c #847e74", +"#c c #8c968c", +"#d c #a4b6ac", +"#e c #747e6c", +"#f c #949a9c", +"#g c #9c9a9c", +"#h c #84827c", +"#i c #e4e2d4", +"#j c #848a8c", +"#k c #9ca294", +"#l c #ccd2c4", +"#m c #7c7e7c", +"#n c #c4c6c4", +"#o c #a4aeac", +"#p c #bcc6c4", +"#q c #8c8e8c", +"#r c #d4decc", +"#s c #848274", +"#t c #a4a6a4", +"#u c #bcbebc", +"#v c #747674", +"#w c #c4cecc", +"#x c #d4d6d4", +"#y c #acb6b4", +"#z c #646a6c", +"#A c #cccecc", +"#B c #b4b6b4", +"#C c #545e5c", +"#D c #6c7674", +"#E c #747e7c", +"#F c #3c3e34", +"#G c #b4baa4", +"#H c #949684", +"#I c #7c7e6c", +"#J c #acaeac", +"#K c #c4c6b4", +"#L c #646664", +"#M c #dcdedc", +"#N c #8c8e7c", +"#O c #a4a694", +"#P c #949e8c", +"#Q c #bcbeac", +"#R c #747664", +"#S c #5c5e5c", +"#T c #c4cebc", +"#U c #d4d6c4", +"#V c #acb6a4", +"#W c #545654", +"#X c #9c9e8c", +"#Y c #eceedc", +"#Z c #4c4a44", +"#0 c #dce6d4", +"#1 c #cccebc", +"#2 c #b4b6a4", +"#3 c #9ca29c", +"#4 c #848e7c", +"#5 c #8c928c", +"#6 c #b4bab4", +"#7 c #7c8e8c", +"#8 c #44524c", +"#9 c #6c6e6c", +"a. c #e4eeec", +"a# c #d4e2dc", +"aa c #a4aaac", +"ab c #747a7c", +"ac c #5c6264", +"ad c #94a694", +"ae c #acae9c", +"af c #646654", +"ag c #dcdecc", +"ah c #a4b2a4", +"ai c #bccabc", +"aj c #5c6a5c", +"ak c #7c8674", +"al c #5c5e54", +"am c #ecf6ec", +"an c #646e64", +"ao c #545644", +"ap c #7c867c", +"aq c #444a40", +"ar c #f4fef4", +"as c #6c6e64", +"at c #545e54", +"au c #4c5249", +"av c #fcfef7", +"aw c #6c766c", +"ax c #e4eee4", +"ay c #8c9a8e", +"az c #748274", +"aA c #84867d", +"aB c #e4e6dc", +"aC c #ccd6cb", +"aD c #d4e2d4", +"aE c #3c4238", +"aF c #b4beac", +"aG c #9ca69c", +"aH c #b4beb4", +"aI c #f4f6ec", +"aJ c #3c4a3c", +"aK c #949694", +"aL c #949e9c", +"aM c #9c9e9c", +"aN c #848e8c", +"aO c #9ca694", +"aP c #a4b2ac", +"aQ c #bccac4", +"aR c #5c6a64", +"aS c #848674", +"aT c #646e6c", +"aU c #74827c", +"aV c #94a294", +"aW c #7c8a84", +"aX c #dceae4", +"aY c #94928c", +"aZ c #7c7a74", +"a0 c #c4c2bc", +"a1 c #8c9684", +"a2 c #a4aea4", +"a3 c #444e44", +"a4 c #bcc6bc", +"a5 c #8c8a84", +"a6 c #5c665c", +"a7 c #7c8274", +"a8 c #a4a29c", +"a9 c #949a94", +"b. c #bcbab4", +"b# c #74726c", +"ba c #5c5a54", +"bb c #c4cac4", +"bc c #d4d2cc", +"bd c #ecf2ec", +"be c #acb2ac", +"bf c #646a64", +"bg c #8c8684", +"bh c #9c9a94", +"bi c #84928c", +"bj c #eceae4", +"bk c #b4c2bc", +"bl c #dce2dc", +"bm c #cccac4", +"bn c #b4b2ac", +"bo c #848a84", +"bp c #f4faf4", +"bq c #8c9284", +"br c #6c6a64", +"bs c #6c7a74", +"bt c #a4aaa4", +"bu c #747a74", +"bv c #ccdad4", +"bw c #545a54", +"bx c #4c4e4c", +"by c #bcc2bc", +"bz c #5c625c", +"bA c #d4dad4", +"bB c #6c726c", +"bC c #e4eae4", +"bD c #8c9694", +"bE c #747e74", +"bF c #ccd2cc", +"bG c #d4ded4", +"bH c #b4baac", +"bI c #94968c", +"bJ c #7c7e74", +"bK c #c4c6bc", +"bL c #8c8e84", +"bM c #a4a69c", +"bN c #949e94", +"bO c #bcbeb4", +"bP c #74766c", +"bQ c #c4cec4", +"bR c #d4d6cc", +"bS c #acb6ac", +"bT c #9c9e94", +"bU c #eceee4", +"bV c #dce6dc", +"bW c #cccec4", +"bX c #b4b6ac", +"bY c #848e84", +"bZ c #8c9294", +"b0 c #acaea4", +"b1 c #64665c", +"b2 c #dcded4", +"b3 c #54564c", +/* pixels */ +".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI", +"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH", +"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S", +"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM", +".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4", +"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR", +"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG", +"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0", +"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L", +"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK", +"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9", +".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW", +".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO", +".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2", +"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6", +"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0", +"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3", +"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo", +"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw", +".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2", +"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF", +"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6", +".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo", +"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe", +"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P", +"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH", +"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l", +"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B", +"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G", +"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA", +"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA", +"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN", +"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW", +"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O", +".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E", +".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak", +"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq", +"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V", +"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX", +"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B", +"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4", +".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k", +"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM", +"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL", +"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq", +"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo", +"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG", +"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq", +"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0", +"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI", +"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5", +"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL", +"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c", +"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe", +"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0", +"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ", +".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8", +"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA", +"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX", +".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo", +"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb", +".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM", +".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA", +"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX", +"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo", +".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM", +"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c", +".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL", +".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH", +"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK", +".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA", +"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl", +".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE", +"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z", +"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap", +"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.", +"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN", +"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas", +"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA", +"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT", +".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7", +"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E", +".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM", +"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2", +"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT", +"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap", +".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n", +"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas", +".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3", +"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can", +"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag", +".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.", +"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH", +"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0", +"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA", +".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM" +}; diff --git a/examples/themes/stonebright.xpm b/examples/themes/stonebright.xpm new file mode 100644 index 000000000..a538a94ae --- /dev/null +++ b/examples/themes/stonebright.xpm @@ -0,0 +1,353 @@ +/* XPM */ +static const char *stonebright_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 250 2", +/* colors */ +".. c #7b927b", +".# c #daefcf", +".a c #b5cec3", +".b c #ebfceb", +".c c #cce2cb", +".d c #e5f8e5", +".e c #99b499", +".f c #effeef", +".g c #e8e4cf", +".h c #d7d3bb", +".i c #f3f0e7", +".j c #faf7e6", +".k c #bfbbb0", +".l c #fdfbf4", +".m c #dae9c1", +".n c #e6f4db", +".o c #bbd9c7", +".p c #fffdf7", +".q c #91a680", +".r c #effbe4", +".s c #e3e0c9", +".t c #b0c2a0", +".u c #eafeea", +".v c #d3ddb8", +".w c #f0ecd8", +".x c #e3ecd7", +".y c #f8f5e3", +".z c #d0ccb3", +".A c #b6b297", +".B c #f4fbea", +".C c #fdfaea", +".D c #f9fff0", +".E c #eef6e3", +".F c #bbc6ab", +".G c #e3d9c9", +".H c #ada99d", +".I c #ede9d5", +".J c #d1e7d1", +".K c #d3ddd3", +".L c #989c86", +".M c #dff3df", +".N c #e8fae7", +".O c #f7feee", +".P c #fcf9e9", +".Q c #f6f3e0", +".R c #daefe6", +".S c #d9e2cb", +".T c #f9fff1", +".U c #c8c4ab", +".V c #bdd6bd", +".W c #e5f8f0", +".X c #a2bda2", +".Y c #9baf9b", +".Z c #ebf3df", +".0 c #ccd6bd", +".1 c #edfded", +".2 c #a9b499", +".3 c #c1dfce", +".4 c #a2a690", +".5 c #f3fae7", +".6 c #b2bda2", +".7 c #f6fded", +".8 c #fffdf7", +".9 c #869c86", +"#. c #c4ceb5", +"## c #f8feef", +"#a c #e8e5e8", +"#b c #ded3c3", +"#c c #d9e9d9", +"#d c #dff7e9", +"#e c #c8d9bb", +"#f c #e1eaed", +"#g c #edeaed", +"#h c #dedbd0", +"#i c #fefcec", +"#j c #d7e0e3", +"#k c #e6efda", +"#l c #f5fceb", +"#m c #d5d9d5", +"#n c #f9fbf9", +"#o c #e6f4f1", +"#p c #effbf9", +"#q c #e2e5e2", +"#r c #f3feea", +"#s c #dedac3", +"#t c #eef1ee", +"#u c #f6f9f6", +"#v c #ced2ce", +"#w c #f0fcfa", +"#x c #fbfdfb", +"#y c #e9f7f4", +"#z c #b9c4c8", +"#A c #fafcfa", +"#B c #f4f7f4", +"#C c #a4b8b4", +"#D c #c0d2ce", +"#E c #c7d9d5", +"#F c #8d927b", +"#G c #f0f8db", +"#H c #e6e9cd", +"#I c #d6d9bb", +"#J c #f1f4f1", +"#K c #f9fbe4", +"#L c #bec2be", +"#M c #fcfefc", +"#N c #e2e5c8", +"#O c #eff1d7", +"#P c #dfeed3", +"#Q c #f7f9e1", +"#R c #cfd2b2", +"#S c #b4b8b4", +"#T c #f0fce6", +"#U c #fbfde8", +"#V c #eaf7df", +"#W c #abafab", +"#X c #eceed3", +"#Y c #fdffec", +"#Z c #a39f92", +"#0 c #f3feea", +"#1 c #fafce6", +"#2 c #f5f7df", +"#3 c #e6efe6", +"#4 c #d5e5c8", +"#5 c #dee7de", +"#6 c #f0f8f0", +"#7 c #c8e5e2", +"#8 c #8daa9d", +"#9 c #c6cac6", +"a. c #f4fffd", +"a# c #eefef7", +"aa c #e7f0f3", +"ab c #c9d4d7", +"ac c #b0bcbf", +"ad c #d8f1d7", +"ae c #f2f4db", +"af c #bfc2a0", +"ag c #fcfeea", +"ah c #e3f6e3", +"ai c #eafbea", +"aj c #abc6ab", +"ak c #cfdfc1", +"al c #b4b8a4", +"am c #f5fff5", +"an c #b8cab8", +"ao c #abaf8a", +"ap c #cfdfcf", +"aq c #94a18b", +"ar c #f5fff5", +"as c #c6cab8", +"at c #a4b8a4", +"au c #9daa97", +"av c #fdfff8", +"aw c #c0d2c0", +"ax c #f4fff4", +"ay c #d7ecd9", +"az c #c6ddc6", +"aA c #dcdfd0", +"aB c #fcfef3", +"aC c #f1fdf0", +"aD c #eefeee", +"aE c #899780", +"aF c #ecf9e1", +"aG c #e2f1e2", +"aH c #ecf9ec", +"aI c #fdfff5", +"aJ c #83a182", +"aK c #e6e9e6", +"aL c #dfeeeb", +"aM c #ebeeeb", +"aN c #d5e5e2", +"aO c #e3f1d7", +"aP c #e3f6ed", +"aQ c #eafbf4", +"aR c #abc6bb", +"aS c #dcdfc1", +"aT c #b8cac6", +"aU c #c6ddd3", +"aV c #dbefda", +"aW c #cbe2d8", +"aX c #effef7", +"aY c #e8e5dc", +"aZ c #d7d3c9", +"a0 c #faf7f0", +"a1 c #dae9cd", +"a2 c #e6f4e6", +"a3 c #91a690", +"a4 c #effbef", +"a5 c #e3dfd7", +"a6 c #b0c2b0", +"a7 c #d3ddc6", +"a8 c #f0ede4", +"a9 c #e3ece3", +"b. c #f8f5ee", +"b# c #d0ccc2", +"ba c #b6b2a6", +"bb c #f4fbf4", +"bc c #fdfaf4", +"bd c #f9fff9", +"be c #eef6ee", +"bf c #bbc6bb", +"bg c #e3d9d7", +"bh c #edeae1", +"bi c #d1e7dd", +"bj c #fffdf6", +"bk c #e7faf2", +"bl c #f7fef7", +"bm c #fcf9f2", +"bn c #f6f3ec", +"bo c #d8e2d8", +"bp c #f9fff9", +"bq c #dee7d1", +"br c #c8c4b9", +"bs c #bdd6cb", +"bt c #eaf3ea", +"bu c #cbd6cb", +"bv c #edfdf6", +"bw c #a9b4a8", +"bx c #a2a6a2", +"by c #f2faf2", +"bz c #b2bdb2", +"bA c #f6fdf6", +"bB c #c3cec3", +"bC c #f8fef8", +"bD c #d9e9e6", +"bE c #c9d9c7", +"bF c #f5fcf5", +"bG c #f3fef3", +"bH c #f1f8e5", +"bI c #e6e9d9", +"bJ c #d6d9c7", +"bK c #f9fbef", +"bL c #e2e5d5", +"bM c #eef1e2", +"bN c #dfeedf", +"bO c #f6f9ec", +"bP c #cfd2c0", +"bQ c #f0fcf0", +"bR c #fbfdf1", +"bS c #e9f7e9", +"bT c #ebeedf", +"bU c #fdfff4", +"bV c #f3fef3", +"bW c #fafcf0", +"bX c #f4f7e9", +"bY c #d5e5d5", +"bZ c #dce5e8", +"b0 c #f1f4e6", +"b1 c #bec2b0", +"b2 c #fcfef3", +"b3 c #abaf9b", +/* pixels */ +".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI", +"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH", +"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S", +"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM", +".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4", +"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR", +"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG", +"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0", +"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L", +"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK", +"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9", +".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW", +".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO", +".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2", +"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6", +"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0", +"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3", +"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo", +"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw", +".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2", +"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF", +"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6", +".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo", +"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe", +"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P", +"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH", +"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l", +"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B", +"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G", +"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA", +"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA", +"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN", +"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW", +"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O", +".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E", +".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak", +"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq", +"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V", +"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX", +"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B", +"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4", +".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k", +"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM", +"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL", +"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq", +"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo", +"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG", +"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq", +"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0", +"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI", +"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5", +"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL", +"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c", +"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe", +"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0", +"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ", +".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8", +"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA", +"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX", +".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo", +"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb", +".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM", +".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA", +"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX", +"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo", +".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM", +"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c", +".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL", +".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH", +"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK", +".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA", +"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl", +".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE", +"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z", +"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap", +"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.", +"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN", +"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas", +"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA", +"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT", +".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7", +"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E", +".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM", +"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2", +"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT", +"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap", +".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n", +"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas", +".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3", +"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can", +"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag", +".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.", +"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH", +"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0", +"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA", +".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM" +}; diff --git a/examples/themes/stonedark.xpm b/examples/themes/stonedark.xpm new file mode 100644 index 000000000..bae15c242 --- /dev/null +++ b/examples/themes/stonedark.xpm @@ -0,0 +1,353 @@ +/* XPM */ +static const char *stonedark_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 250 2", +/* colors */ +".. c #020202", +".# c #4e554a", +".a c #1f2321", +".b c #838c83", +".c c #343a34", +".d c #697169", +".e c #0e100e", +".f c #9ca59c", +".g c #45443d", +".h c #2b2a25", +".i c #61605d", +".j c #7c7b72", +".k c #171615", +".l c #969490", +".m c #43473b", +".n c #5e6359", +".o c #272e2b", +".p c #afada9", +".q c #090909", +".r c #797f73", +".s c #3c3b35", +".t c #171915", +".u c #8c988c", +".v c #2f322a", +".w c #57564e", +".x c #484b44", +".y c #737269", +".z c #24231f", +".A c #11110e", +".B c #80847b", +".C c #8e8c83", +".D c #a9ada3", +".E c #656860", +".F c #1a1c19", +".G c #3c3935", +".H c #0c0c0c", +".I c #4e4d46", +".J c #3d433d", +".K c #30322f", +".L c #060606", +".M c #565e56", +".N c #717a71", +".O c #989c93", +".P c #86847c", +".Q c #6a6961", +".R c #4e5551", +".S c #383a34", +".T c #b0b4aa", +".U c #1e1d1a", +".V c #252a25", +".W c #69716d", +".X c #121512", +".Y c #0c0e0c", +".Z c #5b5e56", +".0 c #282a25", +".1 c #8b948b", +".2 c #0f100e", +".3 c #2e3632", +".4 c #090909", +".5 c #767a71", +".6 c #131512", +".7 c #90948b", +".8 c #b6b4b0", +".9 c #060606", +"#. c #21231f", +"## c #a1a59c", +"#a c #454445", +"#b c #33302d", +"#c c #434743", +"#d c #626d67", +"#e c #2b2e27", +"#f c #4a4d4e", +"#g c #4e4d4e", +"#h c #333230", +"#i c #9e9c93", +"#j c #393b3c", +"#k c #52554e", +"#l c #888c83", +"#m c #2d2e2d", +"#n c #7e7f7e", +"#o c #5e6362", +"#p c #797f7e", +"#q c #3d3e3d", +"#r c #92988c", +"#s c #33322d", +"#t c #595a59", +"#u c #757675", +"#v c #252625", +"#w c #828887", +"#x c #8f908f", +"#y c #676d6c", +"#z c #1c1d1e", +"#A c #878887", +"#B c #6c6d6c", +"#C c #111312", +"#D c #232625", +"#E c #2b2e2d", +"#F c #020202", +"#G c #6e7163", +"#H c #46473e", +"#I c #2d2e27", +"#J c #626362", +"#K c #7e7f73", +"#L c #181918", +"#M c #979897", +"#N c #3d3e36", +"#O c #595a50", +"#P c #4b5047", +"#Q c #75766b", +"#R c #252620", +"#S c #131313", +"#T c #82887c", +"#U c #8f9084", +"#V c #676d62", +"#W c #0e0e0e", +"#X c #4f5047", +"#Y c #a8a99c", +"#Z c #080808", +"#0 c #9aa094", +"#1 c #87887c", +"#2 c #6c6d62", +"#3 c #525551", +"#4 c #3a3e36", +"#5 c #404340", +"#6 c #6d716d", +"#7 c #363e3d", +"#8 c #0b0b0b", +"#9 c #1e1f1e", +"a. c #a1a9a7", +"a# c #939c98", +"aa c #5d6061", +"ab c #292a2b", +"ac c #151617", +"ad c #505a50", +"ae c #626359", +"af c #181915", +"ag c #97988c", +"ah c #606860", +"ai c #7b847b", +"aj c #191c19", +"ak c #32362e", +"al c #131311", +"am c #aab1a9", +"an c #1d1f1d", +"ao c #0e0e0b", +"ap c #323632", +"aq c #070707", +"ar c #b1b8b0", +"as c #1e1f1d", +"at c #111311", +"au c #0b0b0b", +"av c #b6b8b3", +"aw c #232623", +"ax c #a2a9a1", +"ay c #444b45", +"az c #2d322d", +"aA c #353633", +"aB c #9fa099", +"aC c #8a9089", +"aD c #939c93", +"aE c #040404", +"aF c #70766b", +"aG c #555a55", +"aH c #707670", +"aI c #afb1a9", +"aJ c #070707", +"aK c #464746", +"aL c #4b504f", +"aM c #4f504f", +"aN c #3a3e3d", +"aO c #555a50", +"aP c #606864", +"aQ c #7b8480", +"aR c #191c1a", +"aS c #35362e", +"aT c #1d1f1e", +"aU c #2d322f", +"aV c #4e554e", +"aW c #343a37", +"aX c #9ca5a0", +"aY c #454442", +"aZ c #2b2a29", +"a0 c #7c7b77", +"a1 c #43473e", +"a2 c #5e635e", +"a3 c #090909", +"a4 c #797f79", +"a5 c #3c3b39", +"a6 c #171917", +"a7 c #2f322d", +"a8 c #575653", +"a9 c #484b48", +"b. c #73726e", +"b# c #242322", +"ba c #11110f", +"bb c #808480", +"bc c #8e8c88", +"bd c #a8ada8", +"be c #646864", +"bf c #1a1c1a", +"bg c #3c3939", +"bh c #4e4d4a", +"bi c #3d4340", +"bj c #a7a5a1", +"bk c #717a76", +"bl c #989c98", +"bm c #868480", +"bn c #6a6966", +"bo c #373a37", +"bp c #afb4af", +"bq c #40433d", +"br c #1e1d1c", +"bs c #252a28", +"bt c #5a5e5a", +"bu c #282a28", +"bv c #8b9490", +"bw c #0f100f", +"bx c #090909", +"by c #767a76", +"bz c #131513", +"bA c #909490", +"bB c #212321", +"bC c #a1a5a1", +"bD c #434746", +"bE c #2b2e2b", +"bF c #888c88", +"bG c #919891", +"bH c #6d7169", +"bI c #464743", +"bJ c #2d2e2b", +"bK c #7e7f79", +"bL c #3d3e3a", +"bM c #595a55", +"bN c #4b504b", +"bO c #757670", +"bP c #252623", +"bQ c #828882", +"bR c #8f9089", +"bS c #676d67", +"bT c #4f504b", +"bU c #a7a9a1", +"bV c #99a099", +"bW c #878882", +"bX c #6c6d67", +"bY c #3a3e3a", +"bZ c #424445", +"b0 c #62635e", +"b1 c #181917", +"b2 c #979891", +"b3 c #0e0e0c", +/* pixels */ +".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI", +"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH", +"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S", +"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM", +".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4", +"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR", +"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG", +"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0", +"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L", +"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK", +"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9", +".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW", +".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO", +".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2", +"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6", +"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0", +"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3", +"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo", +"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw", +".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2", +"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF", +"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6", +".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo", +"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe", +"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P", +"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH", +"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l", +"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B", +"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G", +"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA", +"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA", +"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN", +"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW", +"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O", +".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E", +".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak", +"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq", +"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V", +"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX", +"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B", +"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4", +".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k", +"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM", +"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL", +"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq", +"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo", +"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG", +"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq", +"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0", +"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI", +"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5", +"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL", +"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c", +"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe", +"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0", +"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ", +".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8", +"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA", +"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX", +".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo", +"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb", +".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM", +".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA", +"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX", +"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo", +".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM", +"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c", +".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL", +".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH", +"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK", +".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA", +"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl", +".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE", +"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z", +"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap", +"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.", +"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN", +"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas", +"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA", +"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT", +".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7", +"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E", +".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM", +"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2", +"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT", +"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap", +".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n", +"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas", +".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3", +"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can", +"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag", +".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.", +"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH", +"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0", +"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA", +".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM" +}; diff --git a/examples/themes/themes.cpp b/examples/themes/themes.cpp new file mode 100644 index 000000000..6e5b95bb9 --- /dev/null +++ b/examples/themes/themes.cpp @@ -0,0 +1,164 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "themes.h" +#include "wood.h" +#include "metal.h" + +#include "../buttongroups/buttongroups.h" +#include "../lineedits/lineedits.h" +#include "../listboxcombo/listboxcombo.h" +#include "../checklists/checklists.h" +#include "../progressbar/progressbar.h" +#include "../rangecontrols/rangecontrols.h" +#include "../richtext/richtext.h" + +#include <qtabwidget.h> +#include <qapplication.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qmessagebox.h> +#include <qfont.h> +#include <qstylefactory.h> +#include <qaction.h> +#include <qsignalmapper.h> +#include <qdict.h> + +Themes::Themes( TQWidget *parent, const char *name, WFlags f ) + : TQMainWindow( parent, name, f ) +{ + appFont = TQApplication::font(); + tabwidget = new TQTabWidget( this ); + + tabwidget->addTab( new ButtonsGroups( tabwidget ), "Buttons/Groups" ); + TQHBox *hbox = new TQHBox( tabwidget ); + hbox->setMargin( 5 ); + (void)new LineEdits( hbox ); + (void)new ProgressBar( hbox ); + tabwidget->addTab( hbox, "Lineedits/Progressbar" ); + tabwidget->addTab( new ListBoxCombo( tabwidget ), "Listboxes/Comboboxes" ); + tabwidget->addTab( new CheckLists( tabwidget ), "Listviews" ); + tabwidget->addTab( new RangeControls( tabwidget ), "Rangecontrols" ); + tabwidget->addTab( new MyRichText( tabwidget ), "Fortune" ); + + setCentralWidget( tabwidget ); + + TQPopupMenu *style = new TQPopupMenu( this ); + style->setCheckable( TRUE ); + menuBar()->insertItem( "&Style" , style ); + + style->setCheckable( TRUE ); + TQActionGroup *ag = new TQActionGroup( this, 0 ); + ag->setExclusive( TRUE ); + TQSignalMapper *styleMapper = new TQSignalMapper( this ); + connect( styleMapper, SIGNAL( mapped( const TQString& ) ), this, SLOT( makeStyle( const TQString& ) ) ); + TQStringList list = TQStyleFactory::keys(); + list.sort(); +#ifndef QT_NO_STYLE_WINDOWS + list.insert(list.begin(), "Norwegian Wood"); + list.insert(list.begin(), "Metal"); +#endif + TQDict<int> stylesDict( 17, FALSE ); + for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + TQString styleStr = *it; + TQString styleAccel = styleStr; + if ( stylesDict[styleAccel.left(1)] ) { + for ( uint i = 0; i < styleAccel.length(); i++ ) { + if ( !stylesDict[styleAccel.mid( i, 1 )] ) { + stylesDict.insert(styleAccel.mid( i, 1 ), (const int *)1); + styleAccel = styleAccel.insert( i, '&' ); + break; + } + } + } else { + stylesDict.insert(styleAccel.left(1), (const int *)1); + styleAccel = "&"+styleAccel; + } + TQAction *a = new TQAction( styleStr, TQIconSet(), styleAccel, 0, ag, 0, ag->isExclusive() ); + connect( a, SIGNAL( activated() ), styleMapper, SLOT(map()) ); + styleMapper->setMapping( a, a->text() ); + } + ag->addTo(style); + style->insertSeparator(); + style->insertItem("&Quit", qApp, SLOT( tquit() ), CTRL | Key_Q ); + + TQPopupMenu * help = new TQPopupMenu( this ); + menuBar()->insertSeparator(); + menuBar()->insertItem( "&Help", help ); + help->insertItem( "&About", this, SLOT(about()), Key_F1); + help->insertItem( "About &TQt", this, SLOT(aboutTQt())); + +#ifndef QT_NO_STYLE_WINDOWS + qApp->setStyle( new NorwegianWoodStyle ); +#endif +} + +void Themes::makeStyle(const TQString &style) +{ + if(style == "Norwegian Wood") { +#ifndef QT_NO_STYLE_WINDOWS + qApp->setStyle( new NorwegianWoodStyle ); +#endif + } else if( style == "Metal" ) { +#ifndef QT_NO_STYLE_WINDOWS + qApp->setStyle( new MetalStyle ); +#endif + } else { + qApp->setStyle(style); + if(style == "Platinum") { + TQPalette p( TQColor( 239, 239, 239 ) ); + qApp->setPalette( p, TRUE ); + qApp->setFont( appFont, TRUE ); + } else if(style == "Windows") { + qApp->setFont( appFont, TRUE ); + } else if(style == "CDE") { + TQPalette p( TQColor( 75, 123, 130 ) ); + p.setColor( TQPalette::Active, TQColorGroup::Base, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Inactive, TQColorGroup::Base, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Disabled, TQColorGroup::Base, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Active, TQColorGroup::Highlight, TQt::white ); + p.setColor( TQPalette::Active, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Inactive, TQColorGroup::Highlight, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Disabled, TQColorGroup::Highlight, TQt::white ); + p.setColor( TQPalette::Disabled, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Active, TQColorGroup::Foreground, TQt::white ); + p.setColor( TQPalette::Active, TQColorGroup::Text, TQt::white ); + p.setColor( TQPalette::Active, TQColorGroup::ButtonText, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::Foreground, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::Text, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::ButtonText, TQt::white ); + p.setColor( TQPalette::Disabled, TQColorGroup::Foreground, TQt::lightGray ); + p.setColor( TQPalette::Disabled, TQColorGroup::Text, TQt::lightGray ); + p.setColor( TQPalette::Disabled, TQColorGroup::ButtonText, TQt::lightGray ); + qApp->setPalette( p, TRUE ); + qApp->setFont( TQFont( "times", appFont.pointSize() ), TRUE ); + } else if(style == "Motif" || style == "MotifPlus") { + TQPalette p( TQColor( 192, 192, 192 ) ); + qApp->setPalette( p, TRUE ); + qApp->setFont( appFont, TRUE ); + } + } +} + +void Themes::about() +{ + TQMessageBox::about( this, "TQt Themes Example", + "<p>This example demonstrates the concept of " + "<b>generalized GUI styles </b> first introduced " + " with the 2.0 release of TQt.</p>" ); +} + + +void Themes::aboutTQt() +{ + TQMessageBox::aboutTQt( this, "TQt Themes Example" ); +} + + diff --git a/examples/themes/themes.doc b/examples/themes/themes.doc new file mode 100644 index 000000000..eefdea1b5 --- /dev/null +++ b/examples/themes/themes.doc @@ -0,0 +1,55 @@ +/* +*/ +/*! \page themes-example.html + + \ingroup examples + \title Themes (Styles) + + This examples demonstrates how to let widgets be drawn in different + styles (themes). As an example, themes looking like wood and metal + are implemented. You can switch between the different styles + during runtime using the pulldown menu. + + <hr> + + Header file of the Wood theme: + + \include themes/wood.h + + <hr> + + Implementation of the Wood theme: + + \include themes/wood.cpp + + <hr> + + Header file of the Metal theme: + + \include themes/metal.h + + <hr> + + Implementation of the Metal theme: + + \include themes/metal.cpp + + <hr> + + Header file of the example: + + \include themes/themes.h + + <hr> + + Implementation of the example: + + \include themes/themes.cpp + + <hr> + + Main: + + \include themes/main.cpp +*/ + diff --git a/examples/themes/themes.h b/examples/themes/themes.h new file mode 100644 index 000000000..7b6f4b544 --- /dev/null +++ b/examples/themes/themes.h @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef THEMES_H +#define THEMES_H + +#include <qmainwindow.h> +#include <qfont.h> + +class TQTabWidget; + +class Themes: public TQMainWindow +{ + Q_OBJECT + +public: + Themes( TQWidget *parent = 0, const char *name = 0, WFlags f = WType_TopLevel ); + +protected: + TQTabWidget *tabwidget; + +protected slots: + void makeStyle(const TQString &); + void about(); + void aboutTQt(); + +private: + TQFont appFont; +}; + + +#endif diff --git a/examples/themes/themes.pro b/examples/themes/themes.pro new file mode 100644 index 000000000..df54c3a32 --- /dev/null +++ b/examples/themes/themes.pro @@ -0,0 +1,31 @@ +TEMPLATE = app +TARGET = themes + +CONFIG += qt warn_on release no_batch +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = themes.h \ + ../buttongroups/buttongroups.h \ + ../lineedits/lineedits.h \ + ../listboxcombo/listboxcombo.h \ + ../checklists/checklists.h \ + ../progressbar/progressbar.h \ + ../rangecontrols/rangecontrols.h \ + ../richtext/richtext.h \ + wood.h \ + metal.h + +SOURCES = themes.cpp \ + main.cpp \ + ../buttongroups/buttongroups.cpp \ + ../lineedits/lineedits.cpp \ + ../listboxcombo/listboxcombo.cpp \ + ../checklists/checklists.cpp \ + ../progressbar/progressbar.cpp \ + ../rangecontrols/rangecontrols.cpp \ + ../richtext/richtext.cpp \ + wood.cpp \ + metal.cpp + diff --git a/examples/themes/trolltech.gif b/examples/themes/trolltech.gif Binary files differnew file mode 100644 index 000000000..ec8f37a2e --- /dev/null +++ b/examples/themes/trolltech.gif diff --git a/examples/themes/wood.cpp b/examples/themes/wood.cpp new file mode 100644 index 000000000..3d78eb5a0 --- /dev/null +++ b/examples/themes/wood.cpp @@ -0,0 +1,1414 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "wood.h" + +#ifndef QT_NO_STYLE_WINDOWS + +#include "qapplication.h" +#include "qcombobox.h" +#include "qpainter.h" +#include "qdrawutil.h" // for now +#include "qpixmap.h" // for now +#include "qpalette.h" // for now +#include "qwidget.h" +#include "qlabel.h" +#include "qimage.h" +#include "qpushbutton.h" +#include "qwidget.h" +#include "qrangecontrol.h" +#include "qscrollbar.h" +#include <limits.h> +#include "qstylefactory.h" + +/* XPM */ +static const char *polish_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 254 2", +/* colors */ +".. c #9c4a34", +".# c #a4825c", +".a c #bc5e2c", +".b c #d48432", +".c c #dc9f51", +".d c #bc6e1c", +".e c #d4855d", +".f c #94664c", +".g c #bc714e", +".h c #8c6664", +".i c #d4923c", +".j c #bc8444", +".k c #d49360", +".l c #d4794e", +".m c #ecaf68", +".n c #bc8365", +".o c #d47439", +".p c #a46954", +".q c #dc9f70", +".r c #e48544", +".s c #bc7b51", +".t c #a47761", +".u c #bc7b42", +".v c #a4523c", +".w c #e4945e", +".x c #9c784c", +".y c #d4844a", +".z c #eca053", +".A c #bc614c", +".B c #e4855c", +".C c #bc8350", +".D c #c48e68", +".E c #b16634", +".F c #e49339", +".G c #bc703a", +".H c #bc7c67", +".I c #a45f34", +".J c #cc714d", +".K c #d48c5f", +".L c #a47057", +".M c #cc703a", +".N c #dca674", +".O c #b47859", +".P c #bc6729", +".Q c #d49475", +".R c #d48b4a", +".S c #cc8351", +".T c #cc8466", +".U c #ac6841", +".V c #e4a651", +".W c #e49576", +".X c #d47d31", +".Y c #ac6e4b", +".Z c #c07650", +".0 c #e48c43", +".1 c #e49452", +".2 c #9c745f", +".3 c #e47e54", +".4 c #cc7c4f", +".5 c #cc7c32", +".6 c #b46133", +".7 c #d49a68", +".8 c #d67e4f", +".9 c #bc7643", +"#. c #b47056", +"## c #d48b3a", +"#a c #dc9f5e", +"#b c #e49a60", +"#c c #cc6a31", +"#d c #8c6244", +"#e c #dc9a41", +"#f c #eca753", +"#g c #bc8a58", +"#h c #d48c76", +"#i c #bc693f", +"#j c #bc715d", +"#k c #9c6857", +"#l c #f4b171", +"#m c #bc8a6a", +"#n c #eca16d", +"#o c #a87e58", +"#p c #a4613f", +"#q c #a48569", +"#r c #d4846d", +"#s c #dc935f", +"#t c #c47c50", +"#u c #dc8449", +"#v c #bc6950", +"#w c #cc9678", +"#x c #c4703a", +"#y c #cc7b67", +"#z c #dc8c5e", +"#A c #ac7067", +"#B c #eca86e", +"#C c #b4786d", +"#D c #dc8c4a", +"#E c #b46842", +"#F c #d47c41", +"#G c #e48d51", +"#H c #e59a52", +"#I c #9c6e3f", +"#J c #d49351", +"#K c #cc843b", +"#L c #ecb678", +"#M c #9c5a38", +"#N c #d4795c", +"#O c #c47b39", +"#P c #ec9560", +"#Q c #ac764c", +"#R c #c48351", +"#S c #c48e74", +"#T c #cc7650", +"#U c #cc8a84", +"#V c #bc6a5c", +"#W c #e4af74", +"#X c #b46855", +"#Y c #e4a06e", +"#Z c #ac775b", +"#0 c #e48d5d", +"#1 c #c47d65", +"#2 c #cc763f", +"#3 c #b47e5d", +"#4 c #cc8a55", +"#5 c #cc8a67", +"#6 c #bf622f", +"#7 c #dc853b", +"#8 c #e49f4a", +"#9 c #9c505c", +"a. c #8c5644", +"a# c #cc7329", +"aa c #a45a51", +"ab c #b48264", +"ac c #9c7a7c", +"ad c #9c5f4f", +"ae c #b4844c", +"af c #a46749", +"ag c #dca664", +"ah c #b46e1c", +"ai c #c4762c", +"aj c #a45a3c", +"ak c #dc9a74", +"al c #ac7e46", +"am c #ac6a6c", +"an c #eca862", +"ao c #e49a41", +"ap c #e49a78", +"aq c #bc7660", +"ar c #d57e5e", +"as c #9c6e5c", +"at c #ab7e65", +"au c #cc8a44", +"av c #9c6240", +"aw c #bc6244", +"ax c #bc5d3f", +"ay c #e48550", +"az c #eca060", +"aA c #cc7160", +"aB c #cc7c42", +"aC c #b46241", +"aD c #b4726c", +"aE c #eca67f", +"aF c #9c6a3c", +"aG c #94685a", +"aH c #c48240", +"aI c #c48465", +"aJ c #dc7640", +"aK c #cc8f54", +"aL c #e4a76f", +"aM c #c4692e", +"aN c #dc9474", +"aO c #ac6050", +"aP c #b47048", +"aQ c #94614b", +"aR c #ac836c", +"aS c #a47048", +"aT c #b4764a", +"aU c #ec8e5c", +"aV c #dc9a53", +"aW c #cc765e", +"aX c #b48a64", +"aY c #dc9a63", +"aZ c #c47640", +"a0 c #ec9a60", +"a1 c #c48a54", +"a2 c #c48a67", +"a3 c #ac5a3c", +"a4 c #ac8458", +"a5 c #dc855d", +"a6 c #c4714d", +"a7 c #dc9243", +"a8 c #dc794e", +"a9 c #ac6955", +"b. c #cc8f67", +"b# c #ac6032", +"ba c #ac7056", +"bb c #dc7a34", +"bc c #ec9553", +"bd c #dc8d3b", +"be c #e4a060", +"bf c #f4a654", +"bg c #c46842", +"bh c #c46f62", +"bi c #ac613d", +"bj c #dc866c", +"bk c #c4694e", +"bl c #dc7d42", +"bm c #ec8d4f", +"bn c #dc9351", +"bo c #cc9177", +"bp c #c4695f", +"bq c #ecb075", +"br c #e4a75f", +"bs c #d4843c", +"bt c #bc722c", +"bu c #d4936c", +"bv c #d47644", +"bw c #bc7d5c", +"bx c #ac563c", +"by c #e4956c", +"bz c #a47a4c", +"bA c #d48454", +"bB c #bc825c", +"bC c #e49544", +"bD c #bc7044", +"bE c #bc7e74", +"bF c #d48d6c", +"bG c #cc7144", +"bH c #b47864", +"bI c #bc6a34", +"bJ c #d49684", +"bK c #d48b54", +"bL c #cc845c", +"bM c #cc8474", +"bN c #ac684c", +"bO c #cc7d5c", +"bP c #eca27c", +"bQ c #dc946c", +"bR c #c47c5c", +"bS c #dc8554", +"bT c #c47244", +"bU c #dc8c6c", +"bV c #dc8c54", +"bW c #b4684c", +"bX c #cc8344", +"bY c #c47b44", +"bZ c #c4825c", +"b0 c #e4a17c", +"b1 c #ac7a64", +"b2 c #e48c6c", +"b3 c #c47a74", +"b4 c #e49f54", +"b5 c #9c674c", +"b6 c #946764", +"b7 c #c48674", +/* pixels */ +"#u#G#G#P#G#G#G.1#G#G.1.1.1.w#G.r#D.1.1.1#D#DbVbV.K.K.K.KbO.Z.Z#TaP.GaT.Z.O.O.O.H.9aP.ZaPaPaPbZbo.i.k#J.k#JbKbnbn#b#sbVbV#G#G.r.ray.r.0#G.0#G.1bc.r.0.0bc.0.0.0.r.1.1.1.1#G#D.0#D.0.0.0bcbcbc.1.0", +"#aagaLbrag#a#a#a#DbVbn#G#0.1#0#Da5#za5.4.J.Jbk#vbt.G#x.9bY.4#tbYbw.saPaP.Ub#af.Y.s.s.Z.saP#E.gbw.U.U.UaObWbWbWaPb#b#.E#t.K.K#z#s#s#sbQ#s#sbn#s#sbn#s.w#s.w#s#sbn.ybV#s#sbV#s#sbQ#aak.7.k.7.k.k.k", +"#..g#.#.#j#.#XbW#Z#o.O.O#3.n.n.Halalalala4aXaXa4#t.u.9#R#5bu.k#5bob7aIaI.nbwbw#m#5aIa2#5#5aIb7#5.DbBbB#3bwbw.C.O#oabab.naI.C#t#R.9#tbY#tbY.ZbY.s#t#t#t#R.sbY.s#tbD.Z.Z#t.9.Z#t.4bBbw.s.saT.9aTaT", +".ybS.ybSbVbVbVbVbl#u#u#ubSaybSay#s#za5#z#z#z.KbA.Qb.aIbZbZbB.g.U.gaP#.aP#.aPaP.O.9aP.g.s.O.ZaP.Z#CaD#Aamamamam#X#3#Z.OaPaPaPaP.saZbY#t#t#tbY#tbY#t#tbLbZ.SbR#t#tbZbRbZbRbR.sbRbR.4aBaB.4bY.4.4.4", +"bKbV#zbKbA.ybK#zbV#z#0bS#0#0#0aya5bA.4.4.4#T#xbgbwaq.O.g.O#j#.aPaCaC#v.g.gaPaP.Z#R#R#t#t#t.Z.s.Z#O#O.5aH#KbY.S#4bD.G#xaZaZ#2.SbVbV#s.wbV#zbSbAa5.e.KbQbQbU#s#z.K#5.K#5.T#4#5.Kb..4bZbL.T.ebL.K.K", +"#A#A#C#C#AaD#CbEatataRb1b1abb1.t#I.f#IaSbz.x.#.##v.g.g#1bR.T#5#hbObO.T.K.K#5.KbubL.4.4#t.4.Z#tbL.e#r.K.K.e.e.T#r.K#z.K#z#sbVbS#zbV#u#ubVbl#F.8.l#2.4.8bAbA.l.4bva6.g#x.g#x#i#i#i.L.Lba#Z#Z#Z#Zba", +"aPaT.u.u.s.C.C.C.SbA.S.4.SbA.8.8#r#rbF#h.TbO.T#h.KbF.e.e.S.S.S.S#u.y.8bA.e.4bA.e.K#zbQ#s.K.KbUbQ.y.R.y.yaB#O#xbT#t.4bLbLbL.4bL.S.4.S.4#T.Za6.Z.JbD.g.Z.g.Z.g.Z.ZaP.g#iaP#i#E#EaC.Obababa.ObH#Z.O", +"#zbSbA.e#za5.e.8bV.KbV.ybAbK#zbK.8.ybV#z.y#F.y#sbKbA.Rbn#sbn#b#b#Y.w#sbV.y.4.lbA.y.y.ybA#T.MbG.4bObO.4.SbLbOaq#..O.Yaf#p#p.I.U.UaT.Z.O.Oaq.O.H.Hb1b1#Z#Z.L#Zat#3bw.s.HbBb7aIaIaIbA.l.4aBbAbA.e.e", +"#DbVbn.w#s.w#sbVbAbSbSbV#D#GbS#0.1#H#H#H#b.1bn.1#4.S#t#t.S.TbL.S.K.K.K.S.SbK.e.S#t.4#t#tbDaPb#b#.U#E.9.S.ebVbS#G.K.K#r.l#y#T.Z.Z#2aB.S.ybS#u.8#F#Kau.y.S.y.y.R.y#z#z#sbn.1bna7bd#F#DbVbVbV#s.w#s", +".1#s.1#s.1bVbS.y.K#z#sbVbVbA.8#FbA.8ar.8.e#r.e#NbKbA.S.S.S.SbLbLaBaBaB#2aB.SbKbAbVbVbV#s.w#YbebQ.KbA.e.KbV.ybl.ybsbsbs#D#u#D#u.R.y#D#DbVbV#s#0.wbebe#b#bbQ.wbn#GbV#G#D#G#D#GbV#D.ybV#sbV#s#s.w#s", +".wbn.w.w#bbQbVbV.4.4.ybKbnbV#z#z#G#D#D#D#u#D.y.R#2aB#2.M#x.M#2#2#z#s.w#sbV#s.w#s.1.w.w#b.w.1#G#G#s#zbVbVbVbSbVbVbd#ubd.r#D#D#D#D.1bC.1.1.1.1#D.1bV#G#0#0#G.w.1a0bC#G.0aybS.Ba5a5bVbVbV.w#z.w#sbV", +"#ubVbVbVbV#GbV#D#s#sbn#b.w.w.1bVb2b2a5#z#z.K#zbA.w#s.w#sbV#s#z#s.w#b.w.w#GbV.w.w.X#Da0a0#G.1bcaz#G#GbS#GbV#ubV#0#z#0#0a5#0#0b2#0.0.r.0.0#u#u#F.o.M.M.M#F#ubV#G.1#b#P.w.w.w#0aya5.y#u.y.ybVbnbVbV", +".wbV#GbV#G#s#G#0.1#G.1.1.1#G#G.0#0#0.w.wby.wbQbn.w.w#G.w.wa0#b#P#u#G#G#0#G#G#G.w#baz#Yaz.1.0#D.0#G#G#G#GbVbl.8blbva8.8.B#z.Ba5#0ay#G#G#z#G#z#z#z#zbU#z#z#zbQbybQ#zbK#z#s#sbn.R.y#2#2aB.8bVbV#0bV", +".w.w.w#z.w.w.w.w#GbV.r.0.0#G#G#Gbda7a7#H#8#8#8#H#u#u#F#u#D#GbV#u#G#G.w.1.w#G.wa0bV#D#DbV.w#baz.w#G#G#G#G#0.BbSa5#u#u#D.1.1bn.0#7#z#0bSbSbSa5#z#z#r.e.e.4.4#2#2bT.4.4.4.S.R.Rbn.i#s.K#zbV#s#0bV.w", +"#u.8#u#u#ubV#GbVby.wbQ.w#b.wbVbl#T#T.l.ear.Ba5.8.w#G#G#G.w.1.1.1.1#G#G.w.1#G#G.w#P.w#G.1.w#P.w#0#D#DbV.w.w#0#0#0.w#b#baVaVbn.1#G.y.y#F#F#2.obv#Fay#z#GbVbV#z.e.e#z#z#zbV#s#s#s#sbQbQ#sbQ.wbV#G#0", +"#0#0#0#G#0#u#ublbDbT.4#4#zbQ.e.e#s#s#s#z.w#0#0aU#DbSbVbV#D#D#D#G.w#G#G.w#P.w.w.w#Gbmbmbmay#u#G.waz#b.w.w#Ga5bl#uaraW#i#i#ia6.4.ebVbnbQ#b.w.w#GbV#u.r.r#G#G#G#0a5.1.wbV#zbSar.J.JbT#x#2.y#F.8#u#G", +"#5.TbL#tbD#i.g.Z.SbA#zbAbKbSbSbA#u#D#G#u#u#u#DbV#GbVay#G#0#G#G.r#D#Gbn.w#b#b#HaY.1bVbV.y#u.y#F#Fbv.o.M#2#2#2aBbG.9#OaB.y#D.1.1.1.w#s.1.w#G#G#G.rbdbda7bdbnbn#sbQ.nbw.s.Z.4.8.8.8.obl#u#zbV#z.K.K", +"#i#x.Z#tbL.K.kbQbAbVbK#u.ybSbV#z#G.w.w#G#D#G#0#G.1#G#D.1.1.1.1.1bVbV#z.yaBaM.M.5.y.y.y#ubV.w#P.w.w.w#b.1.1.w.wby#b.w#b.w#b.w.1.1#u#u#ubVbAbK#z.S.T.TbO.Z#vbga3axbD#xaZ.8bAbAbAbA.e#4bA#ta6.P.6.6", +".S.4bL.e.e.e.ebA.8bSbSbSbVay#0#G.1.1a0.1#ba0#H#bbc#Hbc#Ha0bc.1.0#z.8#T.J.l.ebVbV#G#G#G.w.w.w.w#P.w#b#n#b.1.1.w#n.1.1.1#G#G#D#ublbl#2.4.4.g.Z#ZbN#9#9aa#X.g.ZbOar.Mbvbla5#z#zbA.laPbNbi.U.U#..Zbw", +"bL.e.e.e#zbSbSbl#u#DbS#G#G#0#G#G.1.1.1.1bc#Ha0.1#G.1.1a0#b.1#u#F.e.4#T.8by#b#na0a0#b.w.w.w.w#P#0bVbV.1.1#G#G#u#G.1#G#G#ubS.8.l#T.Z.g#ibW.UbNa9#p.UaP.9.S.ybVbV#Dayay#z#z.e.4bT#i.pad#pbN#.bRaI.T", +".4.e.KbS.8blblbSbSbS#GbV#G#0#G#G#G.0.1.1bcaz#H.1#G.1.w#P.w.w#z.8bK.KbQbQbV#u#D.1#0#G#G#G#G#G.1#P.1.1beazbe.1#G#u#zbK.K.4bO.Z#j#v#A#ka9.YbW.ZbL.4.R.R.ibn#D#u#F#FbS.S.4aqaPbNbi.I#.bWaP.gbObL.8bL", +".K.K#z.e#F.lbv#F#z#GbS#u#u#G.w#G#u#G#G#G.1a0bc.1#P#P#P.w#GbVarar.R#J#HaY.1.1.1#H#H#b.1.1bc.1#P.1.w#b#bazbe.w#zbA#t#t.Z.Z.Z.g#.#.b1ba#..Z.Z.lbS#u.y#u#ubSbS#N.laA#j.ga9#kad#ka9#..g.g#tbO.e.e.ebA", +".l.l.8.y.8bAbAa5bSbS#ubSbS#0.w#G#G#G#G#G.1bc.1bCbm.1.1.0#Dblbv#T#D.R.ybVbe#nazanananbeaz#b#bbc#H.wa0.1#sbV.S.S#t#t.s.Z.sbwaIaIaI#t#t.4bA.lbl#ubl.3a5a5.e.4bh#V#XbN#k#kaG#k.L.OaIbL.e.K.ebA.y.4.8", +"bSbAbAa5.ebA.8.4.8.ybS#z#G.w#0bSay#0bm#G#G.0.1.0bc#H.zbf.zbe.1#z.KbVbSbA.y#D#D.1bebebe#HbeazazazazazbebV.S.4#1bMbZbR.Z.Z.Z#t#tbYbl.o#ubS#Gay#0#uarbl.laB#t.uaT.Oad#kaGb6#ka9.g.Z#t#t.4.4#t.4bK.K", +"aBbs.y.ybA.l.lar.4aBaB.8.y#F#u.wbn#D#D#G.0.0a7.FbdbCbc.1.1.0.1bc.F#8#H.1.ybG.4.ebn#s#s#baY#saYaV#b.w#s#J.SaZbD.sbR#t.S#z#ubs#F.R#D#D.0#G#G#G#G.0#D.R.yaBbDbDaP.g#Zb1.L.fb6.h.hac.I.YaT.u#t.Z.Z#2", +"b3bR#1.4.4.4bX.R.K.KbV.ybl#F#F#F#za5a5.B#z#0#sby.1#G.1.1.1bm#G.1a0a0#H#H#b#b#s.ya#.X.y.ybVbn.w#bbebeaY#sbAbRbZa2au.S.R#s#z.y.e#zbs#ubn.1.1.1#G#D.0#D#D.RbA.4bO.4aPbD#Eb#af.I#Maf.2.x.L.L#Z.O.n#S", +"aObi#Xbw.s.sbY.SbXbK#z#z.w.w.wa0#z#za5bS.l.l.8bVbSbVbS#G#G#G.w#Pbe.w#b#bazbrb4#Hbebebe.1#u#F.5.X#F.y#s#Y.NaN.Q.Q.T.Tbu.w#sbn.1be#sbVbV.y.y.ybn#b#G#G#G#G#0bn#zbSbn#bbn#D.R.RaBbX#3.O.Yaf.I.Ibi#E", +"aVbX.G.6a3aCb3#U.y#z#s#0#z.w.w#s#H#H.1.1.0#G#Hb4bVbV#u#u#u#D.0#D.1.1.1#D#7#D#Hb4bCbc.1.w#b#b#n#nbe.1#u.yaBbX.S.kb4.cb4aYbA#T.4#r.4.K.K#s#s#s#D.y#GaybV.w.w.w.w.w#G.w.w.w#b.1bn.1#P.w.w#0#0aybS#G", +"bnaVaYbeaNarbp.A.P#2#F.y#u#s.w#sb4b4.1.1.1.1#H#H#nbeaz#b#HbnbCa7.zbe.z.1#D#D.w#Baz.z#H.w#P.w.w.wbebeanbrbebn.RbX.4bQb0aL#BaYa7.bbA.4#xaMaZ.ybK.kbA.4.4#F.8.ybA.ybv#u#ubS#sbV#D#zbl.ray#G#G#P.w#P", +".w#0bSbVbV#D#D.1aY#b.w#zbS#FaBaB#x.M.l.8a5byap#bbn.1bebebebebeaza7.0bd#u#ubSbS.BbC#D.0#D#G.w.w.1anazb4bebebebr#B.V.c#D#Oai.S#s.WaE#Y#Y#YaY.kaB#x#4.S.S.4aBbX.y.y.y.K#z.KbV#z.ybV.ybKbKbK.K.K#z.k", +".8.8#u#G.w#HaV.1#s.w#s#0#zbV.wbQ#na0by#0a5bSbvbg.M#F.y#ubSbA#z.k.w.w.w.wa0a0.w.w#H.w#HbV#D#u#G.1.1.1#b.w.1.1#D#DbVakaLaLaLbq#B.VaB.XaB.ybKbQaLaL.q.qaY#a#b.w#b#b#b#b.wbn#s#D.y#D#s#s#s#JbKau.SbA", +"b4#Hbe#baY#s.K.S.y#F.ybSbS.R#zbe#H#H.1#Gbc#b#bbn.w#bbybQ.4#xbga6#T.l#za5bV#G#Gbc.w#b#b.wbV#D.1beby.wbVbV#z#s.w#Y#bbeaY#J#s#Ybe.1#B#B#Bbr#s.RbA.KbKbnaV.w#b.w#Ha0b4anbe#Hbe.1.1#bbC#8bc#Ha0a0#Pbc", +"b4#8#8#H#HbCbC.1b4#b.w.1#P#G#G.0akbVbXaB#2#2.4bAbA.KbAbV#s#b#YaY.1bV.8aZ.GbYaB.S.RaV#abebn.1#8az#b.w.w#b#ba0by.w.1#Hazbebe.1#s#b#ebnbnbnaVaVaYbnbnb4bebe#abe#abebnbnbnbn.ibnbnbn##a7#8#8#ea7beaL", +"#Y.w.w#s.w#0#z#0#D#DbVbVbVbV#bana7#D.1.1#b.1#D#D#u#u#Fa#.o.y#D#D.r.r.w#b#Y#b#b.w.gbkbg#Tar#za5a5####.5.b.Ra7.1bn#HaV#H#Hbn#D#D.ybQbQ#z.K.e.K.e.ea7bnaVa7bnaY#aaL.m#Wbrbr#Ybr#W.m#L#L#L.mbeb4.w#b", +"#sbK.ybS#z#zbSbS.k.k.K.S.SbAbKbn.w.1#D#GbV#GbV.w#G#G#G#u#u#ubl#7.r#G#G#0#zayay.0#Y.wa5bS#zbS.8.M.4.Z#xbka6#TbObO#D.Rbn#s#bbebebebV.R.R.y.R#D#DbVbebe#BbqaLbebn.Rbnbnbebr#BbrbeaV#Da7bran.mbr.1#D", +"anazbean#Banbe#H.y#O#x#x.ybKbK.R.Jbvar.ebja5#N#TbvbS#z#0#0.1#0bV#G#u#u.o#Fbb#7bm#F#7#u#D#Dbn#bbe#s#s#sbn.w#zbVbVbkbpbpbpbhbhbhbhaAaAaWaW#N#r#rbFbs.ybKbn#b#YaLbq#Bbrbebebebr#BbqbeaLbe#Y#B#B#B#B", +"a7#DbCb4azananan#BaL#b#Yby#b#G#ub0aN.e#x#i#xaWbObAa5.e.8.4#2.4.4.w.wbQ#zbSbSbVbV.w#z#zbS.JbGbG.l#D#GbV.1.w.1#G#G#H#8#8#8aoa7#8#8#D#Dbn.1bnbC.1bC#b.w#D#D.y.5bs.y##a7#Hbranbe.1.i#sbn#D.Rbsbs#ubs", +"#b#0.y.8#2#2#2#2#F#u#G.w#0#G#Pazb4b4beb4bnbn##.5#xaB.4.4.4.e#z.K.e.SbA.8bA.ebK.K#zbV.y#ubVbVbVbVar.8ara8ara8a5ar.RbV#zbVbA.y#D#sbSa5a5bV#zbSbVbS#G#DbV#b#b.1bn#bananbeb4b4anananbean#B#B#Bazbebe", +"#0a5bSbV.w#Y#BaE.1#0.wbSay#uay#Gbd.FbCbC#H.zanaz#b#b#b.w#zbA#2#c.P#6#6.M#2.e.K.k#KaB.Xbsbn.1.1#7#Hbna7#D#D#D#D.0#0#zbVbV#u#F#FblbdbCbC.1bC#G.1.1bV#u#D#G#Hbean.manbeanan#B.manan.mbebe.1bV.1.1.1", +".zbCa7#Hazanb4#8#Y.w.y.8#z.w#G#D#G#0#P#0#0#0#uaJ#D#u#ubl#D#0.wb2.w.1#0#0.w#z.4.G#vbhbRbO#rar#N.l#4bL.S.4.4.4.4bLay#D#uay.1#Ha0.w.1.w.1.w#G#s#0.w#G.1.1an#Bazb4b4anazb4b4.zananan#f#f#8#b#H.w.1#b", +"b4#Hbd#Ha7#H.1.0a7#H#b.wbV#s.w#0#D#D#D#D#G#u#u#G#G#G#GbV#u.8.y#ubs#7#G.1.1bn#D.y#xbXbAbAbYbt.Z#RbXbK#s.k.R.S.RbAbl#F.o.o#Fbv.yblbV#u#7#G.1.z.z.z.w.1#G#u#D.0#G#nb4#H.1.1#b.zb4.z#H.1.1.1#Hbe.m#B", +"#Y.w#D.1ay.w.w#Ga7#H#H.w#G#G#G#G#D.wbV#G.1.w#G.1#D#D#ubSbA#u.KbV#s#G#u#u#ubVbn#s.zb4b4#sbO.g#V#X.MaB.yaBaB#2aZ#2.y.y.R.KbQ.KbQbu#zbAbK#s#bbe#Ybea0be#bbn.w#D.y#G.1bC.1.1a0#b.z.z.zbc#H.zbCao#HbC", +".wbS#0.wa0a0#na0azaz#b#H.1#G.0.0.w#P.w#G#0#G#uay#D#DbAbK#z.KbSbK.l.4bv.8#F.l.e.S#ubAbA.RbK.K.K#s.4bAa5#z#z#z#z#z#w#m#3ba.p.p.L.L.ZaZbD#t#R.SaKaKakap#Y#bak#s#zakbn#D#u#D.y#7bs#7#F#F#u#0#0#0by.w", +"bna7anbran#8az#8.1#ba0#bbcbeaza0a0.w#G#G.1bm#G#0.1#z#GbV#z#0#s#G.e#z#z#za5.8bGbgaAbv#T.l#F#Da7a7bQbybQ#z.e#z.ebAblblay.0ay.raJ.obR.s#tbR#t.s.s#tbDaZa6bT.Z.gbT.SbA.S.S.KbQ.q.q#YbqaLbeaV#D#u#D#u", +"auauaL#W#Wbr#L#Wbe#nbe.w.w.w.1a7.1#H.1.0#u#7#7.r.0#ubl#uay#Gay#u#z#za5#u#ubS#za5#D#u#u.8.8.8.8#r.4bYaZ.G.GaZaZaZ#t.SbLbFb.#5bO.Z#t.Z.Z#t.Z#iaC.E.Z#1.g.ga6#ibWbR.C.s#..OaPbNbi.Ua9ajaO#X#v#y#r#h", +"bL#1b.aI.g.I.UaP.GaZ#t.4.SbK#sbQbe#Bbe#b.1#D#D.w#G#DbSbl.8bl#u#F.8aB#F#F#F#ubV.w.ybSbS#u.8.8a5#z.k.K.KbK.KbQaYakbu.K.S.4.4.4.S.e.4.8.4.ebF.Kb.#h.gbR#taq.ZbW#E.gaP.YbNba#.babaaP#3.u.s#R#R.S.KbK", +"a6a6.Z.ebO.T.QaNa2a2aIaT.Ub#.6.EbIaZaZ.4.S.SbA.kakbQ.k.KbF.ebA.y.e.ebSbS#u.8#FbG#r#r#r.e#F.ybsbdbV#zbV.yaBaB#2#2#MavaS#Z.O.O.OaPa6#i#i.ZbRaI.H.n.ZaIaI.T#5aIbRb.b.bLaIbRbR.gbWaP.g#v.g.Z#x.gbT#i", +"#H.1#DaY.ybV.SaB.Y.O.O#.#X.ObBaIbR.T#1#t#1.Z.g.ZaP.U.U#EbW.g.g.g#T#T.4.l.l.8bS.e#F.8#F.l.8arararblbSa5#0bS.BbS#ubV#u#ubl#ublblbl#5bZ.gaP#.babN.pb##E#E#E.Z.g.gaIaB#2.ZbL.T.e.e.K#z.kby#b#b#Y#Baz", +"brbrb4#Hb4.1#D.0.R.y.y#F.yaBbvaB.Z.g.g.g#jaOaxbxaFaS.Y.O.s.s#ta2#Fbla5bSay#ua8bl.y.y.RbK#J.KbKbK.S#F.y.8.8bA#F.l.y.y.8.8.4.4.4.4aPbtaPaP#E.YaPbNaP.Z.sbwbw.C.CbZbB.C.Z#..O.H.OaP#RbX.SbK#JbnaV#a", +"aZ#taZ.Z.4bLbO.ebLbR.S.TbL.T#4buaK.S#R#R#4.Sbw#t#3aT.Z.ZbD#i.E#i#Z#ZafafbN#Z.na2.3ay.B.Bay.B.8a8bn.y.4.4.4.8.8bAbl.y.ybKbS.e.e.8#F.K#s#s.k.KbLbObL#t.Z.9.G.GbI.E.G.9aP.g.ZbZbZ#tbJaI#.#EbW#E.g.Z", +"aKaKaH.u.C.C.sbw.O.O.O.O.Y.Uba.O.uaPbtaT.u.s.s#Rb.#4#5bLbL#T.Z.4.4#t.4.4#t.4.y.ebKbAbV.KbAbAbA.K.KbVbAa5#z#z#z.y#z#zbS.8aB#2.M#2.o#F#ubl#F#u#G.wbQbKbKbnbQ#YaL#Y#saY.KbAbYaBaBbY#.bibiaPaI.Tb7bR", +"#h#5#1#X#jaOaaaa#M#paf.Ybaba.n#S.H#.#.aDaqaqaq.HaPbW#x.Z.4.Z.4bR#RbLb.b..k#4#R.4#RaH.u.u.u.ja1aK#F.S.4.K#zbQ#zbVbSbSbS.ybS#DbVbVayayayblbbbl#u#G#D#u#u#D.1.1#b#H#H#b#b#GbV#s#b.1#L#WaL#WbqaLbK#K", +".zanbeb4be#aaY#aak.k#4bL#t.G.G#i#1#j#j.gaq#j#.bW.ZaT#tbRbObRbLb.#u.r.r.r.r.rbmbm#za5bv.la5a5a5a5.K.4#xbg#xbg.MaM#2.8bV#s.w#sbV#ubS#z.1#z#G#G.1#G.1.1.1.1.1.1bc.1.1.1.1#G.wazaz#Bb4#8bC#Hbebe#H#b", +"#D#G#G#u#0#zbSbSbVbVbAbAbV#z#z#s#JbK.R#s#saYaVaYb.#4.SbL.4.Z#t#t.L.LaS.Lba.O.n#mbQ#z.K#zbQ#0.e#2bQ.K.K.K#z#s#z#D.y#F#F#F#F#F.oaB.8.y.8.y#ubV#0#D#u.r#G.0#G#G#Gbc.1#G#G#G#G#Hbc.1#naz#b.w.1#0#0#P", +".z.zbcbCbcbC.0.0be#b#ba0#H.1.1.w#Dbdbdbn#H#8.z.z#BaL#b.w#sbV#z#s.K.K.K#z.K.K#z.K#R.C.j#RauaubYbt.6#6a6bL#zak#bak#D#D#D.y#u#u#0#0.w#sbV#u#F#Fbl#u.w#0#G#G.1#G.1#G.r#GbV#GbV.1bc#H.w.w.wa0#0bS#G#0", +".w.w.1#G.1#P#G#P.w.1#H.1.1#D#D.1by#0#0#G#P.w.w#b#Hbc#Gay#G.r.1.wbv#F.l#F.laJbvblbA.8.l.8a5#z#zbS.K#4bO.4#TaBaB#Fb4#baz#b#P#zbl.o#F#D#0#G#G#GaU#0.B#u#u#u#G#G#0.1.w.w.w.w#0#G.1.1b4anbraz#8.1#8az", +"b4.1bnbC.1b4.zaz#f#fbr#fb4#8.Van#f#8#8ananbe#G#u.1#G#DbC.1.1.w.1.w.1#G#G#GbS#ubSaiaB.SbXaB#2.4bKbvar.ebF.T#1#j.gah#O##bnbn#D#baY.1#D#DbS#u#D#7#7.o#u#0.wbya0a0#0.wbn#0bSbAbS#z#0#8#8an.z.1bd.1a0", +"#b.1.1bn.1bebran#W.man.manbran.m.m#Bbebe.1#D#D#bbCbCbC#GbC#G.1#G#u.8#ubSbVbS#z#z.w#s#D#ubV.1.w.w#Da7bd#Dbs.5.5#O.Q.Q.K#N.Jbgawax#O.y#z#s#z#z#b#B.zazaz.1#GbC.0bd#7#D#ubSbV#G.wbebr.Vbe#8#D#7#7#G", +"#b#b#b#b.w#b#bbeb4#H.cbebe#bbnbK.e#z#z#sbVbs#D#G#z#z#za5a5#za5a5#sbn#z#z#z.y.8bAbl#F.o.o#u#G#G.r.1bnbn#D#DbV#z.w#T#x.MbGbla5a5.eaB.S.SbT.6.a#2bK.1bn.1bn.1bean#lazazbe.1.R#F.5a#.S.e.ebUbU.W.Wap", +".ybAbAbKbK#DbV.waV#HbebebeaYbnbn#z#FaB#F.y#D#Dbnbe#H.1bn.1#Dbnbn#8#eao#e#8#8#8#8#0#0#0.w#G#G.ray#2.J#2#2.la5#z.w#b.1#u#Gbnbn#D#DbAbA.4.4.8bA#z#z.e.8#T.J#x.l.K#z#D#0.w.w#b.qbraLanbr.Vbr#8bd.b.b", +"#B#B#Bazbrbebebe#8brbrbrbe.zbrbr.mbrb4#H#b#sbVbV#NaW#T#T.J.JbkbkaAbp#Vbpbhbpbpbp.e#zbQ.w.w#s.1.w#H#b.1#G#D#7#7#FbS.8.l.l.8a5#sbybV#G#0.w#0#z#Fa#.4#NbOar#r#r#z#za8.ybS.8.4aB.SbK.cb4anan.mbeanan", +"brbrbebrazbr#f.Vbr#f.manb4bebean.V.V.m.maL.1bA.y.Rbnbnbnbnbn#Hb4#Y.w#saYbQbnbK.RbT.GaM#2.4bVbVbK.8#F#u#z.wbybyby#G#G#zbV#u#F#F.obb#uay#0#0.w.w.w#b#b#sbn#D.X.5.b#z#0#za5bAbA.K#s#TaAbObO#T#T#raN", +"bnbnbnbeanbq#l#Lan.maLbrbebebrbeaVb4b4aVbnbn.wbe#T.4.ybAbK.KbQbQ#D.R#D.1.1#H.1#H#Y#s#zbVbV#z#u.ya5a5ar.l#T.J#vawa7#Hb4be#b.1.0.0#G#ublbv#c#c#2#u#Dbd#D.1.w#Hbean#b.w.wbVbSbVbVbVbVbV#D.1bV.1#ban", +"#Bbebe#abebeaVbnbn#sbn#D#s#a#b.w.q#b.q#Y#Ybe#HbnaY#baY#baVbnaVaV#bbn.w#bbebeaV#H#D.1bebe.w#G.wa0.z.z#HaV#HaYbnaV.ebLa6a6a6bOa5b2.w#b.w#zbU#s#s#zbA.lbv#T#T.l.y#0#8.1#D.1.wazaza0.w#P.wbebe#H#baz", +"az.1bcbc.1.1bCa0#H#8b4b4#H#Hbebr#b#bbn.ybXbK#s.c.ia7bebe#zbV.8a5bnaY.caLaLbe#H#H.kbKbKbK#s#b#b#H#bbV#DbV.wbe.w.1bCbCbn#D#2bg#i#i.J.lbA#s#b#bbQbQ#JbVbVbS#G#u.R.R.SaB#2#2aB#Fbd#H.z.1.wa0#b#Ybe#Y", +"au.S.S#J.k.R.kaY#DbVbV#sbn#s#s#b#Y#Y#Y#Yak.q#Y.N#Y#Y#a.R.y.y.ybV#ebrbq#WaL#B#bbV.i.RbVbn.1#bb4b4#s#D.y#ubV.1#b#H.1.1#bbe#Y#b#s#z#z#z#D#7bs#u.y.lai.5#F#u#0.wbebe.qakbQbQ#baY#b#b.1.1.0#G#D#ubb#F", +".k#s.k.k.K.KbK.KbA.KbK.K#z#s#z.K.5aBbX.4bY#RaHbY.Z.4.e#s#sbnb4#H.q#Y#sai.dbs#8anbeanan#Ybe#H#H#8#b#H.wbV#G#G.0.1.wbV#u#F#7#D.1b4#bbebebeazb4.1bVbebe.w#z#u#FaBai.4#2.4.ebQbQ.w#Y.w#G#GbVay#u#z.w", +"bm#G#Gaybl#ublblbAbA.8bSbAa5bS#F#D.1#zbnbVbK.K.K.K.e.4aB.y#Dbnbea7#8brbq#Y.K.ebU#Hbe#Yanazbeazanazaz#n#n.w.1.1.1.w.w.1#Pa0#b.1.0bV#G.1.1az#b.w#s#sbVbV#ubVbV.1#s#z.yaB#2bG.M#xbgbG.8#z#Yb0#b#s#z", +"bS#GaybS#G.w#b#b#zbV#0bV.w.w#G#G#G#G.1#G#zbV#D#u.y#D#z#s#s.K.8aiar.4.4bV#sbn.cbr#s#u#2.M#x.y#D#b.1#b#b#b#na0a0a0a0.1.0.X#7#u.1a0#z#D#u#F#u#ubVbV#n#n#b#Pby#b#Y#n#bbn#D#DbV.KbV#z.K#1#i.6.6bDbL.Q", +"#Ebi#p.U.Y#Z#C#3bAbAbKbV#s#G#s#0#D#G.w.w#0bc#Gay.1#D#7#F.ya5#s.WaV.cbebn#sbQ#h.T.K.kbQb0aE#YbV.X.y.y.y.ybV.w#b.1#8.1azazaza0a0.wa0.w#0#GbV#z#z#0#F#F#F#F#F#u#ubVbe#b.1aY.wbV.ybAbRbR.Zaq.Z#E.U.U", +".n#Z.p.Las.faQ.fafaf.U.UaPbD.Z#t.4bK#za5#z#G#G#G#G#G.w#G#GbV#u.ybUbQ#z#zbV#JbKbYb.#R.Z#tbA.wbe#n.R#D.y.y.8#Dbn#D#Y.w.wbn.w.waza0.1.1#H#b#P.w#GbV.w#0bV#u#u#u#u#ubv.o#F.y#DbK#z.K#z#4.4.S.TbL#t#t", +"bLaZbD#R#taP.U#Z.hb6as.L#k.pba#ZbD.s.ZbTbG.8bS#Gay.B#G#0#G#D.0#D#s.y.ybVbV.4.ZbL.s.s#R#4#s.w#H.1aY.qbebQ#s#s#sbnar.l.l#u.1#HbC.FbC.1bC.1.1.1.1.1aybVbV.w#s.w#s#0by#za5#u.y.4.l#r.y.8#F.8.K.e.4#T", +"#4#4.S.4#taZ#T#2aZaTbNaQ#daQ.fasaS#QaT.s.4.8ararbl#ubVbV#ubl#F.XbT.G#t.S#tbkbT.T.uaH#OaB#D.1.zaz.z#f.z.zb4.za0.z#Jbn#JbK.ybAbK#s#z#baz.z.z.zaobc.0.1#G.0#G#u#G#G#ubS#0bVa5bS#uaBaB.y.y#u#F#FbA.K", +"#zbK.e.S.8.S.S.T.O#Z.LaQaQaQb5af#..Z#t.4#F.yblblbl#ubVbVbK.S#t.saI#tbwbZaI#t#t.S.n#1.TbF#zbQby.wbebranbraz#b.1.wan#nbe.w#z.y#FaB.8.ybn#Haobcbcbc.1.1.1.1#G#G#G#0#G#0#GbV#ubVbVbV.8bAblbAbSbS.K.K", +"#F.l.8.4bLbRbRbR#Z.L#kafafbN#..Zbg.Jbv.8#u#D.0#7#ubS.y#t.s.Obaas#3baaP.Z.sbD.Z.Z.y#JaY#a#Ybe#b.wb4#b#bbebebebe#bbm.0#u#G.w.w#0bVbGbAbVbV.1.1.w#P.1#Ha0bc.1#Day#D#0.1bS#u#ubV#zbVar.8.l.8a5a5.e#N", +"#T.4.4bObw#.bNad#k.pba#.bR.4bAa5ara5#zbVbV#u.y.4.K#t.gbi#pb5.p#k.ZaP.Z#t.S.y#Dbna7bCb4.zazb4ao.1#b.1.1bVaybV#G.wa0.w#G#z#0#z.K.y.8bV.w.1.1.1bc.1bcbc#Ha0.1.0#G#G#G#G#G#G#GbVbV#ubla8a8blbSa5.8.4", +".e.T#1bw#..paQa.#E#v.Z.8.ebSbSay#FblbA.y.S.T.TaIaDbN#paj.U#v.g#ta6#TbAbSbS#G.1bc#GaU#P.w#0#GbSbS#G#Gay.r#D#G.w#P#D.y.8.4.4.e.e.e#u.1#P.1bc.1.1.1.0#Ha0#Hbc.1.1.way#0.w#0bV#GbV.ybl#F#u#zbVbKbA.y", +".g#.bW.UaOa9#..O.4.8bAbSbS#u.lbv.K.K.S#x#Eb#.v...Yba#..Z#T.4#Fbvbl#ubS#G.0#GbCbc#Pbc#P#P#G.w.w#P#Gbc.w.w.w.w#P.wb0.qbQ.K#r.S.S.S#G.1b4#P#H.1bc.1.1bca0.1#P.w.w.w#G#z#GbVbVbSbSbS#DbV#s.K#4.S.4.4", +"#EaC#i.gbT.4.4bAbAbAbSbAbA.4.ZaPa3.6#6#E#x.4bLbL.4bAbKbAbSbS#ubS#0#P#P.w.w.1.w.1#H.1a7bCbn#H#H#Hbybyby#z#z.8.4.4aM#xaZ#2.8.y#GbV#Gbc.w.1#G.w.1.wbcbC#G#G.1#G#GaybSbSbS.8bla5bA.8#z#z.KbZbRaT.ZaP", +".4#r.K#z#z#G#ubb.8.y.y.y#R.O#Z.tbMbM#5.ebA.R#D#Day.rayaybV#G.wby.1#G.w#G.w.wbV#u.TbObO.Z.Za6bD#ia6bTbDbD#iaP.s#t.K#s.wbya0#P.1bm#G#0#0.BbSayb2#0.1#G#u#GbVay.8.8blbSa5bSa5#za5bAar.Z.gbaa9baba.O", +"b2bS.8#N#T.Ja6bk.M.M.lbS#z#G#z.w#ubV#GbV.1#G#D.ra7bnaV#H#Hbnbn#D.l.4#2.E.6.6bT.T.X.X#u#D.1.1b4be.1#G#G#G.0#Gbcbc.1.1.w.1.w.1#D#G#D.0.0#D#GbVaybS#G.1.1#Dbn#DbnbV.SbA.KbVbK.4aZbD#F#ubVbSaybV.wbn", +"#D.0#Dbn.1#sbQ#s#za5#z.w#zbS.y#ubV.kbVbVbVbVbVbnaW.l.l.4#Narar.8bCbn#HaVbnaVbebea0.w.w.1.1a7#u#7.1#s#H.1.w#Ha0#b#G.w.w.w.1.w#G#G.0#G.1#0.w#0#0.wbS.ebS.e.l.4.JbG.y#u#D.w.w.w#sbQbV#s#0ay#ubV#D#D", +".0bn#Gbn#D.R.R.RbV#G#z#0bV#u#u.y.SaBbYaB#t.4bA.ea5#zb2bSbSbVbV.w.0.0a7#Hb4#Hbn#7a5#z#z.w.wa0a0#bbeaz#b#b#bbn#D.y.1#G#G#G#G#u#G#u.1.1#b.1aybl#Fa8bG#T.8.eby.Wb0bP#G#Gbm#Gbm#G#G#G#sbn.w#z#G#G#zbn", +"#z.w.w#zar.4#T.Jbv#F.ybSbV#ubSbVaY#s#s.Ka5.K#z.Kbl#u#D#G#D.rbd.ra5#0bS.BbVa5#ua8.ybla8#u#0#G#G#G.0#D#G.wbe#B#Ybe#P.w.w.w.1#0#G#G#G.1#P.w.w#0#0.w#baY#s.wbn.0#D#7ay.rbm.r#G#G#G#GbV#0#z#0#G#z.1.w", +".8ara5.Ka5.ear.e.w.w.wa0#bby.w#b#0#0bV#u#F#FbGbv.8.8ay#z#0#0#0#0#z#0a5aya5ayb2#0bV#GbV#D#u#u#D#Ga0a0bc.1bc#G#D#u#Day#D#GbV#G.w#s.w.w.w.w.w#z.w.waBbs.y#D#DbC.1bCbV#G#0.1#0#G#0#zbKbSbSbS#u#ubVbV", +"#Hb4bebeazbeaz#Y#ubV#u#z#u.y.8#F.w.w.w.w#0.w#0#z#G#ubl#F#u#u#u#Fbd#u#D.0#7#7#7#D#u#D#GbV#G.w#bbebc.1#G#G.1.w#P.w#b.wby#s.w.w#s.w#z#z.KbA.4#F#T#2ar.e.ebA.ebAbAbSbQ.w#s.w#z#zbK.4.y.8bSbS#0bSbVbn", +"bn.1a7bnbn#D###u.1#0bn.w#G#z#D#0#0bV.w.w.w#bbe#bb4b4#HbCa7#Dbd.ybs.R#D#u#u#F#7bs#u#u#u.ybA.S.4bLap#b.WbQ#z#s#z#z.8.4.8#2#2bG.MbT.4.SbA.S.4.S.K.Kararar.ea5.ebS.e.8.8.ybS#z#z#s.KbAbla5#0#0.w#s.w", +"#s#z#s#z#z#z#za5#D#D#GbV.wbV#z#0.Ka5bKbAau.R.S.R.lbAa5.e#r#NaAaAa6.ZaW#N#N.e.e.e.BbSa5.earbOa6#Ebi#EbDbDa6#t.4.4.ebA.SbA.e.K.K#zbL.T.KbL#t#TbL.Kbn.1.1.1.w#Hbeb4bV#z#z#G.w#z#z.K#za5#zby#0bVbV#z", +"#u#D#DbV#u#ua8#ubXau.y.y.ybs#DbsbK.SbL#RaIaI.C#3bw#t#R#R.S.S.S.y#t.gaPaP.gaT.Z.ObabaaP.Z.Z.Z.4.l#F#2#2#O.S.ebA.8.S#2aB.y#zbKbS.y#u#D.1.w.1bnbVbn#zbK.y.SbK#4.S#tbSbV#u.8.8#u.8#ubV.y.y.y#ubA#ubV", +".##q#qat.tas.2.2#A#A#AbH.H#C.H#CaMbI#x.GaZ.9bD.G.9bD.GbT#2#2aBaBbK.ybAbKbK.S.S.S#t.Z.Z.4bAbK#zbV#sbV.K.K.K#s.KbV.K.y.SbA.KbK.y.S.4.ybAbK.K.K.K.K.K.K.e.K#4.K#4bLa2#5.D#5a2aIaIa2aIbBbZbwbw.s.OaP", +"ba.O.Obaba#.#.#..A.A#v.Abkbkbk.A.y.8.SbA.e.S.S.4.K.e.e.e.e#z#z#0bS#ubV#zbV.y.ybS#4.SbY.S.y.yaBaB.4#t#t#t#t.S.S.S.e.4.4.S.K.KbL.S#hbF.TbR.gaPbWaP#Z#ZbaaS.p#kb5b5bNa9#..O.O.Oaq.ObaaP.O.O#Zba.Y.Y", +"#D#u#u#uaybSbS#u#s#s#z.w#s#s.1bnbQbQbQbQbQ.Q.K.T#t.4.Z#2#T.4.4.4bAbA.SbA.S.S.K.KbQ.K.K.K#5bLbL.SbO#R.T#5b.#5.K.kb.#5bLbZbZbR.Z.gaP#.aPbNbNbN.O.Hbwbwbwbw#3.O.O.O#2.4.8.8.8.8.ybAbA.e#z#s#z#s#z#s", +"#5.TbLbL.TbLbLbL#m#gae.CaX.Caeae.Z.4#tbLbLbZbR#tbObR#tbR.4.4.4#t.saP.U#E.YaP.U#..UbWbibWbNbNa9#..gbW.Z.sbwaP.G.9aP#E.U#E#EaPaP.U.Y#3bBaIbw.Cb.#w.ybSa5bVbSbV#z.w#z#z#z.K.K.e.ea5bAa5.ea5.ea5a5.e", +".U.Y.YaTaT.Z.O.gbRbRbwbw#tbB.s.ZbTbT.Z#t.4.4.4a6#t.Z#t#t#t#ta6bDaIbZbB.n#m.n#3#3#X#.aq.HbH#..H#m.TbRaIa2.DaI.T#4bwbRbwbwbZb.bob.#4b.buaK#R.s.9#t#3.O.O.Obw.sbw.sbwbwbwbw#tbwbRbB.Z.gaP.gaP.gaP.g", +"aB#FbSbVbV#D#ubVaya8bl.8aybS#u#u#zbVbV#zbV#zbK#u#u#u.y.8.ybA.ybA.4bY.4.4#t#tbDaZ#tbR.4#t.4#t#tbL.K#tbwaI#5aIbLbFaIaIbwbD.U#E.Ubi#EbDbD.ZbT#xbT#xabaRaR#oabat.O#Z.s#t.SbLaI#4aKb.b.b..Kbu.7.Qbub.", +".w#b#b#Y.w#0.1#G#z#G#z#G#b#b#b#s.1#G#G#G.1bc#G#G#G#Day#G#G#G#G#G.w#G#GbV.1#z.w#b.kbnbKbn#s#DbVbV.K#t#iaP.ZbW.g.Z.s.s.gaPaP.Zbw.Za6.Z.Z.8#r#z#ra5#D.r.r.r#Gbcbmbm#G.1.w.wbc.w#G#G#G#G#G#Ga0#P.1.r" +}; + + + +/* XPM */ +static const char *button_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 254 2", +/* colors */ +".. c #9c3218", +".# c #a4733e", +".a c #bc450a", +".b c #d4700c", +".c c #dc8c29", +".d c #bc5e00", +".e c #d46b37", +".f c #945431", +".g c #bc5a2c", +".h c #8c4e4b", +".i c #d47e16", +".j c #bc7422", +".k c #d47d3a", +".l c #d45e28", +".m c #ec9b3e", +".n c #bc6b43", +".o c #d45a13", +".p c #a45236", +".q c #dc8848", +".r c #e46b1b", +".s c #bc652f", +".t c #a46243", +".u c #bc6920", +".v c #a4391e", +".w c #e47b35", +".x c #9c6b30", +".y c #d46d24", +".z c #ec8a29", +".A c #bc452a", +".B c #e46833", +".C c #bc702e", +".D c #c47845", +".E c #b15314", +".F c #e47e10", +".G c #bc5a18", +".H c #bc6145", +".I c #a44d16", +".J c #cc5728", +".K c #d47439", +".L c #a45b39", +".M c #cc5815", +".N c #dc8f4c", +".O c #b46239", +".P c #bc5307", +".Q c #d4794f", +".R c #d47624", +".S c #cc6c2c", +".T c #cc6941", +".U c #ac5222", +".V c #e49328", +".W c #e4754d", +".X c #d4650b", +".Y c #ac592c", +".Z c #c05e2d", +".0 c #e4751a", +".1 c #e47d29", +".2 c #9c6143", +".3 c #e45f2b", +".4 c #cc632a", +".5 c #cc660d", +".6 c #b44b13", +".7 c #d48442", +".8 c #d66228", +".9 c #bc6221", +"#. c #b45736", +"## c #d47714", +"#a c #dc8936", +"#b c #e48237", +"#c c #cc530c", +"#d c #8c522b", +"#e c #dc8819", +"#f c #ec9129", +"#g c #bc7936", +"#h c #d46f50", +"#i c #bc521d", +"#j c #bc553b", +"#k c #9c523b", +"#l c #f49a45", +"#m c #bc7548", +"#n c #ec8643", +"#o c #a86d3a", +"#p c #a44d21", +"#q c #a4754b", +"#r c #d46547", +"#s c #dc7937", +"#t c #c4642d", +"#u c #dc6c21", +"#v c #bc4d2e", +"#w c #cc7e53", +"#x c #c45917", +"#y c #cc5c42", +"#z c #dc7036", +"#A c #ac5448", +"#B c #ec8f44", +"#C c #b45c4d", +"#D c #dc7622", +"#E c #b45222", +"#F c #d4651b", +"#G c #e47328", +"#H c #e58429", +"#I c #9c5f23", +"#J c #d47f2b", +"#K c #cc7116", +"#L c #eca24e", +"#M c #9c471c", +"#N c #d45b36", +"#O c #c46716", +"#P c #ec7836", +"#Q c #ac642d", +"#R c #c46f2e", +"#S c #c47551", +"#T c #cc5b2b", +"#U c #cc685f", +"#V c #bc4b3a", +"#W c #e49a4b", +"#X c #b44c35", +"#Y c #e48745", +"#Z c #ac613c", +"#0 c #e47234", +"#1 c #c46242", +"#2 c #cc5e1a", +"#3 c #b4683d", +"#4 c #cc7430", +"#5 c #cc7042", +"#6 c #bf4b0d", +"#7 c #dc6e13", +"#8 c #e48c21", +"#9 c #9c3445", +"a. c #8c432b", +"a# c #cc5e04", +"aa c #a43f33", +"ab c #b46d44", +"ac c #9c5e62", +"ad c #9c4833", +"ae c #b4742c", +"af c #a4522b", +"ag c #dc943c", +"ah c #b46000", +"ai c #c46309", +"aj c #a4441e", +"ak c #dc7f4c", +"al c #ac6e27", +"am c #ac4b4e", +"an c #ec9238", +"ao c #e48518", +"ap c #e47c4f", +"aq c #bc5c3e", +"ar c #d56238", +"as c #9c5840", +"at c #ab6946", +"au c #cc761f", +"av c #9c5024", +"aw c #bc4922", +"ax c #bc421d", +"ay c #e46927", +"az c #ec8836", +"aA c #cc513b", +"aB c #cc661d", +"aC c #b44a21", +"aD c #b4544c", +"aE c #ec8a55", +"aF c #9c5a20", +"aG c #94533f", +"aH c #c4701d", +"aI c #c46b42", +"aJ c #dc5a18", +"aK c #cc7b2f", +"aL c #e49046", +"aM c #c4520b", +"aN c #dc774c", +"aO c #ac4631", +"aP c #b45b28", +"aQ c #944e30", +"aR c #ac6e4d", +"aS c #a45f2a", +"aT c #b4612a", +"aU c #ec7032", +"aV c #dc872b", +"aW c #cc5939", +"aX c #b47844", +"aY c #dc843b", +"aZ c #c4601d", +"a0 c #ec7f36", +"a1 c #c47531", +"a2 c #c47344", +"a3 c #ac431d", +"a4 c #ac7439", +"a5 c #dc6735", +"a6 c #c4582a", +"a7 c #dc7c1b", +"a8 c #dc5d26", +"a9 c #ac5036", +"b. c #cc7742", +"b# c #ac4b13", +"ba c #ac5a37", +"bb c #dc5f0c", +"bc c #ec7a29", +"bd c #dc7813", +"be c #e48b37", +"bf c #f48e28", +"bg c #c44e1f", +"bh c #c44e3f", +"bi c #ac4b1e", +"bj c #dc6544", +"bk c #c44c2b", +"bl c #dc611a", +"bm c #ec7125", +"bn c #dc7d29", +"bo c #cc7752", +"bp c #c4473c", +"bq c #ec994b", +"br c #e49336", +"bs c #d46f16", +"bt c #bc600a", +"bu c #d47a46", +"bv c #d45b1e", +"bw c #bc653a", +"bx c #ac3c1d", +"by c #e47943", +"bz c #a46b2e", +"bA c #d46b2e", +"bB c #bc6c3a", +"bC c #e47f1b", +"bD c #bc5b22", +"bE c #bc6052", +"bF c #d47346", +"bG c #cc561f", +"bH c #b46044", +"bI c #bc5312", +"bJ c #d4775e", +"bK c #d4732e", +"bL c #cc6b37", +"bM c #cc644f", +"bN c #ac512d", +"bO c #cc6137", +"bP c #ec8552", +"bQ c #dc7944", +"bR c #c46339", +"bS c #dc6a2c", +"bT c #c45a21", +"bU c #dc6f44", +"bV c #dc732c", +"bW c #b4502c", +"bX c #cc6d1f", +"bY c #c46521", +"bZ c #c46939", +"b0 c #e48653", +"b1 c #ac6445", +"b2 c #e46e43", +"b3 c #c45851", +"b4 c #e48b2b", +"b5 c #9c5430", +"b6 c #944d49", +"b7 c #c46a51", +/* pixels */ +".waB.U#5#Dba.##u#sbn#H.8#z.0#Db2.4#E.g.e#T#F#z#4bL.n#EbSbm.kauaz#Bbnbr#B.y#b#bb4.w.z#D.z#haKaZbr#Ha6bLaubn.w#Yb4.z#0#ba7an#s#Yb4b4.8.wbnaVaOb3aBbS.l.K.4bL.S#i#5#0#u.w.w#u.w.1#D#zaP#AbK.y#.#a#u", +"#b#F.Y.T#u.O#q#D#z.1b4ar.wbn.0bS#raC#..T.4.lbK#4aZ#Zbi#G#G#s.S.1bebnbr#BbA#b.1.1.w.z#Gan#5aK#tbr.1a6#1aua7bS.w#HbCa5#0#DazbK.w#8#H.8#0aVbXbibRbsbA.l.K.e.e.4#x.T#0.8.wbVbVbn#sbVbSaT#AbVbS.gag#G", +"#bbS.YbL#u.O#q#D#sa7bea5.w#G#D.8.K#ibW#1.4.8.e.SbD.p#pay#G.k.Sbcbebnbe#BbA#b.1bn.1bc#Gbe#1aHaZb4#D.Zb.aLan#0#Dbda7bS.ybCbe.y.w#8be#ubSaY.G#X#1.ybA.8#z.K.ebL.ZbL#0#u.w#GbV.w.1bnbA.u#C#z.y#.aL#G", +"#YbVaTbL#ubaatbV#zbnbe.K#zbnbn#N#z.g.UbwbO.4.S.4#R.L.UbSay.k#Jbc#abebrazbK#bbnbC#GbC#ub4#X.u.Z#HaY.eaI#Wbr.w.1#H#HbV.8b4anbS#s#H#b#GbVbe.6bw.4.ya5.y.ebS.e.e#t#t#G#u#zbVbV.w#s.w.e.u#CbKbS#.br#P", +".wbVaT.Tayba.t#u#zbnaza5ar#D.1#T#zbTaO#.bwbL.8#t#tas.Y#Gbl.K.k.1beanazbrbK.w.1.1.1bc#0be#j.C.4b4.ybO.g#Wana0aya7az.w#2az#B#z.w#HaY.wbVaNa3.s.4bA.e.8#F.8#z.ebLbD#0#u.w#GbV#b.1#s#z.s#AbAbV#jag#G", +"#0#D.ZbLbS#.as#u#z#Dbe.e.4.R#s.J#G.4a9.p#.bR.SaZaP.f#Z.w#u.K.R.1bebqbrbe#D#bbeb4#PbC#z#aaO.CbL.1bV.T.Ibr#8a0.w#Han#Y#2anan#z#0bC#s#H#DaraC.s.4.lbAbA.lblbS.e.K#i#ubV.w#s#GbQbV.wa5.CaD.ybV#.#a#G", +".1#u.ObLbS#..2a8#z##azar#T.RbQa6#u.4#.aQbNbR.S#T.UaQ#C#bblbK.kbCaV#l#fbebV#bbr.z#G.0bSaYaa.sbO#D.S.Q.U#Laz#n.w.1b4#B#2anbebS#zbC.KaV#Dbpb3bYbX.l.8bAbvblbS.e.k.g#u#G.w#GbVbVbS#s.e.C#CbKbV#X#a#G", +"#GbV.gbL#u#..2#ua5#u#Y.e.J.R#sbkbbbA.Oa.adbR.T#2#Z.f#3#bbl.KaYa0bn#L.Vbe.wbeanaz#P.0bS#aaabw.e.0aBaNaP#W#8a0#G.0#8aE#2an#HbS#0.1.S.1.1.A#U.S.Rar.4a5#FbSblbAbQ.ZblbV.w#0#DbV.ybV.8.CbE#zbVbW#a.1", +"#zaybR#m#s.A#AbX#D.1#u.wbvbV#z.M.8bA.4#E#k#Z.OaZ.hafbA#zbAbA#D#Hbnanbr#8aVb4#W#f.wbebVak#M.ObL.R.Ya2.Gbe.1aza7a7#Y.1#F#B.y.k#Db4.y#saY.P.ybX.K.4.8bS#zbS#u.8bA.SbDby#G.1#s.4.KbAbV.SatbVbl#Z#D#G", +"#Ga8bR#g#s.A#Aau#D#0bV.w#F#Ga5.M.ybA.8#v.p.L#ZaTb6afbAbVbA.KbV#8#s.m#fbr#H#H.m#f.1#bbV.k#p.ObR.y.Oa2aZ#n#baz#H#H.w#0#uaL#O.k#D#b#F.w#b#2#zbK.KaB.ybS#GbS#DbSbVbAbT.wbV#G#s.4#zbS.KbAat#z#u#obV#G", +"#zblbwae#z#v#A.y#Gbn#u.w.y#z#z.l.ybSbA.Zba#k.LbNas.UbK#0.8bKbVb4bnaL.mbrbe.canbr#H#bbA#4af.O.S.y.OaI#tbea0#b#H#b.y.w#G#b#x.KbV.w.y#s.w#F#s#zbVaBbS#ubS#GbSbSbK#z.4bQ.r.1bn.y#sbSbV.SaR#0#u.Obn.1", +"#G.8bw.C.w.AbH.ybV.w#za0bS#0.wbS.ybAbS.8#.afaQaQ.L.UbVbVbS.K#sb4#Dbranbrbebe.m#f.1a0bAbL.Y.O.T#F#.aT.4.w#b#H.w.w.8bS.w#Y#x.SbV.1bS#0#z.y#0#z.y.8#zbS#ubV#GbS#ubA#4.w.0.1#bbKbVbV.y.4b1bS#u.O#G.1", +"#bay#taX#sbk.H.y.w#G#u#bbVbV#z#z#RbAbS.ebRafaQ#d#kaP#s.wbA#zbn#H#sbeb4bebebeanb4.1#HbV#tba.YbL.y#X.U.S.wbc.1#GbV#zay#0by.y.SbV#PbS#zbS#u#z.wbl.y#GbS#u#G#GbV.ybK#z#b.0.1.wbnbV#DbA.Sb1#0bS#3#0.1", +"#bbSbB.C#sbk#CbsbV#z.yby#u#ubS#G.O.4#ubS.4bNaQaQ.pbD#G.wa5#s#s#H#abebe.zaY#bbr#8#D.1#z.Gba.U.TaB.Ob#bK.wbe#G#G#s.w#u#G#bbKbAbV#G.RbV#F#s.w.w#F#F.w#0#G#0#0aybSbSbQ.w#G#G.wbVbA#GbKbAab#0ay.n.1.w", +"#b#u.sae.1bk.H#D#z#D.8.wbS#u.y#z#Z.Z.lbSbA#.b5.fba.Z#s#GbS#z#sbe#bbrbebrbnbnan.V#D.1#z.G.nba#4bvbB.6#s.1az.0#G.w#Gay#P#GbKbK#b#G#z.waB.w.w.w#F#u#0.w.w#G#G#0bVbS.ebV#G#G.1#z.8bS#z.8b1#0bS.n#0#G", +"#s#u.Zaebn.A#Cbs#0#0#F#bbV.y#u.w.taPbvaya5.Zafas#Z#t#0#G#F.K#bbr.wbeanbrbnbK.man.1.w#s#i#S.ObuaBaI.EbQa7a0.0#G#0#D#Gaz#u.Rbnan.0bebQaB#s#sa0#F.wbS#G#G#G#G#G#zbA.ebl#G.0bV#z#F#0bK.8.tayay.H#D.r", +".1#zbT.ZbQ.yaMbK.K#0.w#0aY.SbV#ubMa3.K#Farbg#.aSbD.4#D#G#D.5#Y#b.qaV.V.m#z.e.m#fby#D#J#1.H.uaK.ZbRbIbe.1a0.w#D#D#Gbdb4b0.J.wa7ak#H#n#xb4#H#z#zbnay#G#u#G.1.1#G#u#s#Tbd#0b2#GbA.1.8#r#Ia5#sala5#D", +"#GbVbT.4bQ.8bI.Sa5bV.w#0#saB.kbVbM.6.Kbla5.J.Z#Q.sbK#G#G.1aB#Y#b#bb4.Vbr#F#z#B#8#0bdbK#j#.aP.S.g.TaZ#B#H.w#P.w#D#0.Fb4aNbv.1#DbV#Ha0.Mb4#H#za5#D#0#G#G.0.1.1.w#D#s#Ta7#0b2#D.8#H.y#r.fbA#zal#z.1", +"#GbV.Z#tbQ.S#xbLbK.w.wbV#sbYbV#G#5#6.SbA#zbv#taT.Z#z.w.1#zbX#Ybn.qb4.mb4aB#zbe#8#0bd.R#j#.bt#R.g#1aZbe.1#G.wbV#D#PbCbe.ear#D.1bX.1by.l.1.1a5a5#Dbm#G#G.1.1a0.w#G#s.la7.wa5#Dar#HbVbF#I.4a5ala5.1", +"#G#z#tbLbQbA.G#RbA.w.w#u.KaBbVbV.e#E#x.ybV.8.4.sbTa5.w#Gbn.4#Y.y#YaV.m#H#F#sbean#Gbn#s.gaDaT#R.g#t.4#b.0#G#G#G#D#0bCb4#x.e#G.1aB#G#0.8.1.1bS.B#G#G#G#G.1.1.1#G#u#z.e#H.w#z#D.8#H#z#haS.4#zal.4.1", +".1bV.4bLbQ.eaZaIau.w#0#Fa5#tbV.1bA#x#E.SbV#u#F.4bG#z#0#zbVbYakbX#YbnaL#b.ybV.1an#P#H#saqaq.u#4#j#1.S.1#u.1#0.1#G#0#Hbn#ibjbV#b#2bca5a5.1.0.l#z.0#G.1.1bcbc#b#D#u.war#8by#z#u.e#b.y.Tbz.4#za4.J#D", +"bc#z.4bZ.Q.S.9aI.R#b.w#F.K.4bV#G.R.4b#.T#u#D.y.8.8#GbcbVbK#R.qbKbebn.1#s#Dbs#Dbe.w#8aY#jaq.s.SaO.Z.S#D#7bm#G.w#u#0.zbn#xa5#G.1#2#bbSby.1#G.l#0.0.0bca0az#Ha0#G#u#0.B#8.w.K#D#r.1#FbO.x#T#zaX.J#D", +"#GbK.4bR.K.SbD.C.Sbe#0bG#zbAbV#D#DbL.v.T.y.0blarbS#G#G#D.KaH#Y#s#H.wbAbV#D#D#D#G.w.zaV#.aq.sbwax.gbA#D#7#G#u#G#u#uan##aW#NbV#D.4#bbvap#H#H.8#sa7.1.1bc#Ha0#H#0#D#0a5#8bQ#z.y.ebn.y.T.##x.KaXbkbV", +"#G#ua6#t.T.4.G#3.R#b#zbv.K.ebn.r#DbL..aI.4#7blar#G#Gay#u.KbY.N.cbnbe.ybVbn#G#b#u#b.zaYbW.H#R#tbx.Z.k.w.r#0ay.1#GaJaz.5bO#T.w#DbAbnbg#b#Hb4bVby.F.0bC.1.1.1#b#GbVaU.8#HbnbA.R#N.1#s#h.#bgbAa4#vbV", +"#G#u#tbO#t.K.9bw.lb4#G.8bla5aWa7ay.4.YaD.K#ublblay#G.1.y.K.Z#Y.iaY#T.R#Nbe#zbC.1#H#Bb..ZaPb.#3aFaPak#G.0.1#D#D#G#D#b#xbAbv#G#ubA.w.Mbn#nbVbS.1bdbcbm#P#G#Gbc.1#G#D.w#u.w.w#2bK#4bK.K#vbw.Q#tbt.K", +"#D#u.ZbR.4.ebD#tbAb4#u.8#u#z.lbn.rbAbabN#tbS#u#u.B#G#D#D.e.4#Ya7#b.4bnaW#H#zbC#GbcaL#4aTbW#4aTaS.UbQ#D#u#z#D#D#G#u#baBa5bS#G#u.K#b#F.1bebVbV#GbC#H.1#P.1.1#H#GbVbS#G#u.w#saBbA.SbAbF.gaqb..u.G.K", +"ay.y#t#t.Z.e.G#Ra5#Hblay#Db2.laVaybK#.#p.g.ybVbV#G.w#7#z.4.e#abeaY.ybn#T.1#zbC#D#G#b.S#t#x#5.Z.Y.U.kbSbl#GbA#u#G#u#b.4.e#z#G#FbAby.ybeaz#ubS.1bc.z.1#P.w.1bc#DaybV#G#F#G.w#2.S#t.R.e.g.OaI.9#x.K", +"#G.8#tbR#2.ebT#R.ebC#F#z#GbS.4#HaybA.Zajbi#tbVbV#0#G#F#saB#s.Rbe#bbAbn#Tbna5#GbCay.wbLbR.ZbL.Z.O#E.Kbl#ubVbKbSbVbl.w.4.8#0#ua#bVbQ#ube#b#u#G.1.1bf.0.w#Pa0#H.1#GbV#G#u.w#s.M.S#tbn.e#1.gbZ#R.9.K", +"#G.y#t.4#T.e#2.S#ra7#u#0#DbS#N#HbVbS#T.U#p.sbK#u#G#G.y#s.y#s.y#zaVbKbn.J.1a5bC.1#G#s.4bO.4bLbD.sbWbF.8ay#z#zbA#u#D#z.4.4#0#u.o#s.4bSbe#H#u#G.1.1.z#D#G.w#ba0.1#0#D.w#D.wbV#x.S.S#s.SbR.ObZ#5bYbO", +"#GbA#t.4.4#z#2.S#N#D#u#0.rbVarbn#GbS.4#vb5.O.Sbl#DbVa5.K#Dbn.ybVbn.Kbn.J#D#z#G.1.rbV.ZbR.Z#T#i.s.g.ebl#G#0.K#u.8#0bA.e#2.1#u.y#b#xbAbebn#D#Gbm.0beblbV.w.1bc.1#G#D.1#Ga0#s.M.S.Tbn.S.T#jbBbu.4.Z", +"#G.ya6.4.4#zaB.SaAbd#u#0bdbVarbn.w#u#F.g.pba#t#F.0#u#s.8bnb4.y.8aVbQ#Hbkbna5.1.w.1#z#tbL.4.Z.E#t.gbA#uay#sbS.K.y.w#2#z.4#0bl#D#Ybg#zbebC.0.w#G.1.1bvar#z#u.1.1#G#D.1bV#b#z#2bLbL#b.S#5#..g.k#t.Z", +"#GbAbD#t.4#0aB.yaA.y#F#0.r.w.8#DbybSbv#t#kas.s.X#D.y.Waibe#HbVa5aVbQb4bkbna5#G.1.w#s#tb.bR.4#ia2.g.y#F#u#GbKbV#ub2#c.K.4bV#7#DaYa6.kaza7#D#P.1bc#z#Tar.8#F.0.1.r#G.1#u#P#s#2bL.S#b.S#haP.U#5bY#T", +".w.4aI.sbAbSbK#ta6bsbd#za5.0bC.l.1#0bla6.Z#3aIbT#sbUaVara7.q#ebn#b#D#YaA#8#s#u.wbv.K.L#u#R.4#Z#F#T.e.8#z.e.l#sbs.w.P.e.w#G.r.r.1#T.wa7.z.1bea0.F.K#D.RbK.e#zbV#D.w.1#G#u.w#zaB.K#Y#ubOaC.gbobwaP", +"#GbYbZaPbA#u.y.g.Z.R#u#0#0.0bn.4#G#P#u#TaPba#t.G.ybQ.c.4#8#YbraYbn.R.wbp#ebn.8.1#F.K.L.rbL#t#Zbl#T.eaB#z#z.4#G#7.1#6.S.w#u#G.rbV.l.w.0be.1.wa0#8bV.R#J.K.4.8bV#G#G#G#G#G#b#saB.K.w.ybOaCaPb7.s.G", +"#G.4bB.U.SbVbAaPaW#D#Da5bSa7#H#2.w#PbSbA.ZaPbw#t.y#zbe.4br#sbq.c.w#D#s#Vao#z#u#G.l.KaS.rb..4afa5.4bS#Fa5#zbv#u#G#0#6bAbQ#u#G.w.8#z.wbd.z.1#b#H#HbS.y#HbQ#T#T#zbn#G#G.w#G.w.waB.K#s.8.T#v#.aIaPaT", +"bV.4.n#EbA#zbKaP#N#u.0ay.B#HaV.E#G.w#GbS#t.ZbZ.SbV#zbnbVbqai#WaL#b.1aYbp#e#zbS#G#F#z.L.rb..4afbS.lbS#F#u#z.8#u.1#0.M.8#z.o#0#baZa5.w#u.1#D#b#H.1bAbVaYbQ.8.J.y.w.w.w.1#0.w#s#2.SbVbA.K.gaPaIaP.Z", +".1#t#m.Y.SbVbK.g#N#u#7a5bVb4bn.6.w.w.0bS.S.saI#tbVbV#s#s#Y.daLaLbe.1bQbh#8#zbV#G.l.Kba.r.k#tbNay.l#u#F#ua5#F#u.1.w#2bAbS#F#z#Y.GbVa0#u#D#7az#b.y.ybe.1bVby.laB#b#P.1.w#G#GbVaB.S.y.e.K.g#..n.U.O", +"#z#t.naP.S.y.SaT.e#F#7aya5#HaV.6.w.1#G#G.ybD#tbk.4#JbQbn.Kbs#Bbebe#Hbnbp#8.ybSbSaJ.K.O.r#4.4#Z#u.8.8#ubS.8.lbVbn#z.e.ebSbbay#bbY#Ga0bS#D#Dbr#bbG#D#n.1#u#b.eaM#b.w#G#G#GbV#s.SbK.4.4#5aPaPbwb#.O", +".wbD#3.U.K.y.S.Z.e#7#7b2#ubnbebTbV.wbC.1#D.Z#tbT.ZbK#h.c.e#8#b#HaV.1bKbp#8.8#z#ubv#z.nbm#R.y.na8bS#FbV#zbG.ebn#D.4.KbKbV#7ay#baB#G.wbS.w#Hb4#s.4#Daz.1#D#nbV.M#H.w#G.w#G.w.wbK.e.lbA.KaPaPbwaf.O", +"#baZ#3#..KbS.S.O.ebs#D#0a8#7be.T#u.1bcbcbn.Z.S.TbLbY.TbrbUanbV#H#H#H.Rbp#8bA#zbSbl.K#mbm.4.ea2bl.ebG.wa5bg.S#s.y.G.k.KbVbm.0.w.Sbc.w.B#Bb4#H.y.e.1an#H.1a0bV.5aY.w.wa0.w.w#sbA.SbA.ebu.Z.O#m.Y.H", +".k#t#X.UbQ#4#tba.B#u#ubV.ya5a0.X.T#H#P#Ga7.y.n.u.sb..K#s#Hbe.i.k#D#YbT.e#0bl.waibA#RbQ#z#RbK.3.y#F#r.y#DaA#u.z#x#v#K#z.w#F#Y.g.R.w#HbCazbCbea#bnbean#H#0a0#G.y.1#G#PbV#b.X.1bV#t.y.KbL#R.9#5.s.9", +"bnbR#.bW.K.S.ZbabS#u#D#Gbl#z.w.XbO.1bcaUbC#J#1aH.s#R.k#ubean.RbK.1#s.G#z#0#F#saB.8.C#za5aHbAay.y.8#rbS#ubvbAb4bXbhaBbV#z#7.wbkaV#b.w#D.zbcbe.X#sbean#b#G#b#G.ybVbm.w#Daz#D.wbV.4.y#z.4#RaPaI.saP", +"bK.4aqbi.KbY.ZaPa5#u#GbVa8#z.w#ubOa7#P#Pb4aY.T#O#R.ZbQ#2#YanbVbKbe#zaMbQ#0.o#D.S.l.j.Kbv.ubV.B.R#F#rbS#u#TbAb4bAbR.X.y#z#ua5bg#a#b#H.0#H.1be.y#sbebe.1#G.w#G.ybVbm#G#D#Ya0.wbV#t.ybQ.4#t.ga2.Z.Z", +"bn#t.HbW.K.S.4.Z.e.ybV#D#u.w.1#D.ZbC#P.w.z#abFaB#4#tb0.Man#YbnbKbebV#2.w.w.o#ubX.8#R#z.l.u.K.BbK.l.e#u.8.l.R#sbAbObs#ubS#DbS#Tbe.wbV#D.w.w.1.y#b#Haz.1#G.w.w#u.ybm.1bVaza0#b#s#tbA#s#t#t.s#5.saP", +"#s.4bHbN#5.ybA.ZarbA#G#u#0.w.1.1.Zbn#G#0az#Y#z#D#sbAaE#xazbe.1#s.wbV.4.w#G#ubVaBa5aubQa5.ubAay#J.8#F.8.8#FbKbObY#rbnbV.J#D#zarbnbV#D#G#P#b#ubVaYbe#bbc#G.w.wbV#uay.w.w.1#G.w.wbD#T.K.4#t.O#5aPaP", +"#D#t#.bNbL.ybK.ZbO.S.w#u#Ga0a7.1a6#H.w#Gb4bebQ.1.w.w#Y.ybe#H#b#b#G#zbV#s#G#G.1#2#zau#0a5.jbA.B.Kar.y.8.8#D.K.gbtar.1bVbGbnbS#z.1#D#u.w.w#b#Fbn#saz#b.1#G.w.w.w.y#u#P#b.0.1.1#YaP.M.K.Z.Z.ZaI#EaP", +"bV#t.Ha9bLaB#z.4a6.4#b#D#Ga0#ub4bD#H.wbSao#bby.z#HbebV#Daz#Hb4#b.w#ubV.1.r#G.w.4#zbY.ea5a1bA.8bKarbsa5.8a7.K#V.Z#N.1bVbG#b.8a5#8.1#G.w.w#n.5.waYazbc#P.1#P.w#P#F#G.waz#Dbc#Gbeb#bGbU#t.saPb7.gbZ", +"bVbL#m#..SaBbV.l#EbLbe#G#G#b#7be#i#H#PbS.1.w.waz.1#n.X#ban#8b4#Ha0.ybK.way.r.wbKbSbt#2a5aK.Ka8bKarbd#z#ra7#s#X#R.l#7bV.lbe.Ma5azbe.1.1.w#n.X#baVaz#H.1#P#0#P.w#F.w#0.w.0az#GbQb#.4bQbL.Z.Z#5bwbo", +".K.K.T.gbO.4#s#Fbiapbca0.0be.1.1a6by#G#G#bb4be.zaY.R.y.1az#b#s#b.za5.8#H#2.1#Dbv.K.6bQ.K#F.Kbn.SblbV.k.4bQ.4.MbX#4#Har#D#s.4###bby.1anbebe#Fbe#baz.w.w.1bV.w.wbvaz#D#G#G#G#s.K.UbO.y.e#O#C.D.U.i", +"#t#tbRbW#R#tbV#2#E#b.1a0#Daz#s#GbTbybc#G.1#bbr#f.q#D.y#baz#H#DbV.za5#F#b.Jbna7ar#4#6.K.4.SbV.y#FbS#z.KbYbybAaBbKbLbn.8#G#s.Z##.w.w.1azbe.1.ybe.waza0#b.1bV#b.w.o#b#D#G#G#G#zbA#EbO.R#r#OaDbB.U.k", +"#ibwaI.Z.T#t.K#2bD.W#Gbc#G#b#H#GbDby.way.1#ban.zbe.y.y#b#n.w.y#D#Har#u.1#2bnbd.ebOa6.K#x.4bA.4.ya5bV.KaZbQa5.y#s.Sa7arbV#s#x.5.wbV#bb4an#u#saY#sbe.1#bbe.1#n#b.M.wbV#G#GbSbV.e.9.4.y.K.5#AbB.U#J", +"aPaIa2.s#5#t.K#ObDbQ#G.1.w#b.1#GbD#z.w.rbVbebr.zbQ.y.y#b#nbV#ubVaV.l#z#G#2#D#DbF.4bL.Kbg.Ka5.4.8#0.ybK.G#z#zaB.k.4#Da8.1bnbk.b#bbV.wbebr.y#Y#s#JbV#sazaz.1#b.1#2.w.w#G#G#GbV.K.S.S.y.KaHam#3aO.k", +".Z#5.Dbwb.#t.K.Sa6#z.1bcbe#b.w.0#i#z.w#Daybeazb4#s.8bV#n.w#GbV.w#H#T.w#D.l#Dbs.T#T#z#z#x#z#z.4.8bSaB.K.G.e#zaB.R.4#Dar.w.wa6.R#b#z.1bebeaB.NbA.S.SbVbebe#G.1.1#2#G.w#0bVbVbVbV.ebLaB.e#KambwbW#J", +"bWaIaIaP#5.S#s.e#t#s.w#G#Bbn#H#GaP.8.w#GbVbe#b.z#s#D.wa0.1#G.1beaY.Jby#7a5bV.5#1aBak#sbgbQ#z.8bA.BaBbQaZ#z#z#2.S.4#Da8.1#z#Ta7a0#s.1bebnbXaNbRaZ.4.S.w.1#G.1.w#2a5#0.Bbl#ubS.ybVbO#O.ebYambwbWbK", +".gbL.T.G.K.S.KbA.4#z#P#D#Y#Da0bc.s.4#P.w#Gbe.1a0#sbn#ba0.1.0#b.wbn#vby#7#z#z.5#jaB#b#z.M#z#z.8#FbS#2aYaZ.e#zaZ.R.4#Da5#GbVbO.1by.w#Dbr.R.S.QbZbD#1.S#z#G#u.w.waBbl#0bS.8bVbVblbSaq#x.T.Sam.CbWbn", +".ZbF#4.9.k.SbV.8.4#z.w#ube.y#bbc#t.4.w#P.w#b.w.zbn#D.1a0.1.1#H.1aVawby#F.w.w#O.g#Fak#DaMbV.ybA.l#u#2akaZbA#z#2bAbL.0ar#GbVbObn.w#Y#D#BbX.k.Qa2.sbM#tbA#u#G#nbybG#u#0a5bl#0bV.y#G#.bT#r#4#X.OaPbn", +".saIbwaPb..e.K.S.e.8#b#D#P.1#G.1.KaMb0#Da0bman#Jar#Y#8a0.w.w.1bC.ea7#GbS#b#T.Qahb4#D.y#2bS#zbl.ybV#Mbu#tbl#w.yblay#0.R#Hbk#D#H.1#bbV.V.4b4.TaubRbZ#t#t#z.1.1#b.9ar.w#ubv#zbdbs.K.O#t.KbD#3#ob##b", +".saIbR#E#5.4.y#2bA.4.way.w#G.w.1#s#x.q.y.w.0#nbn.l.w.1.1.wbV.1bCbL#H#G.8.1#x.Q#O#b#D#F.8bS#z.y.y#uav.K.Sbl#m.y#F#D#zbV#8bp.RaV#Hbeak.cbQ.c.T.S#tbR.s#tbK#G.1.w#OaW#b#ua8#0#ubs.K.Y.4#z.G#Zabb##s", +".gbwbw.UbL.4.SaB.S.8by#D.w#G.w.w.waZbQ.8#G#ube#J.l.waz.0.1#u#bbna6b4#z.l#u.M.K##az#D#FbVbSbS.y.8#uaS.SbLay#3.R.o#ubV#z#8bpbn#HazaYaL#Db0b4bu.R.S.Z.Z.Z.K#G.1#baB#i#b#D.8#0bdbs#rafbL.K#x.Oab.EbV", +"aPbDbw#EbZ.SbA.ybA#2#s#G.w#G.w.1by#2.K.4#z#G.wbK#ubnaz.X#P#Fbe#Da6bebV.l#GbG#Nbn#b.y#F#s.y.8bK.8bl#Z.4bF.0ba.K.oaybVbV#8bp#s#Hbe#JaL#OaLaY.w#s#z.Z.s.Z.4#u#G.w.y#iaV.1.Ba5.r#D.l#pbL#zaZaP.n#tbV", +"aP.UbZ#EbZ.K.K#z.e#2.wbV.1#G.1.wa0.8#r.4#0.w#z.y.1.waz#7a0#7#Y#2a6#b#u.8bnbl.Jbn#P#u#F.wbSaBbS.4#u.O.4b.ay.pbQ#F.1#ubAaobh#bbnbe#saLai#BbA#s#z#u.Zbw.ZbObS#G#b#D#iaV.1#z#0#D#u#y#pbL#saZaPaI.K#G", +".Z#Eb.aPbR.KbKbK.KbG.w#G#0#u.w.1#P.y.S.e#z.w.ybA#H.wa0#u#b#D#bbgbO.1#Fa5bna5bg#D#z#u#F#s#D#2.e.4bl.O.4#5.r.p.Kbv#H#F.ya7bhbe#D.1#Ybq.SaY#Tbn.ybs#taI.g.Z.8#D.w.1a6bnbn.B#0#D#D#T.I.4bV#2aP.C.K#G", +"bw.UboaP.ZbL.ybS.K.M#s.w#G#G#G#D.1#G.S.e.K#0#FbKbCaza0.1.1.1#s#ia5.0#F#s#Da5aw#bbl#0.obVbV.M.e.4bl.O.SbOaJ.LbQ.ya0#F#D#8bhbe#D#sbe#B#sa7.4.1.e#F#taI#.#j.l#u.1.1.4.1.0a5b2#D#u.Z.UbLbS.SaP#t#z.r", +".Zbib..U.g.S.S.y#zbT.w#s#G#u#G#GbmbV.S.e.ybVaB#s.Fa0.wa0.0b4#z#ib2.0.oby#D.eaxaY.o#0aB#ubV#2.8.4blaP.e.Z.o.Lbubl.wbl#s#8bhbe.y#b.1.V.W.b#rbe#z.RbYaI#.#v#Tbl.1.1.e#G#7#0#0#D.R.Z.U.S#zbV.s#R#s.r", +"a6#E#4.YaP#h.4#ubL.4#z.w#G.1.0#D#G#G#G#u.8bG.8#zbC.1a0#zbV#b#z.J.w#GbbbVbAaB#O.1#F.w.8bSay.o#FaP#5a6.4#tbR.Z#zbV.1bdbS#DaAbVbQ#e#BaBaEbA.4#sbs#Dbl#tb1#A.Zbl#u.wbV.y#zay.0.1.y#2aT.4bVbVaZ.9#say", +".ZbDb.#3#.bF.y#D.T.S#z.w.1.1#G.0#0bc.1.1bVbA.y#b.1.1.w#D#Gbe#z.l#b#u#u#GbA.S.y#D#D#s.y#zay#F.KbtbZ#i.8.Z.saZbA#u.wbCa5#DaA.RbQbn#B.X#Y.4.KbV#u#D.o#tba#k.g#2#u#sbn.y#0#G.rbC#DaB.Z.S#u#sbY#t#s.r", +".ZbDbubBaP.TbA.1.KbA.K.w#P#b.1.0#0.wb4#P.wbVbnazbC#H#0#u.1be#DbA.wblay#0.4.S#z#D#0bV.8.1ay#u#saP.g#i.4.Z#tbDbK#7.1bCa5bnaW.R#zbn#BaB#Y#x.KbVbn.0#u.4#.a9#i.4#u.1bQ#FbS#G.0.1#D.S.O.4#u.w#tbYbQ.0", +".8.ZaKaIbNbRbK.wbL.SbA.w.w.1#0#D.B.1#P.1.1bV#H.z.1#b#G#F.1be#7#s#zbv#0.w.4bT#sbS#G#u.y#zblbl#saPaP.Z.e#tbR#t#s#G.w.1bV.1aW.y.Kbnbr.y#YaM#s.y.1#GbSbA.Z.YbW.4bV.w#b#FbS#z.0.1bV.y.O#TbVbV#t#t#s#G", +"#rbT#RbwbN.g.K.1#t.4.4.w.way.w#GbS#G#Hbc.1.1ao.z.1#PbV#uazazbs#bbU#c#0#0.8.6#z#u#G#F#u#Gbb#F.k#E#.bRbF.Z#t#R#b.1#GbC#zbn#N.R.eaV#sbKaYaZ#s.y.1#G#G.l.ZbW.U.gbA#G.w#2bS#G#u.1bVbSaq.Zbl#z#tbY#s.0", +"#z#x.s.CbNaP.Kbn#T.S#F#z#0bl#0bVay.w.1.1.1.1bc.z.1.w#z#u#bb4#u#b#s#c.w#zbA.a#z#D#G#FbV#Gbl#u.K.YbaaI.K#i.s.Sbe.z#s#GbSbC#r#D.KaV.RbQ.k.y#s.y.1#Gaybl.l.ZbN.ZbK#G.w.oa5#z#u.1#s#u.Oa6#FbSbY.Zbn#G", +"#rbT.9b..ObW.KbVbL.K#T.w#0#F#0ayb2.1bc.1bc.wbcao.1#G#zbV.w.1.ybQ#s#2.w#F#z#2#b#7aUbl#0.1#u#GbLaPbN.Hb.aC.saK#Y.z#0.1bV.1#r#D.eaYbAaLaBbK#Dbn#G#G#0#ubSbLa9#Z#z#G#Gbv#z#z#F#D#0.8.H.Z.8bA#tbY#s.1", +"a5#x#t#w.HaP.Kbn.K.K#2.w.wa8.wbS#0.w.1.1.1#Pbcbc.1bV#0bV#sbV.lbQ#z#u.wa##zbK#B#7#0#u#D#G#G.wbObN.p.n#h.E#taKbe.z.w.1bSbCbFbV.ebn.KaL#x.k.y#b#D.0#ubl#u.4#pbN.S.rbV#F#z#z.o.1.w#F.H.J.la5bY.s#sbc", +"#Dab#3.ybw#Z.K#zbnararaB#bbGbS#G.1bc.1.0bc.1.1.0ay.w#F#n#sbeai#JbA#D#b.4.e.1.z.o.B.w#u.1#DbQbLaPb#.Z.g.ZbDaka0.w#GbV#G#bbsbea7bnbK.q#4bA#G#G.0#Dar.3.y.R.U#9.Tbd#uay#r#z.MbVbe#Kb1bD#2.e#t#tbn.r", +".raR.ObSbw#Z.KbK.1ar.ebsaY#T.e.1#GbCbc#Hbc#H.1.1bV#0#F#nbVbe.5bV.lbd#b#N.8bnaz#u#u#0.r.1#ubK#t.Z#EaIbR#1aZapbe.1.1#u#D.w.ybebnb4bn.q.S.4ay#G#D.Rbla5#u.RaP#9.Tbd.r#z.ebU.M#Gbeaub1.g.4.K#t#t#s.0", +".raR.Oa5bwba.e.y.1ar.e.y#s.8bS.1#u#Ga0a0#Ha0.1#GbVbV#F#bbV.w#FbVbv#D#sbO#T.1az#0#u#G#G.1#ubK.Z.s#EaI#t.ga6#Y#b#G.1#DbV#DbK#BaVbeaVaY.S.4bV#G#D.y.la5#u.i.9aabOa7.r#G.e#z.M#0#b.y#Z.Z.8bQbL#t.w.0", +".r#o.ObVbwaS.K.S.1.ebA#D.w.e.e#D#G#G.1#Ha0bc.1.0.w#u#F#P#u#z#ubS#T.1bnar.Jbn.1.w#u#G.0.1#Dbn.9bw#E.Taq.gbT#bbn#uan#G#b#Dbnbqa7be.w#a.4#F.w#G.RaBaB.ebSbn.S#X.Zbd#GbV.4#z#F#0#b.S#Z.gbAbQbZ#R#sbc", +"#GabbwbS#3.p#4bK.wa5.e#Dbnby.lbnbV.1#Pbc.1.1#G#G#s#u#FbybV#u#0#G#T.w#D#r#x.1#Gby#G.1#G.1.1bQ.Gbw.Z#5.Za6.Zak.w#D#B#H#b.y#baLbn#a#b#baB.8.w#0bAbD#t.4bS#D.y.g#vbn#GbV.4#z#u#GbQ.y.L.ZbAbU.S.s.w.0", +"bcat.sbV.O#k.K#4#H.ebAbC.0.W.4#Day#G.w.1.0#D#G#u.w#u#u#bbV#F.w#u.l#H.X#r.lbebCa0#G#G#G.1.1#Y.G.C.gaIbW#i.g#s#D.0azbe.1.5#YbeaYbe.w.wbX.y.wbn.4bD.ubh#N#ubV.Zbgbn#G#z#2bQbV.w.w.y#Z.g.l#sbRbY#s.0", +"bm.Obw#z.Ob5#4.SbebSbA.1#Db0.Jbn.8#G.w.1#Gay#G#G#s#u#u#Y.1aBbe.R.ybe.5#z.Kan.0a0#0.1#Gbc#baLbI.C.gbR#EbWbT#z.y#Gb4anbnbsaLbn#a#a#H#b.ybA.w#zbOaPaT#V.l#FbVbOa3#s#0.e#2by#G.1bn.Rat.Z.4#z#t.s#s.0", +"bm#Z.s.w.Ob5bL#tb4.ebSbC#7bPbGbV.8ay.w.w#G#D#0#G#0#ubV#n#saibe.R#0an.b#z#z#lbd#0.1#Gbc.1#H#Y.EbZaIb..gbR.Sak#G#nb4.m#b.ybq.RaLbea0#b.y.y.wbS.4.g.O#XaA#F#DaraxbQa5.ebTbQ.1a0#G.y#3.Zbv.K#t#tbn.r", +"#G.sbw#z#2bNa2bSbV.8bQbVay#G.y.SblbS#Gay#G#0#G#ubybvbe#b#z.4.q.S#8#b#za8#Daz#7.w.w.r.1.1#H#s.GbBaBb.aP.CbAbn.1b4ananan###Bbn.mbnb4#b.ybv#GbnaP#ZadbN#jbSay.MbD.n.1#z.4#z#bbCbV#zbwaPa6#5bZbD.y.1", +".1#tbw#z.4a9#5bV#z.8.w#G.r#G#ubAbSbS#z#0#G.1#0bS#z.o#bbn.y#2akaB.1.w#0.y#0az#Dbn.w#G#G.1#baY.9.C#2bL.Y.s.S#DbC#Hazbeana7brbn#Wbnan#b.K#u.w#bbDb1#k#k.g.Saybv#xbw.w#z.4bK#P#G#G#z.s.g.g.KbR.ZbV.1", +".w.Sbw#z.8#..D#u#z.y#s#0bmbm#D.Ka5bS#G.w#GbS#G#0a5#F.1#DaB.4bQ#2#D.w#zbS.wbe#u#0.wbV#G.1#b.KaP.Z.ZaIbN#..S#u.1.1b4anbe#Hbebebrbnbe.w#z#u.wbn#E.LaG#ka9.4#zblaZ.sbV#z.4#z.w.0#D#s.H#i#x#5bZ.Z#s.1", +".wbLbw.K.8.O#5.8#GbS.w.1.r#G.wbVbS.8bV#0#G#ubVbV#u.yaY#D#2.ebQ#2.1bVa5.8.w.1bSbS.w#G#G#G#GbA.g#.bLbRba.O.K#D.1.1b4anb4brbebrbrbn#Hbn.KbS.w#Db#.fb6aG#kaq#za5.8.Z#zbV.S#s.way#GbnbBaP.g.TbR#t#s.1", +"bcaI#t.K.8.Oa2.8.w#z#z#0#Gbm.wbKa5blbVbV#G#u#ua5.y#D.wbVbGbQ#baB.wbSbA.4#b.RbVbA#0bV#G.wbVbY.Z.O.TbR#.aPbQ.ya0#b.z#Bb4anbe#B#Y.ibe#sbV#s#b.Rafb6#k#kadaP.e#zbA.4bS#s.R#s.wbS#D.1b7#i#x#4bR.9bV#G", +".w#4bw.e.8.OaI#u#z#z#z#G#G#G.w.4#za5bS#GbVbVbVbS.4bKbV.K.MbQaY#FazbVbAaB.q#F#GbS#G.1#Haz#saBbZ.H.e.gbabN.q#7#b.zan.manbebrbrbrbn.1#D#zbV.1.R.I.ha9.L#kbN.4#zbA.8ar#s.Rbn#0.B#GbnaI#E#i#5.s.Z#s#D", +"#GaKbR.e.yaqaI.8#z#sbK#0#G#G#saZa5bAbSbVbV#zbV#u.l#z.ybV#x.w#bbdazbV.K.Sbr.5.w#z.1bcbcaz#baBbZ.O.ebWbabi.qbs.zb4ananan.1#Bbe#Wbn.1.y.y#DbnaB#M.h.g.Oa9bibTbAbA.8.J#sbn.Raya5bVa7aI#E#i.KbR#t#s.0", +"#Gb.bBa5bA.Oa2#u.K.K.4#z#G#GbQbDbA.8bS.y#ubVbVaB#r.KbA#zbg#Y#b#Ha0bV#sbKaLa#be#0.1#H.1#B.1bY#taP.KaPaP.U#Y#7.z.zananan.ibqaV.mbn#b#DbV#z.1bXafac.ZaI#..I#i.lbA.8.J#s.i.ya5a5#DbdaIaC#ib.bR.4bQ#D", +"#Gb..ZbAbAbaaIbV#zbA.ybKbV#sbV#Far#z#Dblblar.8aB.y#zbR.KbG.w.1.z.wbV#T.can.Sbr#8b4.w#nb4#L#.bJ#R#z.g#3a9bq#F.z#H#f.mbe#sbe#D#L##bC#s.ybl#P#3.2.I#tbL.g#..paP.e.obTbQ#s#2.ybV.y#FbA.O.L.4.4bB#a.0", +"#Gb..ga5.eaPbB.ya5bl.8bS#0bn#s#u.Z#zbV#Fa8.8bA.y.8#4bR#1.8#G.1.1#PbVaAb4br.e.V#8an.waz#8#WbiaIbX.k#v.uajaL#Fbc.1#fbeanbnaLa7#La7#8#sbK.r.w.O.x.Y#t.e.gbWadbN#4bl#xbQ.K#2#ubVbV#D.lba.LbZaBbwak.0", +"#G.KaP.e#z.ObZ.y#za5bSbS#z.w#0bV.g.K#s#ua8.lbl.y#F.4.Z#i#z#G.0.w.w#DbOan.V.ebeanbr.w#bbCaLbi#..Sby.g.saObe#u#H.1#8be#B#Dbebr#L#8bc#sbKay.w.Y.LaT.4.K#taP#pbibA#u#2#s#zaB.ybV#sbV.4bababLaB.s.7.0", +"#Gbu.ga5#s.Obw.yby#0bSbS#0#zaybSbabZ.K#zbl.8bA#u.8.Saq.6#YbV#Ga0be.1bOanbrbU#8.zaza0.w#H#WaP#EbK#b.Z#R#XaV#0.z.1#b.1#B.R#Yan.m#8#H#JbK#G#0af.L.u.4.ebO.gbN.U#t#z.ybQbV.8.y.wbVbVaBba#Z.T.4.s.kbc", +"a0.7aP.e#z#Zbw#u#0#0#0#u#G#G#uaya9bR#4bVbSa5bS#F.K.T.Z.6b0ay#D#bbebV#T.m#8bU#D.1#8#0.1bebqaIbW#J#b#x#R#v#D#0bC#H#HbV#Bbs#B.mbe#ea0bK.K#G#0.I#Z#t#tbA.ebO#..Ua6bV#F.w#sbVbV#z#sbVbA.O#Z.ebYaT.7bc", +"#P.Q.ga5#sba.sbAbV.wbS#u#z#GbVbVbaaT.SbKa5a5bS#F.ebL#EbD#b#u#u#Y#H.1#Tbebd.W#7bd.1bS#0beaL.T#Ebn#Y.g.S#y#u#0aobe.w.1azbs#Bbrb4a7a0au.K#Pay.I.O.Z.4.y.ebLbR#..P#z.8bV#0bVbn.w#s#sbAbH#ZbL.4.9.kbc", +".1buaPa5#z.Y.O#ubV#sbVbV.1#z#D.wba.Z.4bA.8.e.KbA.4#t.UbL#s#zbbbe#b#b#ran.b.W#7.1#8#G#0#HbKb7.gaV#BbT.K#r#Dby#H.m.1.1be#u#B.1.wbe#P.S#z.wbSbi.n.ZbK.4.e.8aI.Z.6.K#u#GbV#0bV#s.w.w.e#Z#Z.K.4aT.k.1", +".rb..g.e#s.YaPbV#z.wbnbV.wbn#Dbn.OaP.4.y.4#N.K.K#T#t.U.Q#z.w#F#YazanaNan.bap#Ga0az#0#P#b#KbR.Z#aaz#ibK#h#u.wbC#B#b.1bebs#B#D#baLbcbA.k#P#G#E#S#2.K.8bAbL.Tbw.6.K#G#0.wbVbVbV#s#s.e.Oba.K.4aT.k.0" +}; + +static void drawroundrect( TQPainter *p, TQCOORD x, TQCOORD y, + TQCOORD w, TQCOORD h, TQCOORD d ); + +static inline int buttonthickness( int d ); + +static TQRegion roundRectRegion( const TQRect& g, int r ); + +static void get_combo_parameters( const TQRect &r, + int &ew, int &awh, int &ax, + int &ay, int &sh, int &dh, + int &sy ); + +static int get_combo_extra_width( int h, int *return_awh = 0 ); + +enum { PointUp, PointDown, PointLeft, PointRight }; + + +NorwegianWoodStyle::NorwegianWoodStyle() : TQWindowsStyle() +{ +} + +/*! + Reimplementation from TQStyle + */ +void NorwegianWoodStyle::polish( TQApplication *app) +{ + + oldPalette = app->palette(); + + // we simply create a nice TQColorGroup with a couple of fancy wood + // pixmaps here and apply to it all widgets + + TQImage img(button_xpm); + TQImage orig = img; + orig.detach(); + TQPixmap button; + button.convertFromImage(img); + + + int i; + for (i=0; i<img.numColors(); i++) { + TQRgb rgb = img.color(i); + TQColor c(rgb); + rgb = c.dark(120).rgb(); + img.setColor(i,rgb); + } + TQPixmap mid; + mid.convertFromImage(img); + + img = orig; + img.detach(); + for (i=0; i<img.numColors(); i++) { + TQRgb rgb = img.color(i); + TQColor c(rgb); + rgb = c.light().rgb(); + img.setColor(i,rgb); + } + TQPixmap light; + light.convertFromImage(img); + + img = orig; + img.detach(); + for (i=0; i<img.numColors(); i++) { + TQRgb rgb = img.color(i); + TQColor c(rgb); + rgb = c.dark(180).rgb(); + img.setColor(i,rgb); + } + TQPixmap dark; + dark.convertFromImage(img); + + + TQImage bgimage(polish_xpm); + TQPixmap background; + background.convertFromImage(bgimage); + + img = bgimage; + img.detach(); + for (i=0; i<img.numColors(); i++) { + TQRgb rgb = img.color(i); + TQColor c(rgb); + rgb = c.dark(180).rgb(); + img.setColor(i,rgb); + } + sunkenDark = new TQPixmap; + sunkenDark->convertFromImage(img); + + + img = bgimage; + img.detach(); + for (i=0; i<img.numColors(); i++) { + TQRgb rgb = img.color(i); + TQColor c(rgb); + rgb = c.light(130).rgb(); + img.setColor(i,rgb); + } + sunkenLight= new TQPixmap; + sunkenLight->convertFromImage(img); + + + + TQPalette op(TQColor(212,140,95)); + // TQPalette op(white); + TQColorGroup active (op.active().foreground(), + TQBrush(op.active().button(),button), + TQBrush(op.active().light(), light), + TQBrush(op.active().dark(), dark), + TQBrush(op.active().mid(), mid), + op.active().text(), + TQt::white, + TQColor(236,182,120), + TQBrush(op.active().background(), background) + ); + TQColorGroup disabled (op.disabled().foreground(), + TQBrush(op.disabled().button(),button), + TQBrush(op.disabled().light(), light), + op.disabled().dark(), + TQBrush(op.disabled().mid(), mid), + op.disabled().text(), + TQt::white, + TQColor(236,182,120), + TQBrush(op.disabled().background(), background) + ); + + app->setPalette(TQPalette(active, disabled, active), TRUE ); + +} + +void NorwegianWoodStyle::unPolish( TQApplication *app) +{ + app->setPalette(oldPalette, TRUE); +} + +/*! + Reimplementation from TQStyle + */ +void NorwegianWoodStyle::polish( TQWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if ( !w->isTopLevel() ) { + if ( w->inherits("TQPushButton") + || w->inherits("TQToolButton") + || w->inherits("TQComboBox") ) { + w->setAutoMask( TRUE ); + return; + } + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( TQWidget::WindowOrigin ); + } +} + +void NorwegianWoodStyle::unPolish( TQWidget* w) +{ + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + if ( !w->isTopLevel() ) { + if ( w->inherits("TQPushButton") + || w->inherits("TQToolButton") + || w->inherits("TQComboBox") ) { + w->setAutoMask( FALSE ); + return; + } + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( TQWidget::WidgetOrigin ); + } +} + +void NorwegianWoodStyle::drawPrimitive( PrimitiveElement pe, + TQPainter *p, + const TQRect &r, + const TQColorGroup &cg, + SFlags flags, const TQStyleOption& opt ) const +{ + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + switch ( pe ) { + case PE_ButtonCommand: + { + int d = TQMIN( w, h ) / 2; + int b = buttonthickness( d ); + + TQRegion internR = roundRectRegion( TQRect(x + b, y + b, + w - 2 * b, + h - 2 * b), d - b ); + TQPen oldPen = p->pen(); + + TQBrush brush( flags & Style_Sunken ? cg.brush(TQColorGroup::Mid) : + cg.brush(TQColorGroup::Button) ); + p->setClipRegion( internR ); + p->fillRect( r, brush ); + + int e = TQMIN( w, h ) / 2; + TQPoint p2( x + w - 1 - e, y + e ); + TQPoint p3( x + e, y + h - 1 - e ); + + TQPointArray a; + a.setPoints( 5, x,y, x+w-1, y, p2.x(), p2.y(), p3.x(), p3.y(), + x, y + h - 1 ); + p->setClipRegion( TQRegion(a) - internR ); + + p->fillRect( r, (flags & Style_Sunken ? TQBrush( cg.dark(), *sunkenDark) + : cg.brush(TQColorGroup::Light)) ); + + // A little inversion is needed the buttons + // ( but not flat) + if ( flags & Style_Raised || flags & Style_Sunken ) { + a.setPoint( 0, x + w - 1, y + w - 1 ); + p->setClipRegion( TQRegion( a ) - internR ); + + p->fillRect( r, (flags & Style_Sunken ? TQBrush( cg.light(), *sunkenLight) : cg.brush( TQColorGroup::Dark ) ) ); + } + p->setClipRegion( internR ); + p->setClipping( FALSE ); + p->setPen( cg.foreground() ); + drawroundrect( p, x, y, w, h, d ); + p->setPen( oldPen ); + break; + } + case PE_ScrollBarAddLine: + if ( flags & Style_Horizontal ) + drawSemicircleButton( p, r, PointRight, flags & Style_Down, cg ); + else + drawSemicircleButton( p, r, PointDown, flags & Style_Down, cg ); + break; + case PE_ScrollBarSubLine: + if ( flags & Style_Horizontal ) + drawSemicircleButton( p, r, PointLeft, flags & Style_Down, cg ); + else + drawSemicircleButton( p, r, PointUp, flags & Style_Down, cg ); + break; + default: + TQWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt ); + break; + } +} + +void NorwegianWoodStyle::drawControl( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how, const TQStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + const TQPushButton *btn; + btn = ( const TQPushButton * )widget; + TQColorGroup myCg( cg ); + SFlags flags = Style_Default; + if ( btn->isOn() ) + flags |= Style_On; + if ( btn->isDown() ) + flags |= Style_Down; + if ( btn->isOn() || btn->isDown() ) + flags |= Style_Sunken; + if ( btn->isDefault() ) + flags |= Style_Default; + if ( ! btn->isFlat() && !(flags & Style_Down) ) + flags |= Style_Raised; + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + + p->setPen( cg.foreground() ); + p->setBrush( TQBrush( cg.button(), NoBrush ) ); + + TQBrush fill; + if ( btn->isDown() ) + fill = cg.brush( TQColorGroup::Mid ); + else if ( btn->isOn() ) + fill = TQBrush( cg.mid(), Dense4Pattern ); + else + fill = cg.brush( TQColorGroup::Button ); + myCg.setBrush( TQColorGroup::Mid, fill ); + + if ( btn->isDefault() ) { + x1 += 2; + y1 += 2; + x2 -= 2; + y2 -= 2; + } + + drawPrimitive( PE_ButtonCommand, p, + TQRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1), + myCg, flags, opt ); + + if ( btn->isDefault() ) { + TQPen pen( TQt::black, 4 ); + pen.setCapStyle( TQt::RoundCap ); + pen.setJoinStyle( TQt::RoundJoin ); + p->setPen( pen ); + drawroundrect( p, x1 - 1, y1 - 1, x2 - x1 + 3, y2 - y1 + 3, 8 ); + } + + if ( btn->isMenuButton() ) { + int dx = ( y1 - y2 - 4 ) / 3; + + // reset the flags + flags = Style_Default; + if ( btn->isEnabled() ) + flags |= Style_Enabled; + drawPrimitive( PE_ArrowDown, p, + TQRect( x2 - dx, dx, y1, y2 - y1), + myCg, flags, opt ); + } + + if ( p->brush().style() != NoBrush ) + p->setBrush( NoBrush ); + break; + } + case CE_PushButtonLabel: + { + const TQPushButton *btn; + btn = (const TQPushButton*)widget; + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + int dx = 0; + int dy = 0; + if ( btn->isMenuButton() ) + dx = ( y2 - y1 ) / 3; + if ( dx || dy ) + p->translate( dx, dy ); + + x += 2; + y += 2; + w -= 4; + h -= 4; + drawItem( p, TQRect( x, y, w, h ), + AlignCenter | ShowPrefix, + cg, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, + (btn->isDown() || btn->isOn()) ? &cg.brightText() + : &cg.buttonText() ); + if ( dx || dy ) + p->translate( -dx, -dy ); + break; + } + default: + TQWindowsStyle::drawControl( element, p, widget, r, cg, how, opt ); + break; + } +} + +void NorwegianWoodStyle::drawControlMask( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + int d = TQMIN( r.width(), r.height() ) / 2; + p->setPen( color1 ); + p->setBrush( color1 ); + drawroundrect( p, r.x(), r.y(), r.width(), r.height(), d ); + break; + } + default: + TQWindowsStyle::drawControlMask( element, p, widget, r, opt ); + break; + } +} + +void NorwegianWoodStyle::drawComplexControl( ComplexControl cc, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how, + SCFlags sub, + SCFlags subActive, + const TQStyleOption& opt ) const +{ + switch( cc ) { + case CC_ComboBox: + { + const TQComboBox *cmb; + cmb = (const TQComboBox*)widget; + + int awh, ax, ay, sh, sy, dh, ew; + get_combo_parameters( subRect(SR_PushButtonContents, widget), + ew, awh, ax, ay, sh, dh, sy ); + drawPrimitive( PE_ButtonCommand, p, r, cg, Style_Raised, opt ); + TQStyle *mstyle = TQStyleFactory::create( "Motif" ); + if ( mstyle ) + mstyle->drawPrimitive( PE_ArrowDown, p, + TQRect(ax, ay, awh, awh), cg, how, opt ); + else + drawPrimitive( PE_ArrowDown, p, + TQRect(ax, ay, awh, awh), cg, how, opt ); + + TQPen oldPen = p->pen(); + p->setPen( cg.light() ); + p->drawLine( ax, sy, ax + awh - 1, sy ); + p->drawLine( ax, sy, ax, sy + sh - 1 ); + p->setPen( cg.dark() ); + p->drawLine( ax + 1, sy + sh - 1, ax + awh - 1, sy + sh - 1 ); + p->drawLine( ax + awh - 1, sy + 1, ax + awh - 1, sy + sh - 1 ); + p->setPen( oldPen ); + + if ( cmb->editable() ) { + TQRect r( querySubControlMetrics(CC_ComboBox, widget, + SC_ComboBoxEditField, opt) ); + qDrawShadePanel( p, r, cg, TRUE, 1, + &cg.brush(TQColorGroup::Button) ); + } + + break; + } + default: + TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, + sub, subActive, opt ); + break; + } +} + +void NorwegianWoodStyle::drawComplexControlMask( ComplexControl control, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQStyleOption& opt ) const +{ + switch ( control ) { + case CC_ComboBox: + { + int d = TQMIN( r.width(), r.height() ) / 2; + p->setPen( color1 ); + p->setBrush( color1 ); + drawroundrect( p, r.x(), r.y(), r.width(), r.height(), d ); + break; + } + default: + TQWindowsStyle::drawComplexControlMask( control, p, widget, r, opt ); + break; + } +} + +TQRect NorwegianWoodStyle::querySubControlMetrics( ComplexControl control, + const TQWidget *widget, + SubControl sc, + const TQStyleOption& opt ) const +{ + TQRect rect; + switch ( control ) { + case CC_ComboBox: + { + switch( sc ) { + case SC_ComboBoxEditField: + { + rect = subRect( SR_PushButtonContents, widget ); + int ew = get_combo_extra_width( rect.height(), 0 ); + rect.setRect( rect.x() + 1, rect.y() + 1, + rect.width() - 2 - ew, rect.height() - 2 ); + break; + } + default: + rect = TQWindowsStyle::querySubControlMetrics( control, widget, + sc, opt ); + break; + } + break; + } + case CC_ScrollBar: + { + const TQScrollBar* sb; + sb = (const TQScrollBar*)widget; + bool horz = sb->orientation() == TQScrollBar::Horizontal; + int b = 2; + int w = horz ? sb->height() : sb->width(); + + switch ( sc ) { + case SC_ScrollBarAddLine: + rect.setRect( b, b, w - 2 * b, w - 2 * b ); + if ( horz ) + rect.moveBy( sb->width() - w, 0 ); + else + rect.moveBy( 0, sb->height() - w ); + break; + case SC_ScrollBarSubLine: + rect.setRect( b, b, w - 2 * b, w - 2 * b ); + break; + default: + rect = TQWindowsStyle::querySubControlMetrics( control, widget, + sc, opt ); + break; + } + break; + } + default: + rect = TQWindowsStyle::querySubControlMetrics( control, widget, + sc, opt ); + break; + } + return rect; +} + +TQRect NorwegianWoodStyle::subRect( SubRect sr, const TQWidget * widget ) const +{ + TQRect r; + switch ( sr ) { + case SR_PushButtonContents: + { + const TQPushButton *btn; + btn = (const TQPushButton*)widget; + r = btn->rect(); + int d = TQMIN( r.width(), r.height() ) / 2; + int b = buttonthickness( d ); + + d -= b; + b++; + + if ( r.width() < r.height() ) + r.setRect( r.x() + b, r.y() + d, + r.width() - 2 * b, r.height() - 2 * d ); + else + r.setRect( r.x() + d, r.y() + b, + r.width() - 2 * d, r.height() - 2 * b ); + break; + } + case SR_ComboBoxFocusRect: + { + r = subRect( SR_PushButtonContents, widget ); + int ew = get_combo_extra_width( r.height() ); + r.setRect( r.x() + 1, r.y() + 1, r.width() - 2 - ew, + r.height() - 2 ); + break; + } + default: + r = TQWindowsStyle::subRect( sr, widget ); + break; + } + return r; +} + +static void drawroundrect( TQPainter *p, TQCOORD x, TQCOORD y, + TQCOORD w, TQCOORD h, TQCOORD d ) +{ + int rx = (200*d)/w; + int ry = (200*d)/h; + p->drawRoundRect( x, y, w, h, rx, ry ); +} + +static TQRegion roundRectRegion( const TQRect& g, int r ) +{ + TQPointArray a; + a.setPoints( 8, g.x()+r, g.y(), g.right()-r, g.y(), + g.right(), g.y()+r, g.right(), g.bottom()-r, + g.right()-r, g.bottom(), g.x()+r, g.bottom(), + g.x(), g.bottom()-r, g.x(), g.y()+r ); + TQRegion reg( a ); + int d = r*2-1; + reg += TQRegion( g.x(),g.y(),r*2,r*2, TQRegion::Ellipse ); + reg += TQRegion( g.right()-d,g.y(),r*2,r*2, TQRegion::Ellipse ); + reg += TQRegion( g.x(),g.bottom()-d,r*2,r*2, TQRegion::Ellipse ); + reg += TQRegion( g.right()-d,g.bottom()-d,r*2,r*2, TQRegion::Ellipse ); + return reg; +} + + + + +static int get_combo_extra_width( int h, int *return_awh ) +{ + int awh; + if ( h < 8 ) { + awh = 6; + } else if ( h < 14 ) { + awh = h - 2; + } else { + awh = h/2; + } + if ( return_awh ) + *return_awh = awh; + return awh*3/2; +} + + +static void get_combo_parameters( const TQRect &r, + int &ew, int &awh, int &ax, + int &ay, int &sh, int &dh, + int &sy ) +{ + ew = get_combo_extra_width( r.height(), &awh ); + + sh = (awh+3)/4; + if ( sh < 3 ) + sh = 3; + dh = sh/2 + 1; + + ay = r.y() + (r.height()-awh-sh-dh)/2; + if ( ay < 0 ) { + //panic mode + ay = 0; + sy = r.height(); + } else { + sy = ay+awh+dh; + } + ax = r.x() + r.width() - ew +(ew-awh)/2; +} + +static inline int buttonthickness( int d ) +{ return d > 20 ? 5 : ( d < 10 ? 2: 3 ); } + +void NorwegianWoodStyle::drawSemicircleButton( TQPainter *p, const TQRect &r, + int dir, bool sunken, + const TQColorGroup &g ) const +{ + int b = pixelMetric( PM_ScrollBarExtent ) > 20 ? 3 : 2; + + TQRegion extrn( r.x(), r.y(), r.width(), r.height(), TQRegion::Ellipse ); + TQRegion intern( r.x()+b, r.y()+b, r.width()-2*b, r.height()-2*b, TQRegion::Ellipse ); + int w2 = r.width()/2; + int h2 = r.height()/2; + + int bug = 1; //off-by-one somewhere!!!??? + + switch( dir ) { + case PointRight: + extrn += TQRegion( r.x(), r.y(), w2, r.height() ); + intern += TQRegion( r.x()+b,r.y()+b, w2-2*b, r.height()-2*b ); + break; + case PointLeft: + extrn += TQRegion( r.x()+w2, r.y(), w2, r.height() ); + intern += TQRegion( r.x()+w2+b,r.y()+b, w2-2*b, r.height()-2*b ); + break; + case PointUp: + extrn += TQRegion( r.x(), r.y()+h2, r.width(), h2 ); + intern += TQRegion( r.x()+b,r.y()+h2+b, r.width()-2*b-bug, h2-2*b-bug ); + break; + case PointDown: + extrn += TQRegion( r.x(), r.y(), r.width(), h2 ); + intern += TQRegion( r.x()+b,r.y()+b, r.width()-2*b-bug, h2-2*b-bug ); + break; + } + + extrn = extrn - intern; + TQPointArray a; + a.setPoints( 3, r.x(), r.y(), r.x(), r.bottom(), r.right(), r.top() ); + + TQRegion oldClip = p->clipRegion(); + bool bReallyClip = p->hasClipping(); // clip only if we really want. + p->setClipRegion( intern ); + p->fillRect( r, g.brush( TQColorGroup::Button ) ); + + p->setClipRegion( TQRegion(a)&extrn ); + p->fillRect( r, sunken ? g.dark() : g.light() ); + + a.setPoints( 3, r.right(), r.bottom(), r.x(), r.bottom(), + r.right(), r.top() ); + p->setClipRegion( TQRegion(a) & extrn ); + p->fillRect( r, sunken ? g.light() : g.dark() ); + + p->setClipRegion( oldClip ); + p->setClipping( bReallyClip ); +} + +#endif diff --git a/examples/themes/wood.h b/examples/themes/wood.h new file mode 100644 index 000000000..c05efb10c --- /dev/null +++ b/examples/themes/wood.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Definition of something or other +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef WOOD_H +#define WOOD_H + + +#include <qpalette.h> + +#ifndef QT_NO_STYLE_WINDOWS + +#include <qwindowsstyle.h> + + +class NorwegianWoodStyle : public TQWindowsStyle +{ +public: + NorwegianWoodStyle(); + void polish( TQApplication*); + void polish( TQWidget* ); + void unPolish( TQWidget* ); + void unPolish( TQApplication*); + + void drawPrimitive( PrimitiveElement pe, + TQPainter *p, + const TQRect &r, + const TQColorGroup &cg, + SFlags flags = Style_Default, + const TQStyleOption& = TQStyleOption::Default ) const; + + void drawControl( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how = Style_Default, + const TQStyleOption& = TQStyleOption::Default ) const; + + void drawControlMask( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQStyleOption& = TQStyleOption::Default ) const; + + void drawComplexControl( ComplexControl cc, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how = Style_Default, + SCFlags sub = SC_All, + SCFlags subActive = SC_None, + const TQStyleOption& = TQStyleOption::Default ) const; + + void drawComplexControlMask( ComplexControl control, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQStyleOption& = TQStyleOption::Default ) const; + + TQRect querySubControlMetrics( ComplexControl control, + const TQWidget *widget, + SubControl sc, + const TQStyleOption& = TQStyleOption::Default ) const; + + TQRect subRect( SubRect r, const TQWidget *widget ) const; + + +private: + void drawSemicircleButton(TQPainter *p, const TQRect &r, int dir, + bool sunken, const TQColorGroup &g ) const; + TQPalette oldPalette; + TQPixmap *sunkenDark; + TQPixmap *sunkenLight; + +}; + +#endif + +#endif diff --git a/examples/thread/prodcons/prodcons.cpp b/examples/thread/prodcons/prodcons.cpp new file mode 100644 index 000000000..f6ff4500a --- /dev/null +++ b/examples/thread/prodcons/prodcons.cpp @@ -0,0 +1,409 @@ +#include <qthread.h> +#include <qwaitcondition.h> +#include <qmutex.h> +#include <qapplication.h> +#include <qwidget.h> +#include <qpushbutton.h> +#include <qcheckbox.h> +#include <qprogressbar.h> +#include <qlayout.h> +#include <qevent.h> +#include <qlabel.h> +#include <qcstring.h> +#include <qtextstream.h> +#include <qfile.h> + +#include <stdio.h> + +// 50kb buffer +#define BUFSIZE (100*1000) +#define PRGSTEP (BUFSIZE / 50) +#define BLKSIZE (8) +TQByteArray bytearray; + + +class ProdEvent : public TQCustomEvent +{ +public: + ProdEvent(long s, bool d) + : TQCustomEvent(TQEvent::User + 100), sz(s), dn(d) + { ; } + + long size() const { return sz; } + bool done() const { return dn; } + + +private: + long sz; + bool dn; +}; + + +class ProdThread : public TQThread +{ +public: + ProdThread(TQObject *r, TQMutex *m, TQWaitCondition *c); + + void stop(); + void run(); + + +private: + TQObject *receiver; + TQMutex *mutex; + TQWaitCondition *condition; + + bool done; +}; + + +ProdThread::ProdThread(TQObject *r, TQMutex *m, TQWaitCondition *c) + : receiver(r), mutex(m), condition(c), done(FALSE) +{ +} + + +void ProdThread::stop() +{ + mutex->lock(); + done = TRUE; + mutex->unlock(); +} + + +void ProdThread::run() +{ + bool stop = FALSE; + done = FALSE; + + uchar *buffer = new uchar[BUFSIZE]; + int pos = 0, oldpos = 0; + int loop = 1; + int lastpostedpos = 0; + + ProdEvent *pe = new ProdEvent(pos, done); + TQApplication::postEvent(receiver, pe); + + while (! stop) { + oldpos = pos; + int i; + for (i = 0; i < BLKSIZE && pos < BUFSIZE; i++) { + buffer[pos++] = (loop % 2) ? 'o' : 'e'; + } + + mutex->lock(); + + if (pos == BUFSIZE) { + done = TRUE; + } + + while (! bytearray.isNull() && ! stop) { + condition->wakeOne(); + condition->wait(mutex); + + stop = done; + } + + stop = done; + bytearray.duplicate((const char *) (buffer + oldpos), pos - oldpos); + condition->wakeOne(); + + mutex->unlock(); + + if ( pos - lastpostedpos > PRGSTEP || stop ) { + lastpostedpos = pos; + ProdEvent *pe = new ProdEvent(pos, stop); + TQApplication::postEvent(receiver, pe); + } + + loop++; + } + + condition->wakeOne(); + + delete [] buffer; +} + + +class ConsEvent : public TQCustomEvent +{ +public: + ConsEvent(long s) + : TQCustomEvent(TQEvent::User + 101), sz(s) + { ; } + + long size() const { return sz; } + + +private: + long sz; +}; + + +class ConsThread : public TQThread +{ +public: + ConsThread(TQObject *r, TQMutex *m, TQWaitCondition *c); + + void stop(); + void run(); + + +private: + TQObject *receiver; + TQMutex *mutex; + TQWaitCondition *condition; + + bool done; +}; + + +ConsThread::ConsThread(TQObject *r, TQMutex *m, TQWaitCondition *c) + : receiver(r), mutex(m), condition(c), done(FALSE) +{ +} + + +void ConsThread::stop() +{ + mutex->lock(); + done = TRUE; + mutex->unlock(); +} + + +void ConsThread::run() +{ + bool stop = FALSE; + done = FALSE; + + TQFile file("prodcons.out"); + file.open(IO_WriteOnly); + + long size = 0; + long lastsize = 0; + + ConsEvent *ce = new ConsEvent(size); + TQApplication::postEvent(receiver, ce); + + while (! stop) { + mutex->lock(); + + while (bytearray.isNull() && ! stop) { + condition->wakeOne(); + condition->wait(mutex); + + stop = done; + } + + if (size < BUFSIZE) { + file.writeBlock(bytearray.data(), bytearray.size()); + size += bytearray.size(); + bytearray.resize(0); + } + + stop = done || size >= BUFSIZE; + + mutex->unlock(); + + if ( size - lastsize > 1000 || stop ) { + lastsize = size; + ConsEvent *ce = new ConsEvent(size); + TQApplication::postEvent(receiver, ce); + } + } + + file.flush(); + file.close(); +} + + +class ProdCons : public TQWidget +{ + Q_OBJECT + +public: + ProdCons(); + ~ProdCons(); + + void customEvent(TQCustomEvent *); + + +public slots: + void go(); + void stop(); + + +private: + TQMutex mutex; + TQWaitCondition condition; + + ProdThread *prod; + ConsThread *cons; + + TQPushButton *startbutton, *stopbutton; + TQCheckBox *loopcheckbox; + TQProgressBar *prodbar, *consbar; + bool stopped; + bool redraw; +}; + + +ProdCons::ProdCons() + : TQWidget(0, "producer consumer widget"), + prod(0), cons(0), stopped(FALSE), redraw(TRUE) +{ + startbutton = new TQPushButton("&Start", this); + connect(startbutton, SIGNAL(clicked()), SLOT(go())); + + stopbutton = new TQPushButton("S&top", this); + connect(stopbutton, SIGNAL(clicked()), SLOT(stop())); + stopbutton->setEnabled(FALSE); + + loopcheckbox = new TQCheckBox("Loop", this); + loopcheckbox->setChecked(FALSE); + + prodbar = new TQProgressBar(BUFSIZE, this); + consbar = new TQProgressBar(BUFSIZE, this); + + TQVBoxLayout *vbox = new TQVBoxLayout(this, 8, 8); + vbox->addWidget(new TQLabel(TQString("Producer/Consumer using %1 byte buffer"). + arg(BUFSIZE), this)); + vbox->addWidget(startbutton); + vbox->addWidget(stopbutton); + vbox->addWidget(loopcheckbox); + vbox->addWidget(new TQLabel("Producer progress:", this)); + vbox->addWidget(prodbar); + vbox->addWidget(new TQLabel("Consumer progress:", this)); + vbox->addWidget(consbar); +} + + +ProdCons::~ProdCons() +{ + stop(); + + if (prod) { + delete prod; + prod = 0; + } + + if (cons) { + delete cons; + cons = 0; + } +} + + +void ProdCons::go() +{ + stopped = FALSE; + + mutex.lock(); + + if ( redraw ) { + startbutton->setEnabled(FALSE); + stopbutton->setEnabled(TRUE); + } + + // start the consumer first + if (! cons) + cons = new ConsThread(this, &mutex, &condition); + cons->start(); + + // wait for consumer to signal that it has started + condition.wait(&mutex); + + if (! prod) + prod = new ProdThread(this, &mutex, &condition); + prod->start(); + mutex.unlock(); +} + + +void ProdCons::stop() +{ + if (prod && prod->running()) { + prod->stop(); + condition.wakeAll(); + prod->wait(); + } + + if (cons && cons->running()) { + cons->stop(); + condition.wakeAll(); + cons->wait(); + } + + if ( redraw ) { + // no point in repainting these buttons so many times is we are looping... + startbutton->setEnabled(TRUE); + stopbutton->setEnabled(FALSE); + } + + stopped = TRUE; +} + + +void ProdCons::customEvent(TQCustomEvent *e) +{ + switch (e->type()) { + case TQEvent::User + 100: + { + // ProdEvent + ProdEvent *pe = (ProdEvent *) e; + + if (pe->size() == 0 || + pe->size() == BUFSIZE || + pe->size() - prodbar->progress() >= PRGSTEP) + prodbar->setProgress(pe->size()); + + // reap the threads + if (pe->done()) { + bool loop = (loopcheckbox->isChecked() && ! stopped); + bool save_redraw = redraw; + redraw = !loop; + + stop(); + + if (loop) + go(); + + redraw = save_redraw; + } + + break; + } + + case TQEvent::User + 101: + { + // ConsEvent + ConsEvent *ce = (ConsEvent *) e; + + if (ce->size() == 0 || + ce->size() == BUFSIZE || + ce->size() - consbar->progress() >= PRGSTEP) + consbar->setProgress(ce->size()); + + break; + } + + default: + { + ; + } + } +} + + +int main(int argc, char **argv) +{ + TQApplication app(argc, argv); + ProdCons prodcons; + app.setMainWidget(&prodcons); + prodcons.show(); + return app.exec(); +} + + +#include "prodcons.moc" diff --git a/examples/thread/prodcons/prodcons.pro b/examples/thread/prodcons/prodcons.pro new file mode 100644 index 000000000..e728223ea --- /dev/null +++ b/examples/thread/prodcons/prodcons.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = prodcons + +CONFIG += qt warn_on + +REQUIRES = thread large-config + +SOURCES = prodcons.cpp +CLEAN_FILES = prodcons.out diff --git a/examples/thread/semaphores/main.cpp b/examples/thread/semaphores/main.cpp new file mode 100644 index 000000000..69d4779d5 --- /dev/null +++ b/examples/thread/semaphores/main.cpp @@ -0,0 +1,274 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +#include <qapplication.h> +#include <qwidget.h> +#include <qpushbutton.h> +#include <qmultilineedit.h> +#include <qthread.h> +#include <qsemaphore.h> +#include <qmutex.h> +#include <qlayout.h> +#include <qmessagebox.h> +#include <qlabel.h> + +#if defined(QT_NO_THREAD) +# error Thread support not enabled. +#endif + +// Use pointers to create semaphores after TQApplication object! +TQSemaphore* yellowSem, *greenSem; + + +class YellowThread : public TQThread +{ +public: + YellowThread(TQWidget *o) + : receiver(o), stopped(FALSE) + { ; } + + void run(); + void stop(); + + +private: + TQWidget *receiver; + TQMutex mutex; + bool stopped; +}; + + +void YellowThread::run() +{ + for (int i = 0; i < 20; i++) { + (*yellowSem)++; + + TQCustomEvent *event = new TQCustomEvent(12345); + event->setData(new TQString("Yellow!")); + TQApplication::postEvent(receiver, event); + msleep(200); + + (*greenSem)--; + + mutex.lock(); + if (stopped) { + stopped = FALSE; + mutex.unlock(); + break; + } + mutex.unlock(); + } + + (*yellowSem)++; + + TQCustomEvent *event = new TQCustomEvent(12346); + event->setData(new TQString("Yellow!")); + TQApplication::postEvent(receiver, event); + + (*greenSem)--; +} + +void YellowThread::stop() +{ + mutex.lock(); + stopped = TRUE; + mutex.unlock(); +} + + +class GreenThread: public TQThread +{ +public: + GreenThread(TQWidget *o) + : receiver(o), stopped( FALSE ) + { ; } + + void run(); + void stop(); + + +private: + TQWidget *receiver; + TQMutex mutex; + bool stopped; +}; + + +void GreenThread::run() +{ + for (int i = 0; i < 20; i++) { + (*greenSem)++; + + TQCustomEvent *event = new TQCustomEvent(12345); + event->setData(new TQString("Green!")); + TQApplication::postEvent(receiver, event); + msleep(200); + + (*yellowSem)--; + + mutex.lock(); + if (stopped) { + stopped = FALSE; + mutex.unlock(); + break; + } + mutex.unlock(); + } + + (*greenSem)++; + + TQCustomEvent *event = new TQCustomEvent(12346); + event->setData(new TQString("Green!")); + TQApplication::postEvent(receiver, event); + msleep(10); + + (*yellowSem)--; +} + +void GreenThread::stop() +{ + mutex.lock(); + stopped = TRUE; + mutex.unlock(); +} + + + +class SemaphoreExample : public TQWidget +{ + Q_OBJECT +public: + SemaphoreExample(); + ~SemaphoreExample(); + + void customEvent(TQCustomEvent *); + + +public slots: + void startExample(); + + +protected: + + +private: + TQMultiLineEdit *mlineedit; + TQPushButton *button; + TQLabel *label; + + YellowThread yellowThread; + GreenThread greenThread; +}; + + +SemaphoreExample::SemaphoreExample() + : TQWidget(), yellowThread(this), greenThread(this) +{ + yellowSem = new TQSemaphore(1); + greenSem = new TQSemaphore(1); + + button = new TQPushButton("&Ignition!", this); + connect(button, SIGNAL(clicked()), SLOT(startExample())); + + mlineedit = new TQMultiLineEdit(this); + label = new TQLabel(this); + + TQVBoxLayout *vbox = new TQVBoxLayout(this, 5); + vbox->addWidget(button); + vbox->addWidget(mlineedit); + vbox->addWidget(label); +} + + +SemaphoreExample::~SemaphoreExample() +{ + bool stopYellow = yellowThread.running(), + stopGreen = greenThread.running(); + if (stopYellow) + yellowThread.stop(); + if (greenThread.running()) + greenThread.stop(); + if (stopYellow) + yellowThread.wait(); + if (stopGreen) + greenThread.wait(); + delete yellowSem; + delete greenSem; +} + + +void SemaphoreExample::startExample() +{ + if (yellowThread.running() || greenThread.running()) { + TQMessageBox::information(this, "Sorry", + "The threads have not completed yet, and must finish before " + "they can be started again."); + + return; + } + + mlineedit->clear(); + + while (yellowSem->available() < yellowSem->total()) (*yellowSem)--; + (*yellowSem)++; + + yellowThread.start(); + greenThread.start(); +} + + +void SemaphoreExample::customEvent(TQCustomEvent *event) { + switch (event->type()) { + case 12345: + { + TQString *s = (TQString *) event->data(); + + mlineedit->append(*s); + + if (*s == "Green!") + label->setBackgroundColor(green); + else + label->setBackgroundColor(yellow); + label->setText(*s); + + delete s; + + break; + } + + case 12346: + { + TQString *s = (TQString *) event->data(); + + TQMessageBox::information(this, (*s) + " - Finished", + "The thread creating the \"" + *s + + "\" events has finished."); + delete s; + + break; + } + + default: + { + qWarning("Unknown custom event type: %d", event->type()); + } + } +} + + +int main(int argc, char **argv) +{ + TQApplication app(argc, argv); + SemaphoreExample se; + app.setMainWidget(&se); + se.show(); + return app.exec(); +} + + +#include "main.moc" diff --git a/examples/thread/semaphores/semaphores.pro b/examples/thread/semaphores/semaphores.pro new file mode 100644 index 000000000..7804ce341 --- /dev/null +++ b/examples/thread/semaphores/semaphores.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = semaphores + +CONFIG += qt warn_on release thread + +REQUIRES = thread full-config + +HEADERS = +SOURCES = main.cpp +INTERFACES = diff --git a/examples/tictac/README b/examples/tictac/README new file mode 100644 index 000000000..150f5d84b --- /dev/null +++ b/examples/tictac/README @@ -0,0 +1,7 @@ +This is a very simple implementation of the tic-tac-toe game. + +We didn't put much effort in making a clever algorithm so it's not a +challenge to play against the computer. Instead, study the source code to +see how you can make reusable components such as the TicTacGameBoard +widget. + diff --git a/examples/tictac/main.cpp b/examples/tictac/main.cpp new file mode 100644 index 000000000..1a18598c9 --- /dev/null +++ b/examples/tictac/main.cpp @@ -0,0 +1,30 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <stdlib.h> +#include "tictac.h" + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + int n = 3; + if ( argc == 2 ) // get board size n + n = atoi(argv[1]); + if ( n < 3 || n > 10 ) { // out of range + qWarning( "%s: Board size must be from 3x3 to 10x10", argv[0] ); + return 1; + } + TicTacToe ttt( n ); // create game + a.setMainWidget( &ttt ); + ttt.setCaption("TQt Example - TicTac"); + ttt.show(); // show widget + return a.exec(); // go +} diff --git a/examples/tictac/tictac.cpp b/examples/tictac/tictac.cpp new file mode 100644 index 000000000..60cd0eb71 --- /dev/null +++ b/examples/tictac/tictac.cpp @@ -0,0 +1,375 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "tictac.h" +#include <qapplication.h> +#include <qpainter.h> +#include <qdrawutil.h> +#include <qcombobox.h> +#include <qcheckbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <stdlib.h> // rand() function +#include <qdatetime.h> // seed for rand() + + +//*************************************************************************** +//* TicTacButton member functions +//*************************************************************************** + +// -------------------------------------------------------------------------- +// Creates a TicTacButton +// + +TicTacButton::TicTacButton( TQWidget *parent ) : TQPushButton( parent ) +{ + t = Blank; // initial type +} + +// -------------------------------------------------------------------------- +// Paints TicTacButton +// + +void TicTacButton::drawButtonLabel( TQPainter *p ) +{ + TQRect r = rect(); + p->setPen( TQPen( white,2 ) ); // set fat pen + if ( t == Circle ) { + p->drawEllipse( r.left()+4, r.top()+4, r.width()-8, r.height()-8 ); + } else if ( t == Cross ) { // draw cross + p->drawLine( r.topLeft() +TQPoint(4,4), r.bottomRight()-TQPoint(4,4)); + p->drawLine( r.bottomLeft()+TQPoint(4,-4),r.topRight() -TQPoint(4,-4)); + } +} + + +//*************************************************************************** +//* TicTacGameBoard member functions +//*************************************************************************** + +// -------------------------------------------------------------------------- +// Creates a game board with N x N buttons and connects the "clicked()" +// signal of all buttons to the "buttonClicked()" slot. +// + +TicTacGameBoard::TicTacGameBoard( int n, TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + st = Init; // initial state + nBoard = n; + n *= n; // make square + comp_starts = FALSE; // human starts + buttons = new TicTacButtons(n); // create real buttons + btArray = new TicTacArray(n); // create button model + TQGridLayout * grid = new TQGridLayout( this, nBoard, nBoard, 4 ); + TQPalette p( blue ); + for ( int i=0; i<n; i++ ) { // create and connect buttons + TicTacButton *ttb = new TicTacButton( this ); + ttb->setPalette( p ); + ttb->setEnabled( FALSE ); + connect( ttb, SIGNAL(clicked()), SLOT(buttonClicked()) ); + grid->addWidget( ttb, i%nBoard, i/nBoard ); + buttons->insert( i, ttb ); + btArray->at(i) = TicTacButton::Blank; // initial button type + } + TQTime t = TQTime::currentTime(); // set random seed + srand( t.hour()*12+t.minute()*60+t.second()*60 ); +} + +TicTacGameBoard::~TicTacGameBoard() +{ + delete buttons; + delete btArray; +} + + +// -------------------------------------------------------------------------- +// TicTacGameBoard::computerStarts( bool v ) +// +// Computer starts if v=TRUE. The human starts by default. +// + +void TicTacGameBoard::computerStarts( bool v ) +{ + comp_starts = v; +} + + +// -------------------------------------------------------------------------- +// TicTacGameBoard::newGame() +// +// Clears the game board and prepares for a new game +// + +void TicTacGameBoard::newGame() +{ + st = HumansTurn; + for ( int i=0; i<nBoard*nBoard; i++ ) + btArray->at(i) = TicTacButton::Blank; + if ( comp_starts ) + computerMove(); + else + updateButtons(); +} + + +// -------------------------------------------------------------------------- +// TicTacGameBoard::buttonClicked() - SLOT +// +// This slot is activated when a TicTacButton emits the signal "clicked()", +// i.e. the user has clicked on a TicTacButton. +// + +void TicTacGameBoard::buttonClicked() +{ + if ( st != HumansTurn ) // not ready + return; + int i = buttons->findRef( (TicTacButton*)sender() ); + TicTacButton *b = buttons->at(i); // get piece that was pressed + if ( b->type() == TicTacButton::Blank ) { // empty piece? + btArray->at(i) = TicTacButton::Circle; + updateButtons(); + if ( checkBoard( btArray ) == 0 ) // not a winning move? + computerMove(); + int s = checkBoard( btArray ); + if ( s ) { // any winners yet? + st = s == TicTacButton::Circle ? HumanWon : ComputerWon; + emit finished(); + } + } +} + + +// -------------------------------------------------------------------------- +// TicTacGameBoard::updateButtons() +// +// Updates all buttons that have changed state +// + +void TicTacGameBoard::updateButtons() +{ + for ( int i=0; i<nBoard*nBoard; i++ ) { + if ( buttons->at(i)->type() != btArray->at(i) ) + buttons->at(i)->setType( (TicTacButton::Type)btArray->at(i) ); + buttons->at(i)->setEnabled( buttons->at(i)->type() == + TicTacButton::Blank ); + } +} + + +// -------------------------------------------------------------------------- +// TicTacGameBoard::checkBoard() +// +// Checks if one of the players won the game, works for any board size. +// +// Returns: +// - TicTacButton::Cross if the player with X buttons won +// - TicTacButton::Circle if the player with O buttons won +// - Zero (0) if there is no winner yet +// + +int TicTacGameBoard::checkBoard( TicTacArray *a ) +{ + int t = 0; + int row, col; + bool won = FALSE; + for ( row=0; row<nBoard && !won; row++ ) { // check horizontal + t = a->at(row*nBoard); + if ( t == TicTacButton::Blank ) + continue; + col = 1; + while ( col<nBoard && a->at(row*nBoard+col) == t ) + col++; + if ( col == nBoard ) + won = TRUE; + } + for ( col=0; col<nBoard && !won; col++ ) { // check vertical + t = a->at(col); + if ( t == TicTacButton::Blank ) + continue; + row = 1; + while ( row<nBoard && a->at(row*nBoard+col) == t ) + row++; + if ( row == nBoard ) + won = TRUE; + } + if ( !won ) { // check diagonal top left + t = a->at(0); // to bottom right + if ( t != TicTacButton::Blank ) { + int i = 1; + while ( i<nBoard && a->at(i*nBoard+i) == t ) + i++; + if ( i == nBoard ) + won = TRUE; + } + } + if ( !won ) { // check diagonal bottom left + int j = nBoard-1; // to top right + int i = 0; + t = a->at(i+j*nBoard); + if ( t != TicTacButton::Blank ) { + i++; j--; + while ( i<nBoard && a->at(i+j*nBoard) == t ) { + i++; j--; + } + if ( i == nBoard ) + won = TRUE; + } + } + if ( !won ) // no winner + t = 0; + return t; +} + + +// -------------------------------------------------------------------------- +// TicTacGameBoard::computerMove() +// +// Puts a piece on the game board. Very, very simple. +// + +void TicTacGameBoard::computerMove() +{ + int numButtons = nBoard*nBoard; + int *altv = new int[numButtons]; // buttons alternatives + int altc = 0; + int stopHuman = -1; + TicTacArray a = btArray->copy(); + int i; + for ( i=0; i<numButtons; i++ ) { // try all positions + if ( a[i] != TicTacButton::Blank ) // already a piece there + continue; + a[i] = TicTacButton::Cross; // test if computer wins + if ( checkBoard(&a) == a[i] ) { // computer will win + st = ComputerWon; + stopHuman = -1; + break; + } + a[i] = TicTacButton::Circle; // test if human wins + if ( checkBoard(&a) == a[i] ) { // oops... + stopHuman = i; // remember position + a[i] = TicTacButton::Blank; // restore button + continue; // computer still might win + } + a[i] = TicTacButton::Blank; // restore button + altv[altc++] = i; // remember alternative + } + if ( stopHuman >= 0 ) // must stop human from winning + a[stopHuman] = TicTacButton::Cross; + else if ( i == numButtons ) { // tried all alternatives + if ( altc > 0 ) // set random piece + a[altv[rand()%(altc--)]] = TicTacButton::Cross; + if ( altc == 0 ) { // no more blanks + st = NobodyWon; + emit finished(); + } + } + *btArray = a; // update model + updateButtons(); // update buttons + delete[] altv; +} + + +//*************************************************************************** +//* TicTacToe member functions +//*************************************************************************** + +// -------------------------------------------------------------------------- +// Creates a game widget with a game board and two push buttons, and connects +// signals of child widgets to slots. +// + +TicTacToe::TicTacToe( int boardSize, TQWidget *parent, const char *name ) + : TQWidget( parent, name ) +{ + TQVBoxLayout * l = new TQVBoxLayout( this, 6 ); + + // Create a message label + + message = new TQLabel( this ); + message->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); + message->setAlignment( AlignCenter ); + l->addWidget( message ); + + // Create the game board and connect the signal finished() to this + // gameOver() slot + + board = new TicTacGameBoard( boardSize, this ); + connect( board, SIGNAL(finished()), SLOT(gameOver()) ); + l->addWidget( board ); + + // Create a horizontal frame line + + TQFrame *line = new TQFrame( this ); + line->setFrameStyle( TQFrame::HLine | TQFrame::Sunken ); + l->addWidget( line ); + + // Create the combo box for deciding who should start, and + // connect its clicked() signals to the buttonClicked() slot + + whoStarts = new TQComboBox( this ); + whoStarts->insertItem( "Computer starts" ); + whoStarts->insertItem( "Human starts" ); + l->addWidget( whoStarts ); + + // Create the push buttons and connect their clicked() signals + // to this right slots. + + newGame = new TQPushButton( "Play!", this ); + connect( newGame, SIGNAL(clicked()), SLOT(newGameClicked()) ); + tquit = new TQPushButton( "Quit", this ); + connect( tquit, SIGNAL(clicked()), qApp, SLOT(tquit()) ); + TQHBoxLayout * b = new TQHBoxLayout; + l->addLayout( b ); + b->addWidget( newGame ); + b->addWidget( tquit ); + + newState(); +} + + +// -------------------------------------------------------------------------- +// TicTacToe::newGameClicked() - SLOT +// +// This slot is activated when the new game button is clicked. +// + +void TicTacToe::newGameClicked() +{ + board->computerStarts( whoStarts->currentItem() == 0 ); + board->newGame(); + newState(); +} + + +// -------------------------------------------------------------------------- +// TicTacToe::gameOver() - SLOT +// +// This slot is activated when the TicTacGameBoard emits the signal +// "finished()", i.e. when a player has won or when it is a draw. +// + +void TicTacToe::gameOver() +{ + newState(); // update text box +} + + +// -------------------------------------------------------------------------- +// Updates the message to reflect a new state. +// + +void TicTacToe::newState() +{ + static const char *msg[] = { // TicTacGameBoard::State texts + "Click Play to start", "Make your move", + "You won!", "Computer won!", "It's a draw" }; + message->setText( msg[board->state()] ); + return; +} diff --git a/examples/tictac/tictac.doc b/examples/tictac/tictac.doc new file mode 100644 index 000000000..05b16fb47 --- /dev/null +++ b/examples/tictac/tictac.doc @@ -0,0 +1,33 @@ +/* +*/ +/*! \page tictac-example.html + + \ingroup examples + \title Tic Tac Toe + + This is an implementation of the Tic-tac-toe game. + + We didn't put much effort in making a clever algorithm so it's not a + challenge to play against the computer. Instead, study the source code + to see how you can make reusable components such as the \e TicTacGameBoard + widget. + + <hr> + + Header file: + + \include tictac/tictac.h + + <hr> + + Implementation: + + \include tictac/tictac.cpp + + <hr> + + Main: + + \include tictac/main.cpp +*/ + diff --git a/examples/tictac/tictac.h b/examples/tictac/tictac.h new file mode 100644 index 000000000..876def88d --- /dev/null +++ b/examples/tictac/tictac.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef TICTAC_H +#define TICTAC_H + + +#include <qpushbutton.h> +#include <qptrvector.h> + +class TQComboBox; +class TQLabel; + + +// -------------------------------------------------------------------------- +// TicTacButton implements a single tic-tac-toe button +// + +class TicTacButton : public TQPushButton +{ + Q_OBJECT +public: + TicTacButton( TQWidget *parent ); + enum Type { Blank, Circle, Cross }; + Type type() const { return t; } + void setType( Type type ) { t = type; repaint(); } + TQSizePolicy sizePolicy() const + { return TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ); } + TQSize sizeHint() const { return TQSize( 32, 32 ); } + TQSize minimumSizeHint() const { return TQSize( 10, 10 ); } +protected: + void drawButtonLabel( TQPainter * ); +private: + Type t; +}; + +// Using template vector to make vector-class of TicTacButton. +// This vector is used by the TicTacGameBoard class defined below. + +typedef TQPtrVector<TicTacButton> TicTacButtons; +typedef TQMemArray<int> TicTacArray; + + +// -------------------------------------------------------------------------- +// TicTacGameBoard implements the tic-tac-toe game board. +// TicTacGameBoard is a composite widget that contains N x N TicTacButtons. +// N is specified in the constructor. +// + +class TicTacGameBoard : public TQWidget +{ + Q_OBJECT +public: + TicTacGameBoard( int n, TQWidget *parent=0, const char *name=0 ); + ~TicTacGameBoard(); + enum State { Init, HumansTurn, HumanWon, ComputerWon, NobodyWon }; + State state() const { return st; } + void computerStarts( bool v ); + void newGame(); +signals: + void finished(); // game finished +private slots: + void buttonClicked(); +private: + void setState( State state ) { st = state; } + void updateButtons(); + int checkBoard( TicTacArray * ); + void computerMove(); + State st; + int nBoard; + bool comp_starts; + TicTacArray *btArray; + TicTacButtons *buttons; +}; + + +// -------------------------------------------------------------------------- +// TicTacToe implements the complete game. +// TicTacToe is a composite widget that contains a TicTacGameBoard and +// two push buttons for starting the game and tquitting. +// + +class TicTacToe : public TQWidget +{ + Q_OBJECT +public: + TicTacToe( int boardSize=3, TQWidget *parent=0, const char *name=0 ); +private slots: + void newGameClicked(); + void gameOver(); +private: + void newState(); + TQComboBox *whoStarts; + TQPushButton *newGame; + TQPushButton *tquit; + TQLabel *message; + TicTacGameBoard *board; +}; + + +#endif // TICTAC_H diff --git a/examples/tictac/tictac.pro b/examples/tictac/tictac.pro new file mode 100644 index 000000000..8ce064084 --- /dev/null +++ b/examples/tictac/tictac.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = tictac + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = tictac.h +SOURCES = main.cpp \ + tictac.cpp diff --git a/examples/tooltip/README b/examples/tooltip/README new file mode 100644 index 000000000..cdfe50cd2 --- /dev/null +++ b/examples/tooltip/README @@ -0,0 +1,8 @@ +The tooltip example demonstrates advanced use of tool tips. + +There are dynamic tool tips on the blue rectanges - QToolTip asks +tooltip whether to display anything, and if so, what. The Right Thing +happens when you click on the rectangles. + +There is also a static tool tip on the red rectangle. + diff --git a/examples/tooltip/main.cpp b/examples/tooltip/main.cpp new file mode 100644 index 000000000..fa02f0e86 --- /dev/null +++ b/examples/tooltip/main.cpp @@ -0,0 +1,23 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "tooltip.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + + TellMe mw; + mw.setCaption( "TQt Example - Dynamic Tool Tips" ); + a.setMainWidget( &mw ); + mw.show(); + + return a.exec(); +} diff --git a/examples/tooltip/tooltip.cpp b/examples/tooltip/tooltip.cpp new file mode 100644 index 000000000..628c4d94f --- /dev/null +++ b/examples/tooltip/tooltip.cpp @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "tooltip.h" +#include <qapplication.h> +#include <qpainter.h> +#include <stdlib.h> + + +DynamicTip::DynamicTip( TQWidget * parent ) + : TQToolTip( parent ) +{ + // no explicit initialization needed +} + + +void DynamicTip::maybeTip( const TQPoint &pos ) +{ + if ( !parentWidget()->inherits( "TellMe" ) ) + return; + + TQRect r( ((TellMe*)parentWidget())->tip(pos) ); + if ( !r.isValid() ) + return; + + TQString s; + s.sprintf( "position: %d,%d", r.center().x(), r.center().y() ); + tip( r, s ); +} + + +TellMe::TellMe( TQWidget * parent , const char * name ) + : TQWidget( parent, name ) +{ + setMinimumSize( 30, 30 ); + r1 = randomRect(); + r2 = randomRect(); + r3 = randomRect(); + + t = new DynamicTip( this ); + + TQToolTip::add( this, r3, "this color is called red" ); // <- helpful +} + + +TellMe::~TellMe() +{ + delete t; + t = 0; +} + + +void TellMe::paintEvent( TQPaintEvent * e ) +{ + TQPainter p( this ); + + // I try to be efficient here, and repaint only what's needed + + if ( e->rect().intersects( r1 ) ) { + p.setBrush( blue ); + p.drawRect( r1 ); + } + + if ( e->rect().intersects( r2 ) ) { + p.setBrush( blue ); + p.drawRect( r2 ); + } + + if ( e->rect().intersects( r3 ) ) { + p.setBrush( red ); + p.drawRect( r3 ); + } +} + + +void TellMe::mousePressEvent( TQMouseEvent * e ) +{ + if ( r1.contains( e->pos() ) ) + r1 = randomRect(); + if ( r2.contains( e->pos() ) ) + r2 = randomRect(); + repaint(); +} + + +void TellMe::resizeEvent( TQResizeEvent * ) +{ + if ( !rect().contains( r1 ) ) + r1 = randomRect(); + if ( !rect().contains( r2 ) ) + r2 = randomRect(); +} + + +TQRect TellMe::randomRect() +{ + return TQRect( ::rand() % (width() - 20), ::rand() % (height() - 20), + 20, 20 ); +} + + +TQRect TellMe::tip( const TQPoint & p ) +{ + if ( r1.contains( p ) ) + return r1; + else if ( r2.contains( p ) ) + return r2; + else + return TQRect( 0,0, -1,-1 ); +} diff --git a/examples/tooltip/tooltip.doc b/examples/tooltip/tooltip.doc new file mode 100644 index 000000000..41800ff07 --- /dev/null +++ b/examples/tooltip/tooltip.doc @@ -0,0 +1,33 @@ +/* +*/ +/*! \page tooltip-example.html + + \ingroup examples + \title Advanced use of tool tips + + This example widget demonstrates how to use tool tips for static and + dynamic regions within a widget. + + It displays two blue and one red rectangle. The blue ones move every + time you click on them, the red one is static. There are dynamic + tool tips on the blue rectangles and a static tool tip on the red one. + + <hr> + + Header file: + + \include tooltip/tooltip.h + + <hr> + + Implementation: + + \include tooltip/tooltip.cpp + + <hr> + + Main: + + \include tooltip/main.cpp +*/ + diff --git a/examples/tooltip/tooltip.h b/examples/tooltip/tooltip.h new file mode 100644 index 000000000..c9d26d9ac --- /dev/null +++ b/examples/tooltip/tooltip.h @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qwidget.h> +#include <qtooltip.h> + + +class DynamicTip : public TQToolTip +{ +public: + DynamicTip( TQWidget * parent ); + +protected: + void maybeTip( const TQPoint & ); +}; + + +class TellMe : public TQWidget +{ + Q_OBJECT +public: + TellMe( TQWidget * parent = 0, const char * name = 0 ); + ~TellMe(); + + TQRect tip( const TQPoint & ); + +protected: + void paintEvent( TQPaintEvent * ); + void mousePressEvent( TQMouseEvent * ); + void resizeEvent( TQResizeEvent * ); + +private: + TQRect randomRect(); + + TQRect r1, r2, r3; + DynamicTip * t; +}; diff --git a/examples/tooltip/tooltip.pro b/examples/tooltip/tooltip.pro new file mode 100644 index 000000000..d0c2fdb47 --- /dev/null +++ b/examples/tooltip/tooltip.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = tooltip + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = large-config + +HEADERS = tooltip.h +SOURCES = main.cpp \ + tooltip.cpp diff --git a/examples/toplevel/main.cpp b/examples/toplevel/main.cpp new file mode 100644 index 000000000..1987a3f52 --- /dev/null +++ b/examples/toplevel/main.cpp @@ -0,0 +1,9 @@ +#include <qapplication.h> +#include "options.h" + +int main( int argc, char ** argv ) +{ + TQApplication a( argc, argv ); + OptionsDialog dlg; + return dlg.exec(); +} diff --git a/examples/toplevel/options.ui b/examples/toplevel/options.ui new file mode 100644 index 000000000..04641a5c3 --- /dev/null +++ b/examples/toplevel/options.ui @@ -0,0 +1,587 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>OptionsDialog</class> +<widget class="TQDialog"> + <property name="name"> + <cstring>OptionsDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>371</width> + <height>482</height> + </rect> + </property> + <property name="caption"> + <string>Select Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>bgBorder</cstring> + </property> + <property name="title"> + <string>&Border</string> + </property> + <property name="flat"> + <bool>true</bool> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Select different types of borders, or turn the border off. Windows without a border are ignored by the window manager.</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>rbBorderNormal</cstring> + </property> + <property name="text"> + <string>&Normal</string> + </property> + <property name="accel"> + <string>Alt+N</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>A normal border</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Gives the window a normal, resizable border. The window should have a layout installed to handle the resizing gracefully.</string> + </property> + </widget> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>rbBorderDialog</cstring> + </property> + <property name="text"> + <string>&Dialog</string> + </property> + <property name="accel"> + <string>Alt+D</string> + </property> + <property name="toolTip" stdset="0"> + <string>A thin dialog border</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Gives the window a thin dialog border. Depending on the window manager the window will not be resizable. Use TQWidget::setFixedSize() in addition to enforce a static size on all systems.</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>bgTitle</cstring> + </property> + <property name="title"> + <string>&Titlebar</string> + </property> + <property name="flat"> + <bool>true</bool> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Select different controls you want to see in the titlebar, or turn the titlebar off. Popup windows should not have a titlebar.</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbTitleSystem</cstring> + </property> + <property name="text"> + <string>S&ystem Menu</string> + </property> + <property name="accel"> + <string>Alt+Y</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>A window system menu.</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Adds a window system menu. Many window managers retquire a system menu to be able to provide minimize or maximize controls. A system menu implies a close button.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbTitleMinimize</cstring> + </property> + <property name="text"> + <string>Minimi&ze</string> + </property> + <property name="accel"> + <string>Alt+Z</string> + </property> + <property name="toolTip" stdset="0"> + <string>A minimize button</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Adds a minimze button. This option retquires a system menu on many window managers.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbTitleMaximize</cstring> + </property> + <property name="text"> + <string>Ma&ximize</string> + </property> + <property name="accel"> + <string>Alt+X</string> + </property> + <property name="toolTip" stdset="0"> + <string>A maximize button</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Adds a maximze button. This option retquires a system menu on many window managers.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbTitleContext</cstring> + </property> + <property name="text"> + <string>&What's This</string> + </property> + <property name="accel"> + <string>Alt+W</string> + </property> + <property name="toolTip" stdset="0"> + <string>A context help button</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Adds a context help button. This option retquires a system menu on many window managers, and often doesn't work together with minimize and maximize buttons.</string> + </property> + </widget> + </vbox> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>bgBehavior</cstring> + </property> + <property name="title"> + <string>Behavior</string> + </property> + <property name="flat"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Select different behaviors of the window in runtime.</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbBehaviorTaskbar</cstring> + </property> + <property name="text"> + <string>Taskbar &Entry</string> + </property> + <property name="accel"> + <string>Alt+E</string> + </property> + <property name="toolTip" stdset="0"> + <string>Entry in the taskbar</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Gives the window a separate task bar entry.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbBehaviorStays</cstring> + </property> + <property name="text"> + <string>Stays on T&op</string> + </property> + <property name="accel"> + <string>Alt+O</string> + </property> + <property name="toolTip" stdset="0"> + <string>Stay on top of the desktop</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Informs the window system that the window should stay on top of all other windows, including windows from other applications. This is not supported on all X11 window managers.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbBehaviorPopup</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Popup</string> + </property> + <property name="accel"> + <string>Alt+P</string> + </property> + <property name="toolTip" stdset="0"> + <string>A popup window</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Indicates that this widget is a popup window. Popup windows are modal, but close automatically when the mouse is clicked.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbBehaviorTool</cstring> + </property> + <property name="text"> + <string>Too&l</string> + </property> + <property name="accel"> + <string>Alt+L</string> + </property> + <property name="toolTip" stdset="0"> + <string>A tool window</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Makes the window a tool window. Tool windows often have a smaller titlebar and decoration, and don't activate automtically when displayed. Tool windows often cannot have their own taskbar entry.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>cbBehaviorModal</cstring> + </property> + <property name="text"> + <string>&Modal</string> + </property> + <property name="accel"> + <string>Alt+M</string> + </property> + <property name="toolTip" stdset="0"> + <string>Show modal</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The window is modal for the application, e.g. input for other windows are blocked by this window.</string> + </property> + </widget> + </vbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>31</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </hbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>gbProperties</cstring> + </property> + <property name="title"> + <string>Properties</string> + </property> + <property name="flat"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Set other properties of the window.</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLineEdit" row="0" column="1"> + <property name="name"> + <cstring>leCaption</cstring> + </property> + <property name="text"> + <string>Caption</string> + </property> + <property name="toolTip" stdset="0"> + <string>Window caption</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The caption of the window.</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLineEdit"> + <property name="name"> + <cstring>leIcon</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Icon file</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Provide an image file.</string> + </property> + </widget> + <widget class="TQToolButton"> + <property name="name"> + <cstring>tbPick</cstring> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Pick an icon</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Select an image file.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQSlider" row="2" column="1"> + <property name="name"> + <cstring>slTransparency</cstring> + </property> + <property name="maxValue"> + <number>100</number> + </property> + <property name="pageStep"> + <number>10</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="tickmarks"> + <enum>Below</enum> + </property> + <property name="tickInterval"> + <number>10</number> + </property> + <property name="toolTip" stdset="0"> + <string>Window transparency</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Set the transparency of the window. +A high value gives a high window transparency, e.g. it is less visible. + +Note that this attribute is not supported on many windowing systems and will have no effect.</string> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>Transp&arency:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>slTransparency</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>&Icon:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>leIcon</cstring> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>&Caption:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>leCaption</cstring> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>70</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>pbApply</cstring> + </property> + <property name="text"> + <string>Apply</string> + </property> + <property name="accel"> + <string></string> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Creates a new window with the selected flags, or modifies the visible window.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>pbClose</cstring> + </property> + <property name="text"> + <string>Close</string> + </property> + <property name="accel"> + <string></string> + </property> + <property name="whatsThis" stdset="0"> + <string>Closes this dialog and exits the application.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>pbClose</sender> + <signal>clicked()</signal> + <receiver>OptionsDialog</receiver> + <slot>close()</slot> + </connection> + <connection> + <sender>pbApply</sender> + <signal>clicked()</signal> + <receiver>OptionsDialog</receiver> + <slot>apply()</slot> + </connection> + <connection> + <sender>bgBorder</sender> + <signal>toggled(bool)</signal> + <receiver>bgTitle</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>cbTitleSystem</sender> + <signal>toggled(bool)</signal> + <receiver>cbTitleMinimize</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>cbTitleSystem</sender> + <signal>toggled(bool)</signal> + <receiver>cbTitleMaximize</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>cbTitleSystem</sender> + <signal>toggled(bool)</signal> + <receiver>cbTitleContext</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>bgTitle</sender> + <signal>toggled(bool)</signal> + <receiver>cbBehaviorPopup</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cbBehaviorPopup</sender> + <signal>toggled(bool)</signal> + <receiver>bgTitle</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>tbPick</sender> + <signal>clicked()</signal> + <receiver>OptionsDialog</receiver> + <slot>pickIcon()</slot> + </connection> +</connections> +<includes> + <include location="global" impldecl="in declaration">qguardedptr.h</include> + <include location="global" impldecl="in declaration">qvbox.h</include> + <include location="global" impldecl="in implementation">qfiledialog.h</include> +</includes> +<variables> + <variable access="private">TQGuardedPtr<TQVBox> widget;</variable> +</variables> +<slots> + <slot>apply()</slot> + <slot access="protected">pickIcon()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/examples/toplevel/options.ui.h b/examples/toplevel/options.ui.h new file mode 100644 index 000000000..210c25150 --- /dev/null +++ b/examples/toplevel/options.ui.h @@ -0,0 +1,98 @@ +void OptionsDialog::apply() +{ + TQStringList flagList; + bool wstyle = false; + WFlags f = WDestructiveClose | WType_TopLevel | WStyle_Customize; + + if ( bgBorder->isChecked() ) { + if ( rbBorderNormal->isChecked() ) { + f |= WStyle_NormalBorder; + flagList += "WStyle_NormalBorder"; + wstyle = true; + } + else if ( rbBorderDialog->isChecked() ) { + f |= WStyle_DialogBorder; + flagList += "WStyle_DialogBorder"; + wstyle = true; + } + + if ( bgTitle->isChecked() ) { + f |= WStyle_Title; + flagList += "WStyle_Title"; + wstyle = true; + if ( cbTitleSystem->isChecked() ) { + f |= WStyle_SysMenu; + flagList += "WStyle_SysMenu"; + } + if ( cbTitleMinimize->isChecked() ) { + f |= WStyle_Minimize; + flagList += "WStyle_Minimize"; + } + if ( cbTitleMaximize->isChecked() ) { + f |= WStyle_Maximize; + flagList += "WStyle_Maximize"; + } + if ( cbTitleContext->isChecked() ) { + f |= WStyle_ContextHelp; + flagList += "WStyle_ContextHelp"; + } + } + } else { + f |= WStyle_NoBorder; + flagList += "WStyle_NoBorder"; + wstyle = true; + } + + TQWidget *parent = this; + if ( cbBehaviorTaskbar->isChecked() ) { + parent = 0; + f |= WGroupLeader; + flagList += "WGroupLeader"; + } + if ( cbBehaviorStays->isChecked() ) { + f |= WStyle_StaysOnTop /*| WX11BypassWM*/; + flagList += "WStyle_StaysOnTop"; + wstyle = true; + } + if ( cbBehaviorPopup->isChecked() ) { + f |= WType_Popup; + flagList += "WType_Popup"; + } + if ( cbBehaviorModal->isChecked() ) { + f |= WShowModal; + flagList += "WShowModal"; + } + if ( cbBehaviorTool->isChecked() ) { + f |= WStyle_Tool; + flagList += "WStyle_Tool"; + wstyle = true; + } + + if (wstyle) + flagList.push_front("WStyle_Customize"); + + if ( !widget ) { + widget = new TQVBox( parent, 0, f ); + widget->setMargin( 20 ); + TQLabel *label = new TQLabel(flagList.join(" | "), widget); + label->setTextFormat(RichText); + label->setAlignment(WordBreak); + TQPushButton *okButton = new TQPushButton( "Close", widget ); + connect( okButton, SIGNAL(clicked()), widget, SLOT(close()) ); + widget->move( pos() ); + } else { + widget->reparent( parent, f, widget->geometry().topLeft(), FALSE); + } + + widget->setCaption( leCaption->text() ); + widget->setIcon( leIcon->text() ); + widget->setWindowOpacity(double(slTransparency->maxValue() - slTransparency->value()) / 100); + + widget->show(); +} + +void OptionsDialog::pickIcon() +{ + TQString filename = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this ); + leIcon->setText( filename ); +} diff --git a/examples/toplevel/toplevel.doc b/examples/toplevel/toplevel.doc new file mode 100644 index 000000000..0dd1a0d31 --- /dev/null +++ b/examples/toplevel/toplevel.doc @@ -0,0 +1,132 @@ +/*! + \page toplevel-example.html + + \ingroup examples + \title Toplevel Widgets + + This example demonstrates the use of Qt's widget flags to provide + toplevel widgets with customized window decorations. + + It provides a graphical user interface for selecting different + options for widget decoration and behavior, and passes the + appropriate widget flags to the QWidget constructor. + QWidget::reparent() is used to change the widget flags at runtime. + + \warning Note that the interpretation and functionality of the + widget flags depends on the window manager used when running the + application. Many window managers do not support every possible flag + combination. + + The user interface providing the different options was created using + \link designer-manual.book Qt Designer\endlink. The different + options are explained in the user interface through the use of + tooltips and What's This help. Load the \c options.ui file into + \link designer-manual.book Qt Designer\endlink for more details. + + \quotefile toplevel/main.cpp + \printuntil } + + The main function creates and displays the dialog for the user + interface. Note that this dialog is modal. + + The code relevant for this example is in the \c options.ui.h + file. + + \quotefile toplevel/options.ui.h + \printuntil WFlags + + The \c apply() slot declares the widget flag variable \c f + and initializes it with the values + \list + \i \c WDestructiveClose - the widget will be automatically + destroyed when it is closed, + \i \c WType_TopLevel - the widget will be top level even if it + has a parent widget, and + \i \c WStyle_Customize - the flags override the default values + \endlist + Other flags are used depending on the options selected in the user + interface. + + \printto bgTitle->isChecked() + The window gets a normal or dialog border depending on the selected + option. + + \printto else + A titlebar with controls is provided if the appropriate options + have been checked. + + \printto QWidget *parent + If the window should not have a border it cannot have a titlebar. + Widgets that provide their own (e.g. themed) window decoration + should use this flag. + + \printto cbBehaviorStays + If a toplevel widget has a parent it will not have a taskbar + entry, and on most window managers it will always stay on + top of the parent widget. This is the standard behavior for + dialog boxes, especially if they are modeless, and for other + secondary toplevel widgets. + + To provide a taskbar entry the widget must have no parent, + in which case we need to use the \c WGroupLeader flag to + prevent blocking through the modal main dialog. Applications + that can have multiple toplevel windows open simultaneously + should use this combination. + + \printto cbBehaviorPopup + A toplevel widget can stay on top of the whole desktop if the + window manager supports this functionality. + \footnote Unfortunately some X11 window managers also retquire the \c + WX11BypassWM flag to be set in addition; but some other X11 window + managers will have problems if this flag is set. \endfootnote + + Widgets that display important or realtime information (i.e. IRC + clients) might benefit from using that flag. + + \printto cbBehaviorModal + A popup widget is a short lived modal widget that closes + automatically. Popup menus are a typical example for such widgets. + + \printto cbBehaviorTool + A modal widget blocks input to other toplevel widgets, unless + those are in a different modal group (see \c WGroupLeader). + Dialogs are often modal, and the QDialog class provides an easy API + to create and display them without the need to explicitly use this + flag. + + \printto !widget + A tool window will never have a task bar entry (even if it + has no parent widget), and often has a smaller window + decoration. Tool windows are frequently used instead of + modeless dialogs. + + \printto else + The widget is created if it has not been created yet, or if it was + closed (since we use the \c WDestructiveClose flag). Note that the + window is not visible yet. + \footnote The example uses QGuardedPtr to make sure that the + pointer is reset to zero when the widget object is destroyed + due to the \c WDestructiveClose flag. \endfootnote + + \printto setCaption + If the widget has already been created the reparent() function is + used to modify the widget's flags. The widget's geometry is not + changed, and the window is not shown again. + + \printuntil show() + Finally the higher level properties such as the window's caption and + icon are set. The window transparency is set according to the slider + value. Note that this will only have effect on systems that support + this attribute for toplevel window. + + \printuntil } + Finally the window is shown with the new attributes. + + To build the example go to the toplevel directory + (\c QTDIR/examples/toplevel) + \footnote + We use \c QTDIR to stand for the directory where Qt is installed. + \endfootnote + and run \c qmake to generate the makefile, then use the make tool to + build the library. +*/ diff --git a/examples/toplevel/toplevel.pro b/examples/toplevel/toplevel.pro new file mode 100644 index 000000000..aad16cada --- /dev/null +++ b/examples/toplevel/toplevel.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +LANGUAGE = C++ + +CONFIG += qt warn_on release +unix { + UI_DIR = .ui + MOC_DIR = .moc + OBJECTS_DIR = .obj +} + +REQUIRES = full-config + +SOURCES += main.cpp +FORMS = options.ui diff --git a/examples/tux/tux.cpp b/examples/tux/tux.cpp new file mode 100644 index 000000000..e0d482b79 --- /dev/null +++ b/examples/tux/tux.cpp @@ -0,0 +1,71 @@ +#include <qapplication.h> +#include <qwidget.h> +#include <qimage.h> +#include <qpixmap.h> +#include <qbitmap.h> +#include <qfile.h> + +#include <stdlib.h> + +class MoveMe : public TQWidget +{ +public: + MoveMe( TQWidget *parent=0, const char *name=0, WFlags f = 0) + :TQWidget(parent,name, f) {} + +protected: + void mousePressEvent( TQMouseEvent *); + void mouseMoveEvent( TQMouseEvent *); +private: + TQPoint clickPos; +}; + +void MoveMe::mousePressEvent( TQMouseEvent *e ) +{ + clickPos = e->pos(); +} + +void MoveMe::mouseMoveEvent( TQMouseEvent *e ) +{ + move( e->globalPos() - clickPos ); +} + + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + TQString fn="tux.png"; + + if ( argc >= 2 ) + fn = argv[1]; + + if ( ! TQFile::exists( fn ) ) + exit( 1 ); + + TQImage img( fn ); + TQPixmap p; + p.convertFromImage( img ); + if ( !p.mask() ) + if ( img.hasAlphaBuffer() ) { + TQBitmap bm; + bm = img.createAlphaMask(); + p.setMask( bm ); + } else { + TQBitmap bm; + bm = img.createHeuristicMask(); + p.setMask( bm ); + } + MoveMe w(0,0,TQt::WStyle_Customize|TQt::WStyle_NoBorder); + w.setBackgroundPixmap( p ); + w.setFixedSize( p.size() ); + if ( p.mask() ) + w.setMask( *p.mask() ); + w.show(); + a.setMainWidget(&w); + + + return a.exec(); + +} diff --git a/examples/tux/tux.png b/examples/tux/tux.png Binary files differnew file mode 100644 index 000000000..384f5bb3c --- /dev/null +++ b/examples/tux/tux.png diff --git a/examples/tux/tux.pro b/examples/tux/tux.pro new file mode 100644 index 000000000..26842eb96 --- /dev/null +++ b/examples/tux/tux.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = tux + +CONFIG += qt warn_on release + +REQUIRES = small-config + +HEADERS = +SOURCES = tux.cpp +INTERFACES = diff --git a/examples/widgets/README b/examples/widgets/README new file mode 100644 index 000000000..a6c031b4b --- /dev/null +++ b/examples/widgets/README @@ -0,0 +1 @@ +Click the right mouse button + CTRL to identify a widget. diff --git a/examples/widgets/main.cpp b/examples/widgets/main.cpp new file mode 100644 index 000000000..a88dab434 --- /dev/null +++ b/examples/widgets/main.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include <qstylefactory.h> +#include "widgets.h" + +class MyWidgetView : public WidgetView +{ + int s; +public: + MyWidgetView( TQWidget *parent=0, const char *name=0 ) + :WidgetView(parent, name), s(0) + { + setToolBarsMovable( TRUE ); + } + + void button1Clicked() + { + TQStringList styles = TQStyleFactory::keys(); + + s = (++s)%styles.count(); + qApp->setStyle( styles[ s] ); + WidgetView::button1Clicked(); + } +}; + + +// +// Create and display our WidgetView. +// + +int main( int argc, char **argv ) +{ + TQApplication::setColorSpec( TQApplication::CustomColor ); + TQApplication a( argc, argv ); + + MyWidgetView* w = new MyWidgetView; + a.setMainWidget( w ); + + w->show(); + int res = a.exec(); + delete w; + return res; +} diff --git a/examples/widgets/qt.png b/examples/widgets/qt.png Binary files differnew file mode 100644 index 000000000..b3c4fa8fc --- /dev/null +++ b/examples/widgets/qt.png diff --git a/examples/widgets/trolltech.gif b/examples/widgets/trolltech.gif Binary files differnew file mode 100644 index 000000000..f674369ef --- /dev/null +++ b/examples/widgets/trolltech.gif diff --git a/examples/widgets/tt-logo.png b/examples/widgets/tt-logo.png Binary files differnew file mode 100644 index 000000000..786b3e578 --- /dev/null +++ b/examples/widgets/tt-logo.png diff --git a/examples/widgets/widgets.cpp b/examples/widgets/widgets.cpp new file mode 100644 index 000000000..10ce7ece0 --- /dev/null +++ b/examples/widgets/widgets.cpp @@ -0,0 +1,751 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qmessagebox.h> +#include <qpixmap.h> +#include <qlayout.h> +#include <qapplication.h> + +// Standard TQt widgets + +#include <qtoolbar.h> +#include <qmenubar.h> +#include <qpopupmenu.h> +#include <qbuttongroup.h> +#include <qcheckbox.h> +#include <qcombobox.h> +#include <qframe.h> +#include <qgroupbox.h> +#include <qlabel.h> +#include <qlcdnumber.h> +#include <qmultilineedit.h> +#include <qlineedit.h> +#include <qlistbox.h> +#include <qpushbutton.h> +#include <qradiobutton.h> +#include <qslider.h> +#include <qtooltip.h> +#include <qspinbox.h> +#include <qstatusbar.h> +#include <qwhatsthis.h> +#include <qtoolbutton.h> +#include <qvbox.h> +#include <qtabbar.h> +#include <qtabwidget.h> +#include <qwidgetstack.h> +#include <qprogressbar.h> +#include <qsplitter.h> +#include <qlistview.h> +#include <qheader.h> +#include <qtextbrowser.h> +#include <qfiledialog.h> +#include <qaccel.h> +#include <qmetaobject.h> +#include <qpainter.h> + +#include "widgets.h" + + +// Some sample widgets + +#include "../aclock/aclock.h" +#include "../dclock/dclock.h" + + +#define MOVIEFILENAME "trolltech.gif" + +#include "../application/fileopen.xpm" +#include "../application/filesave.xpm" +#include "../application/fileprint.xpm" + + +class MyWhatsThis : public TQWhatsThis +{ +public: + MyWhatsThis( TQListBox* lb) + : TQWhatsThis( lb ) { listbox = lb; }; + ~MyWhatsThis(){}; + + + TQString text( const TQPoint & p) { + TQListBoxItem* i = listbox->itemAt( p ); + if ( i && i->pixmap() ) { + return "Isn't that a <em>wonderful</em> pixmap? <br>" \ + "Imagine, you could even decorate a" \ + " <b>red</b> pushbutton with it! :-)"; + } + return "This is a TQListBox."; + } + +private: + TQListBox* listbox; +}; + + +class MyMenuItem : public TQCustomMenuItem +{ +public: + MyMenuItem( const TQString& s, const TQFont& f ) + : string( s ), font( f ){}; + ~MyMenuItem(){} + + void paint( TQPainter* p, const TQColorGroup& /*cg*/, bool /*act*/, + bool /*enabled*/, int x, int y, int w, int h ) + { + p->setFont ( font ); + p->drawText( x, y, w, h, + AlignAuto | AlignVCenter | ShowPrefix | DontClip, + string ); + } + + TQSize sizeHint() + { + return TQFontMetrics( font ).size( AlignAuto | AlignVCenter | + ShowPrefix | DontClip, string ); + } +private: + TQString string; + TQFont font; +}; + +// +// Construct the WidgetView with children +// + +WidgetView::WidgetView( TQWidget *parent, const char *name ) + : TQMainWindow( parent, name ) +{ + TQColor col; + + // Set the window caption/title + setCaption( "TQt Example - Widgets Demo Application" ); + + // create a toolbar + TQToolBar *tools = new TQToolBar( this, "toolbar" ); + + // put something in it + TQPixmap openIcon( fileopen ); + TQToolButton * toolb = new TQToolButton( openIcon, "toolbutton 1", + TQString::null, this, SLOT(open()), + tools, "open file" ); + TQWhatsThis::add( toolb, "This is a <b>TQToolButton</b>. It lives in a " + "TQToolBar. This particular button doesn't do anything " + "useful." ); + + TQPixmap saveIcon( filesave ); + toolb = new TQToolButton( saveIcon, "toolbutton 2", TQString::null, + this, SLOT(dummy()), + tools, "save file" ); + TQWhatsThis::add( toolb, "This is also a <b>TQToolButton</b>." ); + + TQPixmap printIcon( fileprint ); + toolb = new TQToolButton( printIcon, "toolbutton 3", TQString::null, + this, SLOT(dummy()), + tools, "print file" ); + TQWhatsThis::add( toolb, "This is the third <b>TQToolButton</b>."); + + toolb = TQWhatsThis::whatsThisButton( tools ); + TQWhatsThis::add( toolb, "This is a <b>What's This</b> button " + "It enables the user to ask for help " + "about widgets on the screen."); + + // Install an application-global event filter to catch control+leftbutton + qApp->installEventFilter( this ); + + //make a central widget to contain the other widgets + central = new TQWidget( this ); + setCentralWidget( central ); + + // Create a layout to position the widgets + TQHBoxLayout *topLayout = new TQHBoxLayout( central, 10 ); + + // Create a grid layout to hold most of the widgets + TQGridLayout *grid = new TQGridLayout( 0, 3 ); //3 wide and autodetect number of rows + topLayout->addLayout( grid, 1 ); + + // Create an easter egg + TQToolTip::add( menuBar(), TQRect( 0, 0, 2, 2 ), "easter egg" ); + + TQPopupMenu* popup; + popup = new TQPopupMenu( this ); + menuBar()->insertItem( "&File", popup ); + int id; + id = popup->insertItem( "&New" ); + popup->setItemEnabled( id, FALSE ); + id = popup->insertItem( openIcon, "&Open...", this, SLOT( open() ) ); + + popup->insertSeparator(); + popup->insertItem( "Quit", qApp, SLOT(tquit()), CTRL+Key_Q ); + + textStylePopup = popup = new TQPopupMenu( this ); + menuBar()->insertItem( "&Edit", popup ); + + plainStyleID = id = popup->insertItem( "&Plain" ); + popup->setAccel( CTRL+Key_T, id ); + + popup->insertSeparator(); + TQFont f = font(); + f.setBold( TRUE ); + id = popup->insertItem( new MyMenuItem( "&Bold", f ) ); + popup->setAccel( CTRL+Key_B, id ); + f = font(); + f.setItalic( TRUE ); + id = popup->insertItem( new MyMenuItem( "&Italic", f ) ); + popup->setItemChecked( id, TRUE ); + popup->setAccel( CTRL+Key_I, id ); + f = font(); + f.setUnderline( TRUE ); + id = popup->insertItem( new MyMenuItem( "&Underline", f ) ); + popup->setAccel( CTRL+Key_U, id ); + f = font(); + f.setStrikeOut( TRUE ); + id = popup->insertItem( new MyMenuItem( "&Strike", f ) ); + connect( textStylePopup, SIGNAL(activated(int)), + this, SLOT(popupSelected(int)) ); + + // Create an analog and a digital clock + AnalogClock *aclock = new AnalogClock( central ); + aclock->setAutoMask( TRUE ); + DigitalClock *dclock = new DigitalClock( central ); + dclock->setMaximumWidth(200); + grid->addWidget( aclock, 0, 2 ); + grid->addWidget( dclock, 1, 2 ); + + // Give the dclock widget a blue palette + col.setRgb( 0xaa, 0xbe, 0xff ); + dclock->setPalette( TQPalette( col ) ); + + // make tool tips for both of them + TQToolTip::add( aclock, "custom widget: analog clock" ); + TQToolTip::add( dclock, "custom widget: digital clock" ); + + // Create a push button. + TQPushButton *pb; + pb = new TQPushButton( "&Push button 1", central, "button1" ); + grid->addWidget( pb, 0, 0, AlignVCenter ); + connect( pb, SIGNAL(clicked()), SLOT(button1Clicked()) ); + TQToolTip::add( pb, "push button 1" ); + TQWhatsThis::add( pb, "This is a <b>TQPushButton</b>.<br>" + "Click it and watch...<br>" + "The wonders of modern technology."); + + TQPixmap pm; + bool pix = pm.load("qt.png"); + if ( !pix ) { + TQMessageBox::information( 0, "TQt Widgets Example", + "Could not load the file \"qt.png\", which\n" + "contains an icon used...\n\n" + "The text \"line 42\" will be substituted.", + TQMessageBox::Ok + TQMessageBox::Default ); + } + + // Create a label containing a TQMovie + movie = TQMovie( MOVIEFILENAME ); + movielabel = new TQLabel( central, "label0" ); + movie.connectStatus(this, SLOT(movieStatus(int))); + movie.connectUpdate(this, SLOT(movieUpdate(const TQRect&))); + movielabel->setFrameStyle( TQFrame::Box | TQFrame::Plain ); + movielabel->setMovie( movie ); + movielabel->setFixedSize( 128+movielabel->frameWidth()*2, + 64+movielabel->frameWidth()*2 ); + grid->addWidget( movielabel, 0, 1, AlignCenter ); + TQToolTip::add( movielabel, "movie" ); + TQWhatsThis::add( movielabel, "This is a <b>TQLabel</b> " + "that contains a TQMovie." ); + + // Create a group of check boxes + bg = new TQButtonGroup( central, "checkGroup" ); + bg->setTitle( "Check Boxes" ); + grid->addWidget( bg, 1, 0 ); + + // Create a layout for the check boxes + TQVBoxLayout *vbox = new TQVBoxLayout(bg, 10); + + vbox->addSpacing( bg->fontMetrics().height() ); + + cb[0] = new TQCheckBox( bg ); + cb[0]->setText( "&Read" ); + vbox->addWidget( cb[0] ); + cb[1] = new TQCheckBox( bg ); + cb[1]->setText( "&Write" ); + vbox->addWidget( cb[1] ); + cb[2] = new TQCheckBox( bg ); + cb[2]->setText( "&Execute" ); + vbox->addWidget( cb[2] ); + + connect( bg, SIGNAL(clicked(int)), SLOT(checkBoxClicked(int)) ); + + TQToolTip::add( cb[0], "check box 1" ); + TQToolTip::add( cb[1], "check box 2" ); + TQToolTip::add( cb[2], "check box 3" ); + + // Create a group of radio buttons + TQRadioButton *rb; + bg = new TQButtonGroup( central, "radioGroup" ); + bg->setTitle( "Radio buttons" ); + + grid->addWidget( bg, 1, 1 ); + + // Create a layout for the radio buttons + vbox = new TQVBoxLayout(bg, 10); + + vbox->addSpacing( bg->fontMetrics().height() ); + rb = new TQRadioButton( bg ); + rb->setText( "&AM" ); + rb->setChecked( TRUE ); + vbox->addWidget(rb); + TQToolTip::add( rb, "radio button 1" ); + rb = new TQRadioButton( bg ); + rb->setText( "F&M" ); + vbox->addWidget(rb); + TQToolTip::add( rb, "radio button 2" ); + rb = new TQRadioButton( bg ); + rb->setText( "&Short Wave" ); + vbox->addWidget(rb); + + connect( bg, SIGNAL(clicked(int)), SLOT(radioButtonClicked(int)) ); + TQToolTip::add( rb, "radio button 3" ); + + // Create a list box + TQListBox *lb = new TQListBox( central, "listBox" ); + for ( int i=0; i<100; i++ ) { // fill list box + TQString str; + str.sprintf( "line %d", i ); + if ( i == 42 && pix ) + lb->insertItem( pm ); + else + lb->insertItem( str ); + } + grid->addMultiCellWidget( lb, 2, 4, 0, 0 ); + connect( lb, SIGNAL(selected(int)), SLOT(listBoxItemSelected(int)) ); + TQToolTip::add( lb, "list box" ); + (void)new MyWhatsThis( lb ); + + vbox = new TQVBoxLayout(8); + grid->addLayout( vbox, 2, 1 ); + + // Create a slider + TQSlider *sb = new TQSlider( 0, 300, 30, 100, TQSlider::Horizontal, + central, "Slider" ); + sb->setTickmarks( TQSlider::Below ); + sb->setTickInterval( 10 ); + sb->setFocusPolicy( TQWidget::TabFocus ); + vbox->addWidget( sb ); + + connect( sb, SIGNAL(valueChanged(int)), SLOT(sliderValueChanged(int)) ); + TQToolTip::add( sb, "slider" ); + TQWhatsThis::add( sb, "This is a <b>TQSlider</b>. " + "The tick marks are optional." + " This slider controls the speed of the movie." ); + // Create a combo box + TQComboBox *combo = new TQComboBox( FALSE, central, "comboBox" ); + combo->insertItem( "darkBlue" ); + combo->insertItem( "darkRed" ); + combo->insertItem( "darkGreen" ); + combo->insertItem( "blue" ); + combo->insertItem( "red" ); + vbox->addWidget( combo ); + connect( combo, SIGNAL(activated(int)), + this, SLOT(comboBoxItemActivated(int)) ); + TQToolTip::add( combo, "read-only combo box" ); + + // Create an editable combo box + TQComboBox *edCombo = new TQComboBox( TRUE, central, "edComboBox" ); + TQListBox *edComboLst = new TQListBox(this); + edCombo->setListBox(edComboLst); + edComboLst->insertItem( "Permutable" ); + edComboLst->insertItem( "Malleable" ); + edComboLst->insertItem( "Adaptable" ); + edComboLst->insertItem( "Alterable" ); + edComboLst->insertItem( "Inconstant" ); + vbox->addWidget( edCombo ); + connect( edCombo, SIGNAL(activated(const TQString&)), + this, SLOT(edComboBoxItemActivated(const TQString&)) ); + TQToolTip::add( edCombo, "editable combo box" ); + + edCombo->setAutoCompletion( TRUE ); + + vbox = new TQVBoxLayout(8); + grid->addLayout( vbox, 2, 2 ); + + // Create a spin box + TQSpinBox *spin = new TQSpinBox( 0, 10, 1, central, "spin" ); + spin->setSuffix(" mm"); + spin->setSpecialValueText( "Auto" ); + connect( spin, SIGNAL( valueChanged(const TQString&) ), + SLOT( spinBoxValueChanged(const TQString&) ) ); + TQToolTip::add( spin, "spin box" ); + TQWhatsThis::add( spin, "This is a <b>TQSpinBox</b>. " + "You can chose values in a given range " + "either by using the arrow buttons " + "or by typing them in." ); + vbox->addWidget( spin ); + + vbox->addStretch( 1 ); + + // Create a tabwidget that switches between multi line edits + tabs = new TQTabWidget( central ); + //tabs->setTabPosition( TQTabWidget::Bottom ); + tabs->setMargin( 4 ); + grid->addMultiCellWidget( tabs, 3, 3, 1, 2 ); + TQMultiLineEdit *mle = new TQMultiLineEdit( tabs, "multiLineEdit" ); + edit = mle; + mle->setWordWrap( TQMultiLineEdit::WidgetWidth ); + mle->setText("This is a TQMultiLineEdit widget, " + "useful for small multi-line " + "input fields."); + TQToolTip::add( mle, "multi line editor" ); + + tabs->addTab( mle, "F&irst"); + + mle = new TQMultiLineEdit( tabs, "multiLineEdit" ); + TQString mleText = "This is another TQMultiLineEdit widget."; +#if 1 + mleText += "\n"; + mleText += "Japanese: "; + mleText += TQChar((ushort)0x6a38); // Kanji + mleText += "\n"; + mleText += "Russian: "; + mleText += TQChar((ushort)0x042e); // Cyrillic + mleText += "\n"; + mleText += "Norwegian: "; + mleText += TQChar((ushort)0x00d8); // Norwegian + mleText += "\n"; + mleText += "Unicode (black square): "; + mleText += TQChar((ushort)0x25A0); // BLACK STQUARE + mleText += "\n"; +#endif + mle->setText( mleText ); + TQToolTip::add( mle, "second multi line editor" ); + tabs->addTab( mle, "Se&cond"); + + + // Create a single line edit + TQLineEdit *le = new TQLineEdit( central, "lineEdit" ); + + + grid->addMultiCellWidget( le, 4, 4, 1, 2 ); + connect( le, SIGNAL(textChanged(const TQString&)), + SLOT(lineEditTextChanged(const TQString&)) ); + TQToolTip::add( le, "single line editor" ); + TQWhatsThis::add( le, "This is a <b>TQLineEdit</b>, you can enter a " + "single line of text in it. " + "It also it accepts text drops." ); + + grid->setRowStretch(0,0); + grid->setRowStretch(1,0); + grid->setRowStretch(2,0); + grid->setRowStretch(3,1); + grid->setRowStretch(4,0); + + grid->setColStretch(0,1); + grid->setColStretch(1,1); + grid->setColStretch(2,1); + + + TQSplitter *split = new TQSplitter( Vertical, central, "splitter" ); + split->setOpaqueResize( TRUE ); + topLayout->addWidget( split, 1 ); + TQListView *lv = new MyListView( split ); + connect(lv, SIGNAL(selectionChanged() ), + this, SLOT( selectionChanged() ) ); + connect(lv, SIGNAL(selectionChanged(TQListViewItem*) ), + this, SLOT( selectionChanged(TQListViewItem*) ) ); + connect(lv, SIGNAL(clicked(TQListViewItem*) ), + this, SLOT( clicked(TQListViewItem*) ) ); + connect(lv, SIGNAL(mySelectionChanged(TQListViewItem*) ), + this, SLOT( mySelectionChanged(TQListViewItem*) ) ); + lv->addColumn( "One" ); + lv->addColumn( "Two" ); + lv->setAllColumnsShowFocus( TRUE ); + + TQListViewItem *lvi= new TQListViewItem( lv, "Text", "Text" ); + lvi= new TQListViewItem( lv, "Text", "Other Text" ); + lvi= new TQListViewItem( lv, "Text", "More Text" ); + lvi= new TQListViewItem( lv, "Text", "Extra Text" ); + lvi->setOpen(TRUE); + (void)new TQListViewItem( lvi, "SubText", "Additional Text" ); + lvi= new TQListViewItem( lvi, "SubText", "Side Text" ); + lvi= new TQListViewItem( lvi, "SubSubText", "Complimentary Text" ); + + TQToolTip::add( lv, "list view" ); + TQWhatsThis::add( lv, "This is a <b>TQListView</b>, you can display lists " + "(or outline lists) of multiple-column data in it." ); + + lv = new TQListView( split ); + lv->addColumn( "Choices" ); + (void) new TQCheckListItem( lv, "Onion", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Artichoke", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Pepper", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Habaneros", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Pineapple", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Ham", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Pepperoni", TQCheckListItem::CheckBox ); + (void) new TQCheckListItem( lv, "Garlic", TQCheckListItem::CheckBox ); + + + TQCheckListItem *lit = new TQCheckListItem( lv, "Cheese" ); + lit->setOpen( TRUE ); + (void) new TQCheckListItem( lit, "Cheddar", TQCheckListItem::RadioButton ); + (void) new TQCheckListItem( lit, "Mozarella", TQCheckListItem::RadioButton ); + (void) new TQCheckListItem( lit, "Jarlsberg", TQCheckListItem::RadioButton ); + + TQToolTip::add( lv, "list view" ); + TQWhatsThis::add( lv, "This is also a <b>TQListView</b>, with " + "interactive items." ); + + TQTextBrowser *browser = new TQTextBrowser( split ); + browser->setText( "<h1>TQTextBrowser</h1>" + "<p>TQt supports formatted rich text, such " + "as the heading above, <em>emphasized</em> and " + "<b>bold</b> text, via an XML subset.</p> " + "<p><a href=\"nogo://some.where.com\">Hypertext navigation</a> and style sheets are supported.</p>", "" ); + browser->setFont(TQFont("Charter",11)); + browser->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); + connect( browser, SIGNAL(linkClicked(const TQString&)), browser, SLOT(setText(const TQString&)) ); + + // Create an label and a message in the status bar + // The message is updated when buttons are clicked etc. + msg = new TQLabel( statusBar(), "message" ); + msg->setAlignment( AlignCenter ); + TQFont boldfont; boldfont.setWeight(TQFont::Bold); + msg->setFont( boldfont ); + statusBar()->addWidget( msg, 4 ); + TQToolTip::add( msg, "Message area" ); + + TQAccel* a = new TQAccel( this ); + a->connectItem( a->insertItem( Key_F9 ), + this, SLOT( showProperties() ) ); + + prog = new TQProgressBar( statusBar(), "progress" ); + prog->setTotalSteps( 100 ); + progress = 64; + prog->setProgress( progress ); + statusBar()->addWidget( prog , 1 ); + TQWhatsThis::add( prog, "This is a <b>TQProgressBar</b> " + "You can use it to show that a lengthy " + " process is progressing. " + "In this program, nothing much seems to happen." ); + statusBar()->message( "Welcome to TQt", 2000 ); +} + +void WidgetView::setStatus(const TQString& text) +{ + msg->setText(text); +} + +void WidgetView::button1Clicked() +{ + msg->setText( "The push button was clicked" ); + prog->setProgress( ++progress ); +} + + +void WidgetView::movieUpdate( const TQRect& ) +{ + // Uncomment this to test animated icons on your window manager + //setIcon( movie.framePixmap() ); +} + +void WidgetView::movieStatus( int s ) +{ + switch ( s ) { + case TQMovie::SourceEmpty: + case TQMovie::UnrecognizedFormat: + { + TQPixmap pm("tt-logo.png"); + movielabel->setPixmap(pm); + movielabel->setFixedSize(pm.size()); + } + break; + default: + if ( movielabel->movie() ) // for flicker-free animation: + movielabel->setBackgroundMode( NoBackground ); + } +} + + +void WidgetView::popupSelected( int selectedId ) +{ + if ( selectedId == plainStyleID ) { + for ( int i = 0; i < int(textStylePopup->count()); i++ ) { + int id = textStylePopup->idAt( i ); + textStylePopup->setItemChecked( id, FALSE); + } + } else { + textStylePopup->setItemChecked( selectedId, TRUE ); + } +} + +void WidgetView::checkBoxClicked( int id ) +{ + TQString str; + str = tr("Check box %1 clicked : ").arg(id); + TQString chk = "---"; + if ( cb[0]->isChecked() ) + chk[0] = 'r'; + if ( cb[1]->isChecked() ) + chk[1] = 'w'; + if ( cb[2]->isChecked() ) + chk[2] = 'x'; + str += chk; + msg->setText( str ); +} + + +void WidgetView::edComboBoxItemActivated( const TQString& text) +{ + TQString str = tr("Editable Combo Box set to "); + str += text; + msg->setText( str ); +} + + +void WidgetView::radioButtonClicked( int id ) +{ + msg->setText( tr("Radio button #%1 clicked").arg(id) ); +} + + +void WidgetView::listBoxItemSelected( int index ) +{ + msg->setText( tr("List box item %1 selected").arg(index) ); +} + + +void WidgetView::sliderValueChanged( int value ) +{ + msg->setText( tr("Movie set to %1% of normal speed").arg(value) ); + movie.setSpeed( value ); +} + + +void WidgetView::comboBoxItemActivated( int index ) +{ + msg->setText( tr("Combo box item %1 activated").arg(index) ); + switch ( index ) { + default: + case 0: + TQApplication::setWinStyleHighlightColor( darkBlue ); + break; + case 1: + TQApplication::setWinStyleHighlightColor( darkRed ); + break; + case 2: + TQApplication::setWinStyleHighlightColor( darkGreen ); + break; + case 3: + TQApplication::setWinStyleHighlightColor( blue ); + break; + case 4: + TQApplication::setWinStyleHighlightColor( red ); + break; + } +} + + + +void WidgetView::lineEditTextChanged( const TQString& newText ) +{ + TQString str( "Line edit text: "); + str += newText; + if ( newText.length() == 1 ) { + TQString u; + u.sprintf(" (U%02x%02x)", newText[0].row(), newText[0].cell() ); + str += u; + } + msg->setText( str ); +} + + +void WidgetView::spinBoxValueChanged( const TQString& valueText ) +{ + TQString str( "Spin box value: " ); + str += valueText; + msg->setText( str ); +} + +// +// All application events are passed through this event filter. +// We're using it to display some information about a clicked +// widget (right mouse button + CTRL). +// + +bool WidgetView::eventFilter( TQObject *obj, TQEvent *event ) +{ + static bool identify_now = TRUE; + if ( event->type() == TQEvent::MouseButtonPress && identify_now ) { + TQMouseEvent *e = (TQMouseEvent*)event; + if ( e->button() == TQMouseEvent::RightButton && + (e->state() & TQMouseEvent::ControlButton) != 0 ){ + TQString str = "The clicked widget is a\n"; + str += obj->className(); + str += "\nThe widget's name is\n"; + if ( obj->name() ) + str += obj->name(); + else + str += "<no name>"; + identify_now = FALSE; // don't do it in message box + TQMessageBox::information( (TQWidget*)obj, "Identify Widget", str ); + identify_now = TRUE; // allow it again + } + } + return TQMainWindow::eventFilter( obj, event ); // don't eat event +} + + +void WidgetView::open() +{ + TQFileDialog::getOpenFileName( TQString::null, "Textfiles (*.txt)", this ); +} + + +void WidgetView::dummy() +{ + TQMessageBox::information( this, "Sorry", + "This function is not implemented" ); +} + +void WidgetView::selectionChanged() +{ + //qDebug("selectionChanged"); +} +void WidgetView::selectionChanged( TQListViewItem* /*item*/) +{ + //qDebug("selectionChanged %p", item ); +} + +void WidgetView::clicked( TQListViewItem* /*item*/ ) +{ + //qDebug("clicked %p", item ); +} + +void WidgetView::mySelectionChanged( TQListViewItem* /*item*/ ) +{ + //qDebug("mySelectionChanged %p", item ); +} + +void WidgetView::showProperties() +{ + if ( !qApp->focusWidget() ) + return; + TQCString output; + output.sprintf( "Properties for class '%s'", + qApp->focusWidget()->className() ); + int i = 0; + while( i < (int) qApp->focusWidget()->metaObject()->numProperties( TRUE ) ) { + const TQMetaProperty* p + = qApp->focusWidget()->metaObject()->property( i, TRUE ); + TQCString tmp; + tmp.sprintf( "\n %2d: %s (read-%s, %s)", ++i, p->name(), + p->writable() ? "write" : "only", p->type() ); + output += tmp; + } + qDebug( output ); +} diff --git a/examples/widgets/widgets.doc b/examples/widgets/widgets.doc new file mode 100644 index 000000000..8bdc6100b --- /dev/null +++ b/examples/widgets/widgets.doc @@ -0,0 +1,15 @@ +/*! \page widgets-example.html + + \ingroup examples + \title Widgets Example + + This example shows most of Qt's widgets in action. It is similar + to the demo example in \c{$QTDIR/examples/demo}. + + Run the program, then click the right mouse button + Ctrl to + identify a widget. + + See \c{$QTDIR/examples/widgets} for the source code. + +*/ + diff --git a/examples/widgets/widgets.h b/examples/widgets/widgets.h new file mode 100644 index 000000000..628068f87 --- /dev/null +++ b/examples/widgets/widgets.h @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Definition of something or other +** +** Created : 979899 +** +** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef WIDGETS_H +#define WIDGETS_H + +#include <qmainwindow.h> +#include <qmovie.h> +#include <qlistview.h> +class TQLabel; +class TQCheckBox; +class TQProgressBar; +class TQTabWidget; +class TQGroupBox; +class TQMultiLineEdit; +class TQPopupMenu; + +class MyListView : public TQListView +{ + Q_OBJECT +public: + MyListView( TQWidget * parent = 0, const char *name = 0 ) + : TQListView( parent, name ), selected(0) + {} + ~MyListView() + {} +protected: + + void contentsMousePressEvent( TQMouseEvent * e ) + { + selected = selectedItem(); + TQListView::contentsMousePressEvent( e ); + } + void contentsMouseReleaseEvent( TQMouseEvent * e ) + { + TQListView::contentsMouseReleaseEvent( e ); + if ( selectedItem() != selected ) { + emit mySelectionChanged( selectedItem() ); + emit mySelectionChanged(); + } + } + +signals: + void mySelectionChanged(); + void mySelectionChanged( TQListViewItem* ); + +private: + TQListViewItem* selected; + +}; +// +// WidgetView contains lots of TQt widgets. +// + +class WidgetView : public TQMainWindow +{ + Q_OBJECT +public: + WidgetView( TQWidget *parent=0, const char *name=0 ); + +public slots: + void setStatus(const TQString&); + void selectionChanged(); + void selectionChanged( TQListViewItem* ); + void clicked( TQListViewItem* ); + void mySelectionChanged( TQListViewItem* ); + +protected slots: + virtual void button1Clicked(); +private slots: + void checkBoxClicked( int ); + void radioButtonClicked( int ); + void sliderValueChanged( int ); + void listBoxItemSelected( int ); + void comboBoxItemActivated( int ); + void edComboBoxItemActivated( const TQString& ); + void lineEditTextChanged( const TQString& ); + void movieStatus( int ); + void movieUpdate( const TQRect& ); + void spinBoxValueChanged( const TQString& ); + void popupSelected( int ); + + void open(); + void dummy(); + void showProperties(); + +private: + bool eventFilter( TQObject *, TQEvent * ); + TQLabel *msg; + TQCheckBox *cb[3]; + TQGroupBox* bg; + TQLabel *movielabel; + TQMovie movie; + TQWidget *central; + TQProgressBar *prog; + int progress; + TQTabWidget* tabs; + TQMultiLineEdit* edit; + TQPopupMenu *textStylePopup; + int plainStyleID; + TQWidget* bla; +}; + +#endif diff --git a/examples/widgets/widgets.pro b/examples/widgets/widgets.pro new file mode 100644 index 000000000..3fde67503 --- /dev/null +++ b/examples/widgets/widgets.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = widgets + +CONFIG += qt warn_on release +DEPENDPATH = ../../include +INCLUDEPATH += ../aclock ../dclock + +REQUIRES = full-config + +HEADERS = widgets.h ../aclock/aclock.h ../dclock/dclock.h +SOURCES = main.cpp widgets.cpp ../aclock/aclock.cpp ../dclock/dclock.cpp diff --git a/examples/wizard/main.cpp b/examples/wizard/main.cpp new file mode 100644 index 000000000..b7e4406dc --- /dev/null +++ b/examples/wizard/main.cpp @@ -0,0 +1,20 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "wizard.h" +#include <qapplication.h> + +int main(int argc,char **argv) +{ + TQApplication a(argc,argv); + + Wizard wizard; + wizard.setCaption("TQt Example - Wizard"); + return wizard.exec(); +} diff --git a/examples/wizard/wizard.cpp b/examples/wizard/wizard.cpp new file mode 100644 index 000000000..9440ab718 --- /dev/null +++ b/examples/wizard/wizard.cpp @@ -0,0 +1,226 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "wizard.h" + +#include <qwidget.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qlabel.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include <qvalidator.h> +#include <qapplication.h> + +Wizard::Wizard( TQWidget *parent, const char *name ) + : TQWizard( parent, name, TRUE ) +{ + setupPage1(); + setupPage2(); + setupPage3(); + + key->setFocus(); +} + +void Wizard::setupPage1() +{ + page1 = new TQHBox( this ); + page1->setSpacing(8); + + TQLabel *info = new TQLabel( page1 ); + info->setMargin( 11 ); + info->setPalette( yellow ); + info->setText( "Enter your personal\n" + "key here.\n\n" + "Your personal key\n" + "consists of 4 digits" ); + info->setMaximumWidth( info->sizeHint().width() ); + + TQVBox *page = new TQVBox( page1 ); + + TQHBox *row1 = new TQHBox( page ); + + (void)new TQLabel( "Key:", row1 ); + + key = new TQLineEdit( row1 ); + key->setMaxLength( 4 ); + key->setValidator( new TQIntValidator( 1000, 9999, key ) ); + + connect( key, SIGNAL( textChanged( const TQString & ) ), + this, SLOT( keyChanged( const TQString & ) ) ); + + addPage( page1, "Personal Key" ); + + setNextEnabled( page1, FALSE ); + setHelpEnabled( page1, FALSE ); +} + +void Wizard::setupPage2() +{ + page2 = new TQHBox( this ); + page2->setSpacing(8); + + TQLabel *info = new TQLabel( page2 ); + info->setMargin( 11 ); + info->setPalette( yellow ); + info->setText( "\n" + "Enter your personal\n" + "data here.\n\n" + "The retquired fields are\n" + "First Name, Last Name \n" + "and E-Mail.\n" ); + info->setMaximumWidth( info->sizeHint().width() ); + + TQVBox *page = new TQVBox( page2 ); + + TQHBox *row1 = new TQHBox( page ); + TQHBox *row2 = new TQHBox( page ); + TQHBox *row3 = new TQHBox( page ); + TQHBox *row4 = new TQHBox( page ); + TQHBox *row5 = new TQHBox( page ); + + TQLabel *label1 = new TQLabel( " First Name: ", row1 ); + label1->setAlignment( TQt::AlignVCenter ); + TQLabel *label2 = new TQLabel( " Last Name: ", row2 ); + label2->setAlignment( TQt::AlignVCenter ); + TQLabel *label3 = new TQLabel( " Address: ", row3 ); + label3->setAlignment( TQt::AlignVCenter ); + TQLabel *label4 = new TQLabel( " Phone Number: ", row4 ); + label4->setAlignment( TQt::AlignVCenter ); + TQLabel *label5 = new TQLabel( " E-Mail: ", row5 ); + label5->setAlignment( TQt::AlignVCenter ); + + label1->setMinimumWidth( label4->sizeHint().width() ); + label2->setMinimumWidth( label4->sizeHint().width() ); + label3->setMinimumWidth( label4->sizeHint().width() ); + label4->setMinimumWidth( label4->sizeHint().width() ); + label5->setMinimumWidth( label4->sizeHint().width() ); + + firstName = new TQLineEdit( row1 ); + lastName = new TQLineEdit( row2 ); + address = new TQLineEdit( row3 ); + phone = new TQLineEdit( row4 ); + email = new TQLineEdit( row5 ); + + connect( firstName, SIGNAL( textChanged( const TQString & ) ), + this, SLOT( dataChanged( const TQString & ) ) ); + connect( lastName, SIGNAL( textChanged( const TQString & ) ), + this, SLOT( dataChanged( const TQString & ) ) ); + connect( email, SIGNAL( textChanged( const TQString & ) ), + this, SLOT( dataChanged( const TQString & ) ) ); + + addPage( page2, "Personal Data" ); + + setHelpEnabled( page2, FALSE ); +} + +void Wizard::setupPage3() +{ + page3 = new TQHBox( this ); + page3->setSpacing(8); + + TQLabel *info = new TQLabel( page3 ); + info->setPalette( yellow ); + info->setText( "\n" + "Look here to see of\n" + "the data you entered\n" + "is correct. To confirm,\n" + "press the [Finish] button\n" + "else go back to correct\n" + "mistakes." ); + info->setMargin( 11 ); + info->setAlignment( AlignTop|AlignLeft ); + info->setMaximumWidth( info->sizeHint().width() ); + + TQVBox *page = new TQVBox( page3 ); + + TQHBox *row1 = new TQHBox( page ); + TQHBox *row2 = new TQHBox( page ); + TQHBox *row3 = new TQHBox( page ); + TQHBox *row4 = new TQHBox( page ); + TQHBox *row5 = new TQHBox( page ); + TQHBox *row6 = new TQHBox( page ); + + TQLabel *label1 = new TQLabel( " Personal Key: ", row1 ); + label1->setAlignment( TQt::AlignVCenter ); + TQLabel *label2 = new TQLabel( " First Name: ", row2 ); + label2->setAlignment( TQt::AlignVCenter ); + TQLabel *label3 = new TQLabel( " Last Name: ", row3 ); + label3->setAlignment( TQt::AlignVCenter ); + TQLabel *label4 = new TQLabel( " Address: ", row4 ); + label4->setAlignment( TQt::AlignVCenter ); + TQLabel *label5 = new TQLabel( " Phone Number: ", row5 ); + label5->setAlignment( TQt::AlignVCenter ); + TQLabel *label6 = new TQLabel( " E-Mail: ", row6 ); + label6->setAlignment( TQt::AlignVCenter ); + + label1->setMinimumWidth( label1->sizeHint().width() ); + label2->setMinimumWidth( label1->sizeHint().width() ); + label3->setMinimumWidth( label1->sizeHint().width() ); + label4->setMinimumWidth( label1->sizeHint().width() ); + label5->setMinimumWidth( label1->sizeHint().width() ); + label6->setMinimumWidth( label1->sizeHint().width() ); + + lKey = new TQLabel( row1 ); + lFirstName = new TQLabel( row2 ); + lLastName = new TQLabel( row3 ); + lAddress = new TQLabel( row4 ); + lPhone = new TQLabel( row5 ); + lEmail = new TQLabel( row6 ); + + addPage( page3, "Finish" ); + + setFinishEnabled( page3, TRUE ); + setHelpEnabled( page3, FALSE ); +} + +void Wizard::showPage( TQWidget* page ) +{ + if ( page == page1 ) { + } else if ( page == page2 ) { + } else if ( page == page3 ) { + lKey->setText( key->text() ); + lFirstName->setText( firstName->text() ); + lLastName->setText( lastName->text() ); + lAddress->setText( address->text() ); + lPhone->setText( phone->text() ); + lEmail->setText( email->text() ); + } + + TQWizard::showPage(page); + + if ( page == page1 ) { + keyChanged( key->text() ); + key->setFocus(); + } else if ( page == page2 ) { + dataChanged( firstName->text() ); + firstName->setFocus(); + } else if ( page == page3 ) { + finishButton()->setEnabled( TRUE ); + finishButton()->setFocus(); + } +} + +void Wizard::keyChanged( const TQString &text ) +{ + TQString t = text; + int p = 0; + bool on = ( key->validator()->validate(t, p) == TQValidator::Acceptable ); + nextButton()->setEnabled( on ); +} + +void Wizard::dataChanged( const TQString & ) +{ + if ( !firstName->text().isEmpty() && + !lastName->text().isEmpty() && + !email->text().isEmpty() ) + nextButton()->setEnabled( TRUE ); + else + nextButton()->setEnabled( FALSE ); +} diff --git a/examples/wizard/wizard.doc b/examples/wizard/wizard.doc new file mode 100644 index 000000000..581e1b73a --- /dev/null +++ b/examples/wizard/wizard.doc @@ -0,0 +1,29 @@ +/* +*/ +/*! \page wizard-example.html + + \ingroup examples + \title Wizard + + This example shows the usage of Qt's wizard class. A wizard + should be used to help a user with complicated actions. + + <hr> + + Header file: + + \include wizard/wizard.h + + <hr> + + Implementation: + + \include wizard/wizard.cpp + + <hr> + + Main: + + \include wizard/main.cpp +*/ + diff --git a/examples/wizard/wizard.h b/examples/wizard/wizard.h new file mode 100644 index 000000000..f97a01fdf --- /dev/null +++ b/examples/wizard/wizard.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef WIZARD_H +#define WIZARD_H + +#include <qwizard.h> + +class TQWidget; +class TQHBox; +class TQLineEdit; +class TQLabel; + +class Wizard : public TQWizard +{ + Q_OBJECT + +public: + Wizard( TQWidget *parent = 0, const char *name = 0 ); + + void showPage(TQWidget* page); + +protected: + void setupPage1(); + void setupPage2(); + void setupPage3(); + + TQHBox *page1, *page2, *page3; + TQLineEdit *key, *firstName, *lastName, *address, *phone, *email; + TQLabel *lKey, *lFirstName, *lLastName, *lAddress, *lPhone, *lEmail; + +protected slots: + void keyChanged( const TQString & ); + void dataChanged( const TQString & ); + +}; + +#endif diff --git a/examples/wizard/wizard.pro b/examples/wizard/wizard.pro new file mode 100644 index 000000000..0a85036a1 --- /dev/null +++ b/examples/wizard/wizard.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = wizard + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = wizard.h +SOURCES = main.cpp \ + wizard.cpp diff --git a/examples/xform/README b/examples/xform/README new file mode 100644 index 000000000..6b2f48d4d --- /dev/null +++ b/examples/xform/README @@ -0,0 +1 @@ +The xform program demonstrates rotation/shearing of text and pixmaps. diff --git a/examples/xform/aticatac.cpp b/examples/xform/aticatac.cpp Binary files differnew file mode 100644 index 000000000..515127743 --- /dev/null +++ b/examples/xform/aticatac.cpp diff --git a/examples/xform/image.any b/examples/xform/image.any Binary files differnew file mode 100644 index 000000000..2f47f4cb2 --- /dev/null +++ b/examples/xform/image.any diff --git a/examples/xform/picture.any b/examples/xform/picture.any Binary files differnew file mode 100644 index 000000000..d9cf7f22a --- /dev/null +++ b/examples/xform/picture.any diff --git a/examples/xform/xform.cpp b/examples/xform/xform.cpp new file mode 100644 index 000000000..dfe351946 --- /dev/null +++ b/examples/xform/xform.cpp @@ -0,0 +1,507 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> + +#include <qdialog.h> +#include <qlabel.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include <qcheckbox.h> +#include <qradiobutton.h> +#include <qbuttongroup.h> +#include <qlcdnumber.h> +#include <qslider.h> +#include <qmenubar.h> +#include <qfontdialog.h> +#include <qlayout.h> +#include <qvbox.h> +#include <qwidgetstack.h> + +#include <qpainter.h> +#include <qpixmap.h> +#include <qpicture.h> + +#include <stdlib.h> + + +class ModeNames { +public: + enum Mode { Text, Image, Picture }; +}; + + +class XFormControl : public TQVBox, public ModeNames +{ + Q_OBJECT +public: + XFormControl( const TQFont &initialFont, TQWidget *parent=0, const char *name=0 ); + ~XFormControl() {} + + TQWMatrix matrix(); + +signals: + void newMatrix( TQWMatrix ); + void newText( const TQString& ); + void newFont( const TQFont & ); + void newMode( int ); +private slots: + void newMtx(); + void newTxt(const TQString&); + void selectFont(); + void fontSelected( const TQFont & ); + void changeMode(int); + void timerEvent(TQTimerEvent*); +private: + Mode mode; + TQSlider *rotS; // Rotation angle scroll bar + TQSlider *shearS; // Shear value scroll bar + TQSlider *magS; // Magnification value scroll bar + TQLCDNumber *rotLCD; // Rotation angle LCD display + TQLCDNumber *shearLCD; // Shear value LCD display + TQLCDNumber *magLCD; // Magnification value LCD display + TQCheckBox *mirror; // Checkbox for mirror image on/of + TQWidgetStack* optionals; + TQLineEdit *textEd; // Inp[ut field for xForm text + TQPushButton *fpb; // Select font push button + TQRadioButton *rb_txt; // Radio button for text + TQRadioButton *rb_img; // Radio button for image + TQRadioButton *rb_pic; // Radio button for picture + TQFont currentFont; +}; + +/* + ShowXForm displays a text or a pixmap (TQPixmap) using a coordinate + transformation matrix (TQWMatrix) +*/ + +class ShowXForm : public TQWidget, public ModeNames +{ + Q_OBJECT +public: + ShowXForm( const TQFont &f, TQWidget *parent=0, const char *name=0 ); + ~ShowXForm() {} + void showIt(); // (Re)displays text or pixmap + + Mode mode() const { return m; } +public slots: + void setText( const TQString& ); + void setMatrix( TQWMatrix ); + void setFont( const TQFont &f ); + void setPixmap( TQPixmap ); + void setPicture( const TQPicture& ); + void setMode( int ); +private: + TQSizePolicy sizePolicy() const; + TQSize sizeHint() const; + void paintEvent( TQPaintEvent * ); + void resizeEvent( TQResizeEvent * ); + TQWMatrix mtx; // coordinate transform matrix + TQString text; // text to be displayed + TQPixmap pix; // pixmap to be displayed + TQPicture picture; // text to be displayed + TQRect eraseRect; // covers last displayed text/pixmap + Mode m; +}; + +XFormControl::XFormControl( const TQFont &initialFont, + TQWidget *parent, const char *name ) + : TQVBox( parent, name ) +{ + setSpacing(6); + setMargin(6); + currentFont = initialFont; + mode = Image; + + rotLCD = new TQLCDNumber( 4, this, "rotateLCD" ); + rotS = new TQSlider( TQSlider::Horizontal, this, + "rotateSlider" ); + shearLCD = new TQLCDNumber( 5,this, "shearLCD" ); + shearS = new TQSlider( TQSlider::Horizontal, this, + "shearSlider" ); + mirror = new TQCheckBox( this, "mirrorCheckBox" ); + rb_txt = new TQRadioButton( this, "text" ); + rb_img = new TQRadioButton( this, "image" ); + rb_pic = new TQRadioButton( this, "picture" ); + optionals = new TQWidgetStack(this); + TQVBox* optionals_text = new TQVBox(optionals); + optionals_text->setSpacing(6); + TQVBox* optionals_other = new TQVBox(optionals); + optionals_other->setSpacing(6); + optionals->addWidget(optionals_text,0); + optionals->addWidget(optionals_other,1); + fpb = new TQPushButton( optionals_text, "text" ); + textEd = new TQLineEdit( optionals_text, "text" ); + textEd->setFocus(); + + rotLCD->display( " 0'" ); + + rotS->setRange( -180, 180 ); + rotS->setValue( 0 ); + connect( rotS, SIGNAL(valueChanged(int)), SLOT(newMtx()) ); + + shearLCD->display( "0.00" ); + + shearS->setRange( -25, 25 ); + shearS->setValue( 0 ); + connect( shearS, SIGNAL(valueChanged(int)), SLOT(newMtx()) ); + + mirror->setText( tr("Mirror") ); + connect( mirror, SIGNAL(clicked()), SLOT(newMtx()) ); + + TQButtonGroup *bg = new TQButtonGroup(this); + bg->hide(); + bg->insert(rb_txt,0); + bg->insert(rb_img,1); + bg->insert(rb_pic,2); + rb_txt->setText( tr("Text") ); + rb_img->setText( tr("Image") ); + rb_img->setChecked(TRUE); + rb_pic->setText( tr("Picture") ); + connect( bg, SIGNAL(clicked(int)), SLOT(changeMode(int)) ); + + fpb->setText( tr("Select font...") ); + connect( fpb, SIGNAL(clicked()), SLOT(selectFont()) ); + + textEd->setText( "Troll" ); + connect( textEd, SIGNAL(textChanged(const TQString&)), + SLOT(newTxt(const TQString&)) ); + + magLCD = new TQLCDNumber( 4,optionals_other, "magLCD" ); + magLCD->display( "100" ); + magS = new TQSlider( TQSlider::Horizontal, optionals_other, + "magnifySlider" ); + magS->setRange( 0, 800 ); + connect( magS, SIGNAL(valueChanged(int)), SLOT(newMtx()) ); + magS->setValue( 0 ); + connect( magS, SIGNAL(valueChanged(int)), magLCD, SLOT(display(int))); + + optionals_text->adjustSize(); + optionals_other->adjustSize(); + changeMode(Image); + + startTimer(20); // start an initial animation +} + +void XFormControl::timerEvent(TQTimerEvent*) +{ + int v = magS->value(); + v = (v+2)+v/10; + if ( v >= 200 ) { + v = 200; + killTimers(); + } + magS->setValue(v); +} + + + +/* + Called whenever the user has changed one of the matrix parameters + (i.e. rotate, shear or magnification) +*/ +void XFormControl::newMtx() +{ + emit newMatrix( matrix() ); +} + +void XFormControl::newTxt(const TQString& s) +{ + emit newText(s); + changeMode(Text); +} + +/* + Calculates the matrix appropriate for the current controls, + and updates the displays. +*/ +TQWMatrix XFormControl::matrix() +{ + TQWMatrix m; + if (mode != Text) { + double magVal = 1.0*magS->value()/100; + m.scale( magVal, magVal ); + } + double shearVal = 1.0*shearS->value()/25; + m.shear( shearVal, shearVal ); + m.rotate( rotS->value() ); + if ( mirror->isChecked() ) { + m.scale( 1, -1 ); + m.rotate( 180 ); + } + + TQString tmp; + tmp.sprintf( "%1.2f", shearVal ); + if ( shearVal >= 0 ) + tmp.insert( 0, " " ); + shearLCD->display( tmp ); + + int rot = rotS->value(); + if ( rot < 0 ) + rot = rot + 360; + tmp.sprintf( "%3i'", rot ); + rotLCD->display( tmp ); + return m; +} + + +void XFormControl::selectFont() +{ + bool ok; + TQFont f = TQFontDialog::getFont( &ok, currentFont ); + if ( ok ) { + currentFont = f; + fontSelected( f ); + } +} + +void XFormControl::fontSelected( const TQFont &font ) +{ + emit newFont( font ); + changeMode(Text); +} + +/* + Sets the mode - Text, Image, or Picture. +*/ + +void XFormControl::changeMode(int m) +{ + mode = (Mode)m; + + emit newMode( m ); + newMtx(); + if ( mode == Text ) { + optionals->raiseWidget(0); + rb_txt->setChecked(TRUE); + } else { + optionals->raiseWidget(1); + if ( mode == Image ) + rb_img->setChecked(TRUE); + else + rb_pic->setChecked(TRUE); + } + qApp->flushX(); +} + +ShowXForm::ShowXForm( const TQFont &initialFont, + TQWidget *parent, const char *name ) + : TQWidget( parent, name, WResizeNoErase ) +{ + setFont( initialFont ); + setBackgroundColor( white ); + m = Text; + eraseRect = TQRect( 0, 0, 0, 0 ); +} + +TQSizePolicy ShowXForm::sizePolicy() const +{ + return TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding ); +} + +TQSize ShowXForm::sizeHint() const +{ + return TQSize(400,400); +} + +void ShowXForm::paintEvent( TQPaintEvent * ) +{ + showIt(); +} + +void ShowXForm::resizeEvent( TQResizeEvent * ) +{ + eraseRect = TQRect( width()/2, height()/2, 0, 0 ); + repaint(rect()); +} + +void ShowXForm::setText( const TQString& s ) +{ + text = s; + showIt(); +} + +void ShowXForm::setMatrix( TQWMatrix w ) +{ + mtx = w; + showIt(); +} + +void ShowXForm::setFont( const TQFont &f ) +{ + m = Text; + TQWidget::setFont( f ); +} + +void ShowXForm::setPixmap( TQPixmap pm ) +{ + pix = pm; + m = Image; + showIt(); +} + +void ShowXForm::setPicture( const TQPicture& p ) +{ + picture = p; + m = Picture; + showIt(); +} + +void ShowXForm::setMode( int mode ) +{ + m = (Mode)mode; +} + +void ShowXForm::showIt() +{ + TQPainter p; + TQRect r; // rectangle covering new text/pixmap in virtual coordinates + TQWMatrix um; // copy user specified transform + int textYPos = 0; // distance from boundingRect y pos to baseline + int textXPos = 0; // distance from boundingRect x pos to text start + TQRect br; + TQFontMetrics fm( fontMetrics() ); // get widget font metrics + switch ( mode() ) { + case Text: + br = fm.boundingRect( text ); // rectangle covering text + r = br; + textYPos = -r.y(); + textXPos = -r.x(); + br.moveTopLeft( TQPoint( -br.width()/2, -br.height()/2 ) ); + break; + case Image: + r = TQRect(0, 0, pix.width()+1, pix.height()+1); + break; + case Picture: + // ### need TQPicture::boundingRect() + r = TQRect(0,0,1000,1000); + break; + } + r.moveTopLeft( TQPoint(-r.width()/2, -r.height()/2) ); + r.moveBy( -1, -1 ); // add border for matrix round off + r.setSize( TQSize( r.width() + 2,r.height() + 2 ) ); + // compute union of new and old rect + // the resulting rectangle will cover what is already displayed + // and have room for the new text/pixmap + eraseRect = eraseRect.unite( mtx.mapRect(r) ); + int pw = TQMIN(eraseRect.width(),width()); + int ph = TQMIN(eraseRect.height(),height()); + TQPixmap pm( pw, ph ); // off-screen drawing pixmap + pm.fill( backgroundColor() ); + + p.begin( &pm ); + um.translate( pw/2, ph/2 ); // 0,0 is center + um = mtx * um; + p.setWorldMatrix( um ); + switch ( mode() ) { + case Text: + p.setFont( font() ); // use widget font + p.drawText( r.left() + textXPos, r.top() + textYPos, text ); +#if 0 + p.setPen( red ); + p.drawRect( br ); +#endif + break; + case Image: + p.drawPixmap( -pix.width()/2, -pix.height()/2, pix ); + break; + case Picture: + // ### need TQPicture::boundingRect() + p.scale(0.25,0.25); + p.translate(-230,-180); + p.drawPicture( picture ); + } + p.end(); + + int xpos = width()/2 - pw/2; + int ypos = height()/2 - ph/2; + bitBlt( this, xpos, ypos, // copy pixmap to widget + &pm, 0, 0, -1, -1 ); + eraseRect = mtx.map( r ); +} + + +/* + Grand unifying widget, putting ShowXForm and XFormControl + together. +*/ + +class XFormCenter : public TQHBox, public ModeNames +{ + Q_OBJECT +public: + XFormCenter( TQWidget *parent=0, const char *name=0 ); +public slots: + void setFont( const TQFont &f ) { sx->setFont( f ); } + void newMode( int ); +private: + ShowXForm *sx; + XFormControl *xc; +}; + +void XFormCenter::newMode( int m ) +{ + static bool first_i = TRUE; + static bool first_p = TRUE; + + if ( sx->mode() == m ) + return; + if ( m == Image && first_i ) { + first_i = FALSE; + TQPixmap pm; + if ( pm.load( "image.any" ) ) + sx->setPixmap( pm ); + return; + } + if ( m == Picture && first_p ) { + first_p = FALSE; + TQPicture p; + if (p.load( "picture.any" )) + sx->setPicture( p ); + return; + } + sx->setMode(m); +} + +XFormCenter::XFormCenter( TQWidget *parent, const char *name ) + : TQHBox( parent, name ) +{ + TQFont f( "Charter", 36, TQFont::Bold ); + + xc = new XFormControl( f, this ); + sx = new ShowXForm( f, this ); + setStretchFactor(sx,1); + xc->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + xc->setLineWidth( 2 ); + connect( xc, SIGNAL(newText(const TQString&)), sx, + SLOT(setText(const TQString&)) ); + connect( xc, SIGNAL(newMatrix(TQWMatrix)), + sx, SLOT(setMatrix(TQWMatrix)) ); + connect( xc, SIGNAL(newFont(const TQFont&)), sx, + SLOT(setFont(const TQFont&)) ); + connect( xc, SIGNAL(newMode(int)), SLOT(newMode(int)) ); + sx->setText( "Troll" ); + newMode( Image ); + sx->setMatrix(xc->matrix()); +} + + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + XFormCenter *xfc = new XFormCenter; + + a.setMainWidget( xfc ); + xfc->setCaption("TQt Example - XForm"); + xfc->show(); + return a.exec(); +} + +#include "xform.moc" // include metadata generated by the moc diff --git a/examples/xform/xform.doc b/examples/xform/xform.doc new file mode 100644 index 000000000..4bca655da --- /dev/null +++ b/examples/xform/xform.doc @@ -0,0 +1,17 @@ +/* +*/ +/*! \page xform-example.html + + \ingroup examples + \title Transformed Graphics Demo + + This example lets the user rotate, shear and scale text and graphics + arbitrarily. + + <hr> + + Implementation: + + \include xform/xform.cpp +*/ + diff --git a/examples/xform/xform.pro b/examples/xform/xform.pro new file mode 100644 index 000000000..a9c98784e --- /dev/null +++ b/examples/xform/xform.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = xform + +CONFIG += qt warn_on release +DEPENDPATH = ../../include + +REQUIRES = full-config + +HEADERS = +SOURCES = xform.cpp diff --git a/examples/xml/outliner/main.cpp b/examples/xml/outliner/main.cpp new file mode 100644 index 000000000..c4b1491e3 --- /dev/null +++ b/examples/xml/outliner/main.cpp @@ -0,0 +1,22 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include <qapplication.h> +#include "outlinetree.h" + +int main( int argc, char **argv ) +{ + TQApplication a( argc, argv ); + + OutlineTree outline( "todos.opml" ); + a.setMainWidget( &outline ); + outline.show(); + + return a.exec(); +} diff --git a/examples/xml/outliner/outliner.doc b/examples/xml/outliner/outliner.doc new file mode 100644 index 000000000..c21043dd6 --- /dev/null +++ b/examples/xml/outliner/outliner.doc @@ -0,0 +1,40 @@ +/* +*/ + +/*! \page outliner-example.html + + \ingroup xml-examples + + \title Outliner to show use of DOM + + This example presents a small outliner program to show the basic usage of + the \link xml.html#dom DOM classes \endlink. The format of the outlines + is the OPML format as described in http://www.opml.org/spec. + + This example shows how to load a DOM tree from an XML file and how to + traverse it. + + <hr> + + Sample XML file (todos.opml): + + \include xml/outliner/todos.opml + + <hr> + + Header file (outlinetree.h): + + \include xml/outliner/outlinetree.h + + <hr> + + Implementation (outlinetree.cpp): + + \include xml/outliner/outlinetree.cpp + + <hr> + + Main (main.cpp): + + \include xml/outliner/main.cpp +*/ diff --git a/examples/xml/outliner/outliner.pro b/examples/xml/outliner/outliner.pro new file mode 100644 index 000000000..1dcdc44bd --- /dev/null +++ b/examples/xml/outliner/outliner.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = outliner + +CONFIG += qt warn_on release + +REQUIRES = xml large-config + +HEADERS = outlinetree.h +SOURCES = main.cpp \ + outlinetree.cpp +INTERFACES = diff --git a/examples/xml/outliner/outlinetree.cpp b/examples/xml/outliner/outlinetree.cpp new file mode 100644 index 000000000..69b92358b --- /dev/null +++ b/examples/xml/outliner/outlinetree.cpp @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "outlinetree.h" +#include <qfile.h> +#include <qmessagebox.h> + +OutlineTree::OutlineTree( const TQString fileName, TQWidget *parent, const char *name ) + : TQListView( parent, name ) +{ + // div. configuration of the list view + addColumn( "Outlines" ); + setSorting( -1 ); + setRootIsDecorated( TRUE ); + + // read the XML file and create DOM tree + TQFile opmlFile( fileName ); + if ( !opmlFile.open( IO_ReadOnly ) ) { + TQMessageBox::critical( 0, + tr( "Critical Error" ), + tr( "Cannot open file %1" ).arg( fileName ) ); + return; + } + if ( !domTree.setContent( &opmlFile ) ) { + TQMessageBox::critical( 0, + tr( "Critical Error" ), + tr( "Parsing error for file %1" ).arg( fileName ) ); + opmlFile.close(); + return; + } + opmlFile.close(); + + // get the header information from the DOM + TQDomElement root = domTree.documentElement(); + TQDomNode node; + node = root.firstChild(); + while ( !node.isNull() ) { + if ( node.isElement() && node.nodeName() == "head" ) { + TQDomElement header = node.toElement(); + getHeaderInformation( header ); + break; + } + node = node.nextSibling(); + } + // create the tree view out of the DOM + node = root.firstChild(); + while ( !node.isNull() ) { + if ( node.isElement() && node.nodeName() == "body" ) { + TQDomElement body = node.toElement(); + buildTree( 0, body ); + break; + } + node = node.nextSibling(); + } +} + +OutlineTree::~OutlineTree() +{ +} + +void OutlineTree::getHeaderInformation( const TQDomElement &header ) +{ + // visit all children of the header element and look if you can make + // something with it + TQDomNode node = header.firstChild(); + while ( !node.isNull() ) { + if ( node.isElement() ) { + // case for the different header entries + if ( node.nodeName() == "title" ) { + TQDomText textChild = node.firstChild().toText(); + if ( !textChild.isNull() ) { + setColumnText( 0, textChild.nodeValue() ); + } + } + } + node = node.nextSibling(); + } +} + +void OutlineTree::buildTree( TQListViewItem *parentItem, const TQDomElement &parentElement ) +{ + TQListViewItem *thisItem = 0; + TQDomNode node = parentElement.firstChild(); + while ( !node.isNull() ) { + if ( node.isElement() && node.nodeName() == "outline" ) { + // add a new list view item for the outline + if ( parentItem == 0 ) + thisItem = new TQListViewItem( this, thisItem ); + else + thisItem = new TQListViewItem( parentItem, thisItem ); + thisItem->setText( 0, node.toElement().attribute( "text" ) ); + // recursive build of the tree + buildTree( thisItem, node.toElement() ); + } + node = node.nextSibling(); + } +} diff --git a/examples/xml/outliner/outlinetree.h b/examples/xml/outliner/outlinetree.h new file mode 100644 index 000000000..c6a22ad9d --- /dev/null +++ b/examples/xml/outliner/outlinetree.h @@ -0,0 +1,30 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef OUTLINETREE_H +#define OUTLINETREE_H + +#include <qlistview.h> +#include <qdom.h> + +class OutlineTree : public TQListView +{ + Q_OBJECT + +public: + OutlineTree( const TQString fileName, TQWidget *parent = 0, const char *name = 0 ); + ~OutlineTree(); + +private: + TQDomDocument domTree; + void getHeaderInformation( const TQDomElement &header ); + void buildTree( TQListViewItem *parentItem, const TQDomElement &parentElement ); +}; + +#endif // OUTLINETREE_H diff --git a/examples/xml/outliner/todos.opml b/examples/xml/outliner/todos.opml new file mode 100644 index 000000000..62793900a --- /dev/null +++ b/examples/xml/outliner/todos.opml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<opml version="1.0"> + <head> + <title>Todo List</title> + <dateCreated>Tue, 31 Oct 2000 17:00:17 CET</dateCreated> + <dateModified>Tue, 31 Oct 2000 17:00:17 CET</dateModified> + <ownerName>Arthur Dent</ownerName> + <ownerEmail>info@trolltech.com</ownerEmail> + </head> + <body> + <outline text="Background"> + <outline text="This is an example todo list."/> + </outline> + <outline text="Books to read"> + <outline text="Science Fiction"> + <outline text="Philip K. Dick"> + <outline text="Do Androids Dream of Electical Sheep?"/> + <outline text="The Three Stigmata of Palmer Eldritch"/> + </outline> + <outline text="Robert A. Heinlein"> + <outline text="Stranger in a Strange Land"/> + </outline> + <outline text="Isaac Asimov"> + <outline text="Foundation and Empire"/> + </outline> + </outline> + <outline text="Qt Books (in English)"> + <outline text="Blanchette & Summerfield: C++ GUI Programming with Qt 3"/> + <outline text="Dalheimer: Programming with Qt"/> + <outline text="Griffith: KDE 2/Qt Programming Bible"/> + <outline text="Hughes: Linux Rapid Application Development"/> + <outline text="Solin: Qt Programming in 24 hours"/> + <outline text="Ward: Qt 2 Programming for Linux and Windows 2000"/> + </outline> + </outline> + <outline text="Shopping list"> + <outline text="General"> + <outline text="Towel"/> + <outline text="Hair dryer"/> + <outline text="Underpants"/> + </outline> + <outline text="For Sunday"> + <outline text="Beef"/> + <outline text="Rice"/> + <outline text="Carrots"/> + <outline text="Beans"/> + <outline text="Beer"/> + <outline text="Wine"/> + <outline text="Orange juice"/> + </outline> + </outline> + <outline text="Write a letter to Ford"> + </outline> + </body> +</opml> diff --git a/examples/xml/tagreader-with-features/fnord.xml b/examples/xml/tagreader-with-features/fnord.xml new file mode 100644 index 000000000..4d1303dd1 --- /dev/null +++ b/examples/xml/tagreader-with-features/fnord.xml @@ -0,0 +1,13 @@ +<document xmlns:book = 'http://trolltech.com/fnord/book/' + xmlns = 'http://trolltech.com/fnord/' > +<book> + <book:title>Practical XML</book:title> + <book:author xmlns:fnord = 'http://trolltech.com/fnord/' + title="Ms" + fnord:title="Goddess" + name="Eris Kallisti"/> + <chapter> + <title>A Namespace Called fnord</title> + </chapter> +</book> +</document> diff --git a/examples/xml/tagreader-with-features/structureparser.cpp b/examples/xml/tagreader-with-features/structureparser.cpp new file mode 100644 index 000000000..3bbd2a9c9 --- /dev/null +++ b/examples/xml/tagreader-with-features/structureparser.cpp @@ -0,0 +1,56 @@ +/* +*/ + +#include "structureparser.h" + +#include <qstring.h> +#include <qlistview.h> + +StructureParser::StructureParser( TQListView * t ) + : TQXmlDefaultHandler() +{ + setListView( t ); +} + +void StructureParser::setListView( TQListView * t ) +{ + table = t; + table->setSorting( -1 ); + table->addColumn( "Qualified name" ); + table->addColumn( "Namespace" ); +} + +bool StructureParser::startElement( const TQString& namespaceURI, + const TQString& , + const TQString& qName, + const TQXmlAttributes& attributes) +{ + TQListViewItem * element; + + if ( ! stack.isEmpty() ){ + TQListViewItem *lastChild = stack.top()->firstChild(); + if ( lastChild ) { + while ( lastChild->nextSibling() ) + lastChild = lastChild->nextSibling(); + } + element = new TQListViewItem( stack.top(), lastChild, qName, namespaceURI ); + } else { + element = new TQListViewItem( table, qName, namespaceURI ); + } + stack.push( element ); + element->setOpen( TRUE ); + + if ( attributes.length() > 0 ) { + for ( int i = 0 ; i < attributes.length(); i++ ) { + new TQListViewItem( element, attributes.qName(i), attributes.uri(i) ); + } + } + return TRUE; +} + +bool StructureParser::endElement( const TQString&, const TQString&, + const TQString& ) +{ + stack.pop(); + return TRUE; +} diff --git a/examples/xml/tagreader-with-features/structureparser.h b/examples/xml/tagreader-with-features/structureparser.h new file mode 100644 index 000000000..9ab8ec2af --- /dev/null +++ b/examples/xml/tagreader-with-features/structureparser.h @@ -0,0 +1,29 @@ +/* +*/ + +#ifndef STRUCTUREPARSER_H +#define STRUCTUREPARSER_H + +#include <qxml.h> +#include <qptrstack.h> + +class TQListView; +class TQListViewItem; +class TQString; + +class StructureParser: public TQXmlDefaultHandler +{ +public: + StructureParser( TQListView * ); + bool startElement( const TQString&, const TQString&, const TQString& , + const TQXmlAttributes& ); + bool endElement( const TQString&, const TQString&, const TQString& ); + + void setListView( TQListView * ); + +private: + TQPtrStack<TQListViewItem> stack; + TQListView * table; +}; + +#endif diff --git a/examples/xml/tagreader-with-features/tagreader-with-features.pro b/examples/xml/tagreader-with-features/tagreader-with-features.pro new file mode 100644 index 000000000..ffe7648d7 --- /dev/null +++ b/examples/xml/tagreader-with-features/tagreader-with-features.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = tagreader-with-features + +CONFIG += qt warn_on release + +REQUIRES = xml large-config + +HEADERS = structureparser.h +SOURCES = tagreader.cpp \ + structureparser.cpp +INTERFACES = diff --git a/examples/xml/tagreader-with-features/tagreader.cpp b/examples/xml/tagreader-with-features/tagreader.cpp new file mode 100644 index 000000000..866879a4f --- /dev/null +++ b/examples/xml/tagreader-with-features/tagreader.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "structureparser.h" +#include <qapplication.h> +#include <qfile.h> +#include <qxml.h> +#include <qlistview.h> +#include <qgrid.h> +#include <qmainwindow.h> +#include <qlabel.h> + +int main( int argc, char **argv ) +{ + TQApplication app( argc, argv ); + + TQFile xmlFile( argc == 2 ? argv[1] : "fnord.xml" ); + TQXmlInputSource source( &xmlFile ); + + TQXmlSimpleReader reader; + + TQGrid * container = new TQGrid( 3 ); + + TQListView * nameSpace = new TQListView( container, "table_namespace" ); + StructureParser * handler = new StructureParser( nameSpace ); + reader.setContentHandler( handler ); + reader.parse( source ); + + TQListView * namespacePrefix = new TQListView( container, + "table_namespace_prefix" ); + handler->setListView( namespacePrefix ); + reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", + TRUE ); + source.reset(); + reader.parse( source ); + + TQListView * prefix = new TQListView( container, "table_prefix"); + handler->setListView( prefix ); + reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE ); + source.reset(); + reader.parse( source ); + + // namespace label + (void) new TQLabel( + "Default:\n" + "http://xml.org/sax/features/namespaces: TRUE\n" + "http://xml.org/sax/features/namespace-prefixes: FALSE\n", + container ); + + // namespace prefix label + (void) new TQLabel( + "\n" + "http://xml.org/sax/features/namespaces: TRUE\n" + "http://xml.org/sax/features/namespace-prefixes: TRUE\n", + container ); + + // prefix label + (void) new TQLabel( + "\n" + "http://xml.org/sax/features/namespaces: FALSE\n" + "http://xml.org/sax/features/namespace-prefixes: TRUE\n", + container ); + + + app.setMainWidget( container ); + container->show(); + return app.exec(); +} diff --git a/examples/xml/tagreader-with-features/tagreader.doc b/examples/xml/tagreader-with-features/tagreader.doc new file mode 100644 index 000000000..1d11dc260 --- /dev/null +++ b/examples/xml/tagreader-with-features/tagreader.doc @@ -0,0 +1,40 @@ +/* +*/ + +/*! \page tagreader-with-features-example.html + + \ingroup xml-examples + + \title Demonstration of SAX2 features + + This example presents a small \link xml.html#sax2 SAX2 \endlink + reader that outputs the qualified names and the + respective namespace URIs of all elements and attributes in an + XML file. Additionally the tree structure of the document is displayed. + + In three listviews the program shows the different output of the reader + depending on how the SAX2 \link xml.html#sax2Namespaces features \endlink + \e http://xml.org/sax/features/namespaces and + \e http://xml.org/sax/features/namespace-prefixes are set. + + This example is thoroughly explained in a + \link xml-sax-features-walkthrough.html walkthrough. \endlink + + <hr> + + Header file: + + \include xml/tagreader-with-features/structureparser.h + + <hr> + + Implementation: + + \include xml/tagreader-with-features/structureparser.cpp + + <hr> + + Main: + + \include xml/tagreader-with-features/tagreader.cpp +*/ diff --git a/examples/xml/tagreader/animals.xml b/examples/xml/tagreader/animals.xml new file mode 100644 index 000000000..e1284901d --- /dev/null +++ b/examples/xml/tagreader/animals.xml @@ -0,0 +1,7 @@ +<animals> +<mammals> + <monkeys> <gorilla/> <orangutan/> </monkeys> +</mammals> +<birds> <pigeon/> <penguin/> </birds> +</animals> + diff --git a/examples/xml/tagreader/structureparser.cpp b/examples/xml/tagreader/structureparser.cpp new file mode 100644 index 000000000..9c13f4568 --- /dev/null +++ b/examples/xml/tagreader/structureparser.cpp @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "structureparser.h" + +#include <stdio.h> +#include <qstring.h> + +bool StructureParser::startDocument() +{ + indent = ""; + return TRUE; +} + +bool StructureParser::startElement( const TQString&, const TQString&, + const TQString& qName, + const TQXmlAttributes& ) +{ + printf( "%s%s\n", (const char*)indent, (const char*)qName ); + indent += " "; + return TRUE; +} + +bool StructureParser::endElement( const TQString&, const TQString&, const TQString& ) +{ + indent.remove( (uint)0, 4 ); + return TRUE; +} diff --git a/examples/xml/tagreader/structureparser.h b/examples/xml/tagreader/structureparser.h new file mode 100644 index 000000000..c860f21a5 --- /dev/null +++ b/examples/xml/tagreader/structureparser.h @@ -0,0 +1,29 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef STRUCTUREPARSER_H +#define STRUCTUREPARSER_H + +#include <qxml.h> + +class TQString; + +class StructureParser : public TQXmlDefaultHandler +{ +public: + bool startDocument(); + bool startElement( const TQString&, const TQString&, const TQString& , + const TQXmlAttributes& ); + bool endElement( const TQString&, const TQString&, const TQString& ); + +private: + TQString indent; +}; + +#endif diff --git a/examples/xml/tagreader/tagreader.cpp b/examples/xml/tagreader/tagreader.cpp new file mode 100644 index 000000000..93dd4cc59 --- /dev/null +++ b/examples/xml/tagreader/tagreader.cpp @@ -0,0 +1,30 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "structureparser.h" +#include <qfile.h> +#include <qxml.h> +#include <qwindowdefs.h> + +int main( int argc, char **argv ) +{ + if ( argc < 2 ) { + fprintf( stderr, "Usage: %s <xmlfile> [<xmlfile> ...]\n", argv[0] ); + return 1; + } + StructureParser handler; + TQXmlSimpleReader reader; + reader.setContentHandler( &handler ); + for ( int i=1; i < argc; i++ ) { + TQFile xmlFile( argv[i] ); + TQXmlInputSource source( &xmlFile ); + reader.parse( source ); + } + return 0; +} diff --git a/examples/xml/tagreader/tagreader.doc b/examples/xml/tagreader/tagreader.doc new file mode 100644 index 000000000..9a0bad01d --- /dev/null +++ b/examples/xml/tagreader/tagreader.doc @@ -0,0 +1,35 @@ +/* +*/ + +/*! \page tagreader-example.html + + \ingroup xml-examples + + \title A tiny SAX2 parser + + This example presents a small \link xml.html#sax2 SAX2 \endlink + reader that outputs the names of all elements in an + XML document on the command line. The element names are + indented corresponding to their nesting + + This example is thoroughly explained in a + \link xml-sax-walkthrough.html walkthrough. \endlink + + <hr> + + Header file: + + \include xml/tagreader/structureparser.h + + <hr> + + Implementation: + + \include xml/tagreader/structureparser.cpp + + <hr> + + Main: + + \include xml/tagreader/tagreader.cpp +*/ diff --git a/examples/xml/tagreader/tagreader.pro b/examples/xml/tagreader/tagreader.pro new file mode 100644 index 000000000..b6ebf8b97 --- /dev/null +++ b/examples/xml/tagreader/tagreader.pro @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = tagreader + +CONFIG += qt console warn_on release + +REQUIRES = xml large-config + +HEADERS = structureparser.h +SOURCES = tagreader.cpp \ + structureparser.cpp +INTERFACES = |