Index: trunk/examples/chart/canvastext.h
===================================================================
--- trunk/examples/chart/canvastext.h	(revision 164)
+++ trunk/examples/chart/canvastext.h	(revision 164)
@@ -0,0 +1,31 @@
+#ifndef CANVASTEXT_H
+#define CANVASTEXT_H
+
+#include <qcanvas.h>
+
+class QFont;
+
+
+class CanvasText : public QCanvasText
+{
+public:
+    enum { CANVAS_TEXT = 1100 };
+
+    CanvasText( int index, QCanvas *canvas )
+	: QCanvasText( canvas ), m_index( index ) {}
+    CanvasText( int index, const QString& text, QCanvas *canvas )
+	: QCanvasText( text, canvas ), m_index( index ) {}
+    CanvasText( int index, const QString& text, QFont font, QCanvas *canvas )
+	: QCanvasText( 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
+
Index: trunk/examples/chart/canvasview.cpp
===================================================================
--- trunk/examples/chart/canvasview.cpp	(revision 164)
+++ trunk/examples/chart/canvasview.cpp	(revision 164)
@@ -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( QContextMenuEvent * )
+{
+    ((ChartForm*)parent())->optionsMenu->exec( QCursor::pos() );
+}
+
+
+void CanvasView::viewportResizeEvent( QResizeEvent *e )
+{
+    canvas()->resize( e->size().width(), e->size().height() );
+    ((ChartForm*)parent())->drawElements();
+}
+
+
+void CanvasView::contentsMousePressEvent( QMouseEvent *e )
+{
+    QCanvasItemList list = canvas()->collisions( e->pos() );
+    for ( QCanvasItemList::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( QMouseEvent *e )
+{
+    if ( m_movingItem ) {
+	QPoint 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();
+    }
+}
+
+
Index: trunk/examples/chart/canvasview.h
===================================================================
--- trunk/examples/chart/canvasview.h	(revision 164)
+++ trunk/examples/chart/canvasview.h	(revision 164)
@@ -0,0 +1,36 @@
+#ifndef CANVASVIEW_H
+#define CANVASVIEW_H
+
+#include "element.h"
+#include "canvastext.h"
+
+#include <qcanvas.h>
+
+
+class QPoint;
+
+
+class CanvasView : public QCanvasView
+{
+    Q_OBJECT
+public:
+    CanvasView( QCanvas *canvas, ElementVector *elements,
+		QWidget* parent = 0, const char* name = "canvas view",
+		WFlags f = 0 )
+	: QCanvasView( canvas, parent, name, f ),
+	  m_elements( elements ) {}
+
+protected:
+    void viewportResizeEvent( QResizeEvent *e );
+    void contentsMousePressEvent( QMouseEvent *e );
+    void contentsMouseMoveEvent( QMouseEvent *e );
+    void contentsContextMenuEvent( QContextMenuEvent *e );
+
+private:
+    QCanvasItem *m_movingItem;
+    QPoint m_pos;
+    ElementVector *m_elements;
+};
+
+
+#endif
Index: trunk/examples/chart/chart.pro
===================================================================
--- trunk/examples/chart/chart.pro	(revision 164)
+++ trunk/examples/chart/chart.pro	(revision 164)
@@ -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
Index: trunk/examples/chart/chartform.cpp
===================================================================
--- trunk/examples/chart/chartform.cpp	(revision 164)
+++ trunk/examples/chart/chartform.cpp	(revision 164)
@@ -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 QString WINDOWS_REGISTRY = "/Trolltech/QtExamples";
+const QString APP_KEY = "/Chart/";
+
+
+ChartForm::ChartForm( const QString& filename )
+    : QMainWindow( 0, 0, WDestructiveClose )
+{
+    setIcon( QPixmap( options_piechart ) );
+
+    QAction *fileNewAction;
+    QAction *fileOpenAction;
+    QAction *fileSaveAction;
+    QAction *fileSaveAsAction;
+    QAction *fileSaveAsPixmapAction;
+    QAction *filePrintAction;
+    QAction *fileQuitAction;
+    QAction *optionsSetDataAction;
+    QAction *optionsSetFontAction;
+    QAction *optionsSetOptionsAction;
+
+    fileNewAction = new QAction(
+	    "New Chart", QPixmap( file_new ),
+	    "&New", CTRL+Key_N, this, "new" );
+    connect( fileNewAction, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+
+    fileOpenAction = new QAction(
+	    "Open Chart", QPixmap( file_open ),
+	    "&Open...", CTRL+Key_O, this, "open" );
+    connect( fileOpenAction, SIGNAL( activated() ), this, SLOT( fileOpen() ) );
+
+    fileSaveAction = new QAction(
+	    "Save Chart", QPixmap( file_save ),
+	    "&Save", CTRL+Key_S, this, "save" );
+    connect( fileSaveAction, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+
+    fileSaveAsAction = new QAction(
+	    "Save Chart As", QPixmap( file_save ),
+	    "Save &As...", 0, this, "save as" );
+    connect( fileSaveAsAction, SIGNAL( activated() ),
+	     this, SLOT( fileSaveAs() ) );
+
+    fileSaveAsPixmapAction = new QAction(
+	    "Save Chart As Bitmap", QPixmap( file_save ),
+	    "Save As &Bitmap...", CTRL+Key_B, this, "save as bitmap" );
+    connect( fileSaveAsPixmapAction, SIGNAL( activated() ),
+	     this, SLOT( fileSaveAsPixmap() ) );
+
+    filePrintAction = new QAction(
+	    "Print Chart", QPixmap( file_print ),
+	    "&Print Chart...", CTRL+Key_P, this, "print chart" );
+    connect( filePrintAction, SIGNAL( activated() ),
+	     this, SLOT( filePrint() ) );
+
+    optionsSetDataAction = new QAction(
+	    "Set Data", QPixmap( options_setdata ),
+	    "Set &Data...", CTRL+Key_D, this, "set data" );
+    connect( optionsSetDataAction, SIGNAL( activated() ),
+	     this, SLOT( optionsSetData() ) );
+
+
+    QActionGroup *chartGroup = new QActionGroup( this ); // Connected later
+    chartGroup->setExclusive( TRUE );
+
+    optionsPieChartAction = new QAction(
+	    "Pie Chart", QPixmap( options_piechart ),
+	    "&Pie Chart", CTRL+Key_I, chartGroup, "pie chart" );
+    optionsPieChartAction->setToggleAction( TRUE );
+
+    optionsHorizontalBarChartAction = new QAction(
+	    "Horizontal Bar Chart", QPixmap( options_horizontalbarchart ),
+	    "&Horizontal Bar Chart", CTRL+Key_H, chartGroup,
+	    "horizontal bar chart" );
+    optionsHorizontalBarChartAction->setToggleAction( TRUE );
+
+    optionsVerticalBarChartAction = new QAction(
+	    "Vertical Bar Chart", QPixmap( options_verticalbarchart ),
+	    "&Vertical Bar Chart", CTRL+Key_V, chartGroup, "Vertical bar chart" );
+    optionsVerticalBarChartAction->setToggleAction( TRUE );
+
+
+    optionsSetFontAction = new QAction(
+	    "Set Font", QPixmap( options_setfont ),
+	    "Set &Font...", CTRL+Key_F, this, "set font" );
+    connect( optionsSetFontAction, SIGNAL( activated() ),
+	     this, SLOT( optionsSetFont() ) );
+
+    optionsSetOptionsAction = new QAction(
+	    "Set Options", QPixmap( options_setoptions ),
+	    "Set &Options...", 0, this, "set options" );
+    connect( optionsSetOptionsAction, SIGNAL( activated() ),
+	     this, SLOT( optionsSetOptions() ) );
+
+    fileQuitAction = new QAction( "Quit", "&Quit", CTRL+Key_Q, this, "quit" );
+    connect( fileQuitAction, SIGNAL( activated() ), this, SLOT( fileQuit() ) );
+
+
+    QToolBar* fileTools = new QToolBar( this, "file operations" );
+    fileTools->setLabel( "File Operations" );
+    fileNewAction->addTo( fileTools );
+    fileOpenAction->addTo( fileTools );
+    fileSaveAction->addTo( fileTools );
+    fileTools->addSeparator();
+    filePrintAction->addTo( fileTools );
+
+    QToolBar *optionsTools = new QToolBar( 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 QPopupMenu( 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 QPopupMenu( 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();
+
+    QPopupMenu *helpMenu = new QPopupMenu( this );
+    menuBar()->insertItem( "&Help", helpMenu );
+    helpMenu->insertItem( "&Help", this, SLOT(helpHelp()), Key_F1 );
+    helpMenu->insertItem( "&About", this, SLOT(helpAbout()) );
+    helpMenu->insertItem( "About &Qt", this, SLOT(helpAboutQt()) );
+
+
+    m_printer = 0;
+    m_elements.resize( MAX_ELEMENTS );
+
+    QSettings settings;
+    settings.insertSearchPath( QSettings::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 = QFont( "Helvetica", 18, QFont::Bold );
+    m_font.fromString(
+	    settings.readEntry( APP_KEY + "Font", m_font.toString() ) );
+    for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
+	QString filename = settings.readEntry( APP_KEY + "File" +
+					       QString::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(QAction*) ),
+	     this, SLOT( updateChartType(QAction*) ) );
+
+    resize( windowWidth, windowHeight );
+    if ( windowX != -1 || windowY != -1 )
+	move( windowX, windowY );
+
+    m_canvas = new QCanvas( 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 = QString::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, QColor( int(x), y, z, QColor::Hsv ) );
+    }
+}
+
+void ChartForm::closeEvent( QCloseEvent * )
+{
+    fileQuit();
+}
+
+
+void ChartForm::fileNew()
+{
+    if ( okToClear() ) {
+	init();
+	drawElements();
+    }
+}
+
+
+void ChartForm::fileOpen()
+{
+    if ( !okToClear() )
+	return;
+
+    QString filename = QFileDialog::getOpenFileName(
+			    QString::null, "Charts (*.cht)", this,
+			    "file open", "Chart -- File Open" );
+    if ( !filename.isEmpty() )
+	load( filename );
+    else
+	statusBar()->message( "File Open abandoned", 2000 );
+}
+
+
+void ChartForm::fileSaveAs()
+{
+    QString filename = QFileDialog::getSaveFileName(
+			    QString::null, "Charts (*.cht)", this,
+			    "file save as", "Chart -- File Save As" );
+    if ( !filename.isEmpty() ) {
+	int answer = 0;
+	if ( QFile::exists( filename ) )
+	    answer = QMessageBox::warning(
+			    this, "Chart -- Overwrite File",
+			    QString( "Overwrite\n\'%1\'?" ).
+				arg( filename ),
+			    "&Yes", "&No", QString::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 QString& 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( QString( "&%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 ) {
+	QString msg;
+	if ( m_filename.isEmpty() )
+	    msg = "Unnamed chart ";
+	else
+	    msg = QString( "Chart '%1'\n" ).arg( m_filename );
+	msg += "has been changed.";
+
+	int x = QMessageBox::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()
+{
+    QSettings settings;
+    settings.insertSearchPath( QSettings::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" + QString::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( QAction *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;
+    QFont font = QFontDialog::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()
+{
+    QMessageBox::about( this, "Chart -- About",
+			"<center><h1><font color=blue>Chart<font></h1></center>"
+			"<p>Chart your data with <i>chart</i>.</p>"
+			);
+}
+
+
+void ChartForm::helpAboutQt()
+{
+    QMessageBox::aboutQt( this, "Chart -- About Qt" );
+}
+
Index: trunk/examples/chart/chartform.h
===================================================================
--- trunk/examples/chart/chartform.h	(revision 164)
+++ trunk/examples/chart/chartform.h	(revision 164)
@@ -0,0 +1,90 @@
+#ifndef CHARTFORM_H
+#define CHARTFORM_H
+
+#include "element.h"
+
+#include <qmainwindow.h>
+#include <qstringlist.h>
+
+
+class CanvasView;
+
+class QAction;
+class QCanvas;
+class QFont;
+class QPrinter;
+class QString;
+
+
+class ChartForm: public QMainWindow
+{
+    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 QString& filename );
+    ~ChartForm();
+
+    int chartType() { return m_chartType; }
+    void setChanged( bool changed = TRUE ) { m_changed = changed; }
+    void drawElements();
+
+    QPopupMenu *optionsMenu; // Why public? See canvasview.cpp
+
+protected:
+    virtual void closeEvent( QCloseEvent * );
+
+private slots:
+    void fileNew();
+    void fileOpen();
+    void fileOpenRecent( int index );
+    void fileSave();
+    void fileSaveAs();
+    void fileSaveAsPixmap();
+    void filePrint();
+    void fileQuit();
+    void optionsSetData();
+    void updateChartType( QAction *action );
+    void optionsSetFont();
+    void optionsSetOptions();
+    void helpHelp();
+    void helpAbout();
+    void helpAboutQt();
+    void saveOptions();
+
+private:
+    void init();
+    void load( const QString& 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 );
+
+    QString valueLabel( const QString& label, double value, double total );
+    void updateRecentFiles( const QString& filename );
+    void updateRecentFilesMenu();
+    void setChartType( ChartType chartType );
+
+    QPopupMenu *fileMenu;
+    QAction *optionsPieChartAction;
+    QAction *optionsHorizontalBarChartAction;
+    QAction *optionsVerticalBarChartAction;
+
+
+    QString m_filename;
+    QStringList m_recentFiles;
+    QCanvas *m_canvas;
+    CanvasView *m_canvasView;
+    bool m_changed;
+    ElementVector m_elements;
+    QPrinter *m_printer;
+    ChartType m_chartType;
+    AddValuesType m_addValues;
+    int m_decimalPlaces;
+    QFont m_font;
+};
+
+#endif
Index: trunk/examples/chart/chartform_canvas.cpp
===================================================================
--- trunk/examples/chart/chartform_canvas.cpp	(revision 164)
+++ trunk/examples/chart/chartform_canvas.cpp	(revision 164)
@@ -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()
+{
+    QCanvasItemList list = m_canvas->allItems();
+    for ( QCanvasItemList::iterator it = list.begin(); it != list.end(); ++it )
+	delete *it;
+
+	// 360 * 16 for pies; Qt 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]);
+	    QCanvasEllipse *arc = new QCanvasEllipse(
+					    size, size, angle, extent, m_canvas );
+	    arc->setX( x );
+	    arc->setY( y );
+	    arc->setZ( 0 );
+	    arc->setBrush( QBrush( m_elements[i].valueColor(),
+				   BrushStyle(m_elements[i].valuePattern()) ) );
+	    arc->show();
+	    angle += extent;
+	    QString 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
+		    QRect 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;
+    QPen 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);
+	    QCanvasRectangle *rect = new QCanvasRectangle(
+					    x, y, prowidth, extent, m_canvas );
+	    rect->setBrush( QBrush( m_elements[i].valueColor(),
+				    BrushStyle(m_elements[i].valuePattern()) ) );
+	    rect->setPen( pen );
+	    rect->setZ( 0 );
+	    rect->show();
+	    QString 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;
+    QPen pen;
+    pen.setStyle( NoPen );
+
+    for ( int i = 0; i < MAX_ELEMENTS; ++i ) {
+	if ( m_elements[i].isValid() ) {
+	    int extent = int(scales[i]);
+	    QCanvasRectangle *rect = new QCanvasRectangle(
+					    0, y, extent, proheight, m_canvas );
+	    rect->setBrush( QBrush( m_elements[i].valueColor(),
+				    BrushStyle(m_elements[i].valuePattern()) ) );
+	    rect->setPen( pen );
+	    rect->setZ( 0 );
+	    rect->show();
+	    QString 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;
+	}
+    }
+}
+
+
+QString ChartForm::valueLabel(
+	    const QString& label, double value, double total )
+{
+    if ( m_addValues == NO )
+	return label;
+
+    QString newLabel = label;
+    if ( !label.isEmpty() )
+	if ( m_chartType == VERTICAL_BAR )
+	    newLabel += '\n';
+	else
+	    newLabel += ' ';
+    if ( m_addValues == YES )
+	newLabel += QString::number( value, 'f', m_decimalPlaces );
+    else if ( m_addValues == AS_PERCENTAGE )
+	newLabel += QString::number( (value / total) * 100, 'f', m_decimalPlaces )
+		    + '%';
+    return newLabel;
+}
+
Index: trunk/examples/chart/chartform_files.cpp
===================================================================
--- trunk/examples/chart/chartform_files.cpp	(revision 164)
+++ trunk/examples/chart/chartform_files.cpp	(revision 164)
@@ -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 QString& filename )
+{
+    QFile file( filename );
+    if ( !file.open( IO_ReadOnly ) ) {
+	statusBar()->message( QString( "Failed to load \'%1\'" ).
+				arg( filename ), 2000 );
+	return;
+    }
+
+    init(); // Make sure we have colours
+    m_filename = filename;
+    QTextStream 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(
+		QString( "Read maximum number of elements (%1)"
+		         " discarding others" ).arg( i ), 2000 );
+	    break;
+	}
+    }
+
+    file.close();
+
+    QString bad = "";
+    if ( errors ) {
+	bad = QString( "; skipped " ) + QString::number( errors ) + " bad record";
+	if ( errors > 1 )
+	    bad += "s";
+    }
+    statusBar()->message( QString( "Read %1 values from \'%2\'%3" ).
+			  arg( i ).arg( filename ).arg( bad ), 3000 );
+
+    setCaption( QString( "Chart -- %1" ).arg( filename ) );
+    updateRecentFiles( filename );
+
+    drawElements();
+    m_changed = FALSE;
+}
+
+
+void ChartForm::fileSave()
+{
+    if ( m_filename.isEmpty() ) {
+	fileSaveAs();
+	return;
+    }
+
+    QFile file( m_filename );
+    if ( !file.open( IO_WriteOnly ) ) {
+	statusBar()->message( QString( "Failed to save \'%1\'" ).
+				arg( m_filename ), 2000 );
+	return;
+    }
+    QTextStream ts( &file );
+    for ( int i = 0; i < MAX_ELEMENTS; ++i )
+	if ( m_elements[i].isValid() )
+	    ts << m_elements[i];
+
+    file.close();
+
+    setCaption( QString( "Chart -- %1" ).arg( m_filename ) );
+    statusBar()->message( QString( "Saved \'%1\'" ).arg( m_filename ), 2000 );
+    m_changed = FALSE;
+}
+
+
+void ChartForm::fileSaveAsPixmap()
+{
+    QString filename = QFileDialog::getSaveFileName(
+			    QString::null, "Images (*.png *.xpm *.jpg)",
+			    this, "file save as bitmap",
+			    "Chart -- File Save As Bitmap" );
+    if ( QPixmap::grabWidget( m_canvasView ).
+	    save( filename,
+		  filename.mid( filename.findRev( '.' ) + 1 ).upper() ) )
+	statusBar()->message( QString( "Wrote \'%1\'" ).arg( filename ), 2000 );
+    else
+	statusBar()->message( QString( "Failed to write \'%1\'" ).
+				arg( filename ), 2000 );
+}
+
+void ChartForm::filePrint()
+{
+    if ( !m_printer )
+	m_printer = new QPrinter;
+    if ( m_printer->setup() ) {
+	QPainter painter( m_printer );
+	m_canvas->drawArea( QRect( 0, 0, m_canvas->width(), m_canvas->height() ),
+			    &painter, FALSE );
+	if ( !m_printer->outputFileName().isEmpty() )
+	    statusBar()->message( QString( "Printed \'%1\'" ).
+				  arg( m_printer->outputFileName() ), 2000 );
+    }
+}
+
Index: trunk/examples/chart/element.cpp
===================================================================
--- trunk/examples/chart/element.cpp	(revision 164)
+++ trunk/examples/chart/element.cpp	(revision 164)
@@ -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, QColor valueColor, int valuePattern,
+		    const QString& label, QColor labelColor )
+{
+    m_value = value;
+    m_valueColor = valueColor;
+    if ( valuePattern < Qt::SolidPattern || valuePattern > Qt::DiagCrossPattern )
+	valuePattern = Qt::SolidPattern;
+    m_valuePattern = valuePattern;
+    m_label = label;
+    m_labelColor = labelColor;
+}
+
+
+void Element::setValuePattern( int valuePattern )
+{
+    if ( valuePattern < Qt::SolidPattern || valuePattern > Qt::DiagCrossPattern )
+	valuePattern = Qt::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;
+}
+
+
+QTextStream &operator<<( QTextStream &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;
+}
+
+
+QTextStream &operator>>( QTextStream &s, Element &element )
+{
+    QString data = s.readLine();
+    element.setValue( Element::INVALID );
+
+    int errors = 0;
+    bool ok;
+
+    QStringList fields = QStringList::split( FIELD_SEP, data );
+    if ( fields.count() >= 4 ) {
+	double value = fields[0].toDouble( &ok );
+	if ( !ok )
+	    errors++;
+	QColor valueColor = QColor( fields[1] );
+	if ( !valueColor.isValid() )
+	    errors++;
+	int valuePattern = fields[2].toInt( &ok );
+	if ( !ok )
+	    errors++;
+	QColor labelColor = QColor( fields[3] );
+	if ( !labelColor.isValid() )
+	    errors++;
+	QStringList propoints = QStringList::split( PROPOINT_SEP, fields[4] );
+	QString label = data.section( FIELD_SEP, 5 );
+
+	if ( !errors ) {
+	    element.set( value, valueColor, valuePattern, label, labelColor );
+	    int i = 0;
+	    for ( QStringList::iterator point = propoints.begin();
+		i < Element::MAX_PROPOINTS && point != propoints.end();
+		++i, ++point ) {
+		errors = 0;
+		QStringList xy = QStringList::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;
+}
+
Index: trunk/examples/chart/element.h
===================================================================
--- trunk/examples/chart/element.h	(revision 164)
+++ trunk/examples/chart/element.h	(revision 164)
@@ -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 QValueVector<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, QColor valueColor = Qt::gray,
+	     int valuePattern = Qt::SolidPattern,
+	     const QString& label = QString::null,
+	     QColor labelColor = Qt::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; }
+    QColor valueColor() const { return m_valueColor; }
+    int valuePattern() const { return m_valuePattern; }
+    QString label() const { return m_label; }
+    QColor labelColor() const { return m_labelColor; }
+    double proX( int index ) const;
+    double proY( int index ) const;
+
+    void set( double value = INVALID, QColor valueColor = Qt::gray,
+	      int valuePattern = Qt::SolidPattern,
+	      const QString& label = QString::null,
+	      QColor labelColor = Qt::black ) {
+	init( value, valueColor, valuePattern, label, labelColor );
+    }
+    void setValue( double value ) { m_value = value; }
+    void setValueColor( QColor valueColor ) { m_valueColor = valueColor; }
+    void setValuePattern( int valuePattern );
+    void setLabel( const QString& label ) { m_label = label; }
+    void setLabelColor( QColor 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, QColor valueColor, int valuePattern,
+	       const QString& label, QColor labelColor );
+
+    double m_value;
+    QColor m_valueColor;
+    int m_valuePattern;
+    QString m_label;
+    QColor m_labelColor;
+    double m_propoints[2 * MAX_PROPOINTS];
+};
+
+
+QTextStream &operator<<( QTextStream&, const Element& );
+QTextStream &operator>>( QTextStream&, Element& );
+
+#endif
Index: trunk/examples/chart/images/chart-forms.sk
===================================================================
--- trunk/examples/chart/images/chart-forms.sk	(revision 164)
+++ trunk/examples/chart/images/chart-forms.sk	(revision 164)
@@ -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')
Index: trunk/examples/chart/images/file_new.xpm
===================================================================
--- trunk/examples/chart/images/file_new.xpm	(revision 164)
+++ trunk/examples/chart/images/file_new.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!!!!!!!!!!!",
+"!!##########$!!!!!!!",
+"!!#%%%%%%%%#&$!!!!!!",
+"!!#%%%%%%%%#(&$!!!!!",
+"!!#%%%%%%%%#)(&$!!!!",
+"!!#%%%%%%%%#%)(&$!!!",
+"!!#%%%%*****#####!!!",
+"!!#%%%*+++++*%%%#!!!",
+"!!#%%*,++++++*%%#!!!",
+"!!#%*,,,++++++*%#!!!",
+"!!#%*,,,,+++++*%#!!!",
+"!!#%*,,,,-++++*%#!!!",
+"!!#%*,,,---+++*%#!!!",
+"!!#%*,,-----++*%#!!!",
+"!!#%%*-------*%%#!!!",
+"!!#%%%*-----*%%%#!!!",
+"!!#%%%%*****%%%%#!!!",
+"!!#%%%%%%%%%%%%%#!!!",
+"!!###############!!!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
Index: trunk/examples/chart/images/file_open.xpm
===================================================================
--- trunk/examples/chart/images/file_open.xpm	(revision 164)
+++ trunk/examples/chart/images/file_open.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!####!!!!#!",
+"!!!!!!!!!#!!!!##!##!",
+"!!!!!!!!!!!!!!!!###!",
+"!!!!!!!!!!!!!!!####!",
+"!!!!!!!!!!!!!!#####!",
+"!$$$$!!!!!!!!!!!!!!!",
+"$%&%&$$$$$$$$!!!!!!!",
+"$&%&%&%&%&%&$!!!!!!!",
+"$%&&&$$$$$&&$!!!!!!!",
+"$&&&$((((($&$!!!!!!!",
+"$%&$)(($$$$$$$$$$$$$",
+"$&$)))$***********$$",
+"$%$))$***********$$!",
+"$&$)$***********$$!!",
+"$%$$***********$$!!!",
+"$&$***********$$!!!!",
+"$$***********$$!!!!!",
+"$$***********$!!!!!!",
+"$$$$$$$$$$$$$!!!!!!!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
Index: trunk/examples/chart/images/file_print.xpm
===================================================================
--- trunk/examples/chart/images/file_print.xpm	(revision 164)
+++ trunk/examples/chart/images/file_print.xpm	(revision 164)
@@ -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[[["
+};
Index: trunk/examples/chart/images/file_save.xpm
===================================================================
--- trunk/examples/chart/images/file_save.xpm	(revision 164)
+++ trunk/examples/chart/images/file_save.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!!!!!!!!!!!",
+"!##!$$$!!!!!!$$$!%%!",
+"!##!$$!&&&&&&!$$!%%!",
+"!##!$!(&&&&&&&!$!!!!",
+"!##!!(((&&&&&&&!!##!",
+"!##!!((((&&&&&&!!##!",
+"!##!!((((()&&&&!!##!",
+"!##!!((())))&&&!!##!",
+"!##!!(())))))&&!!##!",
+"!##!$!))))))))!$!##!",
+"!###!$!))))))!$*###!",
+"!####***!!!!!***###!",
+"!##################!",
+"!###!!!!!!!!!!!!!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"%!!!!!!!!!!!!!!!!!!%"
+};
Index: trunk/examples/chart/images/file_saveaspostscript.xpm
===================================================================
--- trunk/examples/chart/images/file_saveaspostscript.xpm	(revision 164)
+++ trunk/examples/chart/images/file_saveaspostscript.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!!!!!!!!!!!",
+"!##!$$$!!!!!!$$$!%%!",
+"!##!$$!&&&&&&!$$!%%!",
+"!##!$!(&&&&&&&!$!!!!",
+"!##!!(((&&&&&&&!!##!",
+"!##!!((((&&&&&&!!##!",
+"!##!!((((()&&&&!!##!",
+"!##!!((())))&&&!!##!",
+"!##!!(())))))&&!!##!",
+"!##!$!))))))))!$!##!",
+"!###!$!))))))!$*###!",
+"!####***!!!!!***###!",
+"!##################!",
+"!###!!!!!!!!!!!!!##!",
+"!###!+++!+++!$$$!##!",
+"!###!+!+!+!!!$$$!##!",
+"!###!+++!+++!$$$!##!",
+"!###!+!!!!!+!$$$!##!",
+"!###!+!!!+++!$$$!##!",
+"%!!!!!!!!!!!!!!!!!!%"
+};
Index: trunk/examples/chart/images/options_horizontalbarchart.xpm
===================================================================
--- trunk/examples/chart/images/options_horizontalbarchart.xpm	(revision 164)
+++ trunk/examples/chart/images/options_horizontalbarchart.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!!!!!######",
+"!!!!!!!!!!!!!!######",
+"!!!!!!!!!!!!!!######",
+"!!!!!!!!!!!!!!######",
+"$$$$$$$$$$$$$$$$$###",
+"$$$$$$$$$$$$$$$$$###",
+"$$$$$$$$$$$$$$$$$###",
+"$$$$$$$$$$$$$$$$$###",
+"%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%",
+"&&&&&&&&&&&&&&######",
+"&&&&&&&&&&&&&&######",
+"&&&&&&&&&&&&&&######",
+"&&&&&&&&&&&&&&######",
+"(((((((((((#########",
+"(((((((((((#########",
+"(((((((((((#########",
+"(((((((((((#########"
+};
Index: trunk/examples/chart/images/options_piechart.xpm
===================================================================
--- trunk/examples/chart/images/options_piechart.xpm	(revision 164)
+++ trunk/examples/chart/images/options_piechart.xpm	(revision 164)
@@ -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",
+"!!!!!!#######!!!!!!!",
+"!!!!##$$$$$$$##!!!!!",
+"!!!#%$$$$$$$$$$#!!!!",
+"!!#%%%$$$$$$$$$$#!!!",
+"!#%%%%%$$$$$$$$$$#!!",
+"!#%%%%%$$$$$$$$$$#!!",
+"#%%%%%%%$$$$$$$$$$#!",
+"#%%%%%%%%$$$$$$$$$#!",
+"#%%%%%%%%$$$$$$$$$#!",
+"#%%%%%%%%%$$$$$$$$#!",
+"#%%%%%%%%&&$$$$$$$#!",
+"#%%%%%%%&&&&$$$$$$#!",
+"#%%%%%%&&&&&&&$$$$#!",
+"#%%%%%&&&&&&&&&$$$#!",
+"!#%%%&&&&&&&&&&&&#!!",
+"!#%%&&&&&&&&&&&&&#!!",
+"!!#&&&&&&&&&&&&&#!!!",
+"!!!#&&&&&&&&&&&#!!!!",
+"!!!!##&&&&&&&##!!!!!",
+"!!!!!!#######!!!!!!!"
+};
Index: trunk/examples/chart/images/options_setdata.xpm
===================================================================
--- trunk/examples/chart/images/options_setdata.xpm	(revision 164)
+++ trunk/examples/chart/images/options_setdata.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!$$!!#####!%%!",
+"!#####!$$!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!&&!!#####!%%!",
+"!#####!&&!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!((!!#####!%%!",
+"!#####!((!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!))!!#####!%%!",
+"!#####!))!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!**!!#####!%%!",
+"!#####!**!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!++!!#####!%%!",
+"!#####!++!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
Index: trunk/examples/chart/images/options_setfont.xpm
===================================================================
--- trunk/examples/chart/images/options_setfont.xpm	(revision 164)
+++ trunk/examples/chart/images/options_setfont.xpm	(revision 164)
@@ -0,0 +1,27 @@
+/* XPM */
+static const char *options_setfont[] = {
+"20 20 3 1",
+"  c white",
+"! c None",
+"# c #002EFF",
+"!!!!!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!#####!!!",
+"!!!!!!!!!!!#######!!",
+"!!!!!!!!!!!##!!!!##!",
+"!!!!!!!!!!##!!!!###!",
+"!!!!!!!!!!##!!!!###!",
+"!!!!!!!!!###!!!!!!!!",
+"!!!!!!!!!##!!!!!!!!!",
+"!!!!!#############!!",
+"!!!!###!!########!!!",
+"!!!##!!!!##!!!!!!!!!",
+"!!!##!!!!#!!!!!!!!!!",
+"!!!!!!!!##!!!!!!!!!!",
+"!!!!!!!!##!!!!!!!!!!",
+"!!!!!!!###!!!!!!!!!!",
+"!!!!!!!##!!!!!!!!!!!",
+"!!!!!!##!!!!!!!!!!!!",
+"!#!!!###!!!!!!!!!!!!",
+"!######!!!!!!!!!!!!!",
+"!!####!!!!!!!!!!!!!!"
+};
Index: trunk/examples/chart/images/options_setoptions.xpm
===================================================================
--- trunk/examples/chart/images/options_setoptions.xpm	(revision 164)
+++ trunk/examples/chart/images/options_setoptions.xpm	(revision 164)
@@ -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",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#############$$$$$!",
+"!#%%%%%%%%%%%%&$$$$!",
+"!#%%%%%%%%%%%%%&$$$!",
+"!#%%%%%%%%%%%%%%&$$!",
+"!#%%%%%%%%%%%%%%%&$!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#(((((((%%%%%%%%%#!",
+"!#(((((((%%%%%%%%%#!",
+"!#%%((%%%%%)%))))%#!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#%%((%)))%)))%))%#!",
+"!#%%%%%%%%%%%%%%%%#!",
+"!#%%))%)%))))%))%%#!",
+"!#%%%%%%%%%%%%%%%%#!",
+"!#%%%%%%%%%%%%%%%%#!",
+"!##################!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
Index: trunk/examples/chart/images/options_verticalbarchart.xpm
===================================================================
--- trunk/examples/chart/images/options_verticalbarchart.xpm	(revision 164)
+++ trunk/examples/chart/images/options_verticalbarchart.xpm	(revision 164)
@@ -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",
+"!!!!!!!!####!!!!!!!!",
+"!!!!!!!!####!!!!!!!!",
+"!!!!!!!!####!!!!!!!!",
+"!!!!$$$$####!!!!!!!!",
+"!!!!$$$$####!!!!!!!!",
+"!!!!$$$$####!!!!!!!!",
+"%%%%$$$$####&&&&!!!!",
+"%%%%$$$$####&&&&!!!!",
+"%%%%$$$$####&&&&!!!!",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&(((("
+};
Index: trunk/examples/chart/images/pattern01.xpm
===================================================================
--- trunk/examples/chart/images/pattern01.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern01.xpm	(revision 164)
@@ -0,0 +1,27 @@
+/* XPM */
+static const char *pattern01[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 1 1",
+"  c black",
+/* pixels */
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        ",
+"                                        "
+};
Index: trunk/examples/chart/images/pattern02.xpm
===================================================================
--- trunk/examples/chart/images/pattern02.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern02.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern02[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"                                        ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"                                        ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"                                        ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"                                        ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"                                        ",
+"                                        "
+};
Index: trunk/examples/chart/images/pattern03.xpm
===================================================================
--- trunk/examples/chart/images/pattern03.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern03.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern03[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+"  .   .   .   .   .   .   .   .   .   . ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"  .   .   .   .   .   .   .   .   .   . ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"  .   .   .   .   .   .   .   .   .   . ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"  .   .   .   .   .   .   .   .   .   . ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        ",
+"  .   .   .   .   .   .   .   .   .   . ",
+"                                        ",
+".   .   .   .   .   .   .   .   .   .   ",
+"                                        "
+};
Index: trunk/examples/chart/images/pattern04.xpm
===================================================================
--- trunk/examples/chart/images/pattern04.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern04.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern04[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+".   .   .   .   .   .   .   .   .   .   ",
+" . . . . . . . . . . . . . . . . . . . .",
+"  .   .   .   .   .   .   .   .   .   . ",
+" . . . . . . . . . . . . . . . . . . . .",
+".   .   .   .   .   .   .   .   .   .   ",
+" . . . . . . . . . . . . . . . . . . . .",
+"  .   .   .   .   .   .   .   .   .   . ",
+" . . . . . . . . . . . . . . . . . . . .",
+".   .   .   .   .   .   .   .   .   .   ",
+" . . . . . . . . . . . . . . . . . . . .",
+"  .   .   .   .   .   .   .   .   .   . ",
+" . . . . . . . . . . . . . . . . . . . .",
+".   .   .   .   .   .   .   .   .   .   ",
+" . . . . . . . . . . . . . . . . . . . .",
+"  .   .   .   .   .   .   .   .   .   . ",
+" . . . . . . . . . . . . . . . . . . . .",
+".   .   .   .   .   .   .   .   .   .   ",
+" . . . . . . . . . . . . . . . . . . . .",
+"  .   .   .   .   .   .   .   .   .   . ",
+" . . . . . . . . . . . . . . . . . . . ."
+};
Index: trunk/examples/chart/images/pattern05.xpm
===================================================================
--- trunk/examples/chart/images/pattern05.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern05.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern05[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . "
+};
Index: trunk/examples/chart/images/pattern06.xpm
===================================================================
--- trunk/examples/chart/images/pattern06.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern06.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern06[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . "
+};
Index: trunk/examples/chart/images/pattern07.xpm
===================================================================
--- trunk/examples/chart/images/pattern07.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern07.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern07[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................"
+};
Index: trunk/examples/chart/images/pattern08.xpm
===================================================================
--- trunk/examples/chart/images/pattern08.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern08.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern08[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................"
+};
Index: trunk/examples/chart/images/pattern09.xpm
===================================================================
--- trunk/examples/chart/images/pattern09.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern09.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern09[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+"........................................",
+"                                        ",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"                                        ",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"                                        ",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"                                        "
+};
Index: trunk/examples/chart/images/pattern10.xpm
===================================================================
--- trunk/examples/chart/images/pattern10.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern10.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern10[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... ."
+};
Index: trunk/examples/chart/images/pattern11.xpm
===================================================================
--- trunk/examples/chart/images/pattern11.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern11.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern11[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+"                                        ",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+"                                        ",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+"                                        ",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... .."
+};
Index: trunk/examples/chart/images/pattern12.xpm
===================================================================
--- trunk/examples/chart/images/pattern12.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern12.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern12[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+"..... ....... ....... ....... ....... ..",
+".... ....... ....... ....... ....... ...",
+"... ....... ....... ....... ....... ....",
+".. ....... ....... ....... ....... .....",
+". ....... ....... ....... ....... ......",
+" ....... ....... ....... ....... .......",
+"....... ....... ....... ....... ....... ",
+"...... ....... ....... ....... ....... .",
+"..... ....... ....... ....... ....... ..",
+".... ....... ....... ....... ....... ...",
+"... ....... ....... ....... ....... ....",
+".. ....... ....... ....... ....... .....",
+". ....... ....... ....... ....... ......",
+" ....... ....... ....... ....... .......",
+"....... ....... ....... ....... ....... ",
+"...... ....... ....... ....... ....... .",
+"..... ....... ....... ....... ....... ..",
+".... ....... ....... ....... ....... ...",
+"... ....... ....... ....... ....... ....",
+".. ....... ....... ....... ....... ....."
+};
Index: trunk/examples/chart/images/pattern13.xpm
===================================================================
--- trunk/examples/chart/images/pattern13.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern13.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern13[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+" ....... ....... ....... ....... .......",
+". ....... ....... ....... ....... ......",
+".. ....... ....... ....... ....... .....",
+"... ....... ....... ....... ....... ....",
+".... ....... ....... ....... ....... ...",
+"..... ....... ....... ....... ....... ..",
+"...... ....... ....... ....... ....... .",
+"....... ....... ....... ....... ....... ",
+" ....... ....... ....... ....... .......",
+". ....... ....... ....... ....... ......",
+".. ....... ....... ....... ....... .....",
+"... ....... ....... ....... ....... ....",
+".... ....... ....... ....... ....... ...",
+"..... ....... ....... ....... ....... ..",
+"...... ....... ....... ....... ....... .",
+"....... ....... ....... ....... ....... ",
+" ....... ....... ....... ....... .......",
+". ....... ....... ....... ....... ......",
+".. ....... ....... ....... ....... .....",
+"... ....... ....... ....... ....... ...."
+};
Index: trunk/examples/chart/images/pattern14.xpm
===================================================================
--- trunk/examples/chart/images/pattern14.xpm	(revision 164)
+++ trunk/examples/chart/images/pattern14.xpm	(revision 164)
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern14[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+"  c black",
+". c white",
+/* pixels */
+"... . ..... . ..... . ..... . ..... . ..",
+".. ... ... ... ... ... ... ... ... ... .",
+". ..... . ..... . ..... . ..... . ..... ",
+" ....... ....... ....... ....... .......",
+". ..... . ..... . ..... . ..... . ..... ",
+".. ... ... ... ... ... ... ... ... ... .",
+"... . ..... . ..... . ..... . ..... . ..",
+".... ....... ....... ....... ....... ...",
+"... . ..... . ..... . ..... . ..... . ..",
+".. ... ... ... ... ... ... ... ... ... .",
+". ..... . ..... . ..... . ..... . ..... ",
+" ....... ....... ....... ....... .......",
+". ..... . ..... . ..... . ..... . ..... ",
+".. ... ... ... ... ... ... ... ... ... .",
+"... . ..... . ..... . ..... . ..... . ..",
+".... ....... ....... ....... ....... ...",
+"... . ..... . ..... . ..... . ..... . ..",
+".. ... ... ... ... ... ... ... ... ... .",
+". ..... . ..... . ..... . ..... . ..... ",
+" ....... ....... ....... ....... ......."
+};
Index: trunk/examples/chart/main.cpp
===================================================================
--- trunk/examples/chart/main.cpp	(revision 164)
+++ trunk/examples/chart/main.cpp	(revision 164)
@@ -0,0 +1,21 @@
+#include <qapplication.h>
+#include "chartform.h"
+
+
+int main( int argc, char *argv[] )
+{
+    QApplication app( argc, argv );
+
+    QString filename;
+    if ( app.argc() > 1 ) {
+	filename = app.argv()[1];
+	if ( !filename.endsWith( ".cht" ) )
+	    filename = QString::null;
+    }
+
+    ChartForm *cf = new ChartForm( filename );
+    app.setMainWidget( cf );
+    cf->show();
+
+    return app.exec();
+}
Index: trunk/examples/chart/optionsform.cpp
===================================================================
--- trunk/examples/chart/optionsform.cpp	(revision 164)
+++ trunk/examples/chart/optionsform.cpp	(revision 164)
@@ -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( QWidget* parent, const char* name,
+			  bool modal, WFlags f )
+    : QDialog( parent, name, modal, f )
+{
+    setCaption( "Chart -- Options" );
+    resize( 320, 290 );
+
+    optionsFormLayout = new QVBoxLayout( this, 11, 6 );
+
+    chartTypeLayout = new QHBoxLayout( 0, 0, 6 );
+
+    chartTypeTextLabel = new QLabel( "&Chart Type", this );
+    chartTypeLayout->addWidget( chartTypeTextLabel );
+
+    chartTypeComboBox = new QComboBox( FALSE, this );
+    chartTypeComboBox->insertItem( QPixmap( options_piechart ), "Pie Chart" );
+    chartTypeComboBox->insertItem( QPixmap( options_verticalbarchart ),
+				   "Vertical Bar Chart" );
+    chartTypeComboBox->insertItem( QPixmap( options_horizontalbarchart ),
+				   "Horizontal Bar Chart" );
+    chartTypeLayout->addWidget( chartTypeComboBox );
+    optionsFormLayout->addLayout( chartTypeLayout );
+
+    fontLayout = new QHBoxLayout( 0, 0, 6 );
+
+    fontPushButton = new QPushButton( "&Font...", this );
+    fontLayout->addWidget( fontPushButton );
+    QSpacerItem* spacer = new QSpacerItem( 0, 0,
+					   QSizePolicy::Expanding,
+					   QSizePolicy::Minimum );
+    fontLayout->addItem( spacer );
+
+    fontTextLabel = new QLabel( this ); // Must be set by caller via setFont()
+    fontLayout->addWidget( fontTextLabel );
+    optionsFormLayout->addLayout( fontLayout );
+
+    addValuesFrame = new QFrame( this );
+    addValuesFrame->setFrameShape( QFrame::StyledPanel );
+    addValuesFrame->setFrameShadow( QFrame::Sunken );
+    addValuesFrameLayout = new QVBoxLayout( addValuesFrame, 11, 6 );
+
+    addValuesButtonGroup = new QButtonGroup( "Show Values", addValuesFrame );
+    addValuesButtonGroup->setColumnLayout(0, Qt::Vertical );
+    addValuesButtonGroup->layout()->setSpacing( 6 );
+    addValuesButtonGroup->layout()->setMargin( 11 );
+    addValuesButtonGroupLayout = new QVBoxLayout(
+					addValuesButtonGroup->layout() );
+    addValuesButtonGroupLayout->setAlignment( Qt::AlignTop );
+
+    noRadioButton = new QRadioButton( "&No", addValuesButtonGroup );
+    noRadioButton->setChecked( TRUE );
+    addValuesButtonGroupLayout->addWidget( noRadioButton );
+
+    yesRadioButton = new QRadioButton( "&Yes", addValuesButtonGroup );
+    addValuesButtonGroupLayout->addWidget( yesRadioButton );
+
+    asPercentageRadioButton = new QRadioButton( "As &Percentage",
+						addValuesButtonGroup );
+    addValuesButtonGroupLayout->addWidget( asPercentageRadioButton );
+    addValuesFrameLayout->addWidget( addValuesButtonGroup );
+
+    decimalPlacesLayout = new QHBoxLayout( 0, 0, 6 );
+
+    decimalPlacesTextLabel = new QLabel( "&Decimal Places", addValuesFrame );
+    decimalPlacesLayout->addWidget( decimalPlacesTextLabel );
+
+    decimalPlacesSpinBox = new QSpinBox( addValuesFrame );
+    decimalPlacesSpinBox->setMinValue( 0 );
+    decimalPlacesSpinBox->setMaxValue( 9 );
+    decimalPlacesLayout->addWidget( decimalPlacesSpinBox );
+
+    addValuesFrameLayout->addLayout( decimalPlacesLayout );
+
+    optionsFormLayout->addWidget( addValuesFrame );
+
+    buttonsLayout = new QHBoxLayout( 0, 0, 6 );
+    spacer = new QSpacerItem( 0, 0,
+			      QSizePolicy::Expanding, QSizePolicy::Minimum );
+    buttonsLayout->addItem( spacer );
+
+    okPushButton = new QPushButton( "OK", this );
+    okPushButton->setDefault( TRUE );
+    buttonsLayout->addWidget( okPushButton );
+
+    cancelPushButton = new QPushButton( "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;
+    QFont font = QFontDialog::getFont( &ok, m_font, this );
+    if ( ok )
+	setFont( font );
+}
+
+
+void OptionsForm::setFont( QFont font )
+{
+    QString label = font.family() + " " +
+		    QString::number( font.pointSize() ) + "pt";
+    if ( font.bold() )
+	label += " Bold";
+    if ( font.italic() )
+	label += " Italic";
+    fontTextLabel->setText( label );
+    m_font = font;
+}
Index: trunk/examples/chart/optionsform.h
===================================================================
--- trunk/examples/chart/optionsform.h	(revision 164)
+++ trunk/examples/chart/optionsform.h	(revision 164)
@@ -0,0 +1,60 @@
+#ifndef OPTIONSFORM_H
+#define OPTIONSFORM_H
+
+#include <qdialog.h>
+
+class QButtonGroup;
+class QComboBox;
+class QFrame;
+class QGridLayout;
+class QHBoxLayout;
+class QLabel;
+class QPushButton;
+class QRadioButton;
+class QSpinBox;
+class QVBoxLayout;
+
+
+class OptionsForm : public QDialog
+{
+    Q_OBJECT
+public:
+    OptionsForm( QWidget* parent = 0, const char* name = "options form",
+		 bool modal = FALSE, WFlags f = 0 );
+    ~OptionsForm() {}
+
+    QFont font() const { return m_font; }
+    void setFont( QFont font );
+
+    QLabel *chartTypeTextLabel;
+    QComboBox *chartTypeComboBox;
+    QPushButton *fontPushButton;
+    QLabel *fontTextLabel;
+    QFrame *addValuesFrame;
+    QButtonGroup *addValuesButtonGroup;
+    QRadioButton *noRadioButton;
+    QRadioButton *yesRadioButton;
+    QRadioButton *asPercentageRadioButton;
+    QLabel *decimalPlacesTextLabel;
+    QSpinBox *decimalPlacesSpinBox;
+    QPushButton *okPushButton;
+    QPushButton *cancelPushButton;
+
+protected slots:
+    void chooseFont();
+
+protected:
+    QVBoxLayout *optionsFormLayout;
+    QHBoxLayout *chartTypeLayout;
+    QHBoxLayout *fontLayout;
+    QVBoxLayout *addValuesFrameLayout;
+    QVBoxLayout *addValuesButtonGroupLayout;
+    QHBoxLayout *decimalPlacesLayout;
+    QHBoxLayout *buttonsLayout;
+
+private:
+    QFont m_font;
+};
+
+#endif
+
Index: trunk/examples/chart/setdataform.cpp
===================================================================
--- trunk/examples/chart/setdataform.cpp	(revision 164)
+++ trunk/examples/chart/setdataform.cpp	(revision 164)
@@ -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,
+			  QWidget* parent,  const char* name,
+			  bool modal, WFlags f )
+    : QDialog( parent, name, modal, f )
+
+{
+    m_elements = elements;
+    m_decimalPlaces = decimalPlaces;
+
+    setCaption( "Chart -- Set Data" );
+    resize( 540, 440 );
+
+    tableButtonBox = new QVBoxLayout( this, 11, 6, "table button box layout" );
+
+    table = new QTable( 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 );
+    QHeader *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 QHBoxLayout( 0, 0, 6, "button box layout" );
+
+    colorPushButton = new QPushButton( this, "color button" );
+    colorPushButton->setText( "&Color..." );
+    colorPushButton->setEnabled( FALSE );
+    buttonBox->addWidget( colorPushButton );
+
+    QSpacerItem *spacer = new QSpacerItem( 0, 0, QSizePolicy::Expanding,
+						 QSizePolicy::Minimum );
+    buttonBox->addItem( spacer );
+
+    okPushButton = new QPushButton( this, "ok button" );
+    okPushButton->setText( "OK" );
+    okPushButton->setDefault( TRUE );
+    buttonBox->addWidget( okPushButton );
+
+    cancelPushButton = new QPushButton( this, "cancel button" );
+    cancelPushButton->setText( "Cancel" );
+    cancelPushButton->setAccel( Key_Escape );
+    buttonBox->addWidget( cancelPushButton );
+
+    tableButtonBox->addLayout( buttonBox );
+
+    connect( table, SIGNAL( clicked(int,int,int,const QPoint&) ),
+	     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() ) );
+
+    QPixmap patterns[MAX_PATTERNS];
+    patterns[0]  = QPixmap( pattern01 );
+    patterns[1]  = QPixmap( pattern02 );
+    patterns[2]  = QPixmap( pattern03 );
+    patterns[3]  = QPixmap( pattern04 );
+    patterns[4]  = QPixmap( pattern05 );
+    patterns[5]  = QPixmap( pattern06 );
+    patterns[6]  = QPixmap( pattern07 );
+    patterns[7]  = QPixmap( pattern08 );
+    patterns[8]  = QPixmap( pattern09 );
+    patterns[9]  = QPixmap( pattern10 );
+    patterns[10] = QPixmap( pattern11 );
+    patterns[11] = QPixmap( pattern12 );
+    patterns[12] = QPixmap( pattern13 );
+    patterns[13] = QPixmap( pattern14 );
+
+    QRect rect = table->cellRect( 0, 1 );
+    QPixmap 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,
+		QString( "%1" ).arg( element.value(), 0, 'f',
+				     m_decimalPlaces ) );
+
+	QColor color = element.valueColor();
+	pix.fill( color );
+	table->setPixmap( i, 1, pix );
+	table->setText( i, 1, color.name() );
+
+	QComboBox *combobox = new QComboBox;
+	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, QString( "%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;
+
+    QColor color = QColorDialog::getColor(
+			QColor( table->text( row, col ) ),
+			this, "color dialog" );
+    if ( color.isValid() ) {
+	QPixmap 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( QColor( table->text( i, 1 ) ) );
+	element.setValuePattern(
+		((QComboBox*)table->cellWidget( i, 2 ))->currentItem() + 1 );
+	element.setLabel( table->text( i, 3 ) );
+	element.setLabelColor( QColor( table->text( i, 4 ) ) );
+    }
+
+    QDialog::accept();
+}
Index: trunk/examples/chart/setdataform.h
===================================================================
--- trunk/examples/chart/setdataform.h	(revision 164)
+++ trunk/examples/chart/setdataform.h	(revision 164)
@@ -0,0 +1,47 @@
+#ifndef SETDATAFORM_H
+#define SETDATAFORM_H
+
+#include "element.h"
+
+#include <qdialog.h>
+
+class QHBoxLayout;
+class QPushButton;
+class QTable;
+class QVBoxLayout;
+
+
+class SetDataForm: public QDialog
+{
+    Q_OBJECT
+public:
+    SetDataForm( ElementVector *elements, int decimalPlaces,
+		 QWidget *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:
+    QTable *table;
+    QPushButton *colorPushButton;
+    QPushButton *okPushButton;
+    QPushButton *cancelPushButton;
+
+protected:
+    QVBoxLayout *tableButtonBox;
+    QHBoxLayout *buttonBox;
+
+private:
+    ElementVector *m_elements;
+    int m_decimalPlaces;
+};
+
+#endif
Index: trunk/examples/demo/categoryinterface.h
===================================================================
--- trunk/examples/demo/categoryinterface.h	(revision 164)
+++ trunk/examples/demo/categoryinterface.h	(revision 164)
@@ -0,0 +1,32 @@
+#ifndef CATEGORYINTERFACE_H
+#define CATEGORYINTERFACE_H
+
+#include <qstring.h>
+#include <qiconset.h>
+#include <qobject.h>
+
+class QWidgetStack;
+
+class CategoryInterface : public QObject
+{
+    Q_OBJECT
+
+public:
+    CategoryInterface( QWidgetStack *s ) : stack( s ) {}
+    virtual ~CategoryInterface() {}
+    virtual QString name() const = 0;
+    virtual QIconSet icon() const = 0;
+    virtual int numCategories() const = 0;
+    virtual QString categoryName( int i ) const = 0;
+    virtual QIconSet categoryIcon( int i ) const = 0;
+    virtual int categoryOffset() const = 0;
+
+public slots:
+    virtual void setCurrentCategory( int i ) = 0;
+
+protected:
+    QWidgetStack *stack;
+
+};
+
+#endif
Index: trunk/examples/demo/demo.pro
===================================================================
--- trunk/examples/demo/demo.pro	(revision 164)
+++ trunk/examples/demo/demo.pro	(revision 164)
@@ -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_iw.ts
+
+PRECOMPILED_HEADER = demo_pch.h
Index: trunk/examples/demo/demo_pch.h
===================================================================
--- trunk/examples/demo/demo_pch.h	(revision 164)
+++ trunk/examples/demo/demo_pch.h	(revision 164)
@@ -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
Index: trunk/examples/demo/display.cpp
===================================================================
--- trunk/examples/demo/display.cpp	(revision 164)
+++ trunk/examples/demo/display.cpp	(revision 164)
@@ -0,0 +1,231 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2001 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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(  QWidget *parent, const char *name )
+    : QFrame( parent, name )
+{
+    setLineWidth( FrameWidth );
+    setFrameStyle( Panel | Sunken );
+    setBackgroundMode( PaletteBase );
+    setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::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( QResizeEvent *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 < QABS( 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, QRect( FrameWidth, FrameWidth, width()-2*FrameWidth, height()-2*FrameWidth ));
+}
+
+void Screen::setStep( int s )
+{
+    step = s;
+}
+
+void Screen::drawContents( QPainter *p )
+{
+    QRect 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( QWidget *parent, const char *name )
+    : QFrame( parent, name )
+{
+    setLineWidth( FrameWidth );
+    setFrameStyle( Panel | Sunken );
+    setBackgroundMode( PaletteBase );
+    setPaletteBackgroundColor(black);
+    setPaletteForegroundColor(red);
+    setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+
+    shift = 0;
+    n = 1;
+}
+
+void Curve::drawContents( QPainter *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( QWidget *parent, const char *name )
+    : QWidget( parent, name )
+{
+    timer = 0;
+
+    QVBoxLayout *vbox = new QVBoxLayout( this, 10 );
+
+    QHBoxLayout *hbox = new QHBoxLayout( vbox );
+    screen = new Screen( this );
+    dial = new QDial( 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 QLCDNumber( 2, this );
+    lcd->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+    lcdval = 0;
+    
+    hbox->addWidget( screen );
+
+    QVBoxLayout *vb2 = new QVBoxLayout( hbox );
+
+    curve = new Curve( this );
+    spin = new QSpinBox( 1, 10, 1, this );
+    connect( spin, SIGNAL( valueChanged( int )), curve, SLOT( setFactor( int )));
+    spin->setValue( 2 );
+    vb2->addWidget( curve );
+    vb2->addWidget( spin );
+    
+    QHBoxLayout *hbox2 = new QHBoxLayout( vb2 );
+    
+    hbox2->addWidget( dial );
+    hbox2->addWidget( lcd );
+    
+    bar = new QProgressBar( 10, this );
+    tbar = 0;
+
+    vbox->addWidget( bar );
+}
+
+void DisplayWidget::run()
+{
+    if ( !timer ) {
+	timer = new QTimer( 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( QShowEvent * )
+{
+    run();
+    screen->repaint();
+}
+
+void DisplayWidget::hideEvent( QHideEvent * )
+{
+    stop();
+}
+
Index: trunk/examples/demo/display.h
===================================================================
--- trunk/examples/demo/display.h	(revision 164)
+++ trunk/examples/demo/display.h	(revision 164)
@@ -0,0 +1,94 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DISPLAY_H
+#define DISPLAY_H
+
+#ifndef QT_H
+#include <qwidget.h>
+#include <qframe.h>
+#endif // QT_H
+
+class QTimer;
+class QDial;
+class QLCDNumber;
+class QProgressBar;
+class QSpinBox;
+class Screen;
+class Curve;
+
+class DisplayWidget : public QWidget {
+    Q_OBJECT
+public:
+    DisplayWidget( QWidget *parent=0, const char *name=0 );
+
+    void run();
+    void stop();
+
+protected:
+    virtual void showEvent( QShowEvent * );
+    virtual void hideEvent( QHideEvent * );
+
+private slots:
+    void tick();
+
+private:
+    Screen *screen;
+    QDial *dial;
+    Curve *curve;
+    QSpinBox *spin;
+    QLCDNumber *lcd;
+    int lcdval;
+    QProgressBar *bar;
+    int tbar;
+    QTimer *timer;
+};
+
+class Screen : public QFrame {
+    Q_OBJECT
+public:
+    enum { FrameWidth = 3 };
+    Screen( QWidget *parent=0, const char *name=0 );
+    ~Screen();
+    
+    void animate();
+
+public slots:
+    void setStep( int s );
+
+protected:
+    virtual void drawContents( QPainter * );
+    virtual void resizeEvent( QResizeEvent * );
+
+private:
+    int *yval;
+    int pos0; // buffer pointer for x == 0
+    int t0;   // time parameter at x == 0
+    int step;
+};
+
+class Curve : public QFrame {
+    Q_OBJECT
+    enum { FrameWidth = 3 };
+public:
+    Curve( QWidget *parent=0, const char *name=0 );
+
+    void animate();
+public slots:
+    void setFactor( int );
+
+protected:
+    virtual void drawContents( QPainter * );
+
+private:
+    int shift, n;
+};
+
+#endif // PLOT_H
Index: trunk/examples/demo/dnd/dnd.cpp
===================================================================
--- trunk/examples/demo/dnd/dnd.cpp	(revision 164)
+++ trunk/examples/demo/dnd/dnd.cpp	(revision 164)
@@ -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( QWidget* 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, QListView::Maximum );
+
+    QMap<QString,IconItem>::Iterator it;
+    for( it = items.begin(); it != items.end(); ++it ) {
+        IconItem item = it.data();
+
+        QIconViewItem *iitem = new IconViewItem( iconView, item.name(), *item.pixmap(), it.key() );
+        iitem->setRenameEnabled( TRUE );
+        QListViewItem *litem = new ListViewItem( listView, item.name(), it.key() );
+        litem->setPixmap( 0, *item.pixmap() );
+    }
+}
+
+DnDDemo::~DnDDemo()
+{
+
+}
+
+IconItem::IconItem( const QString& name, const QString& icon )
+{
+    _name = name;
+    _pixmap = loadPixmap( icon );
+}
+
+QPixmap IconItem::loadPixmap( const QString& name )
+{
+    QPixmap pix( "textdrawing/" + name );
+    return pix;
+}
+
+IconItem DnDDemo::findItem( const QString& tag )
+{
+    return items[ tag ];
+}
Index: trunk/examples/demo/dnd/dnd.h
===================================================================
--- trunk/examples/demo/dnd/dnd.h	(revision 164)
+++ trunk/examples/demo/dnd/dnd.h	(revision 164)
@@ -0,0 +1,40 @@
+#include <qpixmap.h>
+#include <qmap.h>
+#include "dndbase.h"
+
+#ifndef DNDDEMO_H
+#define DNDDEMO_H
+
+class IconItem
+{
+public:
+    IconItem( const QString& name = QString::null, const QString& icon = QString::null );
+
+    QString name() { return _name; }
+    QPixmap *pixmap() { return &_pixmap; }
+
+    Q_DUMMY_COMPARISON_OPERATOR( IconItem )
+
+protected:
+    QPixmap loadPixmap( const QString& name );
+
+private:
+    QString _name;
+    QPixmap _pixmap;
+};
+
+class DnDDemo : public DnDDemoBase
+{
+    Q_OBJECT
+
+public:
+    DnDDemo( QWidget* parent = 0, const char* name = 0 );
+    ~DnDDemo();
+
+    IconItem findItem( const QString& tag );
+
+private:
+    QMap<QString,IconItem> items;
+};
+
+#endif
Index: trunk/examples/demo/dnd/dndbase.ui
===================================================================
--- trunk/examples/demo/dnd/dndbase.ui	(revision 164)
+++ trunk/examples/demo/dnd/dndbase.ui	(revision 164)
@@ -0,0 +1,355 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DnDDemoBase</class>
+<widget class="QWidget">
+    <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="QLayoutWidget" 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="QTextEdit" 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="QTextEdit" 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>
Index: trunk/examples/demo/dnd/iconview.cpp
===================================================================
--- trunk/examples/demo/dnd/iconview.cpp	(revision 164)
+++ trunk/examples/demo/dnd/iconview.cpp	(revision 164)
@@ -0,0 +1,42 @@
+#include <qdragobject.h>
+
+#include "dnd.h"
+#include "iconview.h"
+
+
+IconView::IconView( QWidget* parent, const char* name )
+    : QIconView( parent, name )
+{
+    connect( this, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)),
+             SLOT(slotNewItem(QDropEvent*, const QValueList<QIconDragItem>&)));
+}
+
+IconView::~IconView()
+{
+
+}
+
+
+QDragObject *IconView::dragObject()
+{
+    if ( !currentItem() ) return 0;
+
+    QTextDrag * drg = new QTextDrag( ((IconViewItem*)currentItem())->tag(), this );
+    drg->setSubtype("dragdemotag");
+    drg->setPixmap( *currentItem()->pixmap() );
+
+    return drg;
+}
+
+void IconView::slotNewItem( QDropEvent *e, const QValueList<QIconDragItem>& )
+{
+    QString tag;
+    if ( !e->provides( "text/dragdemotag" ) ) return;
+
+    if ( QTextDrag::decode( e, tag ) ) {
+        IconItem item = ((DnDDemo*) parentWidget())->findItem( tag );
+        IconViewItem *iitem = new IconViewItem( this, item.name(), *item.pixmap(), tag );
+        iitem->setRenameEnabled( TRUE );
+    }
+    e->acceptAction();
+}
Index: trunk/examples/demo/dnd/iconview.h
===================================================================
--- trunk/examples/demo/dnd/iconview.h	(revision 164)
+++ trunk/examples/demo/dnd/iconview.h	(revision 164)
@@ -0,0 +1,31 @@
+#include <qiconview.h>
+#include <qstring.h>
+
+#include "dnd.h"
+
+class IconViewItem : public QIconViewItem
+{
+public:
+    IconViewItem( QIconView * parent, const QString & text, const QPixmap & icon, const QString& tag )
+        : QIconViewItem( parent, text, icon ), _tag( tag ) {}
+    virtual ~IconViewItem() {}
+
+    QString tag() { return _tag; }
+
+private:
+    QString _tag;
+};
+
+class IconView : public QIconView
+{
+    Q_OBJECT
+
+public:
+    IconView( QWidget* parent = 0, const char* name = 0 );
+    ~IconView();
+
+    QDragObject *dragObject();
+
+public slots:
+    void slotNewItem( QDropEvent *t, const QValueList<QIconDragItem>& );
+};
Index: trunk/examples/demo/dnd/listview.cpp
===================================================================
--- trunk/examples/demo/dnd/listview.cpp	(revision 164)
+++ trunk/examples/demo/dnd/listview.cpp	(revision 164)
@@ -0,0 +1,72 @@
+#include <qdragobject.h>
+#include <qapplication.h>
+#include "listview.h"
+#include "dnd.h"
+
+ListView::ListView( QWidget* parent, const char* name )
+    : QListView( parent, name )
+{
+    setAcceptDrops( TRUE );
+    setSorting( -1, FALSE );
+    dragging = FALSE;
+}
+
+ListView::~ListView()
+{
+
+}
+
+void ListView::dragEnterEvent( QDragEnterEvent *e )
+{
+    if ( e->provides( "text/dragdemotag" ) )
+	e->accept();
+}
+
+void ListView::dropEvent( QDropEvent *e )
+{
+    if ( !e->provides( "text/dragdemotag" ) )
+         return;
+
+    QString tag;
+
+    if ( QTextDrag::decode( e, tag ) ) {
+        IconItem item = ((DnDDemo*) parentWidget())->findItem( tag );
+        QListViewItem *after = itemAt( viewport()->mapFromParent( e->pos() ) );
+        ListViewItem *litem = new ListViewItem( this, after, item.name(), tag );
+        litem->setPixmap( 0, *item.pixmap() );
+    }
+}
+
+void ListView::contentsMousePressEvent( QMouseEvent *e )
+{
+    QListView::contentsMousePressEvent( e );
+    dragging = TRUE;
+    pressPos = e->pos();
+}
+
+void ListView::contentsMouseMoveEvent( QMouseEvent *e )
+{
+    QListView::contentsMouseMoveEvent( e );
+
+    if ( ! dragging ) return;
+
+    if ( !currentItem() ) return;
+
+    if ( ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+        QTextDrag *drg = new QTextDrag( ((ListViewItem*)currentItem())->tag(), this );
+
+	const QPixmap *p = ((ListViewItem*)currentItem())->pixmap( 0 );
+	if (p)
+	    drg->setPixmap(*p);
+        drg->setSubtype( "dragdemotag" );
+        drg->dragCopy();
+        dragging = FALSE;
+    }
+}
+
+void ListView::contentsMouseReleaseEvent( QMouseEvent *e )
+{
+    QListView::contentsMouseReleaseEvent( e );
+    dragging = FALSE;
+}
+
Index: trunk/examples/demo/dnd/listview.h
===================================================================
--- trunk/examples/demo/dnd/listview.h	(revision 164)
+++ trunk/examples/demo/dnd/listview.h	(revision 164)
@@ -0,0 +1,35 @@
+#include <qlistview.h>
+
+class ListViewItem : public QListViewItem
+{
+public:
+    ListViewItem ( QListView * parent, const QString& name, const QString& tag )
+        : QListViewItem( parent, name ), _tag( tag ) {}
+    ListViewItem ( QListView * parent, QListViewItem * after, const QString& name, const QString& tag )
+        : QListViewItem( parent, after, name ), _tag( tag ) {}
+    virtual ~ListViewItem() {}
+
+    QString tag() { return _tag; }
+
+private:
+    QString _tag;
+};
+
+class ListView : public QListView
+{
+    Q_OBJECT
+
+public:
+    ListView( QWidget* parent = 0, const char* name = 0 );
+    ~ListView();
+
+    void dragEnterEvent( QDragEnterEvent * );
+    void dropEvent( QDropEvent * );
+    void contentsMousePressEvent( QMouseEvent * );
+    void contentsMouseMoveEvent( QMouseEvent * );
+    void contentsMouseReleaseEvent( QMouseEvent * );
+
+private:
+    QPoint pressPos;
+    bool dragging;
+};
Index: trunk/examples/demo/dnd/styledbutton.cpp
===================================================================
--- trunk/examples/demo/dnd/styledbutton.cpp	(revision 164)
+++ trunk/examples/demo/dnd/styledbutton.cpp	(revision 164)
@@ -0,0 +1,295 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#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(QWidget* parent, const char* name)
+    : QButton( 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 QBrush& b, QWidget* parent, const char* name, WFlags f )
+    : QButton( 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 QColor& c )
+{
+    col = c;
+    update();
+}
+
+void StyledButton::setPixmap( const QPixmap & pm )
+{
+    if ( !pm.isNull() ) {
+	delete pix;
+	pix = new QPixmap( pm );
+    } else {
+	delete pix;
+	pix = 0;
+    }
+    scalePixmap();
+}
+
+QColor StyledButton::color() const
+{
+    return col;
+}
+
+QPixmap* StyledButton::pixmap() const
+{
+    return pix;
+}
+
+bool StyledButton::scale() const
+{
+    return s;
+}
+
+void StyledButton::setScale( bool on )
+{
+    if ( s == on )
+	return;
+
+    s = on;
+    scalePixmap();
+}
+
+QSize StyledButton::sizeHint() const
+{
+    return QSize( 50, 25 );
+}
+
+QSize StyledButton::minimumSizeHint() const
+{
+    return QSize( 50, 25 );
+}
+
+void StyledButton::scalePixmap()
+{
+    delete spix;
+
+    if ( pix ) {
+	spix = new QPixmap( 6*width()/8, 6*height()/8 );
+	QImage img = pix->convertToImage();
+
+	spix->convertFromImage( s? img.smoothScale( 6*width()/8, 6*height()/8 ) : img );
+    } else {
+	spix = 0;
+    }
+
+    update();
+}
+
+void StyledButton::resizeEvent( QResizeEvent* e )
+{
+    scalePixmap();
+    QButton::resizeEvent( e );
+}
+
+void StyledButton::drawButton( QPainter *paint )
+{
+    style().drawPrimitive(QStyle::PE_ButtonBevel, paint, rect(), colorGroup(),
+			  isDown() ? QStyle::Style_Sunken : QStyle::Style_Default);
+    drawButtonLabel(paint);
+
+    if (hasFocus())
+	style().drawPrimitive(QStyle::PE_FocusRect, paint,
+			      style().subRect(QStyle::SR_PushButtonFocusRect, this),
+			      colorGroup(), QStyle::Style_Default);
+}
+
+void StyledButton::drawButtonLabel( QPainter *paint )
+{
+    QColor pen = isEnabled() ?
+		 hasFocus() ? palette().active().buttonText() : palette().inactive().buttonText()
+		 : palette().disabled().buttonText();
+    paint->setPen( pen );
+
+    if(!isEnabled()) {
+	paint->setBrush( QBrush( colorGroup().button() ) );
+    }
+    else if ( edit == PixmapEditor && spix ) {
+	paint->setBrush( QBrush( col, *spix ) );
+	paint->setBrushOrigin( width()/8, height()/8 );
+    } else
+	paint->setBrush( QBrush( col ) );
+
+    paint->drawRect( width()/8, height()/8, 6*width()/8, 6*height()/8 );
+}
+
+void StyledButton::onEditor()
+{
+    switch (edit) {
+    case ColorEditor: {
+	QColor c = QColorDialog::getColor( palette().active().background(), this );
+	if ( c.isValid() ) {
+	    setColor( c );
+	    emit changed();
+	}
+    } break;
+    case PixmapEditor: {
+	QPixmap p;
+        /*
+        if ( pixmap() )
+		p = qChoosePixmap( this,*pixmap() );
+        else
+		p = qChoosePixmap( this, QPixmap() );
+	if ( !p.isNull() ) {
+	    setPixmap( p );
+	    emit changed();
+	}
+        */
+    } break;
+    default:
+	break;
+    }
+}
+
+void StyledButton::mousePressEvent(QMouseEvent* e)
+{
+    QButton::mousePressEvent(e);
+    mousePressed = TRUE;
+    pressPos = e->pos();
+}
+
+void StyledButton::mouseMoveEvent(QMouseEvent* e)
+{
+    QButton::mouseMoveEvent( e );
+#ifndef QT_NO_DRAGANDDROP
+    if ( !mousePressed )
+	return;
+    if ( ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+	if ( edit == ColorEditor ) {
+	    QColorDrag *drg = new QColorDrag( col, this );
+	    QPixmap pix( 25, 25 );
+	    pix.fill( col );
+	    QPainter 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() ) {
+	    QImage img = pix->convertToImage();
+	    QImageDrag *drg = new QImageDrag( img, this );
+	    if(spix)
+		drg->setPixmap( *spix );
+	    mousePressed = FALSE;
+	    drg->dragCopy();
+	}
+    }
+#endif
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void StyledButton::dragEnterEvent( QDragEnterEvent *e )
+{
+    setFocus();
+    if ( edit == ColorEditor && QColorDrag::canDecode( e ) )
+	e->accept();
+    else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) )
+	e->accept();
+    else
+	e->ignore();
+}
+
+void StyledButton::dragLeaveEvent( QDragLeaveEvent * )
+{
+    if ( hasFocus() )
+	parentWidget()->setFocus();
+}
+
+void StyledButton::dragMoveEvent( QDragMoveEvent *e )
+{
+    if ( edit == ColorEditor && QColorDrag::canDecode( e ) )
+	e->accept();
+    else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) )
+	e->accept();
+    else
+	e->ignore();
+}
+
+void StyledButton::dropEvent( QDropEvent *e )
+{
+    if ( edit == ColorEditor && QColorDrag::canDecode( e ) ) {
+	QColor color;
+	QColorDrag::decode( e, color );
+	setColor(color);
+	emit changed();
+	e->accept();
+    }
+    else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) ) {
+	QImage img;
+	QImageDrag::decode( e, img );
+	QPixmap pm;
+	pm.convertFromImage(img);
+	setPixmap(pm);
+	emit changed();
+	e->accept();
+    } else {
+	e->ignore();
+    }
+}
+#endif // QT_NO_DRAGANDDROP
Index: trunk/examples/demo/dnd/styledbutton.h
===================================================================
--- trunk/examples/demo/dnd/styledbutton.h	(revision 164)
+++ trunk/examples/demo/dnd/styledbutton.h	(revision 164)
@@ -0,0 +1,93 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef STYLEDBUTTON_H
+#define STYLEDBUTTON_H
+
+#include <qbutton.h>
+#include <qpixmap.h>
+
+class QColor;
+class QBrush;
+
+class StyledButton : public QButton
+{
+    Q_OBJECT
+
+    Q_PROPERTY( QColor color READ color WRITE setColor )
+    Q_PROPERTY( QPixmap 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( QWidget* parent = 0, const char* name = 0 );
+    StyledButton( const QBrush& b, QWidget* parent = 0, const char* name = 0, WFlags f = 0 );
+    ~StyledButton();
+
+    void setEditor( EditorType );
+    EditorType editor() const;
+
+    void setColor( const QColor& );
+    void setPixmap( const QPixmap& );
+
+    QPixmap* pixmap() const;
+    QColor color() const;
+
+    void setScale( bool );
+    bool scale() const;
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+public slots:
+    virtual void onEditor();
+
+signals:
+    void changed();
+
+protected:
+    void mousePressEvent(QMouseEvent*);
+    void mouseMoveEvent(QMouseEvent*);
+#ifndef QT_NO_DRAGANDDROP
+    void dragEnterEvent ( QDragEnterEvent * );
+    void dragMoveEvent ( QDragMoveEvent * );
+    void dragLeaveEvent ( QDragLeaveEvent * );
+    void dropEvent ( QDropEvent * );
+#endif // QT_NO_DRAGANDDROP
+    void drawButton( QPainter* );
+    void drawButtonLabel( QPainter* );
+    void resizeEvent( QResizeEvent* );
+    void scalePixmap();
+
+private:
+    QPixmap* pix;
+    QPixmap* spix;  // the pixmap scaled down to fit into the button
+    QColor col;
+    EditorType edit;
+    bool s;
+    QPoint pressPos;
+    bool mousePressed;
+};
+
+#endif //STYLEDBUTTON_H
Index: trunk/examples/demo/frame.cpp
===================================================================
--- trunk/examples/demo/frame.cpp	(revision 164)
+++ trunk/examples/demo/frame.cpp	(revision 164)
@@ -0,0 +1,153 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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 QTranslator *translator = 0;
+static QTranslator *qt_translator = 0;
+
+Frame::Frame( QWidget *parent, const char *name )
+    : QMainWindow( parent, name )
+{
+    QMenuBar *mainMenu = menuBar();
+    QPopupMenu *fileMenu = new QPopupMenu( this, "file" );
+    fileMenu->insertItem( tr( "&Exit" ), this, SLOT( close() ),
+			  QAccel::stringToKey( tr( "Ctrl+Q" ) ) );
+
+    QPopupMenu *styleMenu = new QPopupMenu( this, "style" );
+    styleMenu->setCheckable( TRUE );
+    QActionGroup *ag = new QActionGroup( this, 0 );
+    ag->setExclusive( TRUE );
+    QSignalMapper *styleMapper = new QSignalMapper( this );
+    connect( styleMapper, SIGNAL( mapped( const QString& ) ),
+	     this, SLOT( setStyle( const QString& ) ) );
+
+    QStringList list = QStyleFactory::keys();
+    list.sort();
+    QDict<int> stylesDict( 17, FALSE );
+    for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
+	QString style = *it;
+	QString 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;
+	}
+	QAction *a = new QAction( style, QIconSet(),
+				  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 QWidgetStack( this );
+
+    setCentralWidget( stack );
+}
+
+void Frame::setCategories( const QPtrList<CategoryInterface> &l )
+{
+    categories = l;
+    QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+    dw->setResizeEnabled( TRUE );
+    dw->setVerticalStretchable( TRUE );
+    addDockWindow( dw, DockLeft );
+    setDockEnabled( dw, DockTop, FALSE );
+    setDockEnabled( dw, DockBottom, FALSE );
+    dw->setCloseMode( QDockWindow::Always );
+
+    toolBox = new QToolBox( 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 );
+}
+
+QWidget *Frame::createCategoryPage( CategoryInterface *c )
+{
+    QButtonGroup *g = new QButtonGroup( 1, Horizontal, toolBox );
+    g->setFrameStyle( QFrame::NoFrame );
+    g->setEraseColor(green);
+    g->setBackgroundMode(PaletteBase);
+    for ( int i = 0; i < c->numCategories(); ++i ) {
+	QToolButton *b = new QToolButton( g );
+	b->setBackgroundMode(PaletteBase);
+	b->setTextLabel( c->categoryName( i ) );
+	b->setIconSet( c->categoryIcon( i ) );
+	b->setAutoRaise( TRUE );
+	b->setTextPosition( QToolButton::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 QString& style )
+{
+    QStyle *s = QStyleFactory::create( style );
+    if ( s )
+	QApplication::setStyle( s );
+}
+
+void Frame::updateTranslators()
+{
+    if ( !qt_translator ) {
+	qt_translator = new QTranslator( qApp );
+	translator = new QTranslator( qApp );
+	qApp->installTranslator( qt_translator );
+	qApp->installTranslator( translator );
+    }
+
+    QString base = QDir("../../translations").absPath();
+    qt_translator->load( QString( "qt_%1" ).arg( QTextCodec::locale() ), base );
+    translator->load( QString( "translations/demo_%1" ).arg( QTextCodec::locale() ) );
+}
+
+bool Frame::event( QEvent *e )
+{
+    if ( e->type() == QEvent::LocaleChange )
+	updateTranslators();
+
+    return QMainWindow::event( e );
+}
Index: trunk/examples/demo/frame.h
===================================================================
--- trunk/examples/demo/frame.h	(revision 164)
+++ trunk/examples/demo/frame.h	(revision 164)
@@ -0,0 +1,46 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qmainwindow.h>
+#include <qintdict.h>
+#include "categoryinterface.h"
+
+class QToolBox;
+class QStyle;
+class QWidgetStack;
+
+class Frame : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    Frame( QWidget *parent=0, const char *name=0 );
+    void setCategories( const QPtrList<CategoryInterface> &l );
+
+    static void updateTranslators();
+
+    QWidgetStack *widgetStack() const { return stack; }
+
+private slots:
+    void setStyle( const QString& );
+
+protected:
+    bool event( QEvent *e );
+
+private:
+    QWidget *createCategoryPage( CategoryInterface *c );
+
+private:
+    QToolBox *toolBox;
+    QWidgetStack *stack;
+    QIntDict<QWidget> categoryPages;
+    QPtrList<CategoryInterface> categories;
+
+};
Index: trunk/examples/demo/graph.cpp
===================================================================
--- trunk/examples/demo/graph.cpp	(revision 164)
+++ trunk/examples/demo/graph.cpp	(revision 164)
@@ -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 QBrush *tb = 0;
+static QPen *tp = 0;
+
+class EdgeItem;
+class NodeItem;
+class FigureEditor;
+typedef QValueList<NodeItem*> NodeItemList;
+typedef QValueList<EdgeItem*> EdgeItemList;
+
+#define SPEED2ADVANCE(x) (301-x)
+
+class GraphWidgetPrivate
+{
+public:
+    GraphWidgetPrivate() {
+	moving = 0;
+	speed = 275;
+    }
+    ~GraphWidgetPrivate() {
+	delete canvas;
+    }
+    NodeItemList nodeItems;
+    FigureEditor* editor;
+    QCanvas* canvas;
+    QCanvasItem* moving;
+    int speed;
+};
+
+class EdgeItem: public QCanvasLine
+{
+public:
+    EdgeItem( NodeItem*, NodeItem*, QCanvas* );
+    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 QCanvasEllipse
+{
+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, QCanvas *canvas )
+    : QCanvasLine( 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 = QMAX( width()/2, nx );
+	ny = QMAX( height()/2, ny );
+	nx = QMIN( canvas()->width() - width()/2, nx );
+	ny = QMIN( canvas()->height() - height()/2, ny );
+    }
+    QCanvasEllipse::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 )
+    : QCanvasEllipse( 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:
+	    QCanvasItem::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 ( QABS( xvel ) < .1 && QABS( yvel ) < .1 )
+	xvel = yvel = 0;
+   setVelocity( xvel, yvel );
+}
+
+
+class FigureEditor : public QCanvasView {
+public:
+    FigureEditor( GraphWidgetPrivate *g, QWidget* parent=0, const char* name=0, WFlags f=0);
+
+    QSize sizeHint() const;
+
+
+protected:
+    void contentsMousePressEvent(QMouseEvent*);
+    void contentsMouseReleaseEvent(QMouseEvent*);
+    void contentsMouseMoveEvent(QMouseEvent*);
+
+
+    void resizeEvent( QResizeEvent* );
+    void showEvent( QShowEvent* );
+    void hideEvent( QHideEvent* e);
+
+private:
+    void initialize();
+    QPoint moving_start;
+    GraphWidgetPrivate* graph;
+};
+
+
+FigureEditor::FigureEditor(
+	GraphWidgetPrivate* g, QWidget* parent,
+	const char* name, WFlags f) :
+    QCanvasView(g->canvas, parent,name,f)
+{
+    graph = g;
+}
+
+void FigureEditor::contentsMousePressEvent(QMouseEvent* e)
+{
+    QCanvasItemList l=canvas()->collisions(e->pos());
+    for (QCanvasItemList::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(QMouseEvent* )
+{
+    if ( graph->moving )
+	graph->moving = 0;
+}
+
+void FigureEditor::contentsMouseMoveEvent(QMouseEvent* 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 QCanvasText {
+    void initPos();
+    void initSpeed();
+public:
+    int rtti() const;
+    BouncyText(const QString&, QFont, QCanvas*);
+    void advance(int);
+};
+
+BouncyText::BouncyText( const QString& text, QFont f, QCanvas* canvas) :
+    QCanvasText(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();
+	}
+
+	QRect 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:
+	QCanvasItem::advance( stage );
+	break;
+    }
+}
+
+GraphWidget::GraphWidget( QWidget *parent, const char *name)
+    : QWidget( parent, name )
+{
+    d = new GraphWidgetPrivate;
+    d->canvas = 0;
+    QVBoxLayout* vb = new QVBoxLayout(  this, 11, 6 );
+    d->editor = new FigureEditor( d, this  );
+    vb->addWidget( d->editor );
+    QHBoxLayout* hb = new QHBoxLayout(  vb );
+    hb->addWidget( new QLabel("Slow", this ) );
+    QSlider* slider = new QSlider( 0, 300, 25, d->speed, Horizontal, this );
+    connect( slider, SIGNAL( valueChanged(int) ), this, SLOT( setSpeed(int) ) );
+    hb->addWidget( slider );
+    hb->addWidget( new QLabel("Fast", this ) );
+    hb->addSpacing( 10 );
+    QPushButton* btn = new QPushButton( "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()));
+    }
+}
+
+
+QSize FigureEditor::sizeHint() const
+{
+    return QSize( 600, 400 );
+}
+
+void FigureEditor::resizeEvent( QResizeEvent* e )
+{
+    if ( canvas() )
+	canvas()->resize( contentsRect().width(), contentsRect().height() );
+    QCanvasView::resizeEvent( e );
+}
+
+void FigureEditor::showEvent( QShowEvent* )
+{
+    initialize();
+    canvas()->setAdvancePeriod( SPEED2ADVANCE(graph->speed) );
+}
+
+void FigureEditor::hideEvent( QHideEvent* )
+{
+    initialize();
+    canvas()->setAdvancePeriod( -10 );
+}
+
+void FigureEditor::initialize()
+{
+    if ( canvas() )
+	return;
+    resize( sizeHint() );
+    graph->canvas = new QCanvas( contentsRect().width(), contentsRect().height() );
+    if ( !tb ) tb = new QBrush( Qt::red );
+    if ( !tp ) tp = new QPen( Qt::black );
+    srand( QTime::currentTime().msec() );
+    int nodecount = 0;
+
+    int rows = 3;
+    int cols = 3;
+
+    QMemArray<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();
+
+    QCanvasItem* i = new BouncyText( tr( "Drag the nodes around!" ), QFont("helvetica", 24), graph->canvas);
+    i->show();
+    setCanvas( graph->canvas );
+    setMinimumSize( 600, 400 );
+    setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+}
Index: trunk/examples/demo/graph.h
===================================================================
--- trunk/examples/demo/graph.h	(revision 164)
+++ trunk/examples/demo/graph.h	(revision 164)
@@ -0,0 +1,32 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qwidget.h>
+class QStyle;
+class QListBox;
+class QListBoxItem;
+class QWidgetStack;
+
+class GraphWidgetPrivate;
+
+class GraphWidget : public QWidget 
+{
+    Q_OBJECT
+public:
+    GraphWidget( QWidget *parent=0, const char *name=0 );
+    ~GraphWidget();
+
+private slots:
+    void shuffle();
+    void setSpeed(int);
+    
+private:
+    GraphWidgetPrivate* d;
+};
Index: trunk/examples/demo/i18n/en.po
===================================================================
--- trunk/examples/demo/i18n/en.po	(revision 164)
+++ trunk/examples/demo/i18n/en.po	(revision 164)
@@ -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"
Index: trunk/examples/demo/i18n/i18n.cpp
===================================================================
--- trunk/examples/demo/i18n/i18n.cpp	(revision 164)
+++ trunk/examples/demo/i18n/i18n.cpp	(revision 164)
@@ -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(QWidget *parent, const char *name)
+    : QMainWindow(parent, name, 0), lastwrapper(0)
+{
+    initActions();
+    initMenuBar();
+
+    QVBox *box = new QVBox(this);
+    box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+    box->setMargin( 1 );
+    box->setLineWidth( 1 );
+
+    workspace = new QWorkspace(box);
+    connect(workspace, SIGNAL(windowActivated(QWidget *)),
+	    SLOT(windowActivated(QWidget *)));
+    workspace->setBackgroundMode(PaletteMid);
+
+    setCentralWidget(box);
+}
+
+
+I18nDemo::~I18nDemo()
+{
+}
+
+
+void I18nDemo::initActions()
+{
+    actionClose = new QAction(tr("Close the current window."),
+			      tr("Close"),
+			      CTRL + Key_F4,
+			      this);
+    connect(actionClose, SIGNAL(activated()), SLOT(closeSlot()));
+
+    actionCloseAll = new QAction(tr("Close all opened windows."),
+				 tr("Close All"),
+				 0,
+				 this);
+    connect(actionCloseAll, SIGNAL(activated()), SLOT(closeAllSlot()));
+
+    actionTile = new QAction(tr("Tile opened windows."),
+			     tr("Tile"),
+			     0,
+			     this);
+    connect(actionTile, SIGNAL(activated()), SLOT(tileSlot()));
+
+    actionCascade = new QAction(tr("Cascade opened windows."),
+				tr("Cascade"),
+				0,
+				this);
+    connect(actionCascade, SIGNAL(activated()), SLOT(cascadeSlot()));
+}
+
+
+void I18nDemo::initMenuBar()
+{
+    newMenu = new QPopupMenu(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 QPopupMenu(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)
+{
+    QString 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( QLayout::FreeResize );
+    te->setMinimumSize(500, 400);
+    te->fileNew();
+    te->currentEditor()->
+	setText(tr("<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>").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;
+
+    QWidgetList list = workspace->windowList();
+    Wrapper *wrapper = (Wrapper *) list.first();
+    while (wrapper) {
+	if (wrapper->id == id) {
+	    wrapper->setFocus();
+	    break;
+	}
+
+	wrapper = (Wrapper *) list.next();
+    }
+}
+
+
+void I18nDemo::windowActivated(QWidget *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()
+{
+    QWidget *w = workspace->activeWindow();
+    delete w;
+}
+
+
+void I18nDemo::closeAllSlot()
+{
+    QWidget *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(QShowEvent *)
+{
+    if (firstShow) {
+	newSlot(1);
+	firstShow = FALSE;
+	return;
+    }
+
+    if (! lastwrapper)
+	return;
+
+    qApp->installTranslator(&lastwrapper->translator);
+}
+
+
+void I18nDemo::hideEvent(QHideEvent *)
+{
+    if (! lastwrapper)
+	return;
+
+    qApp->removeTranslator(&lastwrapper->translator);
+}
Index: trunk/examples/demo/i18n/i18n.h
===================================================================
--- trunk/examples/demo/i18n/i18n.h	(revision 164)
+++ trunk/examples/demo/i18n/i18n.h	(revision 164)
@@ -0,0 +1,44 @@
+#ifndef I18N_H
+#define I18N_H
+
+#include <qmainwindow.h>
+
+class QWorkspace;
+class QAction;
+class QPopupMenu;
+class Wrapper;
+
+
+class I18nDemo : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    I18nDemo(QWidget *, const char * = 0);
+    ~I18nDemo();
+
+    void initActions();
+    void initMenuBar();
+
+    void showEvent(QShowEvent *);
+    void hideEvent(QHideEvent *);
+
+    QWorkspace *workspace;
+    QAction *actionClose, *actionCloseAll, *actionTile, *actionCascade;
+    QPopupMenu *windowMenu, *newMenu;
+    Wrapper *lastwrapper;
+
+
+public slots:
+    void newSlot(int);
+    void windowSlot(int);
+    void windowActivated(QWidget *);
+    void closeSlot();
+    void closeAllSlot();
+    void tileSlot();
+    void cascadeSlot();
+    void wrapperDead();
+};
+
+
+#endif // I18N_H
Index: trunk/examples/demo/i18n/ja.po
===================================================================
--- trunk/examples/demo/i18n/ja.po	(revision 164)
+++ trunk/examples/demo/i18n/ja.po	(revision 164)
@@ -0,0 +1,854 @@
+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 "æå€§å"
Index: trunk/examples/demo/i18n/ko.po
===================================================================
--- trunk/examples/demo/i18n/ko.po	(revision 164)
+++ trunk/examples/demo/i18n/ko.po	(revision 164)
@@ -0,0 +1,852 @@
+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>"
Index: trunk/examples/demo/i18n/no.po
===================================================================
--- trunk/examples/demo/i18n/no.po	(revision 164)
+++ trunk/examples/demo/i18n/no.po	(revision 164)
@@ -0,0 +1,850 @@
+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"
Index: trunk/examples/demo/i18n/wrapper.h
===================================================================
--- trunk/examples/demo/i18n/wrapper.h	(revision 164)
+++ trunk/examples/demo/i18n/wrapper.h	(revision 164)
@@ -0,0 +1,21 @@
+#ifndef WRAPPER_H
+#define WRAPPER_H
+
+#include <qvbox.h>
+#include <qtranslator.h>
+
+
+class Wrapper : public QVBox
+{
+public:
+    Wrapper(QWidget *parent, int i, const char *name = 0)
+	: QVBox(parent, name, WDestructiveClose), translator(this), id(i)
+    {
+    }
+
+    QTranslator translator;
+    int id;
+};
+
+
+#endif // WRAPPER_H
Index: trunk/examples/demo/icons.h
===================================================================
--- trunk/examples/demo/icons.h	(revision 164)
+++ trunk/examples/demo/icons.h	(revision 164)
@@ -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"
+};
Index: trunk/examples/demo/main.cpp
===================================================================
--- trunk/examples/demo/main.cpp	(revision 164)
+++ trunk/examples/demo/main.cpp	(revision 164)
@@ -0,0 +1,378 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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 )
+{
+    QWidget *w = qApp->mainWidget();
+    if ( !w )
+	return;
+    QString title = Frame::tr( "Qt Demo Collection" );
+    title += " - " + c->categoryName( i - c->categoryOffset() );
+    w->setCaption( title );
+}
+
+class WidgetCategory : public CategoryInterface
+{
+public:
+    WidgetCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "Widgets"; }
+    QIconSet icon() const { return QPixmap( widgeticon ); }
+    int numCategories() const { return 2; }
+    QString categoryName( int i ) const {
+	switch ( i ) {
+	case 0:
+	    return Frame::tr( "Widgets" );
+	    break;
+	case 1:
+	    return Frame::tr( "Drag and Drop" );
+	    break;
+	}
+	return QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "Database"; }
+    QIconSet icon() const { return QPixmap( dbicon ); }
+    int numCategories() const { return 1; }
+    QString categoryName( int i ) const {
+	switch ( i ) {
+	case 0:
+	    return Frame::tr( "SQL Explorer" );
+	    break;
+	}
+	return QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "2D Graphics"; }
+    QIconSet icon() const { return QPixmap( twodicon ); }
+    int numCategories() const { return 2; }
+    QString categoryName( int i ) const {
+	switch ( i ) {
+	case 0:
+	    return Frame::tr( "Graph Drawing" );
+	    break;
+	case 1:
+	    return Frame::tr( "Display" );
+	    break;
+	}
+	return QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "3D Graphics"; }
+    QIconSet icon() const { return QPixmap( threedicon ); }
+    int numCategories() const { return 3; }
+    QString 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 QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "Text Drawing/Editing"; }
+    QIconSet icon() const { return QPixmap( texticon ); }
+    int numCategories() const { return 2; }
+    QString categoryName( int i ) const {
+	switch ( i ) {
+	case 0:
+	    return Frame::tr( "Richtext Editor" );
+	    break;
+	case 1:
+	    return Frame::tr( "Help Browser" );
+	    break;
+	}
+	return QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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 );
+	QString home = QDir( "../../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( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "Internationalization"; }
+    QIconSet icon() const { return QPixmap( internicon ); }
+    int numCategories() const { return 1; }
+    QString categoryName( int i ) const {
+	switch ( i ) {
+	case 0:
+	    return Frame::tr( "Internationalization" );
+	    break;
+	}
+	return QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+    QString name() const { return "Game"; }
+    QIconSet icon() const { return QPixmap( joyicon ); }
+    int numCategories() const { return 1; }
+    QString categoryName( int i ) const {
+	switch ( i ) {
+	case 0:
+	    return Frame::tr( "Asteroids" );
+	    break;
+	}
+	return QString::null;
+    }
+    QIconSet categoryIcon( int ) const { return QIconSet(); }
+    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 )
+{
+    QString category;
+    QApplication a( argc, argv );
+
+    Frame::updateTranslators();
+    Frame frame;
+    a.setMainWidget( &frame );
+
+    QPtrList<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();
+}
Index: trunk/examples/demo/opengl/fbm.c
===================================================================
--- trunk/examples/demo/opengl/fbm.c	(revision 164)
+++ trunk/examples/demo/opengl/fbm.c	(revision 164)
@@ -0,0 +1,205 @@
+/*****************************************************************
+
+  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] )
+
+/* 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 required 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() */
+
+
+static 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];
+    }
+}
Index: trunk/examples/demo/opengl/fbm.h
===================================================================
--- trunk/examples/demo/opengl/fbm.h	(revision 164)
+++ trunk/examples/demo/opengl/fbm.h	(revision 164)
@@ -0,0 +1,40 @@
+/*****************************************************************
+
+  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;
+    
+float noise3(float vec[]);
+double fBm( Vector point, double H, double lacunarity, double octaves, 
+	    int init );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
Index: trunk/examples/demo/opengl/gear.xpm
===================================================================
--- trunk/examples/demo/opengl/gear.xpm	(revision 164)
+++ trunk/examples/demo/opengl/gear.xpm	(revision 164)
@@ -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"
+};
Index: trunk/examples/demo/opengl/glbox.cpp
===================================================================
--- trunk/examples/demo/opengl/glbox.cpp	(revision 164)
+++ trunk/examples/demo/opengl/glbox.cpp	(revision 164)
@@ -0,0 +1,143 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget 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( QWidget* 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", QFont( "helvetica", 12, QFont::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;
+}
Index: trunk/examples/demo/opengl/glbox.h
===================================================================
--- trunk/examples/demo/opengl/glbox.h	(revision 164)
+++ trunk/examples/demo/opengl/glbox.h	(revision 164)
@@ -0,0 +1,44 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include "glcontrolwidget.h"
+
+class GLBox : public GLControlWidget
+{
+    Q_OBJECT
+
+public:
+
+    GLBox( QWidget* 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
Index: trunk/examples/demo/opengl/glcontrolwidget.cpp
===================================================================
--- trunk/examples/demo/opengl/glcontrolwidget.cpp	(revision 164)
+++ trunk/examples/demo/opengl/glcontrolwidget.cpp	(revision 164)
@@ -0,0 +1,195 @@
+#include "glcontrolwidget.h"
+
+#include <qcursor.h>
+#include <qtimer.h>
+
+#include <math.h>
+
+GLControlWidget::GLControlWidget( QWidget *parent, const char *name, QGLWidget *share, WFlags f )
+: QGLWidget( 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 QTimer( 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 );
+    QString str( "Rendering text in OpenGL is easy with Qt" );
+    QFontMetrics fm( font() );
+    renderText( (width() - fm.width( str )) / 2, 15, str );
+    QFont f( "courier", 8 );
+    QFontMetrics fmc( f );
+    qglColor( QColor("skyblue") );
+    int x, y, z;
+    x = (xRot >= 0) ? (int) xRot % 360 : 359 - (QABS((int) xRot) % 360);
+    y = (yRot >= 0) ? (int) yRot % 360 : 359 - (QABS((int) yRot) % 360);
+    z = (zRot >= 0) ? (int) zRot % 360 : 359 - (QABS((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( QMouseEvent *e )
+{
+    e->accept();
+    oldPos = e->pos();
+}
+
+void GLControlWidget::mouseReleaseEvent( QMouseEvent *e )
+{
+    e->accept();
+    oldPos = e->pos();
+}
+
+void GLControlWidget::mouseMoveEvent( QMouseEvent *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( QWheelEvent *e )
+{
+    e->accept();
+    if ( scale <= ( (double)e->delta() / 1000 ) )
+	return;
+    setScale( scale - ( (double)e->delta() / 1000 ));
+}
+
+void GLControlWidget::mouseDoubleClickEvent( QMouseEvent * )
+{
+    if ( delay <= 0 )
+	return;
+
+    animation = !animation;
+    if ( animation )
+	timer->start( delay );
+    else
+	timer->stop();
+}
+
+void GLControlWidget::showEvent( QShowEvent *e )
+{
+    if ( wasAnimated && !timer->isActive() )
+	timer->start( delay );
+
+    QGLWidget::showEvent( e );
+}
+
+void GLControlWidget::hideEvent( QHideEvent *e )
+{
+    wasAnimated = timer->isActive();
+    timer->stop();
+    QGLWidget::hideEvent( e );
+}
+
+void GLControlWidget::animate()
+{
+}
+
+void GLControlWidget::setAnimationDelay( int ms )
+{
+    timer->stop();
+    delay = ms;
+    if ( animation ) {
+	wasAnimated = TRUE;
+	timer->start( delay );
+    }
+}
Index: trunk/examples/demo/opengl/glcontrolwidget.h
===================================================================
--- trunk/examples/demo/opengl/glcontrolwidget.h	(revision 164)
+++ trunk/examples/demo/opengl/glcontrolwidget.h	(revision 164)
@@ -0,0 +1,56 @@
+#ifndef GLCONTROLWIDGET_H
+#define GLCONTROLWIDGET_H
+
+#include <qgl.h>
+
+class GLControlWidget : public QGLWidget
+{
+    Q_OBJECT
+
+public:
+    GLControlWidget( QWidget *parent, const char *name = 0, QGLWidget *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( QMouseEvent *e );
+    void		mouseReleaseEvent( QMouseEvent *e );
+    void		mouseMoveEvent( QMouseEvent * );
+    void		mouseDoubleClickEvent( QMouseEvent * );
+    void		wheelEvent( QWheelEvent * );
+
+    void		showEvent( QShowEvent * );
+    void		hideEvent( QHideEvent * );
+
+    GLfloat xRot, yRot, zRot;
+    GLfloat xTrans, yTrans, zTrans;
+    GLfloat scale;
+    bool animation;
+
+protected slots:
+    virtual void	animate();
+
+private:
+    bool wasAnimated;
+    QPoint oldPos;
+    QTimer* timer;
+    int delay;
+};
+
+#endif
Index: trunk/examples/demo/opengl/glgear.cpp
===================================================================
--- trunk/examples/demo/opengl/glgear.cpp	(revision 164)
+++ trunk/examples/demo/opengl/glgear.cpp	(revision 164)
@@ -0,0 +1,272 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// 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( QWidget *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", QFont( "helvetica", 12, QFont::Bold, TRUE ) );
+    glPopMatrix();
+    glPopAttrib();
+}
+
+void GLGear::animate()
+{
+    angle += 2.0;
+    view_roty += 1.0;
+    updateGL();
+}
Index: trunk/examples/demo/opengl/glgear.h
===================================================================
--- trunk/examples/demo/opengl/glgear.h	(revision 164)
+++ trunk/examples/demo/opengl/glgear.h	(revision 164)
@@ -0,0 +1,26 @@
+#ifndef GLGEAR_H
+#define GLGEAR_H
+
+#include "glcontrolwidget.h"
+
+class GLGear : public GLControlWidget
+{
+    Q_OBJECT
+
+public:
+    GLGear( QWidget *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
Index: trunk/examples/demo/opengl/glinfo.h
===================================================================
--- trunk/examples/demo/opengl/glinfo.h	(revision 164)
+++ trunk/examples/demo/opengl/glinfo.h	(revision 164)
@@ -0,0 +1,27 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2003 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef GLINFO_H
+#define GLINFO_H
+
+#include <qstring.h>
+
+class GLInfo
+{
+public:
+    GLInfo();
+    QString info();//extensions();
+/*     QString configs(); */
+
+protected:
+    QString infotext;
+/*     QString config; */
+};
+#endif
Index: trunk/examples/demo/opengl/glinfo_win.cpp
===================================================================
--- trunk/examples/demo/opengl/glinfo_win.cpp	(revision 164)
+++ trunk/examples/demo/opengl/glinfo_win.cpp	(revision 164)
@@ -0,0 +1,126 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2003 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#if defined(Q_CC_MSVC)
+#pragma warning(disable:4305) // init: truncation from const double to float
+#endif
+
+#include "glinfo.h"
+#include <qgl.h>
+#include <windows.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+
+GLInfo::GLInfo()
+{
+    QGLWidget gl((QGLWidget *) 0);
+    gl.makeCurrent();
+
+    // get hold of WGL extensions
+    PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = 
+	(PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress( "wglGetExtensionsStringARB" );
+    QString wglExts;
+    if ( wglGetExtensionsStringARB ) {
+	wglExts = (char *) wglGetExtensionsStringARB( wglGetCurrentDC() );
+	wglExts.replace( ' ', '\n' );
+    }
+    infotext.sprintf( "OpenGL vendor string: %s\n", (const char *) glGetString( GL_VENDOR ) );
+    infotext.sprintf( "%sOpenGL renderer string: %s\n", infotext.ascii(), glGetString( GL_RENDERER ) );
+    infotext.sprintf( "%sOpenGL version string: %s\n", infotext.ascii(), glGetString( GL_VERSION ) );
+    infotext.sprintf( "%s\nWGL extensions:\n%s\n", infotext.ascii(),
+		       !wglExts.isEmpty() ? wglExts.ascii() : "None\n" );
+    infotext.sprintf( "%sOpenGL extensions:\n", infotext.ascii() );
+    infotext += QString( (char *) glGetString( GL_EXTENSIONS ) ).replace( ' ', '\n' );
+    
+    infotext += "\n PF  Color  Draw  Trans  buff lev render DB ste  r   g   b   a  aux dep ste  accum buffers  MS   MS\n"
+	     " id  depth   to   parent size el   type     reo sz  sz  sz  sz  buf th  ncl  r   g   b   a  num bufs\n"
+	     "----------------------------------------------------------------------------------------------------\n";
+    HDC dc;
+    dc = GetDC( gl.winId() );
+    
+    QString str;
+    int i, maxpf;
+    PIXELFORMATDESCRIPTOR pfd;
+	
+    /* calling DescribePixelFormat() with NULL args return maximum
+       number of pixel formats */
+    maxpf = DescribePixelFormat( dc, 0, 0, NULL );
+	
+    for(i = 1; i <= maxpf; i++) { 
+        str = "";
+	DescribePixelFormat( dc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd );
+	if ( !(pfd.dwFlags & PFD_SUPPORT_OPENGL) )
+	    continue;
+	str.sprintf( "0x%02x   %2d  ", i, pfd.cColorBits );
+	if( pfd.dwFlags & PFD_DRAW_TO_WINDOW && pfd.dwFlags & PFD_DRAW_TO_BITMAP )
+	    str.sprintf( "%swin/bmp  ", str.ascii() );
+	else if( pfd.dwFlags & PFD_DRAW_TO_WINDOW )
+	    str.sprintf( "%swindow   ", str.ascii() );
+	else if( pfd.dwFlags & PFD_DRAW_TO_BITMAP ) 
+	    str.sprintf( "%sbitmap   ", str.ascii() );
+	else 
+	    str.sprintf( "%s.        ", str.ascii() );
+		
+	LAYERPLANEDESCRIPTOR lpfd;
+	if ( pfd.bReserved ) {
+	    wglDescribeLayerPlane( dc, i, pfd.bReserved,
+				   sizeof( LAYERPLANEDESCRIPTOR ), &lpfd );
+	    if ( lpfd.dwFlags & LPD_TRANSPARENT && lpfd.iPixelType == PFD_TYPE_RGBA )
+		str.sprintf( "%s%06x %2d   ", str.ascii(), lpfd.crTransparent );
+	    else
+		str.sprintf( "%s%d     %2d   ", str.ascii(), lpfd.crTransparent, pfd.cColorBits );
+	} else {
+	    str.sprintf( "%s0     %2d   ", str.ascii(), pfd.cColorBits );
+	}
+	str.sprintf( "%s%d   ", str.ascii(), pfd.bReserved );
+	if ( pfd.bReserved ) {
+	    bool mpTypeRgba = pfd.iPixelType == PFD_TYPE_RGBA;
+	    bool lpTypeRgba = lpfd.iPixelType == PFD_TYPE_RGBA;
+	    QString type;
+	    if ( mpTypeRgba && lpTypeRgba )
+		type = "rg/rg ";
+	    else if ( mpTypeRgba && !lpTypeRgba )
+		type = "rg/ci ";
+	    else if ( !mpTypeRgba && lpTypeRgba )
+		type = "ci/rg ";
+	    else
+		type = "ci/ci ";
+	    str.sprintf("%s%s ", str.ascii(), type.ascii() );	    
+	} else {
+	    str.sprintf("%s%s", str.ascii(), pfd.iPixelType == PFD_TYPE_RGBA ? "rgba   " : "ci     " );
+	}
+	str.sprintf( "%s%c   %c   ", str.ascii(),
+		     pfd.dwFlags & PFD_DOUBLEBUFFER ? 'y' : 'n',
+		     pfd.dwFlags & PFD_STEREO ? 'y' : 'n' );
+	str.sprintf( "%s%d   ", str.ascii(), pfd.cRedBits );
+	str.sprintf( "%s%d   ", str.ascii(), pfd.cGreenBits );
+	str.sprintf( "%s%d   ", str.ascii(), pfd.cBlueBits );
+	str.sprintf( "%s%d   ", str.ascii(), pfd.cAlphaBits );
+	str.sprintf( "%s%d  ", str.ascii(), pfd.cAuxBuffers );
+	str.sprintf( "%s%2d  ", str.ascii(), pfd.cDepthBits );
+	str.sprintf( "%s%2d   ", str.ascii(), pfd.cStencilBits );
+	str.sprintf( "%s%2d  ", str.ascii(), pfd.cAccumRedBits );
+	str.sprintf( "%s%2d  ", str.ascii(), pfd.cAccumGreenBits );
+	str.sprintf( "%s%2d  ", str.ascii(), pfd.cAccumBlueBits );
+	str.sprintf( "%s%2d  ", str.ascii(), pfd.cAccumAlphaBits );
+
+	/* no multisample in Win32 */
+	str.append( "0   0\n" );
+	infotext.append( str );
+    }
+    ReleaseDC( gl.winId(), dc );
+}
+
+QString GLInfo::info()
+{
+    return infotext;
+}
Index: trunk/examples/demo/opengl/glinfotext.h
===================================================================
--- trunk/examples/demo/opengl/glinfotext.h	(revision 164)
+++ trunk/examples/demo/opengl/glinfotext.h	(revision 164)
@@ -0,0 +1,23 @@
+#include <qlayout.h>
+#include <qtextview.h>
+#include <qfont.h>
+#include "glinfo.h"
+
+class GLInfoText : public QWidget
+{
+public:
+    GLInfoText(QWidget *parent) 
+	: QWidget(parent)
+    {
+	view = new QTextView(this);
+	view->setFont(QFont("courier", 10));
+	view->setWordWrap(QTextEdit::NoWrap);
+	QHBoxLayout *l = new QHBoxLayout(this);
+	l->addWidget(view);
+	GLInfo info;
+	view->setText(info.info());
+    }
+    
+private:
+    QTextView *view;
+};
Index: trunk/examples/demo/opengl/gllandscape.cpp
===================================================================
--- trunk/examples/demo/opengl/gllandscape.cpp	(revision 164)
+++ trunk/examples/demo/opengl/gllandscape.cpp	(revision 164)
@@ -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( QWidget * parent, const char * name )
+    : QGLWidget( 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();
+
+    QImage tex;
+    tex.load("opengl/qtlogo.png");
+    tex = QGLWidget::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()
+{
+    QString 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 require
+		// 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( QMouseEvent *e )
+{
+    oldPos = e->pos();
+    mouseButtonDown = TRUE;
+}
+
+void GLLandscape::mouseReleaseEvent( QMouseEvent *e )
+{
+    oldPos = e->pos();
+    mouseButtonDown = FALSE;
+}
+
+void GLLandscape::mouseMoveEvent( QMouseEvent *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( QTimerEvent *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( QShowEvent * )
+{
+    if (animationRunning)
+ 	animTimer = startTimer(20);	
+    cubeTimer = startTimer(50);
+}
+
+void GLLandscape::hideEvent( QHideEvent * )
+{
+    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();
+}
Index: trunk/examples/demo/opengl/gllandscape.h
===================================================================
--- trunk/examples/demo/opengl/gllandscape.h	(revision 164)
+++ trunk/examples/demo/opengl/gllandscape.h	(revision 164)
@@ -0,0 +1,98 @@
+#ifndef GLLANDSCAPE_H
+#define GLLANDSCAPE_H
+
+#include <qgl.h>
+
+class GLLandscape : public QGLWidget
+{
+    Q_OBJECT
+
+public:
+    GLLandscape( QWidget * 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( QMouseEvent * );
+    void mouseReleaseEvent( QMouseEvent * );
+    void mouseMoveEvent( QMouseEvent * );
+    void timerEvent( QTimerEvent * );
+    void showEvent( QShowEvent * );
+    void hideEvent( QHideEvent * );
+    
+    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];
+    
+    QPoint  oldPos;
+    GLfloat oldX, oldY, oldZ;
+    bool initFractals;
+    int  gridSize, gridHalf;
+    bool animationRunning;
+    bool mouseButtonDown;
+    int cubeTimer, animTimer;
+    GLfloat cubeRot;
+    GLint axisList, cubeList;
+};
+
+#endif
Index: trunk/examples/demo/opengl/gllandscapeviewer.ui
===================================================================
--- trunk/examples/demo/opengl/gllandscapeviewer.ui	(revision 164)
+++ trunk/examples/demo/opengl/gllandscapeviewer.ui	(revision 164)
@@ -0,0 +1,623 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>GLLandscapeViewer</class>
+<widget class="QWidget">
+    <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>Qt/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="QLayoutWidget" 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="QLayoutWidget">
+                    <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="QLabel">
+                            <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="QThumbWheel">
+                            <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="QLayoutWidget">
+                    <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="QLabel">
+                            <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="QThumbWheel">
+                            <property name="name">
+                                <cstring>wheelY</cstring>
+                            </property>
+                            <property name="minimumSize">
+                                <size>
+                                    <width>100</width>
+                                    <height>30</height>
+                                </size>
+                            </property>
+                        </widget>
+                    </vbox>
+                </widget>
+                <widget class="QLayoutWidget">
+                    <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="QLabel">
+                            <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="QThumbWheel">
+                            <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="QLayoutWidget" 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="QButtonGroup">
+                    <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="QRadioButton" row="0" column="0">
+                            <property name="name">
+                                <cstring>RadioButton1</cstring>
+                            </property>
+                            <property name="text">
+                                <string>&amp;Wireframe</string>
+                            </property>
+                            <property name="checked">
+                                <bool>true</bool>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" row="0" column="1">
+                            <property name="name">
+                                <cstring>RadioButton1_2</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Fl&amp;at shaded</string>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" row="0" column="2">
+                            <property name="name">
+                                <cstring>RadioButton1_3</cstring>
+                            </property>
+                            <property name="text">
+                                <string>&amp;Smooth shaded</string>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" row="0" column="3">
+                            <property name="name">
+                                <cstring>RadioButton1_3_2</cstring>
+                            </property>
+                            <property name="text">
+                                <string>&amp;Landscape</string>
+                            </property>
+                        </widget>
+                    </grid>
+                </widget>
+                <widget class="QLayoutWidget">
+                    <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="QPushButton" 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>&amp;Fractalize</string>
+                            </property>
+                            <property name="autoRepeat">
+                                <bool>true</bool>
+                            </property>
+                        </widget>
+                        <widget class="QPushButton" 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>&amp;Reset grid</string>
+                            </property>
+                            <property name="autoRepeat">
+                                <bool>true</bool>
+                            </property>
+                        </widget>
+                        <widget class="QPushButton" 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>&amp;Animate</string>
+                            </property>
+                            <property name="toggleButton">
+                                <bool>true</bool>
+                            </property>
+                            <property name="autoRepeat">
+                                <bool>true</bool>
+                            </property>
+                        </widget>
+                    </grid>
+                </widget>
+            </hbox>
+        </widget>
+        <widget class="QLayoutWidget" 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="QLayoutWidget">
+                    <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="QLabel">
+                            <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="QThumbWheel">
+                            <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="QLabel">
+                            <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="QThumbWheel">
+                            <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="QFrame">
+                    <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>QThumbWheel</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>
Index: trunk/examples/demo/opengl/gllandscapeviewer.ui.h
===================================================================
--- trunk/examples/demo/opengl/gllandscapeviewer.ui.h	(revision 164)
+++ trunk/examples/demo/opengl/gllandscapeviewer.ui.h	(revision 164)
@@ -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 Qt 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()
+{
+
+}
Index: trunk/examples/demo/opengl/gltexobj.cpp
===================================================================
--- trunk/examples/demo/opengl/gltexobj.cpp	(revision 164)
+++ trunk/examples/demo/opengl/gltexobj.cpp	(revision 164)
@@ -0,0 +1,211 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2002 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget demonstrating the use of QImages 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( QWidget* 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", QFont( "helvetica", 12, QFont::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
+
+    QImage tex1, tex2, buf;
+
+    if ( !buf.load( "opengl/gllogo.bmp" ) ) {	// Load first image from file
+	qWarning( "Could not read image file, using single-color instead." );
+	QImage dummy( 128, 128, 32 );
+	dummy.fill( Qt::green.rgb() );
+	buf = dummy;
+    }
+    tex1 = QGLWidget::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." );
+	QImage dummy( 128, 128, 32 );
+	dummy.fill( Qt::red.rgb() );
+	buf = dummy;
+    }
+    tex2 = QGLWidget::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 QImage& tex1, const QImage& 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 );
+    }
+}
Index: trunk/examples/demo/opengl/gltexobj.h
===================================================================
--- trunk/examples/demo/opengl/gltexobj.h	(revision 164)
+++ trunk/examples/demo/opengl/gltexobj.h	(revision 164)
@@ -0,0 +1,45 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLTEXOBJ_H
+#define GLTEXOBJ_H
+
+#include "glcontrolwidget.h"
+
+class GLTexobj : public GLControlWidget
+{
+    Q_OBJECT
+
+public:
+    GLTexobj( QWidget* 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 QImage& tex1, const QImage& tex2 );
+
+    void		setRotationImpulse( double x, double y, double z );
+
+private:
+    GLuint object;
+    double impX, impY, impZ;
+};
+
+#endif // GLTEXOBJ_H
Index: trunk/examples/demo/opengl/glworkspace.cpp
===================================================================
--- trunk/examples/demo/opengl/glworkspace.cpp	(revision 164)
+++ trunk/examples/demo/opengl/glworkspace.cpp	(revision 164)
@@ -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( QWidget *parent, const char *name, WFlags f )
+: QMainWindow( parent, name, f ), printer( 0 )
+{
+    setupSceneActions();
+
+    QVBox *vbox = new QVBox( this );
+    vbox->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+    vbox->setMargin( 1 );
+    vbox->setLineWidth( 1 );
+
+    workspace = new QWorkspace( vbox );
+    workspace->setBackgroundMode( PaletteMid );
+    setCentralWidget( vbox );
+}
+
+GLWorkspace::~GLWorkspace()
+{
+}
+
+void GLWorkspace::setupSceneActions()
+{
+    QToolBar *tb = new QToolBar( "Scene", this );
+    QPopupMenu *menu = new QPopupMenu( this );
+    menuBar()->insertItem( tr( "&Scene" ), menu );
+
+    QAction *a;
+    QActionGroup *newGroup = new QActionGroup( this );
+    newGroup->setMenuText( tr( "&New" ) );
+    newGroup->setText( tr( "New" ) );
+    newGroup->setUsesDropDown( TRUE );
+    newGroup->setExclusive( FALSE );
+    newGroup->setIconSet( QPixmap( "textdrawing/filenew.png" ) );
+    a = new QAction( tr( "Wirebox" ), QPixmap( "opengl/wirebox.xpm" ), tr( "&Wirebox" ), 0, newGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( newWirebox() ) );
+    a = new QAction( tr( "Gear" ), QPixmap( "opengl/gear.xpm" ), tr( "&Gears" ), 0, newGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( newGear() ) );
+    a = new QAction( tr( "Texture" ), QPixmap( "opengl/texture.xpm" ), tr( "&Texture" ), 0, newGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( newTexture() ) );
+/*    a = new QAction( tr( "Nurbs" ), QPixmap( "opengl/nurbs.xpm" ), tr( "&Nurbs" ), 0, newGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( newNurbs() ) );*/
+    newGroup->addTo( tb );
+    newGroup->addTo( menu );
+
+    menu->insertSeparator();
+    QActionGroup *printGroup = new QActionGroup( this );
+    printGroup->setMenuText( tr( "&Print" ) );
+    printGroup->setText( tr( "Print" ) );
+    printGroup->setUsesDropDown( TRUE );
+    printGroup->setExclusive( FALSE );
+    printGroup->setIconSet( QPixmap( "textdrawing/print.png" ) );
+    QAction *da = new QAction( tr( "Window Size" ), QPixmap( "textdrawing/print.png" ), tr( "&Window Size" ), CTRL + Key_P, printGroup );
+    connect( da, SIGNAL( activated() ), this, SLOT( filePrintWindowRes() ) );
+    a = new QAction( tr( "Low Resolution" ), tr( "&Low Resolution" ), 0, printGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( filePrintLowRes() ) );
+    a = new QAction( tr( "Medium Resolution" ), tr( "&Medium Resolution" ), 0, printGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( filePrintMedRes() ) );
+    a = new QAction( tr( "High Resolution" ), tr( "&High Resolution" ), 0, printGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( filePrintHighRes() ) );
+    printGroup->addSeparator();
+    a = new QAction( tr( "Setup" ), tr( "&Setup..." ), 0, printGroup );
+    connect( a, SIGNAL( activated() ), this, SLOT( filePrintSetup() ) );
+    da->addTo( tb );
+    printGroup->addTo( menu );
+
+    a = new QAction( tr( "Close" ), QPixmap(), 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( QPixmap( "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( QPixmap( "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( QPixmap( "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( QPixmap( "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;
+
+    QWidget *widget = workspace->activeWindow();
+    if ( !widget || !widget->inherits( "QGLWidget" ) )
+	return;
+    QGLWidget *gl = (QGLWidget *)widget;
+    QPixmap pm = gl->renderPixmap( x, y );
+
+    PrintPreview view( this );
+    QImage temp = pm.convertToImage();
+    temp = temp.smoothScale( 400, 300 );
+    QPixmap temppix;
+    temppix.convertFromImage( temp );
+    view.setPixmap( temppix );
+    view.setIcon( QPixmap( "opengl/snapshot.xpm" ) );
+    view.setCaption( gl->caption() + " - Print preview" );
+    if ( view.exec() ) {
+	QImage 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 );
+
+	QPainter painter;
+	if ( !painter.begin( printer ) )
+	    return;
+
+	painter.drawPixmap( QPoint( 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 QPrinter;
+    if ( printer->setup() ) {
+	return TRUE;
+    } else {
+	if ( newPrinter ) {
+	    delete printer;
+	    printer = 0;
+	}
+	return FALSE;
+    }
+}
+
+void GLWorkspace::fileClose()
+{
+    workspace->closeActiveWindow();
+}
Index: trunk/examples/demo/opengl/glworkspace.h
===================================================================
--- trunk/examples/demo/opengl/glworkspace.h	(revision 164)
+++ trunk/examples/demo/opengl/glworkspace.h	(revision 164)
@@ -0,0 +1,37 @@
+#ifndef GLWORKSPACE_H
+#define GLWORKSPACE_H
+
+#include <qmainwindow.h>
+
+class QWorkspace;
+class QPrinter;
+
+class GLWorkspace : public QMainWindow
+{
+    Q_OBJECT
+public:
+    GLWorkspace( QWidget *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:
+    QWorkspace *workspace;
+    QPrinter *printer;
+};
+
+#endif //GLWORKSPACE_H
Index: trunk/examples/demo/opengl/nurbs.xpm
===================================================================
--- trunk/examples/demo/opengl/nurbs.xpm	(revision 164)
+++ trunk/examples/demo/opengl/nurbs.xpm	(revision 164)
@@ -0,0 +1,337 @@
+/* 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 SSSSSSS~©SSSSSSSSSSSSSSSSSSSSSSSSSSSSsSSSSiirci/M
+l~oS€SSSSSSSSSSSSSSSSSSSSSS~S©Yy]P
+~_SSSSSSSSSSSSSSSSSSSSSSSSvŽ
+dz]m_d6ŽppidŽ°i~SMSSSSSSSSSSSSSSSSS©SSS®v~EBi_y6&lldp§SSSS
+SSSSSSSSSSSr§§R&6p&TL%yc'&pTydXªnSSSSSSSSSSSSŽTYc6mŠ@?L//
+
+YTis/SSSSSSSSSSSSSS|L__TT]i~_/Tciy~dSSSSSSSSSSSSSSvSS¥L]Y
+_=+M]+=EESml99 @z_SSSSSSSSSSSSSSrdpI/3]%MZI955]c]r|) &_P§r©SSS
+SSSSSSS]sEw3]d@E]vdE5@L@S'"56m'SSSSSS~SS3_%
+cyi?Eib= TFHCCERi
+ŽŠ@9@
+°SSSSSSSd6€c7d/II9IS)brREED[
+ilE/=S¢wŽzSSSo|sms§C
+b+"@I/bºxbEHDZ
+ZiE5°SŽSSS©€S]sidi
+Fl5@I) ×¿º±¬~[CC9||w|f_Ž|S
+§©Ss3Si@Sd5"B/uá×ËÁµrCEDTbci&6]SS`ŽS§LviBjivP9Y
+/
+LWÞ×áÊº±[H
+HB|bbB]BLŽSSS7)7
+Z|]p Ec79ÞÞáÕÅ«¥rHEPbZvT&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|©ŽSi^ylsT%Õº±¥bECEBSŽ×ÀÁ¥XSS@BmRr@'SS SLcªW|m@bÕËÅÅ¥xYCCClC_ºÕÁuljL"Y|Y^7_LyŠSSSS€@
+Sj
+±á×ÕÅµrHCHF"9
+
+7Lyd
+9'bwE]?m§§SSSSvvŽºéÞÕËºµxYCH6;?S]
+"0]€L^TsfSSSSScpvbééåÕ¿º¥bE6irM_rr|L"bYIT¢/5b_LSS©SiiSS]+9ÁéåÕËºnEBru[DDE@IC
+v~i fS+©S©SSS¬Sp|pIÁååËŽºbDCrRDEBlpdWY7€T=Y¯S©SSsWFc5&áËÀËÁ¥uRI±µ±¡xYEEFdjI]9^r7+p&BÍS|SSSS|@=ÅÕÁ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'RSsSSSS||S^]S3
+6?@6/psB«áéå×ÈµYE@FBi|Y@PBS|Ù§SSSSS¹bprWB'6
+MSEááéËÅ±RES]bvb_PdSÃ||SSSSS|ccIC
+6/0";9ËËÊŽ«xHF@?
+IY6L§§SSSSSSsySSsvI^?"+";/6ÞÊÁµ_R;5SSEL§ŽSsSSSSSSS§ŽSsFvTM]M6 ; +xxlIpZrW0
+'~§ÃSÃSSSSSSSS§ISp¬bŽ€º
+00/I//ISB"Y]®¯ŽSSSSSSSSSSS|YSrcmZc+6"+=p
+S
+rSÍSSSSSSSSSSSSSnS|s¢^lcIrSL?"50+//I9SI
+ZS€SSSSSSSSSSSSSilSS¢®§|Pffb|3cjIB+"
+S+)]Z€SSTSSSSSSSSSSSSSSSsrSS©s€rTr9Mr@0'"+9?
+E|  ŽSSSSSSSSSSSSSSSSSSSS)SS©~)
+FISrMsY5ºSS|ŽSSSSSSSSSSSSSSSSSSSSSypSSSS©p]ciw@º|iSSSSSSSSSSSSSSSSSSSSSSSS|¯°~Ž§SS§S|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS§§€SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMSSSSS||SSSSSSSSSSSSSSSSSSSSS
Index: trunk/examples/demo/opengl/printpreview.ui
===================================================================
--- trunk/examples/demo/opengl/printpreview.ui	(revision 164)
+++ trunk/examples/demo/opengl/printpreview.ui	(revision 164)
@@ -0,0 +1,277 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PrintPreview</class>
+<widget class="QDialog">
+    <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="QGroupBox" 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="QLabel">
+                    <property name="name">
+                        <cstring>pixmapLabel</cstring>
+                    </property>
+                    <property name="text">
+                        <string>TextLabel1</string>
+                    </property>
+                </widget>
+            </hbox>
+        </widget>
+        <widget class="QGroupBox" 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="QCheckBox">
+                    <property name="name">
+                        <cstring>checkInvert</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Invert Colors</string>
+                    </property>
+                </widget>
+                <widget class="QCheckBox">
+                    <property name="name">
+                        <cstring>checkMirror</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Mirror</string>
+                    </property>
+                </widget>
+                <widget class="QCheckBox">
+                    <property name="name">
+                        <cstring>checkFlip</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Flip</string>
+                    </property>
+                </widget>
+                <widget class="QCheckBox">
+                    <property name="name">
+                        <cstring>checkLeft</cstring>
+                    </property>
+                    <property name="text">
+                        <string>Rotate 90Â° &amp;left</string>
+                    </property>
+                </widget>
+                <widget class="QCheckBox">
+                    <property name="name">
+                        <cstring>checkRight</cstring>
+                    </property>
+                    <property name="text">
+                        <string>Rotate 90Â° &amp;right</string>
+                    </property>
+                </widget>
+            </vbox>
+        </widget>
+        <widget class="QLayoutWidget" 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="QPushButton">
+                    <property name="name">
+                        <cstring>buttonHelp</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;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="QPushButton">
+                    <property name="name">
+                        <cstring>buttonOk</cstring>
+                    </property>
+                    <property name="caption">
+                        <string></string>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Print</string>
+                    </property>
+                    <property name="autoDefault">
+                        <bool>true</bool>
+                    </property>
+                    <property name="default">
+                        <bool>true</bool>
+                    </property>
+                </widget>
+                <widget class="QPushButton">
+                    <property name="name">
+                        <cstring>buttonCancel</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;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>QPixmap 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 QPixmap &amp; pm )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
Index: trunk/examples/demo/opengl/printpreview.ui.h
===================================================================
--- trunk/examples/demo/opengl/printpreview.ui.h	(revision 164)
+++ trunk/examples/demo/opengl/printpreview.ui.h	(revision 164)
@@ -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
+** Qt 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()
+{
+    QImage 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() ) {
+    }
+    QPixmap 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 QPixmap & pm )
+{
+    pix = pm;
+    updatePreview();
+}
Index: trunk/examples/demo/opengl/snapshot.xpm
===================================================================
--- trunk/examples/demo/opengl/snapshot.xpm	(revision 164)
+++ trunk/examples/demo/opengl/snapshot.xpm	(revision 164)
@@ -0,0 +1,241 @@
+/* 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                                                                             
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+SSSSSDxNCCCSSSSSSSSSSSSSSSSSSSSSSSSSDdxmdRDMCSSSSSSSSSSSSSSSSSSSSSDNRzCk²
+kZZD
+=SSSSSSSSSSSSSSSSS4MNdzD
+ùùùùÒoR=SSSSSSSSSSSSSSS.CDDkkdùùùùùùåZ4MgCSSSSSSSSSSS
+S%=C=gRšòùÒÒùR%ak=NSSSSSSSSSSS.444kg=qùÙs®²ÒM%
+o=NSSSSSSSSSSS./44DwCDïÉRÀàÒ
+M%~d%:SSSSSSSSSSS%.//2CMùùseEÉ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%ïù4LRR­a.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
Index: trunk/examples/demo/opengl/texture.xpm
===================================================================
--- trunk/examples/demo/opengl/texture.xpm	(revision 164)
+++ trunk/examples/demo/opengl/texture.xpm	(revision 164)
@@ -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ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZG>GY::1111GYaÑÑ²ÑÑÑ»ÑÁ»Ñ»»Ñ«
+nGaUU1:>YU>G:11ÿZG>:>:>>11:>>U«²ÑÑÑÁÑ»²ÑÑ»Ñ²«naaGG::1:G>>:1:ÿZ>:::1:>>:1>>Ga
+«»ÁÑÑÑ²Ñ²Ñ²Ñ«Ñ«GaUG>:>>::1':>ÿZ>'':11>:1111>1«Ñ»»ÑÑ»»Ñ²Ñ²«aUGU>11>1111:>ÿ
+ZG1'1':11:11::a²«»»»²²»»Ñ²²«rGaUaG:11:111:GÿZ>1''1:1'1:1:1>Yr«»«»«««««««
+aGGa>::::1>:UYÿZU11'111'111:11111a«nG>GG>>:11'1:1:ÿZY1'>G>:1:1''1'
+''1>Gara>>1>>>111'1>>:ÿZ>YUUaaaU>::>1'''1UrrnrrrY>1>11>''11::::ÿ
+ZYnYYnYG1>11'''>'GraYYYaaY>1111'111>GUUYUÿZaYaaG>>1111''rnGG>>GYYYG
+:1>111111G>GaGGÿZYrYrra>'1>11''''G>G'>1>>GG>:1'1111'1>GG>GUÿZGYUUUYrrY>>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««raaG>:>>>>:>>>>GGUGUGÿZ>>:>'>11'1>>'YaaaGG>1G>::>>>>GGGGGGGÿZ>>>>11>>111'>G²«rrnU>>G>GU>::>GGGGGGGÿZG:>>>>1'11>1'a«²G'a«²raU>:>G::>:::>>>>>G>ÿZGU>>>>'1'>>>'«²»ar»Á»ra>:>>G>>:>>>>>UYGUÿZ>'GG>'>'>>''>«²»«Á»Á²»²rGG>>>>:>::>>GYaYnrÿZ>>>>>G>>>'>>Y«ÁÁ»Á»«²ÑÁ»«rG:>G>G>::YnnrrrÿZ>GG'GYGGGY''a«ÁÁ»Á²§ÑÁÑÁ«Y>G>>:>::UUUUUYGGÿZGYGraa>nr>1'r»»«²«»²²»»»«Y>>>>:1:1>GGYrGUYÿZYnnr>>'r«»a««r«a:::11'':UGUUGaYGÿZann«Ñ«««G>>>1'G»aa'YGrY1::1'1':GGGUnnnYÿZrnn«²«Ñ«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>>:>§§ÿZaG1111::>U§§§ÿZnn§ÿZ§§§ÿZÿZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
Index: trunk/examples/demo/opengl/wirebox.xpm
===================================================================
--- trunk/examples/demo/opengl/wirebox.xpm	(revision 164)
+++ trunk/examples/demo/opengl/wirebox.xpm	(revision 164)
@@ -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  .                                  "};
Index: trunk/examples/demo/qasteroids/ledmeter.cpp
===================================================================
--- trunk/examples/demo/qasteroids/ledmeter.cpp	(revision 164)
+++ trunk/examples/demo/qasteroids/ledmeter.cpp	(revision 164)
@@ -0,0 +1,117 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#include <qpainter.h>
+#include "ledmeter.h"
+
+KALedMeter::KALedMeter( QWidget *parent ) : QFrame( 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 QColor &c )
+{
+    ColorRange *cr = new ColorRange;
+    cr->mPc = pc;
+    cr->mColor = c;
+    mCRanges.append( cr );
+    calcColorRanges();
+}
+
+void KALedMeter::resizeEvent( QResizeEvent *e )
+{
+    QFrame::resizeEvent( e );
+    int w = ( width() - frameWidth() - 2 ) / mCount * mCount;
+    w += frameWidth() + 2;
+    setFrameRect( QRect( 0, 0, w, height() ) );
+}
+
+void KALedMeter::drawContents( QPainter *p )
+{
+    QRect b = contentsRect();
+
+    unsigned cidx = 0;
+    int ncol = mCount;
+    QColor 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;
+    }
+}
+
Index: trunk/examples/demo/qasteroids/ledmeter.h
===================================================================
--- trunk/examples/demo/qasteroids/ledmeter.h	(revision 164)
+++ trunk/examples/demo/qasteroids/ledmeter.h	(revision 164)
@@ -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 QFrame
+{
+    Q_OBJECT
+public:
+    KALedMeter( QWidget *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 QColor &c );
+
+public slots:
+    void setValue( int v );
+
+protected:
+    virtual void resizeEvent( QResizeEvent * );
+    virtual void drawContents( QPainter * );
+    void calcColorRanges();
+
+protected:
+    struct ColorRange
+    {
+	int mPc;
+	int mValue;
+	QColor mColor;
+    };
+
+    int mRange;
+    int mCount;
+    int mCurrentCount;
+    int mValue;
+    QPtrList<ColorRange> mCRanges;
+};
+
+#endif
Index: trunk/examples/demo/qasteroids/sprites.h
===================================================================
--- trunk/examples/demo/qasteroids/sprites.h	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites.h	(revision 164)
@@ -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 QCanvasSprite
+{
+public:
+    KMissile( QCanvasPixmapArray *s, QCanvas *c ) : QCanvasSprite( 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 QCanvasSprite
+{
+public:
+    KBit( QCanvasPixmapArray *s, QCanvas *c ) : QCanvasSprite( 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 QCanvasSprite
+{
+public:
+    KExhaust( QCanvasPixmapArray *s, QCanvas *c ) : QCanvasSprite( 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 QCanvasSprite
+{
+public:
+  KPowerup( QCanvasPixmapArray *s, QCanvas *c, int t ) : QCanvasSprite( 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 QCanvasSprite
+{
+public:
+    KRock (QCanvasPixmapArray *s, QCanvas *c, int t, int sk, int st) : QCanvasSprite( s, c )
+        { type = t; skip = cskip = sk; step = st; }
+
+    void nextFrame()
+	{
+	    if (cskip-- <= 0) {
+		setFrame( (frame()+step+frameCount())%frameCount() );
+		cskip = QABS(skip);
+	    }
+	}
+
+    virtual int rtti() const { return type; }
+
+private:
+    int type;
+    int skip;
+    int cskip;
+    int step;
+};
+
+class KShield : public QCanvasSprite
+{
+public:
+  KShield( QCanvasPixmapArray *s, QCanvas *c )
+      : QCanvasSprite( s, c ) {}
+
+  virtual int rtti() const { return ID_SHIELD; }
+};
+
+#endif
Index: trunk/examples/demo/qasteroids/sprites/bits/bits.ini
===================================================================
--- trunk/examples/demo/qasteroids/sprites/bits/bits.ini	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/bits/bits.ini	(revision 164)
@@ -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
Index: trunk/examples/demo/qasteroids/sprites/bits/bits.pov
===================================================================
--- trunk/examples/demo/qasteroids/sprites/bits/bits.pov	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/bits/bits.pov	(revision 164)
@@ -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>
+}
+
+
+
Index: trunk/examples/demo/qasteroids/sprites/rock1/rock1.ini
===================================================================
--- trunk/examples/demo/qasteroids/sprites/rock1/rock1.ini	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/rock1/rock1.ini	(revision 164)
@@ -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
Index: trunk/examples/demo/qasteroids/sprites/rock1/rock1.pov
===================================================================
--- trunk/examples/demo/qasteroids/sprites/rock1/rock1.pov	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/rock1/rock1.pov	(revision 164)
@@ -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>
+}
+
Index: trunk/examples/demo/qasteroids/sprites/rock2/rock2.ini
===================================================================
--- trunk/examples/demo/qasteroids/sprites/rock2/rock2.ini	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/rock2/rock2.ini	(revision 164)
@@ -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
Index: trunk/examples/demo/qasteroids/sprites/rock2/rock2.pov
===================================================================
--- trunk/examples/demo/qasteroids/sprites/rock2/rock2.pov	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/rock2/rock2.pov	(revision 164)
@@ -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>
+}
+
Index: trunk/examples/demo/qasteroids/sprites/rock3/rock3.ini
===================================================================
--- trunk/examples/demo/qasteroids/sprites/rock3/rock3.ini	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/rock3/rock3.ini	(revision 164)
@@ -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
Index: trunk/examples/demo/qasteroids/sprites/rock3/rock3.pov
===================================================================
--- trunk/examples/demo/qasteroids/sprites/rock3/rock3.pov	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/rock3/rock3.pov	(revision 164)
@@ -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>
+}
+
Index: trunk/examples/demo/qasteroids/sprites/ship/ship.ini
===================================================================
--- trunk/examples/demo/qasteroids/sprites/ship/ship.ini	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/ship/ship.ini	(revision 164)
@@ -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
Index: trunk/examples/demo/qasteroids/sprites/ship/ship.pov
===================================================================
--- trunk/examples/demo/qasteroids/sprites/ship/ship.pov	(revision 164)
+++ trunk/examples/demo/qasteroids/sprites/ship/ship.pov	(revision 164)
@@ -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>
+}
+
+
Index: trunk/examples/demo/qasteroids/toplevel.cpp
===================================================================
--- trunk/examples/demo/qasteroids/toplevel.cpp	(revision 164)
+++ trunk/examples/demo/qasteroids/toplevel.cpp	(revision 164)
@@ -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( QWidget *parent, const char *name )
+    : QMainWindow( parent, name, 0 )
+{
+    QWidget *border = new QWidget( this );
+    border->setBackgroundColor( black );
+    setCentralWidget( border );
+
+    QVBoxLayout *borderLayout = new QVBoxLayout( border );
+    borderLayout->addStretch( 1 );
+
+    QWidget *mainWin = new QWidget( 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() ) );
+
+    QVBoxLayout *vb = new QVBoxLayout( mainWin );
+    QHBoxLayout *hb = new QHBoxLayout;
+    QHBoxLayout *hbd = new QHBoxLayout;
+    vb->addLayout( hb );
+
+    QFont labelFont( "helvetica", 24 );
+    QColorGroup grp( darkGreen, black, QColor( 128, 128, 128 ),
+	    QColor( 64, 64, 64 ), black, darkGreen, black );
+    QPalette pal( grp, grp, grp );
+
+    mainWin->setPalette( pal );
+
+    hb->addSpacing( 10 );
+
+    QLabel *label;
+    label = new QLabel( tr("Score"), mainWin );
+    label->setFont( labelFont );
+    label->setPalette( pal );
+    label->setFixedWidth( label->sizeHint().width() );
+    hb->addWidget( label );
+
+    scoreLCD = new QLCDNumber( 6, mainWin );
+    scoreLCD->setFrameStyle( QFrame::NoFrame );
+    scoreLCD->setSegmentStyle( QLCDNumber::Flat );
+    scoreLCD->setFixedWidth( 150 );
+    scoreLCD->setPalette( pal );
+    hb->addWidget( scoreLCD );
+    hb->addStretch( 10 );
+
+    label = new QLabel( tr("Level"), mainWin );
+    label->setFont( labelFont );
+    label->setPalette( pal );
+    label->setFixedWidth( label->sizeHint().width() );
+    hb->addWidget( label );
+
+    levelLCD = new QLCDNumber( 2, mainWin );
+    levelLCD->setFrameStyle( QFrame::NoFrame );
+    levelLCD->setSegmentStyle( QLCDNumber::Flat );
+    levelLCD->setFixedWidth( 70 );
+    levelLCD->setPalette( pal );
+    hb->addWidget( levelLCD );
+    hb->addStretch( 10 );
+
+    label = new QLabel( tr("Ships"), mainWin );
+    label->setFont( labelFont );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hb->addWidget( label );
+
+    shipsLCD = new QLCDNumber( 1, mainWin );
+    shipsLCD->setFrameStyle( QFrame::NoFrame );
+    shipsLCD->setSegmentStyle( QLCDNumber::Flat );
+    shipsLCD->setFixedWidth( 40 );
+    shipsLCD->setPalette( pal );
+    hb->addWidget( shipsLCD );
+
+    hb->addStrut( 30 );
+
+    vb->addWidget( view, 10 );
+
+// -- bottom layout:
+    vb->addLayout( hbd );
+
+    QFont smallFont( "helvetica", 14 );
+    hbd->addSpacing( 10 );
+
+    QString sprites_prefix = "qasteroids/sprites/";
+/*
+    label = new QLabel( tr( "T" ), mainWin );
+    label->setFont( smallFont );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    teleportsLCD = new QLCDNumber( 1, mainWin );
+    teleportsLCD->setFrameStyle( QFrame::NoFrame );
+    teleportsLCD->setSegmentStyle( QLCDNumber::Flat );
+    teleportsLCD->setPalette( pal );
+    teleportsLCD->setFixedHeight( 20 );
+    hbd->addWidget( teleportsLCD );
+
+    hbd->addSpacing( 10 );
+*/
+    QPixmap pm( sprites_prefix + "powerups/brake.png" );
+    label = new QLabel( mainWin );
+    label->setPixmap( pm );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    brakesLCD = new QLCDNumber( 1, mainWin );
+    brakesLCD->setFrameStyle( QFrame::NoFrame );
+    brakesLCD->setSegmentStyle( QLCDNumber::Flat );
+    brakesLCD->setPalette( pal );
+    brakesLCD->setFixedHeight( 20 );
+    hbd->addWidget( brakesLCD );
+
+    hbd->addSpacing( 10 );
+
+    pm.load( sprites_prefix + "powerups/shield.png" );
+    label = new QLabel( mainWin );
+    label->setPixmap( pm );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    shieldLCD = new QLCDNumber( 1, mainWin );
+    shieldLCD->setFrameStyle( QFrame::NoFrame );
+    shieldLCD->setSegmentStyle( QLCDNumber::Flat );
+    shieldLCD->setPalette( pal );
+    shieldLCD->setFixedHeight( 20 );
+    hbd->addWidget( shieldLCD );
+
+    hbd->addSpacing( 10 );
+
+    pm.load( sprites_prefix + "powerups/shoot.png" );
+    label = new QLabel( mainWin );
+    label->setPixmap( pm );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    shootLCD = new QLCDNumber( 1, mainWin );
+    shootLCD->setFrameStyle( QFrame::NoFrame );
+    shootLCD->setSegmentStyle( QLCDNumber::Flat );
+    shootLCD->setPalette( pal );
+    shootLCD->setFixedHeight( 20 );
+    hbd->addWidget( shootLCD );
+
+    hbd->addStretch( 1 );
+
+    label = new QLabel( tr( "Fuel" ), mainWin );
+    label->setFont( smallFont );
+    label->setFixedWidth( label->sizeHint().width() + 10 );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    powerMeter = new KALedMeter( mainWin );
+    powerMeter->setFrameStyle( QFrame::Box | QFrame::Plain );
+    powerMeter->setRange( MAX_POWER_LEVEL );
+    powerMeter->addColorRange( 10, darkRed );
+    powerMeter->addColorRange( 20, QColor(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( Qt::Key_Up, Thrust );
+    actions.insert( Qt::Key_Left, RotateLeft );
+    actions.insert( Qt::Key_Right, RotateRight );
+    actions.insert( Qt::Key_Space, Shoot );
+    actions.insert( Qt::Key_Z, Teleport );
+    actions.insert( Qt::Key_X, Brake );
+    actions.insert( Qt::Key_S, Shield );
+    actions.insert( Qt::Key_P, Pause );
+    actions.insert( Qt::Key_L, Launch );
+    actions.insert( Qt::Key_N, NewGame );
+
+    view->showText( tr( "Press N to start playing" ), yellow );
+}
+
+KAstTopLevel::~KAstTopLevel()
+{
+}
+
+void KAstTopLevel::playSound( const char * )
+{
+}
+
+void KAstTopLevel::keyPressEvent( QKeyEvent *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( QKeyEvent *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 );
+                QMessageBox::information( this,
+                                          tr("KAsteroids is paused"),
+                                          tr("Paused") );
+                view->pause( FALSE );
+            }
+            break;
+*/
+        default:
+            event->ignore();
+            return;
+    }
+
+    event->accept();
+}
+
+void KAstTopLevel::showEvent( QShowEvent *e )
+{
+    QMainWindow::showEvent( e );
+    view->pause( FALSE );
+    view->setFocus();
+}
+
+void KAstTopLevel::hideEvent( QHideEvent *e )
+{
+    QMainWindow::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()
+{
+    QString r( "0.00" );
+    if ( view->shots() )
+	 r = QString::number( (double)view->hits() / view->shots() * 100.0,
+			     'g', 2 );
+
+/* multi-line text broken in Qt 3
+    QString 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() );
+}
Index: trunk/examples/demo/qasteroids/toplevel.h
===================================================================
--- trunk/examples/demo/qasteroids/toplevel.h	(revision 164)
+++ trunk/examples/demo/qasteroids/toplevel.h	(revision 164)
@@ -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 QLCDNumber;
+
+class KAstTopLevel : public QMainWindow
+{
+    Q_OBJECT
+public:
+    KAstTopLevel( QWidget *parent=0, const char *name=0 );
+    virtual ~KAstTopLevel();
+
+private:
+    void playSound( const char *snd );
+    void readSoundMapping();
+    void doStats();
+
+protected:
+    virtual void showEvent( QShowEvent * );
+    virtual void hideEvent( QHideEvent * );
+    virtual void keyPressEvent( QKeyEvent *event );
+    virtual void keyReleaseEvent( QKeyEvent *event );
+
+private slots:
+    void slotNewGame();
+
+    void slotShipKilled();
+    void slotRockHit( int size );
+    void slotRocksRemoved();
+
+    void slotUpdateVitals();
+
+private:
+    KAsteroidsView *view;
+    QLCDNumber *scoreLCD;
+    QLCDNumber *levelLCD;
+    QLCDNumber *shipsLCD;
+
+    QLCDNumber *teleportsLCD;
+//    QLCDNumber *bombsLCD;
+    QLCDNumber *brakesLCD;
+    QLCDNumber *shieldLCD;
+    QLCDNumber *shootLCD;
+    KALedMeter *powerMeter;
+
+    bool   sound;
+    QDict<QString> 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  };
+
+    QMap<int,Action> actions;
+};
+
+#endif
+
Index: trunk/examples/demo/qasteroids/view.cpp
===================================================================
--- trunk/examples/demo/qasteroids/view.cpp	(revision 164)
+++ trunk/examples/demo/qasteroids/view.cpp	(revision 164)
@@ -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
+
+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( QWidget *parent, const char *name )
+    : QWidget( parent, name ),
+      field(640, 440),
+      view(&field,this)
+{
+    view.setVScrollBarMode( QScrollView::AlwaysOff );
+    view.setHScrollBarMode( QScrollView::AlwaysOff );
+    view.viewport()->setFocusProxy( this );
+    rocks.setAutoDelete( TRUE );
+    missiles.setAutoDelete( TRUE );
+    bits.setAutoDelete( TRUE );
+    powerups.setAutoDelete( TRUE );
+    exhaust.setAutoDelete( TRUE );
+
+    field.setBackgroundColor( black );
+    QPixmap pm( IMG_BACKGROUND );
+    field.setBackgroundPixmap( pm );
+
+    textSprite = new QCanvasText( &field );
+    QFont font( "helvetica", 18 );
+    textSprite->setFont( font );
+
+    shield = 0;
+    shieldOn = FALSE;
+    refreshRate = REFRESH_DELAY;
+
+    initialized = readSprites();
+
+    shieldTimer = new QTimer( 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()
+{
+    QString sprites_prefix = "qasteroids/sprites/";
+
+    int i = 0;
+    while ( kas_animations[i].id )
+    {
+	QCanvasPixmapArray *anim =
+	    new QCanvasPixmapArray( 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 QCanvasSprite( 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 QString &text, const QColor &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(QResizeEvent* event)
+{
+    QWidget::resizeEvent(event);
+    field.resize(width()-4, height()-4);
+    view.resize(width(),height());
+}
+
+// - - -
+
+void KAsteroidsView::timerEvent( QTimerEvent * )
+{
+    field.advance();
+
+    QCanvasSprite *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( QCanvasItem *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( QCanvasItem *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;
+
+	QCanvasSprite *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( (QCanvasSprite *)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.
+    QPtrListIterator<KMissile> it(missiles);
+
+    for ( ; it.current(); ++it )
+    {
+	missile = it.current();
+	missile->growOlder();
+
+	if ( missile->expired() )
+	{
+	    missiles.removeRef( missile );
+	    continue;
+	}
+
+	wrapSprite( missile );
+
+	QCanvasItemList hits = missile->collisions( TRUE );
+	QCanvasItemList::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 );
+
+	    QCanvasItemList hits = shield->collisions( TRUE );
+	    QCanvasItemList::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();
+	    QCanvasItemList hits = ship->collisions( TRUE );
+	    QCanvasItemList::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;
+	QPtrListIterator<KPowerup> it( powerups );
+
+	for( ; it.current(); ++it )
+	{
+	    pup = it.current();
+	    pup->growOlder();
+
+	    if( pup->expired() )
+	    {
+		powerups.removeRef( pup );
+		continue;
+	    }
+
+	    wrapSprite( pup );
+
+	    QCanvasItemList hits = pup->collisions( TRUE );
+	    QCanvasItemList::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( QShowEvent *e )
+{
+#if defined( QT_LICENSE_PROFESSIONAL )
+    static bool wasThere = FALSE;
+
+    if ( !wasThere ) {
+	wasThere = TRUE;
+	QMessageBox::information( this, tr("QCanvas demo"),
+				  tr("This game has been implemented using the QCanvas class.\n"
+				     "The QCanvas class is not part of the Professional Edition. Please \n"
+				     "contact Trolltech if you want to upgrade to the Enterprise Edition.") );
+    }
+#endif
+
+    QWidget::showEvent( e );
+}
Index: trunk/examples/demo/qasteroids/view.h
===================================================================
--- trunk/examples/demo/qasteroids/view.h	(revision 164)
+++ trunk/examples/demo/qasteroids/view.h	(revision 164)
@@ -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 QWidget
+{
+    Q_OBJECT
+public:
+    KAsteroidsView( QWidget *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 QString &text, const QColor &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( QCanvasItem * );
+    void rockHit( QCanvasItem * );
+    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( QResizeEvent *event );
+    virtual void timerEvent( QTimerEvent * );
+
+    void showEvent( QShowEvent * );
+
+private:
+    QCanvas field;
+    QCanvasView view;
+    QIntDict<QCanvasPixmapArray> animation;
+    QPtrList<QCanvasSprite> rocks;
+    QPtrList<KMissile> missiles;
+    QPtrList<KBit> bits;
+    QPtrList<KExhaust> exhaust;
+    QPtrList<KPowerup> powerups;
+    KShield *shield;
+    QCanvasSprite *ship;
+    QCanvasText *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;
+
+    QTimer *shieldTimer;
+    bool initialized;
+};
+
+#endif
Index: trunk/examples/demo/qthumbwheel.cpp
===================================================================
--- trunk/examples/demo/qthumbwheel.cpp	(revision 164)
+++ trunk/examples/demo/qthumbwheel.cpp	(revision 164)
@@ -0,0 +1,298 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of QThumbWheel class
+**
+** Created : 010205
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#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;
+
+QThumbWheel::QThumbWheel( QWidget *parent, const char *name )
+    : QFrame( parent, name )
+{
+    orient = Vertical;
+    init();
+}
+
+/*!
+  Destructs the wheel.
+*/
+
+QThumbWheel::~QThumbWheel()
+{
+}
+
+/*!
+  \internal
+ */
+
+void QThumbWheel::init()
+{
+    track = TRUE;
+    mousePressed = FALSE;
+    pressedAt = -1;
+    rat = 1.0;
+    setFrameStyle( WinPanel | Sunken );
+    setMargin( 2 );
+    setFocusPolicy( WheelFocus );
+}
+
+void QThumbWheel::setOrientation( Orientation orientation )
+{
+    orient = orientation;
+    update();
+}
+
+void QThumbWheel::setTracking( bool enable )
+{
+    track = enable;
+}
+
+void QThumbWheel::setTransmissionRatio( double r )
+{
+    rat = r;
+}
+
+/*!
+  Makes QRangeControl::setValue() available as a slot.
+*/
+
+void QThumbWheel::setValue( int value )
+{
+    QRangeControl::setValue( value );
+}
+
+void QThumbWheel::valueChange()
+{
+    repaint( FALSE );
+    emit valueChanged(value());
+}
+
+void QThumbWheel::rangeChange()
+{
+}
+
+void QThumbWheel::stepChange()
+{
+}
+
+/*!
+  \reimp
+*/
+
+void QThumbWheel::keyPressEvent( QKeyEvent *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 QThumbWheel::mousePressEvent( QMouseEvent *e )
+{
+    if ( e->button() == LeftButton ) {
+	mousePressed = TRUE;
+	pressedAt = valueFromPosition( e->pos() );
+    }
+}
+
+/*!
+  \reimp
+*/
+
+void QThumbWheel::mouseReleaseEvent( QMouseEvent *e )
+{
+    int movedTo = valueFromPosition( e->pos() );
+    setValue( value() + movedTo - pressedAt );
+    pressedAt = movedTo;
+}
+
+/*!
+  \reimp
+*/
+
+void QThumbWheel::mouseMoveEvent( QMouseEvent *e )
+{
+    if ( !mousePressed )
+	return;
+    if ( track ) {
+	int movedTo = valueFromPosition( e->pos() );
+	setValue( value() + movedTo - pressedAt );
+	pressedAt = movedTo;
+    }
+}
+
+/*!
+  \reimp
+*/
+
+void QThumbWheel::wheelEvent( QWheelEvent *e )
+{
+    int step = ( e->state() & ControlButton ) ? lineStep() : pageStep();
+    setValue( value() - e->delta()*step/120 );
+    e->accept();
+}
+
+/*!\reimp
+*/
+
+void QThumbWheel::focusInEvent( QFocusEvent *e )
+{
+    QWidget::focusInEvent( e );
+}
+
+/*!\reimp
+*/
+
+void QThumbWheel::focusOutEvent( QFocusEvent *e )
+{
+    QWidget::focusOutEvent( e );
+}
+
+void QThumbWheel::drawContents( QPainter *p )
+{
+    QRect cr = contentsRect();
+    // double buffer
+    QPixmap pix( width(), height() );
+    QPainter pt( &pix );
+    QBrush brush = backgroundPixmap() ?
+		QBrush( backgroundColor(), *backgroundPixmap() ) : QBrush( 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);
+    QPen pen0( colorGroup().midlight() );
+    QPen 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 QThumbWheel::valueFromPosition( const QPoint &p )
+{
+    QRect 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
Index: trunk/examples/demo/qthumbwheel.h
===================================================================
--- trunk/examples/demo/qthumbwheel.h	(revision 164)
+++ trunk/examples/demo/qthumbwheel.h	(revision 164)
@@ -0,0 +1,116 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of QThumbWheel class
+**
+** Created : 010205
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QTHUMBWHEEL_H
+#define QTHUMBWHEEL_H
+
+#ifndef QT_H
+#include "qframe.h"
+#include "qrangecontrol.h"
+#endif // QT_H
+
+#ifndef QT_NO_THUMBWHEEL
+
+class QThumbWheel : public QFrame, public QRangeControl
+{
+    Q_OBJECT
+
+public:
+    QThumbWheel( QWidget *parent=0, const char *name=0 );
+    ~QThumbWheel();
+
+    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( QKeyEvent * );
+    void 	mousePressEvent( QMouseEvent * );
+    void 	mouseReleaseEvent( QMouseEvent * );
+    void 	mouseMoveEvent( QMouseEvent * );
+    void 	wheelEvent( QWheelEvent * );
+    void	focusInEvent( QFocusEvent *e );
+    void	focusOutEvent( QFocusEvent *e );
+
+    void 	drawContents( QPainter * );
+
+private:
+    void 	init();
+    int		valueFromPosition( const QPoint & );
+
+
+    double 	rat;
+    int		pressedAt;
+    Orientation orient;
+    uint	track : 1;
+    uint	mousePressed : 1;
+
+    class QThumbWheelPrivate;
+    QThumbWheelPrivate *d;
+};
+
+inline QThumbWheel::Orientation QThumbWheel::orientation() const
+{
+    return orient;
+}
+
+inline bool QThumbWheel::tracking() const
+{
+    return (bool)track;
+}
+
+inline double QThumbWheel::transmissionRatio() const
+{
+    return rat;
+}
+
+#endif // QT_NO_WHEEL
+
+#endif // QWHEEL_H
Index: trunk/examples/demo/sql/book.sql
===================================================================
--- trunk/examples/demo/sql/book.sql	(revision 164)
+++ trunk/examples/demo/sql/book.sql	(revision 164)
@@ -0,0 +1,42 @@
+-- The following SQL generates the database 
+-- used by the 'book' example programs
+-- Copyright (C) 1992-2001 Trolltech AS.  All rights reserved.
+--
+-- This file is part of an example program for Qt.  This example
+-- program may be used, distributed and modified without limitation.
+
+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 );
Index: trunk/examples/demo/sql/connect.ui
===================================================================
--- trunk/examples/demo/sql/connect.ui	(revision 164)
+++ trunk/examples/demo/sql/connect.ui	(revision 164)
@@ -0,0 +1,244 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ConnectDialog</class>
+<widget class="QDialog">
+    <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="QGroupBox">
+            <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="QLineEdit" row="1" column="1">
+                    <property name="name">
+                        <cstring>editDatabase</cstring>
+                    </property>
+                </widget>
+                <widget class="QLabel" 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="QLineEdit" row="3" column="1">
+                    <property name="name">
+                        <cstring>editPassword</cstring>
+                    </property>
+                    <property name="echoMode">
+                        <enum>Password</enum>
+                    </property>
+                </widget>
+                <widget class="QLabel" row="2" column="0">
+                    <property name="name">
+                        <cstring>TextLabel4</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Username:</string>
+                    </property>
+                    <property name="buddy" stdset="0">
+                        <cstring>editUsername</cstring>
+                    </property>
+                </widget>
+                <widget class="QLabel" row="3" column="0">
+                    <property name="name">
+                        <cstring>TextLabel4_2</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Password:</string>
+                    </property>
+                    <property name="buddy" stdset="0">
+                        <cstring>editPassword</cstring>
+                    </property>
+                </widget>
+                <widget class="QComboBox" row="0" column="1">
+                    <property name="name">
+                        <cstring>comboDriver</cstring>
+                    </property>
+                </widget>
+                <widget class="QLineEdit" row="2" column="1">
+                    <property name="name">
+                        <cstring>editUsername</cstring>
+                    </property>
+                </widget>
+                <widget class="QLineEdit" row="4" column="1">
+                    <property name="name">
+                        <cstring>editHostname</cstring>
+                    </property>
+                </widget>
+                <widget class="QLabel" row="4" column="0">
+                    <property name="name">
+                        <cstring>TextLabel5</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Hostname:</string>
+                    </property>
+                    <property name="buddy" stdset="0">
+                        <cstring>editHostname</cstring>
+                    </property>
+                </widget>
+                <widget class="QLabel" row="5" column="0">
+                    <property name="name">
+                        <cstring>TextLabel5_2</cstring>
+                    </property>
+                    <property name="text">
+                        <string>P&amp;ort:</string>
+                    </property>
+                    <property name="buddy" stdset="0">
+                        <cstring>portSpinBox</cstring>
+                    </property>
+                </widget>
+                <widget class="QSpinBox" 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="QLabel" row="0" column="0">
+                    <property name="name">
+                        <cstring>TextLabel2</cstring>
+                    </property>
+                    <property name="text">
+                        <string>D&amp;river</string>
+                    </property>
+                    <property name="buddy" stdset="0">
+                        <cstring>comboDriver</cstring>
+                    </property>
+                </widget>
+            </grid>
+        </widget>
+        <widget class="QLayoutWidget">
+            <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="QPushButton">
+                    <property name="name">
+                        <cstring>PushButton1</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;OK</string>
+                    </property>
+                    <property name="default">
+                        <bool>true</bool>
+                    </property>
+                </widget>
+                <widget class="QPushButton">
+                    <property name="name">
+                        <cstring>PushButton2</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;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>
Index: trunk/examples/demo/sql/connect.ui.h
===================================================================
--- trunk/examples/demo/sql/connect.ui.h	(revision 164)
+++ trunk/examples/demo/sql/connect.ui.h	(revision 164)
@@ -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 Qt 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( QSqlDatabase::drivers() );
+}
+
+void ConnectDialog::destroy()
+{
+
+}
Index: trunk/examples/demo/sql/sqlex.ui
===================================================================
--- trunk/examples/demo/sql/sqlex.ui	(revision 164)
+++ trunk/examples/demo/sql/sqlex.ui	(revision 164)
@@ -0,0 +1,309 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>SqlEx</class>
+<widget class="QWidget">
+    <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="QSplitter">
+            <property name="name">
+                <cstring>vsplit</cstring>
+            </property>
+            <property name="orientation">
+                <enum>Vertical</enum>
+            </property>
+            <widget class="QSplitter">
+                <property name="name">
+                    <cstring>hsplit</cstring>
+                </property>
+                <property name="orientation">
+                    <enum>Horizontal</enum>
+                </property>
+                <widget class="QListView">
+                    <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>Required</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="QDataTable">
+                    <property name="name">
+                        <cstring>dt</cstring>
+                    </property>
+                    <property name="frameworkCode" stdset="0">
+                        <bool>false</bool>
+                    </property>
+                </widget>
+            </widget>
+            <widget class="QGroupBox">
+                <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="QLayoutWidget" 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="QTextEdit">
+                                <property name="name">
+                                    <cstring>te</cstring>
+                                </property>
+                            </widget>
+                            <widget class="QLayoutWidget">
+                                <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="QPushButton">
+                                        <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>&amp;Submit</string>
+                                        </property>
+                                    </widget>
+                                    <widget class="QPushButton">
+                                        <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&amp;lear</string>
+                                        </property>
+                                    </widget>
+                                </hbox>
+                            </widget>
+                        </vbox>
+                    </widget>
+                </grid>
+            </widget>
+        </widget>
+        <widget class="QLayoutWidget">
+            <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="QLabel">
+                    <property name="name">
+                        <cstring>lbl</cstring>
+                    </property>
+                    <property name="text">
+                        <string>Press "Connect" to open a database</string>
+                    </property>
+                </widget>
+                <widget class="QPushButton">
+                    <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>&amp;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(QListViewItem*)</signal>
+        <receiver>SqlEx</receiver>
+        <slot>showTable(QListViewItem*)</slot>
+    </connection>
+    <connection>
+        <sender>lv</sender>
+        <signal>doubleClicked(QListViewItem*)</signal>
+        <receiver>SqlEx</receiver>
+        <slot>showTable(QListViewItem*)</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( QListViewItem * item )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
Index: trunk/examples/demo/sql/sqlex.ui.h
===================================================================
--- trunk/examples/demo/sql/sqlex.ui.h	(revision 164)
+++ trunk/examples/demo/sql/sqlex.ui.h	(revision 164)
@@ -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 Qt 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 QSqlError& err, QWidget* parent = 0 )
+{
+   QString errStr ( "The database reported an error\n" );
+    if ( !err.databaseText().isEmpty() )
+	errStr += err.databaseText();
+    if ( !err.driverText().isEmpty() )
+	errStr += err.driverText();
+    QMessageBox::warning( parent, "Error", errStr );
+}
+
+ConnectDialog* conDiag = 0;
+
+void SqlEx::init()
+{
+    hsplit->setResizeMode( lv, QSplitter::KeepSize );
+    vsplit->setResizeMode( gb, QSplitter::KeepSize );
+    submitBtn->setEnabled( FALSE );
+    conDiag = new ConnectDialog( this, "Connection Dialog", TRUE );    
+}
+
+void SqlEx::dbConnect()
+{ 
+    if ( conDiag->exec() != QDialog::Accepted )
+	return;
+    if ( dt->sqlCursor() ) {
+	dt->setSqlCursor( 0 );
+    }
+    // close old connection (if any)
+    if ( QSqlDatabase::contains( "SqlEx" ) ) {
+	QSqlDatabase* oldDb = QSqlDatabase::database( "SqlEx" );
+	oldDb->close();
+	QSqlDatabase::removeDatabase( "SqlEx" );
+    }
+    // open the new connection
+    QSqlDatabase* db = QSqlDatabase::addDatabase( conDiag->comboDriver->currentText(), "SqlEx" );
+    if ( !db ) {
+	QMessageBox::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();
+    
+    QStringList tables = db->tables();
+    for ( QStringList::Iterator it = tables.begin(); it != tables.end(); ++it ) {
+	QListViewItem* lvi = new QListViewItem( lv, *it );
+	QSqlRecordInfo ri = db->recordInfo ( *it );
+	for ( QSqlRecordInfo::Iterator it = ri.begin(); it != ri.end(); ++it ) {
+	    QString req;
+	    if ( (*it).isRequired() > 0 ) {
+		req = "Yes";
+	    } else if ( (*it).isRequired() == 0 ) {
+		req = "No";
+	    } else {
+		req = "?";
+	    }
+	    QListViewItem* fi = new QListViewItem( lvi, (*it).name(),  + QVariant::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
+    QSqlSelectCursor* cursor = new QSqlSelectCursor( te->text(), QSqlDatabase::database( "SqlEx", TRUE ) );
+    if ( cursor->isSelect() ) {
+	dt->setSqlCursor( cursor, TRUE, TRUE );
+	dt->setSort( QStringList() );
+	dt->refresh( QDataTable::RefreshAll );
+	QString txt( "Query OK" );
+	if ( cursor->size() >= 0 )
+	    txt += ", returned rows: " + QString::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( QString("Query OK, affected rows: %1").arg( cursor->numRowsAffected() ) );
+	}
+    }
+}
+
+void SqlEx::showTable( QListViewItem * item )
+{
+    // get the table name
+    QListViewItem* i = item->parent();
+    if ( !i ) {
+	i = item;
+    }
+
+    // populate the data table
+    QSqlCursor* cursor = new QSqlCursor( i->text( 0 ), TRUE, QSqlDatabase::database( "SqlEx", TRUE ) );
+    dt->setSqlCursor( cursor, TRUE, TRUE );
+    dt->setSort( cursor->primaryIndex() );
+    dt->refresh( QDataTable::RefreshAll );
+    lbl->setText( "Displaying table " + i->text( 0 ) );
+}
Index: trunk/examples/demo/textdrawing/bidi.txt
===================================================================
--- trunk/examples/demo/textdrawing/bidi.txt	(revision 164)
+++ trunk/examples/demo/textdrawing/bidi.txt	(revision 164)
@@ -0,0 +1,32 @@
+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... 
+
Index: trunk/examples/demo/textdrawing/example.html
===================================================================
--- trunk/examples/demo/textdrawing/example.html	(revision 164)
+++ trunk/examples/demo/textdrawing/example.html	(revision 164)
@@ -0,0 +1,340 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head>
+<title>Qt Toolkit - QLabel 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>QLabel Class Reference</h1><br clear="all">
+<p>
+The QLabel widget provides a static information display
+<a href="#details">More...</a>
+<p>
+<code>#include &lt;<a href="qlabel-h.html">qlabel.h</a>&gt;</code>
+<p>
+Inherits <a href="qframe.html">QFrame</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>QLabel</b></a> ( QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#2bafbb"><b>QLabel</b></a> ( const QString &amp; text, QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#5514c7"><b>QLabel</b></a> ( QWidget * buddy, const QString &amp;, QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#9958af"><b>~QLabel</b></a> () </div>
+<li><div class="fn">QString <a href="#72cf09"><b>text</b></a> () const</div>
+<li><div class="fn">QPixmap* <a href="#101ecb"><b>pixmap</b></a> () const</div>
+<li><div class="fn">QMovie* <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">QWidget* <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 &amp; ) </div>
+<li><div class="fn">virtual void <a href="#f3f301"><b>setPixmap</b></a> ( const QPixmap &amp; ) </div>
+<li><div class="fn">virtual void <a href="#60de9f"><b>setMovie</b></a> ( const QMovie &amp; ) </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>QString<td>text<td>text<td>setText<td>&nbsp;
+<tr><td>TextFormat<td>textFormat<td>textFormat<td>setTextFormat<td>&nbsp;
+<tr><td>QPixmap<td>pixmap<td>pixmap<td>setPixmap<td>&nbsp;
+<tr><td>bool<td>scaledContents<td>hasScaledContents<td>setScaledContents<td>&nbsp;
+<tr><td>Alignment<td>alignment<td>alignment<td>setAlignment<td>&nbsp;
+<tr><td>int<td>indent<td>indent<td>setIndent<td>&nbsp;
+</table>
+<p>
+<hr><h2><a name="details"></a>Detailed Description</h2>
+The QLabel widget provides a static information display
+<p>
+QLabel 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 QLabel can contain any of the following content types:
+<ul>
+<li> A plain text: set by passing a <a href="qstring.html">QString</a> to <a href="#dffb43">setText</a>().
+<li> A rich text: set by passing a QString that contains a rich text to setText().
+<li> A pixmap: set by passing a <a href="qpixmap.html">QPixmap</a> to <a href="#f3f301">setPixmap</a>().
+<li> A movie: set by passing a <a href="qmovie.html">QMovie</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 QLabel can be tuned in several ways. All the settings
+of <a href="qframe.html">QFrame</a> are available for specifying a widget frame. The
+positioning of the content within the QLabel 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">QLabel</a> *label = new <a href="qlabel.html">QLabel</a>;
+    label-&gt;<a href="qframe.html#c0d758">setFrameStyle</a>( QFrame::Panel | QFrame::Sunken );
+    label-&gt;<a href="#dffb43">setText</a>( "first line\nsecond line" );
+    label-&gt;<a href="#1f406e">setAlignment</a>( AlignBottom | AlignRight );
+</pre>
+<p>A QLabel is often used as a label for another, interactive
+widget. For this use, QLabel provides a handy mechanism for adding
+an accelerator key (see <a href="qaccel.html">QAccel</a>) that will set the keyboard focus to
+the other widget (called the QLabel's "buddy"). Example:
+<p><pre>     <a href="qlineedit.html">QLineEdit</a>* phoneEdit = new <a href="qlineedit.html">QLineEdit</a>( this, "phoneEdit" );
+     <a href="qlabel.html">QLabel</a>* phoneLabel = new <a href="qlabel.html">QLabel</a>( phoneEdit, "&amp;Phone:", this, "phoneLabel" );
+</pre>
+<p>In this example, keyboard focus is transferred to the label's buddy
+(the <a href="qlineedit.html">QLineEdit</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">QLineEdit</a>, <a href="qtextview.html">QTextView</a>, <a href="qpixmap.html">QPixmap</a>, <a href="qmovie.html">QMovie</a> and <a href="guibooks.html#fowler">GUI Design Handbook: Label</a>
+<p>Examples:
+ <a href="cursor-cursor-cpp.html#QLabel">cursor/cursor.cpp</a>
+ <a href="layout-layout-cpp.html#QLabel">layout/layout.cpp</a>
+ <a href="popup-popup-cpp.html#QLabel">popup/popup.cpp</a>
+ <a href="menu-menu-cpp.html#QLabel">menu/menu.cpp</a>
+ <a href="progress-progress-cpp.html#QLabel">progress/progress.cpp</a>
+ <a href="qmag-qmag-cpp.html#QLabel">qmag/qmag.cpp</a>
+ <a href="movies-main-cpp.html#QLabel">movies/main.cpp</a>
+ <a href="customlayout-main-cpp.html#QLabel">customlayout/main.cpp</a>
+
+<hr><h2>Member Function Documentation</h2>
+<h3 class="fn"><a name="5514c7"></a>QLabel::QLabel ( <a href="qwidget.html">QWidget</a> * buddy, const <a href="qstring.html">QString</a> &amp; text, <a href="qwidget.html">QWidget</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">QFrame</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>QLabel::QLabel ( <a href="qwidget.html">QWidget</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">QFrame</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>QLabel::QLabel ( const <a href="qstring.html">QString</a> &amp; text, <a href="qwidget.html">QWidget</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">QFrame</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>QLabel::~QLabel ()</h3>
+<p>Destructs the label.
+<h3 class="fn">int <a name="2fcaa3"></a>QLabel::alignment () const</h3>
+<p>Returns the alignment setting.
+<p>See also  <a href="#1f406e">setAlignment</a>().
+<h3 class="fn">bool <a name="75b2a1"></a>QLabel::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 Qt.  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">QWidget</a> * <a name="123954"></a>QLabel::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>QLabel::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>QLabel::drawContents ( <a href="qpainter.html">QPainter</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">QFrame.</a>
+<h3 class="fn">void <a name="479dd2"></a>QLabel::drawContentsMask ( <a href="qpainter.html">QPainter</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">QWidget::setAutoMask</a>();.
+<p>Reimplemented from <a href="qframe.html#4cbf11">QFrame.</a>
+<h3 class="fn">void <a name="0435a2"></a>QLabel::fontChange ( const <a href="qfont.html">QFont</a> &amp; ) <code>[virtual protected]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#570a8f">QWidget.</a>
+<h3 class="fn">bool <a name="7e1f73"></a>QLabel::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>QLabel::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">QWidget.</a>
+<h3 class="fn">int <a name="e3c907"></a>QLabel::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">QSize</a> <a name="53c8c7"></a>QLabel::minimumSizeHint () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#3f0fc2">QWidget.</a>
+<h3 class="fn"><a href="qmovie.html">QMovie</a>* <a name="7dcdfe"></a>QLabel::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">QPixmap</a> * <a name="101ecb"></a>QLabel::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>QLabel::resizeEvent ( <a href="qresizeevent.html">QResizeEvent</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">QWidget.</a>
+<h3 class="fn">void <a name="1f406e"></a>QLabel::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">Qt::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">Qt::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>QLabel::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">QWidget.</a>
+<h3 class="fn">void <a name="c0e104"></a>QLabel::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 Qt.  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 QLabel widgets that are not managed by
+a <a href="qlayout.html">QLayout</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>QLabel::setBuddy ( <a href="qwidget.html">QWidget</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 QLabels 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">QLineEdit</a> *nameEd  = new <a href="qlineedit.html">QLineEdit</a>( this );
+    <a href="qlabel.html">QLabel</a>    *nameLb  = new <a href="qlabel.html">QLabel</a>( "&amp;Name:", this );
+    nameLb-&gt;<a href="#191701">setBuddy</a>( nameEd );
+    <a href="qlineedit.html">QLineEdit</a> *phoneEd = new <a href="qlineedit.html">QLineEdit</a>( this );
+    <a href="qlabel.html">QLabel</a>    *phoneLb = new <a href="qlabel.html">QLabel</a>( "&amp;Phone:", this );
+    phoneLb-&gt;<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">QAccel</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>QLabel::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>QLabel::setMovie ( const <a href="qmovie.html">QMovie</a> &amp; 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>QLabel::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">QString::setNum</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="301e3c"></a>QLabel::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">QString::setNum</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="f3f301"></a>QLabel::setPixmap ( const <a href="qpixmap.html">QPixmap</a> &amp; 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>QLabel::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>QLabel::setText ( const <a href="qstring.html">QString</a> &amp; 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. QLabel 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">QTextView</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>QLabel::setTextFormat ( <a href="qt.html#TextFormat">Qt::TextFormat</a> format )</h3>
+<p>Sets the text format to <em>format.</em> See the <a href="qt.html#TextFormat">Qt::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">QSize</a> <a name="614dd5"></a>QLabel::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">QWidget.</a>
+<h3 class="fn"><a href="qsizepolicy.html">QSizePolicy</a> <a name="26e1d9"></a>QLabel::sizePolicy () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#2d5d13">QWidget.</a>
+<h3 class="fn"><a href="qstring.html">QString</a> <a name="72cf09"></a>QLabel::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">Qt::TextFormat <a name="0b92ed"></a>QLabel::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">Qt toolkit</a>,
+copyright &copy; 1995-2000
+<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 © 2000 Trolltech<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
+<td align="right"><div align="right">Qt version 3.0.0-snapshot</div>
+</table></div></address></body></html>
Index: trunk/examples/demo/textdrawing/helpwindow.cpp
===================================================================
--- trunk/examples/demo/textdrawing/helpwindow.cpp	(revision 164)
+++ trunk/examples/demo/textdrawing/helpwindow.cpp	(revision 164)
@@ -0,0 +1,338 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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 QString& home_, const QString& _path,
+			QWidget* parent, const char *name )
+    : QMainWindow( parent, name, WDestructiveClose ),
+      pathCombo( 0 ), selectedURL()
+{
+    readHistory();
+    readBookmarks();
+
+    browser = new QTextBrowser( this );
+    browser->mimeSourceFactory()->setFilePath( _path );
+    browser->setFrameStyle( QFrame::Panel | QFrame::Sunken );
+    connect( browser, SIGNAL( textChanged() ),
+	     this, SLOT( textChanged() ) );
+
+    setCentralWidget( browser );
+
+    if ( !home_.isEmpty() )
+	browser->setSource( home_ );
+
+    connect( browser, SIGNAL( highlighted( const QString&) ),
+	     statusBar(), SLOT( message( const QString&)) );
+
+    resize( 640,700 );
+
+    QPopupMenu* file = new QPopupMenu( 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.
+    QIconSet icon_back( QPixmap("textdrawing/previous.png") );
+    QIconSet icon_forward( QPixmap("textdrawing/next.png") );
+    QIconSet icon_home( QPixmap("textdrawing/home.png") );
+
+    QPopupMenu* go = new QPopupMenu( 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 QPopupMenu( this );
+    QStringList::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 QPopupMenu( this );
+    bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) );
+    bookm->insertSeparator();
+
+    QStringList::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 ) ) );
+
+
+    QToolBar* toolbar = new QToolBar( this );
+    addToolBar( toolbar, "Toolbar");
+    QToolButton* button;
+
+    button = new QToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar );
+    connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+    button->setEnabled( FALSE );
+    button = new QToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar );
+    connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+    button->setEnabled( FALSE );
+    button = new QToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar );
+
+    toolbar->addSeparator();
+
+    pathCombo = new QComboBox( TRUE, toolbar );
+    connect( pathCombo, SIGNAL( activated( const QString & ) ),
+	     this, SLOT( pathSelected( const QString & ) ) );
+    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 = QString::null;
+    }
+}
+
+HelpWindow::~HelpWindow()
+{
+    history.clear();
+    QMap<int, QString>::Iterator it = mHistory.begin();
+    for ( ; it != mHistory.end(); ++it )
+	history.append( *it );
+
+    QFile f( QDir::currentDirPath() + "/.history" );
+    f.open( IO_WriteOnly );
+    QDataStream s( &f );
+    s << history;
+    f.close();
+
+    bookmarks.clear();
+    QMap<int, QString>::Iterator it2 = mBookmarks.begin();
+    for ( ; it2 != mBookmarks.end(); ++it2 )
+	bookmarks.append( *it2 );
+
+    QFile f2( QDir::currentDirPath() + "/.bookmarks" );
+    f2.open( IO_WriteOnly );
+    QDataStream s2( &f2 );
+    s2 << bookmarks;
+    f2.close();
+}
+
+void HelpWindow::about()
+{
+    QMessageBox::about( this, "HelpViewer Example",
+			"<p>This example implements a simple HTML help viewer "
+			"using Qt's rich text capabilities</p>"
+			"<p>It's just about 100 lines of C++ code, so don't expect too much :-)</p>"
+			);
+}
+
+
+void HelpWindow::aboutQt()
+{
+    QMessageBox::aboutQt( this, "QBrowser" );
+}
+
+void HelpWindow::openFile()
+{
+#ifndef QT_NO_FILEDIALOG
+    QString fn = QFileDialog::getOpenFileName( QString::null, QString::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
+    QPrinter printer;
+    printer.setFullPage(TRUE);
+    if ( printer.setup() ) {
+	QPainter p( &printer );
+	QPaintDeviceMetrics metrics(p.device());
+	int dpix = metrics.logicalDpiX();
+	int dpiy = metrics.logicalDpiY();
+	const int margin = 72; // pt
+	QRect body(margin*dpix/72, margin*dpiy/72,
+		   metrics.width()-margin*dpix/72*2,
+		   metrics.height()-margin*dpiy/72*2 );
+	QFont font("times", 10);
+	QStringList filePaths = browser->mimeSourceFactory()->filePath();
+	QString file;
+	QStringList::Iterator it = filePaths.begin();
+	for ( ; it != filePaths.end(); ++it ) {
+	    file = QUrl( *it, QUrl( browser->source() ).path() ).path();
+	    if ( QFile::exists( file ) )
+		break;
+	    else
+		file = QString::null;
+	}
+	if ( file.isEmpty() )
+	    return;
+	QFile f( file );
+	if ( !f.open( IO_ReadOnly ) )
+	    return;
+	QTextStream ts( &f );
+	QSimpleRichText richText( ts.read(), font, browser->context(), browser->styleSheet(),
+				  browser->mimeSourceFactory(), body.height() );
+	richText.setWidth( &p, body.width() );
+	QRect 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( QString::number(page) ),
+			view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) );
+	    if ( view.top()  >= richText.height() )
+		break;
+	    printer.newPage();
+	    page++;
+	} while (TRUE);
+    }
+#endif
+}
+
+void HelpWindow::pathSelected( const QString &_path )
+{
+    browser->setSource( _path );
+    QMap<int, QString>::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 ( QFile::exists( QDir::currentDirPath() + "/.history" ) ) {
+	QFile f( QDir::currentDirPath() + "/.history" );
+	f.open( IO_ReadOnly );
+	QDataStream s( &f );
+	s >> history;
+	f.close();
+	while ( history.count() > 20 )
+	    history.remove( history.begin() );
+    }
+}
+
+void HelpWindow::readBookmarks()
+{
+    if ( QFile::exists( QDir::currentDirPath() + "/.bookmarks" ) ) {
+	QFile f( QDir::currentDirPath() + "/.bookmarks" );
+	f.open( IO_ReadOnly );
+	QDataStream 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();
+}
Index: trunk/examples/demo/textdrawing/helpwindow.h
===================================================================
--- trunk/examples/demo/textdrawing/helpwindow.h	(revision 164)
+++ trunk/examples/demo/textdrawing/helpwindow.h	(revision 164)
@@ -0,0 +1,65 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef HELPWINDOW_H
+#define HELPWINDOW_H
+
+#include <qmainwindow.h>
+#include <qtextbrowser.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qdir.h>
+
+class QComboBox;
+class QPopupMenu;
+
+class HelpWindow : public QMainWindow
+{
+    Q_OBJECT
+public:
+    HelpWindow( const QString& home_,  const QString& path, QWidget* parent = 0, const char *name=0 );
+    ~HelpWindow();
+
+private slots:
+    void setBackwardAvailable( bool );
+    void setForwardAvailable( bool );
+
+    void textChanged();
+    void about();
+    void aboutQt();
+    void openFile();
+    void newWindow();
+    void print();
+
+    void pathSelected( const QString & );
+    void histChosen( int );
+    void bookmChosen( int );
+    void addBookmark();
+    
+private:
+    void readHistory();
+    void readBookmarks();
+    
+    QTextBrowser* browser;
+    QComboBox *pathCombo;
+    int backwardId, forwardId;
+    QString selectedURL;
+    QStringList history, bookmarks;
+    QMap<int, QString> mHistory, mBookmarks;
+    QPopupMenu *hist, *bookm;
+    
+};
+
+
+
+
+
+#endif
+
Index: trunk/examples/demo/textdrawing/textedit.cpp
===================================================================
--- trunk/examples/demo/textdrawing/textedit.cpp	(revision 164)
+++ trunk/examples/demo/textdrawing/textedit.cpp	(revision 164)
@@ -0,0 +1,478 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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( QWidget *parent, const char *name )
+    : QMainWindow( parent, name, 0 )
+{
+    setupFileActions();
+    setupEditActions();
+    setupTextActions();
+
+    tabWidget = new QTabWidget( this );
+    connect( tabWidget, SIGNAL( currentChanged( QWidget * ) ),
+	     this, SLOT( editorChanged( QWidget * ) ) );
+    setCentralWidget( tabWidget );
+}
+
+void TextEdit::setupFileActions()
+{
+    QToolBar *tb = new QToolBar( this );
+    QPopupMenu *menu = new QPopupMenu( this );
+    menuBar()->insertItem( tr( "&File" ), menu );
+
+    QAction *a;
+    a = new QAction( tr( "New" ), QPixmap( "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 QAction( tr( "Open" ), QPixmap( "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 QAction( tr( "Save" ), QPixmap( "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 QAction( tr( "Save As" ), QPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" );
+    connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
+    a->addTo( menu );
+    menu->insertSeparator();
+    a = new QAction( tr( "Print" ), QPixmap( "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 QAction( tr( "Close" ), QPixmap(), tr( "&Close" ), 0, this, "fileClose" );
+    connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) );
+    a->addTo( menu );
+}
+
+void TextEdit::setupEditActions()
+{
+    QToolBar *tb = new QToolBar( this );
+    QPopupMenu *menu = new QPopupMenu( this );
+    menuBar()->insertItem( tr( "&Edit" ), menu );
+
+    QAction *a;
+    a = new QAction( tr( "Undo" ), QPixmap( "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 QAction( tr( "Redo" ), QPixmap( "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 QAction( tr( "Cut" ), QPixmap( "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 QAction( tr( "Copy" ), QPixmap( "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 QAction( tr( "Paste" ), QPixmap( "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()
+{
+    QToolBar *tb = new QToolBar( this );
+    QPopupMenu *menu = new QPopupMenu( this );
+    menuBar()->insertItem( tr( "For&mat" ), menu );
+
+    comboStyle = new QComboBox( 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 QComboBox( TRUE, tb );
+    QFontDatabase db;
+    comboFont->insertStringList( db.families() );
+    connect( comboFont, SIGNAL( activated( const QString & ) ),
+	     this, SLOT( textFamily( const QString & ) ) );
+    comboFont->lineEdit()->setText( QApplication::font().family() );
+
+    comboSize = new QComboBox( TRUE, tb );
+    QValueList<int> sizes = db.standardSizes();
+    QValueList<int>::Iterator it = sizes.begin();
+    for ( ; it != sizes.end(); ++it )
+	comboSize->insertItem( QString::number( *it ) );
+    connect( comboSize, SIGNAL( activated( const QString & ) ),
+	     this, SLOT( textSize( const QString & ) ) );
+    comboSize->lineEdit()->setText( QString::number( QApplication::font().pointSize() ) );
+
+    actionTextBold = new QAction( tr( "Bold" ), QPixmap( "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 QAction( tr( "Italic" ), QPixmap( "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 QAction( tr( "Underline" ), QPixmap( "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();
+
+    QActionGroup *grp = new QActionGroup( this );
+    grp->setExclusive( TRUE );
+    connect( grp, SIGNAL( selected( QAction* ) ), this, SLOT( textAlign( QAction* ) ) );
+
+    actionAlignLeft = new QAction( tr( "Left" ), QPixmap( "textdrawing/textleft.png" ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" );
+    actionAlignLeft->addTo( tb );
+    actionAlignLeft->addTo( menu );
+    actionAlignLeft->setToggleAction( TRUE );
+    actionAlignCenter = new QAction( tr( "Center" ), QPixmap( "textdrawing/textcenter.png" ), tr( "C&enter" ), CTRL + Key_M, grp, "textCenter" );
+    actionAlignCenter->addTo( tb );
+    actionAlignCenter->addTo( menu );
+    actionAlignCenter->setToggleAction( TRUE );
+    actionAlignRight = new QAction( tr( "Right" ), QPixmap( "textdrawing/textright.png" ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" );
+    actionAlignRight->addTo( tb );
+    actionAlignRight->addTo( menu );
+    actionAlignRight->setToggleAction( TRUE );
+    actionAlignJustify = new QAction( tr( "Justify" ), QPixmap( "textdrawing/textjustify.png" ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" );
+    actionAlignJustify->addTo( tb );
+    actionAlignJustify->addTo( menu );
+    actionAlignJustify->setToggleAction( TRUE );
+
+    menu->insertSeparator();
+
+    QPixmap pix( 16, 16 );
+    pix.fill( black );
+    actionTextColor = new QAction( 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 QString &f )
+{
+    if ( !QFile::exists( f ) )
+	return;
+    QTextEdit *edit = new QTextEdit( tabWidget );
+    doConnections( edit );
+    tabWidget->addTab( edit, QFileInfo( f ).fileName() );
+
+    QFile fl( f );
+    fl.open( IO_ReadOnly );
+    QByteArray array = fl.readAll();
+    array.resize( array.size() +1 );
+    array[ (int)array.size() - 1 ] = '\0';
+    QString text = ( f.find( "bidi.txt" ) != -1 ? QString::fromUtf8( array.data() ) : QString::fromLatin1( array.data() ) );
+    edit->setText( text );
+
+    edit->viewport()->setFocus();
+    edit->setTextFormat( Qt::RichText );
+}
+
+QTextEdit *TextEdit::currentEditor() const
+{
+    if ( tabWidget->currentPage() &&
+	 tabWidget->currentPage()->inherits( "QTextEdit" ) )
+	return (QTextEdit*)tabWidget->currentPage();
+    return 0;
+}
+
+void TextEdit::doConnections( QTextEdit *e )
+{
+    connect( e, SIGNAL( currentFontChanged( const QFont & ) ),
+	     this, SLOT( fontChanged( const QFont & ) ) );
+    connect( e, SIGNAL( currentColorChanged( const QColor & ) ),
+	     this, SLOT( colorChanged( const QColor & ) ) );
+    connect( e, SIGNAL( currentAlignmentChanged( int ) ),
+	     this, SLOT( alignmentChanged( int ) ) );
+}
+
+void TextEdit::fileNew()
+{
+    QTextEdit *edit = new QTextEdit( tabWidget );
+    doConnections( edit );
+    tabWidget->addTab( edit, tr( "noname" ) );
+    tabWidget->showPage( edit );
+    edit->viewport()->setFocus();
+}
+
+void TextEdit::fileOpen()
+{
+    QString fn = QFileDialog::getOpenFileName( QString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+    if ( !fn.isEmpty() )
+	load( fn );
+}
+
+void TextEdit::fileSave()
+{
+    if ( !currentEditor() )
+	return;
+    QString fn;
+    if ( filenames.find( currentEditor() ) == filenames.end() ) {
+	fileSaveAs();
+    } else {
+	QFile file( *filenames.find( currentEditor() ) );
+	if ( !file.open( IO_WriteOnly ) )
+	    return;
+	QTextStream ts( &file );
+	ts << currentEditor()->text();
+    }
+}
+
+void TextEdit::fileSaveAs()
+{
+    if ( !currentEditor() )
+	return;
+    QString fn = QFileDialog::getSaveFileName( QString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+    if ( !fn.isEmpty() ) {
+	filenames.replace( currentEditor(), fn );
+	fileSave();
+	tabWidget->setTabLabel( currentEditor(), QFileInfo( fn ).fileName() );
+    }
+}
+
+void TextEdit::filePrint()
+{
+    if ( !currentEditor() )
+	return;
+#ifndef QT_NO_PRINTER
+    QPrinter printer;
+    printer.setFullPage(TRUE);
+    QPaintDeviceMetrics screen( this );
+    printer.setResolution( screen.logicalDpiY() );
+    if ( printer.setup( this ) ) {
+	QPainter p( &printer );
+	QPaintDeviceMetrics metrics( p.device() );
+	int dpix = metrics.logicalDpiX();
+	int dpiy = metrics.logicalDpiY();
+	const int margin = 72; // pt
+	QRect body( margin * dpix / 72, margin * dpiy / 72,
+		    metrics.width() - margin * dpix / 72 * 2,
+		    metrics.height() - margin * dpiy / 72 * 2 );
+	QFont font( "times", 10 );
+	QSimpleRichText richText( currentEditor()->text(), font, currentEditor()->context(), currentEditor()->styleSheet(),
+				  currentEditor()->mimeSourceFactory(), body.height() );
+	richText.setWidth( &p, body.width() );
+	QRect 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( QString::number( page ) ),
+			view.bottom() + p.fontMetrics().ascent() + 5, QString::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->quit();
+}
+
+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 QString &f )
+{
+    if ( !currentEditor() )
+	return;
+    currentEditor()->setFamily( f );
+    currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textSize( const QString &p )
+{
+    if ( !currentEditor() )
+	return;
+    currentEditor()->setPointSize( p.toInt() );
+    currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textStyle( int i )
+{
+    if ( !currentEditor() )
+	return;
+    if ( i == 0 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayBlock, QStyleSheetItem::ListDisc );
+    else if ( i == 1 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDisc );
+    else if ( i == 2 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListCircle );
+    else if ( i == 3 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListSquare );
+    else if ( i == 4 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDecimal );
+    else if ( i == 5 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListLowerAlpha );
+    else if ( i == 6 )
+	currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListUpperAlpha );
+    currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textColor()
+{
+    if ( !currentEditor() )
+	return;
+    QColor col = QColorDialog::getColor( currentEditor()->color(), this );
+    if ( !col.isValid() )
+	return;
+    currentEditor()->setColor( col );
+    QPixmap pix( 16, 16 );
+    pix.fill( col );
+    actionTextColor->setIconSet( pix );
+}
+
+void TextEdit::textAlign( QAction *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 QFont &f )
+{
+    comboFont->lineEdit()->setText( f.family() );
+    comboSize->lineEdit()->setText( QString::number( f.pointSize() ) );
+    actionTextBold->setOn( f.bold() );
+    actionTextItalic->setOn( f.italic() );
+    actionTextUnderline->setOn( f.underline() );
+}
+
+void TextEdit::colorChanged( const QColor &c )
+{
+    QPixmap 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( QWidget * )
+{
+    if ( !currentEditor() )
+	return;
+    fontChanged( currentEditor()->font() );
+    colorChanged( currentEditor()->color() );
+    alignmentChanged( currentEditor()->alignment() );
+}
Index: trunk/examples/demo/textdrawing/textedit.h
===================================================================
--- trunk/examples/demo/textdrawing/textedit.h	(revision 164)
+++ trunk/examples/demo/textdrawing/textedit.h	(revision 164)
@@ -0,0 +1,86 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TEXTEDIT_H
+#define TEXTEDIT_H
+
+#include <qmainwindow.h>
+#include <qmap.h>
+
+class QAction;
+class QComboBox;
+class QTabWidget;
+class QTextEdit;
+
+class TextEdit : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    TextEdit( QWidget *parent = 0, const char *name = 0 );
+
+    QTextEdit *currentEditor() const;
+    void load( const QString &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 QString &f );
+    void textSize( const QString &p );
+    void textStyle( int s );
+    void textColor();
+    void textAlign( QAction *a );
+
+    void fontChanged( const QFont &f );
+    void colorChanged( const QColor &c );
+    void alignmentChanged( int a );
+    void editorChanged( QWidget * );
+
+
+private:
+    void setupFileActions();
+    void setupEditActions();
+    void setupTextActions();
+    void doConnections( QTextEdit *e );
+
+    QAction *actionTextBold,
+	*actionTextUnderline,
+	*actionTextItalic,
+	*actionTextColor,
+	*actionAlignLeft,
+	*actionAlignCenter,
+	*actionAlignRight,
+	*actionAlignJustify;
+    QComboBox *comboStyle,
+	*comboFont,
+	*comboSize;
+    QTabWidget *tabWidget;
+    QMap<QTextEdit*, QString> filenames;
+
+};
+
+
+#endif
Index: trunk/examples/demo/translations/demo_ar.ts
===================================================================
--- trunk/examples/demo/translations/demo_ar.ts	(revision 164)
+++ trunk/examples/demo/translations/demo_ar.ts	(revision 164)
@@ -0,0 +1,1648 @@
+<!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>&amp;Connect...</source>
+        <translation type="obsolete">&amp;ÙØµÙ...</translation>
+    </message>
+    <message>
+        <source>&amp;Edit Books</source>
+        <translation type="obsolete">Øª&amp;Ø­Ø±ÙØ± Ø§ÙÙØªØš</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>&amp;Username:</source>
+        <translation>Ø¥Ø³Ù
+ Ø§ÙÙ
+Ø³Øª&amp;Ø¹Ù
+Ù:</translation>
+    </message>
+    <message>
+        <source>&amp;Password:</source>
+        <translation>&amp;ÙÙÙ
+Ø© Ø§ÙØ³ÙØ±:</translation>
+    </message>
+    <message>
+        <source>&amp;Hostname:</source>
+        <translation>Ø¥Ø³Ù
+ Ø§ÙÙ
+&amp;Ø¶ÙÙ:</translation>
+    </message>
+    <message>
+        <source>P&amp;ort:</source>
+        <translation>Ù
+&amp;ÙÙØ°:</translation>
+    </message>
+    <message>
+        <source>Default</source>
+        <translation>Ø¥ÙØªØ±Ø§Ø¶Ù</translation>
+    </message>
+    <message>
+        <source>D&amp;river</source>
+        <translation>&amp;ÙØ§ØŠØ¯</translation>
+    </message>
+    <message>
+        <source>&amp;OK</source>
+        <translation>&amp;Ù
+ÙØ§ÙÙØ©</translation>
+    </message>
+    <message>
+        <source>&amp;Cancel</source>
+        <translation>Ø¥&amp;ÙØºØ§Ø¡</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>&amp;Insert</source>
+        <translation type="obsolete">Ø¥&amp;Ø¯Ø±Ø§Ø¬</translation>
+    </message>
+    <message>
+        <source>&amp;Update</source>
+        <translation type="obsolete">ØªØ­Ø¯&amp;ÙØ«</translation>
+    </message>
+    <message>
+        <source>&amp;Delete</source>
+        <translation type="obsolete">&amp;Ø­Ø°Ù</translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation type="obsolete">Ø¥&amp;ØºÙØ§Ù</translation>
+    </message>
+    <message>
+        <source>|&lt; &amp;First</source>
+        <translation type="obsolete">|&lt; Ø§Ù&amp;Ø£ÙÙÙ</translation>
+    </message>
+    <message>
+        <source>&lt;&lt; &amp;Prev</source>
+        <translation type="obsolete">&lt;&lt; Ø§Ù&amp;Ø³ÙØ§ØšÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Next &gt;&gt;</source>
+        <translation type="obsolete">Ø§Ù&amp;ØªÙØ§ÙÙ &gt;&gt;</translation>
+    </message>
+    <message>
+        <source>&amp;Last &gt;|</source>
+        <translation type="obsolete">Ø§ÙØ£&amp;Ø®ÙØ± &gt;|</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>&amp;Exit</source>
+        <translation>&amp;Ø®Ø±ÙØ¬</translation>
+    </message>
+    <message>
+        <source>Ctrl+Q</source>
+        <translation>ØªØ­ÙÙÙ
++Q</translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;Ù
+ÙÙÙ</translation>
+    </message>
+    <message>
+        <source>St&amp;yle</source>
+        <translation>&amp;Ø·Ø±Ø§Ø²</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>&amp;Wireframe</source>
+        <translation>Ø¹&amp;ÙØšØ© Ø§ÙØªÙÙØµÙÙØ§Øª</translation>
+    </message>
+    <message>
+        <source>Fl&amp;at shaded</source>
+        <translation>ØªØžÙÙÙ Ù
+&amp;Ø³ØªÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Smooth shaded</source>
+        <translation>ØªØžÙÙÙ Ø£&amp;Ù
+ÙØ³</translation>
+    </message>
+    <message>
+        <source>&amp;Landscape</source>
+        <translation>Ù
+&amp;ÙØžØ±</translation>
+    </message>
+    <message>
+        <source>&amp;Fractalize</source>
+        <translation>&amp;ÙØ³Ø±</translation>
+    </message>
+    <message>
+        <source>&amp;Reset grid</source>
+        <translation>Ø¥&amp;Ø¹Ø§Ø¯Ø© ÙØ¶Ø¹ Ø§ÙØŽÙØšÙØ©</translation>
+    </message>
+    <message>
+        <source>&amp;Animate</source>
+        <translation>Øª&amp;Ø­Ø±ÙÙ</translation>
+    </message>
+    <message>
+        <source>Zoom</source>
+        <translation>ØªÙØšÙØ±</translation>
+    </message>
+    <message>
+        <source>Size</source>
+        <translation>Ø­Ø¬Ù
+</translation>
+    </message>
+</context>
+<context>
+    <name>GLWorkspace</name>
+    <message>
+        <source>&amp;Scene</source>
+        <translation>Ù
+&amp;ØŽÙØ¯</translation>
+    </message>
+    <message>
+        <source>&amp;New</source>
+        <translation>&amp;Ø¬Ø¯ÙØ¯</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation>Ø¬Ø¯ÙØ¯</translation>
+    </message>
+    <message>
+        <source>Wirebox</source>
+        <translation>Ø¹ÙØšØ© Ø§ÙØªÙÙØµÙÙØ§Øª</translation>
+    </message>
+    <message>
+        <source>&amp;Wirebox</source>
+        <translation>Ø¹&amp;ÙØšØ© Ø§ÙØªÙÙØµÙÙØ§Øª</translation>
+    </message>
+    <message>
+        <source>Gear</source>
+        <translation>ØªØ±Ø³</translation>
+    </message>
+    <message>
+        <source>&amp;Gears</source>
+        <translation>Øª&amp;Ø±ÙØ³</translation>
+    </message>
+    <message>
+        <source>Texture</source>
+        <translation>Ø­ØšÙØ©</translation>
+    </message>
+    <message>
+        <source>&amp;Texture</source>
+        <translation>&amp;Ø­ØšÙØ©</translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation>&amp;Ø·ØšØ¹</translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation>Ø·ØšØ¹</translation>
+    </message>
+    <message>
+        <source>Window Size</source>
+        <translation>Ø­Ø¬Ù
+ Ø§ÙÙÙØ§ÙØ°Ø©</translation>
+    </message>
+    <message>
+        <source>&amp;Window Size</source>
+        <translation>Ø­Ø¬Ù
+ Ø§Ù&amp;ÙÙØ§ÙØ°Ø©</translation>
+    </message>
+    <message>
+        <source>Low Resolution</source>
+        <translation>ØªÙ
+ÙÙØ² Ù
+ÙØ®ÙØ¶</translation>
+    </message>
+    <message>
+        <source>&amp;Low Resolution</source>
+        <translation>ØªÙ
+ÙÙØ² Ù
+Ù&amp;Ø®ÙØ¶</translation>
+    </message>
+    <message>
+        <source>Medium Resolution</source>
+        <translation>ØªÙ
+ÙÙØ² Ù
+ØªÙØ³ÙØ·</translation>
+    </message>
+    <message>
+        <source>&amp;Medium Resolution</source>
+        <translation>ØªÙ
+ÙÙØ² Ù
+Øª&amp;ÙØ³ÙØ·</translation>
+    </message>
+    <message>
+        <source>High Resolution</source>
+        <translation>ØªÙ
+ÙÙØ² Ø¹Ø§ÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;High Resolution</source>
+        <translation>ØªÙ
+ÙÙØ² &amp;Ø¹Ø§ÙÙ</translation>
+    </message>
+    <message>
+        <source>Setup</source>
+        <translation>Ø¥Ø¹Ø¯Ø§Ø¯</translation>
+    </message>
+    <message>
+        <source>&amp;Setup...</source>
+        <translation>Ø¥Ø¹&amp;Ø¯Ø§Ø¯...</translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation>Ø¥ØºÙØ§Ù</translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation>Ø¥&amp;ØºÙØ§Ù</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>&amp;New Window</source>
+        <translation>ÙØ§ÙØ°Ø© &amp;Ø¬Ø¯ÙØ¯Ø©</translation>
+    </message>
+    <message>
+        <source>&amp;Open File</source>
+        <translation>&amp;ÙØªØ­ Ù
+ÙÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation>&amp;Ø·ØšØ¹</translation>
+    </message>
+    <message>
+        <source>&amp;Backward</source>
+        <translation>ÙÙ&amp;ÙØ±Ø§Ø¡</translation>
+    </message>
+    <message>
+        <source>&amp;Forward</source>
+        <translation>ÙÙ&amp;Ø£Ù
+Ø§Ù
+</translation>
+    </message>
+    <message>
+        <source>&amp;Home</source>
+        <translation>Ù
+&amp;ÙØ²Ù</translation>
+    </message>
+    <message>
+        <source>Add Bookmark</source>
+        <translation>Ø¥Ø¶Ø§ÙØ© Ù
+Ø€ØŽÙØ±</translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;Ù
+ÙÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Go</source>
+        <translation>Ø¥&amp;Ø°ÙØš</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>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+        <translation type="obsolete">&lt;h3&gt;Ø­ÙÙ Qt&lt;/h3&gt;&lt;p&gt;ÙØ°Ø§ Ø§ÙØšØ±ÙØ§Ù
+Ø¬ ÙØ³ØªØ¹Ù
+Ù Qt Ø¥ØµØ¯Ø§Ø± %1Ø Ø·ÙÙ
+ Ø£Ø¯ÙØ§Øª C++ ÙØªØ·ÙÙØ± Ø§ÙØšØ±Ø§Ù
+Ø¬ Ø§ÙØšÙØ§ÙÙØ© Ø¹ÙÙ Ø¬Ù
+ÙØ¹ Ø§ÙÙ
+ÙØµÙØ§Øª Ù
+Ù ØŽØ±ÙØ© ØªØ±ÙÙØªÙ. Qt ØªÙÙÙØ± Ø¥Ù
+ÙØ§ÙÙØ© Ø­Ù
+Ù ÙÙØ³ Ø§ÙÙ
+ØµØ¯Ø± Ø¥ÙÙ ÙÙÙØ¯ÙØ²95\98\NT\2000 Ø ÙÙÙÙØ³Ø Ø³ÙÙØ§Ø±ÙØ³Ø HP-UX Ù Ø§ÙØ¹Ø¯ÙØ¯ Ù
+Ù Ø§ÙØ¥ØµØ¯Ø§Ø±Ø§Øª Ø§ÙØ£Ø®Ø±Ù ÙÙÙÙÙÙØ³ Ù
+Ø¹ X11. Ø£ÙØžØ± &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; ÙÙÙ
+Ø²ÙØ¯ Ù
+Ù Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <source>&amp;New</source>
+        <translation type="unfinished">&amp;Ø¬Ø¯ÙØ¯</translation>
+    </message>
+    <message>
+        <source>&amp;Window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</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>&amp;Invert Colors</source>
+        <translation>&amp;Ø¹ÙØ³ Ø§ÙØ£ÙÙØ§Ù</translation>
+    </message>
+    <message>
+        <source>&amp;Mirror</source>
+        <translation>Ù
+&amp;Ø±Ø¢Ø©</translation>
+    </message>
+    <message>
+        <source>&amp;Flip</source>
+        <translation>&amp;ÙÙØš</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;left</source>
+        <translation>Ø¯ÙØ±Ø§Ù Øš 90Â° ÙÙÙ&amp;Ø³Ø§Ø±</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;right</source>
+        <translation>Ø¯ÙØ±Ø§Ù Øš 90Â° ÙÙÙ&amp;Ù
+ÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Help</source>
+        <translation>Ù
+Ø³Ø§Ø¹&amp;Ø¯Ø©</translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation>&amp;Ø·ØšØ¹</translation>
+    </message>
+    <message>
+        <source>&amp;Discard</source>
+        <translation>&amp;ÙØšØ°</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>Required</source>
+        <translation>Ù
+Ø·ÙÙØš</translation>
+    </message>
+    <message>
+        <source>SQL Query</source>
+        <translation>Ø§Ø³ØªÙÙØ§Ù
+ SQL</translation>
+    </message>
+    <message>
+        <source>&amp;Submit</source>
+        <translation>&amp;ØšØ¹Ø«</translation>
+    </message>
+    <message>
+        <source>C&amp;lear</source>
+        <translation>&amp;Ù
+Ø­Ù</translation>
+    </message>
+    <message>
+        <source>Press &quot;Connect&quot; to open a database</source>
+        <translation>Ø¥Ø¶ØºØ· Ø¹ÙÙ &quot;ÙØµÙ&quot; ÙÙØªØ­ ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª</translation>
+    </message>
+    <message>
+        <source>&amp;Connect...</source>
+        <translation>&amp;ÙØµÙ...</translation>
+    </message>
+</context>
+<context>
+    <name>TextEdit</name>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;Ù
+ÙÙÙ</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation>Ø¬Ø¯ÙØ¯</translation>
+    </message>
+    <message>
+        <source>&amp;New...</source>
+        <translation>&amp;Ø¬Ø¯ÙØ¯...</translation>
+    </message>
+    <message>
+        <source>Open</source>
+        <translation>ÙØªØ­</translation>
+    </message>
+    <message>
+        <source>&amp;Open...</source>
+        <translation>&amp;ÙØªØ­...</translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation>Ø­ÙØž</translation>
+    </message>
+    <message>
+        <source>&amp;Save...</source>
+        <translation>Ø­Ù&amp;Øž...</translation>
+    </message>
+    <message>
+        <source>Save As</source>
+        <translation>Ø­ÙØž ØªØ­Øª</translation>
+    </message>
+    <message>
+        <source>Save &amp;As...</source>
+        <translation>Ø­ÙØž &amp;ØªØ­Øª...</translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation>Ø·ØšØ¹</translation>
+    </message>
+    <message>
+        <source>&amp;Print...</source>
+        <translation>Ø·Øš&amp;Ø¹...</translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation>Ø¥ØºÙØ§Ù</translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation>Ø¥&amp;ØºÙØ§Ù</translation>
+    </message>
+    <message>
+        <source>&amp;Edit</source>
+        <translation>Øª&amp;Ø­Ø±ÙØ±</translation>
+    </message>
+    <message>
+        <source>Undo</source>
+        <translation>ØªØ±Ø§Ø¬Ø¹</translation>
+    </message>
+    <message>
+        <source>&amp;Undo</source>
+        <translation>&amp;ØªØ±Ø§Ø¬Ø¹</translation>
+    </message>
+    <message>
+        <source>Redo</source>
+        <translation>Ø¥Ø¹Ø§Ø¯Ø©</translation>
+    </message>
+    <message>
+        <source>&amp;Redo</source>
+        <translation>Ø¥Ø¹Ø§&amp;Ø¯Ø©</translation>
+    </message>
+    <message>
+        <source>Cut</source>
+        <translation>ÙØµÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Cut</source>
+        <translation>&amp;ÙØµÙ</translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation>ÙØ³Ø®</translation>
+    </message>
+    <message>
+        <source>C&amp;opy</source>
+        <translation>&amp;ÙØ³Ø®</translation>
+    </message>
+    <message>
+        <source>Paste</source>
+        <translation>ØªÙØµÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Paste</source>
+        <translation>Øª&amp;ÙØµÙÙ</translation>
+    </message>
+    <message>
+        <source>For&amp;mat</source>
+        <translation>&amp;Ø·Ø±Ø§Ø²</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>&amp;Bold</source>
+        <translation>&amp;ØšÙÙÙ</translation>
+    </message>
+    <message>
+        <source>Italic</source>
+        <translation>Ù
+Ø§ØŠÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Italic</source>
+        <translation>Ù
+Ø§&amp;ØŠÙ</translation>
+    </message>
+    <message>
+        <source>Underline</source>
+        <translation>ØªØ³Ø·ÙØ±</translation>
+    </message>
+    <message>
+        <source>&amp;Underline</source>
+        <translation>ØªØ³Ø·Ù&amp;Ø±</translation>
+    </message>
+    <message>
+        <source>Left</source>
+        <translation>ÙØ³Ø§Ø±</translation>
+    </message>
+    <message>
+        <source>&amp;Left</source>
+        <translation>Ù&amp;Ø³Ø§Ø±</translation>
+    </message>
+    <message>
+        <source>Center</source>
+        <translation>ØªÙØ³ÙØ·</translation>
+    </message>
+    <message>
+        <source>C&amp;enter</source>
+        <translation>Øª&amp;ÙØ³ÙØ·</translation>
+    </message>
+    <message>
+        <source>Right</source>
+        <translation>ÙÙ
+ÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Right</source>
+        <translation>&amp;ÙÙ
+ÙÙ</translation>
+    </message>
+    <message>
+        <source>Justify</source>
+        <translation>Ø¶ØšØ· Ø§ÙÙØ§Ù
+ØŽ</translation>
+    </message>
+    <message>
+        <source>&amp;Justify</source>
+        <translation>Ø¶ØšØ· Ø§Ù&amp;ÙØ§Ù
+ØŽ</translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation>ÙÙÙ</translation>
+    </message>
+    <message>
+        <source>&amp;Color...</source>
+        <translation>&amp;ÙÙÙ...</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>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+        <translation type="obsolete">&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;ÙØµÙ ØºÙÙÙ&lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt ØªØ¯Ø¹Ù
+ Ø§ÙÙÙØµÙØµ Ø§ÙØºÙÙÙØ© Ø§ÙÙ
+ÙØ§Ø³Ø©Ø ÙØ§ÙØ¹ÙÙØ§Ù Ø§ÙØ¢ÙÙØ Ø§ÙÙÙØµÙØµ &lt;i&gt;&lt;font &gt;Ø§ÙÙ
+Ø§ØŠÙØ©&lt;/font&gt;&lt;/i&gt;Ø &lt;b&gt;&lt;font &gt;Ø§ÙØšÙÙÙØ© &lt;/font&gt;&lt;/b&gt;Ù &lt;u&gt;&lt;font &gt;Ø§ÙÙ
+Ø³Ø·ÙØ±Ø©&lt;/font&gt;&lt;/u&gt;Ø ÙÙ
+Ø§ ØªØ¯Ø¹Ù
+ Ø§ÙÙÙØµÙØµ Ø§ÙÙ
+ÙÙÙÙØ© ÙØ°ÙÙ. ÙØ°Ø§ &lt;font color=&quot;#ff0000&quot; &gt;Ø£Ø­Ù
+Ø±&lt;/font&gt;Ø ØšÙÙÙ
+Ø§ ÙØ°Ø§ &lt;font color=&quot;#00bb00&quot; &gt;Ø£Ø®Ø¶Ø±&lt;/font&gt;Ø Ù ÙØ°Ø§ &lt;font color=&quot;#0000ff&quot; &gt;Ø£Ø²Ø±Ù&lt;/font&gt;.
+&lt;/p&gt;
+&lt;&gt; &lt;/&gt;</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>&amp;Reset colors</source>
+        <translation>Ø¥&amp;Ø¹Ø§Ø¯Ø© ÙØ¶Ø¹ Ø§ÙØ£ÙÙØ§Ù</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>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+        <translation type="obsolete">&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;ÙØµÙ ØºÙÙÙ&lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt ØªØ¯Ø¹Ù
+ Ø§ÙÙÙØµÙØµ Ø§ÙØºÙÙÙØ© Ø§ÙÙ
+ÙØ§Ø³Ø©Ø ÙØ§ÙØ¹ÙÙØ§Ù Ø§ÙØ¢ÙÙØ Ø§ÙÙÙØµÙØµ &lt;i&gt;&lt;font &gt;Ø§ÙÙ
+Ø§ØŠÙØ©&lt;/font&gt;&lt;/i&gt;Ø &lt;b&gt;&lt;font &gt;Ø§ÙØšÙÙÙØ© &lt;/font&gt;&lt;/b&gt;Ù &lt;u&gt;&lt;font &gt;Ø§ÙÙ
+Ø³Ø·ÙØ±Ø©&lt;/font&gt;&lt;/u&gt;Ø ÙÙ
+Ø§ ØªØ¯Ø¹Ù
+ Ø§ÙÙÙØµÙØµ Ø§ÙÙ
+ÙÙÙÙØ© ÙØ°ÙÙ. ÙØ°Ø§ &lt;font color=&quot;#ff0000&quot; &gt;Ø£Ø­Ù
+Ø±&lt;/font&gt;Ø ØšÙÙÙ
+Ø§ ÙØ°Ø§ &lt;font color=&quot;#00bb00&quot; &gt;Ø£Ø®Ø¶Ø±&lt;/font&gt;Ø Ù ÙØ°Ø§ &lt;font color=&quot;#0000ff&quot; &gt;Ø£Ø²Ø±Ù&lt;/font&gt;.
+&lt;/p&gt;
+&lt;&gt; &lt;/&gt;</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>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot;font-size:8pt;font-family:MS Shell Dlg&quot;&gt;
+&lt;p style=&quot;margin-top:16px&quot;&gt;&lt;span style=&quot;font-size:12pt;font-weight:600&quot;&gt;Rich Text&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports rich text. This is &lt;span style=&quot;font-style:italic&quot;&gt;italics&lt;/span&gt;, this is &lt;span style=&quot;font-weight:600&quot;&gt;bold&lt;/span&gt;, this is &lt;span style=&quot;text-decoration:underline&quot;&gt;underlined&lt;/span&gt;, this is &lt;span style=&quot;color:#ff0000&quot;&gt;red&lt;/span&gt;, this is &lt;span style=&quot;color:#00ff00&quot;&gt;green&lt;/span&gt;, and this is &lt;span style=&quot;color:#0000ff&quot;&gt;blue&lt;/span&gt;.&lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</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>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot;font-size:8pt;font-family:MS Shell Dlg&quot;&gt;
+&lt;p style=&quot;margin-top:18px&quot;&gt;&lt;span style=&quot;font-size:9pt;font-weight:600&quot;&gt;Richtext &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;span style=&quot;font-style:italic&quot;&gt;emphasized&lt;/span&gt;, &lt;span style=&quot;font-weight:600&quot;&gt;bold &lt;/span&gt;and &lt;span style=&quot;text-decoration:underline&quot;&gt;underlined &lt;/span&gt;text, as well as colored text. This is &lt;span style=&quot;color:#ff0000&quot;&gt;red&lt;/span&gt;, while this is &lt;span style=&quot;color:#00bb00&quot;&gt;green&lt;/span&gt;, and this is &lt;span style=&quot;color:#0000ff&quot;&gt;blue&lt;/span&gt;. &lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
Index: trunk/examples/demo/translations/demo_de.ts
===================================================================
--- trunk/examples/demo/translations/demo_de.ts	(revision 164)
+++ trunk/examples/demo/translations/demo_de.ts	(revision 164)
@@ -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>&amp;Connect...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>&amp;Username:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Password:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Hostname:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>P&amp;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&amp;river</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;OK</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>&amp;Insert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Update</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>|&lt; &amp;First</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&lt;&lt; &amp;Prev</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Next &gt;&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Last &gt;|</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>&amp;Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+Q</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;Datei</translation>
+    </message>
+    <message>
+        <source>St&amp;yle</source>
+        <translation>St&amp;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>&amp;Wireframe</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Fl&amp;at shaded</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Smooth shaded</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Landscape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Fractalize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Reset grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>&amp;Scene</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&amp;Wirebox</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Gears</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Texture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Texture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&amp;Window Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Low Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Low Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Medium Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Medium Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>High Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;High Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Setup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Setup...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&amp;New Window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Open File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Backward</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Forward</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add Bookmark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation type="unfinished">&amp;Datei</translation>
+    </message>
+    <message>
+        <source>&amp;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>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</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>&amp;Invert Colors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Mirror</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Flip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>SQL Query</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Submit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>C&amp;lear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Press &quot;Connect&quot; to open a database</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Connect...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TextEdit</name>
+    <message>
+        <source>&amp;File</source>
+        <translation type="unfinished">&amp;Datei</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;New...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Open...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Save...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save As</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save &amp;As...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Print...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Undo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Undo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Redo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Redo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cut</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Cut</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>C&amp;opy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Paste</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Paste</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>For&amp;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>&amp;Bold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Underline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Underline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Center</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>C&amp;enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Justify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Justify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</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>&amp;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>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
Index: trunk/examples/demo/translations/demo_fr.ts
===================================================================
--- trunk/examples/demo/translations/demo_fr.ts	(revision 164)
+++ trunk/examples/demo/translations/demo_fr.ts	(revision 164)
@@ -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>&amp;Connect...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>&amp;Username:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Password:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Hostname:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>P&amp;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&amp;river</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;OK</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>&amp;Insert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Update</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>|&lt; &amp;First</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&lt;&lt; &amp;Prev</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Next &gt;&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Last &gt;|</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>&amp;Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+Q</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>St&amp;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>&amp;Wireframe</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Fl&amp;at shaded</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Smooth shaded</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Landscape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Fractalize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Reset grid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>&amp;Scene</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&amp;Wirebox</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Gears</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Texture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Texture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&amp;Window Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Low Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Low Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Medium Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Medium Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>High Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;High Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Setup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Setup...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&amp;New Window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Open File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Backward</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Forward</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add Bookmark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</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>&amp;Invert Colors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Mirror</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Flip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;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>Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>SQL Query</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Submit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>C&amp;lear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Press &quot;Connect&quot; to open a database</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Connect...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TextEdit</name>
+    <message>
+        <source>&amp;File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;New...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Open...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Save...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save As</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save &amp;As...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Print...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Undo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Undo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Redo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Redo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cut</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Cut</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>C&amp;opy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Paste</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Paste</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>For&amp;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>&amp;Bold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Underline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Underline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Center</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>C&amp;enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Justify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Justify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;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>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</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>&amp;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>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
Index: trunk/examples/demo/translations/demo_iw.ts
===================================================================
--- trunk/examples/demo/translations/demo_iw.ts	(revision 164)
+++ trunk/examples/demo/translations/demo_iw.ts	(revision 164)
@@ -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>&amp;Connect...</source>
+        <translation>&amp;××ª×××š××ª...</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Edit Books</source>
+        <translation>&amp;×¢×š×× ×¡×€×š××</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>&amp;Username:</source>
+        <translation>&amp;×©× ××©×ª××©:</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Password:</source>
+        <translation>&amp;×¡××¡××:</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Hostname:</source>
+        <translation>×©× &amp;×××š×:</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>P&amp;ort:</source>
+        <translation>&amp;××Š×××:</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Default</source>
+        <translation>××š××š×ª ××××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>D&amp;river</source>
+        <translation>×&amp;× ×× ××ª×§×</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;OK</source>
+        <translation>&amp;×××©××š</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Cancel</source>
+        <translation>&amp;×××××</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>&amp;Insert</source>
+        <translation>×&amp;××¡×£</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Update</source>
+        <translation>&amp;×¢×××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Delete</source>
+        <translation>&amp;×××§</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Close</source>
+        <translation>&amp;×¡×××š</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>|&lt; &amp;First</source>
+        <translation>|&lt; ×&amp;×š××©××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&lt;&lt; &amp;Prev</source>
+        <translation>&lt;&lt; ××§×&amp;××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Next &gt;&gt;</source>
+        <translation>×&amp;×× &gt;&gt;</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Last &gt;|</source>
+        <translation>××&amp;××š×× &gt;|</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>&amp;Exit</source>
+        <translation>&amp;××Š×××</translation>
+    </message>
+    <message>
+        <source>Ctrl+Q</source>
+        <translation>Ctrl+Q</translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;×§×××¥</translation>
+    </message>
+    <message>
+        <source>St&amp;yle</source>
+        <translation>&amp;×¡×× ××</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>&amp;Wireframe</source>
+        <translation>&amp;×š×©×ª</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Fl&amp;at shaded</source>
+        <translation>&amp;×©×××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Smooth shaded</source>
+        <translation>&amp;×××§</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Landscape</source>
+        <translation>&amp;×€× × ×©××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Fractalize</source>
+        <translation>&amp;Fractalize</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Reset grid</source>
+        <translation>&amp;××€×¡ ×š×©×ª</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Animate</source>
+        <translation>&amp;×× ×€×©</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>&amp;Scene</source>
+        <translation>×¡&amp;×Š×× ×</translation>
+    </message>
+    <message>
+        <source>&amp;New</source>
+        <translation>&amp;×××©</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation>×××©</translation>
+    </message>
+    <message>
+        <source>Wirebox</source>
+        <translation>×ª×××</translation>
+    </message>
+    <message>
+        <source>&amp;Wirebox</source>
+        <translation>&amp;×ª×××</translation>
+    </message>
+    <message>
+        <source>Gear</source>
+        <translation>××××× ×©×× ×××</translation>
+    </message>
+    <message>
+        <source>&amp;Gears</source>
+        <translation>&amp;××××× ×©×× ×××</translation>
+    </message>
+    <message>
+        <source>Texture</source>
+        <translation>××§×¡×××š×</translation>
+    </message>
+    <message>
+        <source>&amp;Texture</source>
+        <translation>&amp;××§×¡×××š×</translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation>×&amp;××€×¡</translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation>×××€×¡</translation>
+    </message>
+    <message>
+        <source>Window Size</source>
+        <translation>×××× ×××××</translation>
+    </message>
+    <message>
+        <source>&amp;Window Size</source>
+        <translation>&amp;×××× ×××××</translation>
+    </message>
+    <message>
+        <source>Low Resolution</source>
+        <translation>×š×××××Š×× × ××××</translation>
+    </message>
+    <message>
+        <source>&amp;Low Resolution</source>
+        <translation>×š×××××Š×× &amp;× ××××</translation>
+    </message>
+    <message>
+        <source>Medium Resolution</source>
+        <translation>×š×××××Š×× ××× ×× ××ª</translation>
+    </message>
+    <message>
+        <source>&amp;Medium Resolution</source>
+        <translation>×š×××××Š×× &amp;××× ×× ××ª</translation>
+    </message>
+    <message>
+        <source>High Resolution</source>
+        <translation>×š×××××Š×× ×××××</translation>
+    </message>
+    <message>
+        <source>&amp;High Resolution</source>
+        <translation>×š×××××Š×× &amp;×××××</translation>
+    </message>
+    <message>
+        <source>Setup</source>
+        <translation>××××š××ª</translation>
+    </message>
+    <message>
+        <source>&amp;Setup...</source>
+        <translation>&amp;××××š××ª...</translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation>×¡×××š</translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation>&amp;×¡×××š</translation>
+    </message>
+    <message>
+        <source>WireBox</source>
+        <translation>×ª×××</translation>
+    </message>
+    <message>
+        <source>Nurbs</source>
+        <translation>×¢×§××××ª</translation>
+    </message>
+</context>
+<context>
+    <name>HelpWindow</name>
+    <message>
+        <source>&amp;New Window</source>
+        <translation>&amp;×××× ×××©</translation>
+    </message>
+    <message>
+        <source>&amp;Open File</source>
+        <translation>&amp;×€×ª× ×§×××¥</translation>
+    </message>
+    <message>
+        <source>&amp;Print</source>
+        <translation>×&amp;××€×¡</translation>
+    </message>
+    <message>
+        <source>&amp;Backward</source>
+        <translation>&amp;××××š×</translation>
+    </message>
+    <message>
+        <source>&amp;Forward</source>
+        <translation>×§&amp;××××</translation>
+    </message>
+    <message>
+        <source>&amp;Home</source>
+        <translation>×&amp;×××ª×</translation>
+    </message>
+    <message>
+        <source>Add Bookmark</source>
+        <translation>×××¡×£ ×¡××× ××</translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;×§×××¥</translation>
+    </message>
+    <message>
+        <source>&amp;Go</source>
+        <translation>&amp;××¢××š</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>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+        <translation>&lt;div dir=rtl&gt;&lt;h3&gt;×××××ª Qt&lt;/h3&gt;&lt;/div&gt;&lt;p dir=rtl&gt;×ª××× ××ª ×× ×¢××©× ×©××××© ×-Qt ××š×××ª ×€×××€××š×××ª ×××š×¡× %1, ×¢×š××ª ××× ×××©×§ ××©×ª××© ××š×€× ×-++C ×-Qt .Trolltech ××¡×€×§×ª × ×××××ª ×§×× ××§××š ×××× ××× Windows 95/98/NT/2000, Linux, Solaris, HP-UX ××××š×¡×××ª ×š×××ª × ××¡×€××ª ×©× ××× ××§×¡ ×¢× X11.&lt;/p&gt;&lt;p dir=rtl&gt;×¢××× ×-&lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; ×××××¢ × ××¡×£.&lt;/p&gt;</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>&amp;Invert Colors</source>
+        <translation>&amp;××€×× ×Š××¢××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Mirror</source>
+        <translation>×&amp;×€×× ×××€×§××ª</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Flip</source>
+        <translation>××€×× ×&amp;× ×××ª</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;left</source>
+        <translation>×¡××× 90Â° &amp;×©××××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Rotate 90Â° &amp;right</source>
+        <translation>×¡××× 90Â° &amp;×××× ×</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Help</source>
+        <translation>&amp;×¢××š×</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Print</source>
+        <translation>×&amp;××€×¡</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Discard</source>
+        <translation>&amp;×××××</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>Required</source>
+        <translation>× ××š×©</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>SQL Query</source>
+        <translation>×©××××ª×ª SQL</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Submit</source>
+        <translation>&amp;×©××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>C&amp;lear</source>
+        <translation>&amp;× ×§×</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>Press &quot;Connect&quot; to open a database</source>
+        <translation>×××¥ ×¢× &quot;××ª×××š××ª&quot; ××× ××€×ª×× ××¡× × ×ª×× ××</translation>
+    </message>
+    <message encoding="UTF-8">
+        <source>&amp;Connect...</source>
+        <translation>&amp;××ª×××š××ª...</translation>
+    </message>
+</context>
+<context>
+    <name>TextEdit</name>
+    <message>
+        <source>&amp;File</source>
+        <translation>&amp;×§×××¥</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation>×××©</translation>
+    </message>
+    <message>
+        <source>&amp;New...</source>
+        <translation>&amp;×××©...</translation>
+    </message>
+    <message>
+        <source>Open</source>
+        <translation>×€×ª×</translation>
+    </message>
+    <message>
+        <source>&amp;Open...</source>
+        <translation>&amp;×€×ª×××...</translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation>×©×××š</translation>
+    </message>
+    <message>
+        <source>&amp;Save...</source>
+        <translation>&amp;×©×××š×...</translation>
+    </message>
+    <message>
+        <source>Save As</source>
+        <translation>×©×××š× ××©×</translation>
+    </message>
+    <message>
+        <source>Save &amp;As...</source>
+        <translation>×©×××š× &amp;××©×...</translation>
+    </message>
+    <message>
+        <source>Print</source>
+        <translation>×××€×¡</translation>
+    </message>
+    <message>
+        <source>&amp;Print...</source>
+        <translation>×&amp;××€×¡×...</translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation>×¡×××š</translation>
+    </message>
+    <message>
+        <source>&amp;Close</source>
+        <translation>&amp;×¡×××š</translation>
+    </message>
+    <message>
+        <source>&amp;Edit</source>
+        <translation>&amp;×¢×š×××</translation>
+    </message>
+    <message>
+        <source>Undo</source>
+        <translation>×××</translation>
+    </message>
+    <message>
+        <source>&amp;Undo</source>
+        <translation>&amp;×××</translation>
+    </message>
+    <message>
+        <source>Redo</source>
+        <translation>××Š×¢ ×©××</translation>
+    </message>
+    <message>
+        <source>&amp;Redo</source>
+        <translation>××Š×¢ &amp;×©××</translation>
+    </message>
+    <message>
+        <source>Cut</source>
+        <translation>××××š</translation>
+    </message>
+    <message>
+        <source>&amp;Cut</source>
+        <translation>&amp;××××š</translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation>××¢×ª×§</translation>
+    </message>
+    <message>
+        <source>C&amp;opy</source>
+        <translation>××¢&amp;×ª×§</translation>
+    </message>
+    <message>
+        <source>Paste</source>
+        <translation>××××§</translation>
+    </message>
+    <message>
+        <source>&amp;Paste</source>
+        <translation>×&amp;×××§</translation>
+    </message>
+    <message>
+        <source>For&amp;mat</source>
+        <translation>×¢×&amp;×Š××</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>&amp;Bold</source>
+        <translation>&amp;×××××©</translation>
+    </message>
+    <message>
+        <source>Italic</source>
+        <translation>× ×××</translation>
+    </message>
+    <message>
+        <source>&amp;Italic</source>
+        <translation>&amp;× ×××</translation>
+    </message>
+    <message>
+        <source>Underline</source>
+        <translation>×§× ×ª××ª×</translation>
+    </message>
+    <message>
+        <source>&amp;Underline</source>
+        <translation>&amp;×§× ×ª××ª×</translation>
+    </message>
+    <message>
+        <source>Left</source>
+        <translation>×©××××</translation>
+    </message>
+    <message>
+        <source>&amp;Left</source>
+        <translation>×©××&amp;××</translation>
+    </message>
+    <message>
+        <source>Center</source>
+        <translation>××š××</translation>
+    </message>
+    <message>
+        <source>C&amp;enter</source>
+        <translation>×&amp;×š××</translation>
+    </message>
+    <message>
+        <source>Right</source>
+        <translation>×××× ×</translation>
+    </message>
+    <message>
+        <source>&amp;Right</source>
+        <translation>&amp;×××× ×</translation>
+    </message>
+    <message>
+        <source>Justify</source>
+        <translation>×××©×š</translation>
+    </message>
+    <message>
+        <source>&amp;Justify</source>
+        <translation>××&amp;×©×š</translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation>×Š××¢</translation>
+    </message>
+    <message>
+        <source>&amp;Color...</source>
+        <translation>&amp;×Š××¢...</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>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+        <translation>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;××§×¡× ×¢×©××š  &lt;/h1&gt;
+&lt;/p&gt;&lt;p dir=&quot;rtl&quot;&gt;Qt ×ª××× ×××§×¡× ×¢×©××š ××¢××Š×, ××× ××××ª×š×ª ××¢××, ××§×¡× &lt;i&gt;&lt;font &gt;× ×××&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;×××××© &lt;/font&gt;&lt;/b&gt;×&lt;u&gt;&lt;font &gt;×§× ×ª××ª×&lt;/font&gt;&lt;/u&gt;, ××× ××§×¡× ×Š××¢×× ×. ××× &lt;font color=&quot;#ff0000&quot; &gt;××××&lt;/font&gt;, ××¢×× ×©××× &lt;font color=&quot;#00bb00&quot; &gt;××š××§&lt;/font&gt;, ×××× &lt;font color=&quot;#0000ff&quot; &gt;××××&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;</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>&amp;Reset colors</source>
+        <translation>&amp;××€×¡ ×Š××¢××</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>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext  &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+        <translation>&lt;div&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;××§×¡× ×¢×©××š  &lt;/h1&gt;&lt;/div&gt;
+&lt;p&gt;Qt ×ª××× ×××§×¡× ×¢×©××š ××¢××Š×, ××× ××××ª×š×ª ××¢××, ××§×¡× &lt;i&gt;&lt;font &gt;× ×××&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;×××××© &lt;/font&gt;&lt;/b&gt;×&lt;u&gt;&lt;font &gt;×§× ×ª××ª× &lt;/font&gt;&lt;/u&gt;,××× ××§×¡× ×Š××¢×× ×. ××× &lt;font color=&quot;#ff0000&quot; &gt;××××&lt;/font&gt;, ××¢×× ×©××× &lt;font color=&quot;#00bb00&quot; &gt;××š××§&lt;/font&gt;, ×××× &lt;font color=&quot;#0000ff&quot; &gt;××××&lt;/font&gt;.  &lt;/p&gt;
+&lt;&gt; &lt;/&gt;</translation>
+    </message>
+</context>
+</TS>
Index: trunk/examples/demo/widgets/widgetsbase.ui
===================================================================
--- trunk/examples/demo/widgets/widgetsbase.ui	(revision 164)
+++ trunk/examples/demo/widgets/widgetsbase.ui	(revision 164)
@@ -0,0 +1,1272 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>WidgetsBase</class>
+<widget class="QWidget">
+    <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="QLayoutWidget">
+            <property name="name">
+                <cstring>Layout3</cstring>
+            </property>
+            <hbox>
+                <property name="name">
+                    <cstring>unnamed</cstring>
+                </property>
+                <widget class="QLayoutWidget">
+                    <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="QLabel">
+                            <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="QButtonGroup">
+                    <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="QCheckBox" row="0" column="0">
+                            <property name="name">
+                                <cstring>CheckBox1</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Apple</string>
+                            </property>
+                        </widget>
+                        <widget class="QCheckBox" row="1" column="0">
+                            <property name="name">
+                                <cstring>CheckBox2</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Banana</string>
+                            </property>
+                        </widget>
+                        <widget class="QCheckBox" 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="QButtonGroup">
+                    <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="QRadioButton" row="1" column="0">
+                            <property name="name">
+                                <cstring>RadioButton3</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Whisky</string>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" row="2" column="0">
+                            <property name="name">
+                                <cstring>RadioButton4</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Wine</string>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" 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="QGroupBox">
+                    <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="QDateEdit" 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="QTimeEdit" 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="QLabel" 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="QGroupBox">
+            <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="QLCDNumber" 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="QSlider" 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="QLabel" 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="QPushButton" row="2" column="0">
+                    <property name="name">
+                        <cstring>pushButton</cstring>
+                    </property>
+                    <property name="cursor">
+                        <cursor>0</cursor>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Reset colors</string>
+                    </property>
+                </widget>
+                <widget class="QComboBox" 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="QLineEdit" 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="QLabel" 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="QSpinBox" row="1" column="2">
+                    <property name="name">
+                        <cstring>spinBox</cstring>
+                    </property>
+                </widget>
+                <widget class="QProgressBar" row="0" column="2">
+                    <property name="name">
+                        <cstring>progressBar</cstring>
+                    </property>
+                </widget>
+                <widget class="QLabel" 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="QLayoutWidget">
+            <property name="name">
+                <cstring>Layout4</cstring>
+            </property>
+            <hbox>
+                <property name="name">
+                    <cstring>unnamed</cstring>
+                </property>
+                <widget class="QListBox">
+                    <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="QTextEdit">
+                    <property name="name">
+                        <cstring>TextEdit1</cstring>
+                    </property>
+                    <property name="textFormat">
+                        <enum>RichText</enum>
+                    </property>
+                    <property name="text">
+                        <string>&lt;html&gt;&lt;head&gt;&lt;meta name="qrichtext" content="1" /&gt;&lt;/head&gt;&lt;body style="font-size:8pt;font-family:MS Shell Dlg"&gt;
+&lt;p style="margin-top:16px"&gt;&lt;span style="font-size:12pt;font-weight:600"&gt;Rich Text&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports rich text. This is &lt;span style="font-style:italic"&gt;italics&lt;/span&gt;, this is &lt;span style="font-weight:600"&gt;bold&lt;/span&gt;, this is &lt;span style="text-decoration:underline"&gt;underlined&lt;/span&gt;, this is &lt;span style="color:#ff0000"&gt;red&lt;/span&gt;, this is &lt;span style="color:#00ff00"&gt;green&lt;/span&gt;, and this is &lt;span style="color:#0000ff"&gt;blue&lt;/span&gt;.&lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</string>
+                    </property>
+                </widget>
+            </hbox>
+        </widget>
+        <widget class="QTabWidget">
+            <property name="name">
+                <cstring>TabWidget2</cstring>
+            </property>
+            <widget class="QWidget">
+                <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="QIconView" 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="QWidget">
+                <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="QListView" 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="QWidget">
+                <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="QTable" 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>Qt</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 QTime &amp;)</slot>
+        <slot access="public" specifier="">setTime(const QTime &amp;)</slot>
+        <slot access="public" specifier="">setTime(const QTime&amp;)</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 QDate&amp;)</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 QString&amp;)</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>setColor(const QString&amp;)</slot>
+    </connection>
+    <connection>
+        <sender>lineEdit</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>updateColorTest(const QString&amp;)</slot>
+    </connection>
+    <connection>
+        <sender>lineEdit</sender>
+        <signal>returnPressed()</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>setColor()</slot>
+    </connection>
+    <connection>
+        <sender>timeEdit</sender>
+        <signal>valueChanged(const QTime&amp;)</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>updateDateTimeString()</slot>
+    </connection>
+    <connection>
+        <sender>timeEdit</sender>
+        <signal>valueChanged(const QTime&amp;)</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 QString &amp; color )</slot>
+    <slot>setColor()</slot>
+    <slot>updateClock()</slot>
+    <slot access="protected">updateColorTest( const QString &amp; color )</slot>
+    <slot access="protected">updateDateTimeString()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+    <includehint>analogclock.h</includehint>
+</includehints>
+</UI>
Index: trunk/examples/demo/widgets/widgetsbase.ui.h
===================================================================
--- trunk/examples/demo/widgets/widgetsbase.ui.h	(revision 164)
+++ trunk/examples/demo/widgets/widgetsbase.ui.h	(revision 164)
@@ -0,0 +1,66 @@
+#include <qobjectlist.h>
+
+void WidgetsBase::init()
+{
+    timeEdit->setTime( QTime::currentTime() );
+    dateEdit->setDate( QDate::currentDate() );    
+}
+
+void WidgetsBase::destroy()
+{
+
+}
+
+void WidgetsBase::resetColors()
+{
+    groupBox->setPalette( palette(), FALSE );
+    QObjectList *chldn = groupBox->queryList();
+    if ( chldn ) {
+	for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+	    if(obj->isWidgetType()) {
+		QWidget *w = (QWidget *)obj;
+		if(!w->isTopLevel())
+		    w->setPalette(palette(), FALSE);
+	    }
+	}
+    }
+}
+
+void WidgetsBase::setColor( const QString & color )
+{
+    groupBox->setPalette( QColor( color ), FALSE );
+    QObjectList *chldn = groupBox->queryList();
+    if ( chldn ) {
+	for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+	    if(obj->isWidgetType()) {
+		QWidget *w = (QWidget *)obj;
+		if(!w->isTopLevel())
+		    w->setPalette(QColor(color), FALSE);
+	    }
+	}
+    }
+}
+
+void WidgetsBase::setColor()
+{
+    setColor( lineEdit->text() );
+}
+
+void WidgetsBase::updateClock()
+{
+    clock->setTime( timeEdit->time() );
+}
+
+void WidgetsBase::updateColorTest( const QString & color )
+{
+    colorTest->setPalette( QColor( color ), TRUE);
+}
+
+void WidgetsBase::updateDateTimeString()
+{
+    QDateTime dt;
+    dt.setDate( dateEdit->date() );
+    dt.setTime( timeEdit->time() );
+    dateTimeLabel->setText( dt.toString() );
+}
+
Index: trunk/examples/demo/widgets/widgetsbase_pro.ui
===================================================================
--- trunk/examples/demo/widgets/widgetsbase_pro.ui	(revision 164)
+++ trunk/examples/demo/widgets/widgetsbase_pro.ui	(revision 164)
@@ -0,0 +1,1161 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>WidgetsBase</class>
+<widget class="QWidget">
+    <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="QListBox" 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="QTextEdit" row="2" column="1">
+            <property name="name">
+                <cstring>TextEdit1</cstring>
+            </property>
+            <property name="textFormat">
+                <enum>RichText</enum>
+            </property>
+            <property name="text">
+                <string>&lt;html&gt;&lt;head&gt;&lt;meta name="qrichtext" content="1" /&gt;&lt;/head&gt;&lt;body style="font-size:8pt;font-family:MS Shell Dlg"&gt;
+&lt;p style="margin-top:18px"&gt;&lt;span style="font-size:9pt;font-weight:600"&gt;Richtext &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;span style="font-style:italic"&gt;emphasized&lt;/span&gt;, &lt;span style="font-weight:600"&gt;bold &lt;/span&gt;and &lt;span style="text-decoration:underline"&gt;underlined &lt;/span&gt;text, as well as colored text. This is &lt;span style="color:#ff0000"&gt;red&lt;/span&gt;, while this is &lt;span style="color:#00bb00"&gt;green&lt;/span&gt;, and this is &lt;span style="color:#0000ff"&gt;blue&lt;/span&gt;. &lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</string>
+            </property>
+        </widget>
+        <widget class="QTabWidget" row="3" column="0" rowspan="1" colspan="2">
+            <property name="name">
+                <cstring>TabWidget2</cstring>
+            </property>
+            <widget class="QWidget">
+                <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="QIconView" 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="QWidget">
+                <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="QListView" 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="QGroupBox" 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="QLCDNumber" 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="QSlider" 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="QLabel" 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="QPushButton" row="2" column="0">
+                    <property name="name">
+                        <cstring>pushButton</cstring>
+                    </property>
+                    <property name="cursor">
+                        <cursor>0</cursor>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Reset colors</string>
+                    </property>
+                </widget>
+                <widget class="QComboBox" 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="QLineEdit" 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="QLabel" 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="QSpinBox" row="1" column="2">
+                    <property name="name">
+                        <cstring>spinBox</cstring>
+                    </property>
+                </widget>
+                <widget class="QProgressBar" row="0" column="2">
+                    <property name="name">
+                        <cstring>progressBar</cstring>
+                    </property>
+                </widget>
+                <widget class="QLabel" 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="QLayoutWidget" 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="QLabel">
+                    <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="QButtonGroup">
+                    <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="QCheckBox" row="0" column="0">
+                            <property name="name">
+                                <cstring>CheckBox1</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Apples</string>
+                            </property>
+                        </widget>
+                        <widget class="QCheckBox" row="1" column="0">
+                            <property name="name">
+                                <cstring>CheckBox2</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Banana</string>
+                            </property>
+                        </widget>
+                        <widget class="QCheckBox" 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="QButtonGroup">
+                    <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="QRadioButton" row="1" column="0">
+                            <property name="name">
+                                <cstring>RadioButton3</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Sprite</string>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" row="2" column="0">
+                            <property name="name">
+                                <cstring>RadioButton4</cstring>
+                            </property>
+                            <property name="text">
+                                <string>Farris</string>
+                            </property>
+                        </widget>
+                        <widget class="QRadioButton" 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="QGroupBox">
+                    <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="QDateEdit" 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="QTimeEdit" 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="QLayoutWidget" 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="QLabel">
+                                    <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 QTime &amp;)</slot>
+        <slot access="public" specifier="">setTime(const QTime &amp;)</slot>
+        <slot access="public" specifier="">setTime(const QTime&amp;)</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 QDate&amp;)</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 QString&amp;)</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>setColor(const QString&amp;)</slot>
+    </connection>
+    <connection>
+        <sender>lineEdit</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>updateColorTest(const QString&amp;)</slot>
+    </connection>
+    <connection>
+        <sender>lineEdit</sender>
+        <signal>returnPressed()</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>setColor()</slot>
+    </connection>
+    <connection>
+        <sender>timeEdit</sender>
+        <signal>valueChanged(const QTime&amp;)</signal>
+        <receiver>WidgetsBase</receiver>
+        <slot>updateDateTimeString()</slot>
+    </connection>
+    <connection>
+        <sender>timeEdit</sender>
+        <signal>valueChanged(const QTime&amp;)</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 QString &amp; color )</slot>
+    <slot>setColor()</slot>
+    <slot>updateClock()</slot>
+    <slot access="protected">updateColorTest( const QString &amp; color )</slot>
+    <slot access="protected">updateDateTimeString()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+    <includehint>analogclock.h</includehint>
+</includehints>
+</UI>
Index: trunk/examples/demo/widgets/widgetsbase_pro.ui.h
===================================================================
--- trunk/examples/demo/widgets/widgetsbase_pro.ui.h	(revision 164)
+++ trunk/examples/demo/widgets/widgetsbase_pro.ui.h	(revision 164)
@@ -0,0 +1,64 @@
+#include <qobjectlist.h>
+
+void WidgetsBase::init()
+{
+	timeEdit->setTime( QTime::currentTime() );
+    	dateEdit->setDate( QDate::currentDate() );
+}
+
+void WidgetsBase::destroy()
+{
+
+}
+
+void WidgetsBase::resetColors()
+{
+    groupBox->setPalette( palette(), FALSE );
+    if(QObjectList *chldn = groupBox->queryList()) {
+	for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+	    if(obj->isWidgetType()) {
+		QWidget *w = (QWidget *)obj;
+		if(!w->isTopLevel())
+		    w->setPalette(palette(), FALSE);
+	    }
+	}
+    }
+}
+
+void WidgetsBase::setColor( const QString & color )
+{
+    groupBox->setPalette( QColor( color ), FALSE );
+    if(QObjectList *chldn = groupBox->queryList()) {
+	for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+	    if(obj->isWidgetType()) {
+		QWidget *w = (QWidget *)obj;
+		if(!w->isTopLevel())
+		    w->setPalette(QColor(color), FALSE);
+	    }
+	}
+    }
+}
+
+void WidgetsBase::setColor()
+{
+	setColor( lineEdit->text() );
+}
+
+void WidgetsBase::updateClock()
+{
+	clock->setTime( timeEdit->time() );
+}
+
+void WidgetsBase::updateColorTest( const QString & color )
+{
+	colorTest->setPalette( QColor( color ) );
+}
+
+void WidgetsBase::updateDateTimeString()
+{
+	QDateTime dt;
+    	dt.setDate( dateEdit->date() );
+    	dt.setTime( timeEdit->time() );
+    	dateTimeLabel->setText( dt.toString() );
+}
+
Index: trunk/examples/dirview/dirview.cpp
===================================================================
--- trunk/examples/dirview/dirview.cpp	(revision 164)
+++ trunk/examples/dirview/dirview.cpp	(revision 164)
@@ -0,0 +1,533 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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#......",
+    ".......##......."};
+
+QPixmap *folderLocked = 0;
+QPixmap *folderClosed = 0;
+QPixmap *folderOpen = 0;
+QPixmap *fileNormal = 0;
+
+/*****************************************************************************
+ *
+ * Class Directory
+ *
+ *****************************************************************************/
+
+Directory::Directory( Directory * parent, const QString& filename )
+    : QListViewItem( parent ), f(filename),
+      showDirsOnly( parent->showDirsOnly ),
+      pix( 0 )
+{
+    p = parent;
+    readable = QDir( fullName() ).isReadable();
+
+    if ( !readable )
+	setPixmap( folderLocked );
+    else
+	setPixmap( folderClosed );
+}
+
+
+Directory::Directory( QListView * parent, const QString& filename )
+    : QListViewItem( parent ), f(filename),
+      showDirsOnly( ( (DirectoryView*)parent )->showDirsOnly() ),
+      pix( 0 )
+{
+    p = 0;
+    readable = QDir( fullName() ).isReadable();
+}
+
+
+void Directory::setPixmap( QPixmap *px )
+{
+    pix = px;
+    setup();
+    widthChanged( 0 );
+    invalidateHeight();
+    repaint();
+}
+
+
+const QPixmap *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() ) {
+	QString s( fullName() );
+	QDir thisDir( s );
+	if ( !thisDir.isReadable() ) {
+	    readable = FALSE;
+	    setExpandable( FALSE );
+	    return;
+	}
+
+	listView()->setUpdatesEnabled( FALSE );
+	const QFileInfoList * files = thisDir.entryInfoList();
+	if ( files ) {
+	    QFileInfoListIterator it( *files );
+	    QFileInfo * 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 );
+    }
+    QListViewItem::setOpen( o );
+}
+
+
+void Directory::setup()
+{
+    setExpandable( TRUE );
+    QListViewItem::setup();
+}
+
+
+QString Directory::fullName()
+{
+    QString s;
+    if ( p ) {
+	s = p->fullName();
+	s.append( f.name() );
+	s.append( "/" );
+    } else {
+	s = f.name();
+    }
+    return s;
+}
+
+
+QString Directory::text( int column ) const
+{
+    if ( column == 0 )
+	return f.name();
+    else if ( readable )
+	return "Directory";
+    else
+	return "Unreadable Directory";
+}
+
+/*****************************************************************************
+ *
+ * Class DirectoryView
+ *
+ *****************************************************************************/
+
+DirectoryView::DirectoryView( QWidget *parent, const char *name, bool sdo )
+    : QListView( parent, name ), dirsOnly( sdo ), oldCurrent( 0 ),
+      dropItem( 0 ), mousePressed( FALSE )
+{
+    autoopen_timer = new QTimer( this );
+    if ( !folderLocked ) {
+	folderLocked = new QPixmap( folder_locked );
+	folderClosed = new QPixmap( folder_closed_xpm );
+	folderOpen = new QPixmap( folder_open_xpm );
+	fileNormal = new QPixmap( pix_file );
+    }
+
+    connect( this, SIGNAL( doubleClicked( QListViewItem * ) ),
+	     this, SLOT( slotFolderSelected( QListViewItem * ) ) );
+    connect( this, SIGNAL( returnPressed( QListViewItem * ) ),
+	     this, SLOT( slotFolderSelected( QListViewItem * ) ) );
+
+    setAcceptDrops( TRUE );
+    viewport()->setAcceptDrops( TRUE );
+
+    connect( autoopen_timer, SIGNAL( timeout() ),
+	     this, SLOT( openFolder() ) );
+}
+
+void DirectoryView::slotFolderSelected( QListViewItem *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( QDragEnterEvent *e )
+{
+    if ( !QUriDrag::canDecode(e) ) {
+	e->ignore();
+	return;
+    }
+
+    oldCurrent = currentItem();
+
+    QListViewItem *i = itemAt( contentsToViewport(e->pos()) );
+    if ( i ) {
+	dropItem = i;
+	autoopen_timer->start( autoopenTime );
+    }
+}
+
+
+void DirectoryView::contentsDragMoveEvent( QDragMoveEvent *e )
+{
+    if ( !QUriDrag::canDecode(e) ) {
+	e->ignore();
+	return;
+    }
+
+    QPoint vp = contentsToViewport( ( (QDragMoveEvent*)e )->pos() );
+    QListViewItem *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 QDropEvent::Copy:
+	    break;
+	case QDropEvent::Move:
+	    e->acceptAction();
+	    break;
+	case QDropEvent::Link:
+	    e->acceptAction();
+	    break;
+	default:
+	    ;
+	}
+    } else {
+	e->ignore();
+	autoopen_timer->stop();
+	dropItem = 0;
+    }
+}
+
+void DirectoryView::contentsDragLeaveEvent( QDragLeaveEvent * )
+{
+    autoopen_timer->stop();
+    dropItem = 0;
+
+    setCurrentItem( oldCurrent );
+    setSelected( oldCurrent, TRUE );
+}
+
+void DirectoryView::contentsDropEvent( QDropEvent *e )
+{
+    autoopen_timer->stop();
+
+    if ( !QUriDrag::canDecode(e) ) {
+	e->ignore();
+	return;
+    }
+
+    QListViewItem *item = itemAt( contentsToViewport(e->pos()) );
+    if ( item ) {
+
+	QStrList lst;
+
+	QUriDrag::decode( e, lst );
+
+	QString str;
+
+	switch ( e->action() ) {
+	    case QDropEvent::Copy:
+	    str = "Copy";
+	    break;
+	    case QDropEvent::Move:
+	    str = "Move";
+	    e->acceptAction();
+	    break;
+	    case QDropEvent::Link:
+	    str = "Link";
+	    e->acceptAction();
+	    break;
+	    default:
+	    str = "Unknown";
+	}
+
+	str += "\n\n";
+
+	e->accept();
+
+	for ( uint i = 0; i < lst.count(); ++i ) {
+	    QString filename = QDir::convertSeparators(QUriDrag::uriToLocalFile(lst.at(i)));
+	    str += filename + "\n";
+	}
+	str += QString( "\nTo\n\n   %1" )
+	    .arg( QDir::convertSeparators(fullPath(item)) );
+	
+	QMessageBox::information( this, "Drop target", str, "Not implemented" );
+    } else
+	e->ignore();
+
+}
+
+
+QString DirectoryView::fullPath(QListViewItem* item)
+{
+    QString 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] != ':') {
+		QDir dir(fullpath);
+		fullpath = dir.currentDirPath().left(2) + fullpath;
+	}
+#endif
+	
+    return fullpath;
+}
+
+void DirectoryView::contentsMousePressEvent( QMouseEvent* e )
+{
+    QListView::contentsMousePressEvent(e);
+    QPoint p( contentsToViewport( e->pos() ) );
+    QListViewItem *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( QMouseEvent* e )
+{
+    if ( mousePressed && ( presspos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+	mousePressed = FALSE;
+	QListViewItem *item = itemAt( contentsToViewport(presspos) );
+	if ( item ) {
+	    QString source = fullPath(item);
+	    if ( QFile::exists(source) ) {
+		QUriDrag* ud = new QUriDrag(viewport());
+		ud->setFileNames( source );
+		if ( ud->drag() )
+		    QMessageBox::information( this, "Drag source",
+		    QString("Delete ") + QDir::convertSeparators(source), "Not implemented" );
+	    }
+	}
+    }
+}
+
+void DirectoryView::contentsMouseReleaseEvent( QMouseEvent * )
+{
+    mousePressed = FALSE;
+}
+
+void DirectoryView::setDir( const QString &s )
+{
+    QListViewItemIterator it( this );
+    ++it;
+    for ( ; it.current(); ++it ) {
+	it.current()->setOpen( FALSE );
+    }
+
+    QStringList lst( QStringList::split( "/", s ) );
+    QListViewItem *item = firstChild();
+    QStringList::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( QPixmap *p )
+{
+    pix = p;
+    setup();
+    widthChanged( 0 );
+    invalidateHeight();
+    repaint();
+}
+
+
+const QPixmap *FileItem::pixmap( int i ) const
+{
+    if ( i )
+	return 0;
+    return pix;
+}
Index: trunk/examples/dirview/dirview.h
===================================================================
--- trunk/examples/dirview/dirview.h	(revision 164)
+++ trunk/examples/dirview/dirview.h	(revision 164)
@@ -0,0 +1,111 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DIRVIEW_H
+#define DIRVIEW_H
+
+#include <qlistview.h>
+#include <qstring.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qtimer.h>
+
+class QWidget;
+class QDragEnterEvent;
+class QDragMoveEvent;
+class QDragLeaveEvent;
+class QDropEvent;
+
+class FileItem : public QListViewItem
+{
+public:
+    FileItem( QListViewItem *parent, const QString &s1, const QString &s2 )
+	: QListViewItem( parent, s1, s2 ), pix( 0 ) {}
+
+    const QPixmap *pixmap( int i ) const;
+#if !defined(Q_NO_USING_KEYWORD)
+    using QListViewItem::setPixmap;
+#endif
+    void setPixmap( QPixmap *p );
+
+private:
+    QPixmap *pix;
+
+};
+
+class Directory : public QListViewItem
+{
+public:
+    Directory( QListView * parent, const QString& filename );
+    Directory( Directory * parent, const QString& filename, const QString &col2 )
+	: QListViewItem( parent, filename, col2 ), pix( 0 ) {}
+    Directory( Directory * parent, const QString& filename );
+
+    QString text( int column ) const;
+
+    QString fullName();
+
+    void setOpen( bool );
+    void setup();
+
+    const QPixmap *pixmap( int i ) const;
+#if !defined(Q_NO_USING_KEYWORD)
+    using QListViewItem::setPixmap;
+#endif
+    void setPixmap( QPixmap *p );
+
+private:
+    QFile f;
+    Directory * p;
+    bool readable;
+    bool showDirsOnly;
+    QPixmap *pix;
+
+};
+
+class DirectoryView : public QListView
+{
+    Q_OBJECT
+
+public:
+    DirectoryView( QWidget *parent = 0, const char *name = 0, bool sdo = FALSE );
+    bool showDirsOnly() { return dirsOnly; }
+
+public slots:
+    void setDir( const QString & );
+
+signals:
+    void folderSelected( const QString & );
+
+protected slots:
+    void slotFolderSelected( QListViewItem * );
+    void openFolder();
+
+protected:
+    void contentsDragEnterEvent( QDragEnterEvent *e );
+    void contentsDragMoveEvent( QDragMoveEvent *e );
+    void contentsDragLeaveEvent( QDragLeaveEvent *e );
+    void contentsDropEvent( QDropEvent *e );
+    void contentsMouseMoveEvent( QMouseEvent *e );
+    void contentsMousePressEvent( QMouseEvent *e );
+    void contentsMouseReleaseEvent( QMouseEvent *e );
+
+private:
+    QString fullPath(QListViewItem* item);
+    bool dirsOnly;
+    QListViewItem *oldCurrent;
+    QListViewItem *dropItem;
+    QTimer* autoopen_timer;
+    QPoint presspos;
+    bool mousePressed;
+
+};
+
+#endif
Index: trunk/examples/dirview/dirview.pro
===================================================================
--- trunk/examples/dirview/dirview.pro	(revision 164)
+++ trunk/examples/dirview/dirview.pro	(revision 164)
@@ -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
Index: trunk/examples/dirview/main.cpp
===================================================================
--- trunk/examples/dirview/main.cpp	(revision 164)
+++ trunk/examples/dirview/main.cpp	(revision 164)
@@ -0,0 +1,43 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include "dirview.h"
+
+int main( int argc, char ** argv )
+{
+    QApplication a( argc, argv );
+
+    DirectoryView mw;
+
+    mw.addColumn( "Name" );
+    mw.addColumn( "Type" );
+    mw.setTreeStepSize( 20 );
+
+    const QFileInfoList* roots = QDir::drives();
+    QPtrListIterator<QFileInfo> i(*roots);
+    QFileInfo* 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( "Qt Example - Directory Browser" );
+    mw.setAllColumnsShowFocus( TRUE );
+    a.setMainWidget( &mw );
+    mw.show();
+
+    return a.exec();
+}
Index: trunk/examples/distributor/distributor.pro
===================================================================
--- trunk/examples/distributor/distributor.pro	(revision 164)
+++ trunk/examples/distributor/distributor.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE	= app
+LANGUAGE	= C++
+TARGET		= distributor
+
+CONFIG		+= qt warn_on
+
+REQUIRES	= full-config
+
+SOURCES		+= main.cpp
+FORMS		= distributor.ui
Index: trunk/examples/distributor/distributor.ui
===================================================================
--- trunk/examples/distributor/distributor.ui	(revision 164)
+++ trunk/examples/distributor/distributor.ui	(revision 164)
@@ -0,0 +1,427 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Distributor</class>
+<widget class="QWizard">
+    <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>Qt Distribution Wizard</string>
+    </property>
+    <widget class="QWidget">
+        <property name="name">
+            <cstring>selectLibrary</cstring>
+        </property>
+        <attribute name="title">
+            <string>&lt;b&gt;Select Qt Library File&lt;/b&gt;</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="QLineEdit" 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="QPushButton" row="1" column="1">
+                <property name="name">
+                    <cstring>libBrowseButton</cstring>
+                </property>
+                <property name="text">
+                    <string>&amp;Browse...</string>
+                </property>
+            </widget>
+            <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="text">
+                    <string>&lt;p&gt;Enter the filename of the Qt library to modify, or use the &lt;i&gt;Browse&lt;/i&gt; button to browse for the library.&lt;/p&gt;
+&lt;p&gt;This wizard will allow you to modify the installation paths stored in the library.&lt;/p&gt;</string>
+                </property>
+            </widget>
+        </grid>
+    </widget>
+    <widget class="QWidget">
+        <property name="name">
+            <cstring>modifyPaths</cstring>
+        </property>
+        <attribute name="title">
+            <string>&lt;b&gt;Modify Installation Paths&lt;/b&gt;</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="QLabel" row="1" column="0">
+                <property name="name">
+                    <cstring>prefixBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Installation &amp;Prefix</string>
+                </property>
+                <property name="buddy" stdset="0">
+                    <cstring>prefixPath</cstring>
+                </property>
+            </widget>
+            <widget class="QLineEdit" 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="QLineEdit" row="1" column="1">
+                <property name="name">
+                    <cstring>prefixPath</cstring>
+                </property>
+                <property name="maxLength">
+                    <number>255</number>
+                </property>
+            </widget>
+            <widget class="QLineEdit" 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="QPushButton" row="1" column="2">
+                <property name="name">
+                    <cstring>prefixBrowseButton</cstring>
+                </property>
+                <property name="text">
+                    <string>&amp;Browse...</string>
+                </property>
+            </widget>
+            <widget class="QLineEdit" 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="QLabel" row="0" column="0" rowspan="1" colspan="3">
+                <property name="name">
+                    <cstring>textLabel2</cstring>
+                </property>
+                <property name="text">
+                    <string>&lt;p&gt;Enter the new &lt;i&gt;Installation Prefix&lt;/i&gt; for the selected Qt library, or use the &lt;i&gt;Browse&lt;/i&gt; button to browse for the desired directory.&lt;/p&gt;
+&lt;p&gt;Use the &lt;i&gt;Next&lt;/i&gt; button to review your choices and perform the modification.&lt;/p&gt;</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="QLineEdit" 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="QLineEdit" 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="QLabel" row="3" column="0" rowspan="1" colspan="3">
+                <property name="name">
+                    <cstring>textLabel3</cstring>
+                </property>
+                <property name="text">
+                    <string>&lt;p&gt;The various paths below are set automatically according to the chosen &lt;i&gt;Installation Prefix&lt;/i&gt;.  Uncheck the &lt;i&gt;Set paths from Installation Prefix&lt;/i&gt; box to enter custom values.&lt;/p&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLineEdit" 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="QCheckBox" 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="QLabel" row="6" column="0">
+                <property name="name">
+                    <cstring>docBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Documentation</string>
+                </property>
+            </widget>
+            <widget class="QLabel" row="10" column="0">
+                <property name="name">
+                    <cstring>datBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Data</string>
+                </property>
+            </widget>
+            <widget class="QLabel" row="7" column="0">
+                <property name="name">
+                    <cstring>hdrBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Headers</string>
+                </property>
+            </widget>
+            <widget class="QLabel" row="8" column="0">
+                <property name="name">
+                    <cstring>libBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Libraries</string>
+                </property>
+            </widget>
+            <widget class="QLabel" row="9" column="0">
+                <property name="name">
+                    <cstring>plgBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Plugins</string>
+                </property>
+            </widget>
+            <widget class="QLabel" row="5" column="0">
+                <property name="name">
+                    <cstring>binBuddy</cstring>
+                </property>
+                <property name="text">
+                    <string>Binaries</string>
+                </property>
+            </widget>
+        </grid>
+    </widget>
+    <widget class="QWidget">
+        <property name="name">
+            <cstring>verifyMods</cstring>
+        </property>
+        <attribute name="title">
+            <string>&lt;b&gt;Verify Modifications&lt;/b&gt;</string>
+        </attribute>
+        <hbox>
+            <property name="name">
+                <cstring>unnamed</cstring>
+            </property>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel4</cstring>
+                </property>
+                <property name="text">
+                    <string>&lt;p&gt;&lt;b&gt;Current Library File:&lt;/b&gt; %1&lt;/p&gt;
+&lt;table border=0&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;New Installation Prefix:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Binaries Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Documentation Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Headers Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Libraries Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%6&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Plugins Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%7&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Data Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%8&lt;/td&gt;&lt;/tr&gt;
+&lt;/table&gt;
+&lt;p&gt;Please verify that these options are correct.  Press the &lt;i&gt;Finish&lt;/i&gt; button to apply these modifications to the Qt library.  Use the &lt;i&gt;Back&lt;/i&gt; button to make corrections.  Use the &lt;i&gt;Cancel&lt;/i&gt; button to abort.&lt;/p&gt;</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 QString&amp;)</signal>
+        <receiver>Distributor</receiver>
+        <slot>checkLibFilename(const QString&amp;)</slot>
+    </connection>
+    <connection>
+        <sender>libBrowseButton</sender>
+        <signal>clicked()</signal>
+        <receiver>Distributor</receiver>
+        <slot>browseLibFilename()</slot>
+    </connection>
+    <connection>
+        <sender>prefixPath</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>Distributor</receiver>
+        <slot>checkInstallationPrefix(const QString&amp;)</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">QTimer *timer;</variable>
+</variables>
+<slots>
+    <slot>checkLibFilename( const QString &amp; filename )</slot>
+    <slot>browseLibFilename()</slot>
+    <slot>checkLibData()</slot>
+    <slot>checkInstallationPrefix( const QString &amp;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( QWidget * page )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
Index: trunk/examples/distributor/distributor.ui.h
===================================================================
--- trunk/examples/distributor/distributor.ui.h	(revision 164)
+++ trunk/examples/distributor/distributor.ui.h	(revision 164)
@@ -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
+** Qt 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 QTimer( 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( QWidget *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();
+
+	QString 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 Qt "
+	       "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 );
+    }
+
+    QWizard::showPage( page );
+}
+
+void Distributor::checkLibFilename( const QString &filename )
+{
+    setNextEnabled( selectLibrary, FALSE );
+
+    QFileInfo fileinfo( filename );
+    if ( ! filename.isEmpty() && fileinfo.exists() &&
+	 fileinfo.isReadable() && fileinfo.isWritable() &&
+	 fileinfo.isFile() && !fileinfo.isSymLink() )
+	timer->start( 500, TRUE );
+}
+
+void Distributor::browseLibFilename()
+{
+    QString filename =
+	QFileDialog::getOpenFileName( QString::null, QString::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;
+	QCString 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);
+
+    QFile file( libFilename->text() );
+    if ( file.open( IO_ReadOnly ) ) {
+	QApplication::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 ) {
+	    QApplication::eventLoop()->processEvents( QEventLoop::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();
+
+	QApplication::restoreOverrideCursor();
+    }
+
+    if ( completed == total_steps ) {
+	setNextEnabled( selectLibrary, TRUE );
+
+	QString prefix = QFile::decodeName( steps[0].value );
+	prefixPath->setText( prefix );
+
+	QString def_bin = prefix + QString::fromLatin1( "/bin" );
+	QString def_doc = prefix + QString::fromLatin1( "/doc" );
+	QString def_hdr = prefix + QString::fromLatin1( "/include" );
+	QString def_lib = prefix + QString::fromLatin1( "/lib" );
+	QString def_plg = prefix + QString::fromLatin1( "/plugins" );
+	QString def_dat = prefix;
+
+	QString bin = QFile::decodeName( steps[1].value );
+	QString doc = QFile::decodeName( steps[2].value );
+	QString hdr = QFile::decodeName( steps[3].value );
+	QString lib = QFile::decodeName( steps[4].value );
+	QString plg = QFile::decodeName( steps[5].value );
+	QString dat = QFile::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 QString &prefix )
+{
+    if ( autoSet->isChecked() ) {
+	binPath->setText( prefix + QString::fromLatin1( "/bin" ) );
+	docPath->setText( prefix + QString::fromLatin1( "/doc" ) );
+	hdrPath->setText( prefix + QString::fromLatin1( "/include" ) );
+	libPath->setText( prefix + QString::fromLatin1( "/lib" ) );
+	plgPath->setText( prefix + QString::fromLatin1( "/plugins" ) );
+	datPath->setText( prefix );
+    }
+}
+
+void Distributor::browseInstallationPrefix()
+{
+    QString prefix =
+	QFileDialog::getOpenFileName( QString::null, QString::null, this );
+    prefixPath->setText( prefix );
+}
+
+
+void Distributor::toggleAutoSet( bool autoset )
+{
+    if ( autoset ) checkInstallationPrefix( prefixPath->text() );
+}
+
+void Distributor::accept()
+{
+    struct step {
+	const char *key;
+	QCString value;
+	bool done;
+    } steps[7];
+
+    steps[0].key = "qt_nstpath=";
+    steps[0].value = QFile::encodeName( prefixPath->text() );
+    steps[0].done = FALSE;
+
+    steps[1].key = "qt_binpath=";
+    steps[1].value = QFile::encodeName( binPath->text() );
+    steps[1].done = FALSE;
+
+    steps[2].key = "qt_docpath=";
+    steps[2].value = QFile::encodeName( docPath->text() );
+    steps[2].done = FALSE;
+
+    steps[3].key = "qt_hdrpath=";
+    steps[3].value = QFile::encodeName( hdrPath->text() );
+    steps[3].done = FALSE;
+
+    steps[4].key = "qt_libpath=";
+    steps[4].value = QFile::encodeName( libPath->text() );
+    steps[4].done = FALSE;
+
+    steps[5].key = "qt_plgpath=";
+    steps[5].value = QFile::encodeName( plgPath->text() );
+    steps[5].done = FALSE;
+
+    steps[6].key = "qt_datpath=";
+    steps[6].value = QFile::encodeName( datPath->text() );
+    steps[6].done = FALSE;
+
+    uint completed = 0;
+    uint total_steps = sizeof(steps) / sizeof(step);
+
+    QFile file( libFilename->text() );
+    if ( file.open( IO_ReadWrite ) ) {
+	QApplication::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 ) {
+	    QApplication::eventLoop()->processEvents( QEventLoop::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();
+
+	QApplication::restoreOverrideCursor();
+    }
+
+    if ( completed != total_steps ) {
+    	QMessageBox::information( this,
+				  tr("Qt 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;
+    }
+
+    QWizard::accept();
+}
Index: trunk/examples/distributor/main.cpp
===================================================================
--- trunk/examples/distributor/main.cpp	(revision 164)
+++ trunk/examples/distributor/main.cpp	(revision 164)
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "distributor.h"
+
+int main( int argc, char ** argv )
+{
+    QApplication a( argc, argv );
+    Distributor w;
+    w.show();
+    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
+    return a.exec();
+}
Index: trunk/examples/dragdrop/dragdrop.pro
===================================================================
--- trunk/examples/dragdrop/dragdrop.pro	(revision 164)
+++ trunk/examples/dragdrop/dragdrop.pro	(revision 164)
@@ -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
Index: trunk/examples/dragdrop/dropsite.cpp
===================================================================
--- trunk/examples/dragdrop/dropsite.cpp	(revision 164)
+++ trunk/examples/dragdrop/dropsite.cpp	(revision 164)
@@ -0,0 +1,159 @@
+/****************************************************************************
+** $Id$
+**
+** Drop site example implementation
+**
+** Created : 979899
+**
+** Copyright (C) 1997 by Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "dropsite.h"
+#include "secret.h"
+#include <qevent.h>
+#include <qpixmap.h>
+#include <qdragobject.h>
+#include <qimage.h>
+#include <qdir.h>
+
+
+DropSite::DropSite( QWidget * parent, const char * name )
+    : QLabel( parent, name )
+{
+    setAcceptDrops(TRUE);
+}
+
+
+DropSite::~DropSite()
+{
+    // nothing necessary
+}
+
+
+void DropSite::dragMoveEvent( QDragMoveEvent *e )
+{
+    // Check if you want the drag at e->pos()...
+    // Give the user some feedback - only copy is possible
+    e->acceptAction( e->action() == QDropEvent::Copy );
+}
+
+
+void DropSite::dragEnterEvent( QDragEnterEvent *e )
+{
+    // Check if you want the drag...
+    if ( SecretDrag::canDecode( e )
+      || QTextDrag::canDecode( e )
+      || QImageDrag::canDecode( e )
+      || QUriDrag::canDecode( e ) )
+    {
+	e->accept();
+    }
+
+
+    // Give the user some feedback...
+    QString 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( QDragLeaveEvent * )
+{
+    // Give the user some feedback...
+    emit message("");
+    setBackgroundColor(lightGray);
+}
+
+
+void DropSite::dropEvent( QDropEvent * e )
+{
+    setBackgroundColor(lightGray);
+
+    // Try to decode to the data you understand...
+    QStrList strings;
+    if ( QUriDrag::decode( e, strings ) ) {
+	QString m("Full URLs:\n");
+	for (const char* u=strings.first(); u; u=strings.next())
+	    m = m + "   " + u + '\n';
+	QStringList files;
+	if ( QUriDrag::decodeLocalFiles( e, files ) ) {
+	    m += "Files:\n";
+	    for (QStringList::Iterator i=files.begin(); i!=files.end(); ++i)
+		m = m + "   " + QDir::convertSeparators(*i) + '\n';
+	}
+	setText( m );
+	setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+	return;
+    }
+
+    QString str;
+    if ( QTextDrag::decode( e, str ) ) {
+	setText( str );
+	setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+	return;
+    }
+
+    QPixmap pm;
+    if ( QImageDrag::decode( e, pm ) ) {
+	setPixmap( pm );
+	setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+	return;
+    }
+
+    if ( SecretDrag::decode( e, str ) ) {
+	setText( str );
+	setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+	return;
+    }
+}
+
+DragMoviePlayer::DragMoviePlayer( QDragObject* p ) :
+    QObject(p),
+    dobj(p),
+    movie("trolltech.gif" )
+{
+    movie.connectUpdate(this,SLOT(updatePixmap(const QRect&)));
+}
+
+void DragMoviePlayer::updatePixmap( const QRect& )
+{
+    dobj->setPixmap(movie.framePixmap());
+}
+
+void DropSite::mousePressEvent( QMouseEvent * /*e*/ )
+{
+    QDragObject *drobj;
+    if ( pixmap() ) {
+	drobj = new QImageDrag( pixmap()->convertToImage(), this );
+#if 1
+	QPixmap pm;
+	pm.convertFromImage(pixmap()->convertToImage().smoothScale(
+	    pixmap()->width()/3,pixmap()->height()/3));
+	drobj->setPixmap(pm,QPoint(-5,-7));
+#else
+	// Try it.
+	(void)new DragMoviePlayer(drobj);
+#endif
+    } else {
+	drobj = new QTextDrag( text(), this );
+    }
+    drobj->dragCopy();
+}
+
+
+void DropSite::backgroundColorChange( const QColor & )
+{
+    // Reduce flicker by using repaint() rather than update()
+    repaint();
+}
Index: trunk/examples/dragdrop/dropsite.h
===================================================================
--- trunk/examples/dragdrop/dropsite.h	(revision 164)
+++ trunk/examples/dragdrop/dropsite.h	(revision 164)
@@ -0,0 +1,56 @@
+/****************************************************************************
+** $Id$
+**
+** Drop site example implementation
+**
+** Created : 979899
+**
+** Copyright (C) 1997 by Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DROPSITE_H
+#define DROPSITE_H
+
+#include <qlabel.h>
+#include <qmovie.h>
+#include "qdropsite.h"
+
+class QDragObject;
+
+class DropSite: public QLabel
+{
+    Q_OBJECT
+public:
+    DropSite( QWidget * parent = 0, const char * name = 0 );
+    ~DropSite();
+
+signals:
+    void message( const QString& );
+
+protected:
+    void dragEnterEvent( QDragEnterEvent * );
+    void dragMoveEvent( QDragMoveEvent * );
+    void dragLeaveEvent( QDragLeaveEvent * );
+    void dropEvent( QDropEvent * );
+    void backgroundColorChange( const QColor& );
+
+    // this is a normal even
+    void mousePressEvent( QMouseEvent * );
+};
+
+class DragMoviePlayer : public QObject {
+    Q_OBJECT
+    QDragObject* dobj;
+    QMovie movie;
+public:
+    DragMoviePlayer(QDragObject*);
+private slots:
+    void updatePixmap( const QRect& );
+};
+
+
+#endif
Index: trunk/examples/dragdrop/main.cpp
===================================================================
--- trunk/examples/dragdrop/main.cpp	(revision 164)
+++ trunk/examples/dragdrop/main.cpp	(revision 164)
@@ -0,0 +1,74 @@
+/****************************************************************************
+** $Id$
+**
+** Ritual main() for Qt applications
+**
+** Copyright (C) 1996 by Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "dropsite.h"
+#include "secret.h"
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+
+static void addStuff( QWidget * parent, bool image, bool secret = FALSE )
+{
+    QVBoxLayout * tll = new QVBoxLayout( parent, 10 );
+    DropSite * d = new DropSite( parent );
+    d->setFrameStyle( QFrame::Sunken + QFrame::WinPanel );
+    tll->addWidget( d );
+    if ( image ) {
+	QPixmap stuff;
+	if ( !stuff.load( "trolltech.bmp" ) ) {
+	    stuff = QPixmap(20,20);
+	    stuff.fill(Qt::green);
+	}
+	d->setPixmap( stuff );
+    } else {
+	d->setText("Drag and Drop");
+    }
+    d->setFont(QFont("Helvetica",18));
+    if ( secret ) {
+	SecretSource *s = new SecretSource( 42, parent );
+	tll->addWidget( s );
+    }
+
+    QLabel * format = new QLabel( "\n\n\n\nNone\n\n\n\n", parent );
+    tll->addWidget( format );
+    tll->activate();
+    parent->resize( parent->sizeHint() );
+
+    QObject::connect( d, SIGNAL(message(const QString&)),
+		      format, SLOT(setText(const QString&)) );
+}
+
+
+int main( int argc, char ** argv )
+{
+    QApplication a( argc, argv );
+
+    QWidget mw;
+    addStuff( &mw, TRUE );
+    mw.setCaption( "Qt Example - Drag and Drop" );
+    mw.show();
+
+    QWidget mw2;
+    addStuff( &mw2, FALSE );
+    mw2.setCaption( "Qt Example - Drag and Drop" );
+    mw2.show();
+
+    QWidget mw3;
+    addStuff( &mw3, TRUE, TRUE );
+    mw3.setCaption( "Qt Example - Drag and Drop" );
+    mw3.show();
+
+    QObject::connect(qApp,SIGNAL(lastWindowClosed()),qApp,SLOT(quit()));
+    return a.exec();
+}
Index: trunk/examples/dragdrop/secret.cpp
===================================================================
--- trunk/examples/dragdrop/secret.cpp	(revision 164)
+++ trunk/examples/dragdrop/secret.cpp	(revision 164)
@@ -0,0 +1,92 @@
+/****************************************************************************
+** $Id$
+**
+** Custom MIME type implementation example
+**
+** Created : 979899
+**
+** Copyright (C) 1997 by Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "secret.h"
+#include <qevent.h>
+
+
+//create the object withe the secret byte
+SecretDrag::SecretDrag( uchar secret, QWidget * parent, const char * name )
+    : QStoredDrag( "secret/magic", parent, name )
+{
+    QByteArray data(1);
+    data[0]= secret;
+    setEncodedData( data );
+}
+
+
+bool SecretDrag::canDecode( QDragMoveEvent* e )
+{
+    return e->provides( "secret/magic" );
+}
+
+//decode it into a string
+bool SecretDrag::decode( QDropEvent* e, QString& str )
+{
+    QByteArray payload = e->data( "secret/magic" );
+    if ( payload.size() ) {
+	e->accept();
+	QString msg;
+	msg.sprintf("The secret number is %d", payload[0] );
+	str = msg;
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+SecretSource::SecretSource( int secret, QWidget *parent, const char * name )
+    : QLabel( "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( QMouseEvent * /*e*/ )
+{
+    SecretDrag *sd = new SecretDrag( mySecret, this );
+    sd->setPixmap(QPixmap(picture_xpm),QPoint(8,8));
+    sd->dragCopy();
+    mySecret++;
+}
Index: trunk/examples/dragdrop/secret.h
===================================================================
--- trunk/examples/dragdrop/secret.h	(revision 164)
+++ trunk/examples/dragdrop/secret.h	(revision 164)
@@ -0,0 +1,43 @@
+/****************************************************************************
+** $Id$
+**
+** Custom MIME type implementation example
+**
+** Created : 979899
+**
+** Copyright (C) 1997 by Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SECRETDRAG_H
+#define SECRETDRAG_H
+
+#include <qdragobject.h>
+#include <qlabel.h>
+
+class SecretDrag: public QStoredDrag {
+public:
+    SecretDrag( uchar, QWidget * parent = 0, const char * name = 0 );
+    ~SecretDrag() {};
+
+    static bool canDecode( QDragMoveEvent* e );
+    static bool decode( QDropEvent* e, QString& s );
+};
+
+
+class SecretSource: public QLabel
+{
+public:
+    SecretSource( int secret, QWidget *parent = 0, const char * name = 0 );
+    ~SecretSource();
+
+protected:
+    void mousePressEvent( QMouseEvent * );
+private:
+    int mySecret;
+};
+
+#endif
Index: trunk/examples/drawdemo/README
===================================================================
--- trunk/examples/drawdemo/README	(revision 164)
+++ trunk/examples/drawdemo/README	(revision 164)
@@ -0,0 +1,2 @@
+The drawdemo program demonstrates several drawing functions and printer
+output.
Index: trunk/examples/drawdemo/drawdemo.cpp
===================================================================
--- trunk/examples/drawdemo/drawdemo.cpp	(revision 164)
+++ trunk/examples/drawdemo/drawdemo.cpp	(revision 164)
@@ -0,0 +1,313 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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( QPainter *p )
+{
+    QFont f( "times", 18, QFont::Bold );
+    p->setFont( f );
+    p->setPen( Qt::black );
+    p->setWindow( 0, 0, 500, 500 );		// defines coordinate system
+
+    for ( int i=0; i<36; i++ ) {		// draws 36 rotated rectangles
+
+        QWMatrix 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
+
+        QColor 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
+
+        QString 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( QPainter *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] ) {
+            QFont font( fonts[f], sizes[s] );
+            p->setFont( font );
+            QFontMetrics 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( QPainter *p )
+{
+    QBrush b1( Qt::blue );
+    QBrush b2( Qt::green, Qt::Dense6Pattern );		// green 12% fill
+    QBrush b3( Qt::NoBrush );				// void brush
+    QBrush b4( Qt::CrossPattern );			// black cross pattern
+
+    p->setPen( Qt::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)(QPainter*);
+
+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 QWidget
+{
+    Q_OBJECT
+public:
+    DrawView();
+    ~DrawView();
+public slots:
+    void   updateIt( int );
+    void   printIt();
+protected:
+    void   drawIt( QPainter * );
+    void   paintEvent( QPaintEvent * );
+    void   resizeEvent( QResizeEvent * );
+private:
+    QPrinter	 *printer;
+    QButtonGroup *bgroup;
+    QPushButton	 *print;
+    int		  drawindex;
+    int		  maxindex;
+};
+
+
+//
+// Construct the DrawView with buttons.
+//
+
+DrawView::DrawView()
+{
+    setCaption( "Qt Draw Demo Application" );
+    setBackgroundMode(PaletteBase);
+
+    // Create a button group to contain all buttons
+    bgroup = new QButtonGroup( 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;
+    QFontMetrics 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 = QMAX(w,maxwidth); // QMAX 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++ ) {
+        QRadioButton *rb = new QRadioButton( 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 QPrinter;
+
+    // Create and setup the print button
+    print = new QPushButton( "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( QPainter *p )
+{
+    (*ourDrawFunctions[drawindex].f)(p);
+}
+
+//
+// Called when the print button is clicked.
+//
+
+void DrawView::printIt()
+{
+    if ( printer->setup( this ) ) {
+	QPainter paint;
+	if( !paint.begin( printer ) )               
+	    return;
+        drawIt( &paint );
+    }
+}
+
+//
+// Called when the widget needs to be updated.
+//
+
+void DrawView::paintEvent( QPaintEvent * )
+{
+    QPainter 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( QResizeEvent * )
+{
+    bgroup->move( width()-bgroup->width(), 0 );
+}
+
+
+//
+// Create and display our widget.
+//
+
+#include "drawdemo.moc"
+
+int main( int argc, char **argv )
+{
+    QApplication app( argc, argv );
+    DrawView   draw;
+    app.setMainWidget( &draw );
+    draw.setCaption("Qt Example - Drawdemo");
+    draw.show();
+    return app.exec();
+}
Index: trunk/examples/drawdemo/drawdemo.pro
===================================================================
--- trunk/examples/drawdemo/drawdemo.pro	(revision 164)
+++ trunk/examples/drawdemo/drawdemo.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE	= app
+TARGET		= drawdemo
+
+CONFIG		+= qt warn_on release
+DEPENDPATH	= ../../include
+
+REQUIRES	= full-config
+
+HEADERS		=
+SOURCES		= drawdemo.cpp
Index: trunk/examples/extension/dialogform.ui
===================================================================
--- trunk/examples/extension/dialogform.ui	(revision 164)
+++ trunk/examples/extension/dialogform.ui	(revision 164)
@@ -0,0 +1,206 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DialogForm</class>
+<widget class="QDialog">
+    <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="QLayoutWidget">
+            <property name="name">
+                <cstring>Layout7</cstring>
+            </property>
+            <hbox>
+                <property name="name">
+                    <cstring>unnamed</cstring>
+                </property>
+                <widget class="QLayoutWidget">
+                    <property name="name">
+                        <cstring>Layout5</cstring>
+                    </property>
+                    <vbox>
+                        <property name="name">
+                            <cstring>unnamed</cstring>
+                        </property>
+                        <widget class="QLayoutWidget">
+                            <property name="name">
+                                <cstring>Layout1</cstring>
+                            </property>
+                            <vbox>
+                                <property name="name">
+                                    <cstring>unnamed</cstring>
+                                </property>
+                                <widget class="QCheckBox">
+                                    <property name="name">
+                                        <cstring>sessionsCheckBox</cstring>
+                                    </property>
+                                    <property name="text">
+                                        <string>Save/Restore &amp;Sessions</string>
+                                    </property>
+                                    <property name="checked">
+                                        <bool>true</bool>
+                                    </property>
+                                </widget>
+                                <widget class="QCheckBox">
+                                    <property name="name">
+                                        <cstring>loggingCheckBox</cstring>
+                                    </property>
+                                    <property name="text">
+                                        <string>&amp;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="QLayoutWidget">
+                            <property name="name">
+                                <cstring>Layout4</cstring>
+                            </property>
+                            <hbox>
+                                <property name="name">
+                                    <cstring>unnamed</cstring>
+                                </property>
+                                <widget class="QPushButton">
+                                    <property name="name">
+                                        <cstring>detailsPushButton</cstring>
+                                    </property>
+                                    <property name="text">
+                                        <string>&amp;Details &gt;&gt;&gt;</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="QLayoutWidget">
+                    <property name="name">
+                        <cstring>Layout3</cstring>
+                    </property>
+                    <vbox>
+                        <property name="name">
+                            <cstring>unnamed</cstring>
+                        </property>
+                        <widget class="QPushButton">
+                            <property name="name">
+                                <cstring>okPushButton</cstring>
+                            </property>
+                            <property name="text">
+                                <string>OK</string>
+                            </property>
+                            <property name="default">
+                                <bool>true</bool>
+                            </property>
+                        </widget>
+                        <widget class="QPushButton">
+                            <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>
Index: trunk/examples/extension/dialogform.ui.h
===================================================================
--- trunk/examples/extension/dialogform.ui.h	(revision 164)
+++ trunk/examples/extension/dialogform.ui.h	(revision 164)
@@ -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 Qt 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 );
+    QString text = tr( "&Details " );
+    text += QString( extensionShown ? "<<<" : ">>>" );
+    detailsPushButton->setText( text );
+}
Index: trunk/examples/extension/extension.pro
===================================================================
--- trunk/examples/extension/extension.pro	(revision 164)
+++ trunk/examples/extension/extension.pro	(revision 164)
@@ -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
Index: trunk/examples/extension/extension.ui
===================================================================
--- trunk/examples/extension/extension.ui	(revision 164)
+++ trunk/examples/extension/extension.ui	(revision 164)
@@ -0,0 +1,114 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>Extension</class>
+<widget class="QWidget">
+    <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="QLayoutWidget">
+            <property name="name">
+                <cstring>Layout6</cstring>
+            </property>
+            <hbox>
+                <property name="name">
+                    <cstring>unnamed</cstring>
+                </property>
+                <widget class="QLabel">
+                    <property name="name">
+                        <cstring>TextLabel1</cstring>
+                    </property>
+                    <property name="text">
+                        <string>Log &amp;File</string>
+                    </property>
+                    <property name="buddy" stdset="0">
+                        <cstring>logfileLineEdit</cstring>
+                    </property>
+                </widget>
+                <widget class="QLineEdit">
+                    <property name="name">
+                        <cstring>logfileLineEdit</cstring>
+                    </property>
+                </widget>
+                <widget class="QPushButton">
+                    <property name="name">
+                        <cstring>browsePushButton</cstring>
+                    </property>
+                    <property name="text">
+                        <string>&amp;Browse...</string>
+                    </property>
+                </widget>
+            </hbox>
+        </widget>
+        <widget class="QButtonGroup">
+            <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="QLayoutWidget">
+                    <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="QCheckBox">
+                            <property name="name">
+                                <cstring>logActionsCheckBox</cstring>
+                            </property>
+                            <property name="text">
+                                <string>&amp;Actions</string>
+                            </property>
+                            <property name="checked">
+                                <bool>true</bool>
+                            </property>
+                        </widget>
+                        <widget class="QCheckBox">
+                            <property name="name">
+                                <cstring>logErrorsCheckBox</cstring>
+                            </property>
+                            <property name="text">
+                                <string>&amp;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>
Index: trunk/examples/extension/extension.ui.h
===================================================================
--- trunk/examples/extension/extension.ui.h	(revision 164)
+++ trunk/examples/extension/extension.ui.h	(revision 164)
@@ -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 Qt 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.
+*****************************************************************************/
Index: trunk/examples/extension/main.cpp
===================================================================
--- trunk/examples/extension/main.cpp	(revision 164)
+++ trunk/examples/extension/main.cpp	(revision 164)
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "mainform.h"
+
+int main( int argc, char ** argv )
+{
+    QApplication a( argc, argv );
+    MainForm *w = new MainForm;
+    w->show();
+    a.connect( &a, SIGNAL( lastWindowClosed() ), w, SLOT( quit() ) );
+    return a.exec();
+}
Index: trunk/examples/extension/mainform.ui
===================================================================
--- trunk/examples/extension/mainform.ui	(revision 164)
+++ trunk/examples/extension/mainform.ui	(revision 164)
@@ -0,0 +1,74 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MainForm</class>
+<widget class="QDialog">
+    <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="QPushButton">
+            <property name="name">
+                <cstring>optionsPushButton</cstring>
+            </property>
+            <property name="text">
+                <string>&amp;Options...</string>
+            </property>
+        </widget>
+        <widget class="QPushButton">
+            <property name="name">
+                <cstring>quitPushButton</cstring>
+            </property>
+            <property name="text">
+                <string>&amp;Quit</string>
+            </property>
+        </widget>
+    </vbox>
+</widget>
+<connections>
+    <connection>
+        <sender>optionsPushButton</sender>
+        <signal>clicked()</signal>
+        <receiver>MainForm</receiver>
+        <slot>optionsDlg()</slot>
+    </connection>
+    <connection>
+        <sender>quitPushButton</sender>
+        <signal>clicked()</signal>
+        <receiver>MainForm</receiver>
+        <slot>quit()</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>QString log_filename;</variable>
+</variables>
+<slots>    
+    <slot>optionsDlg()</slot>
+    <slot>quit()</slot>
+</slots>
+<functions>
+    <function access="private">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
Index: trunk/examples/extension/mainform.ui.h
===================================================================
--- trunk/examples/extension/mainform.ui.h	(revision 164)
+++ trunk/examples/extension/mainform.ui.h	(revision 164)
@@ -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 Qt 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 = QString::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::quit()
+{
+    QApplication::exit( 0 );
+}
Index: trunk/examples/fileiconview/fileiconview.pro
===================================================================
--- trunk/examples/fileiconview/fileiconview.pro	(revision 164)
+++ trunk/examples/fileiconview/fileiconview.pro	(revision 164)
@@ -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
Index: trunk/examples/fileiconview/main.cpp
===================================================================
--- trunk/examples/fileiconview/main.cpp	(revision 164)
+++ trunk/examples/fileiconview/main.cpp	(revision 164)
@@ -0,0 +1,27 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "mainwindow.h"
+#include "qfileiconview.h"
+
+#include <qapplication.h>
+
+
+int main( int argc, char **argv )
+{
+    QApplication a( argc, argv );
+
+    FileMainWindow mw;
+    mw.resize( 680, 480 );
+    a.setMainWidget( &mw );
+    mw.fileView()->setDirectory( "/" );
+    mw.show();
+    return a.exec();
+}
Index: trunk/examples/fileiconview/mainwindow.cpp
===================================================================
--- trunk/examples/fileiconview/mainwindow.cpp	(revision 164)
+++ trunk/examples/fileiconview/mainwindow.cpp	(revision 164)
@@ -0,0 +1,229 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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()
+    : QMainWindow()
+{
+    setup();
+}
+
+void FileMainWindow::show()
+{
+    QMainWindow::show();
+}
+
+void FileMainWindow::setup()
+{
+    QSplitter *splitter = new QSplitter( this );
+
+    dirlist = new DirectoryView( splitter, "dirlist", TRUE );
+    dirlist->addColumn( "Name" );
+    dirlist->addColumn( "Type" );
+    Directory *root = new Directory( dirlist, "/" );
+    root->setOpen( TRUE );
+    splitter->setResizeMode( dirlist, QSplitter::KeepSize );
+
+    fileview = new QtFileIconView( "/", splitter );
+    fileview->setSelectionMode( QIconView::Extended );
+
+    setCentralWidget( splitter );
+
+    QToolBar *toolbar = new QToolBar( this, "toolbar" );
+    setRightJustification( TRUE );
+
+    (void)new QLabel( tr( " Path: " ), toolbar );
+
+    pathCombo = new QComboBox( TRUE, toolbar );
+    pathCombo->setAutoCompletion( TRUE );
+    toolbar->setStretchableWidget( pathCombo );
+    connect( pathCombo, SIGNAL( activated( const QString & ) ),
+	     this, SLOT ( changePath( const QString & ) ) );
+
+    toolbar->addSeparator();
+
+    QPixmap pix;
+
+    pix = QPixmap( cdtoparent_xpm );
+    upButton = new QToolButton( pix, "One directory up", QString::null,
+				this, SLOT( cdUp() ), toolbar, "cd up" );
+
+    pix = QPixmap( newfolder_xpm );
+    mkdirButton = new QToolButton( pix, "New Folder", QString::null,
+				   this, SLOT( newFolder() ), toolbar, "new folder" );
+
+    connect( dirlist, SIGNAL( folderSelected( const QString & ) ),
+	     fileview, SLOT ( setDirectory( const QString & ) ) );
+    connect( fileview, SIGNAL( directoryChanged( const QString & ) ),
+	     this, SLOT( directoryChanged( const QString & ) ) );
+    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 QLabel( statusBar() );
+    statusBar()->addWidget( label, 2, TRUE );
+    progress = new QProgressBar( 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()
+{
+    QString 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 QString &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()
+{
+    QDir dir = fileview->currentDir();
+    dir.cd( ".." );
+    fileview->setDirectory( dir );
+}
+
+void FileMainWindow::newFolder()
+{
+    fileview->newDirectory();
+}
+
+void FileMainWindow::changePath( const QString &path )
+{
+    if ( QFileInfo( 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 );
+}
Index: trunk/examples/fileiconview/mainwindow.h
===================================================================
--- trunk/examples/fileiconview/mainwindow.h	(revision 164)
+++ trunk/examples/fileiconview/mainwindow.h	(revision 164)
@@ -0,0 +1,61 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef MAINWIN_H
+#define MAINWIN_H
+
+#include <qmainwindow.h>
+
+class QtFileIconView;
+class DirectoryView;
+class QProgressBar;
+class QLabel;
+class QComboBox;
+class QToolButton;
+
+class FileMainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    FileMainWindow();
+
+    QtFileIconView *fileView() { return fileview; }
+    DirectoryView *dirList() { return dirlist; }
+
+    void show();
+
+protected:
+    void setup();
+    void setPathCombo();
+
+    QtFileIconView *fileview;
+    DirectoryView *dirlist;
+    QProgressBar *progress;
+    QLabel *label;
+    QComboBox *pathCombo;
+    QToolButton *upButton, *mkdirButton;
+
+protected slots:
+    void directoryChanged( const QString & );
+    void slotStartReadDir( int dirs );
+    void slotReadNextDir();
+    void slotReadDirDone();
+    void cdUp();
+    void newFolder();
+    void changePath( const QString &path );
+    void enableUp();
+    void disableUp();
+    void enableMkdir();
+    void disableMkdir();
+
+};
+
+#endif
Index: trunk/examples/fileiconview/qfileiconview.cpp
===================================================================
--- trunk/examples/fileiconview/qfileiconview.cpp	(revision 164)
+++ trunk/examples/fileiconview/qfileiconview.cpp	(revision 164)
@@ -0,0 +1,836 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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 QPixmap *iconFolderLockedLarge = 0;
+static QPixmap *iconFolderLarge = 0;
+static QPixmap *iconFileLarge = 0;
+static QPixmap *iconLinkLarge = 0;
+static QPixmap *iconFolderLockedSmall = 0;
+static QPixmap *iconFolderSmall = 0;
+static QPixmap *iconFileSmall = 0;
+static QPixmap *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 QtFileIconDrag
+ *
+ *****************************************************************************/
+
+QtFileIconDrag::QtFileIconDrag( QWidget * dragSource, const char* name )
+    : QIconDrag( dragSource, name )
+{
+}
+
+const char* QtFileIconDrag::format( int i ) const
+{
+    if ( i == 0 )
+	return "application/x-qiconlist";
+    else if ( i == 1 )
+	return "text/uri-list";
+    else
+	return 0;
+}
+
+QByteArray QtFileIconDrag::encodedData( const char* mime ) const
+{
+    QByteArray a;
+    if ( QString( mime ) == "application/x-qiconlist" ) {
+	a = QIconDrag::encodedData( mime );
+    } else if ( QString( mime ) == "text/uri-list" ) {
+	QString s = urls.join( "\r\n" );
+	a.resize( s.length() );
+	memcpy( a.data(), s.latin1(), s.length() );
+    }
+    return a;
+}
+
+bool QtFileIconDrag::canDecode( QMimeSource* e )
+{
+    return e->provides( "application/x-qiconlist" ) ||
+	e->provides( "text/uri-list" );
+}
+
+void QtFileIconDrag::append( const QIconDragItem &item, const QRect &pr,
+			     const QRect &tr, const QString &url )
+{
+    QIconDrag::append( item, pr, tr );
+    QString ourUrl = url;    
+#ifdef Q_WS_WIN
+    if (ourUrl.length() > 2 && ourUrl[1] != ':') {
+	QDir dir(ourUrl);
+	ourUrl = dir.absPath();
+    }
+#endif
+    urls << QUriDrag::localFileToUri(ourUrl);
+}
+
+/*****************************************************************************
+ *
+ * Class QtFileIconViewItem
+ *
+ *****************************************************************************/
+
+QtFileIconViewItem::QtFileIconViewItem( QtFileIconView *parent, QFileInfo *fi )
+    : QIconViewItem( parent, fi->fileName() ), itemFileName( fi->filePath() ),
+      itemFileInfo( fi ), checkSetText( FALSE )
+{
+    vm = QtFileIconView::Large;
+
+    if ( itemFileInfo->isDir() )
+	itemType = Dir;
+    else if ( itemFileInfo->isFile() )
+	itemType = File;
+    if ( itemFileInfo->isSymLink() )
+	itemType = Link;
+
+    viewModeChanged( ( (QtFileIconView*)iconView() )->viewMode() );
+
+    if ( itemFileInfo->fileName() == "." ||
+	 itemFileInfo->fileName() == ".." )
+	setRenameEnabled( FALSE );
+
+    checkSetText = TRUE;
+
+    QObject::connect( &timer, SIGNAL( timeout() ),
+		      iconView(), SLOT( openFolder() ) );
+}
+
+void QtFileIconViewItem::paintItem( QPainter *p, const QColorGroup &cg )
+{
+    if ( itemFileInfo->isSymLink() ) {
+	QFont f( p->font() );
+	f.setItalic( TRUE );
+	p->setFont( f );
+    }
+
+    QIconViewItem::paintItem( p, cg );
+}
+
+void QtFileIconViewItem::viewModeChanged( QtFileIconView::ViewMode m )
+{
+    vm = m;
+    setDropEnabled( itemType == Dir && QDir( itemFileName ).isReadable() );
+    calcRect();
+}
+
+QPixmap *QtFileIconViewItem::pixmap() const
+{
+    switch ( itemType ) {
+    case Dir:
+	{
+	    if ( !QDir( itemFileName ).isReadable() ) {
+		if ( vm == QtFileIconView::Small )
+		    return iconFolderLockedSmall;
+		else
+		    return iconFolderLockedLarge;
+	    } else {
+		if ( vm == QtFileIconView::Small )
+		    return iconFolderSmall;
+		else
+		    return iconFolderLarge;
+	    }
+	}
+    case Link:
+	{
+	    if ( vm == QtFileIconView::Small )
+		return iconLinkSmall;
+	    else
+		return iconLinkLarge;
+	}
+    default:
+	{
+	    if ( vm == QtFileIconView::Small )
+		return iconFileSmall;
+	    else
+		return iconFileLarge;
+	}
+    }
+}
+
+QtFileIconViewItem::~QtFileIconViewItem()
+{
+    delete itemFileInfo;
+}
+
+void QtFileIconViewItem::setText( const QString &text )
+{
+    if ( checkSetText ) {
+	if ( text == "." || text == "." || text.isEmpty() )
+	    return;
+	QDir dir( itemFileInfo->dir() );
+	if ( dir.rename( itemFileInfo->fileName(), text ) ) {
+	    itemFileName = itemFileInfo->dirPath( TRUE ) + "/" + text;
+	    delete itemFileInfo;
+	    itemFileInfo = new QFileInfo( itemFileName );
+	    QIconViewItem::setText( text );
+	}
+    } else {
+	QIconViewItem::setText( text );
+    }
+}
+
+bool QtFileIconViewItem::acceptDrop( const QMimeSource *e ) const
+{
+    if ( type() == Dir && e->provides( "text/uri-list" ) &&
+	 dropEnabled() )
+	return TRUE;
+
+    return FALSE;
+}
+
+void QtFileIconViewItem::dropped( QDropEvent *e, const QValueList<QIconDragItem> & )
+{
+    timer.stop();
+
+    if ( !QUriDrag::canDecode( e ) ) {
+	e->ignore();
+	return;
+    }
+
+    QStringList lst;
+    QUriDrag::decodeLocalFiles( e, lst );
+
+    QString str;
+    if ( e->action() == QDropEvent::Copy )
+	str = "Copy\n\n";
+    else
+	str = "Move\n\n";
+    for ( uint i = 0; i < lst.count(); ++i )
+	str += QString( "   %1\n" ).arg( lst[i] );
+    str += QString( "\n"
+	"To\n\n"
+	"	%1" ).arg( filename() );
+
+    QMessageBox::information( iconView(), e->action() == QDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" );
+    if ( e->action() == QDropEvent::Move )
+	QMessageBox::information( iconView(), "Remove" , str, "Not Implemented" );
+    e->acceptAction();
+}
+
+void QtFileIconViewItem::dragEntered()
+{
+    if ( type() != Dir ||
+	 type() == Dir && !QDir( itemFileName ).isReadable() )
+	return;
+
+    ( (QtFileIconView*)iconView() )->setOpenItem( this );
+    timer.start( 1500 );
+}
+
+void QtFileIconViewItem::dragLeft()
+{
+    if ( type() != Dir ||
+	 type() == Dir && !QDir( itemFileName ).isReadable() )
+	return;
+
+    timer.stop();
+}
+
+/*****************************************************************************
+ *
+ * Class QtFileIconView
+ *
+ *****************************************************************************/
+
+QtFileIconView::QtFileIconView( const QString &dir, QWidget *parent, const char *name )
+    : QIconView( parent, name ), viewDir( dir ), newFolderNum( 0 )
+{
+    if ( !iconFolderLockedLarge ) {
+	qAddPostRoutine( cleanup );
+	QWMatrix m;
+	m.scale( 0.6, 0.6 );
+	QPixmap iconpix( folder_locked_icon );
+	iconFolderLockedLarge = new QPixmap( folder_locked_icon );
+	iconpix = iconpix.xForm( m );
+	iconFolderLockedSmall = new QPixmap( iconpix );
+	iconpix = QPixmap( folder_icon );
+	iconFolderLarge = new QPixmap( folder_icon );
+	iconpix = iconpix.xForm( m );
+	iconFolderSmall = new QPixmap( iconpix );
+	iconpix = QPixmap( file_icon );
+	iconFileLarge = new QPixmap( file_icon );
+	iconpix = iconpix.xForm( m );
+	iconFileSmall = new QPixmap( iconpix );
+	iconpix = QPixmap( link_icon );
+	iconLinkLarge = new QPixmap( link_icon );
+	iconpix = iconpix.xForm( m );
+	iconLinkSmall = new QPixmap( iconpix );
+    }
+
+    vm = Large;
+
+    setGridX( 75 );
+    setResizeMode( Adjust );
+    setWordWrapIconText( FALSE );
+
+    connect( this, SIGNAL( doubleClicked( QIconViewItem * ) ),
+	     this, SLOT( itemDoubleClicked( QIconViewItem * ) ) );
+    connect( this, SIGNAL( returnPressed( QIconViewItem * ) ),
+	     this, SLOT( itemDoubleClicked( QIconViewItem * ) ) );
+    connect( this, SIGNAL( dropped( QDropEvent *, const QValueList<QIconDragItem> & ) ),
+	     this, SLOT( slotDropped( QDropEvent *, const QValueList<QIconDragItem> & ) ) );
+    connect( this, SIGNAL( contextMenuRequested( QIconViewItem *, const QPoint & ) ),
+	     this, SLOT( slotRightPressed( QIconViewItem * ) ) );
+
+    setHScrollBarMode( AlwaysOff );
+    setVScrollBarMode( Auto );
+
+    setAutoArrange( TRUE );
+    setSorting( TRUE );
+    openItem = 0;
+}
+
+void QtFileIconView::openFolder()
+{
+    if ( !openItem )
+	return;
+    if ( openItem->type() != QtFileIconViewItem::Dir ||
+	 openItem->type() == QtFileIconViewItem::Dir &&
+	 !QDir( openItem->itemFileName ).isReadable() )
+	return;
+
+    openItem->timer.stop();
+    setDirectory( openItem->itemFileName );
+}
+
+void QtFileIconView::setDirectory( const QString &dir )
+{
+    viewDir = QDir( dir );
+    readDir( viewDir );
+}
+
+void QtFileIconView::setDirectory( const QDir &dir )
+{
+    viewDir = dir;
+    readDir( viewDir );
+}
+
+void QtFileIconView::newDirectory()
+{
+    setAutoArrange( FALSE );
+    selectAll( FALSE );
+    if ( viewDir.mkdir( QString( "New Folder %1" ).arg( ++newFolderNum ) ) ) {
+	QFileInfo *fi = new QFileInfo( viewDir, QString( "New Folder %1" ).arg( newFolderNum ) );
+	QtFileIconViewItem *item = new QtFileIconViewItem( this, new QFileInfo( *fi ) );
+	item->setKey( QString( "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 );
+}
+
+QDir QtFileIconView::currentDir()
+{
+    return viewDir;
+}
+
+static bool isRoot( const QString &s )
+{
+#if defined(Q_OS_UNIX)
+    if ( s == "/" )
+	return TRUE;
+#elif defined(Q_OS_WIN32)
+    QString 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 QtFileIconView::readDir( const QDir &dir )
+{
+    if ( !dir.isReadable() )
+	return;
+
+    if ( isRoot( dir.absPath() ) )
+	emit disableUp();
+    else
+	emit enableUp();
+
+    clear();
+
+    emit directoryChanged( dir.absPath() );
+
+    const QFileInfoList *filist = dir.entryInfoList( QDir::DefaultFilter, QDir::DirsFirst | QDir::Name );
+
+    emit startReadDir( filist->count() );
+
+    QFileInfoListIterator it( *filist );
+    QFileInfo *fi;
+    bool allowRename = FALSE, allowRenameSet = FALSE;
+    while ( ( fi = it.current() ) != 0 ) {
+	++it;
+	if ( fi && fi->fileName() == ".." && ( fi->dirPath() == "/" || fi->dirPath().isEmpty() ) )
+	    continue;
+	emit readNextDir();
+	QtFileIconViewItem *item = new QtFileIconViewItem( this, new QFileInfo( *fi ) );
+	if ( fi->isDir() )
+	    item->setKey( QString( "000000%1" ).arg( fi->fileName() ) );
+	else
+	    item->setKey( fi->fileName() );
+	if ( !allowRenameSet ) {
+	    if ( !QFileInfo( 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 ( !QFileInfo( dir.absPath() ).isWritable() )
+	emit disableMkdir();
+    else
+	emit enableMkdir();
+
+    emit readDirDone();
+}
+
+void QtFileIconView::itemDoubleClicked( QIconViewItem *i )
+{
+    QtFileIconViewItem *item = ( QtFileIconViewItem* )i;
+
+    if ( item->type() == QtFileIconViewItem::Dir ) {
+	viewDir = QDir( item->filename() );
+	readDir( viewDir );
+    } else if ( item->type() == QtFileIconViewItem::Link &&
+		QFileInfo( QFileInfo( item->filename() ).readLink() ).isDir() ) {
+	viewDir = QDir( QFileInfo( item->filename() ).readLink() );
+	readDir( viewDir );
+    }
+}
+
+QDragObject *QtFileIconView::dragObject()
+{
+    if ( !currentItem() )
+	return 0;
+
+    QPoint orig = viewportToContents( viewport()->mapFromGlobal( QCursor::pos() ) );
+    QtFileIconDrag *drag = new QtFileIconDrag( viewport() );
+    drag->setPixmap( *currentItem()->pixmap(),
+		     QPoint( currentItem()->pixmapRect().width() / 2, currentItem()->pixmapRect().height() / 2 ) );
+    for ( QtFileIconViewItem *item = (QtFileIconViewItem*)firstItem(); item;
+	  item = (QtFileIconViewItem*)item->nextItem() ) {
+	if ( item->isSelected() ) {
+	    QIconDragItem id;
+	    id.setData( QCString( item->filename() ) );
+	    drag->append( id,
+			  QRect( item->pixmapRect( FALSE ).x() - orig.x(),
+				 item->pixmapRect( FALSE ).y() - orig.y(),
+				 item->pixmapRect().width(), item->pixmapRect().height() ),
+			  QRect( item->textRect( FALSE ).x() - orig.x(),
+				 item->textRect( FALSE ).y() - orig.y(),
+				 item->textRect().width(), item->textRect().height() ),
+			  QString( item->filename() ) );
+	}
+    }
+
+    return drag;
+}
+
+void QtFileIconView::keyPressEvent( QKeyEvent *e )
+{
+    if ( e->key() == Key_N &&
+	 ( e->state() & ControlButton ) )
+	newDirectory();
+    else
+	QIconView::keyPressEvent( e );
+}
+
+void QtFileIconView::slotDropped( QDropEvent *e, const QValueList<QIconDragItem> & )
+{
+    if ( openItem )
+	openItem->timer.stop();
+    if ( !QUriDrag::canDecode( e ) ) {
+	e->ignore();
+	return;
+    }
+
+    QStringList lst;
+    QUriDrag::decodeLocalFiles( e, lst );
+
+    QString str;
+    if ( e->action() == QDropEvent::Copy )
+	str = "Copy\n\n";
+    else
+	str = "Move\n\n";
+    for ( uint i = 0; i < lst.count(); ++i )
+	str += QString( "   %1\n" ).arg( QDir::convertSeparators(lst[i]) );
+    str += QString( "\n"
+	"To\n\n"
+	"	%1" ).arg( viewDir.absPath() );
+
+    QMessageBox::information( this, e->action() == QDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" );
+    if ( e->action() == QDropEvent::Move )
+	QMessageBox::information( this, "Remove" , QDir::convertSeparators(lst.join("\n")), "Not Implemented" );
+    e->acceptAction();
+    openItem = 0;
+}
+
+void QtFileIconView::viewLarge()
+{
+    setViewMode( Large );
+}
+
+void QtFileIconView::viewSmall()
+{
+    setViewMode( Small );
+}
+
+void QtFileIconView::viewBottom()
+{
+    setItemTextPos( Bottom );
+}
+
+void QtFileIconView::viewRight()
+{
+    setItemTextPos( Right );
+}
+
+void QtFileIconView::flowEast()
+{
+    setHScrollBarMode( AlwaysOff );
+    setVScrollBarMode( Auto );
+    setArrangement( LeftToRight );
+}
+
+void QtFileIconView::flowSouth()
+{
+    setVScrollBarMode( AlwaysOff );
+    setHScrollBarMode( Auto );
+    setArrangement( TopToBottom );
+}
+
+void QtFileIconView::sortAscending()
+{
+    sort( TRUE );
+}
+
+void QtFileIconView::sortDescending()
+{
+    sort( FALSE );
+}
+
+void QtFileIconView::itemTextTruncate()
+{
+    setWordWrapIconText( FALSE );
+}
+
+void QtFileIconView::itemTextWordWrap()
+{
+    setWordWrapIconText( TRUE );
+}
+
+void QtFileIconView::slotRightPressed( QIconViewItem *item )
+{
+    if ( !item ) { // right pressed on viewport
+	QPopupMenu 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( QCursor::pos() );
+    } else { // on item
+	QPopupMenu menu( this );
+
+	int RENAME_ITEM = menu.insertItem( "Rename Item" );
+	int REMOVE_ITEM = menu.insertItem( "Remove Item" );
+
+	menu.setMouseTracking( TRUE );
+	int id = menu.exec( QCursor::pos() );
+
+	if ( id == -1 )
+	    return;
+
+	if ( id == RENAME_ITEM && item->renameEnabled() ) {
+	    item->rename();
+	} else if ( id == REMOVE_ITEM ) {
+	    delete item;
+	    QMessageBox::information( this, "Not implemented!", "Deleting files not implemented yet,\n"
+				      "The item has only been removed from the view! " );
+	}
+    }
+}
+
+void QtFileIconView::setViewMode( ViewMode m )
+{
+    if ( m == vm )
+	return;
+
+    vm = m;
+    QtFileIconViewItem *item = (QtFileIconViewItem*)firstItem();
+    for ( ; item; item = (QtFileIconViewItem*)item->nextItem() )
+	item->viewModeChanged( vm );
+
+    arrangeItemsInGrid();
+}
Index: trunk/examples/fileiconview/qfileiconview.h
===================================================================
--- trunk/examples/fileiconview/qfileiconview.h	(revision 164)
+++ trunk/examples/fileiconview/qfileiconview.h	(revision 164)
@@ -0,0 +1,171 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef QTFILEICONVIEW_H
+#define QTFILEICONVIEW_H
+
+
+#include <qiconset.h>
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qtimer.h>
+#include <qiconview.h>
+
+class QtFileIconView;
+class QDragObject;
+class QResizeEvent;
+
+/*****************************************************************************
+ *
+ * Class QtFileIconDrag
+ *
+ *****************************************************************************/
+
+class QtFileIconDrag : public QIconDrag
+{
+    Q_OBJECT
+
+public:
+    QtFileIconDrag( QWidget * dragSource, const char* name = 0 );
+
+    const char* format( int i ) const;
+    QByteArray encodedData( const char* mime ) const;
+    static bool canDecode( QMimeSource* e );
+    void append( const QIconDragItem &item, const QRect &pr, const QRect &tr, const QString &url );
+
+private:
+    QStringList urls;
+
+};
+
+/*****************************************************************************
+ *
+ * Class QtFileIconView
+ *
+ *****************************************************************************/
+class QtFileIconViewItem;
+class QtFileIconView : public QIconView
+{
+    Q_OBJECT
+
+public:
+    QtFileIconView( const QString &dir, QWidget *parent = 0, const char *name = 0 );
+
+    enum ViewMode { Large, Small };
+
+    void setViewMode( ViewMode m );
+    ViewMode viewMode() const { return vm; }
+    void setOpenItem( QtFileIconViewItem *i ) {
+	openItem = i;
+    }
+
+public slots:
+    void setDirectory( const QString &dir );
+    void setDirectory( const QDir &dir );
+    void newDirectory();
+    QDir currentDir();
+
+signals:
+    void directoryChanged( const QString & );
+    void startReadDir( int dirs );
+    void readNextDir();
+    void readDirDone();
+    void enableUp();
+    void disableUp();
+    void enableMkdir();
+    void disableMkdir();
+
+protected slots:
+    void itemDoubleClicked( QIconViewItem *i );
+    void slotDropped( QDropEvent *e, const QValueList<QIconDragItem> & );
+
+    void viewLarge();
+    void viewSmall();
+    void viewBottom();
+    void viewRight();
+    void flowEast();
+    void flowSouth();
+    void itemTextTruncate();
+    void itemTextWordWrap();
+    void sortAscending();
+    void sortDescending();
+    void arrangeItemsInGrid() {
+	QIconView::arrangeItemsInGrid( TRUE );
+    }
+
+    void slotRightPressed( QIconViewItem *item );
+    void openFolder();
+
+protected:
+    void readDir( const QDir &dir );
+    virtual QDragObject *dragObject();
+
+    virtual void keyPressEvent( QKeyEvent *e );
+
+    QDir viewDir;
+    int newFolderNum;
+    QSize sz;
+    QPixmap pix;
+    ViewMode vm;
+    QtFileIconViewItem *openItem;
+
+};
+
+/*****************************************************************************
+ *
+ * Class QtFileIconViewItem
+ *
+ *****************************************************************************/
+
+class QtFileIconViewItem : public QIconViewItem
+{
+    friend class QtFileIconView;
+
+public:
+    enum ItemType {
+        File = 0,
+        Dir,
+        Link
+    };
+
+    QtFileIconViewItem( QtFileIconView *parent, QFileInfo *fi );
+
+    virtual ~QtFileIconViewItem();
+
+    ItemType type() const
+    { return itemType; }
+    QString filename() const { return itemFileName; }
+
+    virtual bool acceptDrop( const QMimeSource *e ) const;
+
+    virtual void setText( const QString &text );
+    virtual QPixmap *pixmap() const;
+
+    virtual void dragEntered();
+    virtual void dragLeft();
+
+    void viewModeChanged( QtFileIconView::ViewMode m );
+    void paintItem( QPainter *p, const QColorGroup &cg );
+
+protected:
+    virtual void dropped( QDropEvent *e, const QValueList<QIconDragItem> & );
+
+    QString itemFileName;
+    QFileInfo *itemFileInfo;
+    ItemType itemType;
+    bool checkSetText;
+    QTimer timer;
+    QtFileIconView::ViewMode vm;
+
+};
+
+
+#endif
Index: trunk/examples/iconview/iconview.pro
===================================================================
--- trunk/examples/iconview/iconview.pro	(revision 164)
+++ trunk/examples/iconview/iconview.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE	= app
+TARGET		= iconview
+
+CONFIG		+= qt warn_on release
+DEPENDPATH	= ../../include
+
+REQUIRES        = iconview full-config
+
+HEADERS		=
+SOURCES		= main.cpp
Index: trunk/examples/iconview/main.cpp
===================================================================
--- trunk/examples/iconview/main.cpp	(revision 164)
+++ trunk/examples/iconview/main.cpp	(revision 164)
@@ -0,0 +1,76 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qiconview.h>
+#include <qapplication.h>
+#include <qdragobject.h>
+#include <qpixmap.h>
+#include <qiconset.h>
+
+#include <qmime.h>
+#include <stdio.h>
+
+class ListenDND : public QObject
+{
+    Q_OBJECT
+
+public:
+    ListenDND( QWidget *w )
+        : view( w )
+    {}
+
+public slots:
+    void dropped( QDropEvent *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:
+    QWidget *view;
+
+};
+
+int main( int argc, char **argv )
+{
+    QApplication a( argc, argv );
+
+    QIconView qiconview;
+    qiconview.setSelectionMode( QIconView::Extended );
+
+    for ( unsigned int i = 0; i < 3000; i++ ) {
+	QIconViewItem *item = new QIconViewItem( &qiconview, QString( "Item %1" ).arg( i + 1 ) );
+	item->setRenameEnabled( TRUE );
+    }
+
+    qiconview.setCaption( "Qt Example - Iconview" );
+
+    ListenDND listen_dnd( &qiconview );
+    QObject::connect( &qiconview, SIGNAL( dropped( QDropEvent *, const QValueList<QIconDragItem> & ) ),
+		      &listen_dnd, SLOT( dropped( QDropEvent * ) ) );
+    QObject::connect( &qiconview, SIGNAL( moved() ), &listen_dnd, SLOT( moved() ) );
+
+    a.setMainWidget( &qiconview );
+    qiconview.show();
+    qiconview.resize( qiconview.sizeHint() );
+
+    return a.exec();
+}
+
+#include "main.moc"
Index: trunk/examples/iconview/simple_dd/main.cpp
===================================================================
--- trunk/examples/iconview/simple_dd/main.cpp	(revision 164)
+++ trunk/examples/iconview/simple_dd/main.cpp	(revision 164)
@@ -0,0 +1,188 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2001 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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( QWidget * parent, const char * name, WFlags f ) :
+    QListBox( parent, name, f )
+{
+    setAcceptDrops( TRUE );
+    dragging = FALSE;
+}
+
+
+void DDListBox::dragEnterEvent( QDragEnterEvent *evt )
+{
+    if ( QTextDrag::canDecode( evt ) ) 
+	evt->accept();
+}
+
+
+void DDListBox::dropEvent( QDropEvent *evt )
+{
+    QString text;
+
+    if ( QTextDrag::decode( evt, text ) ) 
+	insertItem( text );
+}
+
+
+void DDListBox::mousePressEvent( QMouseEvent *evt )
+{
+    QListBox::mousePressEvent( evt );
+    dragging = TRUE;
+}
+
+
+void DDListBox::mouseMoveEvent( QMouseEvent * )
+{
+    if ( dragging ) {
+	QDragObject *d = new QTextDrag( currentText(), this );
+	d->dragCopy(); // do NOT delete d.
+	dragging = FALSE;
+    }
+}
+
+
+// IconViewIcon -- high level drag and drop
+
+
+bool DDIconViewItem::acceptDrop( const QMimeSource *mime ) const
+{
+    if ( mime->provides( "text/plain" ) )
+	return TRUE;
+    return FALSE;
+}
+
+
+void DDIconViewItem::dropped( QDropEvent *evt, const QValueList<QIconDragItem>& )
+{
+    QString label;
+
+    if ( QTextDrag::decode( evt, label ) ) 
+	setText( label );
+}
+
+
+// IconView -- high level drag and drop
+
+QDragObject *DDIconView::dragObject()
+{
+  return new QTextDrag( currentItem()->text(), this );
+}
+
+void DDIconView::slotNewItem( QDropEvent *evt, const QValueList<QIconDragItem>& )
+{
+    QString label;
+
+    if ( QTextDrag::decode( evt, label ) ) {
+	DDIconViewItem *item = new DDIconViewItem( this, label );
+	item->setRenameEnabled( TRUE );
+    }
+}
+
+
+
+int main( int argc, char *argv[] )
+{
+    QApplication app( argc, argv );
+
+    // Create and show the widgets
+    QSplitter *split = new QSplitter();
+    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
+    QObject::connect( 
+	iv, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)), 
+	iv, SLOT(slotNewItem(QDropEvent*, const QValueList<QIconDragItem>&)));
+
+    // Populate the QIconView with icons
+    DDIconViewItem *item;
+    item = new DDIconViewItem( iv, "Red",   QPixmap( red_icon ) );
+    item->setRenameEnabled( TRUE );
+    item = new DDIconViewItem( iv, "Green", QPixmap( green_icon ) );
+    item->setRenameEnabled( TRUE );
+    item = new DDIconViewItem( iv, "Blue",  QPixmap( blue_icon ) );
+    item->setRenameEnabled( TRUE );
+
+    return app.exec();
+}
+
+
Index: trunk/examples/iconview/simple_dd/main.h
===================================================================
--- trunk/examples/iconview/simple_dd/main.h	(revision 164)
+++ trunk/examples/iconview/simple_dd/main.h	(revision 164)
@@ -0,0 +1,61 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2001 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qsplitter.h>
+#include <qlistbox.h>
+#include <qiconview.h>
+#include <qpixmap.h>
+
+class QDragEnterEvent;
+class QDragDropEvent;
+
+
+class DDListBox : public QListBox
+{
+    Q_OBJECT
+public:
+    DDListBox( QWidget * parent = 0, const char * name = 0, WFlags f = 0 );
+    // Low-level drag and drop
+    void dragEnterEvent( QDragEnterEvent *evt );
+    void dropEvent( QDropEvent *evt );
+    void mousePressEvent( QMouseEvent *evt );
+    void mouseMoveEvent( QMouseEvent * );
+private:
+    int dragging;
+};
+
+
+class DDIconViewItem : public QIconViewItem
+{
+public:
+    DDIconViewItem( QIconView *parent, const QString& text, const QPixmap& icon ) :
+	QIconViewItem( parent, text, icon ) {}
+    DDIconViewItem( QIconView *parent, const QString &text ) :
+	QIconViewItem( parent, text ) {}
+    // High-level drag and drop
+    bool acceptDrop( const QMimeSource *mime ) const;
+    void dropped( QDropEvent *evt, const QValueList<QIconDragItem>& );
+};
+
+
+class DDIconView : public QIconView
+{
+    Q_OBJECT
+public:
+    DDIconView( QWidget * parent = 0, const char * name = 0, WFlags f = 0 ) :
+	QIconView( parent, name, f ) {}
+    // High-level drag and drop
+    QDragObject *dragObject();
+public slots:
+    void slotNewItem( QDropEvent *evt, const QValueList<QIconDragItem>& list );
+};
+
Index: trunk/examples/iconview/simple_dd/simple_dd.pro
===================================================================
--- trunk/examples/iconview/simple_dd/simple_dd.pro	(revision 164)
+++ trunk/examples/iconview/simple_dd/simple_dd.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE = app
+
+CONFIG  += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS	 = main.h
+SOURCES	 = main.cpp
+
+
Index: trunk/examples/movies/main.cpp
===================================================================
--- trunk/examples/movies/main.cpp	(revision 164)
+++ trunk/examples/movies/main.cpp	(revision 164)
@@ -0,0 +1,292 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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 QFrame {
+    Q_OBJECT
+    QMovie movie;
+    QString filename;
+    QSize sh;
+
+public:
+    MovieScreen(const char* fname, QMovie m, QWidget* p=0, const char* name=0, WFlags f=0) :
+        QFrame(p, name, f),
+	sh(100,100)
+    {
+        setCaption(fname);
+        filename = fname;
+        movie = m;
+
+        // Set a frame around the movie.
+        setFrameStyle(QFrame::WinPanel|QFrame::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 QRect&)));
+        movie.connectResize(this, SLOT(movieResized(const QSize&)));
+        movie.connectStatus(this, SLOT(movieStatus(int)));
+
+	setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
+    }
+
+    QSize sizeHint() const
+    {
+	return sh;
+    }
+
+protected:
+
+    // Draw the contents of the QFrame - the movie and on-screen-display
+    void drawContents(QPainter* p)
+    {
+        // Get the current movie frame.
+        QPixmap pm = movie.framePixmap();
+
+        // Get the area we have to draw in.
+        QRect r = contentsRect();
+
+	if ( !pm.isNull() ) {
+	    // Only rescale is we need to - it can take CPU!
+	    if ( r.size() != pm.size() ) {
+		QWMatrix 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(QFont("Helvetica", 24));
+
+            QFontMetrics fm = p->fontMetrics();
+            if ( fm.width(message) > r.width()-10 )
+                p->setFont(QFont("Helvetica", 18));
+
+            fm = p->fontMetrics();
+            if ( fm.width(message) > r.width()-10 )
+                p->setFont(QFont("Helvetica", 14));
+
+            fm = p->fontMetrics();
+            if ( fm.width(message) > r.width()-10 )
+                p->setFont(QFont("Helvetica", 12));
+
+            fm = p->fontMetrics();
+            if ( fm.width(message) > r.width()-10 )
+                p->setFont(QFont("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 QRect& area)
+    {
+        if (!isVisible())
+            show();
+
+        // The given area of the movie has changed.
+
+        QRect 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 QSize& size)
+    {
+        // The movie changed size, probably from its initial zero size.
+
+        int fw = frameWidth();
+        sh = QSize( 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) {
+	    QString msg;
+	    msg.sprintf("Could not play movie \"%s\"", (const char*)filename);
+	    QMessageBox::warning(this, "movies", msg);
+	    parentWidget()->close();
+        } else if (status == QMovie::Paused || status == QMovie::EndOfMovie) {
+            repaint(); // Ensure status text is displayed
+        }
+    }
+};
+
+class MoviePlayer : public QVBox {
+    MovieScreen* movie;
+public:
+    MoviePlayer(const char* fname, QMovie m, QWidget* p=0, const char* name=0, WFlags f=0) :
+	QVBox(p,name,f)
+    {
+	movie = new MovieScreen(fname, m, this);
+	QHBox* hb = new QHBox(this);
+	QPushButton* btn;
+	btn = new QPushButton("<<", hb);
+	connect(btn, SIGNAL(clicked()), movie, SLOT(restart()));
+	btn = new QPushButton("||", hb);
+	connect(btn, SIGNAL(clicked()), movie, SLOT(togglePause()));
+	btn = new QPushButton(">|", hb);
+	connect(btn, SIGNAL(clicked()), movie, SLOT(step()));
+	btn = new QPushButton(">>|", hb);
+	connect(btn, SIGNAL(clicked()), movie, SLOT(step10()));
+    }
+};
+
+
+// A QFileDialog that chooses movies.
+//
+class MovieStarter: public QFileDialog {
+    Q_OBJECT
+public:
+    MovieStarter(const char *dir);
+
+public slots:
+    void startMovie(const QString& filename);
+    // QDialog's method - normally closes the file dialog.
+    // We want it left open, and we want Cancel to quit everything.
+    void done( int r );
+};
+
+
+MovieStarter::MovieStarter(const char *dir)
+    : QFileDialog(dir, "*.gif *.mng")
+{
+    //behave as in getOpenFilename
+    setMode( ExistingFile );
+    // When a file is selected, show it as a movie.
+    connect(this, SIGNAL(fileSelected(const QString&)),
+	    this, SLOT(startMovie(const QString&)));
+}
+
+
+void MovieStarter::startMovie(const QString& filename)
+{
+    if ( filename ) // Start a new movie - have it delete when closed.
+	(new MoviePlayer( filename, QMovie(filename), 0, 0,
+			       WDestructiveClose))->show();
+}
+
+void MovieStarter::done( int r )
+{
+    if (r != Accepted)
+	qApp->quit(); // end on Cancel
+    setResult( r );
+
+    // And don't hide.
+}
+
+
+int main(int argc, char **argv)
+{
+    QApplication 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 ( QString(argv[arg]) == "-i" )
+		gui = !gui;
+	    else if ( gui )
+		(void)new MoviePlayer(argv[arg], QMovie(argv[arg]), 0, 0,
+				      Qt::WDestructiveClose);
+	    else
+		(void)new MovieScreen(argv[arg], QMovie(argv[arg]), 0, 0,
+				      Qt::WDestructiveClose);
+	}
+        QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
+    } else {
+        // "GUI" mode - open a chooser for movies
+        //
+        MovieStarter* fd = new MovieStarter(".");
+        fd->show();
+    }
+
+    // Go!
+    return a.exec();
+}
+
+#include "main.moc"
Index: trunk/examples/movies/movies.pro
===================================================================
--- trunk/examples/movies/movies.pro	(revision 164)
+++ trunk/examples/movies/movies.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE	= app
+TARGET		= movies
+
+CONFIG		+= qt warn_on release
+DEPENDPATH	= ../../include
+
+REQUIRES	= full-config
+
+HEADERS		=
+SOURCES		= main.cpp
Index: trunk/examples/qdir/qdir.cpp
===================================================================
--- trunk/examples/qdir/qdir.cpp	(revision 164)
+++ trunk/examples/qdir/qdir.cpp	(revision 164)
@@ -0,0 +1,360 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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( QWidget *parent )
+    : QScrollView( parent )
+{
+    viewport()->setBackgroundMode( PaletteBase );
+}
+
+void PixmapView::setPixmap( const QPixmap &pix )
+{
+    pixmap = pix;
+    resizeContents( pixmap.size().width(), pixmap.size().height() );
+    viewport()->repaint( FALSE );
+}
+
+void PixmapView::drawContents( QPainter *p, int cx, int cy, int cw, int ch )
+{
+    p->fillRect( cx, cy, cw, ch, colorGroup().brush( QColorGroup::Base ) );
+    p->drawPixmap( 0, 0, pixmap );
+}
+
+// ****************************************************************************************************
+
+Preview::Preview( QWidget *parent )
+    : QWidgetStack( parent )
+{
+    normalText = new QMultiLineEdit( this );
+    normalText->setReadOnly( TRUE );
+    html = new QTextView( this );
+    pixmap = new PixmapView( this );
+    raiseWidget( normalText );
+}
+
+void Preview::showPreview( const QUrl &u, int size )
+{
+    if ( u.isLocalFile() ) {
+	QString path = u.path();
+	QFileInfo 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;
+	}
+	
+	QPixmap pix( path );
+	if ( pix.isNull() ) {
+	    if ( fi.isFile() ) {
+		QFile f( path );
+		if ( f.open( IO_ReadOnly ) ) {
+		    QTextStream ts( &f );
+		    QString text = ts.read();
+		    f.close();
+		    if ( fi.extension().lower().contains( "htm" ) ) {
+			QString url = html->mimeSourceFactory()->makeAbsolute( path, html->context() );
+			html->setText( text, url ); 	
+			raiseWidget( html );
+			return;
+		    } else {
+			normalText->setText( text ); 	
+			raiseWidget( normalText );
+			return;
+		    }
+		}
+	    }
+	    normalText->setText( QString::null );
+	    raiseWidget( normalText );
+	} else {
+	    pixmap->setPixmap( pix );
+	    raiseWidget( pixmap );
+	}
+    } else {
+	normalText->setText( "I only show local files!" );
+	raiseWidget( normalText );
+    }
+}
+
+// ****************************************************************************************************
+
+PreviewWidget::PreviewWidget( QWidget *parent )
+    : QVBox( parent ), QFilePreview()
+{
+    setSpacing( 5 );
+    setMargin( 5 );
+    QHBox *row = new QHBox( this );
+    row->setSpacing( 5 );
+    (void)new QLabel( tr( "Only show files smaller than: " ), row );
+    sizeSpinBox = new QSpinBox( 1, 10000, 1, row );
+    sizeSpinBox->setSuffix( " KB" );
+    sizeSpinBox->setValue( 64 );
+    row->setFixedHeight( 10 + sizeSpinBox->sizeHint().height() );
+    preview = new Preview( this );
+}
+
+void PreviewWidget::previewUrl( const QUrl &u )
+{
+    preview->showPreview( u, sizeSpinBox->value() );
+}
+
+// ****************************************************************************************************
+
+CustomFileDialog::CustomFileDialog()
+    :  QFileDialog( 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 );
+
+    QPushButton *p = new QPushButton( this );
+    p->setPixmap( QPixmap( bookmarks ) );
+    QToolTip::add( p, tr( "Bookmarks" ) );
+
+    bookmarkMenu = new QPopupMenu( this );
+    connect( bookmarkMenu, SIGNAL( activated( int ) ),
+	     this, SLOT( bookmarkChosen( int ) ) );
+    addId = bookmarkMenu->insertItem( tr( "Add bookmark" ) );
+    bookmarkMenu->insertSeparator();
+
+    QFile f( ".bookmarks" );
+    if ( f.open( IO_ReadOnly ) ) {
+	QDataStream ds( &f );
+	ds >> bookmarkList;
+	f.close();
+	
+	QStringList::Iterator it = bookmarkList.begin();
+	for ( ; it != bookmarkList.end(); ++it ) {
+	    bookmarkMenu->insertItem( *it );
+	}
+    }
+	
+    p->setPopup( bookmarkMenu );
+
+    addToolButton( p, TRUE );
+
+    connect( dirView, SIGNAL( folderSelected( const QString & ) ),
+	     this, SLOT( setDir2( const QString & ) ) );
+    connect( this, SIGNAL( dirEntered( const QString & ) ),
+	     dirView, SLOT( setDir( const QString & ) ) );
+
+    QToolButton *b = new QToolButton( this );
+    QToolTip::add( b, tr( "Go Home!" ) );
+    b->setPixmap( QPixmap( home ) );
+    connect( b, SIGNAL( clicked() ),
+	     this, SLOT( goHome() ) );
+
+    addToolButton( b );
+
+    resize( width() + width() / 3, height() );
+}
+
+CustomFileDialog::~CustomFileDialog()
+{
+    if ( !bookmarkList.isEmpty() ) {
+	QFile f( ".bookmarks" );
+	if ( f.open( IO_WriteOnly ) ) {
+	    QDataStream ds( &f );
+	    ds << bookmarkList;
+	    f.close();
+	}
+    }
+}
+
+void CustomFileDialog::setDir2( const QString &s )
+{
+    blockSignals( TRUE );
+    setDir( s );
+    blockSignals( FALSE );
+}
+
+void CustomFileDialog::showEvent( QShowEvent *e )
+{
+    QFileDialog::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 )
+{
+    QFileDialog::Mode mode = QFileDialog::ExistingFile;
+    QString start;
+    QString filter;
+    QString caption;
+    bool preview = FALSE;
+    bool custom = FALSE;
+    QApplication a( argc, argv );
+    for (int i=1; i<argc; i++) {
+	QString arg = argv[i];
+	if ( arg == "-any" )
+	    mode = QFileDialog::AnyFile;
+	else if ( arg == "-dir" )
+	    mode = QFileDialog::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 QFileDialog 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 = QDir::currentDirPath();
+
+    if ( !caption )
+	caption = mode == QFileDialog::Directory
+		    ? "Choose directory..." : "Choose file...";
+
+    if ( !custom ) {
+	QFileDialog fd( QString::null, filter, 0, 0, TRUE );
+	fd.setMode( mode );
+	if ( preview ) {
+	    fd.setContentsPreviewEnabled( TRUE );
+	    PreviewWidget *pw = new PreviewWidget( &fd );
+	    fd.setContentsPreview( pw, pw );
+	    fd.setViewMode( QFileDialog::List );
+	    fd.setPreviewMode( QFileDialog::Contents );
+	}
+	fd.setCaption( caption );
+	fd.setSelection( start );
+	if ( fd.exec() == QDialog::Accepted ) {
+	    QString result = fd.selectedFile();
+	    printf("%s\n", (const char*)result);
+	    return 0;
+	} else {
+	    return 1;
+	}
+    } else {
+	CustomFileDialog fd;
+	fd.exec();
+	return 1;
+    }
+}
Index: trunk/examples/qdir/qdir.h
===================================================================
--- trunk/examples/qdir/qdir.h	(revision 164)
+++ trunk/examples/qdir/qdir.h	(revision 164)
@@ -0,0 +1,99 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef QDIREXAMPLE_H
+#define QDIREXAMPLE_H
+
+#include <qscrollview.h>
+#include <qfiledialog.h>
+#include <qwidgetstack.h>
+#include <qvbox.h>
+#include <qurl.h>
+#include <qpixmap.h>
+#include <qstringlist.h>
+
+class QMultiLineEdit;
+class QTextView;
+class DirectoryView;
+class QSpinBox;
+class QShowEvent;
+class QPopupMenu;
+
+class PixmapView : public QScrollView
+{
+    Q_OBJECT
+
+public:
+    PixmapView( QWidget *parent );
+    void setPixmap( const QPixmap &pix );
+    void drawContents( QPainter *p, int, int, int, int );
+
+private:
+    QPixmap pixmap;
+
+};
+
+class Preview : public QWidgetStack
+{
+    Q_OBJECT
+
+public:
+    Preview( QWidget *parent );
+    void showPreview( const QUrl &u, int size );
+
+private:
+    QMultiLineEdit *normalText;
+    QTextView *html;
+    PixmapView *pixmap;
+
+};
+
+class PreviewWidget : public QVBox,
+		      public QFilePreview
+{
+    Q_OBJECT
+
+public:
+    PreviewWidget( QWidget *parent );
+    void previewUrl( const QUrl &u );
+
+private:
+    QSpinBox *sizeSpinBox;
+    Preview *preview;
+
+};
+
+class CustomFileDialog : public QFileDialog
+{
+    Q_OBJECT
+
+public:
+    CustomFileDialog();
+    ~CustomFileDialog();
+
+protected:
+    void showEvent( QShowEvent *e );
+
+public slots:
+    void setDir2( const QString & );
+
+private slots:
+    void bookmarkChosen( int i );
+    void goHome();
+
+private:
+    DirectoryView *dirView;
+    QPopupMenu *bookmarkMenu;
+    QStringList bookmarkList;
+    int addId;
+
+};
+
+#endif
Index: trunk/examples/qdir/qdir.pro
===================================================================
--- trunk/examples/qdir/qdir.pro	(revision 164)
+++ trunk/examples/qdir/qdir.pro	(revision 164)
@@ -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
Index: trunk/examples/regexptester/main.cpp
===================================================================
--- trunk/examples/regexptester/main.cpp	(revision 164)
+++ trunk/examples/regexptester/main.cpp	(revision 164)
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "regexptester.h"
+
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+    RegexpTester form;
+    form.show();
+    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
+    return app.exec();
+}
Index: trunk/examples/regexptester/regexptester.cpp
===================================================================
--- trunk/examples/regexptester/regexptester.cpp	(revision 164)
+++ trunk/examples/regexptester/regexptester.cpp	(revision 164)
@@ -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(QWidget* parent, const char* name, bool modal,
+			   WFlags f)
+    : QDialog(parent, name, modal, f)
+{
+    regexLabel = new QLabel(this);
+    regexComboBox = new QComboBox(this);
+    regexComboBox->setEditable(true);
+    regexComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    regexLabel->setBuddy(regexComboBox);
+    textLabel = new QLabel(this);
+    textComboBox = new QComboBox(this);
+    textComboBox->setEditable(true);
+    textComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    textLabel->setBuddy(textComboBox);
+    caseSensitiveCheckBox = new QCheckBox(this);
+    caseSensitiveCheckBox->setChecked(true);
+    minimalCheckBox = new QCheckBox(this);
+    wildcardCheckBox = new QCheckBox(this);
+    resultTable = new QTable(3, 3, this);
+    resultTable->verticalHeader()->hide();
+    resultTable->setLeftMargin(0);
+    resultTable->horizontalHeader()->hide();
+    resultTable->setTopMargin(0);
+    resultTable->setReadOnly(true);
+    executePushButton = new QPushButton(this);
+    executePushButton->setDefault(true);
+    copyPushButton = new QPushButton(this);
+    quitPushButton = new QPushButton(this);
+    statusBar = new QStatusBar(this);
+
+    QGridLayout *gridLayout = new QGridLayout(2, 2, 6);
+    gridLayout->addWidget(regexLabel, 0, 0);
+    gridLayout->addWidget(regexComboBox, 0, 1);
+    gridLayout->addWidget(textLabel, 1, 0);
+    gridLayout->addWidget(textComboBox, 1, 1);
+    QHBoxLayout *checkboxLayout = new QHBoxLayout(0, 6, 6);
+    checkboxLayout->addWidget(caseSensitiveCheckBox);
+    checkboxLayout->addWidget(minimalCheckBox);
+    checkboxLayout->addWidget(wildcardCheckBox);
+    checkboxLayout->addStretch(1);
+    QVBoxLayout *buttonLayout = new QVBoxLayout(0, 6, 6);
+    buttonLayout->addWidget(executePushButton);
+    buttonLayout->addWidget(copyPushButton);
+    buttonLayout->addWidget(quitPushButton);
+    buttonLayout->addStretch(1);
+    QHBoxLayout *middleLayout = new QHBoxLayout(0, 6, 6);
+    middleLayout->addWidget(resultTable);
+    middleLayout->addLayout(buttonLayout);
+    QVBoxLayout *mainLayout = new QVBoxLayout(this, 6, 6);
+    mainLayout->addLayout(gridLayout);
+    mainLayout->addLayout(checkboxLayout);
+    mainLayout->addLayout(middleLayout);
+    mainLayout->addWidget(statusBar);
+
+    resize(QSize(500, 350).expandedTo(minimumSizeHint()));
+
+    languageChange();
+
+    connect(copyPushButton, SIGNAL(clicked()), this, SLOT(copy()));
+    connect(executePushButton, SIGNAL(clicked()), this, SLOT(execute()));
+    connect(quitPushButton, SIGNAL(clicked()), this, SLOT(accept()));
+
+    execute();
+}
+
+void RegexpTester::execute()
+{
+    QString regex = regexComboBox->currentText();
+    QString text = textComboBox->currentText();
+    if (!regex.isEmpty() && !text.isEmpty()) {
+	QRegExp 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"));
+	QString 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, QString::number(offset));
+	    resultTable->item(row, 1)->setSpan(1, 2);
+	    if (!wildcard) {
+		++row;
+		resultTable->setText(row, 0, tr("Captures"));
+		resultTable->setText(row, 1, QString::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, QString::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,
+					QString::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()
+{
+    QString escaped = regexComboBox->currentText();
+    if (!escaped.isEmpty()) {
+	escaped = escaped.replace("\\", "\\\\");
+	QClipboard *cb = QApplication::clipboard();
+	cb->setText(escaped, QClipboard::Clipboard);
+	if (cb->supportsSelection())
+	    cb->setText(escaped, QClipboard::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"));
+    quitPushButton->setText(tr("&Quit"));
+}
+
Index: trunk/examples/regexptester/regexptester.h
===================================================================
--- trunk/examples/regexptester/regexptester.h	(revision 164)
+++ trunk/examples/regexptester/regexptester.h	(revision 164)
@@ -0,0 +1,42 @@
+#ifndef REGEXPTESTER_H
+#define REGEXPTESTER_H
+
+#include <qdialog.h>
+
+class QCheckBox;
+class QComboBox;
+class QLabel;
+class QPushButton;
+class QStatusBar;
+class QTable;
+
+class RegexpTester : public QDialog
+{
+    Q_OBJECT
+
+public:
+    RegexpTester(QWidget* parent=0, const char* name=0, bool modal=false,
+		 WFlags f=0);
+
+    QLabel *regexLabel;
+    QComboBox *regexComboBox;
+    QLabel *textLabel;
+    QComboBox *textComboBox;
+    QCheckBox *caseSensitiveCheckBox;
+    QCheckBox *minimalCheckBox;
+    QCheckBox *wildcardCheckBox;
+    QTable *resultTable;
+    QPushButton *executePushButton;
+    QPushButton *copyPushButton;
+    QPushButton *quitPushButton;
+    QStatusBar *statusBar;
+
+public slots:
+    void copy();
+    void execute();
+
+private:
+    void languageChange();
+};
+
+#endif // REGEXPTESTER_H
Index: trunk/examples/regexptester/regexptester.pro
===================================================================
--- trunk/examples/regexptester/regexptester.pro	(revision 164)
+++ trunk/examples/regexptester/regexptester.pro	(revision 164)
@@ -0,0 +1,5 @@
+SOURCES	+= main.cpp
+HEADERS	+= regexptester.h
+SOURCES	+= regexptester.cpp
+
+REQUIRES += table full-config
Index: trunk/examples/table/bigtable/bigtable.pro
===================================================================
--- trunk/examples/table/bigtable/bigtable.pro	(revision 164)
+++ trunk/examples/table/bigtable/bigtable.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE	= app
+TARGET		= bigtable
+
+CONFIG		+= qt warn_on release
+DEPENDPATH 	= ../../include
+
+REQUIRES 	= table full-config
+
+HEADERS		=
+SOURCES		= main.cpp
Index: trunk/examples/table/bigtable/main.cpp
===================================================================
--- trunk/examples/table/bigtable/main.cpp	(revision 164)
+++ trunk/examples/table/bigtable/main.cpp	(revision 164)
@@ -0,0 +1,64 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qtable.h>
+
+// Table size
+
+const int numRows = 1000000;
+const int numCols = 1000000;
+
+class MyTable : public QTable
+{
+public:
+    MyTable( int r, int c ) : QTable( 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 ) {}
+    QTableItem *item( int r, int c ) const { return items.find( indexOf( r, c ) ); }
+    void setItem( int r, int c, QTableItem *i ) { items.replace( indexOf( r, c ), i ); }
+    void clearCell( int r, int c ) { items.remove( indexOf( r, c ) ); }
+    void takeItem( QTableItem *item )
+    {
+	items.setAutoDelete( FALSE );
+	items.remove( indexOf( item->row(), item->col() ) );
+	items.setAutoDelete( TRUE );
+    }
+    void insertWidget( int r, int c, QWidget *w ) { widgets.replace( indexOf( r, c ), w );  }
+    QWidget *cellWidget( int r, int c ) const { return widgets.find( indexOf( r, c ) ); }
+    void clearCellWidget( int r, int c )
+    {
+	QWidget *w = widgets.take( indexOf( r, c ) );
+	if ( w )
+	    w->deleteLater();
+    }
+
+private:
+    QIntDict<QTableItem> items;
+    QIntDict<QWidget> widgets;
+
+};
+
+// The program starts here.
+
+int main( int argc, char **argv )
+{
+    QApplication app( argc, argv );
+
+    MyTable table( numRows, numCols );
+    app.setMainWidget( &table );
+    table.show();
+    return app.exec();
+}
Index: trunk/examples/table/small-table-demo/main.cpp
===================================================================
--- trunk/examples/table/small-table-demo/main.cpp	(revision 164)
+++ trunk/examples/table/small-table-demo/main.cpp	(revision 164)
@@ -0,0 +1,58 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qtable.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qstringlist.h>
+
+// Qt 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 )
+{
+    QApplication app( argc, argv );
+
+    QTable table( numRows, numCols );
+
+    QHeader *header = table.horizontalHeader();
+    header->setLabel( 0, QObject::tr( "Tiny" ), 40 );
+    header->setLabel( 1, QObject::tr( "Checkboxes" ) );
+    header->setLabel( 5, QObject::tr( "Combos" ) );
+    header->setMovingEnabled(TRUE);
+
+    QImage img( qtlogo_xpm );
+    QPixmap pix = img.scaleHeight( table.rowHeight(3) );
+    table.setPixmap( 3, 2, pix );
+    table.setText( 3, 2, "A Pixmap" );
+
+    QStringList comboEntries;
+    comboEntries << "one" << "two" << "three" << "four";
+
+    for ( int i = 0; i < numRows; ++i ){
+	QComboTableItem * item = new QComboTableItem( &table, comboEntries, FALSE );
+	item->setCurrentItem( i % 4 );
+	table.setItem( i, 5, item );
+    }
+    for ( int j = 0; j < numRows; ++j )
+	table.setItem( j, 1, new QCheckTableItem( &table, "Check me" ) );
+
+    app.setMainWidget( &table );
+    table.show();
+    return app.exec();
+}
Index: trunk/examples/table/small-table-demo/qtlogo.xpm
===================================================================
--- trunk/examples/table/small-table-demo/qtlogo.xpm	(revision 164)
+++ trunk/examples/table/small-table-demo/qtlogo.xpm	(revision 164)
@@ -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"
+};
Index: trunk/examples/table/small-table-demo/small-table-demo.pro
===================================================================
--- trunk/examples/table/small-table-demo/small-table-demo.pro	(revision 164)
+++ trunk/examples/table/small-table-demo/small-table-demo.pro	(revision 164)
@@ -0,0 +1,10 @@
+TEMPLATE	= app
+TARGET		= smalltable
+
+CONFIG		+= qt warn_on release
+DEPENDPATH	= ../../include
+
+REQUIRES 	= table full-config
+
+HEADERS		=
+SOURCES		= main.cpp
Index: trunk/examples/table/statistics/main.cpp
===================================================================
--- trunk/examples/table/statistics/main.cpp	(revision 164)
+++ trunk/examples/table/statistics/main.cpp	(revision 164)
@@ -0,0 +1,21 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "statistics.h"
+#include <qapplication.h>
+int main( int argc, char **argv )
+{
+    QApplication a(argc,argv);			
+
+    Table t;
+    a.setMainWidget( &t );
+    t.show();
+    return a.exec();
+}
Index: trunk/examples/table/statistics/statistics.cpp
===================================================================
--- trunk/examples/table/statistics/statistics.cpp	(revision 164)
+++ trunk/examples/table/statistics/statistics.cpp	(revision 164)
@@ -0,0 +1,172 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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()
+    : QTable( 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 Qt source and header files into a list
+    QStringList all;
+    int i = 0;
+    QString srcdir( "../../../src/" );
+    while ( dirs[ i ] ) {
+	QDir dir( srcdir + dirs[ i ] );
+	QStringList lst = dir.entryList( "*.cpp; *.h" );
+	for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+	    if ( ( *it ).contains( "moc" ) )
+		continue;
+	    all << (QString( 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 ( QStringList::Iterator it = all.begin(); it != all.end(); ++it ) {
+	setText( i, 0, *it );
+	QFile f( srcdir + *it );
+	setText( i, 1, QString::number( (ulong)f.size() ) );
+	ComboItem *ci = new ComboItem( this, QTableItem::WhenCurrent );
+	setItem( i++, 2, ci );
+	sum += f.size();
+    }
+
+    // last row should show the sum
+    TableItem *i1 = new TableItem( this, QTableItem::Never, tr( "Sum" ) );
+    setItem( i, 0, i1 );
+    TableItem *i2 = new TableItem( this, QTableItem::Never, QString::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, QTableItem::Never, tr( "Sum" ) );
+    setItem( numRows() - 1, 0, i1 );
+    TableItem *i2 = new TableItem( this, QTableItem::Never, QString::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
+    QTable::sortColumn( col, ascending, TRUE );
+    // re-insert sum row
+    recalcSum( 0, 1 );
+}
+
+
+
+void TableItem::paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected )
+{
+    QColorGroup 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( QColorGroup::Base, red );
+    QTableItem::paint( p, g, cr, selected );
+}
+
+
+
+
+ComboItem::ComboItem( QTable *t, EditType et )
+    : QTableItem( t, et, "Yes" ), cb( 0 )
+{
+    // we do not want this item to be replaced
+    setReplaceable( FALSE );
+}
+
+QWidget *ComboItem::createEditor() const
+{
+    // create an editor - a combobox in our case
+    ( (ComboItem*)this )->cb = new QComboBox( table()->viewport() );
+    QObject::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( QWidget *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( "QComboBox" ) )
+	setText( ( (QComboBox*)w )->currentText() );
+    else
+	QTableItem::setContentFromEditor( w );
+}
+
+void ComboItem::setText( const QString &s )
+{
+    if ( cb ) {
+	// initialize the combobox from the text
+	if ( s == "No" )
+	    cb->setCurrentItem( 1 );
+	else
+	    cb->setCurrentItem( 0 );
+    }
+    QTableItem::setText( s );
+}
Index: trunk/examples/table/statistics/statistics.h
===================================================================
--- trunk/examples/table/statistics/statistics.h	(revision 164)
+++ trunk/examples/table/statistics/statistics.h	(revision 164)
@@ -0,0 +1,53 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef STATISTICS_H
+#define STATISTICS_H
+
+#include <qtable.h>
+#include <qcombobox.h>
+
+class TableItem : public QTableItem
+{
+public:
+    TableItem( QTable *t, EditType et, const QString &txt ) : QTableItem( t, et, txt ) {}
+    void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected );
+};
+
+class ComboItem : public QTableItem
+{
+public:
+    ComboItem( QTable *t, EditType et );
+    QWidget *createEditor() const;
+    void setContentFromEditor( QWidget *w );
+    void setText( const QString &s );
+    
+private:
+    QComboBox *cb;
+
+};
+
+class Table : public QTable
+{
+    Q_OBJECT
+
+public:
+    Table();
+    void sortColumn( int col, bool ascending, bool wholeRows );
+
+private slots:
+    void recalcSum( int row, int col );
+
+private:
+    void initTable();
+
+};
+
+#endif
Index: trunk/examples/table/statistics/statistics.pro
===================================================================
--- trunk/examples/table/statistics/statistics.pro	(revision 164)
+++ trunk/examples/table/statistics/statistics.pro	(revision 164)
@@ -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
Index: trunk/examples/tetrix/README
===================================================================
--- trunk/examples/tetrix/README	(revision 164)
+++ trunk/examples/tetrix/README	(revision 164)
@@ -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....
+
Index: trunk/examples/tetrix/gtetrix.cpp
===================================================================
--- trunk/examples/tetrix/gtetrix.cpp	(revision 164)
+++ trunk/examples/tetrix/gtetrix.cpp	(revision 164)
@@ -0,0 +1,503 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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);
+    }
+}
Index: trunk/examples/tetrix/gtetrix.h
===================================================================
--- trunk/examples/tetrix/gtetrix.h	(revision 164)
+++ trunk/examples/tetrix/gtetrix.h	(revision 164)
@@ -0,0 +1,93 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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
Index: trunk/examples/tetrix/qdragapp.cpp
===================================================================
--- trunk/examples/tetrix/qdragapp.cpp	(revision 164)
+++ trunk/examples/tetrix/qdragapp.cpp	(revision 164)
@@ -0,0 +1,503 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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"
+
+QWidget *cursorWidget( QPoint * = 0 );
+
+class QDragger;
+
+
+class DropWindow : public QWidget
+{
+    Q_OBJECT
+public:
+    void paintEvent( QPaintEvent * );
+    void closeEvent( QCloseEvent * );
+
+    QDragger *master;
+};
+
+
+struct DropInfo {
+    DropInfo()	{ w=0; }
+   ~DropInfo()  { delete w; }
+    DropWindow *w;
+    bool userOpened;
+};
+
+struct DraggedInfo {
+    QWidget *w;
+    QWidget *mother;
+    QPoint   pos;
+};
+
+
+class QDragger : public QObject
+{
+    Q_OBJECT
+public:
+    QDragger();
+    ~QDragger();
+
+    bool notify( QObject *, QEvent * ); // event filter
+    void closeDropWindow( DropWindow * );
+public slots:
+    void openDropWindow();
+    void killDropWindow();
+    void killAllDropWindows();
+    void sendChildHome();
+    void sendAllChildrenHome();
+private:
+    bool isParentToDragged( QWidget * );
+    bool noWidgets( QWidget * );
+    void killDropWindow( DropInfo * );
+    void killAllDropWindows( bool );
+    void sendChildHome( DraggedInfo * );
+    void sendAllChildrenHome( QWidget * );
+    QWidget *openDropWindow( const QRect&, bool );
+
+    bool startGrab();
+    void grabFinished();
+    bool dragEvent( QWidget *, QMouseEvent * );
+    bool killDropEvent( QMouseEvent * );
+    bool sendChildEvent( QMouseEvent * );
+
+    bool		   killingDrop;
+    bool		   sendingChild;
+    QWidget		  *clickedWidget;
+    QGuardedPtr<QWidget>   hostWidget;
+    QCursor		   cursor;
+
+    QPopupMenu*		   menu;
+    QPoint		   clickOffset;
+    QColor		   dragBackground;
+    QColor		   dragForeground;
+    DraggedInfo		   dragInfo;
+    QIntDict<DraggedInfo>  draggedDict;
+    QIntDict<DropInfo>	   dropDict;
+};
+
+
+QDragApplication::QDragApplication( int &argc, char **argv )
+    : QApplication( argc, argv ), dragger( 0 )
+{
+    dragger = new QDragger;
+}
+
+QDragApplication::~QDragApplication()
+{
+    delete dragger;
+}
+
+bool QDragApplication::notify( QObject *o, QEvent *e )
+{
+    if ( dragger && !dragger->notify( o, e ) )
+	return QApplication::notify( o, e );
+    else
+	return FALSE;
+}
+
+void DropWindow::paintEvent( QPaintEvent * )
+{
+    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( QCloseEvent *e )
+{
+    master->closeDropWindow( this );
+    e->ignore();
+}
+
+QDragger::QDragger()
+{
+    dragInfo.w	 = 0;
+    killingDrop	 = FALSE;
+    sendingChild = FALSE;
+    draggedDict.setAutoDelete( TRUE );
+    dropDict   .setAutoDelete( TRUE );
+
+    menu = new QPopupMenu;
+    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()) );
+}
+
+QDragger::~QDragger()
+{
+    delete menu;
+}
+
+
+bool QDragger::notify( QObject *o, QEvent *e )
+{
+    if ( !o->isWidgetType() || o == menu )
+	return FALSE;
+    switch( e->type() ) {
+	case QEvent::MouseMove:
+	     {
+		 QMouseEvent *tmp = (QMouseEvent*) e;
+		 if ( killingDrop )
+		     return killDropEvent( tmp );
+		 if ( sendingChild )
+		     return sendChildEvent( tmp );
+		 if ( tmp->state() & QMouseEvent::RightButton )
+		     return dragEvent( (QWidget*) o, tmp );
+		 break;
+	     }
+	case QEvent::MouseButtonPress:
+	case QEvent::MouseButtonRelease:
+	case QEvent::MouseButtonDblClick:
+	     {
+		 QMouseEvent *tmp = (QMouseEvent*) e;
+		 if ( killingDrop )
+		     return killDropEvent( tmp );
+		 if ( sendingChild )
+		     return sendChildEvent( tmp );
+		 if ( tmp->button() == QMouseEvent::RightButton )
+		     return dragEvent( (QWidget*) o, tmp );
+	     }
+	     break;
+	default:
+	     break;
+    }
+    return FALSE;
+}
+
+bool QDragger::isParentToDragged( QWidget *w )
+{
+    QIntDictIterator<DraggedInfo> iter( draggedDict );
+
+    DraggedInfo *tmp;
+    while( (tmp = iter.current()) ) {
+	++iter;
+	if ( tmp->mother == w )
+	    return TRUE;
+    }
+    return FALSE;
+}
+
+bool QDragger::noWidgets( QWidget *w )
+{
+    const QObjectList *l = w->children();
+    if ( !l )
+	return TRUE;
+    QObjectListIt iter( *l );
+    QObject *tmp;
+    while( (tmp = iter.current()) ) {
+	++iter;
+	if ( tmp->isWidgetType() )
+	    return FALSE;
+    }
+    return TRUE;
+}
+
+void QDragger::sendAllChildrenHome( QWidget *w )
+{
+    const QObjectList *l = w->children();
+    if ( !l )
+	return;
+    QObjectListIt iter( *l );
+    QObject *tmp;
+    while( (tmp = iter.current()) ) {
+	++iter;
+	if ( tmp->isWidgetType() ) {
+	    sendAllChildrenHome( (QWidget*) tmp );
+	    DraggedInfo *di = draggedDict.find( (long) tmp );
+	    if ( di )
+		sendChildHome( di );
+	}
+    }
+}
+
+bool QDragger::dragEvent( QWidget *w, QMouseEvent *e )
+{
+    switch( e->type() ) {
+	case QEvent::MouseButtonDblClick:
+	case QEvent::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;
+	    QPoint p    = w->mapToGlobal(QPoint(0,0));
+	    w->reparent( 0, WType_Popup, p, TRUE );
+
+	    return TRUE;
+	}
+	case QEvent::MouseButtonRelease:
+	case QEvent::MouseMove: {
+	    if ( dragInfo.w != 0 ) {
+		QPoint p = QCursor::pos() - clickOffset;
+		dragInfo.w->move( p );
+		if ( e->type() == QEvent::MouseMove )
+		    return TRUE;
+	    } else {
+		return FALSE;
+	    }
+	    if ( !dragInfo.w )
+		return FALSE;
+	    if ( w != dragInfo.w )
+		w = dragInfo.w;
+	    dragInfo.w = 0;
+	    w->hide();
+	    QPoint pos;
+	    QWidget *target = cursorWidget( &pos );
+	    pos = pos - clickOffset;
+	    QPoint p;
+	    if ( !target ) {
+		target = openDropWindow( QRect( pos, w->size() ),
+					 FALSE);
+		p = QPoint( 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 QDragger::killDropEvent( QMouseEvent *e )
+{
+    switch( e->type() ) {
+	case QEvent::MouseButtonDblClick:
+	case QEvent::MouseButtonPress:
+	    clickedWidget = cursorWidget();
+	    return TRUE;
+	case QEvent::MouseButtonRelease:
+	    hostWidget->releaseMouse();
+	    if ( clickedWidget ) {
+		DropInfo *tmp = dropDict.find( (long) clickedWidget );
+		if( tmp ) {
+		    killDropWindow( tmp );
+		    dropDict.remove( (long) tmp->w );
+		}
+	    }
+	    grabFinished();
+	    return TRUE;
+	case QEvent::MouseMove:
+	    return TRUE;
+	default:
+	    break;
+    }
+    return FALSE;
+}
+
+bool QDragger::sendChildEvent( QMouseEvent *e )
+{
+    switch( e->type() ) {
+	case QEvent::MouseButtonDblClick:
+	case QEvent::MouseButtonPress:
+	    clickedWidget = cursorWidget();
+	    return TRUE;
+	case QEvent::MouseButtonRelease:
+	    hostWidget->releaseMouse();
+	    if ( clickedWidget ) {
+		DraggedInfo *tmp = draggedDict.find((long) clickedWidget);
+		if( tmp ) {
+		    QWidget *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 QEvent::MouseMove:
+	    return TRUE;
+	default:
+	    break;
+    }
+    return FALSE;
+}
+
+bool QDragger::startGrab()
+{
+    if ( !hostWidget )
+	return FALSE;
+    clickedWidget = 0;
+    cursor	  = hostWidget->cursor();
+    hostWidget->grabMouse();
+    hostWidget->setCursor( QCursor( CrossCursor ) );
+    return TRUE;
+}
+
+void QDragger::grabFinished()
+{
+    killingDrop	 = FALSE;
+    sendingChild = FALSE;
+    if(hostWidget)
+	hostWidget->setCursor( cursor );
+}
+
+void QDragger::closeDropWindow( DropWindow *w )
+{
+    DropInfo *tmp = dropDict.find( (long) w);
+    if( tmp )
+	killDropWindow( tmp );
+}
+
+void QDragger::openDropWindow()
+{
+    QWidget *tmp = openDropWindow( QRect(100, 100, 300, 200), TRUE );
+    tmp->show();
+}
+
+QWidget *QDragger::openDropWindow( const QRect &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 QDragger::killDropWindow()
+{
+    if ( startGrab() )
+	killingDrop   = TRUE;
+}
+
+void QDragger::killDropWindow( DropInfo *di )
+{
+    const QObjectList *l = di->w->children();
+    if ( !l )
+	return;
+    QObjectListIt iter( *l );
+    QObject *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 QDragger::killAllDropWindows()
+{
+    killAllDropWindows( FALSE );
+}
+
+void QDragger::killAllDropWindows( bool autoOnly )
+{
+    QIntDictIterator<DropInfo> iter( dropDict );
+
+    DropInfo *tmp;
+    while( (tmp = iter.current()) ) {
+	++iter;
+	if( !autoOnly || !tmp->userOpened ) {
+	    killDropWindow( tmp );
+	    dropDict.remove( (long) tmp->w );
+	}
+    }
+}
+
+void QDragger::sendChildHome( DraggedInfo *i )
+{
+    i->w->reparent( i->mother, 0, i->pos, TRUE );
+}
+
+void QDragger::sendChildHome()
+{
+    if ( startGrab() )
+	sendingChild  = TRUE;
+}
+
+void QDragger::sendAllChildrenHome()
+{
+    QIntDictIterator<DraggedInfo> iter( draggedDict );
+
+    DraggedInfo *tmp;
+    while( (tmp = iter.current()) ) {
+	++iter;
+	sendChildHome( tmp );
+	draggedDict.remove( (long) tmp->w );
+    }
+    killAllDropWindows( TRUE );
+    draggedDict.clear();
+}
+
+
+QWidget *cursorWidget( QPoint *p )
+{
+    QPoint curpos = QCursor::pos();
+    if ( p )
+	*p = curpos;
+    return QApplication::widgetAt( curpos );
+}
+
+
+#include "qdragapp.moc"
Index: trunk/examples/tetrix/qdragapp.h
===================================================================
--- trunk/examples/tetrix/qdragapp.h	(revision 164)
+++ trunk/examples/tetrix/qdragapp.h	(revision 164)
@@ -0,0 +1,32 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef QDRAGAPP_H
+#define QDRAGAPP_H
+
+#include "qapplication.h"
+
+class QDragger;
+
+class QDragApplication : public QApplication
+{
+    Q_OBJECT
+public:
+    QDragApplication( int &argc, char **argv );
+    virtual ~QDragApplication();
+
+    virtual bool notify( QObject *, QEvent * ); // event filter
+
+private:
+    QDragger *dragger;
+};
+
+
+#endif // QDRAGAPP_H
Index: trunk/examples/tetrix/qtetrix.cpp
===================================================================
--- trunk/examples/tetrix/qtetrix.cpp	(revision 164)
+++ trunk/examples/tetrix/qtetrix.cpp	(revision 164)
@@ -0,0 +1,177 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qtetrix.h"
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qdatetime.h>
+
+
+void drawTetrixButton( QPainter *p, int x, int y, int w, int h,
+		       const QColor *color, QWidget *widg)
+{
+    if ( color ) {
+        QPointArray 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( QWidget *parent, const char *name )
+    : QFrame( parent, name )
+{
+    setFrameStyle( QFrame::Panel | QFrame::Sunken );
+    xOffset = -1;     // -1 until first resizeEvent.
+}
+
+void ShowNextPiece::resizeEvent( QResizeEvent *e )
+{
+    QSize 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( QPaintEvent * )
+{
+    QPainter p( this );
+    drawFrame( &p );
+    p.end();			// explicit end() so any slots can paint too
+    emit update();
+}
+
+
+void ShowNextPiece::drawNextSquare(int x, int y,QColor *color)
+{
+    if (xOffset == -1)		// Before first resizeEvent?
+        return;
+
+    QPainter paint;
+    paint.begin(this);
+    drawTetrixButton( &paint, xOffset+x*blockWidth, yOffset+y*blockHeight,
+		      blockWidth, blockHeight, color, this );
+    paint.end();
+}
+
+
+QTetrix::QTetrix( QWidget *parent, const char *name )
+    : QWidget( parent, name )
+{
+    QTime t = QTime::currentTime();
+    TetrixPiece::setRandomSeed( (((double)t.hour())+t.minute()+t.second())/
+                                 (24+60+60) );
+
+#define ADD_LABEL( str, x, y, w, h )			\
+    { QLabel *label = new QLabel(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 QTetrixBoard(this);
+    showNext    = new ShowNextPiece(this);
+#ifndef QT_NO_LCDNUMBER
+    showScore   = new QLCDNumber(5,this);
+    showLevel   = new QLCDNumber(2,this);
+    showLines   = new QLCDNumber(5,this);
+#else
+    showScore   = new QLabel("0",this);
+    showLevel   = new QLabel("0",this);
+    showLines   = new QLabel("0",this);
+    showScore->setAlignment(AlignCenter);
+    showLines->setAlignment(AlignCenter);
+    showLevel->setAlignment(AlignCenter);
+    showScore->setFrameStyle(QFrame::Sunken|QFrame::Box);
+    showLines->setFrameStyle(QFrame::Sunken|QFrame::Box);
+    showLevel->setFrameStyle(QFrame::Sunken|QFrame::Box);
+#endif    
+    quitButton  = new QPushButton("&Quit",this);
+    startButton = new QPushButton("&New Game",this);
+    pauseButton = new QPushButton("&Pause",this);
+
+    // Don't let the buttons get keyboard focus
+    quitButton->setFocusPolicy( QWidget::NoFocus );
+    startButton->setFocusPolicy( QWidget::NoFocus );
+    pauseButton->setFocusPolicy( QWidget::NoFocus );
+
+    connect( board, SIGNAL(gameOverSignal()), SLOT(gameOver()) );
+    connect( board, SIGNAL(drawNextSquareSignal(int,int,QColor*)), showNext,
+	     SLOT(drawNextSquare(int,int,QColor*)) );
+    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( quitButton , SIGNAL(clicked()), SLOT(quit()));
+    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 );
+    quitButton->setGeometry( 370, 265, 90, 30 );
+    pauseButton->setGeometry( 370, 310, 90, 30 );
+    board->revealNextPiece(TRUE);
+
+    resize( 550, 370 );
+}
+
+void QTetrix::gameOver()
+{
+}
+
+
+void QTetrix::quit()
+{
+    qApp->quit();
+}
Index: trunk/examples/tetrix/qtetrix.h
===================================================================
--- trunk/examples/tetrix/qtetrix.h	(revision 164)
+++ trunk/examples/tetrix/qtetrix.h	(revision 164)
@@ -0,0 +1,75 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef QTETRIX_H
+#define QTETRIX_H
+
+#include "qtetrixb.h"
+#include <qframe.h>
+#include <qlcdnumber.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qpainter.h>
+
+
+class ShowNextPiece : public QFrame
+{
+    Q_OBJECT
+    friend class QTetrix;
+public:
+    ShowNextPiece( QWidget *parent=0, const char *name=0  );
+public slots:
+    void drawNextSquare( int x, int y,QColor *color );
+signals:
+    void update();
+private:
+    void paintEvent( QPaintEvent * );
+    void resizeEvent( QResizeEvent * );
+    
+    int      blockWidth,blockHeight;
+    int      xOffset,yOffset;
+};
+
+
+class QTetrix : public QWidget
+{
+    Q_OBJECT
+public:
+    QTetrix( QWidget *parent=0, const char *name=0 );
+    void startGame() { board->startGame(); }
+
+public slots:
+    void gameOver();
+    void quit();
+private:
+    void keyPressEvent( QKeyEvent *e ) { board->keyPressEvent(e); }
+
+    QTetrixBoard  *board;
+    ShowNextPiece *showNext;
+#ifndef QT_NO_LCDNUMBER
+    QLCDNumber    *showScore;
+    QLCDNumber    *showLevel;
+    QLCDNumber    *showLines;
+#else
+    QLabel    *showScore;
+    QLabel    *showLevel;
+    QLabel    *showLines;
+#endif
+    QPushButton   *quitButton;
+    QPushButton   *startButton;
+    QPushButton   *pauseButton;
+};
+
+
+void drawTetrixButton( QPainter *, int x, int y, int w, int h,
+		       const QColor *color, QWidget *widg);
+
+
+#endif
Index: trunk/examples/tetrix/qtetrixb.cpp
===================================================================
--- trunk/examples/tetrix/qtetrixb.cpp	(revision 164)
+++ trunk/examples/tetrix/qtetrixb.cpp	(revision 164)
@@ -0,0 +1,242 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-1998 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qtetrixb.h"
+#include "qtetrix.h"
+#include <qtimer.h>
+#include <qpainter.h>
+
+const int waitAfterLineTime = 500;
+
+QTetrixBoard::QTetrixBoard( QWidget *p, const char *name )
+    : QFrame( p, name )
+{
+    setFrameStyle( QFrame::Panel | QFrame::Sunken );
+    paint = 0;
+    paint_widget = 0;
+    timer = new QTimer(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 QTetrixBoard::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 QTetrixBoard::pause()
+{
+    if ( noGame )			// game not active
+        return;
+    isPaused = !isPaused;
+    if ( isPaused ) {
+	timer->stop();
+        hideBoard();
+    }
+    else
+	timer->start(timeoutTime);
+    update();
+}
+
+
+void QTetrixBoard::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;
+    QPainter *p;
+    QWidget *w;
+    if ( localPainter ) {
+	p = new QPainter( 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 ) {
+	QColor 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 QTetrixBoard::drawNextSquare( int x, int y, int value )
+{
+    if ( value == 0 )
+        emit drawNextSquareSignal (x, y, 0 );
+    else
+        emit drawNextSquareSignal( x, y, &colors[value-1] );
+}
+
+void QTetrixBoard::updateRemoved( int noOfLines )
+{
+    if ( noOfLines > 0 ) {
+        timer->stop();
+        timer->start( waitAfterLineTime );
+        waitingAfterLine = TRUE;
+    }
+    emit updateRemovedSignal( noOfLines );
+}
+
+void QTetrixBoard::updateScore( int newScore )
+{
+    emit updateScoreSignal( newScore );
+}
+
+void QTetrixBoard::updateLevel( int newLevel )
+{
+    timer->stop();
+    updateTimeoutTime();
+    timer->start( timeoutTime );
+    emit updateLevelSignal( newLevel );
+}
+
+void QTetrixBoard::pieceDropped(int)
+{
+    if ( waitingAfterLine ) // give player a break if a line has been removed
+        return;
+    newPiece();
+}
+
+void QTetrixBoard::gameOver()
+{
+    timer->stop();
+    noGame = TRUE;
+    emit gameOverSignal();
+}
+
+void QTetrixBoard::timeout()
+{
+    if ( waitingAfterLine ) {
+	timer->stop();
+	waitingAfterLine = FALSE;
+	newPiece();
+	timer->start( timeoutTime );
+    } else {
+        oneLineDown();
+    }
+}
+
+void QTetrixBoard::drawContents( QPainter *p )
+{
+    const char *text = "Press \"Pause\"";
+    QRect 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 QTetrixBoard::resizeEvent(QResizeEvent *e)
+{
+    QSize sz = e->size();
+    blockWidth  = (sz.width() - 3)/10;
+    blockHeight = (sz.height() - 3)/22;
+    xOffset     = 1;
+    yOffset     = 1;
+}
+
+void QTetrixBoard::keyPressEvent( QKeyEvent *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 QTetrixBoard::updateTimeoutTime()
+{
+    timeoutTime = 1000/(1 + getLevel());
+}
Index: trunk/examples/tetrix/qtetrixb.h
===================================================================
--- trunk/examples/tetrix/qtetrixb.h	(revision 164)
+++ trunk/examples/tetrix/qtetrixb.h	(revision 164)
@@ -0,0 +1,70 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef QTETRIXB_H
+#define QTETRIXB_H
+
+#include "gtetrix.h"
+#include <qframe.h>
+
+class QTimer;
+
+class QTetrixBoard : public QFrame, public GenericTetrix
+{
+    Q_OBJECT
+public:
+    QTetrixBoard( QWidget *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(QKeyEvent *e) { keyPressEvent(e); }
+    void      start()		{ startGame(); }
+    void      pause();
+
+signals:
+    void      gameOverSignal();
+    void      drawNextSquareSignal(int x,int y,QColor *color1);
+    void      updateRemovedSignal(int noOfLines);
+    void      updateScoreSignal(int score);
+    void      updateLevelSignal(int level);
+
+public:       // until we have keyboard focus, should be protected
+    void      keyPressEvent( QKeyEvent * );
+
+private:
+    void      drawContents( QPainter * );
+    void      resizeEvent( QResizeEvent * );
+    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();
+
+    QTimer   *timer;
+
+    int       xOffset,yOffset;
+    int       blockWidth,blockHeight;
+    int       timeoutTime;
+    bool      noGame;
+    bool      isPaused;
+    bool      waitingAfterLine;
+
+    QColor    colors[7];
+    QPainter *paint;
+    QWidget *paint_widget;
+};
+
+#endif
Index: trunk/examples/tetrix/tetrix.cpp
===================================================================
--- trunk/examples/tetrix/tetrix.cpp	(revision 164)
+++ trunk/examples/tetrix/tetrix.cpp	(revision 164)
@@ -0,0 +1,25 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qtetrix.h"
+#include "qdragapp.h"
+#include "qfont.h"
+
+int main( int argc, char **argv )
+{
+    QApplication::setColorSpec( QApplication::CustomColor );
+    QDragApplication a(argc,argv);
+    QTetrix *tetrix = new QTetrix;
+    tetrix->setCaption("Tetrix");
+    a.setMainWidget(tetrix);
+    tetrix->setCaption("Qt Example - Tetrix");
+    tetrix->show();
+    return a.exec();
+}
Index: trunk/examples/tetrix/tetrix.pro
===================================================================
--- trunk/examples/tetrix/tetrix.pro	(revision 164)
+++ trunk/examples/tetrix/tetrix.pro	(revision 164)
@@ -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
Index: trunk/examples/tetrix/tpiece.cpp
===================================================================
--- trunk/examples/tetrix/tpiece.cpp	(revision 164)
+++ trunk/examples/tetrix/tpiece.cpp	(revision 164)
@@ -0,0 +1,181 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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)
+{
+    QCString 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);
+}
Index: trunk/examples/tetrix/tpiece.h
===================================================================
--- trunk/examples/tetrix/tpiece.h	(revision 164)
+++ trunk/examples/tetrix/tpiece.h	(revision 164)
@@ -0,0 +1,51 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#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
Index: trunk/examples/widgets/README
===================================================================
--- trunk/examples/widgets/README	(revision 164)
+++ trunk/examples/widgets/README	(revision 164)
@@ -0,0 +1,1 @@
+Click the right mouse button + CTRL to identify a widget.
Index: trunk/examples/widgets/main.cpp
===================================================================
--- trunk/examples/widgets/main.cpp	(revision 164)
+++ trunk/examples/widgets/main.cpp	(revision 164)
@@ -0,0 +1,52 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qstylefactory.h>
+#include "widgets.h"
+
+class MyWidgetView : public WidgetView
+{
+    int s;
+public:
+    MyWidgetView( QWidget *parent=0, const char *name=0 )
+	:WidgetView(parent, name), s(0)
+    {
+	setToolBarsMovable( TRUE );
+    }
+
+    void button1Clicked()
+    {
+	QStringList styles = QStyleFactory::keys();
+
+	s = (++s)%styles.count();
+	qApp->setStyle( styles[ s] );
+	WidgetView::button1Clicked();
+    }
+};
+
+
+//
+// Create and display our WidgetView.
+//
+
+int main( int argc, char **argv )
+{
+    QApplication::setColorSpec( QApplication::CustomColor );
+    QApplication a( argc, argv );
+
+    MyWidgetView* w = new MyWidgetView;
+    a.setMainWidget( w );
+
+    w->show();
+    int res = a.exec();
+    delete w;
+    return res;
+}
Index: trunk/examples/widgets/widgets.cpp
===================================================================
--- trunk/examples/widgets/widgets.cpp	(revision 164)
+++ trunk/examples/widgets/widgets.cpp	(revision 164)
@@ -0,0 +1,752 @@
+/****************************************************************************
+** $Id$
+**
+** Copyright (C) 1992-2003 Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qmessagebox.h>
+#include <qpixmap.h>
+#include <qlayout.h>
+#include <qapplication.h>
+
+// Standard Qt 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 QWhatsThis
+{
+public:
+    MyWhatsThis( QListBox* lb)
+	: QWhatsThis( lb ) { listbox = lb; };
+    ~MyWhatsThis(){};
+
+
+    QString text( const QPoint & p) {
+	QListBoxItem* 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 QListBox.";
+    }
+
+private:
+    QListBox* listbox;
+};
+
+
+class MyMenuItem : public QCustomMenuItem
+{
+public:
+    MyMenuItem( const QString& s, const QFont& f )
+	: string( s ), font( f ){};
+    ~MyMenuItem(){}
+
+    void paint( QPainter* p, const QColorGroup& /*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 );
+    }
+
+    QSize sizeHint()
+    {
+	return QFontMetrics( font ).size( AlignAuto | AlignVCenter |
+					  ShowPrefix | DontClip,  string );
+    }
+private:
+    QString string;
+    QFont font;
+};
+
+//
+// Construct the WidgetView with children
+//
+
+WidgetView::WidgetView( QWidget *parent, const char *name )
+    : QMainWindow( parent, name )
+{
+    QColor col;
+
+    // Set the window caption/title
+    setCaption( "Qt Example - Widgets Demo Application" );
+
+    // create a toolbar
+    QToolBar *tools = new QToolBar( this, "toolbar" );
+
+    // put something in it
+    QPixmap openIcon( fileopen );
+    QToolButton * toolb = new QToolButton( openIcon, "toolbutton 1",
+					   QString::null, this, SLOT(open()),
+					   tools, "open file" );
+    QWhatsThis::add( toolb, "This is a <b>QToolButton</b>. It lives in a "
+		     "QToolBar. This particular button doesn't do anything "
+		     "useful." );
+
+    QPixmap saveIcon( filesave );
+    toolb = new QToolButton( saveIcon, "toolbutton 2", QString::null,
+			     this, SLOT(dummy()),
+			     tools, "save file" );
+    QWhatsThis::add( toolb, "This is also a <b>QToolButton</b>." );
+
+    QPixmap  printIcon( fileprint );
+    toolb = new QToolButton( printIcon, "toolbutton 3", QString::null,
+			     this, SLOT(dummy()),
+			     tools, "print file" );
+    QWhatsThis::add( toolb, "This is the third <b>QToolButton</b>.");
+
+    toolb = QWhatsThis::whatsThisButton( tools );
+    QWhatsThis::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 QWidget( this );
+    setCentralWidget( central );
+
+    // Create a layout to position the widgets
+    QHBoxLayout *topLayout = new QHBoxLayout( central, 10 );
+
+    // Create a grid layout to hold most of the widgets
+    QGridLayout *grid = new QGridLayout( 0, 3 ); //3 wide and autodetect number of rows
+    topLayout->addLayout( grid, 1 );
+
+    // Create an easter egg
+    QToolTip::add( menuBar(), QRect( 0, 0, 2, 2 ), "easter egg" );
+
+    QPopupMenu* popup;
+    popup = new QPopupMenu( 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(quit()), CTRL+Key_Q );
+
+    textStylePopup = popup = new QPopupMenu( this );
+    menuBar()->insertItem( "&Edit", popup );
+
+    plainStyleID = id = popup->insertItem( "&Plain" );
+    popup->setAccel( CTRL+Key_T, id );
+
+    popup->insertSeparator();
+    QFont 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( QPalette( col ) );
+
+    // make tool tips for both of them
+    QToolTip::add( aclock, "custom widget: analog clock" );
+    QToolTip::add( dclock, "custom widget: digital clock" );
+
+    // Create a push button.
+    QPushButton *pb;
+    pb = new QPushButton( "&Push button 1", central, "button1" );
+    grid->addWidget( pb, 0, 0, AlignVCenter );
+    connect( pb, SIGNAL(clicked()), SLOT(button1Clicked()) );
+    QToolTip::add( pb, "push button 1" );
+    QWhatsThis::add( pb, "This is a <b>QPushButton</b>.<br>"
+		     "Click it and watch...<br>"
+		     "The wonders of modern technology.");
+
+    QPixmap pm;
+    bool pix = pm.load("qt.png");
+    if ( !pix ) {
+	QMessageBox::information( 0, "Qt Widgets Example",
+				  "Could not load the file \"qt.png\", which\n"
+				  "contains an icon used...\n\n"
+				  "The text \"line 42\" will be substituted.",
+				  QMessageBox::Ok + QMessageBox::Default );
+    }
+
+    // Create a label containing a QMovie
+    movie = QMovie( MOVIEFILENAME );
+    movielabel = new QLabel( central, "label0" );
+    movie.connectStatus(this, SLOT(movieStatus(int)));
+    movie.connectUpdate(this, SLOT(movieUpdate(const QRect&)));
+    movielabel->setFrameStyle( QFrame::Box | QFrame::Plain );
+    movielabel->setMovie( movie );
+    movielabel->setFixedSize( 128+movielabel->frameWidth()*2,
+			      64+movielabel->frameWidth()*2 );
+    grid->addWidget( movielabel, 0, 1, AlignCenter );
+    QToolTip::add( movielabel, "movie" );
+    QWhatsThis::add( movielabel, "This is a <b>QLabel</b> "
+		     "that contains a QMovie." );
+
+    // Create a group of check boxes
+    bg = new QButtonGroup( central, "checkGroup" );
+    bg->setTitle( "Check Boxes" );
+    grid->addWidget( bg, 1, 0 );
+
+    // Create a layout for the check boxes
+    QVBoxLayout *vbox = new QVBoxLayout(bg, 10);
+
+    vbox->addSpacing( bg->fontMetrics().height() );
+
+    cb[0] = new QCheckBox( bg );
+    cb[0]->setText( "&Read" );
+    vbox->addWidget( cb[0] );
+    cb[1] = new QCheckBox( bg );
+    cb[1]->setText( "&Write" );
+    vbox->addWidget( cb[1] );
+    cb[2] = new QCheckBox( bg );
+    cb[2]->setText( "&Execute" );
+    vbox->addWidget( cb[2] );
+
+    connect( bg, SIGNAL(clicked(int)), SLOT(checkBoxClicked(int)) );
+
+    QToolTip::add( cb[0], "check box 1" );
+    QToolTip::add( cb[1], "check box 2" );
+    QToolTip::add( cb[2], "check box 3" );
+
+    // Create a group of radio buttons
+    QRadioButton *rb;
+    bg = new QButtonGroup( central, "radioGroup" );
+    bg->setTitle( "Radio buttons" );
+
+    grid->addWidget( bg, 1, 1 );
+
+    // Create a layout for the radio buttons
+    vbox = new QVBoxLayout(bg, 10);
+
+    vbox->addSpacing( bg->fontMetrics().height() );
+    rb = new QRadioButton( bg );
+    rb->setText( "&AM" );
+    rb->setChecked( TRUE );
+    vbox->addWidget(rb);
+    QToolTip::add( rb, "radio button 1" );
+    rb = new QRadioButton( bg );
+    rb->setText( "F&M" );
+    vbox->addWidget(rb);
+    QToolTip::add( rb, "radio button 2" );
+    rb = new QRadioButton( bg );
+    rb->setText( "&Short Wave" );
+    vbox->addWidget(rb);
+
+    connect( bg, SIGNAL(clicked(int)), SLOT(radioButtonClicked(int)) );
+    QToolTip::add( rb, "radio button 3" );
+
+    // Create a list box
+    QListBox *lb = new QListBox( central, "listBox" );
+    for ( int i=0; i<100; i++ ) {		// fill list box
+	QString 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)) );
+    QToolTip::add( lb, "list box" );
+    (void)new MyWhatsThis( lb );
+
+    vbox = new QVBoxLayout(8);
+    grid->addLayout( vbox, 2, 1 );
+
+    // Create a slider
+    QSlider *sb = new QSlider( 0, 300, 30, 100, QSlider::Horizontal,
+			       central, "Slider" );
+    sb->setTickmarks( QSlider::Below );
+    sb->setTickInterval( 10 );
+    sb->setFocusPolicy( QWidget::TabFocus );
+    vbox->addWidget( sb );
+
+    connect( sb, SIGNAL(valueChanged(int)), SLOT(sliderValueChanged(int)) );
+    QToolTip::add( sb, "slider" );
+    QWhatsThis::add( sb, "This is a <b>QSlider</b>. "
+		     "The tick marks are optional."
+		     " This slider controls the speed of the movie." );
+    // Create a combo box
+    QComboBox *combo = new QComboBox( 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)) );
+    QToolTip::add( combo, "read-only combo box" );
+
+    // Create an editable combo box
+    QComboBox *edCombo = new QComboBox( TRUE, central, "edComboBox" );
+    QListBox *edComboLst = new QListBox(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 QString&)),
+	     this, SLOT(edComboBoxItemActivated(const QString&)) );
+    QToolTip::add( edCombo, "editable combo box" );
+
+    edCombo->setAutoCompletion( TRUE );
+
+    vbox = new QVBoxLayout(8);
+    grid->addLayout( vbox, 2, 2 );
+
+    // Create a spin box
+    QSpinBox *spin = new QSpinBox( 0, 10, 1, central, "spin" );
+    spin->setSuffix(" mm");
+    spin->setSpecialValueText( "Auto" );
+    connect( spin, SIGNAL( valueChanged(const QString&) ),
+	     SLOT( spinBoxValueChanged(const QString&) ) );
+    QToolTip::add( spin, "spin box" );
+    QWhatsThis::add( spin, "This is a <b>QSpinBox</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 QTabWidget( central );
+    //tabs->setTabPosition( QTabWidget::Bottom );
+    tabs->setMargin( 4 );
+    grid->addMultiCellWidget( tabs, 3, 3, 1, 2 );
+    QMultiLineEdit *mle = new QMultiLineEdit( tabs, "multiLineEdit" );
+    edit = mle;
+    mle->setWordWrap( QMultiLineEdit::WidgetWidth );
+    mle->setText("This is a QMultiLineEdit widget, "
+	         "useful for small multi-line "
+		 "input fields.");
+    QToolTip::add( mle, "multi line editor" );
+
+    tabs->addTab( mle, "F&irst");
+
+    mle = new QMultiLineEdit( tabs, "multiLineEdit" );
+    QString mleText = "This is another QMultiLineEdit widget.";
+#if 1
+    mleText += "\n";
+    mleText += "Japanese: ";
+    mleText += QChar((ushort)0x6a38); // Kanji
+    mleText += "\n";
+    mleText += "Russian: ";
+    mleText += QChar((ushort)0x042e); // Cyrillic
+    mleText += "\n";
+    mleText += "Norwegian: ";
+    mleText += QChar((ushort)0x00d8); // Norwegian
+    mleText += "\n";
+    mleText += "Unicode (black square): ";
+    mleText += QChar((ushort)0x25A0); // BLACK SQUARE
+    mleText += "\n";
+#endif
+    mle->setText( mleText );
+    QToolTip::add( mle, "second multi line editor" );
+    tabs->addTab( mle, "Se&cond");
+
+
+    // Create a single line edit
+    QLineEdit *le = new QLineEdit( central, "lineEdit" );
+
+
+    grid->addMultiCellWidget( le, 4, 4, 1, 2 );
+    connect( le, SIGNAL(textChanged(const QString&)),
+	     SLOT(lineEditTextChanged(const QString&)) );
+    QToolTip::add( le, "single line editor" );
+    QWhatsThis::add( le, "This is a <b>QLineEdit</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);
+
+
+    QSplitter *split = new QSplitter( Vertical, central, "splitter" );
+    split->setOpaqueResize( TRUE );
+    topLayout->addWidget( split, 1 );
+    QListView *lv = new MyListView( split );
+    connect(lv, SIGNAL(selectionChanged() ),
+	    this, SLOT( selectionChanged() ) );
+    connect(lv, SIGNAL(selectionChanged(QListViewItem*) ),
+	    this, SLOT( selectionChanged(QListViewItem*) ) );
+    connect(lv, SIGNAL(clicked(QListViewItem*) ),
+	    this, SLOT( clicked(QListViewItem*) ) );
+    connect(lv, SIGNAL(mySelectionChanged(QListViewItem*) ),
+	    this, SLOT( mySelectionChanged(QListViewItem*) ) );
+    lv->addColumn( "One" );
+    lv->addColumn( "Two" );
+    lv->setAllColumnsShowFocus( TRUE );
+
+    QListViewItem *lvi=  new QListViewItem( lv, "Text", "Text" );
+    lvi=  new QListViewItem( lv, "Text", "Other Text" );
+    lvi=  new QListViewItem( lv, "Text", "More Text" );
+    lvi=  new QListViewItem( lv, "Text", "Extra Text" );
+    lvi->setOpen(TRUE);
+    (void)new QListViewItem( lvi, "SubText", "Additional Text" );
+    lvi=  new QListViewItem( lvi, "SubText", "Side Text" );
+    lvi=  new QListViewItem( lvi, "SubSubText", "Complimentary Text" );
+
+    QToolTip::add( lv, "list view" );
+    QWhatsThis::add( lv, "This is a <b>QListView</b>, you can display lists "
+		     "(or outline lists) of multiple-column data in it." );
+
+    lv = new QListView( split );
+    lv->addColumn( "Choices" );
+    (void) new QCheckListItem( lv, "Onion", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Artichoke", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Pepper", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Habaneros", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Pineapple", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Ham", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Pepperoni", QCheckListItem::CheckBox );
+    (void) new QCheckListItem( lv, "Garlic", QCheckListItem::CheckBox );
+
+
+    QCheckListItem *lit = new QCheckListItem( lv, "Cheese" );
+    lit->setOpen( TRUE );
+    (void) new QCheckListItem( lit, "Cheddar", QCheckListItem::RadioButton );
+    (void) new QCheckListItem( lit, "Mozarella", QCheckListItem::RadioButton );
+    (void) new QCheckListItem( lit, "Jarlsberg", QCheckListItem::RadioButton );
+
+    QToolTip::add( lv, "list view" );
+    QWhatsThis::add( lv, "This is also a <b>QListView</b>, with "
+		     "interactive items." );
+
+    QTextBrowser *browser =  new QTextBrowser( split );
+    browser->setText( "<h1>QTextBrowser</h1>"
+		   "<p>Qt 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(QFont("Charter",11));
+    browser->setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
+    connect( browser, SIGNAL(linkClicked(const QString&)), browser, SLOT(setText(const QString&)) );
+
+    // Create an label and a message in the status bar
+    // The message is updated when buttons are clicked etc.
+    msg = new QLabel( statusBar(), "message" );
+    msg->setAlignment( AlignCenter );
+    QFont boldfont; boldfont.setWeight(QFont::Bold);
+    msg->setFont( boldfont );
+    statusBar()->addWidget( msg, 4 );
+    QToolTip::add( msg, "Message area" );
+
+    QAccel* a = new QAccel( this );
+    a->connectItem(  a->insertItem( Key_F9 ),
+		     this, SLOT( showProperties() ) );
+
+    prog = new QProgressBar( statusBar(), "progress" );
+    prog->setTotalSteps( 100 );
+    progress = 64;
+    prog->setProgress( progress );
+    statusBar()->addWidget( prog , 1 );
+    QWhatsThis::add( prog, "This is a <b>QProgressBar</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 Qt", 2000 );
+}
+
+void WidgetView::setStatus(const QString& text)
+{
+    msg->setText(text);
+}
+
+void WidgetView::button1Clicked()
+{
+    msg->setText( "The push button was clicked" );
+    prog->setProgress( ++progress );
+}
+
+
+void WidgetView::movieUpdate( const QRect& )
+{
+    // Uncomment this to test animated icons on your window manager
+    //setIcon( movie.framePixmap() );
+}
+
+void WidgetView::movieStatus( int s )
+{
+    switch ( s ) {
+      case QMovie::SourceEmpty:
+      case QMovie::UnrecognizedFormat:
+	{
+	    QPixmap 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 )
+{
+    QString str;
+    str = tr("Check box %1 clicked : ").arg(id);
+    QString 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 QString& text)
+{
+    QString 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:
+	QApplication::setWinStyleHighlightColor( darkBlue );
+	break;
+    case 1:
+	QApplication::setWinStyleHighlightColor( darkRed );
+	break;
+    case 2:
+	QApplication::setWinStyleHighlightColor( darkGreen );
+	break;
+    case 3:
+	QApplication::setWinStyleHighlightColor( blue );
+	break;
+    case 4:
+	QApplication::setWinStyleHighlightColor( red );
+	break;
+    }
+}
+
+
+
+void WidgetView::lineEditTextChanged( const QString& newText )
+{
+    QString str( "Line edit text: ");
+    str += newText;
+    if ( newText.length() == 1 ) {
+	QString u;
+	u.sprintf(" (U%02x%02x)", newText[0].row(), newText[0].cell() );
+	str += u;
+    }
+    msg->setText( str );
+}
+
+
+void WidgetView::spinBoxValueChanged( const QString& valueText )
+{
+    QString 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( QObject *obj, QEvent *event )
+{
+    static bool identify_now = TRUE;
+    if ( event->type() == QEvent::MouseButtonPress && identify_now ) {
+	QMouseEvent *e = (QMouseEvent*)event;
+	if ( e->button() == QMouseEvent::RightButton &&
+	     (e->state() & QMouseEvent::ControlButton) != 0 ){
+	    QString 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
+	    QMessageBox::information( (QWidget*)obj, "Identify Widget", str );
+	    identify_now = TRUE;		// allow it again
+	}
+    }
+    return QMainWindow::eventFilter( obj, event ); // don't eat event
+}
+
+
+void WidgetView::open()
+{
+    QFileDialog::getOpenFileName( QString::null, "Textfiles (*.txt)", this );
+}
+
+
+void WidgetView::dummy()
+{
+    QMessageBox::information( this, "Sorry",
+			      "This function is not implemented" );
+}
+
+void WidgetView::selectionChanged()
+{
+    //qDebug("selectionChanged");
+}
+void WidgetView::selectionChanged( QListViewItem* /*item*/)
+{
+    //qDebug("selectionChanged %p", item );
+}
+
+void WidgetView::clicked( QListViewItem* /*item*/ )
+{
+    //qDebug("clicked %p", item );
+}
+
+void WidgetView::mySelectionChanged( QListViewItem* /*item*/ )
+{
+    //qDebug("mySelectionChanged %p", item );
+}
+
+void WidgetView::showProperties()
+{
+    if ( !qApp->focusWidget() )
+	return;
+    QCString output;
+    output.sprintf( "Properties for class '%s'",
+		    qApp->focusWidget()->className() );
+    int i = 0;
+    while( i < (int) qApp->focusWidget()->metaObject()->numProperties( TRUE ) ) {
+	const QMetaProperty* p
+	    = qApp->focusWidget()->metaObject()->property( i, TRUE );
+	QCString tmp;
+	tmp.sprintf( "\n %2d: %s (read-%s, %s)", ++i, p->name(),
+		     p->writable() ? "write" : "only", p->type() );
+	output += tmp;
+    }
+    qDebug( output );
+}
Index: trunk/examples/widgets/widgets.h
===================================================================
--- trunk/examples/widgets/widgets.h	(revision 164)
+++ trunk/examples/widgets/widgets.h	(revision 164)
@@ -0,0 +1,115 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of something or other
+**
+** Created : 979899
+**
+** Copyright (C) 1997 by Trolltech AS.  All rights reserved.
+**
+** This file is part of an example program for Qt.  This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef WIDGETS_H
+#define WIDGETS_H
+
+#include <qmainwindow.h>
+#include <qmovie.h>
+#include <qlistview.h>
+class QLabel;
+class QCheckBox;
+class QProgressBar;
+class QTabWidget;
+class QGroupBox;
+class QMultiLineEdit;
+class QPopupMenu;
+
+class MyListView : public QListView
+{
+    Q_OBJECT
+public:
+    MyListView( QWidget * parent = 0, const char *name = 0 )
+	: QListView( parent, name ), selected(0)
+    {}
+    ~MyListView()
+    {}
+protected:
+
+    void contentsMousePressEvent( QMouseEvent * e )
+    {
+	selected = selectedItem();
+	QListView::contentsMousePressEvent( e );
+    }
+    void contentsMouseReleaseEvent( QMouseEvent * e )
+    {
+	QListView::contentsMouseReleaseEvent( e );
+	if ( selectedItem() != selected ) {
+	    emit mySelectionChanged( selectedItem() );
+	    emit mySelectionChanged();
+	}
+    }
+
+signals:
+    void mySelectionChanged();
+    void mySelectionChanged( QListViewItem* );
+
+private:
+    QListViewItem* selected;
+
+};
+//
+// WidgetView contains lots of Qt widgets.
+//
+
+class WidgetView : public QMainWindow
+{
+    Q_OBJECT
+public:
+    WidgetView( QWidget *parent=0, const char *name=0 );
+
+public slots:
+    void	setStatus(const QString&);
+    void selectionChanged();
+    void selectionChanged( QListViewItem* );
+    void clicked( QListViewItem* );
+    void mySelectionChanged( QListViewItem* );
+
+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 QString& );
+    void	lineEditTextChanged( const QString& );
+    void	movieStatus( int );
+    void	movieUpdate( const QRect& );
+    void	spinBoxValueChanged( const QString& );
+    void	popupSelected( int );
+
+    void	open();
+    void	dummy();
+    void	showProperties();
+
+private:
+    bool	eventFilter( QObject *, QEvent * );
+    QLabel     *msg;
+    QCheckBox  *cb[3];
+    QGroupBox* bg;
+    QLabel     *movielabel;
+    QMovie      movie;
+    QWidget *central;
+    QProgressBar *prog;
+    int progress;
+    QTabWidget* tabs;
+    QMultiLineEdit* edit;
+    QPopupMenu *textStylePopup;
+    int plainStyleID;
+    QWidget* bla;
+};
+
+#endif
Index: trunk/examples/widgets/widgets.pro
===================================================================
--- trunk/examples/widgets/widgets.pro	(revision 164)
+++ trunk/examples/widgets/widgets.pro	(revision 164)
@@ -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
Index: trunk/include/qassistantclient.h
===================================================================
--- trunk/include/qassistantclient.h	(revision 164)
+++ trunk/include/qassistantclient.h	(revision 164)
@@ -0,0 +1,73 @@
+/**********************************************************************
+** Copyright (C) 2002 Trolltech AS.  All rights reserved.
+**
+** This file is part of the QAssistantClient library.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QASSISTANTCLIENT_H
+#define QASSISTANTCLIENT_H
+
+#include <qobject.h>
+
+class QSocket;
+class QProcess;
+
+class QAssistantClient : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY( bool open READ isOpen )
+
+public:
+    QAssistantClient( const QString &path, QObject *parent = 0, const char *name = 0 );
+    ~QAssistantClient();
+
+    bool isOpen() const;
+
+    void setArguments( const QStringList &args );
+
+public slots:
+    virtual void openAssistant();
+    virtual void closeAssistant();
+    virtual void showPage( const QString &page );
+
+signals:
+    void assistantOpened();
+    void assistantClosed();
+    void error( const QString &msg );
+
+private slots:
+    void socketConnected();
+    void socketConnectionClosed();
+    void readPort();
+    void socketError( int );
+    void readStdError();
+
+private:
+    QSocket *socket;
+    QProcess *proc;
+    Q_UINT16 port;
+    QString host, assistantCommand, pageBuffer;
+    bool opened;
+};
+
+#endif
Index: trunk/include/qiconview.h
===================================================================
--- trunk/include/qiconview.h	(revision 164)
+++ trunk/include/qiconview.h	(revision 164)
@@ -0,0 +1,511 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of QIconView widget class
+**
+** Created : 990707
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the iconview module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QICONVIEW_H
+#define QICONVIEW_H
+
+#ifndef QT_H
+#include "qscrollview.h"
+#include "qstring.h"
+#include "qrect.h"
+#include "qpoint.h"
+#include "qsize.h"
+#include "qfont.h" // QString->QFont conversion
+#include "qdragobject.h"
+#include "qbitmap.h"
+#include "qpicture.h"
+#endif // QT_H
+
+#ifndef QT_NO_ICONVIEW
+
+#if !defined( QT_MODULE_ICONVIEW ) || defined( QT_INTERNAL_ICONVIEW )
+#define QM_EXPORT_ICONVIEW
+#else
+#define QM_EXPORT_ICONVIEW Q_EXPORT
+#endif
+
+class QIconView;
+class QPainter;
+class QMimeSource;
+class QMouseEvent;
+class QDragEnterEvent;
+class QDragMoveEvent;
+class QDragLeaveEvent;
+class QKeyEvent;
+class QFocusEvent;
+class QShowEvent;
+class QIconViewItem;
+class QIconViewItemLineEdit;
+class QStringList;
+class QIconDragPrivate;
+
+#ifndef QT_NO_DRAGANDDROP
+
+class QM_EXPORT_ICONVIEW QIconDragItem
+{
+public:
+    QIconDragItem();
+    virtual ~QIconDragItem();
+    virtual QByteArray data() const;
+    virtual void setData( const QByteArray &d );
+    bool operator== ( const QIconDragItem& ) const;
+
+private:
+    QByteArray ba;
+
+};
+
+class QM_EXPORT_ICONVIEW QIconDrag : public QDragObject
+{
+    Q_OBJECT
+public:
+    QIconDrag( QWidget * dragSource, const char* name = 0 );
+    virtual ~QIconDrag();
+
+    void append( const QIconDragItem &item, const QRect &pr, const QRect &tr );
+
+    virtual const char* format( int i ) const;
+    static bool canDecode( QMimeSource* e );
+    virtual QByteArray encodedData( const char* mime ) const;
+
+private:
+    QIconDragPrivate *d;
+    QChar endMark;
+
+    friend class QIconView;
+    friend class QIconViewPrivate;
+#if defined(Q_DISABLE_COPY) // Disabled copy constructor and operator=
+    QIconDrag( const QIconDrag & );
+    QIconDrag &operator=( const QIconDrag & );
+#endif
+};
+
+#endif
+
+class QIconViewToolTip;
+class QIconViewItemPrivate;
+
+class QM_EXPORT_ICONVIEW QIconViewItem : public Qt
+{
+    friend class QIconView;
+    friend class QIconViewToolTip;
+    friend class QIconViewItemLineEdit;
+
+public:
+    QIconViewItem( QIconView *parent );
+    QIconViewItem( QIconView *parent, QIconViewItem *after );
+    QIconViewItem( QIconView *parent, const QString &text );
+    QIconViewItem( QIconView *parent, QIconViewItem *after, const QString &text );
+    QIconViewItem( QIconView *parent, const QString &text, const QPixmap &icon );
+    QIconViewItem( QIconView *parent, QIconViewItem *after, const QString &text, const QPixmap &icon );
+#ifndef QT_NO_PICTURE
+    QIconViewItem( QIconView *parent, const QString &text, const QPicture &picture );
+    QIconViewItem( QIconView *parent, QIconViewItem *after, const QString &text, const QPicture &picture );
+#endif
+    virtual ~QIconViewItem();
+
+    virtual void setRenameEnabled( bool allow );
+    virtual void setDragEnabled( bool allow );
+    virtual void setDropEnabled( bool allow );
+
+    virtual QString text() const;
+    virtual QPixmap *pixmap() const;
+#ifndef QT_NO_PICTURE
+    virtual QPicture *picture() const;
+#endif
+    virtual QString key() const;
+
+    bool renameEnabled() const;
+    bool dragEnabled() const;
+    bool dropEnabled() const;
+
+    QIconView *iconView() const;
+    QIconViewItem *prevItem() const;
+    QIconViewItem *nextItem() const;
+
+    int index() const;
+
+    virtual void setSelected( bool s, bool cb );
+    virtual void setSelected( bool s );
+    virtual void setSelectable( bool s );
+
+    bool isSelected() const;
+    bool isSelectable() const;
+
+    virtual void repaint();
+
+    virtual bool move( int x, int y );
+    virtual void moveBy( int dx, int dy );
+    virtual bool move( const QPoint &pnt );
+    virtual void moveBy( const QPoint &pnt );
+
+    QRect rect() const;
+    int x() const;
+    int y() const;
+    int width() const;
+    int height() const;
+    QSize size() const;
+    QPoint pos() const;
+    QRect textRect( bool relative = TRUE ) const;
+    QRect pixmapRect( bool relative = TRUE ) const;
+    bool contains( const QPoint& pnt ) const;
+    bool intersects( const QRect& r ) const;
+
+    virtual bool acceptDrop( const QMimeSource *mime ) const;
+
+#ifndef QT_NO_TEXTEDIT
+    void rename();
+#endif
+
+    virtual int compare( QIconViewItem *i ) const;
+
+    virtual void setText( const QString &text );
+    virtual void setPixmap( const QPixmap &icon );
+#ifndef QT_NO_PICTURE
+    virtual void setPicture( const QPicture &icon );
+#endif
+    virtual void setText( const QString &text, bool recalc, bool redraw = TRUE );
+    virtual void setPixmap( const QPixmap &icon, bool recalc, bool redraw = TRUE );
+    virtual void setKey( const QString &k );
+
+    virtual int rtti() const;
+    static int RTTI;
+
+protected:
+#ifndef QT_NO_TEXTEDIT
+    virtual void removeRenameBox();
+#endif
+    virtual void calcRect( const QString &text_ = QString::null );
+    virtual void paintItem( QPainter *p, const QColorGroup &cg );
+    virtual void paintFocus( QPainter *p, const QColorGroup &cg );
+#ifndef QT_NO_DRAGANDDROP
+    virtual void dropped( QDropEvent *e, const QValueList<QIconDragItem> &lst );
+#endif
+    virtual void dragEntered();
+    virtual void dragLeft();
+    void setItemRect( const QRect &r );
+    void setTextRect( const QRect &r );
+    void setPixmapRect( const QRect &r );
+    void calcTmpText();
+    QString tempText() const;
+
+private:
+    void init( QIconViewItem *after = 0
+#ifndef QT_NO_PICTURE
+	       , QPicture *pic = 0
+#endif
+	       );
+#ifndef QT_NO_TEXTEDIT
+    void renameItem();
+    void cancelRenameItem();
+#endif
+    void checkRect();
+
+    QIconView *view;
+    QString itemText, itemKey;
+    QString tmpText;
+    QPixmap *itemIcon;
+#ifndef QT_NO_PICTURE
+    QPicture *itemPic;
+#endif
+    QIconViewItem *prev, *next;
+    uint allow_rename : 1;
+    uint allow_drag : 1;
+    uint allow_drop : 1;
+    uint selected : 1;
+    uint selectable : 1;
+    uint dirty : 1;
+    uint wordWrapDirty : 1;
+    QRect itemRect, itemTextRect, itemIconRect;
+#ifndef QT_NO_TEXTEDIT
+    QIconViewItemLineEdit *renameBox;
+#endif
+    QRect oldRect;
+
+    QIconViewItemPrivate *d;
+
+};
+
+class QIconViewPrivate;          /* don't touch */
+
+class QM_EXPORT_ICONVIEW QIconView : public QScrollView
+{
+    friend class QIconViewItem;
+    friend class QIconViewPrivate;
+    friend class QIconViewToolTip;
+
+    Q_OBJECT
+    // #### sorting and sort direction do not work
+    Q_ENUMS( SelectionMode ItemTextPos Arrangement ResizeMode )
+    Q_PROPERTY( bool sorting READ sorting )
+    Q_PROPERTY( bool sortDirection READ sortDirection )
+    Q_PROPERTY( SelectionMode selectionMode READ selectionMode WRITE setSelectionMode )
+    Q_PROPERTY( int gridX READ gridX WRITE setGridX )
+    Q_PROPERTY( int gridY READ gridY WRITE setGridY )
+    Q_PROPERTY( int spacing READ spacing WRITE setSpacing )
+    Q_PROPERTY( ItemTextPos itemTextPos READ itemTextPos WRITE setItemTextPos )
+    Q_PROPERTY( QBrush itemTextBackground READ itemTextBackground WRITE setItemTextBackground )
+    Q_PROPERTY( Arrangement arrangement READ arrangement WRITE setArrangement )
+    Q_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode )
+    Q_PROPERTY( int maxItemWidth READ maxItemWidth WRITE setMaxItemWidth )
+    Q_PROPERTY( int maxItemTextLength READ maxItemTextLength WRITE setMaxItemTextLength )
+    Q_PROPERTY( bool autoArrange READ autoArrange WRITE setAutoArrange )
+    Q_PROPERTY( bool itemsMovable READ itemsMovable WRITE setItemsMovable )
+    Q_PROPERTY( bool wordWrapIconText READ wordWrapIconText WRITE setWordWrapIconText )
+    Q_PROPERTY( bool showToolTips READ showToolTips WRITE setShowToolTips )
+    Q_PROPERTY( uint count READ count )
+
+public:
+    enum SelectionMode {
+	Single = 0,
+	Multi,
+	Extended,
+	NoSelection
+    };
+    enum Arrangement {
+	LeftToRight = 0,
+	TopToBottom
+    };
+    enum ResizeMode {
+	Fixed = 0,
+	Adjust
+    };
+    enum ItemTextPos {
+	Bottom = 0,
+	Right
+    };
+
+    QIconView( QWidget* parent=0, const char* name=0, WFlags f = 0 );
+    virtual ~QIconView();
+
+    virtual void insertItem( QIconViewItem *item, QIconViewItem *after = 0L );
+    virtual void takeItem( QIconViewItem *item );
+
+    int index( const QIconViewItem *item ) const;
+
+    QIconViewItem *firstItem() const;
+    QIconViewItem *lastItem() const;
+    QIconViewItem *currentItem() const;
+    virtual void setCurrentItem( QIconViewItem *item );
+    virtual void setSelected( QIconViewItem *item, bool s, bool cb = FALSE );
+
+    uint count() const;
+
+public:
+    virtual void showEvent( QShowEvent * );
+
+    virtual void setSelectionMode( SelectionMode m );
+    SelectionMode selectionMode() const;
+
+    QIconViewItem *findItem( const QPoint &pos ) const;
+    QIconViewItem *findItem( const QString &text, ComparisonFlags compare = BeginsWith ) const;
+    virtual void selectAll( bool select );
+    virtual void clearSelection();
+    virtual void invertSelection();
+
+    virtual void repaintItem( QIconViewItem *item );
+    void repaintSelectedItems();
+
+    void ensureItemVisible( QIconViewItem *item );
+    QIconViewItem* findFirstVisibleItem( const QRect &r ) const;
+    QIconViewItem* findLastVisibleItem( const QRect &r ) const;
+
+    virtual void clear();
+
+    virtual void setGridX( int rx );
+    virtual void setGridY( int ry );
+    int gridX() const;
+    int gridY() const;
+    virtual void setSpacing( int sp );
+    int spacing() const;
+    virtual void setItemTextPos( ItemTextPos pos );
+    ItemTextPos itemTextPos() const;
+    virtual void setItemTextBackground( const QBrush &b );
+    QBrush itemTextBackground() const;
+    virtual void setArrangement( Arrangement am );
+    Arrangement arrangement() const;
+    virtual void setResizeMode( ResizeMode am );
+    ResizeMode resizeMode() const;
+    virtual void setMaxItemWidth( int w );
+    int maxItemWidth() const;
+    virtual void setMaxItemTextLength( int w );
+    int maxItemTextLength() const;
+    virtual void setAutoArrange( bool b );
+    bool autoArrange() const;
+    virtual void setShowToolTips( bool b );
+    bool showToolTips() const;
+
+    void setSorting( bool sort, bool ascending = TRUE );
+    bool sorting() const;
+    bool sortDirection() const;
+
+    virtual void setItemsMovable( bool b );
+    bool itemsMovable() const;
+    virtual void setWordWrapIconText( bool b );
+    bool wordWrapIconText() const;
+
+    bool eventFilter( QObject * o, QEvent * );
+
+    QSize minimumSizeHint() const;
+    QSize sizeHint() const;
+
+    virtual void sort( bool ascending = TRUE );
+
+    virtual void setFont( const QFont & );
+    virtual void setPalette( const QPalette & );
+
+    bool isRenaming() const;
+
+public slots:
+    virtual void arrangeItemsInGrid( const QSize &grid, bool update = TRUE );
+    virtual void arrangeItemsInGrid( bool update = TRUE );
+    virtual void setContentsPos( int x, int y );
+    virtual void updateContents();
+
+signals:
+    void selectionChanged();
+    void selectionChanged( QIconViewItem *item );
+    void currentChanged( QIconViewItem *item );
+    void clicked( QIconViewItem * );
+    void clicked( QIconViewItem *, const QPoint & );
+    void pressed( QIconViewItem * );
+    void pressed( QIconViewItem *, const QPoint & );
+
+    void doubleClicked( QIconViewItem *item );
+    void returnPressed( QIconViewItem *item );
+    void rightButtonClicked( QIconViewItem* item, const QPoint& pos );
+    void rightButtonPressed( QIconViewItem* item, const QPoint& pos );
+    void mouseButtonPressed( int button, QIconViewItem* item, const QPoint& pos );
+    void mouseButtonClicked( int button, QIconViewItem* item, const QPoint& pos );
+    void contextMenuRequested( QIconViewItem* item, const QPoint &pos );
+
+#ifndef QT_NO_DRAGANDDROP
+    void dropped( QDropEvent *e, const QValueList<QIconDragItem> &lst );
+#endif
+    void moved();
+    void onItem( QIconViewItem *item );
+    void onViewport();
+    void itemRenamed( QIconViewItem *item, const QString & );
+    void itemRenamed( QIconViewItem *item );
+
+protected slots:
+    virtual void doAutoScroll();
+    virtual void adjustItems();
+    virtual void slotUpdate();
+
+private slots:
+    void movedContents( int dx, int dy );
+
+protected:
+    void drawContents( QPainter *p, int cx, int cy, int cw, int ch );
+    void contentsMousePressEvent( QMouseEvent *e );
+    void contentsMouseReleaseEvent( QMouseEvent *e );
+    void contentsMouseMoveEvent( QMouseEvent *e );
+    void contentsMouseDoubleClickEvent( QMouseEvent *e );
+    void contentsContextMenuEvent( QContextMenuEvent *e );
+
+#ifndef QT_NO_DRAGANDDROP
+    void contentsDragEnterEvent( QDragEnterEvent *e );
+    void contentsDragMoveEvent( QDragMoveEvent *e );
+    void contentsDragLeaveEvent( QDragLeaveEvent *e );
+    void contentsDropEvent( QDropEvent *e );
+#endif
+
+    void resizeEvent( QResizeEvent* e );
+    void keyPressEvent( QKeyEvent *e );
+    void focusInEvent( QFocusEvent *e );
+    void focusOutEvent( QFocusEvent *e );
+    void enterEvent( QEvent *e );
+
+    virtual void drawRubber( QPainter *p );
+#ifndef QT_NO_DRAGANDDROP
+    virtual QDragObject *dragObject();
+    virtual void startDrag();
+#endif
+    virtual void insertInGrid( QIconViewItem *item );
+    virtual void drawBackground( QPainter *p, const QRect &r );
+
+    void emitSelectionChanged( QIconViewItem * i = 0 );
+    void emitRenamed( QIconViewItem *item );
+
+    QIconViewItem *makeRowLayout( QIconViewItem *begin, int &y, bool &changed );
+
+    void styleChange( QStyle& );
+    void windowActivationChange( bool );
+
+private:
+    void contentsMousePressEventEx( QMouseEvent *e );
+    virtual void drawDragShapes( const QPoint &pnt );
+#ifndef QT_NO_DRAGANDDROP
+    virtual void initDragEnter( QDropEvent *e );
+#endif
+    void drawContents( QPainter* );
+    QIconViewItem* findItemByName( QIconViewItem *start );
+    void handleItemChange( QIconViewItem *old, bool shift,
+			   bool control, bool homeend = FALSE);
+
+    int calcGridNum( int w, int x ) const;
+    QIconViewItem *rowBegin( QIconViewItem *item ) const;
+    void updateItemContainer( QIconViewItem *item );
+    void appendItemContainer();
+    void rebuildContainers();
+    enum Direction {
+	DirUp = 0,
+	DirDown,
+	DirLeft,
+	DirRight
+    };
+    QIconViewItem* findItem( Direction dir,
+			     const QPoint &relativeTo,
+			     const QRect &searchRect ) const;
+    bool neighbourItem( Direction dir,
+			const QPoint &relativeTo,
+			const QIconViewItem *item ) const;
+    QBitmap mask( QPixmap *pix ) const;
+
+    QIconViewPrivate *d;
+
+private:	// Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+    QIconView( const QIconView & );
+    QIconView& operator=( const QIconView & );
+#endif
+};
+
+#endif // QT_NO_ICONVIEW
+
+#endif // QICONVIEW_H
Index: trunk/include/qt.h
===================================================================
--- trunk/include/qt.h	(revision 164)
+++ trunk/include/qt.h	(revision 164)
@@ -0,0 +1,371 @@
+/****************************************************************************
+**
+** Qt GUI Toolkit
+**
+** This header file efficiently includes all Qt GUI Toolkit functionality.
+**
+** Generated : Mon Oct 13 13:07:29 CEST 2003
+
+**
+** Copyright (C) 1995-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+*****************************************************************************/
+
+#ifndef QT_H
+#define QT_H
+#include "qglobal.h"
+#include "qfeatures.h"
+#include "qshared.h"
+#include "qptrcollection.h"
+#include "qglist.h"
+#include "qobjectdefs.h"
+#include "qnamespace.h"
+#include "qgarray.h"
+#include "qmemarray.h"
+#include "qcstring.h"
+#include "qstring.h"
+#include "qptrlist.h"
+#include "qiodevice.h"
+#include "qkeysequence.h"
+#include "qwindowdefs.h"
+#include "qgdict.h"
+#include "qfont.h"
+#include "qdatastream.h"
+#include "qpair.h"
+#include "qpoint.h"
+#include <stdio.h>
+#include "qtextstream.h"
+#include "qfontinfo.h"
+#include "qsizepolicy.h"
+#include "qtl.h"
+#include "qsize.h"
+#include "qrect.h"
+#include "qbitarray.h"
+#include "qregion.h"
+#include "qsql.h"
+#include "qstrlist.h"
+#include "qvaluelist.h"
+#include "qmap.h"
+#include "qdatetime.h"
+#include "qmime.h"
+#include "qasciidict.h"
+#include "qpaintdevice.h"
+#include "qfontmetrics.h"
+#include "qdict.h"
+#include "qevent.h"
+#include "qhostaddress.h"
+#include "qstringlist.h"
+#include "qcolor.h"
+#include <qdom.h>
+#include "qobject.h"
+#include <qdrawutil.h>
+#include "qbrush.h"
+#include "qpalette.h"
+#include "qwidget.h"
+#include "qjpunicode.h"
+#include "qtextcodec.h"
+#include "qstyle.h"
+#include "qframe.h"
+#include "qfile.h"
+#include "qfileinfo.h"
+#include "qurlinfo.h"
+#include "qwidgetlist.h"
+#include <qcombobox.h>
+#include "qgroupbox.h"
+#include "qdialog.h"
+#include <qdataview.h>
+#include "qdockwindow.h"
+#include "qcommonstyle.h"
+#include "qnetworkprotocol.h"
+#include <qeuckrcodec.h>
+#include <qgb18030codec.h>
+#include "qgcache.h"
+#include "qpixmap.h"
+#include <qgif.h>
+#include <qglcolormap.h>
+#include <qcache.h>
+#include <qdropsite.h>
+#include "qgplugin.h"
+#include <qgrid.h>
+#include "qrangecontrol.h"
+#include "qbuttongroup.h"
+#include <qdatetimeedit.h>
+#include "qgvector.h"
+#include "qhbox.h"
+#include <qhbuttongroup.h>
+#include "qiconset.h"
+#include <qhgroupbox.h>
+#include "qsocketnotifier.h"
+#include <qeventloop.h>
+#include <qhttp.h>
+#include <qaction.h>
+#include "qbuffer.h"
+#include "qimage.h"
+#include <qimageformatplugin.h>
+#include "qlineedit.h"
+#include <qintcache.h>
+#include "qintdict.h"
+#include "qmotifstyle.h"
+#include "qpicture.h"
+#include <qjiscodec.h>
+#include <qeucjpcodec.h>
+#include <qkeycode.h>
+#include <qaccel.h>
+#include "qlabel.h"
+#include "qlayout.h"
+#include <qlcdnumber.h>
+#include <qlibrary.h>
+#include <qinputdialog.h>
+#include "qscrollbar.h"
+#include "qscrollview.h"
+#include "qdir.h"
+#include "qwindowsstyle.h"
+#include "qconnection.h"
+#include "qbitmap.h"
+#include "qvariant.h"
+#include "qsignal.h"
+#include <qmessagebox.h>
+#include "qmetaobject.h"
+#include "qheader.h"
+#include <qmotifplusstyle.h>
+#include <qcdestyle.h>
+#include <qmovie.h>
+#include "qptrvector.h"
+#include "qmutex.h"
+#include "qbutton.h"
+#include <qnetwork.h>
+#include <qftp.h>
+#include "qguardedptr.h"
+#include <qobjectcleanuphandler.h>
+#include "qsqlfield.h"
+#include <qobjectdict.h>
+#include <qobjectlist.h>
+#include <qcolordialog.h>
+#include <qpaintdevicemetrics.h>
+#include "qpointarray.h"
+#include "qmenudata.h"
+#include <qlistview.h>
+#include "qpen.h"
+#include "qdragobject.h"
+#include <qiconview.h>
+#include <qpixmapcache.h>
+#include <qplatinumstyle.h>
+#include <qpngio.h>
+#include <qcursor.h>
+#include <qerrormessage.h>
+#include <qpolygonscanner.h>
+#include "qpopupmenu.h"
+#include <qprintdialog.h>
+#include <qprinter.h>
+#include <qprocess.h>
+#include "qprogressbar.h"
+#include "qsemimodal.h"
+#include <qasciicache.h>
+#include "qptrdict.h"
+#include <qcleanuphandler.h>
+#include <qptrqueue.h>
+#include <qptrstack.h>
+#include "qstylesheet.h"
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qdial.h>
+#include <qdockarea.h>
+#include "qregexp.h"
+#include <qclipboard.h>
+#include <qrtlcodec.h>
+#include <qlistbox.h>
+#include <qgridview.h>
+#include "qsemaphore.h"
+#include <qprogressdialog.h>
+#include "qsocketdevice.h"
+#include <qsessionmanager.h>
+#include <qsettings.h>
+#include <qsgistyle.h>
+#include <qfontdialog.h>
+#include "qtimer.h"
+#include <qsignalmapper.h>
+#include <qsignalslotimp.h>
+#include <qsimplerichtext.h>
+#include "qwmatrix.h"
+#include <qsizegrip.h>
+#include <qabstractlayout.h>
+#include <qsjiscodec.h>
+#include <qslider.h>
+#include <qsocket.h>
+#include <qserversocket.h>
+#include <qdns.h>
+#include <qsortedlist.h>
+#include <qsound.h>
+#include <qspinbox.h>
+#include <qsplashscreen.h>
+#include <qsplitter.h>
+#include "qsqlerror.h"
+#include "qeditorfactory.h"
+#include "qsqlquery.h"
+#include "qsqlrecord.h"
+#include <qsqldriverplugin.h>
+#include "qsqlindex.h"
+#include "qsqlcursor.h"
+#include <qsqldriver.h>
+#include <qsqlform.h>
+#include "qtable.h"
+#include <qsqlpropertymap.h>
+#include <qsqldatabase.h>
+#include <qdatabrowser.h>
+#include <qsqlresult.h>
+#include <qsqlselectcursor.h>
+#include <qstatusbar.h>
+#include <qmenubar.h>
+#include <qcanvas.h>
+#include "qtranslator.h"
+#include <qstrvec.h>
+#include <qinterlacestyle.h>
+#include <qstylefactory.h>
+#include <qstyleplugin.h>
+#include "qtextedit.h"
+#include <qsyntaxhighlighter.h>
+#include <qtabbar.h>
+#include <qtabdialog.h>
+#include "qsqleditorfactory.h"
+#include <qtabwidget.h>
+#include <qtextbrowser.h>
+#include <qbig5codec.h>
+#include <qtextcodecfactory.h>
+#include <qtextcodecplugin.h>
+#include <qmultilineedit.h>
+#include "qtoolbar.h"
+#include <qtextview.h>
+#include "qwaitcondition.h"
+#include <qasyncio.h>
+#include <qfontdatabase.h>
+#include <qmainwindow.h>
+#include <qtoolbox.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+#include "qdesktopwidget.h"
+#include <qtsciicodec.h>
+#include "qurl.h"
+#include "qurloperator.h"
+#include <qfiledialog.h>
+#include <qutfcodec.h>
+#include <quuid.h>
+#include <qvalidator.h>
+#include <qasyncimageio.h>
+#include <qvaluestack.h>
+#include <qvaluevector.h>
+#include <qdatatable.h>
+#include <qvbox.h>
+#include <qvbuttongroup.h>
+#include <qvfbhdr.h>
+#include <qvgroupbox.h>
+#include <qthread.h>
+#include <qwhatsthis.h>
+#include <qapplication.h>
+#include <qwidgetintdict.h>
+#include <qfocusdata.h>
+#include <qwidgetplugin.h>
+#include <qwidgetstack.h>
+#include <qcheckbox.h>
+#include <qcompactstyle.h>
+#include <qwizard.h>
+#include <qpainter.h>
+#include <qworkspace.h>
+#include <qlocalfs.h>
+#include <qxml.h>
+
+#if defined( QT_MOC_CPP ) || defined( QT_H_CPP ) || defined( Q_OS_MACX )
+#include <private/qcom_p.h>
+#include <private/qucom_p.h>
+#include "private/qgfxdriverinterface_p.h"
+#include "private/qcom_p.h"
+#include "private/qimageformatinterface_p.h"
+#include "private/qisciicodec_p.h"
+#include "private/qkbddriverinterface_p.h"
+#include "private/qlayoutengine_p.h"
+#include "private/qcomlibrary_p.h"
+#include "private/qmousedriverinterface_p.h"
+#include "private/qeffects_p.h"
+#include "private/qgpluginmanager_p.h"
+#include "private/qinternal_p.h"
+#include "private/qsqldriverinterface_p.h"
+#include "private/qsqlmanager_p.h"
+#include "private/qlock_p.h"
+#include "private/qcomponentfactory_p.h"
+#include "private/qstyleinterface_p.h"
+#include "private/qrichtext_p.h"
+#include "private/qsvgdevice_p.h"
+#include "private/qfontcodecs_p.h"
+#include "private/qtextcodecinterface_p.h"
+#include "private/qpsprinter_p.h"
+#include "private/qtitlebar_p.h"
+#include "private/qucom_p.h"
+#include "private/qucomextra_p.h"
+#include "private/qpluginmanager_p.h"
+#include "private/qdir_p.h"
+#include "private/qsettings_p.h"
+#include "private/qsqlextension_p.h"
+#include "private/qdialogbuttons_p.h"
+#include "private/qwidgetinterface_p.h"
+#include "private/qwidgetresizehandler_p.h"
+#include "private/qlibrary_p.h"
+#endif // Private headers
+
+
+#ifdef Q_WS_MAC
+#include <qaquastyle.h>
+#include <qmacstyle_mac.h>
+#endif // Q_WS_MAC
+
+#ifdef Q_WS_WIN
+#include <qwindowsxpstyle.h>
+#endif
+
+#ifdef Q_WS_QWS
+#include <private/qtextengine_p.h>
+#include "qfontmanager_qws.h"
+#include <qfontfactorybdf_qws.h>
+#include <qgfxvoodoodefs_qws.h>
+#include <qgfxmatroxdefs_qws.h>
+#include <qgfxdriverplugin_qws.h>
+#include <qkbddriverfactory_qws.h>
+#include <qkbddriverplugin_qws.h>
+#include <qmousedriverfactory_qws.h>
+#include <qmousedriverplugin_qws.h>
+#include <qcopchannel_qws.h>
+#include <qdirectpainter_qws.h>
+#include "qmemorymanager_qws.h"
+#include <qmouse_qws.h>
+#include <qfontfactoryttf_qws.h>
+#ifndef Q_OS_MAC
+# include <qsoundqss_qws.h>
+#endif
+#include "qgfx_qws.h"
+#include <qgfxdriverfactory_qws.h>
+#include "qwsdisplay_qws.h"
+#include "qwssocket_qws.h"
+#include "qwsdecoration_qws.h"
+#include "qwsutils_qws.h"
+#include <qwscursor_qws.h>
+#include "qwsmanager_qws.h"
+#include "qwsdefaultdecoration_qws.h"
+#include <qgfxraster_qws.h>
+#include "qwscommand_qws.h"
+#include <qwshydrodecoration_qws.h>
+#include <qwskde2decoration_qws.h>
+#include <qwskdedecoration_qws.h>
+#include <qwsbeosdecoration_qws.h>
+#include "qwsproperty_qws.h"
+#include <qwsregionmanager_qws.h>
+#include "qwsevent_qws.h"
+#include <qwindowsystem_qws.h>
+#include <qwswindowsdecoration_qws.h>
+#endif // Q_WS_QWS
+
+
+#ifdef Q_WS_WCE
+#include <qpocketpcstyle_wce.h>
+#endif // Q_WS_WCE
+
+#endif // QT_H
Index: trunk/include/qtable.h
===================================================================
--- trunk/include/qtable.h	(revision 164)
+++ trunk/include/qtable.h	(revision 164)
@@ -0,0 +1,560 @@
+/****************************************************************************
+**
+** Definition of QTable widget class
+**
+** Created : 000607
+**
+** Copyright (C) 1992-2002 Trolltech AS.  All rights reserved.
+**
+** This file is part of the table module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QTABLE_H
+#define QTABLE_H
+
+#ifndef QT_H
+#include "qscrollview.h"
+#include "qpixmap.h"
+#include "qptrvector.h"
+#include "qheader.h"
+#include "qmemarray.h"
+#include "qptrlist.h"
+#include "qguardedptr.h"
+#include "qshared.h"
+#include "qintdict.h"
+#include "qstringlist.h"
+#endif // QT_H
+
+
+#ifndef QT_NO_TABLE
+
+#if !defined( QT_MODULE_TABLE ) || defined( QT_LICENSE_PROFESSIONAL ) || defined( QT_INTERNAL_TABLE )
+#define QM_EXPORT_TABLE
+#ifndef QM_TEMPLATE_EXTERN_TABLE
+#   define QM_TEMPLATE_EXTERN_TABLE
+#endif
+#else
+#define QM_EXPORT_TABLE Q_EXPORT
+#define QM_TEMPLATE_EXTERN_TABLE Q_TEMPLATE_EXTERN
+#endif
+
+class QTableHeader;
+class QValidator;
+class QTable;
+class QPaintEvent;
+class QTimer;
+class QResizeEvent;
+class QComboBox;
+class QCheckBox;
+class QDragObject;
+
+struct QTablePrivate;
+struct QTableHeaderPrivate;
+
+
+class QM_EXPORT_TABLE QTableSelection
+{
+public:
+    QTableSelection();
+    QTableSelection( int start_row, int start_col, int end_row, int end_col );
+    void init( int row, int col );
+    void expandTo( int row, int col );
+    bool operator==( const QTableSelection &s ) const;
+    bool operator!=( const QTableSelection &s ) const { return !(operator==(s)); }
+
+    int topRow() const { return tRow; }
+    int bottomRow() const { return bRow; }
+    int leftCol() const { return lCol; }
+    int rightCol() const { return rCol; }
+    int anchorRow() const { return aRow; }
+    int anchorCol() const { return aCol; }
+    int numRows() const;
+    int numCols() const;
+
+    bool isActive() const { return active; }
+    bool isEmpty() const { return numRows() == 0; }
+
+private:
+    uint active : 1;
+    uint inited : 1;
+    int tRow, lCol, bRow, rCol;
+    int aRow, aCol;
+};
+
+#define Q_DEFINED_QTABLE_SELECTION
+#include "qwinexport.h"
+
+class QM_EXPORT_TABLE QTableItem : public Qt
+{
+    friend class QTable;
+
+public:
+    enum EditType { Never, OnTyping, WhenCurrent, Always };
+
+    QTableItem( QTable *table, EditType et );
+    QTableItem( QTable *table, EditType et, const QString &text );
+    QTableItem( QTable *table, EditType et, const QString &text,
+                const QPixmap &p );
+    virtual ~QTableItem();
+
+    virtual QPixmap pixmap() const;
+    virtual QString text() const;
+    virtual void setPixmap( const QPixmap &p );
+    virtual void setText( const QString &t );
+    QTable *table() const { return t; }
+
+    virtual int alignment() const;
+    virtual void setWordWrap( bool b );
+    bool wordWrap() const;
+
+    EditType editType() const;
+    virtual QWidget *createEditor() const;
+    virtual void setContentFromEditor( QWidget *w );
+    virtual void setReplaceable( bool );
+    bool isReplaceable() const;
+
+    virtual QString key() const;
+    virtual QSize sizeHint() const;
+
+    virtual void setSpan( int rs, int cs );
+    int rowSpan() const;
+    int colSpan() const;
+
+    virtual void setRow( int r );
+    virtual void setCol( int c );
+    int row() const;
+    int col() const;
+
+    virtual void paint( QPainter *p, const QColorGroup &cg,
+                        const QRect &cr, bool selected );
+
+    void updateEditor( int oldRow, int oldCol );
+
+    virtual void setEnabled( bool b );
+    bool isEnabled() const;
+
+    virtual int rtti() const;
+    static int RTTI;
+
+private:
+    QString txt;
+    QPixmap pix;
+    QTable *t;
+    EditType edType;
+    uint wordwrap : 1;
+    uint tcha : 1;
+    uint enabled : 1;
+    int rw, cl;
+    int rowspan, colspan;
+#if (QT_VERSION >= 0x040000)
+#error "Add a setAlignment() function in 4.0 (but no d pointer)"
+#endif
+};
+
+#define Q_DEFINED_QTABLE_ITEM
+#include "qwinexport.h"
+
+class QM_EXPORT_TABLE QComboTableItem : public QTableItem
+{
+public:
+    QComboTableItem( QTable *table, const QStringList &list, bool editable = FALSE );
+    ~QComboTableItem();
+    virtual QWidget *createEditor() const;
+    virtual void setContentFromEditor( QWidget *w );
+    virtual void paint( QPainter *p, const QColorGroup &cg,
+                        const QRect &cr, bool selected );
+    virtual void setCurrentItem( int i );
+    virtual void setCurrentItem( const QString &i );
+    int currentItem() const;
+    QString currentText() const;
+    int count() const;
+#if !defined(Q_NO_USING_KEYWORD)
+    using QTableItem::text;
+#endif
+    QString text( int i ) const;
+    virtual void setEditable( bool b );
+    bool isEditable() const;
+    virtual void setStringList( const QStringList &l );
+
+    int rtti() const;
+    static int RTTI;
+
+    QSize sizeHint() const;
+
+private:
+    QComboBox *cb;
+    QStringList entries;
+    int current;
+    bool edit;
+    static QComboBox *fakeCombo;
+    static QWidget *fakeComboWidget;
+    static int fakeRef;
+
+};
+
+class QM_EXPORT_TABLE QCheckTableItem : public QTableItem
+{
+public:
+    QCheckTableItem( QTable *table, const QString &txt );
+    void setText( const QString &t );
+    virtual QWidget *createEditor() const;
+    virtual void setContentFromEditor( QWidget *w );
+    virtual void paint( QPainter *p, const QColorGroup &cg,
+                        const QRect &cr, bool selected );
+    virtual void setChecked( bool b );
+    bool isChecked() const;
+
+    int rtti() const;
+    static int RTTI;
+
+    QSize sizeHint() const;
+
+private:
+    QCheckBox *cb;
+    bool checked;
+
+};
+
+class QM_EXPORT_TABLE QTable : public QScrollView
+{
+    Q_OBJECT
+    Q_ENUMS( SelectionMode FocusStyle )
+    Q_PROPERTY( int numRows READ numRows WRITE setNumRows )
+    Q_PROPERTY( int numCols READ numCols WRITE setNumCols )
+    Q_PROPERTY( bool showGrid READ showGrid WRITE setShowGrid )
+    Q_PROPERTY( bool rowMovingEnabled READ rowMovingEnabled WRITE setRowMovingEnabled )
+    Q_PROPERTY( bool columnMovingEnabled READ columnMovingEnabled WRITE setColumnMovingEnabled )
+    Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly )
+    Q_PROPERTY( bool sorting READ sorting WRITE setSorting )
+    Q_PROPERTY( SelectionMode selectionMode READ selectionMode WRITE setSelectionMode )
+    Q_PROPERTY( FocusStyle focusStyle READ focusStyle WRITE setFocusStyle )
+    Q_PROPERTY( int numSelections READ numSelections )
+
+    friend class QTableHeader;
+    friend class QComboTableItem;
+    friend class QCheckTableItem;
+    friend class QTableItem;
+
+public:
+    QTable( QWidget* parent=0, const char* name=0 );
+    QTable( int numRows, int numCols,
+            QWidget* parent=0, const char* name=0 );
+    ~QTable();
+
+    QHeader *horizontalHeader() const;
+    QHeader *verticalHeader() const;
+
+    enum SelectionMode { Single, Multi, SingleRow, MultiRow, NoSelection };
+    virtual void setSelectionMode( SelectionMode mode );
+    SelectionMode selectionMode() const;
+
+    virtual void setItem( int row, int col, QTableItem *item );
+    virtual void setText( int row, int col, const QString &text );
+    virtual void setPixmap( int row, int col, const QPixmap &pix );
+    virtual QTableItem *item( int row, int col ) const;
+    virtual QString text( int row, int col ) const;
+    virtual QPixmap pixmap( int row, int col ) const;
+    virtual void clearCell( int row, int col );
+
+    virtual QRect cellGeometry( int row, int col ) const;
+    virtual int columnWidth( int col ) const;
+    virtual int rowHeight( int row ) const;
+    virtual int columnPos( int col ) const;
+    virtual int rowPos( int row ) const;
+    virtual int columnAt( int x ) const;
+    virtual int rowAt( int y ) const;
+
+    virtual int numRows() const;
+    virtual int numCols() const;
+
+    void updateCell( int row, int col );
+
+    bool eventFilter( QObject * o, QEvent * );
+
+    int currentRow() const { return curRow; }
+    int currentColumn() const { return curCol; }
+    void ensureCellVisible( int row, int col );
+
+    bool isSelected( int row, int col ) const;
+    bool isRowSelected( int row, bool full = FALSE ) const;
+    bool isColumnSelected( int col, bool full = FALSE ) const;
+    int numSelections() const;
+    QTableSelection selection( int num ) const;
+    virtual int addSelection( const QTableSelection &s );
+    virtual void removeSelection( const QTableSelection &s );
+    virtual void removeSelection( int num );
+    virtual int currentSelection() const;
+
+    void selectCells( int start_row, int start_col, int end_row, int end_col );
+    void selectRow( int row );
+    void selectColumn( int col );
+
+    bool showGrid() const;
+
+    bool columnMovingEnabled() const;
+    bool rowMovingEnabled() const;
+
+    virtual void sortColumn( int col, bool ascending = TRUE,
+                             bool wholeRows = FALSE );
+    bool sorting() const;
+
+    virtual void takeItem( QTableItem *i );
+
+    virtual void setCellWidget( int row, int col, QWidget *e );
+    virtual QWidget *cellWidget( int row, int col ) const;
+    virtual void clearCellWidget( int row, int col );
+
+    virtual QRect cellRect( int row, int col ) const;
+
+    virtual void paintCell( QPainter *p, int row, int col,
+                            const QRect &cr, bool selected );
+    virtual void paintCell( QPainter *p, int row, int col,
+                            const QRect &cr, bool selected, const QColorGroup &cg );
+    virtual void paintFocus( QPainter *p, const QRect &r );
+    QSize sizeHint() const;
+
+    bool isReadOnly() const;
+    bool isRowReadOnly( int row ) const;
+    bool isColumnReadOnly( int col ) const;
+
+    void setEnabled( bool b );
+
+    void repaintSelections();
+
+    enum FocusStyle { FollowStyle, SpreadSheet };
+    virtual void setFocusStyle( FocusStyle fs );
+    FocusStyle focusStyle() const;
+
+    void updateHeaderStates();
+
+public slots:
+    virtual void setNumRows( int r );
+    virtual void setNumCols( int r );
+    virtual void setShowGrid( bool b );
+    virtual void hideRow( int row );
+    virtual void hideColumn( int col );
+    virtual void showRow( int row );
+    virtual void showColumn( int col );
+    bool isRowHidden( int row ) const;
+    bool isColumnHidden( int col ) const;
+
+    virtual void setColumnWidth( int col, int w );
+    virtual void setRowHeight( int row, int h );
+
+    virtual void adjustColumn( int col );
+    virtual void adjustRow( int row );
+
+    virtual void setColumnStretchable( int col, bool stretch );
+    virtual void setRowStretchable( int row, bool stretch );
+    bool isColumnStretchable( int col ) const;
+    bool isRowStretchable( int row ) const;
+    virtual void setSorting( bool b );
+    virtual void swapRows( int row1, int row2, bool swapHeader = FALSE );
+    virtual void swapColumns( int col1, int col2, bool swapHeader = FALSE );
+    virtual void swapCells( int row1, int col1, int row2, int col2 );
+
+    virtual void setLeftMargin( int m );
+    virtual void setTopMargin( int m );
+    virtual void setCurrentCell( int row, int col );
+    void clearSelection( bool repaint = TRUE );
+    virtual void setColumnMovingEnabled( bool b );
+    virtual void setRowMovingEnabled( bool b );
+
+    virtual void setReadOnly( bool b );
+    virtual void setRowReadOnly( int row, bool ro );
+    virtual void setColumnReadOnly( int col, bool ro );
+
+    virtual void setDragEnabled( bool b );
+    bool dragEnabled() const;
+
+    virtual void insertRows( int row, int count = 1 );
+    virtual void insertColumns( int col, int count = 1 );
+    virtual void removeRow( int row );
+    virtual void removeRows( const QMemArray<int> &rows );
+    virtual void removeColumn( int col );
+    virtual void removeColumns( const QMemArray<int> &cols );
+
+    virtual void editCell( int row, int col, bool replace = FALSE );
+
+    void setRowLabels( const QStringList &labels );
+    void setColumnLabels( const QStringList &labels );
+
+protected:
+    enum EditMode { NotEditing, Editing, Replacing };
+    void drawContents( QPainter *p, int cx, int cy, int cw, int ch );
+    void contentsMousePressEvent( QMouseEvent* );
+    void contentsMouseMoveEvent( QMouseEvent* );
+    void contentsMouseDoubleClickEvent( QMouseEvent* );
+    void contentsMouseReleaseEvent( QMouseEvent* );
+    void contentsContextMenuEvent( QContextMenuEvent * e );
+    void keyPressEvent( QKeyEvent* );
+    void focusInEvent( QFocusEvent* );
+    void focusOutEvent( QFocusEvent* );
+    void viewportResizeEvent( QResizeEvent * );
+    void showEvent( QShowEvent *e );
+    void paintEvent( QPaintEvent *e );
+    void setEditMode( EditMode mode, int row, int col );
+#ifndef QT_NO_DRAGANDDROP
+    virtual void contentsDragEnterEvent( QDragEnterEvent *e );
+    virtual void contentsDragMoveEvent( QDragMoveEvent *e );
+    virtual void contentsDragLeaveEvent( QDragLeaveEvent *e );
+    virtual void contentsDropEvent( QDropEvent *e );
+    virtual QDragObject *dragObject();
+    virtual void startDrag();
+#endif
+
+    virtual void paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch );
+    virtual void activateNextCell();
+    virtual QWidget *createEditor( int row, int col, bool initFromCell ) const;
+    virtual void setCellContentFromEditor( int row, int col );
+    virtual QWidget *beginEdit( int row, int col, bool replace );
+    virtual void endEdit( int row, int col, bool accept, bool replace );
+
+    virtual void resizeData( int len );
+    virtual void insertWidget( int row, int col, QWidget *w );
+    int indexOf( int row, int col ) const;
+
+    void windowActivationChange( bool );
+    bool isEditing() const;
+    EditMode editMode() const;
+    int currEditRow() const;
+    int currEditCol() const;
+
+protected slots:
+    virtual void columnWidthChanged( int col );
+    virtual void rowHeightChanged( int row );
+    virtual void columnIndexChanged( int section, int fromIndex, int toIndex );
+    virtual void rowIndexChanged( int section, int fromIndex, int toIndex );
+    virtual void columnClicked( int col );
+
+signals:
+    void currentChanged( int row, int col );
+    void clicked( int row, int col, int button, const QPoint &mousePos );
+    void doubleClicked( int row, int col, int button, const QPoint &mousePos );
+    void pressed( int row, int col, int button, const QPoint &mousePos );
+    void selectionChanged();
+    void valueChanged( int row, int col );
+    void contextMenuRequested( int row, int col, const QPoint &pos );
+#ifndef QT_NO_DRAGANDDROP
+    void dropped( QDropEvent *e );
+#endif
+
+private slots:
+    void doAutoScroll();
+    void doValueChanged();
+    void updateGeometriesSlot();
+
+private:
+    void contentsMousePressEventEx( QMouseEvent* );
+    void drawContents( QPainter* );
+    void updateGeometries();
+    void repaintSelections( QTableSelection *oldSelection,
+                            QTableSelection *newSelection,
+                            bool updateVertical = TRUE,
+                            bool updateHorizontal = TRUE );
+    QRect rangeGeometry( int topRow, int leftCol,
+                         int bottomRow, int rightCol, bool &optimize );
+    void fixRow( int &row, int y );
+    void fixCol( int &col, int x );
+
+    void init( int numRows, int numCols );
+    QSize tableSize() const;
+    void repaintCell( int row, int col );
+    void contentsToViewport2( int x, int y, int& vx, int& vy );
+    QPoint contentsToViewport2( const QPoint &p );
+    void viewportToContents2( int vx, int vy, int& x, int& y );
+    QPoint viewportToContents2( const QPoint &p );
+
+    void updateRowWidgets( int row );
+    void updateColWidgets( int col );
+    bool isSelected( int row, int col, bool includeCurrent ) const;
+    void setCurrentCell( int row, int col, bool updateSelections, bool ensureVisible = FALSE );
+    void fixCell( int &row, int &col, int key );
+    void delayedUpdateGeometries();
+    struct TableWidget
+    {
+	TableWidget( QWidget *w, int r, int c ) : wid( w ), row( r ), col ( c ) {}
+	QWidget *wid;
+	int row, col;
+    };
+    void saveContents( QPtrVector<QTableItem> &tmp,
+		       QPtrVector<TableWidget> &tmp2 );
+    void updateHeaderAndResizeContents( QTableHeader *header,
+					int num, int colRow,
+					int width, bool &updateBefore );
+    void restoreContents( QPtrVector<QTableItem> &tmp,
+			  QPtrVector<TableWidget> &tmp2 );
+    void finishContentsResze( bool updateBefore );
+
+private:
+    QPtrVector<QTableItem> contents;
+    QPtrVector<QWidget> widgets;
+    int curRow;
+    int curCol;
+    QTableHeader *leftHeader, *topHeader;
+    EditMode edMode;
+    int editCol, editRow;
+    QPtrList<QTableSelection> selections;
+    QTableSelection *currentSel;
+    QTimer *autoScrollTimer;
+    int lastSortCol;
+    bool sGrid : 1;
+    bool mRows : 1;
+    bool mCols : 1;
+    bool asc : 1;
+    bool doSort : 1;
+    bool unused : 1;
+    bool readOnly : 1;
+    bool shouldClearSelection : 1;
+    bool dEnabled : 1;
+    bool context_menu : 1;
+    bool drawActiveSelection : 1;
+    bool was_visible : 1;
+    SelectionMode selMode;
+    int pressedRow, pressedCol;
+    QTablePrivate *d;
+    QIntDict<int> roRows;
+    QIntDict<int> roCols;
+    int startDragRow;
+    int startDragCol;
+    QPoint dragStartPos;
+    int oldCurrentRow, oldCurrentCol;
+    QWidget *unused_topLeftCorner; //### remove in 4.0
+    FocusStyle focusStl;
+    QSize unused_cachedSizeHint; // ### remove in 4.0
+
+#if defined(Q_DISABLE_COPY)
+    QTable( const QTable & );
+    QTable &operator=( const QTable & );
+#endif
+};
+
+#define Q_DEFINED_QTABLE
+#include "qwinexport.h"
+#endif // QT_NO_TABLE
+#endif // TABLE_H
Index: trunk/src/iconview/qiconview.cpp
===================================================================
--- trunk/src/iconview/qiconview.cpp	(revision 164)
+++ trunk/src/iconview/qiconview.cpp	(revision 164)
@@ -0,0 +1,6381 @@
+/****************************************************************************
+** $Id$
+**
+** Implementation of QIconView widget class
+**
+** Created : 990707
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the iconview module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+#if defined(Q_CC_BOR)
+// needed for qsort() because of a std namespace problem on Borland
+#include "qplatformdefs.h"
+#endif
+
+#include "qiconview.h"
+
+#ifndef QT_NO_ICONVIEW
+
+#include "qfontmetrics.h"
+#include "qpainter.h"
+#include "qevent.h"
+#include "qpalette.h"
+#include "qmime.h"
+#include "qimage.h"
+#include "qpen.h"
+#include "qbrush.h"
+#include "qtimer.h"
+#include "qcursor.h"
+#include "qapplication.h"
+#include "qtextedit.h"
+#include "qmemarray.h"
+#include "qptrlist.h"
+#include "qvbox.h"
+#include "qtooltip.h"
+#include "qbitmap.h"
+#include "qpixmapcache.h"
+#include "qptrdict.h"
+#include "qstringlist.h"
+#include "qcleanuphandler.h"
+#include "private/qrichtext_p.h"
+#include "qstyle.h"
+
+#include <limits.h>
+#include <stdlib.h>
+
+#define RECT_EXTENSION 300
+
+static const char * const unknown_xpm[] = {
+    "32 32 11 1",
+    "c c #ffffff",
+    "g c #c0c0c0",
+    "a c #c0ffc0",
+    "h c #a0a0a4",
+    "d c #585858",
+    "f c #303030",
+    "i c #400000",
+    "b c #00c000",
+    "e c #000000",
+    "# c #000000",
+    ". c None",
+    "...###..........................",
+    "...#aa##........................",
+    ".###baaa##......................",
+    ".#cde#baaa##....................",
+    ".#cccdeebaaa##..##f.............",
+    ".#cccccdeebaaa##aaa##...........",
+    ".#cccccccdeebaaaaaaaa##.........",
+    ".#cccccccccdeebaaaaaaa#.........",
+    ".#cccccgcgghhebbbbaaaaa#........",
+    ".#ccccccgcgggdebbbbbbaa#........",
+    ".#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 QPixmap *unknown_icon = 0;
+static QPixmap *qiv_buffer_pixmap = 0;
+#if !defined(Q_WS_X11)
+static QPixmap *qiv_selection = 0;
+#endif
+static bool optimize_layout = FALSE;
+
+static QCleanupHandler<QPixmap> qiv_cleanup_pixmap;
+
+#if !defined(Q_WS_X11)
+static void createSelectionPixmap( const QColorGroup &cg )
+{
+    QBitmap m( 2, 2 );
+    m.fill( Qt::color1 );
+    QPainter p( &m );
+    p.setPen( Qt::color0 );
+    for ( int j = 0; j < 2; ++j ) {
+	p.drawPoint( j % 2, j );
+    }
+    p.end();
+
+    qiv_selection = new QPixmap( 2, 2 );
+    qiv_cleanup_pixmap.add( &qiv_selection );
+    qiv_selection->fill( Qt::color0 );
+    qiv_selection->setMask( m );
+    qiv_selection->fill( cg.highlight() );
+}
+#endif
+
+static QPixmap *get_qiv_buffer_pixmap( const QSize &s )
+{
+    if ( !qiv_buffer_pixmap ) {
+	qiv_buffer_pixmap = new QPixmap( s );
+	qiv_cleanup_pixmap.add( &qiv_buffer_pixmap );
+	return qiv_buffer_pixmap;
+    }
+
+    qiv_buffer_pixmap->resize( s );
+    return qiv_buffer_pixmap;
+}
+
+#ifndef QT_NO_DRAGANDDROP
+
+class QM_EXPORT_ICONVIEW QIconDragData
+{
+public:
+    QIconDragData();
+    QIconDragData( const QRect &ir, const QRect &tr );
+
+    QRect pixmapRect() const;
+    QRect textRect() const;
+
+    void setPixmapRect( const QRect &r );
+    void setTextRect( const QRect &r );
+
+    QRect iconRect_, textRect_;
+    QString key_;
+
+    bool operator==( const QIconDragData &i ) const;
+};
+
+class QM_EXPORT_ICONVIEW QIconDragDataItem
+{
+public:
+    QIconDragDataItem() {}
+    QIconDragDataItem( const QIconDragItem &i1, const QIconDragData &i2 ) : data( i1 ), item( i2 ) {}
+    QIconDragItem data;
+    QIconDragData item;
+    bool operator== ( const QIconDragDataItem& ) const;
+};
+
+class QIconDragPrivate
+{
+public:
+    QValueList<QIconDragDataItem> items;
+    static bool decode( QMimeSource* e, QValueList<QIconDragDataItem> &lst );
+};
+
+#endif
+
+class QIconViewToolTip;
+
+class QIconViewPrivate
+{
+public:
+    QIconViewItem *firstItem, *lastItem;
+    uint count;
+    QIconView::SelectionMode selectionMode;
+    QIconViewItem *currentItem, *tmpCurrentItem, *highlightedItem,
+	*startDragItem, *pressedItem, *selectAnchor, *renamingItem;
+    QRect *rubber;
+    QTimer *scrollTimer, *adjustTimer, *updateTimer, *inputTimer,
+	*fullRedrawTimer;
+    int rastX, rastY, spacing;
+    int dragItems;
+    QPoint oldDragPos;
+    QIconView::Arrangement arrangement;
+    QIconView::ResizeMode resizeMode;
+    QSize oldSize;
+#ifndef QT_NO_DRAGANDDROP
+    QValueList<QIconDragDataItem> iconDragData;
+#endif
+    int numDragItems, cachedW, cachedH;
+    int maxItemWidth, maxItemTextLength;
+    QPoint dragStart;
+    QString currInputString;
+    QIconView::ItemTextPos itemTextPos;
+#ifndef QT_NO_CURSOR
+    QCursor oldCursor;
+#endif
+    int cachedContentsX, cachedContentsY;
+    QBrush itemTextBrush;
+    QRegion clipRegion;
+    QPoint dragStartPos;
+    QFontMetrics *fm;
+    int minLeftBearing, minRightBearing;
+
+    uint mousePressed		:1;
+    uint cleared		:1;
+    uint dropped		:1;
+    uint clearing		:1;
+    uint oldDragAcceptAction	:1;
+    uint isIconDrag		:1;
+    uint drawDragShapes		:1;
+    uint dirty			:1;
+    uint rearrangeEnabled	:1;
+    uint reorderItemsWhenInsert	:1;
+    uint drawAllBack		:1;
+    uint resortItemsWhenInsert	:1;
+    uint sortDirection		:1;
+    uint wordWrapIconText	:1;
+    uint containerUpdateLocked	:1;
+    uint firstSizeHint : 1;
+    uint showTips		:1;
+    uint pressedSelected	:1;
+    uint dragging		:1;
+    uint drawActiveSelection	:1;
+    uint inMenuMode		:1;
+
+    QIconViewToolTip *toolTip;
+    QPixmapCache maskCache;
+    QPtrDict<QIconViewItem> selectedItems;
+
+    struct ItemContainer {
+	ItemContainer( ItemContainer *pr, ItemContainer *nx, const QRect &r )
+	    : p( pr ), n( nx ), rect( r ) {
+		items.setAutoDelete( FALSE );
+		if ( p )
+		    p->n = this;
+		if ( n )
+		    n->p = this;
+	}
+	ItemContainer *p, *n;
+	QRect rect;
+	QPtrList<QIconViewItem> items;
+    } *firstContainer, *lastContainer;
+
+    struct SortableItem {
+	QIconViewItem *item;
+    };
+
+public:
+
+    /* finds the containers that intersect with \a searchRect in the direction \a dir relative to \a relativeTo */
+    QPtrList<ItemContainer>* findContainers(
+	QIconView:: Direction dir,
+	const QPoint &relativeTo,
+	const QRect &searchRect ) const;
+    //    friend int cmpIconViewItems( const void *n1, const void *n2 );
+};
+
+
+QPtrList<QIconViewPrivate::ItemContainer>* QIconViewPrivate::findContainers(
+	QIconView:: Direction dir,
+	const QPoint &relativeTo,
+	const QRect &searchRect ) const
+{
+
+    QPtrList<QIconViewPrivate::ItemContainer>* list =
+	new QPtrList<QIconViewPrivate::ItemContainer>();
+
+    if ( arrangement == QIconView::LeftToRight ) {
+	if ( dir == QIconView::DirLeft || dir == QIconView::DirRight ) {
+	    ItemContainer *c = firstContainer;
+	    for ( ; c; c = c->n )
+		if ( c->rect.intersects( searchRect ) )
+		    list->append( c );
+	} else {
+	    if ( dir == QIconView::DirDown ) {
+		ItemContainer *c = firstContainer;
+		for ( ; c; c = c->n )
+		    if ( c->rect.intersects( searchRect ) &&
+			 c->rect.bottom() >= relativeTo.y() )
+			list->append( c );
+	    } else {
+		ItemContainer *c = lastContainer;
+		for ( ; c; c = c->p )
+		    if ( c->rect.intersects( searchRect ) &&
+			 c->rect.top() <= relativeTo.y() )
+			list->append( c );
+	    }
+	}
+    } else {
+	if ( dir == QIconView::DirUp || dir == QIconView::DirDown ) {
+	    ItemContainer *c = firstContainer;
+	    for ( ; c; c = c->n )
+		if ( c->rect.intersects( searchRect ) )
+		    list->append( c );
+	} else {
+	    if ( dir == QIconView::DirRight ) {
+		ItemContainer *c = firstContainer;
+		for ( ; c; c = c->n )
+		    if ( c->rect.intersects( searchRect ) &&
+			 c->rect.right() >= relativeTo.x() )
+			list->append( c );
+	    } else {
+		ItemContainer *c = lastContainer;
+		for ( ; c; c = c->p )
+		    if ( c->rect.intersects( searchRect ) &&
+			 c->rect.left() <= relativeTo.x() )
+			list->append( c );
+	    }
+	}
+    }
+    return list;
+}
+
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+#ifdef Q_OS_TEMP
+static int _cdecl cmpIconViewItems( const void *n1, const void *n2 )
+#else
+static int cmpIconViewItems( const void *n1, const void *n2 )
+#endif
+{
+    if ( !n1 || !n2 )
+	return 0;
+
+    QIconViewPrivate::SortableItem *i1 = (QIconViewPrivate::SortableItem *)n1;
+    QIconViewPrivate::SortableItem *i2 = (QIconViewPrivate::SortableItem *)n2;
+
+    return i1->item->compare( i2->item );
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+
+#ifndef QT_NO_TOOLTIP
+class QIconViewToolTip : public QToolTip
+{
+public:
+    QIconViewToolTip( QWidget *parent, QIconView *iv );
+
+    void maybeTip( const QPoint &pos );
+
+private:
+    QIconView *view;
+};
+
+QIconViewToolTip::QIconViewToolTip( QWidget *parent, QIconView *iv )
+    : QToolTip( parent ), view( iv )
+{
+}
+
+void QIconViewToolTip::maybeTip( const QPoint &pos )
+{
+    if ( !parentWidget() || !view || view->wordWrapIconText() || !view->showToolTips() )
+	return;
+
+    QIconViewItem *item = view->findItem( view->viewportToContents( pos ) );
+    if ( !item || item->tmpText == item->itemText )
+	return;
+
+    QRect r( item->textRect( FALSE ) );
+    QRect r2 = item->pixmapRect( FALSE );
+    /* this probably should be | r, but QToolTip does not handle that
+     * well */
+
+    // At this point the rectangle is too small (it is the width of the icon)
+    // since we need it to be bigger than that, extend it here.
+    r.setWidth( view->d->fm->boundingRect( item->itemText ).width() + 4 );
+    r = QRect( view->contentsToViewport( QPoint( r.x(), r.y() ) ), QSize( r.width(), r.height() ) );
+
+    r2 = QRect( view->contentsToViewport( QPoint( r2.x(), r2.y() ) ), QSize( r2.width(), r2.height() ) );
+    tip( r2, item->itemText, r );
+}
+#endif
+
+
+class QIconViewItemPrivate
+{
+public:
+    QIconViewPrivate::ItemContainer *container1, *container2;
+};
+
+#ifndef QT_NO_TEXTEDIT
+
+class QIconViewItemLineEdit : public QTextEdit
+{
+    friend class QIconViewItem;
+
+public:
+    QIconViewItemLineEdit( const QString &text, QWidget *parent, QIconViewItem *theItem, const char* name=0 );
+
+protected:
+    void keyPressEvent( QKeyEvent *e );
+    void focusOutEvent( QFocusEvent *e );
+
+protected:
+    QIconViewItem *item;
+    QString startText;
+private:
+#if defined(Q_DISABLE_COPY) // Disabled copy constructor and operator=
+    QIconViewItemLineEdit( const QIconViewItemLineEdit & );
+    QIconViewItemLineEdit &operator=( const QIconViewItemLineEdit & );
+#endif
+
+};
+
+QIconViewItemLineEdit::QIconViewItemLineEdit( const QString &text, QWidget *parent,
+					      QIconViewItem *theItem, const char *name )
+    : QTextEdit( parent, name ), item( theItem ), startText( text )
+{
+    setFrameStyle( QFrame::Plain | QFrame::Box );
+    setLineWidth( 1 );
+
+    setHScrollBarMode( AlwaysOff );
+    setVScrollBarMode( AlwaysOff );
+
+    setWordWrap( WidgetWidth );
+    setWrapColumnOrWidth( item->iconView()->maxItemWidth() -
+			  ( item->iconView()->itemTextPos() == QIconView::Bottom ?
+			    0 : item->pixmapRect().width() ) );
+    document()->formatter()->setAllowBreakInWords( TRUE );
+    resize( 200, 200 ); // ### some size, there should be a forceReformat()
+    setTextFormat( PlainText );
+    setText( text );
+    setAlignment( Qt::AlignCenter );
+
+    resize( wrapColumnOrWidth() + 2, heightForWidth( wrapColumnOrWidth() ) + 2 );
+}
+
+void QIconViewItemLineEdit::keyPressEvent( QKeyEvent *e )
+{
+    if ( e->key()  == Key_Escape ) {
+	item->QIconViewItem::setText( startText );
+	item->cancelRenameItem();
+    } else if ( e->key() == Key_Enter ||
+		e->key() == Key_Return ) {
+	item->renameItem();
+    } else {
+	QTextEdit::keyPressEvent( e );
+	sync();
+	resize( width(), document()->height() + 2 );
+
+    }
+}
+
+void QIconViewItemLineEdit::focusOutEvent( QFocusEvent *e )
+{
+    Q_UNUSED(e) // I need this to get rid of a Borland warning
+    if ( e->reason() != QFocusEvent::Popup )
+	item->cancelRenameItem();
+}
+#endif
+
+#ifndef QT_NO_DRAGANDDROP
+
+
+/*!
+    \class QIconDragItem qiconview.h
+    \ingroup draganddrop
+
+    \brief The QIconDragItem class encapsulates a drag item.
+
+    \module iconview
+
+    The QIconDrag class uses a list of QIconDragItems to support drag
+    and drop operations.
+
+    In practice a QIconDragItem object (or an object of a class derived
+    from QIconDragItem) is created for each icon view item which is
+    dragged. Each of these QIconDragItems is stored in a QIconDrag
+    object.
+
+    See QIconView::dragObject() for more information.
+
+    See the \l fileiconview/qfileiconview.cpp and
+    \l iconview/simple_dd/main.cpp examples.
+*/
+
+/*!
+    Constructs a QIconDragItem with no data.
+*/
+
+QIconDragItem::QIconDragItem()
+    : ba( (int)strlen( "no data" ) )
+{
+    memcpy( ba.data(), "no data", strlen( "no data" ) );
+}
+
+/*!
+    Destructor.
+*/
+
+QIconDragItem::~QIconDragItem()
+{
+}
+
+/*!
+    Returns the data contained in the QIconDragItem.
+*/
+
+QByteArray QIconDragItem::data() const
+{
+    return ba;
+}
+
+/*!
+    Sets the data for the QIconDragItem to the data stored in the
+    QByteArray \a d.
+*/
+
+void QIconDragItem::setData( const QByteArray &d )
+{
+    ba = d;
+}
+
+/*!
+    \reimp
+*/
+
+bool QIconDragItem::operator==( const QIconDragItem &i ) const
+{
+    return ba == i.ba;
+}
+
+/*!
+    \reimp
+*/
+
+bool QIconDragDataItem::operator==( const QIconDragDataItem &i ) const
+{
+    return ( i.item == item &&
+	     i.data == data );
+}
+
+/*!
+    \reimp
+*/
+
+bool QIconDragData::operator==( const QIconDragData &i ) const
+{
+    return key_ == i.key_;
+}
+
+
+/*!
+    \class QIconDrag qiconview.h
+
+    \brief The QIconDrag class supports drag and drop operations
+    within a QIconView.
+
+    \ingroup draganddrop
+    \module iconview
+
+    A QIconDrag object is used to maintain information about the
+    positions of dragged items and the data associated with the
+    dragged items. QIconViews are able to use this information to
+    paint the dragged items in the correct positions. Internally
+    QIconDrag stores the data associated with drag items in
+    QIconDragItem objects.
+
+    If you want to use the extended drag-and-drop functionality of
+    QIconView, create a QIconDrag object in a reimplementation of
+    QIconView::dragObject(). Then create a QIconDragItem for each item
+    which should be dragged, set the data it represents with
+    QIconDragItem::setData(), and add each QIconDragItem to the drag
+    object using append().
+
+    The data in QIconDragItems is stored in a QByteArray and is
+    mime-typed (see QMimeSource and the
+    \link http://doc.trolltech.com/dnd.html Drag and Drop\endlink
+    overview). If you want to use your own mime-types derive a class
+    from QIconDrag and reimplement format(), encodedData() and
+    canDecode().
+
+    The fileiconview example program demonstrates the use of the
+    QIconDrag class including subclassing and reimplementing
+    dragObject(), format(), encodedData() and canDecode(). See the files
+    \c qt/examples/fileiconview/qfileiconview.h and
+    \c qt/examples/fileiconview/qfileiconview.cpp.
+
+    \sa QMimeSource::format()
+*/
+// ### consider using \dontinclude and friends there
+// ### Not here in the module overview instead...
+
+/*!
+    Constructs a drag object called \a name, which is a child of \a
+    dragSource.
+
+    Note that the drag object will be deleted when \a dragSource is deleted.
+*/
+
+QIconDrag::QIconDrag( QWidget * dragSource, const char* name )
+    : QDragObject( dragSource, name )
+{
+    d = new QIconDragPrivate;
+}
+
+/*!
+    Destructor.
+*/
+
+QIconDrag::~QIconDrag()
+{
+    delete d;
+}
+
+/*!
+    Append the QIconDragItem, \a i, to the QIconDrag object's list of
+    items. You must also supply the geometry of the pixmap, \a pr, and
+    the textual caption, \a tr.
+
+    \sa QIconDragItem
+*/
+
+void QIconDrag::append( const QIconDragItem &i, const QRect &pr, const QRect &tr )
+{
+    d->items.append( QIconDragDataItem( i, QIconDragData( pr, tr ) ) );
+}
+
+/*!
+    \reimp
+*/
+
+const char* QIconDrag::format( int i ) const
+{
+    if ( i == 0 )
+	return "application/x-qiconlist";
+    return 0;
+}
+
+/*!
+    Returns the encoded data of the drag object if \a mime is
+    application/x-qiconlist.
+*/
+
+QByteArray QIconDrag::encodedData( const char* mime ) const
+{
+    if ( d->items.count() <= 0 || QString( mime ) !=
+	 "application/x-qiconlist" )
+	return QByteArray();
+
+    QValueList<QIconDragDataItem>::ConstIterator it = d->items.begin();
+    QString s;
+    for ( ; it != d->items.end(); ++it ) {
+	QString k( "%1$@@$%2$@@$%3$@@$%4$@@$%5$@@$%6$@@$%7$@@$%8$@@$" );
+	k = k.arg( (*it).item.pixmapRect().x() ).arg(
+	    (*it).item.pixmapRect().y() ).arg( (*it).item.pixmapRect().width() ).
+	    arg( (*it).item.pixmapRect().height() ).arg(
+		(*it).item.textRect().x() ).arg( (*it).item.textRect().y() ).
+	    arg( (*it).item.textRect().width() ).arg(
+		(*it).item.textRect().height() );
+	k += QString( (*it).data.data() ) + "$@@$";
+	s += k;
+    }
+
+    QByteArray a( s.length() + 1 );
+    memcpy( a.data(), s.latin1(), a.size() );
+    return a;
+}
+
+/*!
+    Returns TRUE if \a e can be decoded by the QIconDrag, otherwise
+    return FALSE.
+*/
+
+bool QIconDrag::canDecode( QMimeSource* e )
+{
+    if ( e->provides( "application/x-qiconlist" ) )
+	return TRUE;
+    return FALSE;
+}
+
+/*!
+    Decodes the data which is stored (encoded) in \a e and, if
+    successful, fills the \a list of icon drag items with the decoded
+    data. Returns TRUE if there was some data, FALSE otherwise.
+*/
+
+bool QIconDragPrivate::decode( QMimeSource* e, QValueList<QIconDragDataItem> &lst )
+{
+    QByteArray ba = e->encodedData( "application/x-qiconlist" );
+    if ( ba.size() ) {
+	lst.clear();
+	QString s = ba.data();
+	QIconDragDataItem item;
+	QRect ir, tr;
+	QStringList l = QStringList::split( "$@@$", s );
+
+	int i = 0;
+	QStringList::Iterator it = l.begin();
+	for ( ; it != l.end(); ++it ) {
+	    if ( i == 0 ) {
+		ir.setX( ( *it ).toInt() );
+	    } else if ( i == 1 ) {
+		ir.setY( ( *it ).toInt() );
+	    } else if ( i == 2 ) {
+		ir.setWidth( ( *it ).toInt() );
+	    } else if ( i == 3 ) {
+		ir.setHeight( ( *it ).toInt() );
+	    } else if ( i == 4 ) {
+		tr.setX( ( *it ).toInt() );
+	    } else if ( i == 5 ) {
+		tr.setY( ( *it ).toInt() );
+	    } else if ( i == 6 ) {
+		tr.setWidth( ( *it ).toInt() );
+	    } else if ( i == 7 ) {
+		tr.setHeight( ( *it ).toInt() );
+	    } else if ( i == 8 ) {
+		QByteArray d( ( *it ).length() );
+		memcpy( d.data(), ( *it ).latin1(), ( *it ).length() );
+		item.item.setPixmapRect( ir );
+		item.item.setTextRect( tr );
+		item.data.setData( d );
+		lst.append( item );
+	    }
+	    ++i;
+	    if ( i > 8 )
+		i = 0;
+	}
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+QIconDragData::QIconDragData()
+    : iconRect_(), textRect_()
+{
+}
+
+QIconDragData::QIconDragData( const QRect &ir, const QRect &tr )
+    : iconRect_( ir ), textRect_( tr )
+{
+}
+
+QRect QIconDragData::textRect() const
+{
+    return textRect_;
+}
+
+QRect QIconDragData::pixmapRect() const
+{
+    return iconRect_;
+}
+
+void QIconDragData::setPixmapRect( const QRect &r )
+{
+    iconRect_ = r;
+}
+
+void QIconDragData::setTextRect( const QRect &r )
+{
+    textRect_ = r;
+}
+
+#endif
+
+
+/*!
+    \class QIconViewItem qiconview.h
+    \brief The QIconViewItem class provides a single item in a QIconView.
+
+    \ingroup advanced
+    \module iconview
+
+    A QIconViewItem contains an icon, a string and optionally a sort
+    key, and can display itself in a QIconView.
+
+    The simplest way to create a QIconViewItem and insert it into a
+    QIconView is to construct the item passing the constructor a
+    pointer to the icon view, a string and an icon:
+
+    \code
+    (void) new QIconViewItem(
+		    iconView,	// A pointer to a QIconView
+		    "This is the text of the item",
+		    aPixmap );
+    \endcode
+
+    By default the text of an icon view item may not be edited by the
+    user but calling setRenameEnabled(TRUE) will allow the user to
+    perform in-place editing of the item's text.
+
+    When the icon view is deleted all items in it are deleted
+    automatically.
+
+    The QIconView::firstItem() and QIconViewItem::nextItem() functions
+    provide a means of iterating over all the items in a QIconView:
+
+    \code
+    QIconViewItem *item;
+    for ( item = iconView->firstItem(); item; item = item->nextItem() )
+	do_something_with( item );
+    \endcode
+
+    The item's icon view is available from iconView(), and its
+    position in the icon view from index().
+
+    The item's selection status is available from isSelected() and is
+    set and controlled by setSelected() and isSelectable().
+
+    The text and icon can be set with setText() and setPixmap() and
+    retrieved with text() and pixmap(). The item's sort key defaults
+    to text() but may be set with setKey() and retrieved with key().
+    The comparison function, compare() uses key().
+
+    Items may be repositioned with move() and moveBy(). An item's
+    geometry is available from rect(), x(), y(), width(), height(),
+    size(), pos(), textRect() and pixmapRect(). You can also test
+    against the position of a point with contains() and intersects().
+
+    To remove an item from an icon view, just delete the item. The
+    QIconViewItem destructor removes it cleanly from its icon view.
+
+    Because the icon view is designed to use drag-and-drop, the icon
+    view item also has functions for drag-and-drop which may be
+    reimplemented.
+
+    The class is designed to be very similar to QListView and QListBox
+    in use, both via instantiation and subclassing.
+*/
+
+/*!
+    Constructs a QIconViewItem and inserts it into icon view \a parent
+    with no text and a default icon.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent )
+    : view( parent ), itemText(), itemIcon( unknown_icon )
+{
+    init();
+}
+
+/*!
+    Constructs a QIconViewItem and inserts it into the icon view \a
+    parent with no text and a default icon, after the icon view item
+    \a after.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent, QIconViewItem *after )
+    : view( parent ), itemText(), itemIcon( unknown_icon ),
+      prev( 0 ), next( 0 )
+{
+    init( after );
+}
+
+/*!
+    Constructs an icon view item  and inserts it into the icon view \a
+    parent using \a text as the text and a default icon.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent, const QString &text )
+    : view( parent ), itemText( text ), itemIcon( unknown_icon )
+{
+    init( 0 );
+}
+
+/*!
+    Constructs an icon view item and inserts it into the icon view \a
+    parent using \a text as the text and a default icon, after the
+    icon view item \a after.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent, QIconViewItem *after,
+			      const QString &text )
+    : view( parent ), itemText( text ), itemIcon( unknown_icon )
+{
+    init( after );
+}
+
+/*!
+    Constructs an icon view item and inserts it into the icon view \a
+    parent using \a text as the text and \a icon as the icon.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent, const QString &text,
+			      const QPixmap &icon )
+    : view( parent ),
+      itemText( text ), itemIcon( new QPixmap( icon ) )
+{
+    init( 0 );
+}
+
+
+/*!
+    Constructs an icon view item and inserts it into the icon view \a
+    parent using \a text as the text and \a icon as the icon, after
+    the icon view item \a after.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent, QIconViewItem *after,
+			      const QString &text, const QPixmap &icon )
+    : view( parent ), itemText( text ), itemIcon( new QPixmap( icon ) )
+{
+    init( after );
+}
+
+/*!
+    Constructs an icon view item and inserts it into the icon view \a
+    parent using \a text as the text and \a picture as the icon.
+*/
+
+#ifndef QT_NO_PICTURE
+QIconViewItem::QIconViewItem( QIconView *parent, const QString &text,
+			      const QPicture &picture )
+    : view( parent ), itemText( text ), itemIcon( 0 )
+{
+    init( 0, new QPicture( picture ) );
+}
+
+/*!
+    Constructs an icon view item and inserts it into the icon view \a
+    parent using \a text as the text and \a picture as the icon, after
+    the icon view item \a after.
+*/
+
+QIconViewItem::QIconViewItem( QIconView *parent, QIconViewItem *after,
+			      const QString &text, const QPicture &picture )
+    : view( parent ), itemText( text ), itemIcon( 0 )
+{
+    init( after, new QPicture( picture ) );
+}
+#endif
+
+/*!
+  This private function initializes the icon view item and inserts it
+  into the icon view.
+*/
+
+void QIconViewItem::init( QIconViewItem *after
+#ifndef QT_NO_PICTURE
+			  , QPicture *pic
+#endif
+			  )
+{
+    d = new QIconViewItemPrivate;
+    d->container1 = 0;
+    d->container2 = 0;
+    prev = next = 0;
+    allow_rename = FALSE;
+    allow_drag = TRUE;
+    allow_drop = TRUE;
+    selected = FALSE;
+    selectable = TRUE;
+#ifndef QT_NO_TEXTEDIT
+    renameBox = 0;
+#endif
+#ifndef QT_NO_PICTURE
+    itemPic = pic;
+#endif
+    if ( view ) {
+	itemKey = itemText;
+	dirty = TRUE;
+	wordWrapDirty = TRUE;
+	itemRect = QRect( -1, -1, 0, 0 );
+	calcRect();
+	view->insertItem( this, after );
+    }
+}
+
+/*!
+    Destroys the icon view item and tells the parent icon view that
+    the item has been destroyed.
+*/
+
+QIconViewItem::~QIconViewItem()
+{
+#ifndef QT_NO_TEXTEDIT
+    removeRenameBox();
+#endif
+    if ( view && !view->d->clearing )
+	view->takeItem( this );
+    view = 0;
+    if ( itemIcon && itemIcon->serialNumber() != unknown_icon->serialNumber() )
+	delete itemIcon;
+#ifndef QT_NO_PICTURE
+    delete itemPic;
+#endif
+    delete d;
+}
+
+int QIconViewItem::RTTI = 0;
+
+/*!
+    Returns 0.
+
+    Make your derived classes return their own values for rtti(), so
+    that you can distinguish between icon view item types. You should
+    use values greater than 1000, preferably a large random number, to
+    allow for extensions to this class.
+*/
+
+int QIconViewItem::rtti() const
+{
+    return RTTI;
+}
+
+
+/*!
+    Sets \a text as the text of the icon view item. This function
+    might be a no-op if you reimplement text().
+
+    \sa text()
+*/
+
+void QIconViewItem::setText( const QString &text )
+{
+    if ( text == itemText )
+	return;
+
+    wordWrapDirty = TRUE;
+    itemText = text;
+    if ( itemKey.isEmpty() )
+	itemKey = itemText;
+
+    QRect oR = rect();
+    calcRect();
+    oR = oR.unite( rect() );
+
+    if ( view ) {
+	if ( QRect( view->contentsX(), view->contentsY(),
+		    view->visibleWidth(), view->visibleHeight() ).
+	     intersects( oR ) )
+	    view->repaintContents( oR.x() - 1, oR.y() - 1,
+				   oR.width() + 2, oR.height() + 2, FALSE );
+    }
+}
+
+/*!
+    Sets \a k as the sort key of the icon view item. By default
+    text() is used for sorting.
+
+    \sa compare()
+*/
+
+void QIconViewItem::setKey( const QString &k )
+{
+    if ( k == itemKey )
+	return;
+
+    itemKey = k;
+}
+
+/*!
+    Sets \a icon as the item's icon in the icon view. This function
+    might be a no-op if you reimplement pixmap().
+
+    \sa pixmap()
+*/
+
+void QIconViewItem::setPixmap( const QPixmap &icon )
+{
+    if ( itemIcon && itemIcon == unknown_icon )
+	itemIcon = 0;
+
+    if ( itemIcon )
+	*itemIcon = icon;
+    else
+	itemIcon = new QPixmap( icon );
+    QRect oR = rect();
+    calcRect();
+    oR = oR.unite( rect() );
+
+    if ( view ) {
+	if ( QRect( view->contentsX(), view->contentsY(),
+		    view->visibleWidth(), view->visibleHeight() ).
+	     intersects( oR ) )
+	    view->repaintContents( oR.x() - 1, oR.y() - 1,
+				   oR.width() + 2, oR.height() + 2, FALSE );
+    }
+}
+
+/*!
+    Sets \a icon as the item's icon in the icon view. This function
+    might be a no-op if you reimplement picture().
+
+    \sa picture()
+*/
+
+#ifndef QT_NO_PICTURE
+void QIconViewItem::setPicture( const QPicture &icon )
+{
+    // clear assigned pixmap if any
+    if ( itemIcon ) {
+	if ( itemIcon == unknown_icon ) {
+	    itemIcon = 0;
+	} else {
+	    delete itemIcon;
+	    itemIcon = 0;
+	}
+    }
+    if ( itemPic )
+	delete itemPic;
+    itemPic = new QPicture( icon );
+
+    QRect oR = rect();
+    calcRect();
+    oR = oR.unite( rect() );
+
+    if ( view ) {
+	if ( QRect( view->contentsX(), view->contentsY(),
+		    view->visibleWidth(), view->visibleHeight() ).
+	     intersects( oR ) )
+	    view->repaintContents( oR.x() - 1, oR.y() - 1,
+				   oR.width() + 2, oR.height() + 2, FALSE );
+    }
+}
+#endif
+
+/*!
+    \overload
+
+    Sets \a text as the text of the icon view item. If \a recalc is
+    TRUE, the icon view's layout is recalculated. If \a redraw is TRUE
+    (the default), the icon view is repainted.
+
+    \sa text()
+*/
+
+void QIconViewItem::setText( const QString &text, bool recalc, bool redraw )
+{
+    if ( text == itemText )
+	return;
+
+    wordWrapDirty = TRUE;
+    itemText = text;
+
+    if ( recalc )
+	calcRect();
+    if ( redraw )
+	repaint();
+}
+
+/*!
+    \overload
+
+    Sets \a icon as the item's icon in the icon view. If \a recalc is
+    TRUE, the icon view's layout is recalculated. If \a redraw is TRUE
+    (the default), the icon view is repainted.
+
+    \sa pixmap()
+*/
+
+void QIconViewItem::setPixmap( const QPixmap &icon, bool recalc, bool redraw )
+{
+    if ( itemIcon && itemIcon == unknown_icon )
+	itemIcon = 0;
+
+    if ( itemIcon )
+	*itemIcon = icon;
+    else
+	itemIcon = new QPixmap( icon );
+
+    if ( redraw ) {
+	if ( recalc ) {
+	    QRect oR = rect();
+	    calcRect();
+	    oR = oR.unite( rect() );
+
+	    if ( view ) {
+		if ( QRect( view->contentsX(), view->contentsY(),
+			    view->visibleWidth(), view->visibleHeight() ).
+		     intersects( oR ) )
+		    view->repaintContents( oR.x() - 1, oR.y() - 1,
+					   oR.width() + 2, oR.height() + 2, FALSE );
+	    }
+	} else {
+	    repaint();
+	}
+    } else if ( recalc ) {
+	calcRect();
+    }
+}
+
+/*!
+    If \a allow is TRUE, the user can rename the icon view item by
+    clicking on the text (or pressing F2) while the item is selected
+    (in-place renaming). If \a allow is FALSE, in-place renaming is
+    not possible.
+*/
+
+void QIconViewItem::setRenameEnabled( bool allow )
+{
+    allow_rename = (uint)allow;
+}
+
+/*!
+    If \a allow is TRUE, the icon view permits the user to drag the
+    icon view item either to another position within the icon view or
+    to somewhere outside of it. If \a allow is FALSE, the item cannot
+    be dragged.
+*/
+
+void QIconViewItem::setDragEnabled( bool allow )
+{
+    allow_drag = (uint)allow;
+}
+
+/*!
+    If \a allow is TRUE, the icon view lets the user drop something on
+    this icon view item.
+*/
+
+void QIconViewItem::setDropEnabled( bool allow )
+{
+    allow_drop = (uint)allow;
+}
+
+/*!
+    Returns the text of the icon view item. Normally you set the text
+    of the item with setText(), but sometimes it's inconvenient to
+    call setText() for every item; so you can subclass QIconViewItem,
+    reimplement this function, and return the text of the item. If you
+    do this, you must call calcRect() manually each time the text
+    (and therefore its size) changes.
+
+    \sa setText()
+*/
+
+QString QIconViewItem::text() const
+{
+    return itemText;
+}
+
+/*!
+    Returns the key of the icon view item or text() if no key has been
+    explicitly set.
+
+    \sa setKey(), compare()
+*/
+
+QString QIconViewItem::key() const
+{
+    return itemKey;
+}
+
+/*!
+    Returns the icon of the icon view item if it is a pixmap, or 0 if
+    it is a picture. In the latter case use picture() instead.
+    Normally you set the pixmap of the item with setPixmap(), but
+    sometimes it's inconvenient to call setPixmap() for every item. So
+    you can subclass QIconViewItem, reimplement this function and
+    return a pointer to the item's pixmap. If you do this, you \e must
+    call calcRect() manually each time the size of this pixmap
+    changes.
+
+    \sa setPixmap()
+*/
+
+QPixmap *QIconViewItem::pixmap() const
+{
+    return itemIcon;
+}
+
+/*!
+    Returns the icon of the icon view item if it is a picture, or 0 if
+    it is a pixmap. In the latter case use pixmap() instead. Normally
+    you set the picture of the item with setPicture(), but sometimes
+    it's inconvenient to call setPicture() for every item. So you can
+    subclass QIconViewItem, reimplement this function and return a
+    pointer to the item's picture. If you do this, you \e must call
+    calcRect() manually each time the size of this picture changes.
+
+    \sa setPicture()
+*/
+
+#ifndef QT_NO_PICTURE
+QPicture *QIconViewItem::picture() const
+{
+    return itemPic;
+}
+#endif
+
+/*!
+    Returns TRUE if the item can be renamed by the user with in-place
+    renaming; otherwise returns FALSE.
+
+    \sa setRenameEnabled()
+*/
+
+bool QIconViewItem::renameEnabled() const
+{
+    return (bool)allow_rename;
+}
+
+/*!
+    Returns TRUE if the user is allowed to drag the icon view item;
+    otherwise returns FALSE.
+
+    \sa setDragEnabled()
+*/
+
+bool QIconViewItem::dragEnabled() const
+{
+    return (bool)allow_drag;
+}
+
+/*!
+    Returns TRUE if the user is allowed to drop something onto the
+    item; otherwise returns FALSE.
+
+    \sa setDropEnabled()
+*/
+
+bool QIconViewItem::dropEnabled() const
+{
+    return (bool)allow_drop;
+}
+
+/*!
+    Returns a pointer to this item's icon view parent.
+*/
+
+QIconView *QIconViewItem::iconView() const
+{
+    return view;
+}
+
+/*!
+    Returns a pointer to the previous item, or 0 if this is the first
+    item in the icon view.
+
+    \sa nextItem() QIconView::firstItem()
+*/
+
+QIconViewItem *QIconViewItem::prevItem() const
+{
+    return prev;
+}
+
+/*!
+    Returns a pointer to the next item, or 0 if this is the last item
+    in the icon view.
+
+    To find the first item use QIconView::firstItem().
+
+    Example:
+    \code
+    QIconViewItem *item;
+    for ( item = iconView->firstItem(); item; item = item->nextItem() )
+	do_something_with( item );
+    \endcode
+
+    \sa prevItem()
+*/
+
+QIconViewItem *QIconViewItem::nextItem() const
+{
+    return next;
+}
+
+/*!
+    Returns the index of this item in the icon view, or -1 if an error
+    occurred.
+*/
+
+int QIconViewItem::index() const
+{
+    if ( view )
+	return view->index( this );
+
+    return -1;
+}
+
+
+
+/*!
+    \overload
+
+    This variant is equivalent to calling the other variant with \e cb
+    set to FALSE.
+*/
+
+void QIconViewItem::setSelected( bool s )
+{
+    setSelected( s, FALSE );
+}
+
+/*!
+    Selects or unselects the item, depending on \a s; it may also
+    unselect other items, depending on QIconView::selectionMode() and
+    \a cb.
+
+    If \a s is FALSE, the item is unselected.
+
+    If \a s is TRUE and QIconView::selectionMode() is \c Single, the
+    item is selected and the item previously selected is unselected.
+
+    If \a s is TRUE and QIconView::selectionMode() is \c Extended, the
+    item is selected. If \a cb is TRUE, the selection state of the
+    other items is left unchanged. If \a cb is FALSE (the default) all
+    other items are unselected.
+
+    If \a s is TRUE and QIconView::selectionMode() is \c Multi, the
+    item is selected.
+
+    Note that \a cb is used only if QIconView::selectionMode() is \c
+    Extended; cb defaults to FALSE.
+
+    All items whose selection status changes repaint themselves.
+*/
+
+void QIconViewItem::setSelected( bool s, bool cb )
+{
+    if ( !view )
+	return;
+    if ( view->selectionMode() != QIconView::NoSelection &&
+	 selectable && s != (bool)selected ) {
+
+	if ( view->d->selectionMode == QIconView::Single && this != view->d->currentItem ) {
+	    QIconViewItem *o = view->d->currentItem;
+	    if ( o && o->selected )
+		o->selected = FALSE;
+	    view->d->currentItem = this;
+	    if ( o )
+		o->repaint();
+	    emit view->currentChanged( this );
+	}
+
+	if ( !s ) {
+	    selected = FALSE;
+	} else {
+	    if ( view->d->selectionMode == QIconView::Single && view->d->currentItem ) {
+		view->d->currentItem->selected = FALSE;
+	    }
+	    if ( ( view->d->selectionMode == QIconView::Extended && !cb ) ||
+		 view->d->selectionMode == QIconView::Single ) {
+		bool b = view->signalsBlocked();
+		view->blockSignals( TRUE );
+		view->selectAll( FALSE );
+		view->blockSignals( b );
+	    }
+	    selected = s;
+	}
+
+ 	repaint();
+	if ( !view->signalsBlocked() ) {
+	    bool emitIt = view->d->selectionMode == QIconView::Single && s;
+	    QIconView *v = view;
+	    emit v->selectionChanged();
+	    if ( emitIt )
+		emit v->selectionChanged( this );
+	}
+    }
+}
+
+/*!
+    Sets this item to be selectable if \a enable is TRUE (the default)
+    or unselectable if \a enable is FALSE.
+
+    The user is unable to select a non-selectable item using either
+    the keyboard or the mouse. (The application programmer can select
+    an item in code regardless of this setting.)
+
+    \sa isSelectable()
+*/
+
+void QIconViewItem::setSelectable( bool enable )
+{
+    selectable = (uint)enable;
+}
+
+/*!
+    Returns TRUE if the item is selected; otherwise returns FALSE.
+
+    \sa setSelected()
+*/
+
+bool QIconViewItem::isSelected() const
+{
+    return (bool)selected;
+}
+
+/*!
+    Returns TRUE if the item is selectable; otherwise returns FALSE.
+
+    \sa setSelectable()
+*/
+
+bool QIconViewItem::isSelectable() const
+{
+    return (bool)selectable;
+}
+
+/*!
+    Repaints the item.
+*/
+
+void QIconViewItem::repaint()
+{
+    if ( view )
+	view->repaintItem( this );
+}
+
+/*!
+    Moves the item to position (\a x, \a y) in the icon view (these
+    are contents coordinates).
+*/
+
+bool QIconViewItem::move( int x, int y )
+{
+    if ( x == this->x() && y == this->y() )
+	return FALSE;
+    itemRect.setRect( x, y, itemRect.width(), itemRect.height() );
+    checkRect();
+    if ( view )
+	view->updateItemContainer( this );
+    return TRUE;
+}
+
+/*!
+    Moves the item \a dx pixels in the x-direction and \a dy pixels in
+    the y-direction.
+*/
+
+void QIconViewItem::moveBy( int dx, int dy )
+{
+    itemRect.moveBy( dx, dy );
+    checkRect();
+    if ( view )
+	view->updateItemContainer( this );
+}
+
+/*!
+    \overload
+
+    Moves the item to the point \a pnt.
+*/
+
+bool QIconViewItem::move( const QPoint &pnt )
+{
+    return move( pnt.x(), pnt.y() );
+}
+
+/*!
+    \overload
+
+    Moves the item by the x, y values in point \a pnt.
+*/
+
+void QIconViewItem::moveBy( const QPoint &pnt )
+{
+    moveBy( pnt.x(), pnt.y() );
+}
+
+/*!
+    Returns the bounding rectangle of the item (in contents
+    coordinates).
+*/
+
+QRect QIconViewItem::rect() const
+{
+    return itemRect;
+}
+
+/*!
+    Returns the x-coordinate of the item (in contents coordinates).
+*/
+
+int QIconViewItem::x() const
+{
+    return itemRect.x();
+}
+
+/*!
+    Returns the y-coordinate of the item (in contents coordinates).
+*/
+
+int QIconViewItem::y() const
+{
+    return itemRect.y();
+}
+
+/*!
+    Returns the width of the item.
+*/
+
+int QIconViewItem::width() const
+{
+    return QMAX( itemRect.width(), QApplication::globalStrut().width() );
+}
+
+/*!
+    Returns the height of the item.
+*/
+
+int QIconViewItem::height() const
+{
+    return QMAX( itemRect.height(), QApplication::globalStrut().height() );
+}
+
+/*!
+    Returns the size of the item.
+*/
+
+QSize QIconViewItem::size() const
+{
+    return QSize( itemRect.width(), itemRect.height() );
+}
+
+/*!
+    Returns the position of the item (in contents coordinates).
+*/
+
+QPoint QIconViewItem::pos() const
+{
+    return QPoint( itemRect.x(), itemRect.y() );
+}
+
+/*!
+    Returns the bounding rectangle of the item's text.
+
+    If \a relative is TRUE, (the default), the returned rectangle is
+    relative to the origin of the item's rectangle. If \a relative is
+    FALSE, the returned rectangle is relative to the origin of the
+    icon view's contents coordinate system.
+*/
+
+QRect QIconViewItem::textRect( bool relative ) const
+{
+    if ( relative )
+	return itemTextRect;
+    else
+	return QRect( x() + itemTextRect.x(), y() + itemTextRect.y(), itemTextRect.width(), itemTextRect.height() );
+}
+
+/*!
+    Returns the bounding rectangle of the item's icon.
+
+    If \a relative is TRUE, (the default), the rectangle is relative to
+    the origin of the item's rectangle. If \a relative is FALSE, the
+    returned rectangle is relative to the origin of the icon view's
+    contents coordinate system.
+*/
+
+QRect QIconViewItem::pixmapRect( bool relative ) const
+{
+    if ( relative )
+	return itemIconRect;
+    else
+	return QRect( x() + itemIconRect.x(), y() + itemIconRect.y(), itemIconRect.width(), itemIconRect.height() );
+}
+
+/*!
+    Returns TRUE if the item contains the point \a pnt (in contents
+    coordinates); otherwise returns FALSE.
+*/
+
+bool QIconViewItem::contains( const QPoint& pnt ) const
+{
+    QRect textArea = textRect( FALSE );
+    QRect pixmapArea = pixmapRect( FALSE );
+    if ( iconView()->itemTextPos() == QIconView::Bottom )
+	textArea.setTop( pixmapArea.bottom() );
+    else
+	textArea.setLeft( pixmapArea.right() );
+    return textArea.contains( pnt ) || pixmapArea.contains( pnt );
+}
+
+/*!
+    Returns TRUE if the item intersects the rectangle \a r (in
+    contents coordinates); otherwise returns FALSE.
+*/
+
+bool QIconViewItem::intersects( const QRect& r ) const
+{
+    return ( textRect( FALSE ).intersects( r ) ||
+	     pixmapRect( FALSE ).intersects( r ) );
+}
+
+/*!
+    \fn bool QIconViewItem::acceptDrop( const QMimeSource *mime ) const
+
+    Returns TRUE if you can drop things with a QMimeSource of \a mime
+    onto this item; otherwise returns FALSE.
+
+    The default implementation always returns FALSE. You must subclass
+    QIconViewItem and reimplement acceptDrop() to accept drops.
+*/
+
+bool QIconViewItem::acceptDrop( const QMimeSource * ) const
+{
+    return FALSE;
+}
+
+#ifndef QT_NO_TEXTEDIT
+/*!
+    Starts in-place renaming of an icon, if allowed.
+
+    This function sets up the icon view so that the user can edit the
+    item text, and then returns. When the user is done, setText() will
+    be called and QIconView::itemRenamed() will be emitted (unless the
+    user canceled, e.g. by pressing the Escape key).
+
+    \sa setRenameEnabled()
+*/
+
+void QIconViewItem::rename()
+{
+    if ( !view )
+	return;
+    if ( renameBox )
+	removeRenameBox();
+    oldRect = rect();
+    renameBox = new QIconViewItemLineEdit( itemText, view->viewport(), this, "qt_renamebox" );
+    iconView()->ensureItemVisible( this );
+    QRect tr( textRect( FALSE ) );
+    view->addChild( renameBox, tr.x() + ( tr.width() / 2 - renameBox->width() / 2 ), tr.y() - 3 );
+    renameBox->selectAll();
+    view->viewport()->setFocusProxy( renameBox );
+    renameBox->setFocus();
+    renameBox->show();
+    Q_ASSERT( view->d->renamingItem == 0L );
+    view->d->renamingItem = this;
+}
+#endif
+
+/*!
+    Compares this icon view item to \a i. Returns -1 if this item is
+    less than \a i, 0 if they are equal, and 1 if this icon view item
+    is greater than \a i.
+
+    The default implementation compares the item keys (key()) using
+    QString::localeAwareCompare(). A reimplementation may use
+    different values and a different comparison function. Here is a
+    reimplementation that uses plain Unicode comparison:
+
+    \code
+	int MyIconViewItem::compare( QIconViewItem *i ) const
+	{
+	    return key().compare( i->key() );
+	}
+    \endcode
+
+    \sa key() QString::localeAwareCompare() QString::compare()
+*/
+
+int QIconViewItem::compare( QIconViewItem *i ) const
+{
+    return key().localeAwareCompare( i->key() );
+}
+
+#ifndef QT_NO_TEXTEDIT
+/*!
+  This private function is called when the user pressed Return during
+  in-place renaming.
+*/
+
+void QIconViewItem::renameItem()
+{
+    if ( !renameBox || !view )
+	return;
+
+    if ( !view->d->wordWrapIconText ) {
+	wordWrapDirty = TRUE;
+	calcRect();
+    }
+    QRect r = itemRect;
+    setText( renameBox->text() );
+    view->repaintContents( oldRect.x() - 1, oldRect.y() - 1, oldRect.width() + 2, oldRect.height() + 2, FALSE );
+    view->repaintContents( r.x() - 1, r.y() - 1, r.width() + 2, r.height() + 2, FALSE );
+    removeRenameBox();
+
+    view->emitRenamed( this );
+}
+
+/*!
+    Cancels in-place renaming.
+*/
+
+void QIconViewItem::cancelRenameItem()
+{
+    if ( !view )
+	return;
+
+    QRect r = itemRect;
+    calcRect();
+    view->repaintContents( oldRect.x() - 1, oldRect.y() - 1, oldRect.width() + 2, oldRect.height() + 2, FALSE );
+    view->repaintContents( r.x() - 1, r.y() - 1, r.width() + 2, r.height() + 2, FALSE );
+
+    if ( !renameBox )
+	return;
+
+    removeRenameBox();
+}
+
+/*!
+    Removes the editbox that is used for in-place renaming.
+*/
+
+void QIconViewItem::removeRenameBox()
+{
+    if ( !renameBox || !view )
+	return;
+
+    bool resetFocus = view->viewport()->focusProxy() == renameBox;
+    delete renameBox;
+    renameBox = 0;
+    if ( resetFocus ) {
+	view->viewport()->setFocusProxy( view );
+	view->setFocus();
+    }
+    Q_ASSERT( view->d->renamingItem == this );
+    view->d->renamingItem = 0L;
+}
+#endif
+
+/*!
+    This virtual function is responsible for calculating the
+    rectangles returned by rect(), textRect() and pixmapRect().
+    setRect(), setTextRect() and setPixmapRect() are provided mainly
+    for reimplementations of this function.
+
+    \a text_ is an internal parameter which defaults to QString::null.
+*/
+
+void QIconViewItem::calcRect( const QString &text_ )
+{
+    if ( !view ) // #####
+	return;
+
+    wordWrapDirty = TRUE;
+    int pw = 0;
+    int ph = 0;
+
+#ifndef QT_NO_PICTURE
+    if ( picture() ) {
+	QRect br = picture()->boundingRect();
+	pw = br.width() + 2;
+	ph = br.height() + 2;
+    } else
+#endif
+    {
+	pw = ( pixmap() ? pixmap() : unknown_icon )->width() + 2;
+	ph = ( pixmap() ? pixmap() : unknown_icon )->height() + 2;
+    }
+
+    itemIconRect.setWidth( pw );
+    itemIconRect.setHeight( ph );
+
+    calcTmpText();
+
+    QString t = text_;
+    if ( t.isEmpty() ) {
+	if ( view->d->wordWrapIconText )
+	    t = itemText;
+	else
+	    t = tmpText;
+    }
+
+    int tw = 0;
+    int th = 0;
+    // ##### TODO: fix font bearings!
+    QRect r;
+    if ( view->d->wordWrapIconText ) {
+	r = QRect( view->d->fm->boundingRect( 0, 0, iconView()->maxItemWidth() -
+					      ( iconView()->itemTextPos() == QIconView::Bottom ? 0 :
+						pixmapRect().width() ),
+					      0xFFFFFFFF, AlignHCenter | WordBreak | BreakAnywhere, t ) );
+	r.setWidth( r.width() + 4 );
+    } else {
+	r = QRect( 0, 0, view->d->fm->width( t ), view->d->fm->height() );
+	r.setWidth( r.width() + 4 );
+    }
+
+    if ( r.width() > iconView()->maxItemWidth() -
+	 ( iconView()->itemTextPos() == QIconView::Bottom ? 0 :
+	   pixmapRect().width() ) )
+	r.setWidth( iconView()->maxItemWidth() - ( iconView()->itemTextPos() == QIconView::Bottom ? 0 :
+						   pixmapRect().width() ) );
+
+    tw = r.width();
+    th = r.height();
+    if ( tw < view->d->fm->width( "X" ) )
+	tw = view->d->fm->width( "X" );
+
+    itemTextRect.setWidth( tw );
+    itemTextRect.setHeight( th );
+
+    int w = 0;
+    int h = 0;
+    if ( view->itemTextPos() == QIconView::Bottom ) {
+	w = QMAX( itemTextRect.width(), itemIconRect.width() );
+	h = itemTextRect.height() + itemIconRect.height() + 1;
+
+	itemRect.setWidth( w );
+	itemRect.setHeight( h );
+
+	itemTextRect = QRect( ( width() - itemTextRect.width() ) / 2, height() - itemTextRect.height(),
+			      itemTextRect.width(), itemTextRect.height() );
+	itemIconRect = QRect( ( width() - itemIconRect.width() ) / 2, 0,
+			      itemIconRect.width(), itemIconRect.height() );
+    } else {
+	h = QMAX( itemTextRect.height(), itemIconRect.height() );
+	w = itemTextRect.width() + itemIconRect.width() + 1;
+
+	itemRect.setWidth( w );
+	itemRect.setHeight( h );
+
+	itemTextRect = QRect( width() - itemTextRect.width(), ( height() - itemTextRect.height() ) / 2,
+			      itemTextRect.width(), itemTextRect.height() );
+	itemIconRect = QRect( 0, ( height() - itemIconRect.height() ) / 2,
+			      itemIconRect.width(), itemIconRect.height() );
+    }
+    if ( view )
+	view->updateItemContainer( this );
+}
+
+/*!
+    Paints the item using the painter \a p and the color group \a cg.
+    If you want the item to be drawn with a different font or color,
+    reimplement this function, change the values of the color group or
+    the painter's font, and then call the QIconViewItem::paintItem()
+    with the changed values.
+*/
+
+void QIconViewItem::paintItem( QPainter *p, const QColorGroup &cg )
+{
+    if ( !view )
+	return;
+
+    p->save();
+
+    if ( isSelected() ) {
+	p->setPen( cg.highlightedText() );
+    } else {
+	p->setPen( cg.text() );
+    }
+
+    calcTmpText();
+
+#ifndef QT_NO_PICTURE
+    if ( picture() ) {
+	QPicture *pic = picture();
+	if ( isSelected() ) {
+	    p->fillRect( pixmapRect( FALSE ), QBrush( cg.highlight(), QBrush::Dense4Pattern) );
+	}
+	p->drawPicture( x()-pic->boundingRect().x(), y()-pic->boundingRect().y(), *pic );
+	if ( isSelected() ) {
+	    p->fillRect( textRect( FALSE ), cg.highlight() );
+	    p->setPen( QPen( cg.highlightedText() ) );
+	} else if ( view->d->itemTextBrush != NoBrush )
+	    p->fillRect( textRect( FALSE ), view->d->itemTextBrush );
+
+	int align = view->itemTextPos() == QIconView::Bottom ? AlignHCenter : AlignAuto;
+	if ( view->d->wordWrapIconText )
+	    align |= WordBreak | BreakAnywhere;
+	p->drawText( textRect( FALSE ), align, view->d->wordWrapIconText ? itemText : tmpText );
+	p->restore();
+	return;
+    }
+#endif
+    bool textOnBottom = ( view->itemTextPos() == QIconView::Bottom );
+    int dim;
+    if ( textOnBottom )
+	dim = ( pixmap() ? pixmap() : unknown_icon)->width();
+    else
+	dim = ( pixmap() ? pixmap() : unknown_icon)->height();
+    if ( isSelected() ) {
+	QPixmap *pix = pixmap() ? pixmap() : unknown_icon;
+	if ( pix && !pix->isNull() ) {
+	    QPixmap *buffer = get_qiv_buffer_pixmap( pix->size() );
+	    QBitmap mask = view->mask( pix );
+
+	    QPainter p2( buffer );
+	    p2.fillRect( pix->rect(), white );
+	    p2.drawPixmap( 0, 0, *pix );
+	    p2.end();
+	    buffer->setMask( mask );
+	    p2.begin( buffer );
+#if defined(Q_WS_X11)
+	    p2.fillRect( pix->rect(), QBrush( cg.highlight(), QBrush::Dense4Pattern) );
+#else // in WIN32 Dense4Pattern doesn't work correctly (transparency problem), so work around it
+	    if ( iconView()->d->drawActiveSelection ) {
+		if ( !qiv_selection )
+		    createSelectionPixmap( cg );
+		p2.drawTiledPixmap( 0, 0, pix->width(), pix->height(),
+				    *qiv_selection );
+	    }
+#endif
+	    p2.end();
+	    QRect cr = pix->rect();
+	    if ( textOnBottom )
+		p->drawPixmap( x() + ( width() - dim ) / 2, y(), *buffer, 0, 0,
+			       cr.width(), cr.height() );
+	    else
+		p->drawPixmap( x() , y() + ( height() - dim ) / 2, *buffer, 0, 0,
+			       cr.width(), cr.height() );
+	}
+    } else {
+	if ( textOnBottom )
+	    p->drawPixmap( x() + ( width() - dim ) / 2, y(),
+			   *( pixmap() ? pixmap() : unknown_icon ) );
+	else
+	    p->drawPixmap( x() , y() + ( height() - dim ) / 2,
+			   *( pixmap() ? pixmap() : unknown_icon ) );
+    }
+
+    p->save();
+    if ( isSelected() ) {
+	p->fillRect( textRect( FALSE ), cg.highlight() );
+	p->setPen( QPen( cg.highlightedText() ) );
+    } else if ( view->d->itemTextBrush != NoBrush )
+	p->fillRect( textRect( FALSE ), view->d->itemTextBrush );
+
+    int align = AlignHCenter;
+    if ( view->d->wordWrapIconText )
+	align |= WordBreak | BreakAnywhere;
+    p->drawText( textRect( FALSE ), align,
+		 view->d->wordWrapIconText ? itemText : tmpText );
+
+    p->restore();
+
+    p->restore();
+}
+
+/*!
+    Paints the focus rectangle of the item using the painter \a p and
+    the color group \a cg.
+*/
+
+void QIconViewItem::paintFocus( QPainter *p, const QColorGroup &cg )
+{
+    if ( !view )
+	return;
+
+    view->style().drawPrimitive(QStyle::PE_FocusRect, p,
+				QRect( textRect( FALSE ).x(), textRect( FALSE ).y(),
+				       textRect( FALSE ).width(),
+				       textRect( FALSE ).height() ), cg,
+				(isSelected() ?
+				 QStyle::Style_FocusAtBorder :
+				 QStyle::Style_Default),
+				QStyleOption(isSelected() ? cg.highlight() : cg.base()));
+
+    if ( this != view->d->currentItem ) {
+	view->style().drawPrimitive(QStyle::PE_FocusRect, p,
+				    QRect( pixmapRect( FALSE ).x(),
+					   pixmapRect( FALSE ).y(),
+					   pixmapRect( FALSE ).width(),
+					   pixmapRect( FALSE ).height() ),
+				    cg, QStyle::Style_Default,
+				    QStyleOption(cg.base()));
+    }
+}
+
+/*!
+    \fn void QIconViewItem::dropped( QDropEvent *e, const QValueList<QIconDragItem> &lst )
+
+    This function is called when something is dropped on the item. \a
+    e provides all the information about the drop. If the drag object
+    of the drop was a QIconDrag, \a lst contains the list of the
+    dropped items. You can get the data by calling
+    QIconDragItem::data() on each item. If the \a lst is empty, i.e.
+    the drag was not a QIconDrag, you must decode the data in \a e and
+    work with that.
+
+    The default implementation does nothing; subclasses may
+    reimplement this function.
+*/
+
+#ifndef QT_NO_DRAGANDDROP
+void QIconViewItem::dropped( QDropEvent *, const QValueList<QIconDragItem> & )
+{
+}
+#endif
+
+/*!
+    This function is called when a drag enters the item's bounding
+    rectangle.
+
+    The default implementation does nothing; subclasses may
+    reimplement this function.
+*/
+
+void QIconViewItem::dragEntered()
+{
+}
+
+/*!
+    This function is called when a drag leaves the item's bounding
+    rectangle.
+
+    The default implementation does nothing; subclasses may
+    reimplement this function.
+*/
+
+void QIconViewItem::dragLeft()
+{
+}
+
+/*!
+    Sets the bounding rectangle of the whole item to \a r. This
+    function is provided for subclasses which reimplement calcRect(),
+    so that they can set the calculated rectangle. \e{Any other use is
+    discouraged.}
+
+    \sa calcRect() textRect() setTextRect() pixmapRect() setPixmapRect()
+*/
+
+void QIconViewItem::setItemRect( const QRect &r )
+{
+    itemRect = r;
+    checkRect();
+    if ( view )
+	view->updateItemContainer( this );
+}
+
+/*!
+    Sets the bounding rectangle of the item's text to \a r. This
+    function is provided for subclasses which reimplement calcRect(),
+    so that they can set the calculated rectangle. \e{Any other use is
+    discouraged.}
+
+    \sa calcRect() textRect() setItemRect() setPixmapRect()
+*/
+
+void QIconViewItem::setTextRect( const QRect &r )
+{
+    itemTextRect = r;
+    if ( view )
+	view->updateItemContainer( this );
+}
+
+/*!
+    Sets the bounding rectangle of the item's icon to \a r. This
+    function is provided for subclasses which reimplement calcRect(),
+    so that they can set the calculated rectangle. \e{Any other use is
+    discouraged.}
+
+    \sa calcRect() pixmapRect() setItemRect() setTextRect()
+*/
+
+void QIconViewItem::setPixmapRect( const QRect &r )
+{
+    itemIconRect = r;
+    if ( view )
+	view->updateItemContainer( this );
+}
+
+/*!
+    \internal
+*/
+
+void QIconViewItem::calcTmpText()
+{
+    if ( !view || view->d->wordWrapIconText || !wordWrapDirty )
+	return;
+    wordWrapDirty = FALSE;
+
+    int w = iconView()->maxItemWidth() - ( iconView()->itemTextPos() == QIconView::Bottom ? 0 :
+					   pixmapRect().width() );
+    if ( view->d->fm->width( itemText ) < w ) {
+	tmpText = itemText;
+	return;
+    }
+
+    tmpText = "...";
+    int i = 0;
+    while ( view->d->fm->width( tmpText + itemText[ i ] ) < w )
+	tmpText += itemText[ i++ ];
+    tmpText.remove( (uint)0, 3 );
+    tmpText += "...";
+}
+
+/*! \internal */
+
+QString QIconViewItem::tempText() const
+{
+    return tmpText;
+}
+
+void QIconViewItem::checkRect()
+{
+    int x = itemRect.x();
+    int y = itemRect.y();
+    int w = itemRect.width();
+    int h = itemRect.height();
+
+    bool changed = FALSE;
+    if ( x < 0 ) {
+	x = 0;
+	changed = TRUE;
+    }
+    if ( y < 0 ) {
+	y = 0;
+	changed = TRUE;
+    }
+
+    if ( changed )
+	itemRect.setRect( x, y, w, h );
+}
+
+
+/*! \file iconview/simple_dd/main.h */
+/*! \file iconview/simple_dd/main.cpp */
+
+
+/*!
+    \class QIconView qiconview.h
+    \brief The QIconView class provides an area with movable labelled icons.
+
+    \module iconview
+    \ingroup advanced
+    \mainclass
+
+    A QIconView can display and manage a grid or other 2D layout of
+    labelled icons. Each labelled icon is a QIconViewItem. Items
+    (QIconViewItems) can be added or deleted at any time; items can be
+    moved within the QIconView. Single or multiple items can be
+    selected. Items can be renamed in-place. QIconView also supports
+    \link #draganddrop drag and drop\endlink.
+
+    Each item contains a label string, a pixmap or picture (the icon
+    itself) and optionally a sort key. The sort key is used for
+    sorting the items and defaults to the label string. The label
+    string can be displayed below or to the right of the icon (see \l
+    ItemTextPos).
+
+    The simplest way to create a QIconView is to create a QIconView
+    object and create some QIconViewItems with the QIconView as their
+    parent, set the icon view's geometry and show it.
+    For example:
+    \code
+    QIconView *iv = new QIconView( this );
+    QDir dir( path, "*.xpm" );
+    for ( uint i = 0; i < dir.count(); i++ ) {
+	(void) new QIconViewItem( iv, dir[i], QPixmap( path + dir[i] ) );
+    }
+    iv->resize( 600, 400 );
+    iv->show();
+    \endcode
+
+    The QIconViewItem call passes a pointer to the QIconView we wish to
+    populate, along with the label text and a QPixmap.
+
+    When an item is inserted the QIconView allocates a position for it.
+    Existing items are rearranged if autoArrange() is TRUE. The
+    default arrangement is \c LeftToRight -- the QIconView fills up
+    the \e left-most column from top to bottom, then moves one column
+    \e right and fills that from top to bottom and so on. The
+    arrangement can be modified with any of the following approaches:
+    \list
+    \i Call setArrangement(), e.g. with \c TopToBottom which will fill
+    the \e top-most row from left to right, then moves one row \e down
+    and fills that row from left to right and so on.
+    \i Construct each QIconViewItem using a constructor which allows
+    you to specify which item the new one is to follow.
+    \i Call setSorting() or sort() to sort the items.
+    \endlist
+
+    The spacing between items is set with setSpacing(). Items can be
+    laid out using a fixed grid using setGridX() and setGridY(); by
+    default the QIconView calculates a grid dynamically. The position
+    of items' label text is set with setItemTextPos(). The text's
+    background can be set with setItemTextBackground(). The maximum
+    width of an item and of its text are set with setMaxItemWidth()
+    and setMaxItemTextLength(). The label text will be word-wrapped if
+    it is too long; this is controlled by setWordWrapIconText(). If
+    the label text is truncated, the user can still see the entire
+    text in a tool tip if they hover the mouse over the item. This is
+    controlled with setShowToolTips().
+
+    Items which are \link QIconViewItem::isSelectable()
+    selectable\endlink may be selected depending on the SelectionMode;
+    the default is \c Single. Because QIconView offers multiple
+    selection it must display keyboard focus and selection state
+    separately. Therefore there are functions to set the selection
+    state of an item (setSelected()) and to select which item displays
+    keyboard focus (setCurrentItem()). When multiple items may be
+    selected the icon view provides a rubberband, too.
+
+    When in-place renaming is enabled (it is disabled by default), the
+    user may change the item's label. They do this by selecting the item
+    (single clicking it or navigating to it with the arrow keys), then
+    single clicking it (or pressing F2), and entering their text. If no
+    key has been set with QIconViewItem::setKey() the new text will also
+    serve as the key. (See QIconViewItem::setRenameEnabled().)
+
+    You can control whether users can move items themselves with
+    setItemsMovable().
+
+    Because the internal structure used to store the icon view items is
+    linear, no iterator class is needed to iterate over all the items.
+    Instead we iterate by getting the first item from the \e{icon view}
+    and then each subsequent (\l QIconViewItem::nextItem()) from each
+    \e item in turn:
+    \code
+	for ( QIconViewItem *item = iv->firstItem(); item; item = item->nextItem() )
+	    do_something( item );
+    \endcode
+    QIconView also provides currentItem(). You can search for an item
+    using findItem() (searching by position or for label text) and
+    with findFirstVisibleItem() and findLastVisibleItem(). The number
+    of items is returned by count(). An item can be removed from an
+    icon view using takeItem(); to delete an item use \c delete. All
+    the items can be deleted with clear().
+
+    The QIconView emits a wide range of useful signals, including
+    selectionChanged(), currentChanged(), clicked(), moved() and
+    itemRenamed().
+
+    \target draganddrop
+    \section1 Drag and Drop
+
+    QIconView supports the drag and drop of items within the QIconView
+    itself. It also supports the drag and drop of items out of or into
+    the QIconView and drag and drop onto items themselves. The drag and
+    drop of items outside the QIconView can be achieved in a simple way
+    with basic functionality, or in a more sophisticated way which
+    provides more power and control.
+
+    The simple approach to dragging items out of the icon view is to
+    subclass QIconView and reimplement QIconView::dragObject().
+
+    \code
+    QDragObject *MyIconView::dragObject()
+    {
+	return new QTextDrag( currentItem()->text(), this );
+    }
+    \endcode
+
+    In this example we create a QTextDrag object, (derived from
+    QDragObject), containing the item's label and return it as the drag
+    object. We could just as easily have created a QImageDrag from the
+    item's pixmap and returned that instead.
+
+    QIconViews and their QIconViewItems can also be the targets of drag
+    and drops. To make the QIconView itself able to accept drops connect
+    to the dropped() signal. When a drop occurs this signal will be
+    emitted with a QDragEvent and a QValueList of QIconDragItems. To
+    make a QIconViewItem into a drop target subclass QIconViewItem and
+    reimplement QIconViewItem::acceptDrop() and
+    QIconViewItem::dropped().
+
+    \code
+    bool MyIconViewItem::acceptDrop( const QMimeSource *mime ) const
+    {
+	if ( mime->provides( "text/plain" ) )
+	    return TRUE;
+	return FALSE;
+    }
+
+    void MyIconViewItem::dropped( QDropEvent *evt, const QValueList<QIconDragItem>& )
+    {
+	QString label;
+	if ( QTextDrag::decode( evt, label ) )
+	    setText( label );
+    }
+    \endcode
+
+    See \l iconview/simple_dd/main.h and \l
+    iconview/simple_dd/main.cpp for a simple drag and drop example
+    which demonstrates drag and drop between a QIconView and a
+    QListBox.
+
+    If you want to use extended drag-and-drop or have drag shapes drawn
+    you must take a more sophisticated approach.
+
+    The first part is starting drags -- you should use a QIconDrag (or a
+    class derived from it) for the drag object. In dragObject() create the
+    drag object, populate it with QIconDragItems and return it. Normally
+    such a drag should offer each selected item's data. So in dragObject()
+    you should iterate over all the items, and create a QIconDragItem for
+    each selected item, and append these items with QIconDrag::append() to
+    the QIconDrag object. You can use QIconDragItem::setData() to set the
+    data of each item that should be dragged. If you want to offer the
+    data in additional mime-types, it's best to use a class derived from
+    QIconDrag, which implements additional encoding and decoding
+    functions.
+
+    When a drag enters the icon view, there is little to do. Simply
+    connect to the dropped() signal and reimplement
+    QIconViewItem::acceptDrop() and QIconViewItem::dropped(). If you've
+    used a QIconDrag (or a subclass of it) the second argument to the
+    dropped signal contains a QValueList of QIconDragItems -- you can
+    access their data by calling QIconDragItem::data() on each one.
+
+    For an example implementation of complex drag-and-drop look at the
+    fileiconview example (qt/examples/fileiconview).
+
+    \sa QIconViewItem::setDragEnabled(), QIconViewItem::setDropEnabled(),
+	QIconViewItem::acceptDrop(), QIconViewItem::dropped().
+
+    <img src=qiconview-m.png> <img src=qiconview-w.png>
+*/
+
+/*! \enum QIconView::ResizeMode
+
+    This enum type is used to tell QIconView how it should treat the
+    positions of its icons when the widget is resized. The modes are:
+
+    \value Fixed  The icons' positions are not changed.
+    \value Adjust  The icons' positions are adjusted to be within the
+    new geometry, if possible.
+*/
+
+/*!
+    \enum QIconView::SelectionMode
+
+    This enumerated type is used by QIconView to indicate how it
+    reacts to selection by the user. It has four values:
+
+    \value Single  When the user selects an item, any already-selected
+    item becomes unselected and the user cannot unselect the selected
+    item. This means that the user can never clear the selection. (The
+    application programmer can, using QIconView::clearSelection().)
+
+    \value Multi  When the user selects an item, e.g. by navigating to
+    it with the keyboard arrow keys or by clicking it, the selection
+    status of that item is toggled and the other items are left alone.
+
+    \value Extended  When the user selects an item the selection is
+    cleared and the new item selected. However, if the user presses
+    the Ctrl key when clicking on an item, the clicked item gets
+    toggled and all other items are left untouched. If the user
+    presses the Shift key while clicking on an item, all items between
+    the current item and the clicked item get selected or unselected,
+    depending on the state of the clicked item. Also, multiple items
+    can be selected by dragging the mouse while the left mouse button
+    stays pressed.
+
+    \value NoSelection  Items cannot be selected.
+
+    To summarise: \c Single is a real single-selection icon view; \c
+    Multi a real multi-selection icon view; \c Extended is an icon
+    view in which users can select multiple items but usually want to
+    select either just one or a range of contiguous items; and \c
+    NoSelection mode is for an icon view where the user can look but
+    not touch.
+*/
+
+/*!
+    \enum QIconView::Arrangement
+
+    This enum type determines in which direction the items flow when
+    the view runs out of space.
+
+    \value LeftToRight  Items which don't fit into the view go further
+    down (you get a vertical scrollbar)
+
+    \value TopToBottom  Items which don't fit into the view go further
+    right (you get a horizontal scrollbar)
+*/
+
+/*!
+    \enum QIconView::ItemTextPos
+
+    This enum type specifies the position of the item text in relation
+    to the icon.
+
+    \value Bottom  The text is drawn below the icon.
+    \value Right  The text is drawn to the right of the icon.
+*/
+
+/*!
+    \fn void  QIconView::dropped ( QDropEvent * e, const QValueList<QIconDragItem> &lst )
+
+    This signal is emitted when a drop event occurs in the viewport
+    (but not on any icon) which the icon view itself can't handle.
+
+    \a e provides all the information about the drop. If the drag
+    object of the drop was a QIconDrag, \a lst contains the list of
+    the dropped items. You can get the data using
+    QIconDragItem::data() on each item. If the \a lst is empty, i.e.
+    the drag was not a QIconDrag, you have to decode the data in \a e
+    and work with that.
+
+    Note QIconViewItems may be drop targets; if a drop event occurs on
+    an item the item handles the drop.
+*/
+
+/*!
+    \fn void QIconView::moved()
+
+    This signal is emitted after successfully dropping one (or more)
+    items of the icon view. If the items should be removed, it's best
+    to do so in a slot connected to this signal.
+*/
+
+/*!
+    \fn void  QIconView::doubleClicked(QIconViewItem * item)
+
+    This signal is emitted when the user double-clicks on \a item.
+*/
+
+/*!
+    \fn void  QIconView::returnPressed (QIconViewItem * item)
+
+    This signal is emitted if the user presses the Return or Enter
+    key. \a item is the currentItem() at the time of the keypress.
+*/
+
+/*!
+    \fn void  QIconView::selectionChanged()
+
+    This signal is emitted when the selection has been changed. It's
+    emitted in each selection mode.
+*/
+
+/*!
+    \overload void QIconView::selectionChanged( QIconViewItem *item )
+
+    This signal is emitted when the selection changes. \a item is the
+    newly selected item. This signal is emitted only in single
+    selection mode.
+*/
+
+/*!
+    \fn void QIconView::currentChanged( QIconViewItem *item )
+
+    This signal is emitted when a new item becomes current. \a item is
+    the new current item (or 0 if no item is now current).
+
+    \sa currentItem()
+*/
+
+/*!
+    \fn void  QIconView::onItem( QIconViewItem *item )
+
+    This signal is emitted when the user moves the mouse cursor onto
+    an \a item, similar to the QWidget::enterEvent() function.
+*/
+
+// ### bug here - enter/leave event aren't considered. move the mouse
+// out of the window and back in, to the same item.
+
+/*!
+    \fn void QIconView::onViewport()
+
+    This signal is emitted when the user moves the mouse cursor from
+    an item to an empty part of the icon view.
+
+    \sa onItem()
+*/
+
+/*!
+    \overload void QIconView::itemRenamed (QIconViewItem * item)
+
+    This signal is emitted when \a item has been renamed, usually by
+    in-place renaming.
+
+    \sa QIconViewItem::setRenameEnabled() QIconViewItem::rename()
+*/
+
+/*!
+    \fn void QIconView::itemRenamed (QIconViewItem * item, const QString &name)
+
+    This signal is emitted when \a item has been renamed to \a name,
+    usually by in-place renaming.
+
+    \sa QIconViewItem::setRenameEnabled() QIconViewItem::rename()
+*/
+
+/*!
+    \fn void QIconView::rightButtonClicked (QIconViewItem * item, const QPoint & pos)
+
+    This signal is emitted when the user clicks the right mouse
+    button. If \a item is non-null, the cursor is on \a item. If \a
+    item is null, the mouse cursor isn't on any item.
+
+    \a pos is the position of the mouse cursor in the global
+    coordinate system (QMouseEvent::globalPos()). (If the click's
+    press and release differ by a pixel or two, \a pos is the
+    position at release time.)
+
+    \sa rightButtonPressed() mouseButtonClicked() clicked()
+*/
+
+/*!
+    \fn void QIconView::contextMenuRequested( QIconViewItem *item, const QPoint & pos )
+
+    This signal is emitted when the user invokes a context menu with
+    the right mouse button or with special system keys, with \a item
+    being the item under the mouse cursor or the current item,
+    respectively.
+
+    \a pos is the position for the context menu in the global
+    coordinate system.
+*/
+
+/*!
+    \fn void QIconView::mouseButtonPressed (int button, QIconViewItem * item, const QPoint & pos)
+
+    This signal is emitted when the user presses mouse button \a
+    button. If \a item is non-null, the cursor is on \a item. If \a
+    item is null, the mouse cursor isn't on any item.
+
+    \a pos is the position of the mouse cursor in the global
+    coordinate system (QMouseEvent::globalPos()).
+
+    \sa rightButtonClicked() mouseButtonPressed() pressed()
+*/
+
+/*!
+    \fn void QIconView::mouseButtonClicked (int button, QIconViewItem * item, const QPoint & pos )
+
+    This signal is emitted when the user clicks mouse button \a
+    button. If \a item is non-null, the cursor is on \a item. If \a
+    item is null, the mouse cursor isn't on any item.
+
+    \a pos is the position of the mouse cursor in the global
+    coordinate system (QMouseEvent::globalPos()). (If the click's
+    press and release differ by a pixel or two, \a pos is the
+    position at release time.)
+
+    \sa mouseButtonPressed() rightButtonClicked() clicked()
+*/
+
+/*!
+    \overload void QIconView::clicked ( QIconViewItem * item, const QPoint & pos )
+
+    This signal is emitted when the user clicks any mouse button on an
+    icon view item. \a item is a pointer to the item that has been
+    clicked.
+
+    \a pos is the position of the mouse cursor in the global coordinate
+    system (QMouseEvent::globalPos()). (If the click's press and release
+    differ by a pixel or two, \a pos is the  position at release time.)
+
+    \sa mouseButtonClicked() rightButtonClicked() pressed()
+*/
+
+/*!
+    \overload void QIconView::pressed ( QIconViewItem * item, const QPoint & pos )
+
+    This signal is emitted when the user presses any mouse button. If
+    \a item is non-null, the cursor is on \a item. If \a item is null,
+    the mouse cursor isn't on any item.
+
+    \a pos is the position of the mouse cursor in the global
+    coordinate system (QMouseEvent::globalPos()). (If the click's
+    press and release differ by a pixel or two, \a pos is the
+    position at release time.)
+
+    \sa mouseButtonPressed() rightButtonPressed() clicked()
+*/
+
+/*!
+    \fn void QIconView::clicked ( QIconViewItem * item )
+
+    This signal is emitted when the user clicks any mouse button. If
+    \a item is non-null, the cursor is on \a item. If \a item is null,
+    the mouse cursor isn't on any item.
+
+    \sa mouseButtonClicked() rightButtonClicked() pressed()
+*/
+
+/*!
+    \fn void QIconView::pressed ( QIconViewItem * item )
+
+    This signal is emitted when the user presses any mouse button. If
+    \a item is non-null, the cursor is on \a item. If \a item is null,
+    the mouse cursor isn't on any item.
+
+    \sa mouseButtonPressed() rightButtonPressed() clicked()
+*/
+
+/*!
+    \fn void QIconView::rightButtonPressed( QIconViewItem * item, const QPoint & pos )
+
+    This signal is emitted when the user presses the right mouse
+    button. If \a item is non-null, the cursor is on \a item. If \a
+    item is null, the mouse cursor isn't on any item.
+
+    \a pos is the position of the mouse cursor in the global
+    coordinate system (QMouseEvent::globalPos()).
+*/
+
+/*!
+    Constructs an empty icon view called \a name, with parent \a
+    parent and using the widget flags \a f.
+*/
+
+QIconView::QIconView( QWidget *parent, const char *name, WFlags f )
+    : QScrollView( parent, name, WStaticContents | WNoAutoErase  | f )
+{
+    if ( !unknown_icon ) {
+	unknown_icon = new QPixmap( (const char **)unknown_xpm );
+	qiv_cleanup_pixmap.add( &unknown_icon );
+    }
+
+    d = new QIconViewPrivate;
+    d->dragging = FALSE;
+    d->firstItem = 0;
+    d->lastItem = 0;
+    d->count = 0;
+    d->mousePressed = FALSE;
+    d->selectionMode = Single;
+    d->currentItem = 0;
+    d->highlightedItem = 0;
+    d->rubber = 0;
+    d->scrollTimer = 0;
+    d->startDragItem = 0;
+    d->tmpCurrentItem = 0;
+    d->rastX = d->rastY = -1;
+    d->spacing = 5;
+    d->cleared = FALSE;
+    d->arrangement = LeftToRight;
+    d->resizeMode = Fixed;
+    d->dropped = FALSE;
+    d->adjustTimer = new QTimer( this, "iconview adjust timer" );
+    d->isIconDrag = FALSE;
+    d->inMenuMode = FALSE;
+#ifndef QT_NO_DRAGANDDROP
+    d->iconDragData.clear();
+#endif
+    d->numDragItems = 0;
+    d->updateTimer = new QTimer( this, "iconview update timer" );
+    d->cachedW = d->cachedH = 0;
+    d->maxItemWidth = 100;
+    d->maxItemTextLength = 255;
+    d->inputTimer = new QTimer( this, "iconview input timer" );
+    d->currInputString = QString::null;
+    d->dirty = FALSE;
+    d->rearrangeEnabled = TRUE;
+    d->itemTextPos = Bottom;
+    d->reorderItemsWhenInsert = TRUE;
+#ifndef QT_NO_CURSOR
+    d->oldCursor = arrowCursor;
+#endif
+    d->resortItemsWhenInsert = FALSE;
+    d->sortDirection = TRUE;
+    d->wordWrapIconText = TRUE;
+    d->cachedContentsX = d->cachedContentsY = -1;
+    d->clearing = FALSE;
+    d->fullRedrawTimer = new QTimer( this, "iconview full redraw timer" );
+    d->itemTextBrush = NoBrush;
+    d->drawAllBack = TRUE;
+    d->fm = new QFontMetrics( font() );
+    d->minLeftBearing = d->fm->minLeftBearing();
+    d->minRightBearing = d->fm->minRightBearing();
+    d->firstContainer = d->lastContainer = 0;
+    d->containerUpdateLocked = FALSE;
+    d->firstSizeHint = FALSE;
+    d->selectAnchor = 0;
+    d->renamingItem = 0;
+    d->drawActiveSelection = TRUE;
+    d->drawDragShapes = FALSE;
+
+    connect( d->adjustTimer, SIGNAL( timeout() ),
+	     this, SLOT( adjustItems() ) );
+    connect( d->updateTimer, SIGNAL( timeout() ),
+	     this, SLOT( slotUpdate() ) );
+    connect( d->fullRedrawTimer, SIGNAL( timeout() ),
+	     this, SLOT( updateContents() ) );
+    connect( this, SIGNAL( contentsMoving(int,int) ),
+	     this, SLOT( movedContents(int,int) ) );
+
+    setAcceptDrops( TRUE );
+    viewport()->setAcceptDrops( TRUE );
+
+    setMouseTracking( TRUE );
+    viewport()->setMouseTracking( TRUE );
+
+    viewport()->setBackgroundMode( PaletteBase);
+    setBackgroundMode( PaletteBackground, PaletteBase );
+    viewport()->setFocusProxy( this );
+    viewport()->setFocusPolicy( QWidget::WheelFocus );
+
+#ifndef QT_NO_TOOLTIP
+    d->toolTip = new QIconViewToolTip( viewport(), this );
+#endif
+    d->showTips = TRUE;
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::styleChange( QStyle& old )
+{
+    QScrollView::styleChange( old );
+    *d->fm = QFontMetrics( font() );
+    d->minLeftBearing = d->fm->minLeftBearing();
+    d->minRightBearing = d->fm->minRightBearing();
+
+    QIconViewItem *item = d->firstItem;
+    for ( ; item; item = item->next ) {
+	item->wordWrapDirty = TRUE;
+	item->calcRect();
+    }
+
+#if !defined(Q_WS_X11)
+    delete qiv_selection;
+    qiv_selection = 0;
+#endif
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::setFont( const QFont & f )
+{
+    QScrollView::setFont( f );
+    *d->fm = QFontMetrics( font() );
+    d->minLeftBearing = d->fm->minLeftBearing();
+    d->minRightBearing = d->fm->minRightBearing();
+
+    QIconViewItem *item = d->firstItem;
+    for ( ; item; item = item->next ) {
+	item->wordWrapDirty = TRUE;
+	item->calcRect();
+    }
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::setPalette( const QPalette & p )
+{
+    QScrollView::setPalette( p );
+    *d->fm = QFontMetrics( font() );
+    d->minLeftBearing = d->fm->minLeftBearing();
+    d->minRightBearing = d->fm->minRightBearing();
+
+    QIconViewItem *item = d->firstItem;
+    for ( ; item; item = item->next ) {
+	item->wordWrapDirty = TRUE;
+	item->calcRect();
+    }
+}
+
+/*!
+    Destroys the icon view and deletes all items.
+*/
+
+QIconView::~QIconView()
+{
+    QIconViewItem *tmp, *item = d->firstItem;
+    d->clearing = TRUE;
+    QIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc;
+    while ( c ) {
+	tmpc = c->n;
+	delete c;
+	c = tmpc;
+    }
+    while ( item ) {
+	tmp = item->next;
+	delete item;
+	item = tmp;
+    }
+    delete d->fm;
+    d->fm = 0;
+#ifndef QT_NO_TOOLTIP
+    delete d->toolTip;
+    d->toolTip = 0;
+#endif
+    delete d;
+}
+
+/*!
+    Inserts the icon view item \a item after \a after. If \a after is
+    0, \a item is appended after the last item.
+
+    \e{You should never need to call this function.} Instead create
+    QIconViewItem's and associate them with your icon view like this:
+
+    \code
+	(void) new QIconViewItem( myIconview, "The text of the item", aPixmap );
+    \endcode
+*/
+
+void QIconView::insertItem( QIconViewItem *item, QIconViewItem *after )
+{
+    if ( !item )
+	return;
+
+    if ( d->firstItem == item || item->prev || item->next)
+	return;
+
+    if ( !item->view )
+	item->view = this;
+
+    if ( !d->firstItem ) {
+	d->firstItem = d->lastItem = item;
+	item->prev = 0;
+	item->next = 0;
+    } else {
+	if ( !after || after == d->lastItem ) {
+	    d->lastItem->next = item;
+	    item->prev = d->lastItem;
+	    item->next = 0;
+	    d->lastItem = item;
+	} else {
+	    QIconViewItem *i = d->firstItem;
+	    while ( i != after )
+		i = i->next;
+
+	    if ( i ) {
+		QIconViewItem *next = i->next;
+		item->next = next;
+		item->prev = i;
+		i->next = item;
+		next->prev = item;
+	    }
+	}
+    }
+
+    if ( isVisible() ) {
+	if ( d->reorderItemsWhenInsert ) {
+	    if ( d->updateTimer->isActive() )
+		d->updateTimer->stop();
+	    d->fullRedrawTimer->stop();
+	    // #### uncomment this ASA insertInGrid uses cached values and is efficient
+	    //insertInGrid( item );
+
+	    d->cachedW = QMAX( d->cachedW, item->x() + item->width() );
+	    d->cachedH= QMAX( d->cachedH, item->y() + item->height() );
+
+	    d->updateTimer->start( 0, TRUE );
+	} else {
+	    insertInGrid( item );
+
+	    viewport()->update(item->x() - contentsX(),
+			       item->y() - contentsY(),
+			       item->width(), item->height());
+	}
+    } else if ( !autoArrange() ) {
+	item->dirty = FALSE;
+    }
+
+    d->count++;
+    d->dirty = TRUE;
+}
+
+/*!
+    This slot is used for a slightly-delayed update.
+
+    The icon view is not redrawn immediately after inserting a new item
+    but after a very small delay using a QTimer. This means that when
+    many items are inserted in a loop the icon view is probably redrawn
+    only once at the end of the loop. This makes the insertions both
+    flicker-free and faster.
+*/
+
+void QIconView::slotUpdate()
+{
+    d->updateTimer->stop();
+    d->fullRedrawTimer->stop();
+
+    if ( !d->firstItem || !d->lastItem )
+	return;
+
+    // #### remove that ASA insertInGrid uses cached values and is efficient
+    if ( d->resortItemsWhenInsert )
+	sort( d->sortDirection );
+    else {
+	int y = d->spacing;
+	QIconViewItem *item = d->firstItem;
+	int w = 0, h = 0;
+	while ( item ) {
+	    bool changed;
+	    QIconViewItem *next = makeRowLayout( item, y, changed );
+	    if ( !next || !next->next )
+		break;
+
+	    if( !QApplication::reverseLayout() )
+		item = next;
+	    w = QMAX( w, item->x() + item->width() );
+	    h = QMAX( h, item->y() + item->height() );
+	    item = next;
+	    if ( d->arrangement == LeftToRight )
+		h = QMAX( h, y );
+
+	    item = item->next;
+	}
+
+	if ( d->lastItem && d->arrangement == TopToBottom ) {
+	    item = d->lastItem;
+	    int x = item->x();
+	    while ( item && item->x() >= x ) {
+		w = QMAX( w, item->x() + item->width() );
+		h = QMAX( h, item->y() + item->height() );
+		item = item->prev;
+	    }
+	}
+
+	w = QMAX( QMAX( d->cachedW, w ), d->lastItem->x() + d->lastItem->width() );
+	h = QMAX( QMAX( d->cachedH, h ), d->lastItem->y() + d->lastItem->height() );
+
+	if ( d->arrangement == TopToBottom )
+	    w += d->spacing;
+	else
+	    h += d->spacing;
+	viewport()->setUpdatesEnabled( FALSE );
+	resizeContents( w, h );
+	viewport()->setUpdatesEnabled( TRUE );
+	viewport()->repaint( FALSE );
+    }
+
+    int cx = d->cachedContentsX == -1 ? contentsX() : d->cachedContentsX;
+    int cy = d->cachedContentsY == -1 ? contentsY() : d->cachedContentsY;
+
+    if ( cx != contentsX() || cy != contentsY() )
+	setContentsPos( cx, cy );
+
+    d->cachedContentsX = d->cachedContentsY = -1;
+    d->cachedW = d->cachedH = 0;
+}
+
+/*!
+    Takes the icon view item \a item out of the icon view and causes
+    an update of the screen display. The item is not deleted. You
+    should normally not need to call this function because
+    QIconViewItem::~QIconViewItem() calls it. The normal way to delete
+    an item is to delete it.
+*/
+
+void QIconView::takeItem( QIconViewItem *item )
+{
+    if ( !item )
+	return;
+
+    if ( item->d->container1 )
+	item->d->container1->items.removeRef( item );
+    if ( item->d->container2 )
+	item->d->container2->items.removeRef( item );
+    item->d->container2 = 0;
+    item->d->container1 = 0;
+
+    bool block = signalsBlocked();
+    blockSignals( d->clearing );
+
+    QRect r = item->rect();
+
+    if ( d->currentItem == item ) {
+	if ( item->prev ) {
+	    d->currentItem = item->prev;
+	    emit currentChanged( d->currentItem );
+	    repaintItem( d->currentItem );
+	} else if ( item->next ) {
+	    d->currentItem = item->next;
+	    emit currentChanged( d->currentItem );
+	    repaintItem( d->currentItem );
+	} else {
+	    d->currentItem = 0;
+	    emit currentChanged( d->currentItem );
+	}
+    }
+    if ( item->isSelected() ) {
+	item->selected = FALSE;
+	emit selectionChanged();
+    }
+
+    if ( item == d->firstItem ) {
+	d->firstItem = d->firstItem->next;
+	if ( d->firstItem )
+	    d->firstItem->prev = 0;
+    } else if ( item == d->lastItem ) {
+	d->lastItem = d->lastItem->prev;
+	if ( d->lastItem )
+	    d->lastItem->next = 0;
+    } else {
+	QIconViewItem *i = item;
+	if ( i ) {
+	    if ( i->prev )
+		i->prev->next = i->next;
+	    if ( i->next )
+		i->next->prev = i->prev;
+	}
+    }
+
+    if ( d->selectAnchor == item )
+	d->selectAnchor = d->currentItem;
+
+    if ( !d->clearing )
+	repaintContents( r.x(), r.y(), r.width(), r.height(), TRUE );
+
+    item->view = 0;
+    item->prev = 0;
+    item->next = 0;
+    d->count--;
+
+    blockSignals( block );
+}
+
+/*!
+    Returns the index of \a item, or -1 if \a item doesn't exist in
+    this icon view.
+*/
+
+int QIconView::index( const QIconViewItem *item ) const
+{
+    if ( !item )
+	return -1;
+
+    if ( item == d->firstItem )
+	return 0;
+    else if ( item == d->lastItem )
+	return d->count - 1;
+    else {
+	QIconViewItem *i = d->firstItem;
+	int j = 0;
+	while ( i && i != item ) {
+	    i = i->next;
+	    ++j;
+	}
+
+	return i ? j : -1;
+    }
+}
+
+/*!
+    Returns a pointer to the first item of the icon view, or 0 if
+    there are no items in the icon view.
+
+    \sa lastItem() currentItem()
+*/
+
+QIconViewItem *QIconView::firstItem() const
+{
+    return d->firstItem;
+}
+
+/*!
+    Returns a pointer to the last item of the icon view, or 0 if there
+    are no items in the icon view.
+
+    \sa firstItem() currentItem()
+*/
+
+QIconViewItem *QIconView::lastItem() const
+{
+    return d->lastItem;
+}
+
+/*!
+    Returns a pointer to the current item of the icon view, or 0 if no
+    item is current.
+
+    \sa setCurrentItem() firstItem() lastItem()
+*/
+
+QIconViewItem *QIconView::currentItem() const
+{
+    return d->currentItem;
+}
+
+/*!
+    Makes \a item the new current item of the icon view.
+*/
+
+void QIconView::setCurrentItem( QIconViewItem *item )
+{
+    if ( !item || item == d->currentItem )
+	return;
+
+    setMicroFocusHint( item->x(), item->y(), item->width(), item->height(), FALSE );
+
+    QIconViewItem *old = d->currentItem;
+    d->currentItem = item;
+    emit currentChanged( d->currentItem );
+    if ( d->selectionMode == Single ) {
+	bool changed = FALSE;
+	if ( old && old->selected ) {
+	    old->selected = FALSE;
+	    changed = TRUE;
+	}
+	if ( item && !item->selected && item->isSelectable() && d->selectionMode != NoSelection ) {
+	    item->selected = TRUE;
+	    changed = TRUE;
+	    emit selectionChanged( item );
+	}
+	if ( changed )
+	    emit selectionChanged();
+    }
+
+    if ( old )
+	repaintItem( old );
+    repaintItem( d->currentItem );
+}
+
+/*!
+    Selects or unselects \a item depending on \a s, and may also
+    unselect other items, depending on QIconView::selectionMode() and
+    \a cb.
+
+    If \a s is FALSE, \a item is unselected.
+
+    If \a s is TRUE and QIconView::selectionMode() is \c Single, \a
+    item is selected, and the item which was selected is unselected.
+
+    If \a s is TRUE and QIconView::selectionMode() is \c Extended, \a
+    item is selected. If \a cb is TRUE, the selection state of the
+    icon view's other items is left unchanged. If \a cb is FALSE (the
+    default) all other items are unselected.
+
+    If \a s is TRUE and QIconView::selectionMode() is \c Multi \a item
+    is selected.
+
+    Note that \a cb is used only if QIconView::selectionMode() is \c
+    Extended. \a cb defaults to FALSE.
+
+    All items whose selection status is changed repaint themselves.
+*/
+
+void QIconView::setSelected( QIconViewItem *item, bool s, bool cb )
+{
+    if ( !item )
+	return;
+    item->setSelected( s, cb );
+}
+
+/*!
+    \property QIconView::count
+    \brief the number of items in the icon view
+*/
+
+uint QIconView::count() const
+{
+    return d->count;
+}
+
+/*!
+    Performs autoscrolling when selecting multiple icons with the
+    rubber band.
+*/
+
+void QIconView::doAutoScroll()
+{
+    QRect oldRubber = QRect( *d->rubber );
+
+    QPoint vp = viewport()->mapFromGlobal( QCursor::pos() );
+    QPoint pos = viewportToContents( vp );
+
+    if ( pos == d->rubber->bottomRight() )
+	return;
+
+    d->rubber->setRight( pos.x() );
+    d->rubber->setBottom( pos.y() );
+
+    int minx = contentsWidth(), miny = contentsHeight();
+    int maxx = 0, maxy = 0;
+    bool changed = FALSE;
+    bool block = signalsBlocked();
+
+    QRect rr;
+    QRegion region( 0, 0, visibleWidth(), visibleHeight() );
+
+    blockSignals( TRUE );
+    viewport()->setUpdatesEnabled( FALSE );
+    bool alreadyIntersected = FALSE;
+    QRect nr = d->rubber->normalize();
+    QRect rubberUnion = nr.unite( oldRubber.normalize() );
+    QIconViewPrivate::ItemContainer *c = d->firstContainer;
+    for ( ; c; c = c->n ) {
+	if ( c->rect.intersects( rubberUnion ) ) {
+	    alreadyIntersected = TRUE;
+	    QIconViewItem *item = c->items.first();
+	    for ( ; item; item = c->items.next() ) {
+		if ( d->selectedItems.find( item ) )
+		    continue;
+		if ( !item->intersects( nr ) ) {
+		    if ( item->isSelected() ) {
+			item->setSelected( FALSE );
+			changed = TRUE;
+			rr = rr.unite( item->rect() );
+		    }
+		} else if ( item->intersects( nr ) ) {
+		    if ( !item->isSelected() && item->isSelectable() ) {
+			item->setSelected( TRUE, TRUE );
+			changed = TRUE;
+			rr = rr.unite( item->rect() );
+		    } else {
+			region = region.subtract( QRect( contentsToViewport( item->pos() ),
+							 item->size() ) );
+		    }
+
+		    minx = QMIN( minx, item->x() - 1 );
+		    miny = QMIN( miny, item->y() - 1 );
+		    maxx = QMAX( maxx, item->x() + item->width() + 1 );
+		    maxy = QMAX( maxy, item->y() + item->height() + 1 );
+		}
+	    }
+	} else {
+	    if ( alreadyIntersected )
+		break;
+	}
+    }
+    viewport()->setUpdatesEnabled( TRUE );
+    blockSignals( block );
+
+    QRect r = *d->rubber;
+    *d->rubber = oldRubber;
+
+    QPainter p;
+    p.begin( viewport() );
+    p.setRasterOp( NotROP );
+    p.setPen( QPen( color0, 1 ) );
+    p.setBrush( NoBrush );
+    drawRubber( &p );
+    d->dragging = FALSE;
+    p.end();
+
+    *d->rubber = r;
+
+    if ( changed ) {
+	d->drawAllBack = FALSE;
+	d->clipRegion = region;
+	repaintContents( rr, FALSE );
+	d->drawAllBack = TRUE;
+    }
+
+    ensureVisible( pos.x(), pos.y() );
+
+    p.begin( viewport() );
+    p.setRasterOp( NotROP );
+    p.setPen( QPen( color0, 1 ) );
+    p.setBrush( NoBrush );
+    drawRubber( &p );
+    d->dragging = TRUE;
+
+    p.end();
+
+    if ( changed ) {
+	emit selectionChanged();
+	if ( d->selectionMode == Single )
+	    emit selectionChanged( d->currentItem );
+    }
+
+    if ( !QRect( 50, 50, viewport()->width()-100, viewport()->height()-100 ).contains( vp ) &&
+	 !d->scrollTimer ) {
+	d->scrollTimer = new QTimer( this );
+
+	connect( d->scrollTimer, SIGNAL( timeout() ),
+		 this, SLOT( doAutoScroll() ) );
+	d->scrollTimer->start( 100, FALSE );
+    } else if ( QRect( 50, 50, viewport()->width()-100, viewport()->height()-100 ).contains( vp ) &&
+		d->scrollTimer ) {
+	disconnect( d->scrollTimer, SIGNAL( timeout() ),
+		    this, SLOT( doAutoScroll() ) );
+	d->scrollTimer->stop();
+	delete d->scrollTimer;
+	d->scrollTimer = 0;
+    }
+
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::drawContents( QPainter *p, int cx, int cy, int cw, int ch )
+{
+    if ( d->dragging && d->rubber )
+	drawRubber( p );
+
+    QRect r = QRect( cx, cy, cw, ch );
+
+    QIconViewPrivate::ItemContainer *c = d->firstContainer;
+    QRegion remaining( QRect( cx, cy, cw, ch ) );
+    bool alreadyIntersected = FALSE;
+    while ( c ) {
+	if ( c->rect.intersects( r ) ) {
+	    p->save();
+	    p->resetXForm();
+	    QRect r2 = c->rect;
+	    r2 = r2.intersect( r );
+	    QRect r3( contentsToViewport( QPoint( r2.x(), r2.y() ) ), QSize( r2.width(), r2.height() ) );
+	    if ( d->drawAllBack ) {
+		p->setClipRect( r3 );
+	    } else {
+		QRegion reg = d->clipRegion.intersect( r3 );
+		p->setClipRegion( reg );
+	    }
+	    drawBackground( p, r3 );
+	    remaining = remaining.subtract( r3 );
+	    p->restore();
+
+	    QColorGroup cg;
+	    d->drawActiveSelection = hasFocus() || d->inMenuMode
+		|| !style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus, this );
+
+	    if ( !d->drawActiveSelection )
+		cg = palette().inactive();
+	    else
+		cg = colorGroup();
+
+	    QIconViewItem *item = c->items.first();
+	    // clip items to the container rect by default... this
+	    // prevents icons with alpha channels from being painted
+	    // twice when they are in 2 containers
+	    //
+	    // NOTE: the item could override this cliprect in it's
+	    // paintItem() implementation, which makes this useless
+	    p->setClipRect( QRect( contentsToViewport( r2.topLeft() ), r2.size() ) );
+	    for ( ; item; item = c->items.next() ) {
+		if ( item->rect().intersects( r ) && !item->dirty ) {
+		    p->save();
+		    p->setFont( font() );
+		    item->paintItem( p, cg );
+		    p->restore();
+		}
+	    }
+	    alreadyIntersected = TRUE;
+	} else {
+	    if ( alreadyIntersected )
+		break;
+	}
+	c = c->n;
+    }
+
+    if ( !remaining.isNull() && !remaining.isEmpty() ) {
+	p->save();
+	p->resetXForm();
+	if ( d->drawAllBack ) {
+	    p->setClipRegion( remaining );
+	} else {
+	    remaining = d->clipRegion.intersect( remaining );
+	    p->setClipRegion( remaining );
+	}
+	drawBackground( p, remaining.boundingRect() );
+	p->restore();
+    }
+
+    if ( ( hasFocus() || viewport()->hasFocus() ) && d->currentItem &&
+	 d->currentItem->rect().intersects( r ) ) {
+	d->currentItem->paintFocus( p, colorGroup() );
+    }
+
+    if ( d->dragging && d->rubber )
+	drawRubber( p );
+}
+
+/*!
+    \overload
+
+    Arranges all the items in the grid given by gridX() and gridY().
+
+    Even if sorting() is enabled, the items are not sorted by this
+    function. If you want to sort or rearrange the items, use
+    iconview->sort(iconview->sortDirection()).
+
+    If \a update is TRUE (the default), the viewport is repainted as
+    well.
+
+    \sa QIconView::setGridX(), QIconView::setGridY(), QIconView::sort()
+*/
+
+void QIconView::arrangeItemsInGrid( bool update )
+{
+    if ( !d->firstItem || !d->lastItem )
+	return;
+
+    d->containerUpdateLocked = TRUE;
+
+    int w = 0, h = 0, y = d->spacing;
+
+    QIconViewItem *item = d->firstItem;
+    bool changedLayout = FALSE;
+    while ( item ) {
+	bool changed;
+	QIconViewItem *next = makeRowLayout( item, y, changed );
+	changedLayout = changed || changedLayout;
+	if( !QApplication::reverseLayout() )
+	    item = next;
+	w = QMAX( w, item->x() + item->width() );
+	h = QMAX( h, item->y() + item->height() );
+	item = next;
+	if ( d->arrangement == LeftToRight )
+	    h = QMAX( h, y );
+
+	if ( !item || !item->next )
+	    break;
+
+	item = item->next;
+    }
+
+    if ( d->lastItem && d->arrangement == TopToBottom ) {
+	item = d->lastItem;
+	int x = item->x();
+	while ( item && item->x() >= x ) {
+	    w = QMAX( w, item->x() + item->width() );
+	    h = QMAX( h, item->y() + item->height() );
+	    item = item->prev;
+	}
+    }
+    d->containerUpdateLocked = FALSE;
+
+    w = QMAX( QMAX( d->cachedW, w ), d->lastItem->x() + d->lastItem->width() );
+    h = QMAX( QMAX( d->cachedH, h ), d->lastItem->y() + d->lastItem->height() );
+
+    if ( d->arrangement == TopToBottom )
+	w += d->spacing;
+    else
+	h += d->spacing;
+
+    bool ue = isUpdatesEnabled();
+    viewport()->setUpdatesEnabled( FALSE );
+    int vw = visibleWidth();
+    int vh = visibleHeight();
+    resizeContents( w, h );
+    bool doAgain = FALSE;
+    if ( d->arrangement == LeftToRight )
+	doAgain = visibleWidth() != vw;
+    if ( d->arrangement == TopToBottom )
+	doAgain = visibleHeight() != vh;
+    if ( doAgain ) // in the case that the visibleExtend changed because of the resizeContents (scrollbar show/hide), redo layout again
+	arrangeItemsInGrid( FALSE );
+    viewport()->setUpdatesEnabled( ue );
+    d->dirty = !isVisible();
+    rebuildContainers();
+    if ( update && ( !optimize_layout || changedLayout ) )
+	repaintContents( contentsX(), contentsY(), viewport()->width(), viewport()->height(), FALSE );
+}
+
+/*!
+    This variant uses \a grid instead of (gridX(), gridY()). If \a
+    grid is invalid (see QSize::isValid()), arrangeItemsInGrid()
+    calculates a valid grid itself and uses that.
+
+    If \a update is TRUE (the default) the viewport is repainted.
+*/
+
+void QIconView::arrangeItemsInGrid( const QSize &grid, bool update )
+{
+    d->containerUpdateLocked = TRUE;
+    QSize grid_( grid );
+    if ( !grid_.isValid() ) {
+	int w = 0, h = 0;
+	QIconViewItem *item = d->firstItem;
+	for ( ; item; item = item->next ) {
+	    w = QMAX( w, item->width() );
+	    h = QMAX( h, item->height() );
+	}
+
+	grid_ = QSize( QMAX( d->rastX + d->spacing, w ),
+		       QMAX( d->rastY + d->spacing, h ) );
+    }
+
+    int w = 0, h = 0;
+    QIconViewItem *item = d->firstItem;
+    for ( ; item; item = item->next ) {
+	int nx = item->x() / grid_.width();
+	int ny = item->y() / grid_.height();
+	item->move( nx * grid_.width(),
+		    ny * grid_.height() );
+	w = QMAX( w, item->x() + item->width() );
+	h = QMAX( h, item->y() + item->height() );
+	item->dirty = FALSE;
+    }
+    d->containerUpdateLocked = FALSE;
+
+    resizeContents( w, h );
+    rebuildContainers();
+    if ( update )
+	repaintContents( contentsX(), contentsY(), viewport()->width(), viewport()->height(), FALSE );
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::setContentsPos( int x, int y )
+{
+    if ( d->updateTimer->isActive() ) {
+	d->cachedContentsX = x;
+	d->cachedContentsY = y;
+    } else {
+	d->cachedContentsY = d->cachedContentsX = -1;
+	QScrollView::setContentsPos( x, y );
+    }
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::showEvent( QShowEvent * )
+{
+    if ( d->dirty ) {
+	resizeContents( QMAX( contentsWidth(), viewport()->width() ),
+			QMAX( contentsHeight(), viewport()->height() ) );
+	if ( d->resortItemsWhenInsert )
+	    sort( d->sortDirection );
+	if ( autoArrange() )
+	    arrangeItemsInGrid( FALSE );
+    }
+    QScrollView::show();
+}
+
+/*!
+    \property QIconView::selectionMode
+    \brief the selection mode of the icon view
+
+    This can be \c Single (the default), \c Extended, \c Multi or \c
+    NoSelection.
+*/
+
+void QIconView::setSelectionMode( SelectionMode m )
+{
+    d->selectionMode = m;
+}
+
+QIconView::SelectionMode QIconView::selectionMode() const
+{
+    return d->selectionMode;
+}
+
+/*!
+    Returns a pointer to the item that contains point \a pos, which is
+    given in contents coordinates, or 0 if no item contains point \a
+    pos.
+*/
+
+QIconViewItem *QIconView::findItem( const QPoint &pos ) const
+{
+    if ( !d->firstItem )
+	return 0;
+
+    QIconViewPrivate::ItemContainer *c = d->lastContainer;
+    for ( ; c; c = c->p ) {
+	if ( c->rect.contains( pos ) ) {
+	    QIconViewItem *item = c->items.last();
+	    for ( ; item; item = c->items.prev() )
+		if ( item->contains( pos ) )
+		    return item;
+	}
+    }
+
+    return 0;
+}
+
+/*!
+    \overload
+
+    Returns a pointer to the first item whose text begins with \a
+    text, or 0 if no such item could be found. Use the \a compare flag
+    to control the comparison behaviour. (See \l
+    {Qt::StringComparisonMode}.)
+*/
+
+QIconViewItem *QIconView::findItem( const QString &text, ComparisonFlags compare ) const
+{
+    if ( !d->firstItem )
+	return 0;
+
+    if ( compare == CaseSensitive || compare == 0 )
+	compare |= ExactMatch;
+
+    QString itmtxt;
+    QString comtxt = text;
+    if ( ! (compare & CaseSensitive) )
+	comtxt = text.lower();
+
+    QIconViewItem *item;
+    if ( d->currentItem )
+	item = d->currentItem;
+    else
+	item = d->firstItem;
+
+    QIconViewItem *beginsWithItem = 0;
+    QIconViewItem *endsWithItem = 0;
+    QIconViewItem *containsItem = 0;
+
+    if ( item ) {
+	for ( ; item; item = item->next ) {
+	    if ( ! (compare & CaseSensitive) )
+		itmtxt = item->text().lower();
+	    else
+		itmtxt = item->text();
+
+	    if ( compare & ExactMatch && itmtxt == comtxt )
+		return item;
+	    if ( compare & BeginsWith && !beginsWithItem && itmtxt.startsWith( comtxt ) )
+		beginsWithItem = containsItem = item;
+	    if ( compare & EndsWith && !endsWithItem && itmtxt.endsWith( comtxt ) )
+		endsWithItem = containsItem = item;
+	    if ( compare & Contains && !containsItem && itmtxt.contains( comtxt ) )
+		containsItem = item;
+	}
+
+	if ( d->currentItem && d->firstItem ) {
+	    item = d->firstItem;
+	    for ( ; item && item != d->currentItem; item = item->next ) {
+		if ( ! (compare & CaseSensitive) )
+		    itmtxt = item->text().lower();
+		else
+		    itmtxt = item->text();
+
+		if ( compare & ExactMatch && itmtxt == comtxt )
+		    return item;
+		if ( compare & BeginsWith && !beginsWithItem && itmtxt.startsWith( comtxt ) )
+		    beginsWithItem = containsItem = item;
+		if ( compare & EndsWith && !endsWithItem && itmtxt.endsWith( comtxt ) )
+		    endsWithItem = containsItem = item;
+		if ( compare & Contains && !containsItem && itmtxt.contains( comtxt ) )
+		    containsItem = item;
+	    }
+	}
+    }
+
+    // Obey the priorities
+    if ( beginsWithItem )
+	return beginsWithItem;
+    else if ( endsWithItem )
+	return endsWithItem;
+    else if ( containsItem )
+	return containsItem;
+    return 0;
+}
+
+/*!
+    Unselects all the items.
+*/
+
+void QIconView::clearSelection()
+{
+    selectAll( FALSE );
+}
+
+/*!
+    In Multi and Extended modes, this function sets all items to be
+    selected if \a select is TRUE, and to be unselected if \a select
+    is FALSE.
+
+    In Single and NoSelection modes, this function only changes the
+    selection status of currentItem().
+*/
+
+void QIconView::selectAll( bool select )
+{
+    if ( d->selectionMode == NoSelection )
+	return;
+
+    if ( d->selectionMode == Single ) {
+	if ( d->currentItem )
+	    d->currentItem->setSelected( select );
+	return;
+    }
+
+    bool b = signalsBlocked();
+    blockSignals( TRUE );
+    QIconViewItem *item = d->firstItem;
+    QIconViewItem *i = d->currentItem;
+    bool changed = FALSE;
+    bool ue = viewport()->isUpdatesEnabled();
+    viewport()->setUpdatesEnabled( FALSE );
+    QRect rr;
+    for ( ; item; item = item->next ) {
+	if ( select != item->isSelected() ) {
+ 	    item->setSelected( select, TRUE );
+	    rr = rr.unite( item->rect() );
+	    changed = TRUE;
+	}
+    }
+    viewport()->setUpdatesEnabled( ue );
+    // we call updateContents not repaintContents because of possible previous updateContents
+    QScrollView::updateContents( rr );
+    QApplication::sendPostedEvents( viewport(), QEvent::Paint );
+    if ( i )
+	setCurrentItem( i );
+    blockSignals( b );
+    if ( changed ) {
+	emit selectionChanged();
+    }
+}
+
+/*!
+    Inverts the selection. Works only in Multi and Extended selection
+    mode.
+*/
+
+void QIconView::invertSelection()
+{
+    if ( d->selectionMode == Single ||
+	 d->selectionMode == NoSelection )
+	return;
+
+    bool b = signalsBlocked();
+    blockSignals( TRUE );
+    QIconViewItem *item = d->firstItem;
+    for ( ; item; item = item->next )
+	item->setSelected( !item->isSelected(), TRUE );
+    blockSignals( b );
+    emit selectionChanged();
+}
+
+/*!
+    Repaints the \a item.
+*/
+
+void QIconView::repaintItem( QIconViewItem *item )
+{
+    if ( !item || item->dirty )
+	return;
+
+    if ( QRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ).
+	 intersects( QRect( item->x() - 1, item->y() - 1, item->width() + 2, item->height() + 2 ) ) )
+	repaintContents( item->x() - 1, item->y() - 1, item->width() + 2, item->height() + 2, FALSE );
+}
+
+/*!
+    Repaints the selected items.
+*/
+void QIconView::repaintSelectedItems()
+{
+    if ( selectionMode() == NoSelection )
+	return;
+
+    if ( selectionMode() == Single ) {
+	if ( !currentItem() || !currentItem()->isSelected() )
+	    return;
+	QRect itemRect = currentItem()->rect(); //rect in contents coordinates
+	itemRect.moveBy( -contentsX(), -contentsY() );
+	viewport()->update( itemRect );
+    } else {
+	// check if any selected items are visible
+	QIconViewItem *item = firstItem();
+	const QRect vr = QRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
+
+	while ( item ) {
+	    if ( item->isSelected() && item->rect().intersects( vr ) )
+		repaintItem( item );
+	    item = item->nextItem();
+	}
+    }
+}
+
+/*!
+    Makes sure that \a item is entirely visible. If necessary,
+    ensureItemVisible() scrolls the icon view.
+
+    \sa ensureVisible()
+*/
+
+void QIconView::ensureItemVisible( QIconViewItem *item )
+{
+    if ( !item )
+	return;
+
+    if ( d->updateTimer && d->updateTimer->isActive() ||
+	 d->fullRedrawTimer && d->fullRedrawTimer->isActive() )
+	slotUpdate();
+
+    int w = item->width();
+    int h = item->height();
+    ensureVisible( item->x() + w / 2, item->y() + h / 2,
+		   w / 2 + 1, h / 2 + 1 );
+}
+
+/*!
+    Finds the first item whose bounding rectangle overlaps \a r and
+    returns a pointer to that item. \a r is given in content
+    coordinates. Returns 0 if no item overlaps \a r.
+
+    If you want to find all items that touch \a r, you will need to
+    use this function and nextItem() in a loop ending at
+    findLastVisibleItem() and test QIconViewItem::rect() for each of
+    these items.
+
+    \sa findLastVisibleItem() QIconViewItem::rect()
+*/
+
+QIconViewItem* QIconView::findFirstVisibleItem( const QRect &r ) const
+{
+    QIconViewPrivate::ItemContainer *c = d->firstContainer;
+    QIconViewItem *i = 0;
+    bool alreadyIntersected = FALSE;
+    for ( ; c; c = c->n ) {
+	if ( c->rect.intersects( r ) ) {
+	    alreadyIntersected = TRUE;
+	    QIconViewItem *item = c->items.first();
+	    for ( ; item; item = c->items.next() ) {
+		if ( r.intersects( item->rect() ) ) {
+		    if ( !i ) {
+			i = item;
+		    } else {
+			QRect r2 = item->rect();
+			QRect r3 = i->rect();
+			if ( r2.y() < r3.y() )
+			    i = item;
+			else if ( r2.y() == r3.y() &&
+				  r2.x() < r3.x() )
+			    i = item;
+		    }
+		}
+	    }
+	} else {
+	    if ( alreadyIntersected )
+		break;
+	}
+    }
+
+    return i;
+}
+
+/*!
+    Finds the last item whose bounding rectangle overlaps \a r and
+    returns a pointer to that item. \a r is given in content
+    coordinates. Returns 0 if no item overlaps \a r.
+
+    \sa findFirstVisibleItem()
+*/
+
+QIconViewItem* QIconView::findLastVisibleItem( const QRect &r ) const
+{
+    QIconViewPrivate::ItemContainer *c = d->firstContainer;
+    QIconViewItem *i = 0;
+    bool alreadyIntersected = FALSE;
+    for ( ; c; c = c->n ) {
+	if ( c->rect.intersects( r ) ) {
+	    alreadyIntersected = TRUE;
+	    QIconViewItem *item = c->items.first();
+	    for ( ; item; item = c->items.next() ) {
+		if ( r.intersects( item->rect() ) ) {
+		    if ( !i ) {
+			i = item;
+		    } else {
+			QRect r2 = item->rect();
+			QRect r3 = i->rect();
+			if ( r2.y() > r3.y() )
+			    i = item;
+			else if ( r2.y() == r3.y() &&
+				  r2.x() > r3.x() )
+			    i = item;
+		    }
+		}
+	    }
+	} else {
+	    if ( alreadyIntersected )
+		break;
+	}
+    }
+
+    return i;
+}
+
+/*!
+    Clears the icon view. All items are deleted.
+*/
+
+void QIconView::clear()
+{
+    setContentsPos( 0, 0 );
+    d->clearing = TRUE;
+    bool block = signalsBlocked();
+    blockSignals( TRUE );
+    clearSelection();
+    blockSignals( block );
+    setContentsPos( 0, 0 );
+    d->currentItem = 0;
+
+    if ( !d->firstItem ) {
+	d->clearing = FALSE;
+	return;
+    }
+
+    QIconViewItem *item = d->firstItem, *tmp;
+    d->firstItem = 0;
+    while ( item ) {
+	tmp = item->next;
+	delete item;
+	item = tmp;
+    }
+    QIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc;
+    while ( c ) {
+	tmpc = c->n;
+	delete c;
+	c = tmpc;
+    }
+    d->firstContainer = d->lastContainer = 0;
+
+    d->count = 0;
+    d->lastItem = 0;
+    setCurrentItem( 0 );
+    d->highlightedItem = 0;
+    d->tmpCurrentItem = 0;
+    d->drawDragShapes = FALSE;
+
+    resizeContents( 0, 0 );
+    // maybe we donŽt need this update, so delay it
+    d->fullRedrawTimer->start( 0, TRUE );
+
+    d->cleared = TRUE;
+    d->clearing = FALSE;
+}
+
+/*!
+    \property QIconView::gridX
+    \brief the horizontal grid  of the icon view
+
+    If the value is -1, (the default), QIconView computes suitable
+    column widths based on the icon view's contents.
+
+    Note that setting a grid width overrides setMaxItemWidth().
+*/
+
+void QIconView::setGridX( int rx )
+{
+    d->rastX = rx >= 0 ? rx : -1;
+}
+
+/*!
+    \property QIconView::gridY
+    \brief the vertical grid  of the icon view
+
+    If the value is -1, (the default), QIconView computes suitable
+    column heights based on the icon view's contents.
+*/
+
+void QIconView::setGridY( int ry )
+{
+    d->rastY = ry >= 0 ? ry : -1;
+}
+
+int QIconView::gridX() const
+{
+    return d->rastX;
+}
+
+int QIconView::gridY() const
+{
+    return d->rastY;
+}
+
+/*!
+    \property QIconView::spacing
+    \brief the space in pixels between icon view items
+
+    The default is 5 pixels.
+
+    Negative values for spacing are illegal.
+*/
+
+void QIconView::setSpacing( int sp )
+{
+    d->spacing = sp;
+}
+
+int QIconView::spacing() const
+{
+    return d->spacing;
+}
+
+/*!
+    \property QIconView::itemTextPos
+    \brief the position where the text of each item is drawn.
+
+    Valid values are \c Bottom or \c Right. The default is \c Bottom.
+*/
+
+void QIconView::setItemTextPos( ItemTextPos pos )
+{
+    if ( pos == d->itemTextPos || ( pos != Bottom && pos != Right ) )
+	return;
+
+    d->itemTextPos = pos;
+
+    QIconViewItem *item = d->firstItem;
+    for ( ; item; item = item->next ) {
+	item->wordWrapDirty = TRUE;
+	item->calcRect();
+    }
+
+    arrangeItemsInGrid( TRUE );
+}
+
+QIconView::ItemTextPos QIconView::itemTextPos() const
+{
+    return d->itemTextPos;
+}
+
+/*!
+    \property QIconView::itemTextBackground
+    \brief the brush to use when drawing the background of an item's text.
+
+    By default this brush is set to NoBrush, meaning that only the
+    normal icon view background is used.
+*/
+
+void QIconView::setItemTextBackground( const QBrush &brush )
+{
+    d->itemTextBrush = brush;
+}
+
+QBrush QIconView::itemTextBackground() const
+{
+    return d->itemTextBrush;
+}
+
+/*!
+    \property QIconView::arrangement
+    \brief the arrangement mode of the icon view
+
+    This can be \c LeftToRight or \c TopToBottom. The default is \c
+    LeftToRight.
+*/
+
+void QIconView::setArrangement( Arrangement am )
+{
+    if ( d->arrangement == am )
+	return;
+
+    d->arrangement = am;
+
+    viewport()->setUpdatesEnabled( FALSE );
+    resizeContents( viewport()->width(), viewport()->height() );
+    viewport()->setUpdatesEnabled( TRUE );
+    arrangeItemsInGrid( TRUE );
+}
+
+QIconView::Arrangement QIconView::arrangement() const
+{
+    return d->arrangement;
+}
+
+/*!
+    \property QIconView::resizeMode
+    \brief the resize mode of the icon view
+
+    This can be \c Fixed or \c Adjust. The default is \c Fixed.
+    See \l ResizeMode.
+*/
+
+void QIconView::setResizeMode( ResizeMode rm )
+{
+    if ( d->resizeMode == rm )
+	return;
+
+    d->resizeMode = rm;
+}
+
+QIconView::ResizeMode QIconView::resizeMode() const
+{
+    return d->resizeMode;
+}
+
+/*!
+    \property QIconView::maxItemWidth
+    \brief the maximum width that an item may have.
+
+    The default is 100 pixels.
+
+    Note that if the gridX() value is set QIconView will ignore
+    this property.
+*/
+
+void QIconView::setMaxItemWidth( int w )
+{
+    d->maxItemWidth = w;
+}
+
+/*!
+    \property QIconView::maxItemTextLength
+    \brief the maximum length (in characters) that an item's text may have.
+
+    The default is 255 characters.
+*/
+
+void QIconView::setMaxItemTextLength( int w )
+{
+    d->maxItemTextLength = w;
+}
+
+int QIconView::maxItemWidth() const
+{
+    if ( d->rastX != -1 )
+	return d->rastX - 2;
+    else
+	return d->maxItemWidth;
+}
+
+int QIconView::maxItemTextLength() const
+{
+    return d->maxItemTextLength;
+}
+
+/*!
+    \property QIconView::itemsMovable
+    \brief whether the user is allowed to move items around in the icon view
+
+    The default is TRUE.
+*/
+
+void QIconView::setItemsMovable( bool b )
+{
+    d->rearrangeEnabled = b;
+}
+
+bool QIconView::itemsMovable() const
+{
+    return d->rearrangeEnabled;
+}
+
+/*!
+    \property QIconView::autoArrange
+    \brief whether the icon view rearranges its items when a new item is inserted.
+
+    The default is TRUE.
+
+    Note that if the icon view is not visible at the time of
+    insertion, QIconView defers all position-related work until it is
+    shown and then calls arrangeItemsInGrid().
+*/
+
+void QIconView::setAutoArrange( bool b )
+{
+    d->reorderItemsWhenInsert = b;
+}
+
+bool QIconView::autoArrange() const
+{
+    return d->reorderItemsWhenInsert;
+}
+
+/*!
+    If \a sort is TRUE, this function sets the icon view to sort items
+    when a new item is inserted. If \a sort is FALSE, the icon view
+    will not be sorted.
+
+    Note that autoArrange() must be TRUE for sorting to take place.
+
+    If \a ascending is TRUE (the default), items are sorted in
+    ascending order. If \a ascending is FALSE, items are sorted in
+    descending order.
+
+    QIconViewItem::compare() is used to compare pairs of items. The
+    sorting is based on the items' keys; these default to the items'
+    text unless specifically set to something else.
+
+    \sa QIconView::setAutoArrange(), QIconView::autoArrange(),
+    sortDirection(), sort(), QIconViewItem::setKey()
+*/
+
+void QIconView::setSorting( bool sort, bool ascending )
+{
+    d->resortItemsWhenInsert = sort;
+    d->sortDirection = ascending;
+}
+
+/*!
+    \property QIconView::sorting
+    \brief whether the icon view sorts on insertion
+
+    The default is FALSE, i.e. no sorting on insertion.
+
+    To set the sorting, use setSorting().
+*/
+
+bool QIconView::sorting() const
+{
+    return d->resortItemsWhenInsert;
+}
+
+/*!
+    \property QIconView::sortDirection
+    \brief whether the sort direction for inserting new items is ascending;
+
+    The default is TRUE (i.e. ascending). This sort direction is only
+    meaningful if both sorting() and autoArrange() are TRUE.
+
+    To set the sort direction, use setSorting()
+*/
+
+bool QIconView::sortDirection() const
+{
+    return d->sortDirection;
+}
+
+/*!
+    \property QIconView::wordWrapIconText
+    \brief whether the item text will be word-wrapped if it is too long
+
+    The default is TRUE.
+
+    If this property is FALSE, icon text that is too long is
+    truncated, and an ellipsis (...) appended to indicate that
+    truncation has occurred. The full text can still be seen by the
+    user if they hover the mouse because the full text is shown in a
+    tooltip; see setShowToolTips().
+*/
+
+void QIconView::setWordWrapIconText( bool b )
+{
+    if ( d->wordWrapIconText == (uint)b )
+	return;
+
+    d->wordWrapIconText = b;
+    for ( QIconViewItem *item = d->firstItem; item; item = item->next ) {
+	item->wordWrapDirty = TRUE;
+	item->calcRect();
+    }
+    arrangeItemsInGrid( TRUE );
+}
+
+bool QIconView::wordWrapIconText() const
+{
+    return d->wordWrapIconText;
+}
+
+/*!
+    \property QIconView::showToolTips
+    \brief whether the icon view will display a tool tip with the complete text for any truncated item text
+
+    The default is TRUE. Note that this has no effect if
+    setWordWrapIconText() is TRUE, as it is by default.
+*/
+
+void QIconView::setShowToolTips( bool b )
+{
+    d->showTips = b;
+}
+
+bool QIconView::showToolTips() const
+{
+    return d->showTips;
+}
+
+/*!
+    \reimp
+*/
+void QIconView::contentsMousePressEvent( QMouseEvent *e )
+{
+    contentsMousePressEventEx( e );
+}
+
+void QIconView::contentsMousePressEventEx( QMouseEvent *e )
+{
+    if ( d->rubber ) {
+	QPainter p;
+	p.begin( viewport() );
+	p.setRasterOp( NotROP );
+	p.setPen( QPen( color0, 1 ) );
+	p.setBrush( NoBrush );
+
+	drawRubber( &p );
+	d->dragging = FALSE;
+	p.end();
+	delete d->rubber;
+	d->rubber = 0;
+
+	if ( d->scrollTimer ) {
+	    disconnect( d->scrollTimer, SIGNAL( timeout() ), this, SLOT( doAutoScroll() ) );
+	    d->scrollTimer->stop();
+	    delete d->scrollTimer;
+	    d->scrollTimer = 0;
+	}
+    }
+
+    d->dragStartPos = e->pos();
+    QIconViewItem *item = findItem( e->pos() );
+    d->pressedItem = item;
+
+    if ( item )
+	d->selectAnchor = item;
+
+#ifndef QT_NO_TEXTEDIT
+    if ( d->renamingItem )
+	d->renamingItem->renameItem();
+#endif
+
+    if ( !d->currentItem && !item && d->firstItem ) {
+	d->currentItem = d->firstItem;
+	repaintItem( d->firstItem );
+    }
+
+    if (item && item->dragEnabled())
+	d->startDragItem = item;
+    else
+	d->startDragItem = 0;
+
+    if ( e->button() == LeftButton && !( e->state() & ShiftButton ) &&
+	 !( e->state() & ControlButton ) && item && item->isSelected() &&
+	 item->textRect( FALSE ).contains( e->pos() ) ) {
+
+	if ( !item->renameEnabled() ) {
+	    d->mousePressed = TRUE;
+#ifndef QT_NO_TEXTEDIT
+	} else {
+	    ensureItemVisible( item );
+	    setCurrentItem( item );
+	    item->rename();
+	    goto emit_signals;
+#endif
+	}
+    }
+
+    d->pressedSelected = item && item->isSelected();
+
+    if ( item && item->isSelectable() ) {
+	if ( d->selectionMode == Single )
+	    item->setSelected( TRUE, e->state() & ControlButton );
+	else if ( d->selectionMode == Multi )
+	    item->setSelected( !item->isSelected(), e->state() & ControlButton );
+	else if ( d->selectionMode == Extended ) {
+	    if ( e->state() & ShiftButton ) {
+		d->pressedSelected = FALSE;
+		bool block = signalsBlocked();
+		blockSignals( TRUE );
+		viewport()->setUpdatesEnabled( FALSE );
+		QRect r;
+		bool select = TRUE;
+		if ( d->currentItem )
+		    r = QRect( QMIN( d->currentItem->x(), item->x() ),
+			       QMIN( d->currentItem->y(), item->y() ),
+			       0, 0 );
+		else
+		    r = QRect( 0, 0, 0, 0 );
+		if ( d->currentItem ) {
+		    if ( d->currentItem->x() < item->x() )
+			r.setWidth( item->x() - d->currentItem->x() + item->width() );
+		    else
+			r.setWidth( d->currentItem->x() - item->x() + d->currentItem->width() );
+		    if ( d->currentItem->y() < item->y() )
+			r.setHeight( item->y() - d->currentItem->y() + item->height() );
+		    else
+			r.setHeight( d->currentItem->y() - item->y() + d->currentItem->height() );
+		    r = r.normalize();
+		    QIconViewPrivate::ItemContainer *c = d->firstContainer;
+		    bool alreadyIntersected = FALSE;
+		    QRect redraw;
+		    for ( ; c; c = c->n ) {
+			if ( c->rect.intersects( r ) ) {
+			    alreadyIntersected = TRUE;
+			    QIconViewItem *i = c->items.first();
+			    for ( ; i; i = c->items.next() ) {
+				if ( r.intersects( i->rect() ) ) {
+				    redraw = redraw.unite( i->rect() );
+				    i->setSelected( select, TRUE );
+				}
+			    }
+			} else {
+			    if ( alreadyIntersected )
+				break;
+			}
+		    }
+		    redraw = redraw.unite( item->rect() );
+		    viewport()->setUpdatesEnabled( TRUE );
+		    repaintContents( redraw, FALSE );
+		}
+		blockSignals( block );
+		viewport()->setUpdatesEnabled( TRUE );
+		item->setSelected( select, TRUE );
+		emit selectionChanged();
+	    } else if ( e->state() & ControlButton ) {
+		d->pressedSelected = FALSE;
+		item->setSelected( !item->isSelected(), e->state() & ControlButton );
+	    } else {
+		item->setSelected( TRUE, e->state() & ControlButton );
+	    }
+	}
+    } else if ( ( d->selectionMode != Single || e->button() == RightButton )
+		&& !( e->state() & ControlButton ) )
+	selectAll( FALSE );
+
+    setCurrentItem( item );
+
+    if ( e->button() == LeftButton ) {
+	if ( !item && ( d->selectionMode == Multi ||
+				  d->selectionMode == Extended ) ) {
+	    d->tmpCurrentItem = d->currentItem;
+	    d->currentItem = 0;
+	    repaintItem( d->tmpCurrentItem );
+	    if ( d->rubber )
+		delete d->rubber;
+	    d->rubber = 0;
+	    d->rubber = new QRect( e->x(), e->y(), 0, 0 );
+	    d->selectedItems.clear();
+	    if ( ( e->state() & ControlButton ) == ControlButton ) {
+		for ( QIconViewItem *i = firstItem(); i; i = i->nextItem() )
+		    if ( i->isSelected() )
+			d->selectedItems.insert( i, i );
+	    }
+	}
+
+	d->mousePressed = TRUE;
+    }
+
+ emit_signals:
+    if ( !d->rubber ) {
+	emit mouseButtonPressed( e->button(), item, e->globalPos() );
+	emit pressed( item );
+	emit pressed( item, e->globalPos() );
+
+	if ( e->button() == RightButton )
+	    emit rightButtonPressed( item, e->globalPos() );
+    }
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsContextMenuEvent( QContextMenuEvent *e )
+{
+    if ( !receivers( SIGNAL(contextMenuRequested(QIconViewItem*,const QPoint&)) ) ) {
+	e->ignore();
+	return;
+    }
+    if ( e->reason() == QContextMenuEvent::Keyboard ) {
+	QIconViewItem *item = currentItem();
+	QRect r = item ? item->rect() : QRect( 0, 0, visibleWidth(), visibleHeight() );
+	emit contextMenuRequested( item, viewport()->mapToGlobal( contentsToViewport( r.center() ) ) );
+    } else {
+	d->mousePressed = FALSE;
+	QIconViewItem *item = findItem( e->pos() );
+	emit contextMenuRequested( item, e->globalPos() );
+    }
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsMouseReleaseEvent( QMouseEvent *e )
+{
+    QIconViewItem *item = findItem( e->pos() );
+    d->selectedItems.clear();
+
+    bool emitClicked = TRUE;
+    d->mousePressed = FALSE;
+    d->startDragItem = 0;
+
+    if ( d->rubber ) {
+	QPainter p;
+	p.begin( viewport() );
+	p.setRasterOp( NotROP );
+	p.setPen( QPen( color0, 1 ) );
+	p.setBrush( NoBrush );
+
+	drawRubber( &p );
+	d->dragging = FALSE;
+	p.end();
+
+	if ( ( d->rubber->topLeft() - d->rubber->bottomRight() ).manhattanLength() >
+	     QApplication::startDragDistance() )
+	    emitClicked = FALSE;
+	delete d->rubber;
+	d->rubber = 0;
+	d->currentItem = d->tmpCurrentItem;
+	d->tmpCurrentItem = 0;
+	if ( d->currentItem )
+	    repaintItem( d->currentItem );
+    }
+
+    if ( d->scrollTimer ) {
+	disconnect( d->scrollTimer, SIGNAL( timeout() ), this, SLOT( doAutoScroll() ) );
+	d->scrollTimer->stop();
+	delete d->scrollTimer;
+	d->scrollTimer = 0;
+    }
+
+    if ( d->selectionMode == Extended &&
+	 d->currentItem == d->pressedItem &&
+	 d->pressedSelected && d->currentItem ) {
+	bool block = signalsBlocked();
+	blockSignals( TRUE );
+	clearSelection();
+	blockSignals( block );
+	if ( d->currentItem->isSelectable() ) {
+	    d->currentItem->selected = TRUE;
+	    repaintItem( d->currentItem );
+	}
+	emit selectionChanged();
+    }
+    d->pressedItem = 0;
+
+    if ( emitClicked ) {
+	emit mouseButtonClicked( e->button(), item, e->globalPos() );
+	emit clicked( item );
+	emit clicked( item, e->globalPos() );
+	if ( e->button() == RightButton )
+	    emit rightButtonClicked( item, e->globalPos() );
+    }
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsMouseMoveEvent( QMouseEvent *e )
+{
+    QIconViewItem *item = findItem( e->pos() );
+    if ( d->highlightedItem != item ) {
+	if ( item )
+	    emit onItem( item );
+	else
+	    emit onViewport();
+	d->highlightedItem = item;
+    }
+
+    if ( d->mousePressed && e->state() == NoButton )
+	d->mousePressed = FALSE;
+
+    if ( d->startDragItem )
+	item = d->startDragItem;
+
+    if ( d->mousePressed && item && item == d->currentItem &&
+	 ( item->isSelected() || d->selectionMode == NoSelection ) && item->dragEnabled() ) {
+	if ( !d->startDragItem ) {
+	    d->currentItem->setSelected( TRUE, TRUE );
+	    d->startDragItem = item;
+	}
+	if ( ( d->dragStartPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+	    d->mousePressed = FALSE;
+	    d->cleared = FALSE;
+#ifndef QT_NO_DRAGANDDROP
+	    startDrag();
+#endif
+	    if ( d->tmpCurrentItem )
+		repaintItem( d->tmpCurrentItem );
+	}
+    } else if ( d->mousePressed && !d->currentItem && d->rubber ) {
+	doAutoScroll();
+    }
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsMouseDoubleClickEvent( QMouseEvent *e )
+{
+    QIconViewItem *item = findItem( e->pos() );
+    if ( item ) {
+	selectAll( FALSE );
+	item->setSelected( TRUE, TRUE );
+	emit doubleClicked( item );
+    }
+}
+
+/*!
+    \reimp
+*/
+
+#ifndef QT_NO_DRAGANDDROP
+void QIconView::contentsDragEnterEvent( QDragEnterEvent *e )
+{
+    d->dragging = TRUE;
+    d->drawDragShapes = TRUE;
+    d->tmpCurrentItem = 0;
+    initDragEnter( e );
+    d->oldDragPos = e->pos();
+    d->oldDragAcceptAction = FALSE;
+    drawDragShapes( e->pos() );
+    d->dropped = FALSE;
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsDragMoveEvent( QDragMoveEvent *e )
+{
+    if ( e->pos() == d->oldDragPos ) {
+	if (d->oldDragAcceptAction)
+	    e->acceptAction();
+	else
+	    e->ignore();
+	return;
+    }
+
+    drawDragShapes( d->oldDragPos );
+    d->dragging = FALSE;
+
+    QIconViewItem *old = d->tmpCurrentItem;
+    d->tmpCurrentItem = 0;
+
+    QIconViewItem *item = findItem( e->pos() );
+
+    if ( item ) {
+	if ( old &&
+	     old->rect().contains(d->oldDragPos) &&
+	     !old->rect().contains(e->pos()) ) {
+	    old->dragLeft();
+	    repaintItem( old );
+	}
+	if ( !item->rect().contains(d->oldDragPos) )
+	    item->dragEntered();
+	if ( item->acceptDrop( e ) ) {
+	    d->oldDragAcceptAction = TRUE;
+	    e->acceptAction();
+	} else {
+	    d->oldDragAcceptAction = FALSE;
+	    e->ignore();
+	}
+
+	d->tmpCurrentItem = item;
+	QPainter p;
+	p.begin( viewport() );
+	p.translate( -contentsX(), -contentsY() );
+	item->paintFocus( &p, colorGroup() );
+	p.end();
+    } else {
+	e->acceptAction();
+	d->oldDragAcceptAction = TRUE;
+	if ( old ) {
+	    old->dragLeft();
+	    repaintItem( old );
+	}
+    }
+
+    d->oldDragPos = e->pos();
+    drawDragShapes( e->pos() );
+    d->dragging = TRUE;
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsDragLeaveEvent( QDragLeaveEvent * )
+{
+    if ( !d->dropped )
+	drawDragShapes( d->oldDragPos );
+    d->dragging = FALSE;
+
+    if ( d->tmpCurrentItem ) {
+	repaintItem( d->tmpCurrentItem );
+	d->tmpCurrentItem->dragLeft();
+    }
+
+    d->tmpCurrentItem = 0;
+    d->isIconDrag = FALSE;
+    d->iconDragData.clear();
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::contentsDropEvent( QDropEvent *e )
+{
+    d->dropped = TRUE;
+    d->dragging = FALSE;
+    drawDragShapes( d->oldDragPos );
+
+    if ( d->tmpCurrentItem )
+	repaintItem( d->tmpCurrentItem );
+
+    QIconViewItem *i = findItem( e->pos() );
+
+    if ( !i && e->source() == viewport() && d->currentItem && !d->cleared ) {
+	if ( !d->rearrangeEnabled )
+	    return;
+	QRect r = d->currentItem->rect();
+
+	d->currentItem->move( e->pos() - d->dragStart );
+
+	int w = d->currentItem->x() + d->currentItem->width() + 1;
+	int h = d->currentItem->y() + d->currentItem->height() + 1;
+
+	repaintItem( d->currentItem );
+	repaintContents( r.x(), r.y(), r.width(), r.height(), FALSE );
+
+	int dx = d->currentItem->x() - r.x();
+	int dy = d->currentItem->y() - r.y();
+
+	QIconViewItem *item = d->firstItem;
+	QRect rr;
+	for ( ; item; item = item->next ) {
+	    if ( item->isSelected() && item != d->currentItem ) {
+		rr = rr.unite( item->rect() );
+		item->moveBy( dx, dy );
+		rr = rr.unite( item->rect() );
+	    }
+	    w = QMAX( w, item->x() + item->width() + 1 );
+	    h = QMAX( h, item->y() + item->height() + 1 );
+	}
+	repaintContents( rr, FALSE );
+	bool fullRepaint = FALSE;
+	if ( w > contentsWidth() ||
+	     h > contentsHeight() )
+	    fullRepaint = TRUE;
+
+	int oldw = contentsWidth();
+	int oldh = contentsHeight();
+
+	resizeContents( w, h );
+
+
+	if ( fullRepaint ) {
+	    repaintContents( oldw, 0, contentsWidth() - oldw, contentsHeight(), FALSE );
+	    repaintContents( 0, oldh, contentsWidth(), contentsHeight() - oldh, FALSE );
+	}
+	e->acceptAction();
+    } else if ( !i && ( e->source() != viewport() || d->cleared ) ) {
+	QValueList<QIconDragItem> lst;
+	if ( QIconDrag::canDecode( e ) ) {
+	    QValueList<QIconDragDataItem> l;
+	    QIconDragPrivate::decode( e, l );
+	    QValueList<QIconDragDataItem>::Iterator it = l.begin();
+	    for ( ; it != l.end(); ++it )
+		lst << ( *it ).data;
+	}
+	emit dropped( e, lst );
+    } else if ( i ) {
+	QValueList<QIconDragItem> lst;
+	if ( QIconDrag::canDecode( e ) ) {
+	    QValueList<QIconDragDataItem> l;
+	    QIconDragPrivate::decode( e, l );
+	    QValueList<QIconDragDataItem>::Iterator it = l.begin();
+	    for ( ; it != l.end(); ++it )
+		lst << ( *it ).data;
+	}
+	i->dropped( e, lst );
+    }
+    d->isIconDrag = FALSE;
+}
+#endif
+
+/*!
+    \reimp
+*/
+
+void QIconView::resizeEvent( QResizeEvent* e )
+{
+    QScrollView::resizeEvent( e );
+    if ( d->resizeMode == Adjust ) {
+	optimize_layout = TRUE;
+	adjustItems();
+	optimize_layout = FALSE;
+#if 0 // no need for timer delay anymore
+	d->oldSize = e->oldSize();
+	if ( d->adjustTimer->isActive() )
+	    d->adjustTimer->stop();
+	d->adjustTimer->start( 0, TRUE );
+#endif
+    }
+}
+
+/*!
+    Adjusts the positions of the items to the geometry of the icon
+    view.
+*/
+
+void QIconView::adjustItems()
+{
+    d->adjustTimer->stop();
+    if ( d->resizeMode == Adjust )
+	    arrangeItemsInGrid( TRUE );
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::keyPressEvent( QKeyEvent *e )
+{
+    if ( !d->firstItem )
+	return;
+
+    if ( !d->currentItem ) {
+	setCurrentItem( d->firstItem );
+	if ( d->selectionMode == Single )
+	    d->currentItem->setSelected( TRUE, TRUE );
+	return;
+    }
+
+    bool selectCurrent = TRUE;
+
+    switch ( e->key() ) {
+    case Key_Escape:
+	e->ignore();
+	break;
+#ifndef QT_NO_TEXTEDIT
+    case Key_F2: {
+	if ( d->currentItem->renameEnabled() ) {
+	    d->currentItem->renameItem();
+	    d->currentItem->rename();
+	    return;
+	}
+    } break;
+#endif
+    case Key_Home: {
+	d->currInputString = QString::null;
+	if ( !d->firstItem )
+	    break;
+
+	selectCurrent = FALSE;
+
+	QIconViewItem *item = 0;
+	QIconViewPrivate::ItemContainer *c = d->firstContainer;
+	while ( !item && c ) {
+	    QPtrList<QIconViewItem> &list = c->items;
+	    QIconViewItem *i = list.first();
+	    while ( i ) {
+		if ( !item ) {
+		    item = i;
+		} else {
+		    if ( d->arrangement == LeftToRight ) {
+			// we use pixmap so the items textlength are ignored
+			// find topmost, leftmost item
+			if ( i->pixmapRect( FALSE ).y() < item->pixmapRect( FALSE ).y() ||
+			     ( i->pixmapRect( FALSE ).y() == item->pixmapRect( FALSE ).y() &&
+			       i->pixmapRect( FALSE ).x() < item->pixmapRect( FALSE ).x() ) )
+			    item = i;
+		    } else {
+			// find leftmost, topmost item
+			if ( i->pixmapRect( FALSE ).x() < item->pixmapRect( FALSE ).x() ||
+			     ( i->pixmapRect( FALSE ).x() == item->pixmapRect( FALSE ).x() &&
+			       i->pixmapRect( FALSE ).y() < item->pixmapRect( FALSE ).y() ) )
+			    item = i;
+		    }
+		}
+		i = list.next();
+	    }
+	    c = c->n;
+	}
+
+	if ( item ) {
+	    QIconViewItem *old = d->currentItem;
+	    setCurrentItem( item );
+	    ensureItemVisible( item );
+	    handleItemChange( old, e->state() & ShiftButton,
+			      e->state() & ControlButton, TRUE );
+	}
+    } break;
+    case Key_End: {
+	d->currInputString = QString::null;
+	if ( !d->lastItem )
+	    break;
+
+	selectCurrent = FALSE;
+
+	QIconViewItem *item = 0;
+	QIconViewPrivate::ItemContainer *c = d->lastContainer;
+	while ( !item && c ) {
+	    QPtrList<QIconViewItem> &list = c->items;
+	    QIconViewItem *i = list.first();
+	    while ( i ) {
+		if ( !item ) {
+		    item = i;
+		} else {
+		    if ( d->arrangement == LeftToRight ) {
+			// find bottommost, rightmost item
+			if ( i->pixmapRect( FALSE ).bottom() > item->pixmapRect( FALSE ).bottom() ||
+			     ( i->pixmapRect( FALSE ).bottom() == item->pixmapRect( FALSE ).bottom() &&
+			       i->pixmapRect( FALSE ).right() > item->pixmapRect( FALSE ).right() ) )
+			    item = i;
+		    } else {
+			// find rightmost, bottommost item
+			if ( i->pixmapRect( FALSE ).right() > item->pixmapRect( FALSE ).right() ||
+			     ( i->pixmapRect( FALSE ).right() == item->pixmapRect( FALSE ).right() &&
+			       i->pixmapRect( FALSE ).bottom() > item->pixmapRect( FALSE ).bottom() ) )
+			    item = i;
+		    }
+		}
+		i = list.next();
+	    }
+	    c = c->p;
+	}
+
+	if ( item ) {
+	    QIconViewItem *old = d->currentItem;
+	    setCurrentItem( item );
+	    ensureItemVisible( item );
+ 	    handleItemChange( old, e->state() & ShiftButton,
+ 			      e->state() & ControlButton, TRUE );
+	}
+    } break;
+    case Key_Right: {
+	d->currInputString = QString::null;
+	QIconViewItem *item;
+	selectCurrent = FALSE;
+	Direction dir = DirRight;
+
+	QRect r( 0, d->currentItem->y(), contentsWidth(), d->currentItem->height() );
+	item = findItem( dir, d->currentItem->rect().center(), r );
+
+	// search the row below from the right
+	while ( !item && r.y() < contentsHeight() ) {
+	    r.moveBy(0, d->currentItem->height() );
+	    item = findItem( dir, QPoint( 0, r.center().y() ), r );
+	}
+
+	if ( item ) {
+	    QIconViewItem *old = d->currentItem;
+	    setCurrentItem( item );
+	    ensureItemVisible( item );
+	    handleItemChange( old, e->state() & ShiftButton, e->state() & ControlButton );
+	}
+    } break;
+    case Key_Left: {
+	d->currInputString = QString::null;
+	QIconViewItem *item;
+	selectCurrent = FALSE;
+	Direction dir = DirLeft;
+
+	QRect r( 0, d->currentItem->y(), contentsWidth(), d->currentItem->height() );
+	item = findItem( dir, d->currentItem->rect().center(), r );
+
+	// search the row above from the left
+	while ( !item && r.y() >= 0 ) {
+	    r.moveBy(0, - d->currentItem->height() );
+	    item = findItem( dir, QPoint( contentsWidth(), r.center().y() ), r );
+	}
+
+	if ( item ) {
+	    QIconViewItem *old = d->currentItem;
+	    setCurrentItem( item );
+	    ensureItemVisible( item );
+	    handleItemChange( old, e->state() & ShiftButton, e->state() & ControlButton );
+	}
+    } break;
+    case Key_Space: {
+	d->currInputString = QString::null;
+	if ( d->selectionMode == Single)
+	    break;
+
+	d->currentItem->setSelected( !d->currentItem->isSelected(), TRUE );
+    } break;
+    case Key_Enter: case Key_Return:
+	d->currInputString = QString::null;
+	emit returnPressed( d->currentItem );
+	break;
+    case Key_Down: {
+	d->currInputString = QString::null;
+	QIconViewItem *item;
+	selectCurrent = FALSE;
+	Direction dir = DirDown;
+
+	QRect r( d->currentItem->x(), 0, d->currentItem->width(), contentsHeight() );
+	item = findItem( dir, d->currentItem->rect().center(), r );
+
+	// finding the closest item below and to the right
+	while ( !item && r.x() < contentsWidth() ) {
+	    r.moveBy( r.width() , 0 );
+	    item = findItem( dir, QPoint( r.center().x(), 0 ), r );
+	}
+
+
+	QIconViewItem *i = d->currentItem;
+	setCurrentItem( item );
+	item = i;
+	handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton );
+    } break;
+    case Key_Up: {
+	d->currInputString = QString::null;
+	QIconViewItem *item;
+	selectCurrent = FALSE;
+	Direction dir = DirUp;
+
+	QRect r( d->currentItem->x(), 0, d->currentItem->width(), contentsHeight() );
+	item = findItem( dir, d->currentItem->rect().center(), r );
+
+	// finding the closest item above and to the left
+	while ( !item && r.x() >= 0 ) {
+	    r.moveBy(- r.width(), 0 );
+	    item = findItem( dir, QPoint(r.center().x(), contentsHeight() ), r );
+	}
+
+	QIconViewItem *i = d->currentItem;
+	setCurrentItem( item );
+	item = i;
+	handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton );
+    } break;
+    case Key_Next: {
+	d->currInputString = QString::null;
+	selectCurrent = FALSE;
+	QRect r;
+	if ( d->arrangement == LeftToRight )
+	    r = QRect( 0, d->currentItem->y() + visibleHeight(), contentsWidth(), visibleHeight() );
+	else
+	    r = QRect( d->currentItem->x() + visibleWidth(), 0, visibleWidth(), contentsHeight() );
+	QIconViewItem *item = d->currentItem;
+	QIconViewItem *ni = findFirstVisibleItem( r  );
+	if ( !ni ) {
+	    if ( d->arrangement == LeftToRight )
+		r = QRect( 0, d->currentItem->y() + d->currentItem->height(), contentsWidth(), contentsHeight() );
+	    else
+		r = QRect( d->currentItem->x() + d->currentItem->width(), 0, contentsWidth(), contentsHeight() );
+	    ni = findLastVisibleItem( r  );
+	}
+	if ( ni ) {
+	    setCurrentItem( ni );
+	    handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton );
+	}
+    } break;
+    case Key_Prior: {
+	d->currInputString = QString::null;
+	selectCurrent = FALSE;
+	QRect r;
+	if ( d->arrangement == LeftToRight )
+	    r = QRect( 0, d->currentItem->y() - visibleHeight(), contentsWidth(), visibleHeight() );
+	else
+	    r = QRect( d->currentItem->x() - visibleWidth(), 0, visibleWidth(), contentsHeight() );
+	QIconViewItem *item = d->currentItem;
+	QIconViewItem *ni = findFirstVisibleItem( r  );
+	if ( !ni ) {
+	    if ( d->arrangement == LeftToRight )
+		r = QRect( 0, 0, contentsWidth(), d->currentItem->y() );
+	    else
+		r = QRect( 0, 0, d->currentItem->x(), contentsHeight() );
+	    ni = findFirstVisibleItem( r  );
+	}
+	if ( ni ) {
+	    setCurrentItem( ni );
+	    handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton );
+	}
+    } break;
+    default:
+	if ( !e->text().isEmpty() && e->text()[ 0 ].isPrint() ) {
+	    selectCurrent = FALSE;
+	    QIconViewItem *i = d->currentItem;
+	    if ( !i )
+		i = d->firstItem;
+	    if ( !d->inputTimer->isActive() ) {
+		d->currInputString = e->text();
+		i = i->next;
+		if ( !i )
+		    i = d->firstItem;
+		i = findItemByName( i );
+	    } else {
+		d->inputTimer->stop();
+		d->currInputString += e->text();
+		i = findItemByName( i );
+		if ( !i ) {
+		    d->currInputString = e->text();
+		    if (d->currentItem && d->currentItem->next)
+			i = d->currentItem->next;
+		    else
+			i = d->firstItem;
+		    i = findItemByName(i);
+		}
+	    }
+	    if ( i ) {
+		setCurrentItem( i );
+		if ( d->selectionMode == Extended ) {
+		    bool changed = FALSE;
+		    bool block = signalsBlocked();
+		    blockSignals( TRUE );
+		    selectAll( FALSE );
+		    blockSignals( block );
+		    if ( !i->selected && i->isSelectable() ) {
+			changed = TRUE;
+			i->selected = TRUE;
+			repaintItem( i );
+		    }
+		    if ( changed )
+			emit selectionChanged();
+		}
+	    }
+	    d->inputTimer->start( 400, TRUE );
+	} else {
+	    selectCurrent = FALSE;
+	    d->currInputString = QString::null;
+	    if ( e->state() & ControlButton ) {
+		switch ( e->key() ) {
+		case Key_A:
+		    selectAll( TRUE );
+		    break;
+		}
+	    }
+	    e->ignore();
+	    return;
+	}
+    }
+
+    if ( !( e->state() & ShiftButton ) || !d->selectAnchor )
+	d->selectAnchor = d->currentItem;
+
+    if ( d->currentItem && !d->currentItem->isSelected() &&
+	 d->selectionMode == Single && selectCurrent ) {
+	d->currentItem->setSelected( TRUE );
+    }
+
+    ensureItemVisible( d->currentItem );
+}
+
+/*
+  Finds the closest item in the Direction \a dir relative from the point \a relativeTo
+  which intersects with the searchRect.
+
+  The function choses the closest item with its center in the searchRect.
+*/
+QIconViewItem* QIconView::findItem( Direction dir,
+				    const QPoint &relativeTo,
+				    const QRect &searchRect ) const
+{
+    QIconViewItem *item;
+    QIconViewItem *centerMatch = 0;
+    int centerMatchML = 0;
+
+    // gets list of containers with potential items
+    QPtrList<QIconViewPrivate::ItemContainer>* cList =
+	d->findContainers( dir, relativeTo, searchRect);
+
+    cList->first();
+    while ( cList->current() && !centerMatch ) {
+	QPtrList<QIconViewItem> &list = (cList->current())->items;
+	for ( item = list.first(); item; item = list.next() ) {
+	    if ( neighbourItem( dir, relativeTo, item ) &&
+		 searchRect.contains( item->rect().center() ) &&
+		 item != currentItem() ) {
+ 		int ml = (relativeTo - item->rect().center()).manhattanLength();
+		if ( centerMatch ) {
+		    if ( ml < centerMatchML ) {
+			centerMatch = item;
+			centerMatchML = ml;
+		    }
+		} else {
+		    centerMatch = item;
+		    centerMatchML = ml;
+		}
+	    }
+	}
+	cList->next();
+    }
+    return centerMatch;
+}
+
+
+/*
+  Returns TRUE if the items orientation compared to
+  the point \a relativeTo is correct.
+*/
+bool QIconView::neighbourItem( Direction dir,
+			       const QPoint &relativeTo,
+			       const QIconViewItem *item ) const
+{
+    switch ( dir ) {
+    case DirUp:
+	if ( item->rect().center().y() < relativeTo.y() )
+	    return TRUE;
+	break;
+    case DirDown:
+	if ( item->rect().center().y() > relativeTo.y() )
+	    return TRUE;
+	break;
+    case DirLeft:
+	if ( item->rect().center().x() < relativeTo.x() )
+	    return TRUE;
+	break;
+    case DirRight:
+	if ( item->rect().center().x() > relativeTo.x() )
+	    return TRUE;
+	break;
+    default:
+	// nothing
+	break;
+    }
+    return FALSE;
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::focusInEvent( QFocusEvent* )
+{
+    d->mousePressed = FALSE;
+    d->inMenuMode = FALSE;
+    if ( d->currentItem ) {
+	repaintItem( d->currentItem );
+    } else if ( d->firstItem && QFocusEvent::reason() != QFocusEvent::Mouse ) {
+	d->currentItem = d->firstItem;
+	emit currentChanged( d->currentItem );
+	repaintItem( d->currentItem );
+    }
+
+    if ( style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus, this ) )
+	repaintSelectedItems();
+
+    if ( d->currentItem )
+	setMicroFocusHint( d->currentItem->x(), d->currentItem->y(), d->currentItem->width(), d->currentItem->height(), FALSE );
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::focusOutEvent( QFocusEvent* )
+{
+    if (style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus, this )) {
+	d->inMenuMode =
+	    QFocusEvent::reason() == QFocusEvent::Popup ||
+ 	    (qApp->focusWidget() && qApp->focusWidget()->inherits("QMenuBar"));
+ 	if ( !d->inMenuMode )
+	    repaintSelectedItems();
+    }
+    if ( d->currentItem )
+	repaintItem( d->currentItem );
+}
+
+/*!
+    Draws the rubber band using the painter \a p.
+*/
+
+void QIconView::drawRubber( QPainter *p )
+{
+    if ( !p || !d->rubber )
+	return;
+
+    QPoint pnt( d->rubber->x(), d->rubber->y() );
+    pnt = contentsToViewport( pnt );
+
+    style().drawPrimitive(QStyle::PE_RubberBand, p,
+			  QRect(pnt.x(), pnt.y(), d->rubber->width(), d->rubber->height()),
+			  colorGroup(), QStyle::Style_Default, QStyleOption(colorGroup().base()));
+}
+
+/*!
+    Returns the QDragObject that should be used for drag-and-drop.
+    This function is called by the icon view when starting a drag to
+    get the dragobject that should be used for the drag. Subclasses
+    may reimplement this.
+
+    \sa QIconDrag
+*/
+
+#ifndef QT_NO_DRAGANDDROP
+QDragObject *QIconView::dragObject()
+{
+    if ( !d->currentItem )
+	return 0;
+
+    QPoint orig = d->dragStartPos;
+
+    QIconDrag *drag = new QIconDrag( viewport() );
+    drag->setPixmap( ( d->currentItem->pixmap() ?
+		     *d->currentItem->pixmap() : QPixmap() ), // ### QPicture
+		     QPoint( d->currentItem->pixmapRect().width() / 2,
+			     d->currentItem->pixmapRect().height() / 2 ) );
+
+    if ( d->selectionMode == NoSelection ) {
+	QIconViewItem *item = d->currentItem;
+	drag->append( QIconDragItem(),
+		      QRect( item->pixmapRect( FALSE ).x() - orig.x(),
+			     item->pixmapRect( FALSE ).y() - orig.y(),
+			     item->pixmapRect().width(), item->pixmapRect().height() ),
+		      QRect( item->textRect( FALSE ).x() - orig.x(),
+			     item->textRect( FALSE ).y() - orig.y(),
+			     item->textRect().width(), item->textRect().height() ) );
+    } else {
+	for ( QIconViewItem *item = d->firstItem; item; item = item->next ) {
+	    if ( item->isSelected() ) {
+		drag->append( QIconDragItem(),
+			      QRect( item->pixmapRect( FALSE ).x() - orig.x(),
+				     item->pixmapRect( FALSE ).y() - orig.y(),
+				     item->pixmapRect().width(), item->pixmapRect().height() ),
+			      QRect( item->textRect( FALSE ).x() - orig.x(),
+				     item->textRect( FALSE ).y() - orig.y(),
+				     item->textRect().width(), item->textRect().height() ) );
+	    }
+	}
+    }
+
+    return drag;
+}
+
+/*!
+    Starts a drag.
+*/
+
+void QIconView::startDrag()
+{
+    if ( !d->startDragItem )
+	return;
+
+    QPoint orig = d->dragStartPos;
+    d->dragStart = QPoint( orig.x() - d->startDragItem->x(),
+			   orig.y() - d->startDragItem->y() );
+    d->startDragItem = 0;
+    d->mousePressed = FALSE;
+    d->pressedItem = 0;
+    d->pressedSelected = 0;
+
+    QDragObject *drag = dragObject();
+    if ( !drag )
+	return;
+
+    if ( drag->drag() )
+	if ( drag->target() != viewport() )
+	    emit moved();
+}
+
+#endif
+
+/*!
+    Inserts the QIconViewItem \a item in the icon view's grid. \e{You
+    should never need to call this function.} Instead, insert
+    QIconViewItems by creating them with a pointer to the QIconView
+    that they are to be inserted into.
+*/
+
+void QIconView::insertInGrid( QIconViewItem *item )
+{
+    if ( !item )
+	return;
+
+    if ( d->reorderItemsWhenInsert ) {
+	// #### make this efficient - but it's not too dramatic
+	int y = d->spacing;
+
+	item->dirty = FALSE;
+	if ( item == d->firstItem ) {
+	    bool dummy;
+	    makeRowLayout( item, y, dummy );
+	    return;
+	}
+
+	QIconViewItem *begin = rowBegin( item );
+	y = begin->y();
+	while ( begin ) {
+	    bool dummy;
+	    begin = makeRowLayout( begin, y, dummy );
+
+	    if ( !begin || !begin->next )
+		break;
+
+	    begin = begin->next;
+	}
+	item->dirty = FALSE;
+    } else {
+	QRegion r( QRect( 0, 0, QMAX( contentsWidth(), visibleWidth() ),
+			  QMAX( contentsHeight(), visibleHeight() ) ) );
+
+	QIconViewItem *i = d->firstItem;
+	int y = -1;
+	for ( ; i; i = i->next ) {
+	    r = r.subtract( i->rect() );
+	    y = QMAX( y, i->y() + i->height() );
+	}
+
+	QMemArray<QRect> rects = r.rects();
+	QMemArray<QRect>::Iterator it = rects.begin();
+	bool foundPlace = FALSE;
+	for ( ; it != rects.end(); ++it ) {
+	    QRect rect = *it;
+	    if ( rect.width() >= item->width() &&
+		 rect.height() >= item->height() ) {
+		int sx = 0, sy = 0;
+		if ( rect.width() >= item->width() + d->spacing )
+		    sx = d->spacing;
+		if ( rect.height() >= item->height() + d->spacing )
+		    sy = d->spacing;
+		item->move( rect.x() + sx, rect.y() + sy );
+		foundPlace = TRUE;
+		break;
+	    }
+	}
+
+	if ( !foundPlace )
+	    item->move( d->spacing, y + d->spacing );
+
+	resizeContents( QMAX( contentsWidth(), item->x() + item->width() ),
+			QMAX( contentsHeight(), item->y() + item->height() ) );
+	item->dirty = FALSE;
+    }
+}
+
+/*!
+    Emits a signal to indicate selection changes. \a i is the
+    QIconViewItem that was selected or de-selected.
+
+    \e{You should never need to call this function.}
+*/
+
+void QIconView::emitSelectionChanged( QIconViewItem *i )
+{
+    emit selectionChanged();
+    if ( d->selectionMode == Single )
+	emit selectionChanged( i ? i : d->currentItem );
+}
+
+/*!
+    \internal
+*/
+
+void QIconView::emitRenamed( QIconViewItem *item )
+{
+    if ( !item )
+	return;
+
+    emit itemRenamed( item, item->text() );
+    emit itemRenamed( item );
+}
+
+/*!
+    If a drag enters the icon view the shapes of the objects which the
+    drag contains are drawn, usnig \a pos as origin.
+*/
+
+void QIconView::drawDragShapes( const QPoint &pos )
+{
+#ifndef QT_NO_DRAGANDDROP
+    if ( pos == QPoint( -1, -1 ) )
+	return;
+
+    if ( !d->drawDragShapes ) {
+	d->drawDragShapes = TRUE;
+	return;
+    }
+
+    QStyleOption opt(colorGroup().base());
+
+    QPainter p;
+    p.begin( viewport() );
+    p.translate( -contentsX(), -contentsY() );
+    p.setRasterOp( NotROP );
+    p.setPen( QPen( color0 ) );
+
+    if ( d->isIconDrag ) {
+	QValueList<QIconDragDataItem>::Iterator it = d->iconDragData.begin();
+	for ( ; it != d->iconDragData.end(); ++it ) {
+	    QRect ir = (*it).item.pixmapRect();
+	    QRect tr = (*it).item.textRect();
+	    tr.moveBy( pos.x(), pos.y() );
+	    ir.moveBy( pos.x(), pos.y() );
+	    if ( !ir.intersects( QRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ) ) )
+		continue;
+
+	    style().drawPrimitive(QStyle::PE_FocusRect, &p, ir, colorGroup(),
+				  QStyle::Style_Default, opt);
+	    style().drawPrimitive(QStyle::PE_FocusRect, &p, tr, colorGroup(),
+				  QStyle::Style_Default, opt);
+	}
+    } else if ( d->numDragItems > 0 ) {
+	for ( int i = 0; i < d->numDragItems; ++i ) {
+	    QRect r( pos.x() + i * 40, pos.y(), 35, 35 );
+	    style().drawPrimitive(QStyle::PE_FocusRect, &p, r, colorGroup(),
+				  QStyle::Style_Default, opt);
+	}
+
+    }
+    p.end();
+#endif
+}
+
+/*!
+    When a drag enters the icon view, this function is called to
+    initialize it. Initializing in this context means getting
+    information about the drag, for example so that the icon view
+    knows enough about the drag to be able to draw drag shapes for the
+    drag data (e.g. shapes of icons which are dragged), etc.
+*/
+
+#ifndef QT_NO_DRAGANDDROP
+void QIconView::initDragEnter( QDropEvent *e )
+{
+    if ( QIconDrag::canDecode( e ) ) {
+	QIconDragPrivate::decode( e, d->iconDragData );
+	d->isIconDrag = TRUE;
+    } else if ( QUriDrag::canDecode( e ) ) {
+	QStrList lst;
+	QUriDrag::decode( e, lst );
+	d->numDragItems = lst.count();
+    } else {
+	d->numDragItems = 0;
+    }
+
+}
+#endif
+
+/*!
+    This function is called to draw the rectangle \a r of the
+    background using the painter \a p.
+
+    The default implementation fills \a r with the viewport's
+    backgroundBrush(). Subclasses may reimplement this to draw custom
+    backgrounds.
+
+    \sa contentsX() contentsY() drawContents()
+*/
+
+void QIconView::drawBackground( QPainter *p, const QRect &r )
+{
+    p->fillRect( r, viewport()->backgroundBrush() );
+}
+
+/*!
+    \reimp
+*/
+
+bool QIconView::eventFilter( QObject * o, QEvent * e )
+{
+    if ( o == viewport() ) {
+	switch( e->type() ) {
+	case QEvent::FocusIn:
+	    focusInEvent( (QFocusEvent*)e );
+	    return TRUE;
+	case QEvent::FocusOut:
+	    focusOutEvent( (QFocusEvent*)e );
+	    return TRUE;
+	case QEvent::Enter:
+	    enterEvent( e );
+	    return TRUE;
+	case QEvent::Paint:
+	    if ( o == viewport() ) {
+		if ( d->dragging ) {
+		    if ( !d->rubber )
+			drawDragShapes( d->oldDragPos );
+		}
+		viewportPaintEvent( (QPaintEvent*)e );
+		if ( d->dragging ) {
+		    if ( !d->rubber )
+			drawDragShapes( d->oldDragPos );
+		}
+	    }
+	    return TRUE;
+	default:
+	    // nothing
+	    break;
+	}
+    }
+
+    return QScrollView::eventFilter( o, e );
+}
+
+
+/*!
+    \reimp
+*/
+
+QSize QIconView::minimumSizeHint() const
+{
+    return QScrollView::minimumSizeHint();
+}
+
+/*!
+  \internal
+  Finds the next item after the start item beginning
+  with \a text.
+*/
+
+QIconViewItem* QIconView::findItemByName( QIconViewItem *start )
+{
+    if ( !start )
+	return 0;
+    QString match = d->currInputString.lower();
+    if ( match.length() < 1 )
+	return start;
+    QString curText;
+    QIconViewItem *i = start;
+    do {
+	curText = i->text().lower();
+	if ( curText.startsWith( match ) )
+	    return i;
+	i = i->next;
+	if ( !i )
+	    i = d->firstItem;
+    } while ( i != start );
+    return 0;
+}
+
+/*!
+    Lays out a row of icons (if Arrangement == \c TopToBottom this is
+    a column). Starts laying out with the item \a begin. \a y is the
+    starting coordinate. Returns the last item of the row (column) and
+    sets the new starting coordinate to \a y. The \a changed parameter
+    is used internally.
+
+    \warning This function may be made private in a future version of
+    Qt. We do not recommend calling it.
+*/
+
+QIconViewItem *QIconView::makeRowLayout( QIconViewItem *begin, int &y, bool &changed )
+{
+    QIconViewItem *end = 0;
+
+    bool reverse = QApplication::reverseLayout();
+    changed = FALSE;
+
+    if ( d->arrangement == LeftToRight ) {
+
+	if ( d->rastX == -1 ) {
+	    // first calculate the row height
+	    int h = 0;
+	    int x = 0;
+	    int ih = 0;
+	    QIconViewItem *item = begin;
+	    for (;;) {
+		x += d->spacing + item->width();
+		if ( x > visibleWidth() && item != begin ) {
+		    item = item->prev;
+		    break;
+		}
+		h = QMAX( h, item->height() );
+		ih = QMAX( ih, item->pixmapRect().height() );
+		QIconViewItem *old = item;
+		item = item->next;
+		if ( !item ) {
+		    item = old;
+		    break;
+		}
+	    }
+	    end = item;
+
+	    if ( d->rastY != -1 )
+		h = QMAX( h, d->rastY );
+
+	    // now move the items
+	    item = begin;
+	    for (;;) {
+		item->dirty = FALSE;
+		int x;
+		if ( item == begin ) {
+		    if ( reverse )
+			x = visibleWidth() - d->spacing - item->width();
+		    else
+			x = d->spacing;
+		} else {
+		    if ( reverse )
+			x = item->prev->x() - item->width() - d->spacing;
+		    else
+			x = item->prev->x() + item->prev->width() + d->spacing;
+		}
+		changed = item->move( x, y + ih - item->pixmapRect().height() ) || changed;
+		if ( y + h < item->y() + item->height() )
+		    h = QMAX( h, ih + item->textRect().height() );
+		if ( item == end )
+		    break;
+		item = item->next;
+	    }
+	    y += h + d->spacing;
+	} else {
+	    // first calculate the row height
+	    int h = begin->height();
+	    int x = d->spacing;
+	    int ih = begin->pixmapRect().height();
+	    QIconViewItem *item = begin;
+	    int i = 0;
+	    int sp = 0;
+	    for (;;) {
+		int r = calcGridNum( item->width(), d->rastX );
+		if ( item == begin ) {
+		    i += r;
+		    sp += r;
+		    x = d->spacing + d->rastX * r;
+		} else {
+		    sp += r;
+		    i += r;
+		    x = i * d->rastX + sp * d->spacing;
+		}
+		if ( x > visibleWidth() && item != begin ) {
+		    item = item->prev;
+		    break;
+		}
+		h = QMAX( h, item->height() );
+		ih = QMAX( ih, item->pixmapRect().height() );
+		QIconViewItem *old = item;
+		item = item->next;
+		if ( !item ) {
+		    item = old;
+		    break;
+		}
+	    }
+	    end = item;
+
+	    if ( d->rastY != -1 )
+		h = QMAX( h, d->rastY );
+
+	    // now move the items
+	    item = begin;
+	    i = 0;
+	    sp = 0;
+	    for (;;) {
+		item->dirty = FALSE;
+		int r = calcGridNum( item->width(), d->rastX );
+		if ( item == begin ) {
+		    if ( d->itemTextPos == Bottom )
+			changed = item->move( d->spacing + ( r * d->rastX - item->width() ) / 2,
+					      y + ih - item->pixmapRect().height() ) || changed;
+		    else
+			changed = item->move( d->spacing, y + ih - item->pixmapRect().height() ) || changed;
+		    i += r;
+		    sp += r;
+		} else {
+		    sp += r;
+		    int x = i * d->rastX + sp * d->spacing;
+		    if ( d->itemTextPos == Bottom )
+			changed = item->move( x + ( r * d->rastX - item->width() ) / 2,
+					      y + ih - item->pixmapRect().height() ) || changed;
+		    else
+			changed = item->move( x, y + ih - item->pixmapRect().height() ) || changed;
+		    i += r;
+		}
+		if ( y + h < item->y() + item->height() )
+		    h = QMAX( h, ih + item->textRect().height() );
+		if ( item == end )
+		    break;
+		item = item->next;
+	    }
+	    y += h + d->spacing;
+	}
+
+
+    } else { // -------------------------------- SOUTH ------------------------------
+
+	int x = y;
+
+	{
+	    int w = 0;
+	    int y = 0;
+	    QIconViewItem *item = begin;
+	    for (;;) {
+		y += d->spacing + item->height();
+		if ( y > visibleHeight() && item != begin ) {
+		    item = item->prev;
+		    break;
+		}
+		w = QMAX( w, item->width() );
+		QIconViewItem *old = item;
+		item = item->next;
+		if ( !item ) {
+		    item = old;
+		    break;
+		}
+	    }
+	    end = item;
+
+	    if ( d->rastX != -1 )
+		w = QMAX( w, d->rastX );
+
+	    // now move the items
+	    item = begin;
+	    for (;;) {
+		item->dirty = FALSE;
+		if ( d->itemTextPos == Bottom ) {
+		    if ( item == begin )
+			changed = item->move( x + ( w - item->width() ) / 2, d->spacing )  || changed;
+		    else
+			changed = item->move( x + ( w - item->width() ) / 2,
+					      item->prev->y() + item->prev->height() + d->spacing ) || changed;
+		} else {
+		    if ( item == begin )
+			changed = item->move( x, d->spacing ) || changed;
+		    else
+			changed = item->move( x, item->prev->y() + item->prev->height() + d->spacing ) || changed;
+		}
+		if ( item == end )
+		    break;
+		item = item->next;
+	    }
+	    x += w + d->spacing;
+	}
+
+	y = x;
+    }
+
+    return end;
+}
+
+/*!
+  \internal
+  Calculates how many cells an item of width \a w needs in a grid with of
+  \a x and returns the result.
+*/
+
+int QIconView::calcGridNum( int w, int x ) const
+{
+    float r = (float)w / (float)x;
+    if ( ( w / x ) * x != w )
+	r += 1.0;
+    return (int)r;
+}
+
+/*!
+  \internal
+  Returns the first item of the row which contains \a item.
+*/
+
+QIconViewItem *QIconView::rowBegin( QIconViewItem * ) const
+{
+    // #### todo
+    return d->firstItem;
+}
+
+/*!
+    Sorts and rearranges all the items in the icon view. If \a
+    ascending is TRUE, the items are sorted in increasing order,
+    otherwise they are sorted in decreasing order.
+
+    QIconViewItem::compare() is used to compare pairs of items. The
+    sorting is based on the items' keys; these default to the items'
+    text unless specifically set to something else.
+
+    Note that this function sets the sort order to \a ascending.
+
+    \sa QIconViewItem::key(), QIconViewItem::setKey(),
+    QIconViewItem::compare(), QIconView::setSorting(),
+    QIconView::sortDirection()
+*/
+
+void QIconView::sort( bool ascending )
+{
+    if ( count() == 0 )
+	return;
+
+    d->sortDirection = ascending;
+    QIconViewPrivate::SortableItem *items = new QIconViewPrivate::SortableItem[ count() ];
+
+    QIconViewItem *item = d->firstItem;
+    int i = 0;
+    for ( ; item; item = item->next )
+	items[ i++ ].item = item;
+
+    qsort( items, count(), sizeof( QIconViewPrivate::SortableItem ), cmpIconViewItems );
+
+    QIconViewItem *prev = 0;
+    item = 0;
+    if ( ascending ) {
+	for ( i = 0; i < (int)count(); ++i ) {
+	    item = items[ i ].item;
+	    if ( item ) {
+		item->prev = prev;
+		if ( item->prev )
+		    item->prev->next = item;
+		item->next = 0;
+	    }
+	    if ( i == 0 )
+		d->firstItem = item;
+	    if ( i == (int)count() - 1 )
+		d->lastItem = item;
+	    prev = item;
+	}
+    } else {
+	for ( i = (int)count() - 1; i >= 0 ; --i ) {
+	    item = items[ i ].item;
+	    if ( item ) {
+		item->prev = prev;
+		if ( item->prev )
+		    item->prev->next = item;
+		item->next = 0;
+	    }
+	    if ( i == (int)count() - 1 )
+		d->firstItem = item;
+	    if ( i == 0 )
+		d->lastItem = item;
+	    prev = item;
+	}
+    }
+
+    delete [] items;
+
+    arrangeItemsInGrid( TRUE );
+}
+
+/*!
+    \reimp
+*/
+
+QSize QIconView::sizeHint() const
+{
+    constPolish();
+
+    if ( !d->firstItem )
+	return QScrollView::sizeHint();
+
+    if ( d->dirty && d->firstSizeHint ) {
+	( (QIconView*)this )->resizeContents( QMAX( 400, contentsWidth() ),
+					      QMAX( 400, contentsHeight() ) );
+	if ( autoArrange() )
+	    ( (QIconView*)this )->arrangeItemsInGrid( FALSE );
+	d->firstSizeHint = FALSE;
+    }
+
+    d->dirty = TRUE; // ######## warwick: I'm sure this is wrong. Fixed in 2.3.
+    int extra = style().pixelMetric(QStyle::PM_ScrollBarExtent,
+				    verticalScrollBar()) + 2*frameWidth();
+    QSize s( QMIN(400, contentsWidth() + extra),
+	     QMIN(400, contentsHeight() + extra) );
+    return s;
+}
+
+/*!
+  \internal
+*/
+
+void QIconView::updateContents()
+{
+    viewport()->update();
+}
+
+/*!
+    \reimp
+*/
+
+void QIconView::enterEvent( QEvent *e )
+{
+    QScrollView::enterEvent( e );
+    emit onViewport();
+}
+
+/*!
+  \internal
+  This function is always called when the geometry of an item changes.
+  This function moves the item into the correct area in the internal
+  data structure.
+*/
+
+void QIconView::updateItemContainer( QIconViewItem *item )
+{
+    if ( !item || d->containerUpdateLocked || (!isVisible() && autoArrange()) )
+	return;
+
+    if ( item->d->container1 && d->firstContainer ) {
+	//Special-case to check if we can use removeLast otherwise use removeRef (slower)
+	if (item->d->container1->items.last() == item)
+	    item->d->container1->items.removeLast();
+	else
+	    item->d->container1->items.removeRef( item );
+    }
+    item->d->container1 = 0;
+    if ( item->d->container2 && d->firstContainer ) {
+	//Special-case to check if we can use removeLast otherwise use removeRef (slower)
+	if (item->d->container2->items.last() == item)
+	    item->d->container2->items.removeLast();
+	else
+	    item->d->container2->items.removeRef( item );
+    }
+    item->d->container2 = 0;
+
+    QIconViewPrivate::ItemContainer *c = d->firstContainer;
+    if ( !c ) {
+	appendItemContainer();
+	c = d->firstContainer;
+    }
+
+    const QRect irect = item->rect();
+    bool contains = FALSE;
+    for (;;) {
+	if ( c->rect.intersects( irect ) ) {
+	    contains = c->rect.contains( irect );
+	    break;
+	}
+
+	c = c->n;
+	if ( !c ) {
+	    appendItemContainer();
+	    c = d->lastContainer;
+	}
+    }
+
+    if ( !c ) {
+#if defined(QT_CHECK_RANGE)
+	qWarning( "QIconViewItem::updateItemContainer(): No fitting container found!" );
+#endif
+	return;
+    }
+
+    c->items.append( item );
+    item->d->container1 = c;
+
+    if ( !contains ) {
+	c = c->n;
+	if ( !c ) {
+	    appendItemContainer();
+	    c = d->lastContainer;
+	}
+	c->items.append( item );
+	item->d->container2 = c;
+    }
+    if ( contentsWidth() < irect.right() || contentsHeight() < irect.bottom() )
+	resizeContents( QMAX( contentsWidth(), irect.right() ), QMAX( contentsHeight(), irect.bottom() ) );
+}
+
+/*!
+  \internal
+  Appends a new rect area to the internal data structure of the items.
+*/
+
+void QIconView::appendItemContainer()
+{
+    QSize s;
+    // #### We have to find out which value is best here
+    if ( d->arrangement == LeftToRight )
+	s = QSize( INT_MAX - 1, RECT_EXTENSION );
+    else
+	s = QSize( RECT_EXTENSION, INT_MAX - 1 );
+
+    if ( !d->firstContainer ) {
+	d->firstContainer = new QIconViewPrivate::ItemContainer( 0, 0, QRect( QPoint( 0, 0 ), s ) );
+	d->lastContainer = d->firstContainer;
+    } else {
+	if ( d->arrangement == LeftToRight )
+	    d->lastContainer = new QIconViewPrivate::ItemContainer(
+		d->lastContainer, 0, QRect( d->lastContainer->rect.bottomLeft(), s ) );
+	else
+	    d->lastContainer = new QIconViewPrivate::ItemContainer(
+		d->lastContainer, 0, QRect( d->lastContainer->rect.topRight(), s ) );
+    }
+}
+
+/*!  \internal
+
+  Rebuilds the whole internal data structure. This is done when it's
+  likely that most/all items change their geometry (e.g. in
+  arrangeItemsInGrid()), because calling this is then more efficient
+  than calling updateItemContainer() for each item.
+*/
+
+void QIconView::rebuildContainers()
+{
+    QIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc;
+    while ( c ) {
+	tmpc = c->n;
+	delete c;
+	c = tmpc;
+    }
+    d->firstContainer = d->lastContainer = 0;
+
+    QIconViewItem *item = d->firstItem;
+    appendItemContainer();
+    c = d->lastContainer;
+    while ( item ) {
+	if ( c->rect.contains( item->rect() ) ) {
+	    item->d->container1 = c;
+	    item->d->container2 = 0;
+	    c->items.append( item );
+	    item = item->next;
+	} else if ( c->rect.intersects( item->rect() ) ) {
+	    item->d->container1 = c;
+	    c->items.append( item );
+	    c = c->n;
+	    if ( !c ) {
+		appendItemContainer();
+		c = d->lastContainer;
+	    }
+	    c->items.append( item );
+	    item->d->container2 = c;
+	    item = item->next;
+	    c = c->p;
+	} else {
+	    if ( d->arrangement == LeftToRight ) {
+		if ( item->y() < c->rect.y() && c->p ) {
+		    c = c->p;
+		    continue;
+		}
+	    } else {
+		if ( item->x() < c->rect.x() && c->p ) {
+		    c = c->p;
+		    continue;
+		}
+	    }
+
+	    c = c->n;
+	    if ( !c ) {
+		appendItemContainer();
+		c = d->lastContainer;
+	    }
+	}
+    }
+}
+
+/*!
+  \internal
+*/
+
+void QIconView::movedContents( int, int )
+{
+    if ( d->drawDragShapes ) {
+	drawDragShapes( d->oldDragPos );
+	d->oldDragPos = QPoint( -1, -1 );
+    }
+}
+
+void QIconView::handleItemChange( QIconViewItem *old, bool shift,
+				  bool control, bool homeend )
+{
+    if ( d->selectionMode == Single ) {
+	bool block = signalsBlocked();
+	blockSignals( TRUE );
+	if ( old )
+	    old->setSelected( FALSE );
+	blockSignals( block );
+	d->currentItem->setSelected( TRUE, TRUE );
+    } else if ( d->selectionMode == Extended ) {
+	 if ( shift ) {
+	    if ( !d->selectAnchor ) {
+		if ( old && !old->selected && old->isSelectable() ) {
+		    old->selected = TRUE;
+		    repaintItem( old );
+		}
+		d->currentItem->setSelected( TRUE, TRUE );
+	    } else {
+		QIconViewItem *from = d->selectAnchor, *to = d->currentItem;
+		if ( !from || !to )
+		    return;
+
+		// checking if it's downwards and if we span rows
+		bool downwards = FALSE;
+		bool spanning = FALSE;
+		if ( d->arrangement == LeftToRight) {
+		    if ( from->rect().center().y() < to->rect().center().y() )
+			downwards = TRUE;
+		} else {
+		    if ( from->rect().center().x() < to->rect().center().x() )
+			downwards = TRUE;
+		}
+
+ 		QRect fr = from->rect();
+		QRect tr = to->rect();
+ 		if ( d->arrangement == LeftToRight ) {
+		    fr.moveTopLeft( QPoint( tr.x(), fr.y() ) );
+ 		    if ( !tr.intersects( fr ) )
+ 			spanning = TRUE;
+ 		} else {
+		    fr.moveTopLeft( QPoint( fr.x(), tr.y() ) );
+ 		    if ( !tr.intersects( fr ) )
+ 			spanning = TRUE;
+ 		}
+
+
+		// finding the rectangles
+		QRect topRect, bottomRect, midRect;
+		if ( !spanning ) {
+		    midRect = from->rect().unite( to->rect() );
+		} else {
+		    if ( downwards ) {
+			topRect = from->rect();
+			bottomRect = to->rect();
+		    } else {
+			topRect = to->rect();
+			bottomRect = from->rect();
+		    }
+		    if ( d->arrangement == LeftToRight ) {
+			topRect.setRight( contentsWidth() );
+			bottomRect.setLeft( 0 );
+			midRect.setRect( 0, topRect.bottom(),
+					 contentsWidth(),
+					 bottomRect.top() - topRect.bottom() );
+		    } else {
+			topRect.setBottom( contentsHeight() );
+			bottomRect.setTop( 0 );
+			midRect.setRect( topRect.right(),
+					 0,
+					 bottomRect.left() - topRect.right(),
+					 contentsHeight() );
+		    }
+		}
+
+		// finding contained items and selecting them
+		QIconViewItem *item = 0;
+		bool changed = FALSE;
+		bool midValid = midRect.isValid();
+		bool topValid = topRect.isValid();
+		bool bottomValid = bottomRect.isValid();
+		QRect selectedRect, unselectedRect;
+		for ( item = d->firstItem; item; item = item->next ) {
+		    bool contained = FALSE;
+		    QPoint itemCenter = item->rect().center();
+		    if ( midValid && midRect.contains( itemCenter ) )
+			contained = TRUE;
+		    if ( !contained && topValid && topRect.contains( itemCenter ) )
+			contained = TRUE;
+		    if ( !contained && bottomValid && bottomRect.contains( itemCenter ) )
+			contained = TRUE;
+
+		    if ( contained ) {
+			if ( !item->selected && item->isSelectable() ) {
+			    changed = TRUE;
+			    item->selected = TRUE;
+			    selectedRect = selectedRect.unite( item->rect() );
+			}
+		    } else if ( item->selected && !control ) {
+			item->selected = FALSE;
+			unselectedRect = unselectedRect.unite( item->rect() );
+			changed = TRUE;
+		    }
+		}
+
+		QRect viewRect( contentsX(), contentsY(),
+				visibleWidth(), visibleHeight() );
+
+   		if ( viewRect.intersects( selectedRect ) ) {
+		    if ( homeend )
+			QScrollView::updateContents( viewRect.intersect( selectedRect ) );
+		    else
+			repaintContents( viewRect.intersect( selectedRect ) );
+		}
+		if ( viewRect.intersects( unselectedRect ) ) {
+		    if ( homeend )
+			QScrollView::updateContents( viewRect.intersect( unselectedRect ) );
+		    else
+			repaintContents( viewRect.intersect( unselectedRect ) );
+		}
+
+		if ( changed )
+		    emit selectionChanged();
+	    }
+	} else if ( !control ) {
+	    blockSignals( TRUE );
+	    selectAll( FALSE );
+	    blockSignals( FALSE );
+	    d->currentItem->setSelected( TRUE, TRUE );
+	}
+    } else {
+	if ( shift )
+	    d->currentItem->setSelected( !d->currentItem->isSelected(), TRUE );
+    }
+}
+
+QBitmap QIconView::mask( QPixmap *pix ) const
+{
+    QBitmap m;
+    if ( d->maskCache.find( QString::number( pix->serialNumber() ), m ) )
+	return m;
+    m = pix->createHeuristicMask();
+    d->maskCache.insert( QString::number( pix->serialNumber() ), m );
+    return m;
+}
+
+/*!
+    \reimp
+    \internal
+
+    (Implemented to get rid of a compiler warning.)
+*/
+void QIconView::drawContents( QPainter * )
+{
+}
+
+/*!
+    \reimp
+*/
+void QIconView::windowActivationChange( bool oldActive )
+{
+    if ( oldActive && d->scrollTimer )
+	d->scrollTimer->stop();
+
+    if ( !isVisible() )
+	return;
+
+    if ( palette().active() == palette().inactive() )
+	return;
+
+    repaintSelectedItems();
+}
+
+/*!
+    Returns TRUE if an iconview item is being renamed; otherwise
+    returns FALSE.
+*/
+
+bool QIconView::isRenaming() const
+{
+#ifndef QT_NO_TEXTEDIT
+    return d->renamingItem && d->renamingItem->renameBox;
+#else
+    return FALSE;
+#endif
+}
+
+#endif // QT_NO_ICONVIEW
Index: trunk/src/iconview/qt_iconview.pri
===================================================================
--- trunk/src/iconview/qt_iconview.pri	(revision 164)
+++ trunk/src/iconview/qt_iconview.pri	(revision 164)
@@ -0,0 +1,6 @@
+# Qt iconview module
+
+iconview {
+	HEADERS += $$ICONVIEW_H/qiconview.h
+	SOURCES += $$ICONVIEW_CPP/qiconview.cpp
+}
Index: trunk/src/table/qt_table.pri
===================================================================
--- trunk/src/table/qt_table.pri	(revision 164)
+++ trunk/src/table/qt_table.pri	(revision 164)
@@ -0,0 +1,6 @@
+# Qt table module
+
+table {
+	HEADERS += $$TABLE_H/qtable.h
+	SOURCES += $$TABLE_CPP/qtable.cpp
+}
Index: trunk/src/table/qtable.cpp
===================================================================
--- trunk/src/table/qtable.cpp	(revision 164)
+++ trunk/src/table/qtable.cpp	(revision 164)
@@ -0,0 +1,7255 @@
+/****************************************************************************
+**
+** Implementation of QTable widget class
+**
+** Created : 000607
+**
+** Copyright (C) 1992-2002 Trolltech AS.  All rights reserved.
+**
+** This file is part of the table module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+#if defined(Q_CC_BOR)
+// needed for qsort() because of a std namespace problem on Borland
+#include "qplatformdefs.h"
+#endif
+
+#include "qtable.h"
+
+#ifndef QT_NO_TABLE
+
+#include <qpainter.h>
+#include <qlineedit.h>
+#include <qcursor.h>
+#include <qapplication.h>
+#include <qtimer.h>
+#include <qobjectlist.h>
+#include <qiconset.h>
+#include <qcombobox.h>
+#include <qcheckbox.h>
+#include <qdragobject.h>
+#include <qevent.h>
+#include <qlistbox.h>
+#include <qstyle.h>
+#include <qdatatable.h>
+#include <qvalidator.h>
+
+#include <stdlib.h>
+#include <limits.h>
+
+static bool qt_update_cell_widget = TRUE;
+static bool qt_table_clipper_enabled = TRUE;
+#ifndef QT_INTERNAL_TABLE
+Q_EXPORT
+#endif
+void qt_set_table_clipper_enabled( bool enabled )
+{
+    qt_table_clipper_enabled = enabled;
+}
+
+class QM_EXPORT_TABLE QTableHeader : public QHeader
+{
+    friend class QTable;
+    Q_OBJECT
+
+public:
+    enum SectionState {
+	Normal,
+	Bold,
+	Selected
+    };
+
+    QTableHeader( int, QTable *t, QWidget* parent=0, const char* name=0 );
+    ~QTableHeader() {};
+    void addLabel( const QString &s, int size );
+    void setLabel( int section, const QString & s, int size = -1 );
+    void setLabel( int section, const QIconSet & iconset, const QString & s,
+		   int size = -1 );
+
+    void setLabels(const QStringList & labels);
+
+    void removeLabel( int section );
+
+    void setSectionState( int s, SectionState state );
+    void setSectionStateToAll( SectionState state );
+    SectionState sectionState( int s ) const;
+
+    int sectionSize( int section ) const;
+    int sectionPos( int section ) const;
+    int sectionAt( int section ) const;
+
+    void setSectionStretchable( int s, bool b );
+    bool isSectionStretchable( int s ) const;
+
+    void updateCache();
+
+signals:
+    void sectionSizeChanged( int s );
+
+protected:
+    void paintEvent( QPaintEvent *e );
+    void paintSection( QPainter *p, int index, const QRect& fr );
+    void mousePressEvent( QMouseEvent *e );
+    void mouseMoveEvent( QMouseEvent *e );
+    void mouseReleaseEvent( QMouseEvent *e );
+    void mouseDoubleClickEvent( QMouseEvent *e );
+    void resizeEvent( QResizeEvent *e );
+
+private slots:
+    void doAutoScroll();
+    void sectionWidthChanged( int col, int os, int ns );
+    void indexChanged( int sec, int oldIdx, int newIdx );
+    void updateStretches();
+    void updateWidgetStretches();
+
+private:
+    void updateSelections();
+    void saveStates();
+    void setCaching( bool b );
+    void swapSections( int oldIdx, int newIdx, bool swapTable = TRUE );
+    bool doSelection( QMouseEvent *e );
+    void sectionLabelChanged( int section );
+    void resizeArrays( int n );
+
+private:
+    QMemArray<int> states, oldStates;
+    QMemArray<bool> stretchable;
+    QMemArray<int> sectionSizes, sectionPoses;
+    bool mousePressed;
+    int pressPos, startPos, endPos;
+    QTable *table;
+    QTimer *autoScrollTimer;
+    QWidget *line1, *line2;
+    bool caching;
+    int resizedSection;
+    bool isResizing;
+    int numStretches;
+    QTimer *stretchTimer, *widgetStretchTimer;
+    QTableHeaderPrivate *d;
+
+};
+
+#ifdef _WS_QWS_
+# define NO_LINE_WIDGET
+#endif
+
+
+
+struct QTablePrivate
+{
+    QTablePrivate() : hasRowSpan( FALSE ), hasColSpan( FALSE ),
+		      inMenuMode( FALSE ), redirectMouseEvent( FALSE )
+    {
+	hiddenRows.setAutoDelete( TRUE );
+	hiddenCols.setAutoDelete( TRUE );
+    }
+    uint hasRowSpan : 1;
+    uint hasColSpan : 1;
+    uint inMenuMode : 1;
+    uint redirectMouseEvent : 1;
+    QIntDict<int> hiddenRows, hiddenCols;
+    QTimer *geomTimer;
+    int lastVisRow;
+    int lastVisCol;
+};
+
+struct QTableHeaderPrivate
+{
+#ifdef NO_LINE_WIDGET
+    int oldLinePos;
+#endif
+};
+
+static bool isRowSelection( QTable::SelectionMode selMode )
+{
+    return selMode == QTable::SingleRow || selMode == QTable::MultiRow;
+}
+
+/*!
+    \class QTableSelection
+    \brief The QTableSelection class provides access to a selected area in a
+    QTable.
+\if defined(commercial)
+    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
+\endif
+
+    \ingroup advanced
+    \module table
+
+    The selection is a rectangular set of cells in a QTable. One of
+    the rectangle's cells is called the anchor cell; this is the cell
+    that was selected first. The init() function sets the anchor and
+    the selection rectangle to exactly this cell; the expandTo()
+    function expands the selection rectangle to include additional
+    cells.
+
+    There are various access functions to find out about the area:
+    anchorRow() and anchorCol() return the anchor's position;
+    leftCol(), rightCol(), topRow() and bottomRow() return the
+    rectangle's four edges. All four are part of the selection.
+
+    A newly created QTableSelection is inactive -- isActive() returns
+    FALSE. You must use init() and expandTo() to activate it.
+
+    \sa QTable QTable::addSelection() QTable::selection()
+    QTable::selectCells() QTable::selectRow() QTable::selectColumn()
+*/
+
+/*!
+    Creates an inactive selection. Use init() and expandTo() to
+    activate it.
+*/
+
+QTableSelection::QTableSelection()
+    : active( FALSE ), inited( FALSE ), tRow( -1 ), lCol( -1 ),
+      bRow( -1 ), rCol( -1 ), aRow( -1 ), aCol( -1 )
+{
+}
+
+/*!
+    Creates an active selection, starting at \a start_row and \a
+    start_col, ending at \a end_row and \a end_col.
+*/
+
+QTableSelection::QTableSelection( int start_row, int start_col, int end_row, int end_col )
+    : active( FALSE ), inited( FALSE ), tRow( -1 ), lCol( -1 ),
+      bRow( -1 ), rCol( -1 ), aRow( -1 ), aCol( -1 )
+{
+    init( start_row, start_col );
+    expandTo( end_row, end_col );
+}
+
+/*!
+    Sets the selection anchor to cell \a row, \a col and the selection
+    to only contain this cell. The selection is not active until
+    expandTo() is called.
+
+    To extend the selection to include additional cells, call
+    expandTo().
+
+    \sa isActive()
+*/
+
+void QTableSelection::init( int row, int col )
+{
+    aCol = lCol = rCol = col;
+    aRow = tRow = bRow = row;
+    active = FALSE;
+    inited = TRUE;
+}
+
+/*!
+    Expands the selection to include cell \a row, \a col. The new
+    selection rectangle is the bounding rectangle of \a row, \a col
+    and the previous selection rectangle. After calling this function
+    the selection is active.
+
+    If you haven't called init(), this function does nothing.
+
+    \sa init() isActive()
+*/
+
+void QTableSelection::expandTo( int row, int col )
+{
+    if ( !inited )
+	return;
+    active = TRUE;
+
+    if ( row < aRow ) {
+	tRow = row;
+	bRow = aRow;
+    } else {
+	tRow = aRow;
+	bRow = row;
+    }
+
+    if ( col < aCol ) {
+	lCol = col;
+	rCol = aCol;
+    } else {
+	lCol = aCol;
+	rCol = col;
+    }
+}
+
+/*!
+    Returns TRUE if \a s includes the same cells as the selection;
+    otherwise returns FALSE.
+*/
+
+bool QTableSelection::operator==( const QTableSelection &s ) const
+{
+    return ( s.active == active &&
+	     s.tRow == tRow && s.bRow == bRow &&
+	     s.lCol == lCol && s.rCol == rCol );
+}
+
+/*!
+    \fn bool QTableSelection::operator!=( const QTableSelection &s ) const
+
+    Returns TRUE if \a s does not include the same cells as the
+    selection; otherwise returns FALSE.
+*/
+
+
+/*!
+    \fn int QTableSelection::topRow() const
+
+    Returns the top row of the selection.
+
+    \sa bottomRow() leftCol() rightCol()
+*/
+
+/*!
+    \fn int QTableSelection::bottomRow() const
+
+    Returns the bottom row of the selection.
+
+    \sa topRow() leftCol() rightCol()
+*/
+
+/*!
+    \fn int QTableSelection::leftCol() const
+
+    Returns the left column of the selection.
+
+    \sa topRow() bottomRow() rightCol()
+*/
+
+/*!
+    \fn int QTableSelection::rightCol() const
+
+    Returns the right column of the selection.
+
+    \sa topRow() bottomRow() leftCol()
+*/
+
+/*!
+    \fn int QTableSelection::anchorRow() const
+
+    Returns the anchor row of the selection.
+
+    \sa anchorCol() expandTo()
+*/
+
+/*!
+    \fn int QTableSelection::anchorCol() const
+
+    Returns the anchor column of the selection.
+
+    \sa anchorRow() expandTo()
+*/
+
+/*!
+    \fn int QTableSelection::numRows() const
+
+    Returns the number of rows in the selection.
+
+    \sa numCols()
+*/
+int QTableSelection::numRows() const
+{
+    return ( tRow < 0 ) ? 0 : bRow - tRow + 1;
+}
+
+/*!
+    Returns the number of columns in the selection.
+
+    \sa numRows()
+*/
+int QTableSelection::numCols() const
+{
+    return ( lCol < 0 ) ? 0 : rCol - lCol + 1;
+}
+
+/*!
+    \fn bool QTableSelection::isActive() const
+
+    Returns whether the selection is active or not. A selection is
+    active after init() \e and expandTo() have been called.
+*/
+
+/*!
+    \fn bool QTableSelection::isEmpty() const
+
+    Returns whether the selection is empty or not.
+
+    \sa numRows(), numCols()
+*/
+
+/*!
+    \class QTableItem
+    \brief The QTableItem class provides the cell content for QTable cells.
+\if defined(commercial)
+    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
+\endif
+
+    \ingroup advanced
+    \module table
+
+    For many applications QTableItems are ideal for presenting and
+    editing the contents of QTable cells. In situations where you need
+    to create very large tables you may prefer an alternative approach
+    to using QTableItems: see the notes on large tables.
+
+    A QTableItem contains a cell's data, by default, a string and a
+    pixmap. The table item also holds the cell's display size and how
+    the data should be aligned. The table item specifies the cell's
+    \l EditType and the editor used for in-place editing (by default a
+    QLineEdit). If you want checkboxes use \l{QCheckTableItem}, and if
+    you want comboboxes use \l{QComboTableItem}. The \l EditType (set
+    in the constructor) determines whether the cell's contents may be
+    edited; setReplaceable() sets whether the cell's contents may be
+    replaced by another cell's contents.
+
+    If a pixmap is specified it is displayed to the left of any text.
+    You can change the text or pixmap with setText() and setPixmap()
+    respectively. For text you can use setWordWrap().
+
+    Reimplement createEditor() and setContentFromEditor() if you want
+    to use your own widget instead of a QLineEdit for editing cell
+    contents. Reimplement paint() if you want to display custom
+    content. If you want a checkbox table item use QCheckTableItem,
+    and if you want a combo table item use \l{QComboTableItem}.
+
+    When sorting table items the key() function is used; by default
+    this returns the table item's text(). Reimplement key() to
+    customize how your table items will sort.
+
+    Table items are inserted into a table using QTable::setItem(). If
+    you insert an item into a cell that already contains a table item
+    the original item will be deleted.
+
+    Example:
+    \code
+    for ( int row = 0; row < table->numRows(); row++ ) {
+	for ( int col = 0; col < table->numCols(); col++ ) {
+	    table->setItem( row, col,
+		new QTableItem( table, QTableItem::WhenCurrent, QString::number( row * col ) ) );
+	}
+    }
+    \endcode
+
+    You can move a table item from one cell to another, in the same or
+    a different table, using QTable::takeItem() and QTable::setItem()
+    but see also QTable::swapCells().
+
+    Table items can be deleted with delete in the standard way; the
+    table and cell will be updated accordingly.
+
+    Note, that if you have a table item that is not currently in a table
+    then anything you do to that item other than insert it into a table
+    will result in undefined behaviour.
+
+    \img qtableitems.png Table Items
+
+    \sa QCheckTableItem QComboTableItem
+
+*/
+
+/*!
+    \fn QTable *QTableItem::table() const
+
+    Returns the QTable the table item belongs to.
+
+    \sa QTable::setItem() QTableItem()
+*/
+
+/*!
+    \enum QTableItem::EditType
+
+    \target wheneditable
+    This enum is used to define whether a cell is editable or
+    read-only (in conjunction with other settings), and how the cell
+    should be displayed.
+
+    \value Always
+    The cell always \e looks editable.
+
+    Using this EditType ensures that the editor created with
+    createEditor() (by default a QLineEdit) is always visible. This
+    has implications for the alignment of the content: the default
+    editor aligns everything (even numbers) to the left whilst
+    numerical values in the cell are by default aligned to the right.
+
+    If a cell with the edit type \c Always looks misaligned you could
+    reimplement createEditor() for these items.
+
+    \value WhenCurrent
+    The cell \e looks editable only when it has keyboard focus (see
+    QTable::setCurrentCell()).
+
+    \value OnTyping
+    The cell \e looks editable only when the user types in it or
+    double-clicks it. It resembles the \c WhenCurrent functionality
+    but is, perhaps, nicer.
+
+    The \c OnTyping edit type is the default when QTableItem objects
+    are created by the convenience functions QTable::setText() and
+    QTable::setPixmap().
+
+    \value Never  The cell is not editable.
+
+    The cell is actually editable only if QTable::isRowReadOnly() is
+    FALSE for its row, QTable::isColumnReadOnly() is FALSE for its
+    column, and QTable::isReadOnly() is FALSE.
+
+    QComboTableItems have an isEditable() property. This property is
+    used to indicate whether the user may enter their own text or are
+    restricted to choosing one of the choices in the list.
+    QComboTableItems may be interacted with only if they are editable
+    in accordance with their EditType as described above.
+
+*/
+
+/*!
+    Creates a table item that is a child of table \a table with no
+    text. The item has the \l EditType \a et.
+
+    The table item will use a QLineEdit for its editor, will not
+    word-wrap and will occupy a single cell. Insert the table item
+    into a table with QTable::setItem().
+
+    The table takes ownership of the table item, so a table item
+    should not be inserted into more than one table at a time.
+*/
+
+QTableItem::QTableItem( QTable *table, EditType et )
+    : txt(), pix(), t( table ), edType( et ), wordwrap( FALSE ),
+      tcha( TRUE ), rw( -1 ), cl( -1 ), rowspan( 1 ), colspan( 1 )
+{
+    enabled = TRUE;
+}
+
+/*!
+    Creates a table item that is a child of table \a table with text
+    \a text. The item has the \l EditType \a et.
+
+    The table item will use a QLineEdit for its editor, will not
+    word-wrap and will occupy a single cell. Insert the table item
+    into a table with QTable::setItem().
+
+    The table takes ownership of the table item, so a table item
+    should not be inserted into more than one table at a time.
+*/
+
+QTableItem::QTableItem( QTable *table, EditType et, const QString &text )
+    : txt( text ), pix(), t( table ), edType( et ), wordwrap( FALSE ),
+      tcha( TRUE ), rw( -1 ), cl( -1 ), rowspan( 1 ), colspan( 1 )
+{
+    enabled = TRUE;
+}
+
+/*!
+    Creates a table item that is a child of table \a table with text
+    \a text and pixmap \a p. The item has the \l EditType \a et.
+
+    The table item will display the pixmap to the left of the text. It
+    will use a QLineEdit for editing the text, will not word-wrap and
+    will occupy a single cell. Insert the table item into a table with
+    QTable::setItem().
+
+    The table takes ownership of the table item, so a table item
+    should not be inserted in more than one table at a time.
+*/
+
+QTableItem::QTableItem( QTable *table, EditType et,
+			const QString &text, const QPixmap &p )
+    : txt( text ), pix( p ), t( table ), edType( et ), wordwrap( FALSE ),
+      tcha( TRUE ), rw( -1 ), cl( -1 ), rowspan( 1 ), colspan( 1 )
+{
+    enabled = TRUE;
+}
+
+/*!
+    The destructor deletes this item and frees all allocated
+    resources.
+
+    If the table item is in a table (i.e. was inserted with
+    setItem()), it will be removed from the table and the cell it
+    occupied.
+*/
+
+QTableItem::~QTableItem()
+{
+    if ( table() )
+	table()->takeItem( this );
+}
+
+int QTableItem::RTTI = 0;
+
+/*!
+    Returns the Run Time Type Identification value for this table item
+    which for QTableItems is 0.
+
+    When you create subclasses based on QTableItem make sure that each
+    subclass returns a unique rtti() value. It is advisable to use
+    values greater than 1000, preferably large random numbers, to
+    allow for extensions to this class.
+
+    \sa QCheckTableItem::rtti() QComboTableItem::rtti()
+*/
+
+int QTableItem::rtti() const
+{
+    return RTTI;
+}
+
+/*!
+    Returns the table item's pixmap or a null pixmap if no pixmap has
+    been set.
+
+    \sa setPixmap() text()
+*/
+
+QPixmap QTableItem::pixmap() const
+{
+    return pix;
+}
+
+
+/*!
+    Returns the text of the table item or QString::null if there is no
+    text.
+
+    To ensure that the current value of the editor is returned,
+    setContentFromEditor() is called:
+    \list 1
+    \i if the editMode() is \c Always, or
+    \i if editMode() is \e not \c Always but the editor of the cell is
+    active and the editor is not a QLineEdit.
+    \endlist
+
+    This means that text() returns the original text value of the item
+    if the editor is a line edit, until the user commits an edit (e.g.
+    by pressing Enter or Tab) in which case the new text is returned.
+    For other editors (e.g. a combobox) setContentFromEditor() is
+    always called so the currently display value is the one returned.
+
+    \sa setText() pixmap()
+*/
+
+QString QTableItem::text() const
+{
+    QWidget *w = table()->cellWidget( rw, cl );
+    if ( w && ( edType == Always ||
+		rtti() == QComboTableItem::RTTI ||
+		rtti() == QCheckTableItem::RTTI ) )
+	( (QTableItem*)this )->setContentFromEditor( w );
+    return txt;
+}
+
+/*!
+    Sets pixmap \a p to be this item's pixmap.
+
+    Note that setPixmap() does not update the cell the table item
+    belongs to. Use QTable::updateCell() to repaint the cell's
+    contents.
+
+    For \l{QComboTableItem}s and \l{QCheckTableItem}s this function
+    has no visible effect.
+
+    \sa QTable::setPixmap() pixmap() setText()
+*/
+
+void QTableItem::setPixmap( const QPixmap &p )
+{
+    pix = p;
+}
+
+/*!
+    Changes the table item's text to \a str.
+
+    Note that setText() does not update the cell the table item
+    belongs to. Use QTable::updateCell() to repaint the cell's
+    contents.
+
+    \sa QTable::setText() text() setPixmap() QTable::updateCell()
+*/
+
+void QTableItem::setText( const QString &str )
+{
+    txt = str;
+}
+
+/*!
+    This virtual function is used to paint the contents of an item
+    using the painter \a p in the rectangular area \a cr using the
+    color group \a cg.
+
+    If \a selected is TRUE the cell is displayed in a way that
+    indicates that it is highlighted.
+
+    You don't usually need to use this function but if you want to
+    draw custom content in a cell you will need to reimplement it.
+
+    The painter passed to this function is translated so that 0, 0
+    is the top-left corner of the item that is being painted.
+
+    Note that the painter is not clipped by default in order to get
+    maximum efficiency. If you want clipping, use
+
+    \code
+    p->setClipRect( table()->cellRect(row, col), QPainter::ClipPainter );
+    //... your drawing code
+    p->setClipping( FALSE );
+    \endcode
+
+*/
+
+void QTableItem::paint( QPainter *p, const QColorGroup &cg,
+			const QRect &cr, bool selected )
+{
+    p->fillRect( 0, 0, cr.width(), cr.height(),
+		 selected ? cg.brush( QColorGroup::Highlight )
+			  : cg.brush( QColorGroup::Base ) );
+
+    int w = cr.width();
+    int h = cr.height();
+
+    int x = 0;
+    if ( !pix.isNull() ) {
+	p->drawPixmap( 0, ( cr.height() - pix.height() ) / 2, pix );
+	x = pix.width() + 2;
+    }
+
+    if ( selected )
+	p->setPen( cg.highlightedText() );
+    else
+	p->setPen( cg.text() );
+    p->drawText( x + 2, 0, w - x - 4, h,
+		 wordwrap ? (alignment() | WordBreak) : alignment(), text() );
+}
+
+/*!
+    This virtual function creates an editor which the user can
+    interact with to edit the cell's contents. The default
+    implementation creates a QLineEdit.
+
+    If the function returns 0, the cell is read-only.
+
+    The returned widget should preferably be invisible, ideally with
+    QTable::viewport() as parent.
+
+    If you reimplement this function you'll almost certainly need to
+    reimplement setContentFromEditor(), and may need to reimplement
+    sizeHint().
+    Also note that you need to call setReplaceable( FALSE ) when creating the item.
+    Otherwise a QLineEdit is used as the editor.
+
+    \quotefile table/statistics/statistics.cpp
+    \skipto createEditor
+    \printto }
+
+    \sa QTable::createEditor() setContentFromEditor() QTable::viewport() setReplaceable()
+*/
+
+QWidget *QTableItem::createEditor() const
+{
+    QLineEdit *e = new QLineEdit( table()->viewport(), "qt_tableeditor" );
+    e->setFrame( FALSE );
+    e->setText( text() );
+    return e;
+}
+
+/*!
+    Whenever the content of a cell has been edited by the editor \a w,
+    QTable calls this virtual function to copy the new values into the
+    QTableItem.
+
+    If you reimplement createEditor() and return something that is not
+    a QLineEdit you will almost certainly have to reimplement this
+    function.
+
+    \quotefile table/statistics/statistics.cpp
+    \skipto setContentFromEditor
+    \printto }
+
+    \sa QTable::setCellContentFromEditor()
+*/
+
+void QTableItem::setContentFromEditor( QWidget *w )
+{
+    QLineEdit *le = ::qt_cast<QLineEdit*>(w);
+    if ( le ) {
+	QString input = le->text();
+	if ( le->validator() )
+	    le->validator()->fixup( input );
+	setText( input );
+    }
+}
+
+/*!
+    The alignment function returns how the text contents of the cell
+    are aligned when drawn. The default implementation aligns numbers
+    to the right and any other text to the left.
+
+    \sa Qt::AlignmentFlags
+*/
+
+// ed: For consistency reasons a setAlignment() should be provided
+// as well.
+
+int QTableItem::alignment() const
+{
+    bool num;
+    bool ok1 = FALSE, ok2 = FALSE;
+    (void)text().toInt( &ok1 );
+    if ( !ok1 )
+	(void)text().toDouble( &ok2 ); // ### should be .-aligned
+    num = ok1 || ok2;
+
+    return ( num ? AlignRight : AlignLeft ) | AlignVCenter;
+}
+
+/*!
+    If \a b is TRUE, the cell's text will be wrapped over multiple
+    lines, when necessary, to fit the width of the cell; otherwise the
+    text will be written as a single line.
+
+    \sa wordWrap() QTable::adjustColumn() QTable::setColumnStretchable()
+*/
+
+void QTableItem::setWordWrap( bool b )
+{
+    wordwrap = b;
+}
+
+/*!
+    Returns TRUE if word wrap is enabled for the cell; otherwise
+    returns FALSE.
+
+    \sa setWordWrap()
+*/
+
+bool QTableItem::wordWrap() const
+{
+    return wordwrap;
+}
+
+/*! \internal */
+
+void QTableItem::updateEditor( int oldRow, int oldCol )
+{
+    if ( edType != Always )
+	return;
+    if ( oldRow != -1 && oldCol != -1 )
+	table()->clearCellWidget( oldRow, oldCol );
+    if ( rw != -1 && cl != -1 )
+	table()->setCellWidget( rw, cl, createEditor() );
+}
+
+/*!
+    Returns the table item's edit type.
+
+    This is set when the table item is constructed.
+
+    \sa EditType QTableItem()
+*/
+
+QTableItem::EditType QTableItem::editType() const
+{
+    return edType;
+}
+
+/*!
+    If \a b is TRUE it is acceptable to replace the contents of the
+    cell with the contents of another QTableItem. If \a b is FALSE the
+    contents of the cell may not be replaced by the contents of
+    another table item. Table items that span more than one cell may
+    not have their contents replaced by another table item.
+
+    (This differs from \l EditType because EditType is concerned with
+    whether the \e user is able to change the contents of a cell.)
+
+    \sa isReplaceable()
+*/
+
+void QTableItem::setReplaceable( bool b )
+{
+    tcha = b;
+}
+
+/*!
+    This function returns whether the contents of the cell may be
+    replaced with the contents of another table item. Regardless of
+    this setting, table items that span more than one cell may not
+    have their contents replaced by another table item.
+
+    (This differs from \l EditType because EditType is concerned with
+    whether the \e user is able to change the contents of a cell.)
+
+    \sa setReplaceable() EditType
+*/
+
+bool QTableItem::isReplaceable() const
+{
+    if ( rowspan > 1 || colspan > 1 )
+	return FALSE;
+    return tcha;
+}
+
+/*!
+    This virtual function returns the key that should be used for
+    sorting. The default implementation returns the text() of the
+    relevant item.
+
+    \sa QTable::setSorting()
+*/
+
+QString QTableItem::key() const
+{
+    return text();
+}
+
+/*!
+    This virtual function returns the size a cell needs to show its
+    entire content.
+
+    If you subclass QTableItem you will often need to reimplement this
+    function.
+*/
+
+QSize QTableItem::sizeHint() const
+{
+    QSize strutSize = QApplication::globalStrut();
+    if ( edType == Always && table()->cellWidget( rw, cl ) )
+	return table()->cellWidget( rw, cl )->sizeHint().expandedTo( strutSize );
+
+    QSize s;
+    int x = 0;
+    if ( !pix.isNull() ) {
+	s = pix.size();
+	s.setWidth( s.width() + 2 );
+	x = pix.width() + 2;
+    }
+
+    QString t = text();
+    if ( !wordwrap && t.find( '\n' ) == -1 )
+	return QSize( s.width() + table()->fontMetrics().width( text() ) + 10,
+		      QMAX( s.height(), table()->fontMetrics().height() ) ).expandedTo( strutSize );
+
+    QRect r = table()->fontMetrics().boundingRect( x + 2, 0, table()->columnWidth( col() ) - x - 4, 0,
+						   wordwrap ? (alignment() | WordBreak) : alignment(),
+						   text() );
+    r.setWidth( QMAX( r.width() + 10, table()->columnWidth( col() ) ) );
+    return QSize( r.width(), QMAX( s.height(), r.height() ) ).expandedTo( strutSize );
+}
+
+/*!
+    Changes the extent of the QTableItem so that it spans multiple
+    cells covering \a rs rows and \a cs columns. The top left cell is
+    the original cell.
+
+    \warning This function only works if the item has already been
+    inserted into the table using e.g. QTable::setItem(). This
+    function also checks to make sure if \a rs and \a cs are within
+    the bounds of the table and returns without changing the span if
+    they are not. In addition swapping, inserting or removing rows and
+    columns that cross QTableItems spanning more than one cell is not
+    supported.
+
+    \sa rowSpan() colSpan()
+*/
+
+void QTableItem::setSpan( int rs, int cs )
+{
+    if ( rs == rowspan && cs == colspan )
+	return;
+
+    if ( !table()->d->hasRowSpan )
+	table()->d->hasRowSpan = rs > 1;
+    if ( !table()->d->hasColSpan )
+	table()->d->hasColSpan = cs > 1;
+    // return if we are thinking too big...
+    if ( rw + rs > table()->numRows() )
+	return;
+
+    if ( cl + cs > table()->numCols() )
+	return;
+
+    if ( rw == -1 || cl == -1 )
+	return;
+
+    int rrow = rw;
+    int rcol = cl;
+    if ( rowspan > 1 || colspan > 1 ) {
+	QTable* t = table();
+	t->takeItem( this );
+	t->setItem( rrow, rcol, this );
+    }
+
+    rowspan = rs;
+    colspan = cs;
+
+    for ( int r = 0; r < rowspan; ++r ) {
+	for ( int c = 0; c < colspan; ++c ) {
+	    if ( r == 0 && c == 0 )
+		continue;
+	    qt_update_cell_widget = FALSE;
+	    table()->setItem( r + rw, c + cl, this );
+	    qt_update_cell_widget = TRUE;
+	    rw = rrow;
+	    cl = rcol;
+	}
+    }
+
+    table()->updateCell( rw, cl );
+    QWidget *w = table()->cellWidget( rw, cl );
+    if ( w )
+	w->resize( table()->cellGeometry( rw, cl ).size() );
+}
+
+/*!
+    Returns the row span of the table item, usually 1.
+
+    \sa setSpan() colSpan()
+*/
+
+int QTableItem::rowSpan() const
+{
+    return rowspan;
+}
+
+/*!
+    Returns the column span of the table item, usually 1.
+
+    \sa setSpan() rowSpan()
+*/
+
+int QTableItem::colSpan() const
+{
+    return colspan;
+}
+
+/*!
+    Sets row \a r as the table item's row. Usually you do not need to
+    call this function.
+
+    If the cell spans multiple rows, this function sets the top row
+    and retains the height of the multi-cell table item.
+
+    \sa row() setCol() rowSpan()
+*/
+
+void QTableItem::setRow( int r )
+{
+    rw = r;
+}
+
+/*!
+    Sets column \a c as the table item's column. Usually you will not
+    need to call this function.
+
+    If the cell spans multiple columns, this function sets the
+    left-most column and retains the width of the multi-cell table
+    item.
+
+    \sa col() setRow() colSpan()
+*/
+
+void QTableItem::setCol( int c )
+{
+    cl = c;
+}
+
+/*!
+    Returns the row where the table item is located. If the cell spans
+    multiple rows, this function returns the top-most row.
+
+    \sa col() setRow()
+*/
+
+int QTableItem::row() const
+{
+    return rw;
+}
+
+/*!
+    Returns the column where the table item is located. If the cell
+    spans multiple columns, this function returns the left-most
+    column.
+
+    \sa row() setCol()
+*/
+
+int QTableItem::col() const
+{
+    return cl;
+}
+
+/*!
+    If \a b is TRUE, the table item is enabled; if \a b is FALSE the
+    table item is disabled.
+
+    A disabled item doesn't respond to user interaction.
+
+    \sa isEnabled()
+*/
+
+void QTableItem::setEnabled( bool b )
+{
+    if ( b == (bool)enabled )
+	return;
+    enabled = b;
+    table()->updateCell( row(), col() );
+}
+
+/*!
+    Returns TRUE if the table item is enabled; otherwise returns FALSE.
+
+    \sa setEnabled()
+*/
+
+bool QTableItem::isEnabled() const
+{
+    return (bool)enabled;
+}
+
+/*!
+    \class QComboTableItem
+    \brief The QComboTableItem class provides a means of using
+    comboboxes in QTables.
+\if defined(commercial)
+    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
+\endif
+
+    \ingroup advanced
+    \module table
+
+    A QComboTableItem is a table item which looks and behaves like a
+    combobox. The advantage of using QComboTableItems rather than real
+    comboboxes is that a QComboTableItem uses far less resources than
+    real comboboxes in \l{QTable}s. When the cell has the focus it
+    displays a real combobox which the user can interact with. When
+    the cell does not have the focus the cell \e looks like a
+    combobox. Only text items (i.e. no pixmaps) may be used in
+    QComboTableItems.
+
+    QComboTableItem items have the edit type \c WhenCurrent (see
+    \l{EditType}). The QComboTableItem's list of items is provided by
+    a QStringList passed to the constructor.
+
+    The list of items may be changed using setStringList(). The
+    current item can be set with setCurrentItem() and retrieved with
+    currentItem(). The text of the current item can be obtained with
+    currentText(), and the text of a particular item can be retrieved
+    with text().
+
+    If isEditable() is TRUE the QComboTableItem will permit the user
+    to either choose an existing list item, or create a new list item
+    by entering their own text; otherwise the user may only choose one
+    of the existing list items.
+
+    To populate a table cell with a QComboTableItem use
+    QTable::setItem().
+
+    QComboTableItems may be deleted with QTable::clearCell().
+
+    QComboTableItems can be distinguished from \l{QTableItem}s and
+    \l{QCheckTableItem}s using their Run Time Type Identification
+    number (see rtti()).
+
+    \img qtableitems.png Table Items
+
+    \sa QCheckTableItem QTableItem QComboBox
+*/
+
+QComboBox *QComboTableItem::fakeCombo = 0;
+QWidget *QComboTableItem::fakeComboWidget = 0;
+int QComboTableItem::fakeRef = 0;
+
+/*!
+    Creates a combo table item for the table \a table. The combobox's
+    list of items is passed in the \a list argument. If \a editable is
+    TRUE the user may type in new list items; if \a editable is FALSE
+    the user may only select from the list of items provided.
+
+    By default QComboTableItems cannot be replaced by other table
+    items since isReplaceable() returns FALSE by default.
+
+    \sa QTable::clearCell() EditType
+*/
+
+QComboTableItem::QComboTableItem( QTable *table, const QStringList &list, bool editable )
+    : QTableItem( table, WhenCurrent, "" ), entries( list ), current( 0 ), edit( editable )
+{
+    setReplaceable( FALSE );
+    if ( !QComboTableItem::fakeCombo ) {
+	QComboTableItem::fakeComboWidget = new QWidget( 0, 0 );
+	QComboTableItem::fakeCombo = new QComboBox( FALSE, QComboTableItem::fakeComboWidget, 0 );
+	QComboTableItem::fakeCombo->hide();
+    }
+    ++QComboTableItem::fakeRef;
+    if ( entries.count() )
+	setText( *entries.at( current ) );
+}
+
+/*!
+    QComboTableItem destructor.
+*/
+QComboTableItem::~QComboTableItem()
+{
+    if (--QComboTableItem::fakeRef <= 0) {
+	delete QComboTableItem::fakeComboWidget;
+	QComboTableItem::fakeComboWidget = 0;
+	QComboTableItem::fakeCombo = 0;
+    }
+}
+
+/*!
+    Sets the list items of this QComboTableItem to the strings in the
+    string list \a l.
+*/
+
+void QComboTableItem::setStringList( const QStringList &l )
+{
+    entries = l;
+    current = 0;
+    if ( entries.count() )
+	setText( *entries.at( current ) );
+    if ( table()->cellWidget( row(), col() ) ) {
+	cb->clear();
+	cb->insertStringList( entries );
+    }
+    table()->updateCell( row(), col() );
+}
+
+/*! \reimp */
+
+QWidget *QComboTableItem::createEditor() const
+{
+    // create an editor - a combobox in our case
+    ( (QComboTableItem*)this )->cb = new QComboBox( edit, table()->viewport(), "qt_editor_cb" );
+    cb->insertStringList( entries );
+    cb->setCurrentItem( current );
+    QObject::connect( cb, SIGNAL( activated(int) ), table(), SLOT( doValueChanged() ) );
+    return cb;
+}
+
+/*! \reimp */
+
+void QComboTableItem::setContentFromEditor( QWidget *w )
+{
+    QComboBox *cb = ::qt_cast<QComboBox*>(w);
+    if ( cb ) {
+	entries.clear();
+	for ( int i = 0; i < cb->count(); ++i )
+	    entries << cb->text( i );
+	current = cb->currentItem();
+	setText( *entries.at( current ) );
+    }
+}
+
+/*! \reimp */
+
+void QComboTableItem::paint( QPainter *p, const QColorGroup &cg,
+			   const QRect &cr, bool selected )
+{
+    fakeCombo->resize( cr.width(), cr.height() );
+
+    QColorGroup c( cg );
+    if ( selected ) {
+	c.setBrush( QColorGroup::Base, cg.brush( QColorGroup::Highlight ) );
+	c.setColor( QColorGroup::Text, cg.highlightedText() );
+    }
+
+    QStyle::SFlags flags = QStyle::Style_Default;
+    if(isEnabled() && table()->isEnabled())
+	flags |= QStyle::Style_Enabled;
+    table()->style().drawComplexControl( QStyle::CC_ComboBox, p, fakeCombo, fakeCombo->rect(), c, flags );
+
+    p->save();
+    QRect textR = table()->style().querySubControlMetrics(QStyle::CC_ComboBox, fakeCombo,
+							 QStyle::SC_ComboBoxEditField);
+    int align = alignment(); // alignment() changes entries
+    p->drawText( textR, wordWrap() ? ( align | WordBreak ) : align, *entries.at( current ) );
+    p->restore();
+}
+
+/*!
+    Sets the list item \a i to be the combo table item's current list
+    item.
+
+    \sa currentItem()
+*/
+
+void QComboTableItem::setCurrentItem( int i )
+{
+    QWidget *w = table()->cellWidget( row(), col() );
+    QComboBox *cb = ::qt_cast<QComboBox*>(w);
+    if ( cb ) {
+	cb->setCurrentItem( i );
+	current = i;
+	setText( cb->currentText() );
+    } else {
+	current = i;
+	setText( *entries.at( i ) );
+	table()->updateCell( row(), col() );
+    }
+}
+
+/*!
+    \overload
+
+    Sets the list item whose text is \a s to be the combo table item's
+    current list item. Does nothing if no list item has the text \a s.
+
+    \sa currentItem()
+*/
+
+void QComboTableItem::setCurrentItem( const QString &s )
+{
+    int i = entries.findIndex( s );
+    if ( i != -1 )
+	setCurrentItem( i );
+}
+
+/*!
+    Returns the index of the combo table item's current list item.
+
+    \sa setCurrentItem()
+*/
+
+int QComboTableItem::currentItem() const
+{
+    QWidget *w = table()->cellWidget( row(), col() );
+    QComboBox *cb = ::qt_cast<QComboBox*>(w);
+    if ( cb )
+	return cb->currentItem();
+    return current;
+}
+
+/*!
+    Returns the text of the combo table item's current list item.
+
+    \sa currentItem() text()
+*/
+
+QString QComboTableItem::currentText() const
+{
+    QWidget *w = table()->cellWidget( row(), col() );
+    QComboBox *cb = ::qt_cast<QComboBox*>(w);
+    if ( cb )
+	return cb->currentText();
+    return *entries.at( current );
+}
+
+/*!
+    Returns the total number of list items in the combo table item.
+*/
+
+int QComboTableItem::count() const
+{
+    QWidget *w = table()->cellWidget( row(), col() );
+    QComboBox *cb = ::qt_cast<QComboBox*>(w);
+    if ( cb )
+	return cb->count();
+    return (int)entries.count();    //### size_t/int cast
+}
+
+/*!
+    Returns the text of the combo's list item at index \a i.
+
+    \sa currentText()
+*/
+
+QString QComboTableItem::text( int i ) const
+{
+    QWidget *w = table()->cellWidget( row(), col() );
+    QComboBox *cb = ::qt_cast<QComboBox*>(w);
+    if ( cb )
+	return cb->text( i );
+    return *entries.at( i );
+}
+
+/*!
+    If \a b is TRUE the combo table item can be edited, i.e. the user
+    may enter a new text item themselves. If \a b is FALSE the user may
+    may only choose one of the existing items.
+
+    \sa isEditable()
+*/
+
+void QComboTableItem::setEditable( bool b )
+{
+    edit = b;
+}
+
+/*!
+    Returns TRUE if the user can add their own list items to the
+    combobox's list of items; otherwise returns FALSE.
+
+    \sa setEditable()
+*/
+
+bool QComboTableItem::isEditable() const
+{
+    return edit;
+}
+
+int QComboTableItem::RTTI = 1;
+
+/*!
+    \fn int QComboTableItem::rtti() const
+
+    Returns 1.
+
+    Make your derived classes return their own values for rtti()to
+    distinguish between different table item subclasses. You should
+    use values greater than 1000, preferably a large random number, to
+    allow for extensions to this class.
+
+
+    \sa QTableItem::rtti()
+*/
+
+int QComboTableItem::rtti() const
+{
+    return RTTI;
+}
+
+/*! \reimp */
+
+QSize QComboTableItem::sizeHint() const
+{
+    fakeCombo->insertItem( currentText() );
+    fakeCombo->setCurrentItem( fakeCombo->count() - 1 );
+    QSize sh = fakeCombo->sizeHint();
+    fakeCombo->removeItem( fakeCombo->count() - 1 );
+    return sh.expandedTo( QApplication::globalStrut() );
+}
+
+/*!
+    \class QCheckTableItem
+    \brief The QCheckTableItem class provides checkboxes in QTables.
+\if defined(commercial)
+    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
+\endif
+
+    \ingroup advanced
+    \module table
+
+    A QCheckTableItem is a table item which looks and behaves like a
+    checkbox. The advantage of using QCheckTableItems rather than real
+    checkboxes is that a QCheckTableItem uses far less resources than
+    a real checkbox would in a \l{QTable}. When the cell has the focus
+    it displays a real checkbox which the user can interact with. When
+    the cell does not have the focus the cell \e looks like a
+    checkbox. Pixmaps may not be used in QCheckTableItems.
+
+    QCheckTableItem items have the edit type \c WhenCurrent (see
+    \l{EditType}).
+
+    To change the checkbox's label use setText(). The checkbox can be
+    checked and unchecked with setChecked() and its state retrieved
+    using isChecked().
+
+    To populate a table cell with a QCheckTableItem use
+    QTable::setItem().
+
+    QCheckTableItems can be distinguished from \l{QTableItem}s and
+    \l{QComboTableItem}s using their Run Time Type Identification
+    (rtti) value.
+
+    \img qtableitems.png Table Items
+
+    \sa rtti() EditType QComboTableItem QTableItem QCheckBox
+*/
+
+/*!
+    Creates a QCheckTableItem with an \l{EditType} of \c WhenCurrent
+    as a child of \a table. The checkbox is initially unchecked and
+    its label is set to the string \a txt.
+*/
+
+QCheckTableItem::QCheckTableItem( QTable *table, const QString &txt )
+    : QTableItem( table, WhenCurrent, txt ), checked( FALSE )
+{
+}
+
+/*! \reimp */
+
+void QCheckTableItem::setText( const QString &t )
+{
+    QTableItem::setText( t );
+    QWidget *w = table()->cellWidget( row(), col() );
+    QCheckBox *cb = ::qt_cast<QCheckBox*>(w);
+    if ( cb )
+	cb->setText( t );
+}
+
+
+/*! \reimp */
+
+QWidget *QCheckTableItem::createEditor() const
+{
+    // create an editor - a combobox in our case
+    ( (QCheckTableItem*)this )->cb = new QCheckBox( table()->viewport(), "qt_editor_checkbox" );
+    cb->setChecked( checked );
+    cb->setText( text() );
+    cb->setBackgroundColor( table()->viewport()->backgroundColor() );
+    QObject::connect( cb, SIGNAL( toggled(bool) ), table(), SLOT( doValueChanged() ) );
+    return cb;
+}
+
+/*! \reimp */
+
+void QCheckTableItem::setContentFromEditor( QWidget *w )
+{
+    QCheckBox *cb = ::qt_cast<QCheckBox*>(w);
+    if ( cb )
+	checked = cb->isChecked();
+}
+
+/*! \reimp */
+
+void QCheckTableItem::paint( QPainter *p, const QColorGroup &cg,
+				const QRect &cr, bool selected )
+{
+    p->fillRect( 0, 0, cr.width(), cr.height(),
+		 selected ? cg.brush( QColorGroup::Highlight )
+			  : cg.brush( QColorGroup::Base ) );
+
+    int w = cr.width();
+    int h = cr.height();
+    QSize sz = QSize( table()->style().pixelMetric( QStyle::PM_IndicatorWidth ),
+		      table()->style().pixelMetric( QStyle::PM_IndicatorHeight ) );
+    QColorGroup c( cg );
+    c.setBrush( QColorGroup::Background, c.brush( QColorGroup::Base ) );
+    QStyle::SFlags flags = QStyle::Style_Default;
+    if(isEnabled())
+	flags |= QStyle::Style_Enabled;
+    if ( checked )
+	flags |= QStyle::Style_On;
+    else
+	flags |= QStyle::Style_Off;
+    if ( isEnabled() && table()->isEnabled() )
+	flags |= QStyle::Style_Enabled;
+
+    table()->style().drawPrimitive( QStyle::PE_Indicator, p,
+				    QRect( 0, ( cr.height() - sz.height() ) / 2, sz.width(), sz.height() ), c, flags );
+    int x = sz.width() + 6;
+    w = w - x;
+    if ( selected )
+	p->setPen( cg.highlightedText() );
+    else
+	p->setPen( cg.text() );
+    p->drawText( x, 0, w, h, wordWrap() ? ( alignment() | WordBreak ) : alignment(), text() );
+}
+
+/*!
+    If \a b is TRUE the checkbox is checked; if \a b is FALSE the
+    checkbox is unchecked.
+
+    \sa isChecked()
+*/
+
+void QCheckTableItem::setChecked( bool b )
+{
+    checked = b;
+    table()->updateCell( row(), col() );
+    QWidget *w = table()->cellWidget( row(), col() );
+    QCheckBox *cb = ::qt_cast<QCheckBox*>(w);
+    if ( cb )
+	cb->setChecked( b );
+}
+
+/*!
+    Returns TRUE if the checkbox table item is checked; otherwise
+    returns FALSE.
+
+    \sa setChecked()
+*/
+
+bool QCheckTableItem::isChecked() const
+{
+    // #### why was this next line here. It must not be here, as
+    // #### people want to call isChecked() from within paintCell()
+    // #### and end up in an infinite loop that way
+    // table()->updateCell( row(), col() );
+    QWidget *w = table()->cellWidget( row(), col() );
+    QCheckBox *cb = ::qt_cast<QCheckBox*>(w);
+    if ( cb )
+	return cb->isChecked();
+    return checked;
+}
+
+int QCheckTableItem::RTTI = 2;
+
+/*!
+    \fn int QCheckTableItem::rtti() const
+
+    Returns 2.
+
+    Make your derived classes return their own values for rtti()to
+    distinguish between different table item subclasses. You should
+    use values greater than 1000, preferably a large random number, to
+    allow for extensions to this class.
+
+    \sa QTableItem::rtti()
+*/
+
+int QCheckTableItem::rtti() const
+{
+    return RTTI;
+}
+
+/*! \reimp */
+
+QSize QCheckTableItem::sizeHint() const
+{
+    QSize sz = QSize( table()->style().pixelMetric( QStyle::PM_IndicatorWidth ),
+		      table()->style().pixelMetric( QStyle::PM_IndicatorHeight ) );
+    sz.setWidth( sz.width() + 6 );
+    QSize sh( QTableItem::sizeHint() );
+    return QSize( sh.width() + sz.width(), QMAX( sh.height(), sz.height() ) ).
+	expandedTo( QApplication::globalStrut() );
+}
+
+/*! \file table/small-table-demo/main.cpp */
+/*! \file table/bigtable/main.cpp */
+/*! \file table/statistics/statistics.cpp */
+
+/*!
+    \class QTable
+    \brief The QTable class provides a flexible editable table widget.
+\if defined(commercial)
+    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
+\endif
+
+    \mainclass
+    \ingroup advanced
+    \module table
+
+    QTable is easy to use, although it does have a large API because
+    of the comprehensive functionality that it provides. QTable
+    includes functions for manipulating \link #headers
+    headers\endlink, \link #columnsrows rows and columns\endlink,
+    \link #cells cells\endlink and \link #selections
+    selections\endlink. QTable also provides in-place editing and
+    \link dnd.html drag and drop\endlink, as well as a useful set of
+    \link #signals signals\endlink. QTable efficiently supports very
+    large tables, for example, tables one million by one million cells
+    are perfectly possible. QTable is economical with memory, using
+    none for unused cells.
+
+    \code
+    QTable *table = new QTable( 100, 250, this );
+    table->setPixmap( 3, 2, pix );
+    table->setText( 3, 2, "A pixmap" );
+    \endcode
+
+    The first line constructs the table specifying its size in rows
+    and columns. We then insert a pixmap and some text into the \e
+    same \link #cells cell\endlink, with the pixmap appearing to the
+    left of the text. QTable cells can be populated with
+    \l{QTableItem}s, \l{QComboTableItem}s or by \l{QCheckTableItem}s.
+    By default a vertical header appears at the left of the table
+    showing row numbers and a horizontal header appears at the top of
+    the table showing column numbers. (The numbers displayed start at
+    1, although row and column numbers within QTable begin at 0.)
+
+    If you want to use mouse tracking call setMouseTracking( TRUE ) on
+    the \e viewport; (see \link qscrollview.html#allviews
+    QScrollView\endlink).
+
+    \img qtableitems.png Table Items
+
+    \target headers
+    \section1 Headers
+
+    QTable supports a header column, e.g. to display row numbers, and
+    a header row, e.g to display column titles. To set row or column
+    labels use QHeader::setLabel() on the pointers returned by
+    verticalHeader() and horizontalHeader() respectively. The vertical
+    header is displayed within the table's left margin whose width is
+    set with setLeftMargin(). The horizontal header is displayed
+    within the table's top margin whose height is set with
+    setTopMargin(). The table's grid can be switched off with
+    setShowGrid(). If you want to hide a horizontal header call
+    hide(), and call setTopMargin( 0 ) so that the area the header
+    would have occupied is reduced to zero size.
+
+    Header labels are indexed via their section numbers. Note that the
+    default behavior of QHeader regarding section numbers is overriden
+    for QTable. See the explanation below in the Rows and Columns
+    section in the discussion of moving columns and rows.
+
+    \target columnsrows
+    \section1 Rows and Columns
+
+    Row and column sizes are set with setRowHeight() and
+    setColumnWidth(). If you want a row high enough to show the
+    tallest item in its entirety, use adjustRow(). Similarly, to make
+    a column wide enough to show the widest item use adjustColumn().
+    If you want the row height and column width to adjust
+    automatically as the height and width of the table changes use
+    setRowStretchable() and setColumnStretchable().
+
+    Rows and columns can be hidden and shown with hideRow(),
+    hideColumn(), showRow() and showColumn(). New rows and columns are
+    inserted using insertRows() and insertColumns(). Additional rows
+    and columns are added at the  bottom (rows) or right (columns) if
+    you set setNumRows() or setNumCols() to be larger than numRows()
+    or numCols(). Existing rows and columns are removed with
+    removeRow() and removeColumn(). Multiple rows and columns can be
+    removed with removeRows() and removeColumns().
+
+    Rows and columns can be set to be moveable using
+    rowMovingEnabled() and columnMovingEnabled(). The user can drag
+    them to reorder them holding down the Ctrl key and dragging the
+    mouse. For performance reasons, the default behavior of QHeader
+    section numbers is overridden by QTable. Currently in QTable, when
+    a row or column is dragged and reordered, the section number is
+    also changed to its new position. Therefore, there is no
+    difference between the section and the index fields in QHeader.
+    The QTable QHeader classes do not provide a mechanism for indexing
+    independently of the user interface ordering.
+
+    The table can be sorted using sortColumn(). Users can sort a
+    column by clicking its header if setSorting() is set to TRUE. Rows
+    can be swapped with swapRows(), columns with swapColumns() and
+    cells with swapCells().
+
+    For editable tables (see setReadOnly()) you can set the read-only
+    property of individual rows and columns with setRowReadOnly() and
+    setColumnReadOnly(). (Whether a cell is editable or read-only
+    depends on these settings and the cell's \link
+    qtableitem.html#wheneditable QTableItem::EditType\endlink.)
+
+    The row and column which have the focus are returned by
+    currentRow() and currentColumn() respectively.
+
+    Although many QTable functions operate in terms of rows and
+    columns the indexOf() function returns a single integer
+    identifying a particular cell.
+
+    \target cells
+    \section1 Cells
+
+    All of a QTable's cells are empty when the table is constructed.
+
+    There are two approaches to populating the table's cells. The
+    first and simplest approach is to use QTableItems or QTableItem
+    subclasses. The second approach doesn't use QTableItems at all
+    which is useful for very large sparse tables but requires you to
+    reimplement a number of functions. We'll look at each approach in
+    turn.
+
+    To put a string in a cell use setText(). This function will create
+    a new QTableItem for the cell if one doesn't already exist, and
+    displays the text in it. By default the table item's widget will
+    be a QLineEdit. A pixmap may be put in a cell with setPixmap(),
+    which also creates a table item if required. A cell may contain \e
+    both a pixmap and text; the pixmap is displayed to the left of the
+    text. Another approach is to construct a QTableItem or QTableItem
+    subclass, set its properties, then insert it into a cell with
+    setItem().
+
+    If you want cells which contain comboboxes use the QComboTableItem
+    class. Similarly if you require cells containing checkboxes use
+    the QCheckTableItem class. These table items look and behave just
+    like the combobox or checkbox widgets but consume far less memory.
+
+    \quotefile table/small-table-demo/main.cpp
+    \skipto int j
+    \printuntil QCheckTableItem
+    In the example above we create a column of QCheckTableItems and
+    insert them into the table using setItem().
+
+    QTable takes ownership of its QTableItems and will delete them
+    when the table itself is destroyed. You can take ownership of a
+    table item using takeItem() which you use to move a cell's
+    contents from one cell to another, either within the same table,
+    or from one table to another. (See also, swapCells()).
+
+    In-place editing of the text in QTableItems, and the values in
+    QComboTableItems and QCheckTableItems works automatically. Cells
+    may be editable or read-only, see \link
+    qtableitem.html#wheneditable QTableItem::EditType\endlink. If you
+    want fine control over editing see beginEdit() and endEdit().
+
+    The contents of a cell can be retrieved as a QTableItem using
+    item(), or as a string with text() or as a pixmap (if there is
+    one) with pixmap(). A cell's bounding rectangle is given by
+    cellGeometry(). Use updateCell() to repaint a cell, for example to
+    clear away a cell's visual representation after it has been
+    deleted with clearCell(). The table can be forced to scroll to
+    show a particular cell with ensureCellVisible(). The isSelected()
+    function indicates if a cell is selected.
+
+    It is possible to use your own widget as a cell's widget using
+    setCellWidget(), but subclassing QTableItem might be a simpler
+    approach. The cell's widget (if there is one) can be removed with
+    clearCellWidget().
+
+    \keyword notes on large tables
+    \target bigtables
+    \section2 Large tables
+
+    For large, sparse, tables using QTableItems or other widgets is
+    inefficient. The solution is to \e draw the cell as it should
+    appear and to create and destroy cell editors on demand.
+
+    This approach requires that you reimplement various functions.
+    Reimplement paintCell() to display your data, and createEditor()
+    and setCellContentFromEditor() to support in-place editing. It
+    is very important to reimplement resizeData() to have no
+    functionality, to prevent QTable from attempting to create a huge
+    array. You will also need to reimplement item(), setItem(),
+    takeItem(), clearCell(), and insertWidget(), cellWidget() and
+    clearCellWidget(). In almost every circumstance (for sorting,
+    removing and inserting columns and rows, etc.), you also need
+    to reimplement swapRows(), swapCells() and swapColumns(), including
+    header handling.
+
+    If you represent active cells with a dictionary of QTableItems and
+    QWidgets, i.e. only store references to cells that are actually
+    used, many of the functions can be implemented with a single line
+    of code. (See the \l table/bigtable/main.cpp example.)
+
+    For more information on cells see the QTableItem documenation.
+
+    \target selections
+    \section1 Selections
+
+    QTable's support single selection, multi-selection (multiple
+    cells) or no selection. The selection mode is set with
+    setSelectionMode(). Use isSelected() to determine if a particular
+    cell is selected, and isRowSelected() and isColumnSelected() to
+    see if a row or column is selected.
+
+    QTable's support many simultaneous selections. You can
+    programmatically select cells with addSelection(). The number of
+    selections is given by numSelections(). The current selection is
+    returned by currentSelection(). You can remove a selection with
+    removeSelection() and remove all selections with
+    clearSelection(). Selections are QTableSelection objects.
+
+    To easily add a new selection use selectCells(), selectRow() or
+    selectColumn().
+
+    Alternatively, use addSelection() to add new selections using
+    QTableSelection objects. The advantage of using QTableSelection
+    objects is that you can call QTableSelection::expandTo() to resize
+    the selection and can query and compare them.
+
+    The number of selections is given by numSelections(). The current
+    selection is returned by currentSelection(). You can remove a
+    selection with removeSelection() and remove all selections with
+    clearSelection().
+
+    \target signals
+    \section1 Signals
+
+    When the user clicks a cell the currentChanged() signal is
+    emitted. You can also connect to the lower level clicked(),
+    doubleClicked() and pressed() signals. If the user changes the
+    selection the selectionChanged() signal is emitted; similarly if
+    the user changes a cell's value the valueChanged() signal is
+    emitted. If the user right-clicks (or presses the appropriate
+    platform-specific key sequence) the contextMenuRequested() signal
+    is emitted. If the user drops a drag and drop object the dropped()
+    signal is emitted with the drop event.
+*/
+
+/*!
+    \fn void QTable::currentChanged( int row, int col )
+
+    This signal is emitted when the current cell has changed to \a
+    row, \a col.
+*/
+
+/*!
+    \fn void QTable::valueChanged( int row, int col )
+
+    This signal is emitted when the user changed the value in the cell
+    at \a row, \a col.
+*/
+
+/*!
+    \fn int QTable::currentRow() const
+
+    Returns the current row.
+
+    \sa currentColumn()
+*/
+
+/*!
+    \fn int QTable::currentColumn() const
+
+    Returns the current column.
+
+    \sa currentRow()
+*/
+
+/*!
+    \enum QTable::EditMode
+
+    \value NotEditing  No cell is currently being edited.
+
+    \value Editing  A cell is currently being edited. The editor was
+    initialised with the cell's contents.
+
+    \value Replacing  A cell is currently being edited. The editor was
+    not initialised with the cell's contents.
+*/
+
+/*!
+    \enum QTable::SelectionMode
+
+    \value NoSelection No cell can be selected by the user.
+
+    \value Single The user may only select a single range of cells.
+
+    \value Multi The user may select multiple ranges of cells.
+
+    \value SingleRow The user may select one row at once.
+
+    \value MultiRow The user may select multiple rows.
+*/
+
+/*!
+    \enum QTable::FocusStyle
+
+    Specifies how the current cell (focus cell) is drawn.
+
+    \value FollowStyle The current cell is drawn according to the
+    current style and the cell's background is also drawn selected, if
+    the current cell is within a selection
+
+    \value SpreadSheet The current cell is drawn as in a spreadsheet.
+    This means, it is signified by a black rectangle around the cell,
+    and the background of the current cell is always drawn with the
+    widget's base color - even when selected.
+
+*/
+
+/*!
+    \fn void QTable::clicked( int row, int col, int button, const QPoint &mousePos )
+
+    This signal is emitted when mouse button \a button is clicked. The
+    cell where the event took place is at \a row, \a col, and the
+    mouse's position is in \a mousePos.
+*/
+
+/*!
+    \fn void QTable::doubleClicked( int row, int col, int button, const QPoint &mousePos )
+
+    This signal is emitted when mouse button \a button is
+    double-clicked. The cell where the event took place is at \a row,
+    \a col, and the mouse's position is in \a mousePos.
+*/
+
+/*!
+    \fn void QTable::pressed( int row, int col, int button, const QPoint &mousePos )
+
+    This signal is emitted when mouse button \a button is pressed. The
+    cell where the event took place is at \a row, \a col, and the
+    mouse's position is in \a mousePos.
+*/
+
+/*!
+    \fn void QTable::selectionChanged()
+
+    This signal is emitted whenever a selection changes.
+
+    \sa QTableSelection
+*/
+
+/*!
+    \fn void QTable::contextMenuRequested( int row, int col, const QPoint & pos )
+
+    This signal is emitted when the user invokes a context menu with
+    the right mouse button (or with a system-specific keypress). The
+    cell where the event took place is at \a row, \a col. \a pos is
+    the position where the context menu will appear in the global
+    coordinate system.
+*/
+
+/*!
+    Creates an empty table object called \a name as a child of \a
+    parent.
+
+    Call setNumRows() and setNumCols() to set the table size before
+    populating the table if you're using QTableItems.
+
+    \sa QWidget::clearWFlags() Qt::WidgetFlags
+*/
+
+QTable::QTable( QWidget *parent, const char *name )
+    : QScrollView( parent, name, WNoAutoErase | WStaticContents ),
+      leftHeader( 0 ), topHeader( 0 ),
+      currentSel( 0 ), lastSortCol( -1 ), sGrid( TRUE ), mRows( FALSE ), mCols( FALSE ),
+      asc( TRUE ), doSort( TRUE ), readOnly( FALSE )
+{
+    init( 0, 0 );
+}
+
+/*!
+    Constructs an empty table called \a name with \a numRows rows and
+    \a numCols columns. The table is a child of \a parent.
+
+    If you're using \l{QTableItem}s to populate the table's cells, you
+    can create QTableItem, QComboTableItem and QCheckTableItem items
+    and insert them into the table using setItem(). (See the notes on
+    large tables for an alternative to using QTableItems.)
+
+    \sa QWidget::clearWFlags() Qt::WidgetFlags
+*/
+
+QTable::QTable( int numRows, int numCols, QWidget *parent, const char *name )
+    : QScrollView( parent, name, WNoAutoErase | WStaticContents ),
+      leftHeader( 0 ), topHeader( 0 ),
+      currentSel( 0 ), lastSortCol( -1 ), sGrid( TRUE ), mRows( FALSE ), mCols( FALSE ),
+      asc( TRUE ), doSort( TRUE ), readOnly( FALSE )
+{
+    init( numRows, numCols );
+}
+
+/*! \internal
+*/
+
+void QTable::init( int rows, int cols )
+{
+#ifndef QT_NO_DRAGANDDROP
+    setDragAutoScroll( FALSE );
+#endif
+    d = new QTablePrivate;
+    d->geomTimer = new QTimer( this );
+    d->lastVisCol = 0;
+    d->lastVisRow = 0;
+    connect( d->geomTimer, SIGNAL( timeout() ), this, SLOT( updateGeometriesSlot() ) );
+    shouldClearSelection = FALSE;
+    dEnabled = FALSE;
+    roRows.setAutoDelete( TRUE );
+    roCols.setAutoDelete( TRUE );
+    setSorting( FALSE );
+
+    unused = TRUE; // It's unused, ain't it? :)
+
+    selMode = Multi;
+
+    contents.setAutoDelete( TRUE );
+    widgets.setAutoDelete( TRUE );
+
+    // Enable clipper and set background mode
+    enableClipper( qt_table_clipper_enabled );
+
+    viewport()->setFocusProxy( this );
+    viewport()->setFocusPolicy( WheelFocus );
+
+    viewport()->setBackgroundMode( PaletteBase );
+    setBackgroundMode( PaletteBackground, PaletteBase );
+    setResizePolicy( Manual );
+    selections.setAutoDelete( TRUE );
+
+    // Create headers
+    leftHeader = new QTableHeader( rows, this, this, "left table header" );
+    leftHeader->setOrientation( Vertical );
+    leftHeader->setTracking( TRUE );
+    leftHeader->setMovingEnabled( TRUE );
+    topHeader = new QTableHeader( cols, this, this, "right table header" );
+    topHeader->setOrientation( Horizontal );
+    topHeader->setTracking( TRUE );
+    topHeader->setMovingEnabled( TRUE );
+    if ( QApplication::reverseLayout() )
+	setMargins( 0, fontMetrics().height() + 4, 30, 0 );
+    else
+	setMargins( 30, fontMetrics().height() + 4, 0, 0 );
+
+    topHeader->setUpdatesEnabled( FALSE );
+    leftHeader->setUpdatesEnabled( FALSE );
+    // Initialize headers
+    int i = 0;
+    for ( i = 0; i < numCols(); ++i )
+	topHeader->resizeSection( i, QMAX( 100, QApplication::globalStrut().height() ) );
+    for ( i = 0; i < numRows(); ++i )
+	leftHeader->resizeSection( i, QMAX( 20, QApplication::globalStrut().width() ) );
+    topHeader->setUpdatesEnabled( TRUE );
+    leftHeader->setUpdatesEnabled( TRUE );
+
+    // Prepare for contents
+    contents.setAutoDelete( FALSE );
+
+    // Connect header, table and scrollbars
+    connect( horizontalScrollBar(), SIGNAL( valueChanged(int) ),
+	     topHeader, SLOT( setOffset(int) ) );
+    connect( verticalScrollBar(), SIGNAL( valueChanged(int) ),
+	     leftHeader, SLOT( setOffset(int) ) );
+    connect( topHeader, SIGNAL( sectionSizeChanged(int) ),
+	     this, SLOT( columnWidthChanged(int) ) );
+    connect( topHeader, SIGNAL( indexChange(int,int,int) ),
+	     this, SLOT( columnIndexChanged(int,int,int) ) );
+    connect( topHeader, SIGNAL( sectionClicked(int) ),
+	     this, SLOT( columnClicked(int) ) );
+    connect( leftHeader, SIGNAL( sectionSizeChanged(int) ),
+	     this, SLOT( rowHeightChanged(int) ) );
+    connect( leftHeader, SIGNAL( indexChange(int,int,int) ),
+	     this, SLOT( rowIndexChanged(int,int,int) ) );
+
+    // Initialize variables
+    autoScrollTimer = new QTimer( this );
+    connect( autoScrollTimer, SIGNAL( timeout() ),
+	     this, SLOT( doAutoScroll() ) );
+    curRow = curCol = 0;
+    topHeader->setSectionState( curCol, QTableHeader::Bold );
+    leftHeader->setSectionState( curRow, QTableHeader::Bold );
+    edMode = NotEditing;
+    editRow = editCol = -1;
+
+    drawActiveSelection = TRUE;
+
+    installEventFilter( this );
+
+    focusStl = SpreadSheet;
+
+    was_visible = FALSE;
+
+    // initial size
+    resize( 640, 480 );
+}
+
+/*!
+    Releases all the resources used by the QTable object,
+    including all \l{QTableItem}s and their widgets.
+*/
+
+QTable::~QTable()
+{
+    delete d;
+    setUpdatesEnabled( FALSE );
+    contents.setAutoDelete( TRUE );
+    contents.clear();
+    widgets.clear();
+}
+
+void QTable::setReadOnly( bool b )
+{
+    readOnly = b;
+
+    QTableItem *i = item(curRow, curCol);
+    if (readOnly && isEditing()) {
+	endEdit(editRow, editCol, TRUE, FALSE);
+    } else if (!readOnly && i && (i->editType() == QTableItem::WhenCurrent
+				  || i->editType() == QTableItem::Always)) {
+	editCell(curRow, curCol);
+    }
+}
+
+/*!
+    If \a ro is TRUE, row \a row is set to be read-only; otherwise the
+    row is set to be editable.
+
+    Whether a cell in this row is editable or read-only depends on the
+    cell's EditType, and this setting:
+    see \link qtableitem.html#wheneditable QTableItem::EditType\endlink.
+
+    \sa isRowReadOnly() setColumnReadOnly() setReadOnly()
+*/
+
+void QTable::setRowReadOnly( int row, bool ro )
+{
+    if ( ro )
+	roRows.replace( row, new int( 0 ) );
+    else
+	roRows.remove( row );
+
+    if (curRow == row) {
+	QTableItem *i = item(curRow, curCol);
+	if (ro && isEditing()) {
+	    endEdit(editRow, editCol, TRUE, FALSE);
+	} else if (!ro && i && (i->editType() == QTableItem::WhenCurrent
+				      || i->editType() == QTableItem::Always)) {
+	    editCell(curRow, curCol);
+	}
+    }
+}
+
+/*!
+    If \a ro is TRUE, column \a col is set to be read-only; otherwise
+    the column is set to be editable.
+
+    Whether a cell in this column is editable or read-only depends on
+    the cell's EditType, and this setting:
+    see \link qtableitem.html#wheneditable QTableItem::EditType\endlink.
+
+    \sa isColumnReadOnly() setRowReadOnly() setReadOnly()
+
+*/
+
+void QTable::setColumnReadOnly( int col, bool ro )
+{
+    if ( ro )
+	roCols.replace( col, new int( 0 ) );
+    else
+	roCols.remove( col );
+
+    if (curCol == col) {
+	QTableItem *i = item(curRow, curCol);
+	if (ro && isEditing()) {
+	    endEdit(editRow, editCol, TRUE, FALSE);
+	} else if (!ro && i && (i->editType() == QTableItem::WhenCurrent
+				      || i->editType() == QTableItem::Always)) {
+	    editCell(curRow, curCol);
+	}
+    }
+}
+
+/*!
+    \property QTable::readOnly
+    \brief whether the table is read-only
+
+    Whether a cell in the table is editable or read-only depends on
+    the cell's \link QTableItem::EditType EditType\link, and this setting:
+    see \link qtableitem.html#wheneditable
+    QTableItem::EditType\endlink.
+
+    \sa QWidget::enabled setColumnReadOnly() setRowReadOnly()
+*/
+
+bool QTable::isReadOnly() const
+{
+    return readOnly;
+}
+
+/*!
+    Returns TRUE if row \a row is read-only; otherwise returns FALSE.
+
+    Whether a cell in this row is editable or read-only depends on the
+    cell's \link QTableItem::EditType EditType\endlink, and this
+    setting: see \link qtableitem.html#wheneditable
+    QTableItem::EditType\endlink.
+
+    \sa setRowReadOnly() isColumnReadOnly()
+*/
+
+bool QTable::isRowReadOnly( int row ) const
+{
+    return (roRows.find( row ) != 0);
+}
+
+/*!
+    Returns TRUE if column \a col is read-only; otherwise returns
+    FALSE.
+
+    Whether a cell in this column is editable or read-only depends on
+    the cell's EditType, and this setting: see \link
+    qtableitem.html#wheneditable QTableItem::EditType\endlink.
+
+    \sa setColumnReadOnly() isRowReadOnly()
+*/
+
+bool QTable::isColumnReadOnly( int col ) const
+{
+    return (roCols.find( col ) != 0);
+}
+
+void QTable::setSelectionMode( SelectionMode mode )
+{
+    if ( mode == selMode )
+	return;
+    selMode = mode;
+    clearSelection();
+    if ( isRowSelection( selMode ) && numRows() > 0 && numCols() > 0 ) {
+	currentSel = new QTableSelection();
+	selections.append( currentSel );
+	currentSel->init( curRow, 0 );
+	currentSel->expandTo( curRow, numCols() - 1 );
+	repaintSelections( 0, currentSel );
+    }
+}
+
+/*!
+    \property QTable::selectionMode
+    \brief the current selection mode
+
+    The default mode is \c Multi which allows the user to select
+    multiple ranges of cells.
+
+    \sa SelectionMode setSelectionMode()
+*/
+
+QTable::SelectionMode QTable::selectionMode() const
+{
+    return selMode;
+}
+
+/*!
+    \property QTable::focusStyle
+    \brief how the current (focus) cell is drawn
+
+    The default style is \c SpreadSheet.
+
+    \sa QTable::FocusStyle
+*/
+
+void QTable::setFocusStyle( FocusStyle fs )
+{
+    focusStl = fs;
+    updateCell( curRow, curCol );
+}
+
+QTable::FocusStyle QTable::focusStyle() const
+{
+    return focusStl;
+}
+
+/*!
+    This functions updates all the header states to be in sync with
+    the current selections. This should be called after
+    programatically changing, adding or removing selections, so that
+    the headers are updated.
+*/
+
+void QTable::updateHeaderStates()
+{
+    horizontalHeader()->setUpdatesEnabled( FALSE );
+    verticalHeader()->setUpdatesEnabled( FALSE );
+
+    ( (QTableHeader*)verticalHeader() )->setSectionStateToAll( QTableHeader::Normal );
+    ( (QTableHeader*)horizontalHeader() )->setSectionStateToAll( QTableHeader::Normal );
+
+    QPtrListIterator<QTableSelection> it( selections );
+    QTableSelection *s;
+    while ( ( s = it.current() ) != 0 ) {
+	++it;
+	if ( s->isActive() ) {
+	    if ( s->leftCol() == 0 &&
+		 s->rightCol() == numCols() - 1 ) {
+		for ( int i = 0; i < s->bottomRow() - s->topRow() + 1; ++i )
+		    leftHeader->setSectionState( s->topRow() + i, QTableHeader::Selected );
+	    }
+	    if ( s->topRow() == 0 &&
+		 s->bottomRow() == numRows() - 1 ) {
+		for ( int i = 0; i < s->rightCol() - s->leftCol() + 1; ++i )
+		    topHeader->setSectionState( s->leftCol() + i, QTableHeader::Selected );
+	    }
+	}
+    }
+
+    horizontalHeader()->setUpdatesEnabled( TRUE );
+    verticalHeader()->setUpdatesEnabled( TRUE );
+    horizontalHeader()->repaint( FALSE );
+    verticalHeader()->repaint( FALSE );
+}
+
+/*!
+    Returns the table's top QHeader.
+
+    This header contains the column labels.
+
+    To modify a column label use QHeader::setLabel(), e.g.
+    \quotefile table/statistics/statistics.cpp
+    \skipto horizontalHeader
+    \printline
+
+    \sa verticalHeader() setTopMargin() QHeader
+*/
+
+QHeader *QTable::horizontalHeader() const
+{
+    return (QHeader*)topHeader;
+}
+
+/*!
+    Returns the table's vertical QHeader.
+
+    This header contains the row labels.
+
+    \sa horizontalHeader() setLeftMargin() QHeader
+*/
+
+QHeader *QTable::verticalHeader() const
+{
+    return (QHeader*)leftHeader;
+}
+
+void QTable::setShowGrid( bool b )
+{
+    if ( sGrid == b )
+	return;
+    sGrid = b;
+    updateContents();
+}
+
+/*!
+    \property QTable::showGrid
+    \brief whether the table's grid is displayed
+
+    The grid is shown by default.
+*/
+
+bool QTable::showGrid() const
+{
+    return sGrid;
+}
+
+/*!
+    \property QTable::columnMovingEnabled
+    \brief whether columns can be moved by the user
+
+    The default is FALSE. Columns are moved by dragging whilst holding
+    down the Ctrl key.
+
+    \sa rowMovingEnabled
+*/
+
+void QTable::setColumnMovingEnabled( bool b )
+{
+    mCols = b;
+}
+
+bool QTable::columnMovingEnabled() const
+{
+    return mCols;
+}
+
+/*!
+    \property QTable::rowMovingEnabled
+    \brief whether rows can be moved by the user
+
+    The default is FALSE. Rows are moved by dragging whilst holding
+    down the Ctrl key.
+
+
+    \sa columnMovingEnabled
+*/
+
+void QTable::setRowMovingEnabled( bool b )
+{
+    mRows = b;
+}
+
+bool QTable::rowMovingEnabled() const
+{
+    return mRows;
+}
+
+/*!
+    This is called when QTable's internal array needs to be resized to
+    \a len elements.
+
+    If you don't use QTableItems you should reimplement this as an
+    empty method to avoid wasting memory. See the notes on large
+    tables for further details.
+*/
+
+void QTable::resizeData( int len )
+{
+    contents.resize( len );
+    widgets.resize( len );
+}
+
+/*!
+    Swaps the data in \a row1 and \a row2.
+
+    This function is used to swap the positions of two rows. It is
+    called when the user changes the order of rows (see
+    setRowMovingEnabled()), and when rows are sorted.
+
+    If you don't use \l{QTableItem}s and want your users to be able to
+    swap rows, e.g. for sorting, you will need to reimplement this
+    function. (See the notes on large tables.)
+
+    If \a swapHeader is TRUE, the rows' header contents is also
+    swapped.
+
+    This function will not update the QTable, you will have to do
+    this manually, e.g. by calling updateContents().
+
+    \sa swapColumns() swapCells()
+*/
+
+void QTable::swapRows( int row1, int row2, bool swapHeader )
+{
+    if ( swapHeader )
+	leftHeader->swapSections( row1, row2, FALSE );
+
+    QPtrVector<QTableItem> tmpContents;
+    tmpContents.resize( numCols() );
+    QPtrVector<QWidget> tmpWidgets;
+    tmpWidgets.resize( numCols() );
+    int i;
+
+    contents.setAutoDelete( FALSE );
+    widgets.setAutoDelete( FALSE );
+    for ( i = 0; i < numCols(); ++i ) {
+	QTableItem *i1, *i2;
+	i1 = item( row1, i );
+	i2 = item( row2, i );
+	if ( i1 || i2 ) {
+	    tmpContents.insert( i, i1 );
+	    contents.remove( indexOf( row1, i ) );
+	    contents.insert( indexOf( row1, i ), i2 );
+	    contents.remove( indexOf( row2, i ) );
+	    contents.insert( indexOf( row2, i ), tmpContents[ i ] );
+	    if ( contents[ indexOf( row1, i ) ] )
+		contents[ indexOf( row1, i ) ]->setRow( row1 );
+	    if ( contents[ indexOf( row2, i ) ] )
+		contents[ indexOf( row2, i ) ]->setRow( row2 );
+	}
+
+	QWidget *w1, *w2;
+	w1 = cellWidget( row1, i );
+	w2 = cellWidget( row2, i );
+	if ( w1 || w2 ) {
+	    tmpWidgets.insert( i, w1 );
+	    widgets.remove( indexOf( row1, i ) );
+	    widgets.insert( indexOf( row1, i ), w2 );
+	    widgets.remove( indexOf( row2, i ) );
+	    widgets.insert( indexOf( row2, i ), tmpWidgets[ i ] );
+	}
+    }
+    contents.setAutoDelete( FALSE );
+    widgets.setAutoDelete( TRUE );
+
+    updateRowWidgets( row1 );
+    updateRowWidgets( row2 );
+    if ( curRow == row1 )
+	curRow = row2;
+    else if ( curRow == row2 )
+	curRow = row1;
+    if ( editRow == row1 )
+	editRow = row2;
+    else if ( editRow == row2 )
+	editRow = row1;
+}
+
+/*!
+    Sets the left margin to be \a m pixels wide.
+
+    The verticalHeader(), which displays row labels, occupies this
+    margin.
+
+    In an Arabic or Hebrew localization, the verticalHeader() will
+    appear on the right side of the table, and this call will set the
+    right margin.
+
+    \sa leftMargin() setTopMargin() verticalHeader()
+*/
+
+void QTable::setLeftMargin( int m )
+{
+    if ( QApplication::reverseLayout() )
+	setMargins( leftMargin(), topMargin(), m, bottomMargin() );
+    else
+	setMargins( m, topMargin(), rightMargin(), bottomMargin() );
+    updateGeometries();
+}
+
+/*!
+    Sets the top margin to be \a m pixels high.
+
+    The horizontalHeader(), which displays column labels, occupies
+    this margin.
+
+    \sa topMargin() setLeftMargin()
+*/
+
+void QTable::setTopMargin( int m )
+{
+    setMargins( leftMargin(), m, rightMargin(), bottomMargin() );
+    updateGeometries();
+}
+
+/*!
+    Swaps the data in \a col1 with \a col2.
+
+    This function is used to swap the positions of two columns. It is
+    called when the user changes the order of columns (see
+    setColumnMovingEnabled(), and when columns are sorted.
+
+    If you don't use \l{QTableItem}s and want your users to be able to
+    swap columns you will need to reimplement this function. (See the
+    notes on large tables.)
+
+    If \a swapHeader is TRUE, the columns' header contents is also
+    swapped.
+
+    \sa swapCells()
+*/
+
+void QTable::swapColumns( int col1, int col2, bool swapHeader )
+{
+    if ( swapHeader )
+	topHeader->swapSections( col1, col2, FALSE );
+
+    QPtrVector<QTableItem> tmpContents;
+    tmpContents.resize( numRows() );
+    QPtrVector<QWidget> tmpWidgets;
+    tmpWidgets.resize( numRows() );
+    int i;
+
+    contents.setAutoDelete( FALSE );
+    widgets.setAutoDelete( FALSE );
+    for ( i = 0; i < numRows(); ++i ) {
+	QTableItem *i1, *i2;
+	i1 = item( i, col1 );
+	i2 = item( i, col2 );
+	if ( i1 || i2 ) {
+	    tmpContents.insert( i, i1 );
+	    contents.remove( indexOf( i, col1 ) );
+	    contents.insert( indexOf( i, col1 ), i2 );
+	    contents.remove( indexOf( i, col2 ) );
+	    contents.insert( indexOf( i, col2 ), tmpContents[ i ] );
+	    if ( contents[ indexOf( i, col1 ) ] )
+		contents[ indexOf( i, col1 ) ]->setCol( col1 );
+	    if ( contents[ indexOf( i, col2 ) ] )
+		contents[ indexOf( i, col2 ) ]->setCol( col2 );
+	}
+
+	QWidget *w1, *w2;
+	w1 = cellWidget( i, col1 );
+	w2 = cellWidget( i, col2 );
+	if ( w1 || w2 ) {
+	    tmpWidgets.insert( i, w1 );
+	    widgets.remove( indexOf( i, col1 ) );
+	    widgets.insert( indexOf( i, col1 ), w2 );
+	    widgets.remove( indexOf( i, col2 ) );
+	    widgets.insert( indexOf( i, col2 ), tmpWidgets[ i ] );
+	}
+    }
+    contents.setAutoDelete( FALSE );
+    widgets.setAutoDelete( TRUE );
+
+    columnWidthChanged( col1 );
+    columnWidthChanged( col2 );
+    if ( curCol == col1 )
+	curCol = col2;
+    else if ( curCol == col2 )
+	curCol = col1;
+    if ( editCol == col1 )
+	editCol = col2;
+    else if ( editCol == col2 )
+	editCol = col1;
+}
+
+/*!
+    Swaps the contents of the cell at \a row1, \a col1 with the
+    contents of the cell at \a row2, \a col2.
+
+    This function is also called when the table is sorted.
+
+    If you don't use \l{QTableItem}s and want your users to be able to
+    swap cells, you will need to reimplement this function. (See the
+    notes on large tables.)
+
+    \sa swapColumns() swapRows()
+*/
+
+void QTable::swapCells( int row1, int col1, int row2, int col2 )
+{
+    contents.setAutoDelete( FALSE );
+    widgets.setAutoDelete( FALSE );
+    QTableItem *i1, *i2;
+    i1 = item( row1, col1 );
+    i2 = item( row2, col2 );
+    if ( i1 || i2 ) {
+	QTableItem *tmp = i1;
+	contents.remove( indexOf( row1, col1 ) );
+	contents.insert( indexOf( row1, col1 ), i2 );
+	contents.remove( indexOf( row2, col2 ) );
+	contents.insert( indexOf( row2, col2 ), tmp );
+	if ( contents[ indexOf( row1, col1 ) ] ) {
+	    contents[ indexOf( row1, col1 ) ]->setRow( row1 );
+	    contents[ indexOf( row1, col1 ) ]->setCol( col1 );
+	}
+	if ( contents[ indexOf( row2, col2 ) ] ) {
+	    contents[ indexOf( row2, col2 ) ]->setRow( row2 );
+	    contents[ indexOf( row2, col2 ) ]->setCol( col2 );
+	}
+    }
+
+    QWidget *w1, *w2;
+    w1 = cellWidget( row1, col1 );
+    w2 = cellWidget( row2, col2 );
+    if ( w1 || w2 ) {
+	QWidget *tmp = w1;
+	widgets.remove( indexOf( row1, col1 ) );
+	widgets.insert( indexOf( row1, col1 ), w2 );
+	widgets.remove( indexOf( row2, col2 ) );
+	widgets.insert( indexOf( row2, col2 ), tmp );
+    }
+
+    updateRowWidgets( row1 );
+    updateRowWidgets( row2 );
+    updateColWidgets( col1 );
+    updateColWidgets( col2 );
+    contents.setAutoDelete( FALSE );
+    widgets.setAutoDelete( TRUE );
+}
+
+static bool is_child_of( QWidget *child, QWidget *parent )
+{
+    while ( child ) {
+	if ( child == parent )
+	    return TRUE;
+	child = child->parentWidget();
+    }
+    return FALSE;
+}
+
+/*!
+    Draws the table contents on the painter \a p. This function is
+    optimized so that it only draws the cells inside the \a cw pixels
+    wide and \a ch pixels high clipping rectangle at position \a cx,
+    \a cy.
+
+    Additionally, drawContents() highlights the current cell.
+*/
+
+void QTable::drawContents( QPainter *p, int cx, int cy, int cw, int ch )
+{
+    int colfirst = columnAt( cx );
+    int collast = columnAt( cx + cw );
+    int rowfirst = rowAt( cy );
+    int rowlast = rowAt( cy + ch );
+
+    if ( rowfirst == -1 || colfirst == -1 ) {
+	paintEmptyArea( p, cx, cy, cw, ch );
+	return;
+    }
+
+    drawActiveSelection = hasFocus() || viewport()->hasFocus() || d->inMenuMode
+			|| is_child_of( qApp->focusWidget(), viewport() )
+			|| !style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus, this );
+    if ( rowlast == -1 )
+	rowlast = numRows() - 1;
+    if ( collast == -1 )
+	collast = numCols() - 1;
+
+    bool currentInSelection = FALSE;
+
+    QPtrListIterator<QTableSelection> it( selections );
+    QTableSelection *s;
+    while ( ( s = it.current() ) != 0 ) {
+	++it;
+	if ( s->isActive() &&
+	     curRow >= s->topRow() &&
+	     curRow <= s->bottomRow() &&
+	     curCol >= s->leftCol() &&
+	     curCol <= s->rightCol() ) {
+	    currentInSelection = s->topRow() != curRow || s->bottomRow() != curRow || s->leftCol() != curCol || s->rightCol() != curCol;
+	    break;
+	}
+    }
+
+    // Go through the rows
+    for ( int r = rowfirst; r <= rowlast; ++r ) {
+	// get row position and height
+	int rowp = rowPos( r );
+	int rowh = rowHeight( r );
+
+	// Go through the columns in row r
+	// if we know from where to where, go through [colfirst, collast],
+	// else go through all of them
+	for ( int c = colfirst; c <= collast; ++c ) {
+	    // get position and width of column c
+	    int colp, colw;
+	    colp = columnPos( c );
+	    colw = columnWidth( c );
+	    int oldrp = rowp;
+	    int oldrh = rowh;
+
+	    QTableItem *itm = item( r, c );
+	    if ( itm &&
+		 ( itm->colSpan() > 1 || itm->rowSpan() > 1 ) ) {
+		bool goon = r == itm->row() && c == itm->col() ||
+			r == rowfirst && c == itm->col() ||
+			r == itm->row() && c == colfirst;
+		if ( !goon )
+		    continue;
+		rowp = rowPos( itm->row() );
+		rowh = 0;
+		int i;
+		for ( i = 0; i < itm->rowSpan(); ++i )
+		    rowh += rowHeight( i + itm->row() );
+		colp = columnPos( itm->col() );
+		colw = 0;
+		for ( i = 0; i < itm->colSpan(); ++i )
+		    colw += columnWidth( i + itm->col() );
+	    }
+
+	    // Translate painter and draw the cell
+	    p->translate( colp, rowp );
+	    bool selected = isSelected( r, c );
+	    if ( focusStl != FollowStyle && selected && !currentInSelection &&
+		 r == curRow && c == curCol  )
+		selected = FALSE;
+	    paintCell( p, r, c, QRect( colp, rowp, colw, rowh ), selected );
+	    p->translate( -colp, -rowp );
+
+	    rowp = oldrp;
+	    rowh = oldrh;
+
+	    QWidget *w = cellWidget( r, c );
+	    QRect cg( cellGeometry( r, c ) );
+	    if ( w && w->geometry() != QRect( contentsToViewport( cg.topLeft() ), cg.size() - QSize( 1, 1 ) ) ) {
+		moveChild( w, colp, rowp );
+		w->resize( cg.size() - QSize( 1, 1 ) );
+	    }
+	}
+    }
+    d->lastVisCol = collast;
+    d->lastVisRow = rowlast;
+
+    // draw indication of current cell
+    QRect focusRect = cellGeometry( curRow, curCol );
+    p->translate( focusRect.x(), focusRect.y() );
+    paintFocus( p, focusRect );
+    p->translate( -focusRect.x(), -focusRect.y() );
+
+    // Paint empty rects
+    paintEmptyArea( p, cx, cy, cw, ch );
+
+    drawActiveSelection = TRUE;
+}
+
+/*!
+    \reimp
+
+    (Implemented to get rid of a compiler warning.)
+*/
+
+void QTable::drawContents( QPainter * )
+{
+}
+
+/*!
+    Returns the geometry of cell \a row, \a col in the cell's
+    coordinate system. This is a convenience function useful in
+    paintCell(). It is equivalent to QRect( QPoint(0,0), cellGeometry(
+    row, col).size() );
+
+    \sa cellGeometry()
+*/
+
+QRect QTable::cellRect( int row, int col ) const
+{
+    return QRect( QPoint(0,0), cellGeometry( row, col ).size() );
+}
+
+/*!
+    \overload
+
+    Use the other paintCell() function. This function is only included
+    for backwards compatibilty.
+*/
+
+void QTable::paintCell( QPainter* p, int row, int col,
+			const QRect &cr, bool selected )
+{
+    if ( cr.width() == 0 || cr.height() == 0 )
+	return;
+#if defined(Q_WS_WIN)
+    const QColorGroup &cg = ( !drawActiveSelection && style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus ) ? palette().inactive() : colorGroup() );
+#else
+    const QColorGroup &cg = colorGroup();
+#endif
+
+    QTableItem *itm = item( row, col );
+    QColorGroup cg2( cg );
+    if ( itm && !itm->isEnabled() )
+	cg2 = palette().disabled();
+
+    paintCell( p, row, col, cr, selected, cg2 );
+}
+
+/*!
+    Paints the cell at \a row, \a col on the painter \a p. The painter
+    has already been translated to the cell's origin. \a cr describes
+    the cell coordinates in the content coordinate system.
+
+    If \a selected is TRUE the cell is highlighted.
+
+    \a cg is the colorgroup which should be used to draw the cell
+    content.
+
+    If you want to draw custom cell content, for example right-aligned
+    text, you must either reimplement paintCell(), or subclass
+    QTableItem and reimplement QTableItem::paint() to do the custom
+    drawing.
+
+    If you're using a QTableItem subclass, for example, to store a
+    data structure, then reimplementing QTableItem::paint() may be the
+    best approach. For data you want to draw immediately, e.g. data
+    retrieved from a database, it is probably best to reimplement
+    paintCell(). Note that if you reimplement paintCell(), i.e. don't
+    use \l{QTableItem}s, you must reimplement other functions: see the
+    notes on large tables.
+
+    Note that the painter is not clipped by default in order to get
+    maximum efficiency. If you want clipping, use code like this:
+
+    \code
+    p->setClipRect( cellRect(row, col), QPainter::CoordPainter );
+    //... your drawing code
+    p->setClipping( FALSE );
+    \endcode
+*/
+
+void QTable::paintCell( QPainter *p, int row, int col,
+			const QRect &cr, bool selected, const QColorGroup &cg )
+{
+    if ( focusStl == SpreadSheet && selected &&
+	 row == curRow &&
+	 col == curCol && ( hasFocus() || viewport()->hasFocus() ) )
+	selected = FALSE;
+
+    int w = cr.width();
+    int h = cr.height();
+    int x2 = w - 1;
+    int y2 = h - 1;
+
+
+    QTableItem *itm = item( row, col );
+    if ( itm ) {
+	p->save();
+	itm->paint( p, cg, cr, selected );
+	p->restore();
+    } else {
+	p->fillRect( 0, 0, w, h, selected ? cg.brush( QColorGroup::Highlight ) : cg.brush( QColorGroup::Base ) );
+    }
+
+    if ( sGrid ) {
+	// Draw our lines
+	QPen pen( p->pen() );
+	p->setPen( (QRgb) style().styleHint( QStyle::SH_Table_GridLineColor, this ) );
+	p->drawLine( x2, 0, x2, y2 );
+	p->drawLine( 0, y2, x2, y2 );
+	p->setPen( pen );
+    }
+}
+
+/*!
+    Draws the focus rectangle of the current cell (see currentRow(),
+    currentColumn()).
+
+    The painter \a p is already translated to the cell's origin, while
+    \a cr specifies the cell's geometry in content coordinates.
+*/
+
+void QTable::paintFocus( QPainter *p, const QRect &cr )
+{
+    if ( !hasFocus() && !viewport()->hasFocus() )
+	return;
+    QRect focusRect( 0, 0, cr.width(), cr.height() );
+    if ( focusStyle() == SpreadSheet ) {
+	p->setPen( QPen( black, 1 ) );
+	p->setBrush( NoBrush );
+	p->drawRect( focusRect.x(), focusRect.y(), focusRect.width() - 1, focusRect.height() - 1 );
+	p->drawRect( focusRect.x() - 1, focusRect.y() - 1, focusRect.width() + 1, focusRect.height() + 1 );
+    } else {
+	QColor c = isSelected( curRow, curCol, FALSE ) ?
+			     colorGroup().highlight() : colorGroup().base();
+	style().drawPrimitive( QStyle::PE_FocusRect, p, focusRect, colorGroup(),
+			       ( isSelected( curRow, curCol, FALSE ) ?
+				 QStyle::Style_FocusAtBorder :
+				 QStyle::Style_Default ),
+			         QStyleOption(c) );
+    }
+}
+
+/*!
+    This function fills the \a cw pixels wide and \a ch pixels high
+    rectangle starting at position \a cx, \a cy with the background
+    color using the painter \a p.
+
+    paintEmptyArea() is invoked by drawContents() to erase or fill
+    unused areas.
+*/
+
+void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch )
+{
+    // Regions work with shorts, so avoid an overflow and adjust the
+    // table size to the visible size
+    QSize ts( tableSize() );
+    ts.setWidth( QMIN( ts.width(), visibleWidth() ) );
+    ts.setHeight( QMIN( ts.height(), visibleHeight() ) );
+
+    // Region of the rect we should draw, calculated in viewport
+    // coordinates, as a region can't handle bigger coordinates
+    contentsToViewport2( cx, cy, cx, cy );
+    QRegion reg( QRect( cx, cy, cw, ch ) );
+
+    // Subtract the table from it
+    reg = reg.subtract( QRect( QPoint( 0, 0 ), ts ) );
+
+    // And draw the rectangles (transformed inc contents coordinates as needed)
+    QMemArray<QRect> r = reg.rects();
+    for ( int i = 0; i < (int)r.count(); ++i )
+	p->fillRect( QRect(viewportToContents2(r[i].topLeft()),r[i].size()), viewport()->backgroundBrush() );
+}
+
+/*!
+    Returns the QTableItem representing the contents of the cell at \a
+    row, \a col.
+
+    If \a row or \a col are out of range or no content has been set
+    for this cell, item() returns 0.
+
+    If you don't use \l{QTableItem}s you may need to reimplement this
+    function: see the notes on large tables.
+
+    \sa setItem()
+*/
+
+QTableItem *QTable::item( int row, int col ) const
+{
+    if ( row < 0 || col < 0 || row > numRows() - 1 ||
+	 col > numCols() - 1 || row * col >= (int)contents.size() )
+	return 0;
+
+    return contents[ indexOf( row, col ) ];	// contents array lookup
+}
+
+/*!
+    Inserts the table item \a item into the table at row \a row,
+    column \a col, and repaints the cell. If a table item already
+    exists in this cell it is deleted and replaced with \a item. The
+    table takes ownership of the table item.
+
+    If you don't use \l{QTableItem}s you may need to reimplement this
+    function: see the notes on large tables.
+
+    \sa item() takeItem()
+*/
+
+void QTable::setItem( int row, int col, QTableItem *item )
+{
+    if ( !item )
+	return;
+
+    if ( (int)contents.size() != numRows() * numCols() )
+	resizeData( numRows() * numCols() );
+
+    int orow = item->row();
+    int ocol = item->col();
+    clearCell( row, col );
+
+    contents.insert( indexOf( row, col ), item );
+    item->setRow( row );
+    item->setCol( col );
+    item->t = this;
+    updateCell( row, col );
+    if ( qt_update_cell_widget )
+	item->updateEditor( orow, ocol );
+
+    if ( row == curRow && col == curCol && item->editType() == QTableItem::WhenCurrent ) {
+	if ( beginEdit( row, col, FALSE ) )
+	    setEditMode( Editing, row, col );
+    }
+}
+
+/*!
+    Removes the QTableItem at \a row, \a col.
+
+    If you don't use \l{QTableItem}s you may need to reimplement this
+    function: see the notes on large tables.
+*/
+
+void QTable::clearCell( int row, int col )
+{
+    if ( (int)contents.size() != numRows() * numCols() )
+	resizeData( numRows() * numCols() );
+    clearCellWidget( row, col );
+    contents.setAutoDelete( TRUE );
+    contents.remove( indexOf( row, col ) );
+    contents.setAutoDelete( FALSE );
+}
+
+/*!
+    Sets the text in the cell at \a row, \a col to \a text.
+
+    If the cell does not contain a table item a QTableItem is created
+    with an \link QTableItem::EditType EditType\endlink of \c OnTyping,
+    otherwise the existing table item's text (if any) is replaced with
+    \a text.
+
+    \sa text() setPixmap() setItem() QTableItem::setText()
+*/
+
+void QTable::setText( int row, int col, const QString &text )
+{
+    QTableItem *itm = item( row, col );
+    if ( itm ) {
+	itm->setText( text );
+	itm->updateEditor( row, col );
+	updateCell( row, col );
+    } else {
+	QTableItem *i = new QTableItem( this, QTableItem::OnTyping,
+					text, QPixmap() );
+	setItem( row, col, i );
+    }
+}
+
+/*!
+    Sets the pixmap in the cell at \a row, \a col to \a pix.
+
+    If the cell does not contain a table item a QTableItem is created
+    with an \link QTableItem::EditType EditType\endlink of \c OnTyping,
+    otherwise the existing table item's pixmap (if any) is replaced
+    with \a pix.
+
+    Note that \l{QComboTableItem}s and \l{QCheckTableItem}s don't show
+    pixmaps.
+
+    \sa pixmap() setText() setItem() QTableItem::setPixmap()
+*/
+
+void QTable::setPixmap( int row, int col, const QPixmap &pix )
+{
+    QTableItem *itm = item( row, col );
+    if ( itm ) {
+	itm->setPixmap( pix );
+	updateCell( row, col );
+    } else {
+	QTableItem *i = new QTableItem( this, QTableItem::OnTyping,
+					QString::null, pix );
+	setItem( row, col, i );
+    }
+}
+
+/*!
+    Returns the text in the cell at \a row, \a col, or QString::null
+    if the relevant item does not exist or has no text.
+
+    \sa setText() setPixmap()
+*/
+
+QString QTable::text( int row, int col ) const
+{
+    QTableItem *itm = item( row, col );
+    if ( itm )
+	return itm->text();
+    return QString::null;
+}
+
+/*!
+    Returns the pixmap set for the cell at \a row, \a col, or a
+    null-pixmap if the cell contains no pixmap.
+
+    \sa setPixmap()
+*/
+
+QPixmap QTable::pixmap( int row, int col ) const
+{
+    QTableItem *itm = item( row, col );
+    if ( itm )
+	return itm->pixmap();
+    return QPixmap();
+}
+
+/*!
+    Moves the focus to the cell at \a row, \a col.
+
+    \sa currentRow() currentColumn()
+*/
+
+void QTable::setCurrentCell( int row, int col )
+{
+    setCurrentCell( row, col, TRUE, TRUE );
+}
+
+// need to use a define, as leftMargin() is protected
+#define VERTICALMARGIN \
+( QApplication::reverseLayout() ? \
+       rightMargin() \
+       : \
+       leftMargin() \
+)
+
+/*! \internal */
+
+void QTable::setCurrentCell( int row, int col, bool updateSelections, bool ensureVisible )
+{
+    QTableItem *oldItem = item( curRow, curCol );
+
+    if ( row > numRows() - 1 )
+	row = numRows() - 1;
+    if ( col > numCols() - 1 )
+	col = numCols() - 1;
+
+    if ( curRow == row && curCol == col )
+	return;
+
+
+    QTableItem *itm = oldItem;
+    if ( itm && itm->editType() != QTableItem::Always && itm->editType() != QTableItem::Never )
+	endEdit( curRow, curCol, TRUE, FALSE );
+    int oldRow = curRow;
+    int oldCol = curCol;
+    curRow = row;
+    curCol = col;
+    repaintCell( oldRow, oldCol );
+    repaintCell( curRow, curCol );
+    if ( ensureVisible )
+        ensureCellVisible( curRow, curCol );
+    emit currentChanged( row, col );
+
+    if ( oldCol != curCol ) {
+	if ( !isColumnSelected( oldCol ) )
+	    topHeader->setSectionState( oldCol, QTableHeader::Normal );
+	else if ( isRowSelection( selectionMode() ) )
+	    topHeader->setSectionState( oldCol, QTableHeader::Selected );
+	topHeader->setSectionState( curCol, isColumnSelected( curCol, TRUE ) ?
+				    QTableHeader::Selected : QTableHeader::Bold );
+    }
+
+    if ( oldRow != curRow ) {
+	if ( !isRowSelected( oldRow ) )
+	    leftHeader->setSectionState( oldRow, QTableHeader::Normal );
+	leftHeader->setSectionState( curRow, isRowSelected( curRow, TRUE ) ?
+				     QTableHeader::Selected : QTableHeader::Bold );
+    }
+
+    itm = item( curRow, curCol );
+
+    QPoint cellPos( columnPos( curCol ) + leftMargin() - contentsX(),
+		    rowPos( curRow ) + topMargin() - contentsY() );
+    setMicroFocusHint( cellPos.x(), cellPos.y(), columnWidth( curCol ),
+		       rowHeight( curRow ), ( itm && itm->editType() != QTableItem::Never ) );
+
+    if ( cellWidget( oldRow, oldCol ) &&
+	 cellWidget( oldRow, oldCol )->hasFocus() )
+	viewport()->setFocus();
+
+    if ( itm && itm->editType() == QTableItem::WhenCurrent ) {
+	if ( beginEdit( curRow, curCol, FALSE ) )
+	    setEditMode( Editing, row, col );
+    } else if ( itm && itm->editType() == QTableItem::Always ) {
+	if ( cellWidget( itm->row(), itm->col() ) )
+	    cellWidget( itm->row(), itm->col() )->setFocus();
+    }
+
+    if ( updateSelections && isRowSelection( selectionMode() ) &&
+	 !isSelected( curRow, curCol, FALSE ) ) {
+	if ( selectionMode() == QTable::SingleRow )
+	    clearSelection();
+	currentSel = new QTableSelection();
+	selections.append( currentSel );
+	currentSel->init( curRow, 0 );
+	currentSel->expandTo( curRow, numCols() - 1 );
+	repaintSelections( 0, currentSel );
+    }
+}
+
+/*!
+    Scrolls the table until the cell at \a row, \a col becomes
+    visible.
+*/
+
+void QTable::ensureCellVisible( int row, int col )
+{
+    if ( !isUpdatesEnabled() || !viewport()->isUpdatesEnabled() )
+	return;
+    int cw = columnWidth( col );
+    int rh = rowHeight( row );
+    if ( cw < visibleWidth() )
+	ensureVisible( columnPos( col ) + cw / 2, rowPos( row ) + rh / 2, cw / 2, rh / 2 );
+    else
+	ensureVisible( columnPos( col ), rowPos( row ) + rh / 2, 0, rh / 2 );
+}
+
+/*!
+    Returns TRUE if the cell at \a row, \a col is selected; otherwise
+    returns FALSE.
+
+    \sa isRowSelected() isColumnSelected()
+*/
+
+bool QTable::isSelected( int row, int col ) const
+{
+    return isSelected( row, col, TRUE );
+}
+
+/*! \internal */
+
+bool QTable::isSelected( int row, int col, bool includeCurrent ) const
+{
+    QPtrListIterator<QTableSelection> it( selections );
+    QTableSelection *s;
+    while ( ( s = it.current() ) != 0 ) {
+	++it;
+	if ( s->isActive() &&
+	     row >= s->topRow() &&
+	     row <= s->bottomRow() &&
+	     col >= s->leftCol() &&
+	     col <= s->rightCol() )
+	    return TRUE;
+	if ( includeCurrent && row == currentRow() && col == currentColumn() )
+	    return TRUE;
+    }
+    return FALSE;
+}
+
+/*!
+    Returns TRUE if row \a row is selected; otherwise returns FALSE.
+
+    If \a full is FALSE (the default), 'row is selected' means that at
+    least one cell in the row is selected. If \a full is TRUE, then 'row
+    is selected' means every cell in the row is selected.
+
+    \sa isColumnSelected() isSelected()
+*/
+
+bool QTable::isRowSelected( int row, bool full ) const
+{
+    if ( !full ) {
+	QPtrListIterator<QTableSelection> it( selections );
+	QTableSelection *s;
+	while ( ( s = it.current() ) != 0 ) {
+	    ++it;
+	    if ( s->isActive() &&
+		 row >= s->topRow() &&
+		 row <= s->bottomRow() )
+	    return TRUE;
+	if ( row == currentRow() )
+	    return TRUE;
+	}
+    } else {
+	QPtrListIterator<QTableSelection> it( selections );
+	QTableSelection *s;
+	while ( ( s = it.current() ) != 0 ) {
+	    ++it;
+	    if ( s->isActive() &&
+		 row >= s->topRow() &&
+		 row <= s->bottomRow() &&
+		 s->leftCol() == 0 &&
+		 s->rightCol() == numCols() - 1 )
+		return TRUE;
+	}
+    }
+    return FALSE;
+}
+
+/*!
+    Returns TRUE if column \a col is selected; otherwise returns FALSE.
+
+    If \a full is FALSE (the default), 'column is selected' means that
+    at least one cell in the column is selected. If \a full is TRUE,
+    then 'column is selected' means every cell in the column is
+    selected.
+
+    \sa isRowSelected() isSelected()
+*/
+
+bool QTable::isColumnSelected( int col, bool full ) const
+{
+    if ( !full ) {
+	QPtrListIterator<QTableSelection> it( selections );
+	QTableSelection *s;
+	while ( ( s = it.current() ) != 0 ) {
+	    ++it;
+	    if ( s->isActive() &&
+		 col >= s->leftCol() &&
+		 col <= s->rightCol() )
+	    return TRUE;
+	if ( col == currentColumn() )
+	    return TRUE;
+	}
+    } else {
+	QPtrListIterator<QTableSelection> it( selections );
+	QTableSelection *s;
+	while ( ( s = it.current() ) != 0 ) {
+	    ++it;
+	    if ( s->isActive() &&
+		 col >= s->leftCol() &&
+		 col <= s->rightCol() &&
+		 s->topRow() == 0 &&
+		 s->bottomRow() == numRows() - 1 )
+		return TRUE;
+	}
+    }
+    return FALSE;
+}
+
+/*!
+    \property QTable::numSelections
+    \brief The number of selections.
+
+    \sa currentSelection()
+*/
+
+int QTable::numSelections() const
+{
+    return selections.count();
+}
+
+/*!
+    Returns selection number \a num, or an inactive QTableSelection if \a
+    num is out of range (see QTableSelection::isActive()).
+*/
+
+QTableSelection QTable::selection( int num ) const
+{
+    if ( num < 0 || num >= (int)selections.count() )
+	return QTableSelection();
+
+    QTableSelection *s = ( (QTable*)this )->selections.at( num );
+    return *s;
+}
+
+/*!
+    Adds a selection described by \a s to the table and returns its
+    number or -1 if the selection is invalid.
+
+    Remember to call QTableSelection::init() and
+    QTableSelection::expandTo() to make the selection valid (see also
+    QTableSelection::isActive(), or use the
+    QTableSelection(int,int,int,int) constructor).
+
+    \sa numSelections() removeSelection() clearSelection()
+*/
+
+int QTable::addSelection( const QTableSelection &s )
+{
+    if ( !s.isActive() )
+	return -1;
+
+    const int maxr = numRows()-1;
+    const int maxc = numCols()-1;
+    QTableSelection *sel = new QTableSelection( QMIN(s.anchorRow(), maxr), QMIN(s.anchorCol(), maxc),
+				    QMIN(s.bottomRow(), maxr), QMIN(s.rightCol(), maxc) );
+
+    selections.append( sel );
+
+    repaintSelections( 0, sel, TRUE, TRUE );
+
+    emit selectionChanged();
+
+    return selections.count() - 1;
+}
+
+/*!
+    If the table has a selection, \a s, this selection is removed from
+    the table.
+
+    \sa addSelection() numSelections()
+*/
+
+void QTable::removeSelection( const QTableSelection &s )
+{
+    selections.setAutoDelete( FALSE );
+    for ( QTableSelection *sel = selections.first(); sel; sel = selections.next() ) {
+	if ( s == *sel ) {
+	    selections.removeRef( sel );
+	    repaintSelections( sel, 0, TRUE, TRUE );
+	    if ( sel == currentSel )
+		currentSel = 0;
+	    delete sel;
+	}
+    }
+    selections.setAutoDelete( TRUE );
+    emit selectionChanged();
+}
+
+/*!
+    \overload
+
+    Removes selection number \a num from the table.
+
+    \sa numSelections() addSelection() clearSelection()
+*/
+
+void QTable::removeSelection( int num )
+{
+    if ( num < 0 || num >= (int)selections.count() )
+	return;
+
+    QTableSelection *s = selections.at( num );
+    if ( s == currentSel )
+	currentSel = 0;
+    selections.removeRef( s );
+    repaintContents( FALSE );
+}
+
+/*!
+    Returns the number of the current selection or -1 if there is no
+    current selection.
+
+    \sa numSelections()
+*/
+
+int QTable::currentSelection() const
+{
+    if ( !currentSel )
+	return -1;
+    return ( (QTable*)this )->selections.findRef( currentSel );
+}
+
+/*! Selects the range starting at \a start_row and \a start_col and
+  ending at \a end_row and \a end_col.
+
+  \sa QTableSelection
+*/
+
+void QTable::selectCells( int start_row, int start_col, int end_row, int end_col )
+{
+    const int maxr = numRows()-1;
+    const int maxc = numCols()-1;
+
+    start_row = QMIN( maxr, QMAX( 0, start_row ) );
+    start_col = QMIN( maxc, QMAX( 0, start_col ) );
+    end_row = QMIN( maxr, end_row );
+    end_col = QMIN( maxc, end_col );
+    QTableSelection sel( start_row, start_col, end_row, end_col );
+    addSelection( sel );
+}
+
+/*! Selects the row \a row.
+
+  \sa QTableSelection
+*/
+
+// ### Make this virtual in 4.0 and remove hack for QDataTable
+void QTable::selectRow( int row )
+{
+    row = QMIN(numRows()-1, row);
+    if ( row < 0 )
+	return;
+    bool isDataTable = FALSE;
+#ifndef QT_NO_SQL
+    isDataTable = ::qt_cast<QDataTable*>(this) != 0;
+#endif
+    if ( isDataTable || selectionMode() == SingleRow ) {
+	setCurrentCell( row, currentColumn() );
+    } else {
+	QTableSelection sel( row, 0, row, numCols() - 1 );
+	addSelection( sel );
+    }
+}
+
+/*! Selects the column \a col.
+
+  \sa QTableSelection
+*/
+
+// ### Make this virtual in 4.0
+void QTable::selectColumn( int col )
+{
+    col = QMIN(numCols()-1, col);
+    QTableSelection sel( 0, col, numRows() - 1, col );
+    addSelection( sel );
+}
+
+/*! \reimp
+*/
+void QTable::contentsMousePressEvent( QMouseEvent* e )
+{
+    contentsMousePressEventEx( e );
+}
+
+void QTable::contentsMousePressEventEx( QMouseEvent* e )
+{
+    shouldClearSelection = FALSE;
+    if ( isEditing() ) {
+	if ( !cellGeometry( editRow, editCol ).contains( e->pos() ) ) {
+	    endEdit( editRow, editCol, TRUE, edMode != Editing );
+	} else {
+	    e->ignore();
+	    return;
+	}
+    }
+
+    d->redirectMouseEvent = FALSE;
+
+    int tmpRow = rowAt( e->pos().y() );
+    int tmpCol = columnAt( e->pos().x() );
+    pressedRow = tmpRow;
+    pressedCol = tmpCol;
+    fixRow( tmpRow, e->pos().y() );
+    fixCol( tmpCol, e->pos().x() );
+    startDragCol = -1;
+    startDragRow = -1;
+
+    if ( isSelected( tmpRow, tmpCol ) ) {
+	startDragCol = tmpCol;
+	startDragRow = tmpRow;
+	dragStartPos = e->pos();
+    }
+
+    QTableItem *itm = item( pressedRow, pressedCol );
+    if ( itm && !itm->isEnabled() ) {
+	emit pressed( tmpRow, tmpCol, e->button(), e->pos() );
+	return;
+    }
+
+    if ( ( e->state() & ShiftButton ) == ShiftButton ) {
+  	int oldRow = curRow;
+  	int oldCol = curCol;
+	setCurrentCell( tmpRow, tmpCol, selMode == SingleRow, TRUE );
+	if ( selMode != NoSelection && selMode != SingleRow ) {
+	    if ( !currentSel ) {
+		currentSel = new QTableSelection();
+		selections.append( currentSel );
+		if ( !isRowSelection( selectionMode() ) )
+		    currentSel->init( oldRow, oldCol );
+		else
+		    currentSel->init( oldRow, 0 );
+	    }
+	    QTableSelection oldSelection = *currentSel;
+	    if ( !isRowSelection( selectionMode() ) )
+		currentSel->expandTo( tmpRow, tmpCol );
+	    else
+		currentSel->expandTo( tmpRow, numCols() - 1 );
+	    repaintSelections( &oldSelection, currentSel );
+	    emit selectionChanged();
+	}
+    } else if ( ( e->state() & ControlButton ) == ControlButton ) {
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+	if ( selMode != NoSelection ) {
+	    if ( selMode == Single || selMode == SingleRow && !isSelected( tmpRow, tmpCol, FALSE ) )
+		clearSelection();
+	    if ( !(selMode == SingleRow && isSelected( tmpRow, tmpCol, FALSE )) ) {
+		currentSel = new QTableSelection();
+		selections.append( currentSel );
+		if ( !isRowSelection( selectionMode() ) ) {
+		    currentSel->init( tmpRow, tmpCol );
+		    currentSel->expandTo( tmpRow, tmpCol );
+		} else {
+		    currentSel->init( tmpRow, 0 );
+		    currentSel->expandTo( tmpRow, numCols() - 1 );
+		    repaintSelections( 0, currentSel );
+		}
+		emit selectionChanged();
+	    }
+	}
+    } else {
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+	QTableItem *itm = item( tmpRow, tmpCol );
+	if ( itm && itm->editType() == QTableItem::WhenCurrent ) {
+	    QWidget *w = cellWidget( tmpRow, tmpCol );
+	    if ( ::qt_cast<QComboBox*>(w) || ::qt_cast<QButton*>(w) ) {
+		QMouseEvent ev( e->type(), w->mapFromGlobal( e->globalPos() ),
+				e->globalPos(), e->button(), e->state() );
+		QApplication::sendPostedEvents( w, 0 );
+		QApplication::sendEvent( w, &ev );
+		d->redirectMouseEvent = TRUE;
+	    }
+	}
+	if ( isSelected( tmpRow, tmpCol, FALSE ) ) {
+	    shouldClearSelection = TRUE;
+	} else {
+	    bool b = signalsBlocked();
+	    if ( selMode != NoSelection )
+		blockSignals( TRUE );
+	    clearSelection();
+	    blockSignals( b );
+	    if ( selMode != NoSelection ) {
+		currentSel = new QTableSelection();
+		selections.append( currentSel );
+		if ( !isRowSelection( selectionMode() ) ) {
+		    currentSel->init( tmpRow, tmpCol );
+		    currentSel->expandTo( tmpRow, tmpCol );
+		} else {
+		    currentSel->init( tmpRow, 0 );
+		    currentSel->expandTo( tmpRow, numCols() - 1 );
+		    repaintSelections( 0, currentSel );
+		}
+		emit selectionChanged();
+	    }
+	}
+    }
+
+    emit pressed( tmpRow, tmpCol, e->button(), e->pos() );
+}
+
+/*! \reimp
+*/
+
+void QTable::contentsMouseDoubleClickEvent( QMouseEvent *e )
+{
+    if ( e->button() != LeftButton )
+	return;
+    if ( !isRowSelection( selectionMode() ) )
+	clearSelection();
+    int tmpRow = rowAt( e->pos().y() );
+    int tmpCol = columnAt( e->pos().x() );
+    QTableItem *itm = item( tmpRow, tmpCol );
+    if ( itm && !itm->isEnabled() )
+	return;
+    if ( tmpRow != -1 && tmpCol != -1 ) {
+	if ( beginEdit( tmpRow, tmpCol, FALSE ) )
+	    setEditMode( Editing, tmpRow, tmpCol );
+    }
+
+    emit doubleClicked( tmpRow, tmpCol, e->button(), e->pos() );
+}
+
+/*!
+    Sets the current edit mode to \a mode, the current edit row to \a
+    row and the current edit column to \a col.
+
+    \sa EditMode
+*/
+
+void QTable::setEditMode( EditMode mode, int row, int col )
+{
+    edMode = mode;
+    editRow = row;
+    editCol = col;
+}
+
+
+/*! \reimp
+*/
+
+void QTable::contentsMouseMoveEvent( QMouseEvent *e )
+{
+    if ( (e->state() & MouseButtonMask) == NoButton )
+	return;
+    int tmpRow = rowAt( e->pos().y() );
+    int tmpCol = columnAt( e->pos().x() );
+    fixRow( tmpRow, e->pos().y() );
+    fixCol( tmpCol, e->pos().x() );
+
+#ifndef QT_NO_DRAGANDDROP
+    if ( dragEnabled() && startDragRow != -1 && startDragCol != -1 ) {
+	if (QPoint(dragStartPos - e->pos()).manhattanLength() > QApplication::startDragDistance())
+	    startDrag();
+	return;
+    }
+#endif
+    if ( selectionMode() == MultiRow && ( e->state() & ControlButton ) == ControlButton )
+	shouldClearSelection = FALSE;
+
+    if ( shouldClearSelection ) {
+	clearSelection();
+	if ( selMode != NoSelection ) {
+	    currentSel = new QTableSelection();
+	    selections.append( currentSel );
+	    if ( !isRowSelection( selectionMode() ) )
+		currentSel->init( tmpRow, tmpCol );
+	    else
+		currentSel->init( tmpRow, 0 );
+	    emit selectionChanged();
+	}
+	shouldClearSelection = FALSE;
+    }
+
+    QPoint pos = mapFromGlobal( e->globalPos() );
+    pos -= QPoint( leftHeader->width(), topHeader->height() );
+    autoScrollTimer->stop();
+    doAutoScroll();
+    if ( pos.x() < 0 || pos.x() > visibleWidth() || pos.y() < 0 || pos.y() > visibleHeight() )
+	autoScrollTimer->start( 100, TRUE );
+}
+
+/*! \internal
+ */
+
+void QTable::doValueChanged()
+{
+    emit valueChanged( editRow, editCol );
+}
+
+/*! \internal
+*/
+
+void QTable::doAutoScroll()
+{
+    QPoint pos = QCursor::pos();
+    pos = mapFromGlobal( pos );
+    pos -= QPoint( leftHeader->width(), topHeader->height() );
+
+    int tmpRow = curRow;
+    int tmpCol = curCol;
+    if ( pos.y() < 0 )
+	tmpRow--;
+    else if ( pos.y() > visibleHeight() )
+	tmpRow++;
+    if ( pos.x() < 0 )
+	tmpCol--;
+    else if ( pos.x() > visibleWidth() )
+	tmpCol++;
+
+    pos += QPoint( contentsX(), contentsY() );
+    if ( tmpRow == curRow )
+	tmpRow = rowAt( pos.y() );
+    if ( tmpCol == curCol )
+	tmpCol = columnAt( pos.x() );
+    pos -= QPoint( contentsX(), contentsY() );
+
+    fixRow( tmpRow, pos.y() );
+    fixCol( tmpCol, pos.x() );
+
+    if ( tmpRow < 0 || tmpRow > numRows() - 1 )
+	tmpRow = currentRow();
+    if ( tmpCol < 0 || tmpCol > numCols() - 1 )
+	tmpCol = currentColumn();
+
+    ensureCellVisible( tmpRow, tmpCol );
+
+    if ( currentSel && selMode != NoSelection ) {
+	QTableSelection oldSelection = *currentSel;
+	bool useOld = TRUE;
+	if ( selMode != SingleRow ) {
+	    if ( !isRowSelection( selectionMode() ) ) {
+		currentSel->expandTo( tmpRow, tmpCol );
+	    } else {
+		currentSel->expandTo( tmpRow, numCols() - 1 );
+	    }
+	} else {
+	    bool currentInSelection = tmpRow == curRow && isSelected( tmpRow, tmpCol );
+	    if ( !currentInSelection ) {
+		useOld = FALSE;
+		clearSelection();
+		currentSel = new QTableSelection();
+		selections.append( currentSel );
+		currentSel->init( tmpRow, 0 );
+		currentSel->expandTo( tmpRow, numCols() - 1 );
+		repaintSelections( 0, currentSel );
+	    } else {
+		currentSel->expandTo( tmpRow, numCols() - 1 );
+	    }
+	}
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+	repaintSelections( useOld ? &oldSelection : 0, currentSel );
+	if ( currentSel && oldSelection != *currentSel )
+	    emit selectionChanged();
+    } else {
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+    }
+
+    if ( pos.x() < 0 || pos.x() > visibleWidth() || pos.y() < 0 || pos.y() > visibleHeight() )
+	autoScrollTimer->start( 100, TRUE );
+}
+
+/*! \reimp
+*/
+
+void QTable::contentsMouseReleaseEvent( QMouseEvent *e )
+{
+    if ( pressedRow == curRow && pressedCol == curCol )
+	emit clicked( curRow, curCol, e->button(), e->pos() );
+
+    if ( e->button() != LeftButton )
+	return;
+    if ( shouldClearSelection ) {
+	int tmpRow = rowAt( e->pos().y() );
+	int tmpCol = columnAt( e->pos().x() );
+	fixRow( tmpRow, e->pos().y() );
+	fixCol( tmpCol, e->pos().x() );
+	clearSelection();
+	if ( selMode != NoSelection ) {
+	    currentSel = new QTableSelection();
+	    selections.append( currentSel );
+	    if ( !isRowSelection( selectionMode() ) ) {
+		currentSel->init( tmpRow, tmpCol );
+	    } else {
+		currentSel->init( tmpRow, 0 );
+		currentSel->expandTo( tmpRow, numCols() - 1 );
+		repaintSelections( 0, currentSel );
+	    }
+	    emit selectionChanged();
+	}
+	shouldClearSelection = FALSE;
+    }
+    autoScrollTimer->stop();
+
+    if ( d->redirectMouseEvent && pressedRow == curRow && pressedCol == curCol &&
+	 item( pressedRow, pressedCol ) && item( pressedRow, pressedCol )->editType() ==
+	 QTableItem::WhenCurrent ) {
+	QWidget *w = cellWidget( pressedRow, pressedCol );
+	if ( w ) {
+	    QMouseEvent ev( e->type(), w->mapFromGlobal( e->globalPos() ),
+			    e->globalPos(), e->button(), e->state() );
+	    QApplication::sendPostedEvents( w, 0 );
+	    QApplication::sendEvent( w, &ev );
+	}
+    }
+}
+
+/*!
+  \reimp
+*/
+
+void QTable::contentsContextMenuEvent( QContextMenuEvent *e )
+{
+    if ( !receivers( SIGNAL(contextMenuRequested(int,int,const QPoint&)) ) ) {
+	e->ignore();
+	return;
+    }
+    if ( e->reason() == QContextMenuEvent::Keyboard ) {
+	QRect r = cellGeometry( curRow, curCol );
+	emit contextMenuRequested( curRow, curCol, viewport()->mapToGlobal( contentsToViewport( r.center() ) ) );
+    } else {
+	int tmpRow = rowAt( e->pos().y() );
+	int tmpCol = columnAt( e->pos().x() );
+	emit contextMenuRequested( tmpRow, tmpCol, e->globalPos() );
+    }
+}
+
+
+/*! \reimp
+*/
+
+bool QTable::eventFilter( QObject *o, QEvent *e )
+{
+    QWidget *editorWidget = cellWidget( editRow, editCol );
+    switch ( e->type() ) {
+    case QEvent::KeyPress: {
+	QTableItem *itm = item( curRow, curCol );
+
+	if ( isEditing() && editorWidget && o == editorWidget ) {
+	    itm = item( editRow, editCol );
+	    QKeyEvent *ke = (QKeyEvent*)e;
+	    if ( ke->key() == Key_Escape ) {
+		if ( !itm || itm->editType() == QTableItem::OnTyping )
+		    endEdit( editRow, editCol, FALSE, edMode != Editing );
+		return TRUE;
+	    }
+
+	    if ( ( ke->state() == NoButton || ke->state() == Keypad )
+		&& ( ke->key() == Key_Return || ke->key() == Key_Enter ) ) {
+		if ( !itm || itm->editType() == QTableItem::OnTyping )
+		    endEdit( editRow, editCol, TRUE, edMode != Editing );
+		activateNextCell();
+		return TRUE;
+	    }
+
+	    if ( ke->key() == Key_Tab || ke->key() == Key_BackTab ) {
+		if ( ke->state() & Qt::ControlButton )
+		    return FALSE;
+		if ( !itm || itm->editType() == QTableItem::OnTyping )
+		    endEdit( editRow, editCol, TRUE, edMode != Editing );
+		if ( (ke->key() == Key_Tab) && !(ke->state() & ShiftButton) ) {
+		    if ( currentColumn() >= numCols() - 1 )
+			return TRUE;
+		    int cc  = QMIN( numCols() - 1, currentColumn() + 1 );
+		    while ( cc < numCols() ) {
+			QTableItem *i = item( currentRow(), cc );
+			if ( !d->hiddenCols.find( cc ) && !isColumnReadOnly( cc ) && (!i || i->isEnabled()) )
+			    break;
+			++cc;
+		    }
+		    setCurrentCell( currentRow(), cc );
+		} else { // Key_BackTab
+		    if ( currentColumn() == 0 )
+			return TRUE;
+		    int cc  = QMAX( 0, currentColumn() - 1 );
+		    while ( cc >= 0 ) {
+			QTableItem *i = item( currentRow(), cc );
+			if ( !d->hiddenCols.find( cc ) && !isColumnReadOnly( cc ) && (!i || i->isEnabled()) )
+			    break;
+			--cc;
+		    }
+		    setCurrentCell( currentRow(), cc );
+		}
+		itm = item( curRow, curCol );
+		if ( beginEdit( curRow, curCol, FALSE ) )
+		    setEditMode( Editing, curRow, curCol );
+		return TRUE;
+	    }
+
+	    if ( ( edMode == Replacing ||
+		   itm && itm->editType() == QTableItem::WhenCurrent ) &&
+		 ( ke->key() == Key_Up || ke->key() == Key_Prior ||
+		   ke->key() == Key_Home || ke->key() == Key_Down ||
+		   ke->key() == Key_Next || ke->key() == Key_End ||
+		   ke->key() == Key_Left || ke->key() == Key_Right ) ) {
+		if ( !itm || itm->editType() == QTableItem::OnTyping ) {
+		    endEdit( editRow, editCol, TRUE, edMode != Editing );
+		}
+		keyPressEvent( ke );
+		return TRUE;
+	    }
+	} else {
+	    QObjectList *l = viewport()->queryList( "QWidget" );
+	    if ( l && l->find( o ) != -1 ) {
+		QKeyEvent *ke = (QKeyEvent*)e;
+		if ( ( ke->state() & ControlButton ) == ControlButton ||
+		     ( ke->key() != Key_Left && ke->key() != Key_Right &&
+		       ke->key() != Key_Up && ke->key() != Key_Down &&
+		       ke->key() != Key_Prior && ke->key() != Key_Next &&
+		       ke->key() != Key_Home && ke->key() != Key_End ) )
+		    return FALSE;
+		keyPressEvent( (QKeyEvent*)e );
+		return TRUE;
+	    }
+	    delete l;
+	}
+
+	} break;
+    case QEvent::FocusOut:
+	if ( isEditing() && editorWidget && o == editorWidget && ( (QFocusEvent*)e )->reason() != QFocusEvent::Popup ) {
+	    QTableItem *itm = item( editRow, editCol );
+	    if ( !itm || itm->editType() == QTableItem::OnTyping ) {
+		endEdit( editRow, editCol, TRUE, edMode != Editing );
+		return TRUE;
+	    }
+	}
+	break;
+#ifndef QT_NO_WHEELEVENT
+    case QEvent::Wheel:
+	if ( o == this || o == viewport() ) {
+	    QWheelEvent* we = (QWheelEvent*)e;
+	    scrollBy( 0, -we->delta() );
+	    we->accept();
+	    return TRUE;
+	}
+#endif
+    default:
+	break;
+    }
+
+    return QScrollView::eventFilter( o, e );
+}
+
+void QTable::fixCell( int &row, int &col, int key )
+{
+    if ( rowHeight( row ) > 0 && columnWidth( col ) > 0 )
+	return;
+    if ( rowHeight( row ) <= 0 ) {
+	if ( key == Key_Down ||
+	     key == Key_Next ||
+	     key == Key_End ) {
+	    while ( row < numRows() && rowHeight( row ) <= 0 )
+		row++;
+	    if ( rowHeight( row ) <= 0 )
+		row = curRow;
+	} else if ( key == Key_Up ||
+		    key == Key_Prior ||
+		    key == Key_Home )
+	    while ( row >= 0 && rowHeight( row ) <= 0 )
+		row--;
+	    if ( rowHeight( row ) <= 0 )
+		row = curRow;
+    } else if ( columnWidth( col ) <= 0 ) {
+	if ( key == Key_Left ) {
+	    while ( col >= 0 && columnWidth( col ) <= 0 )
+		col--;
+	    if ( columnWidth( col ) <= 0 )
+		col = curCol;
+	} else if ( key == Key_Right ) {
+	    while ( col < numCols() && columnWidth( col ) <= 0 )
+		col++;
+	    if ( columnWidth( col ) <= 0 )
+		col = curCol;
+	}
+    }
+}
+
+/*! \reimp
+*/
+
+void QTable::keyPressEvent( QKeyEvent* e )
+{
+    if ( isEditing() && item( editRow, editCol ) &&
+	 item( editRow, editCol )->editType() == QTableItem::OnTyping )
+	return;
+
+    int tmpRow = curRow;
+    int tmpCol = curCol;
+    int oldRow = tmpRow;
+    int oldCol = tmpCol;
+
+    bool navigationKey = FALSE;
+    int r;
+    switch ( e->key() ) {
+    case Key_Left:
+	tmpCol = QMAX( 0, tmpCol - 1 );
+	navigationKey = TRUE;
+	break;
+    case Key_Right:
+	tmpCol = QMIN( numCols() - 1, tmpCol + 1 );
+	navigationKey = TRUE;
+	break;
+    case Key_Up:
+	tmpRow = QMAX( 0, tmpRow - 1 );
+	navigationKey = TRUE;
+	break;
+    case Key_Down:
+	tmpRow = QMIN( numRows() - 1, tmpRow + 1 );
+	navigationKey = TRUE;
+	break;
+    case Key_Prior:
+	r = QMAX( 0, rowAt( rowPos( tmpRow ) - visibleHeight() ) );
+	if ( r < tmpRow || tmpRow < 0 )
+	    tmpRow = r;
+	navigationKey = TRUE;
+	break;
+    case Key_Next:
+	r = QMIN( numRows() - 1, rowAt( rowPos( tmpRow ) + visibleHeight() ) );
+	if ( r > tmpRow )
+	    tmpRow = r;
+	else
+	    tmpRow = numRows() - 1;
+	navigationKey = TRUE;
+	break;
+    case Key_Home:
+	tmpRow = 0;
+	navigationKey = TRUE;
+	break;
+    case Key_End:
+	tmpRow = numRows() - 1;
+	navigationKey = TRUE;
+	break;
+    case Key_F2:
+	if ( beginEdit( tmpRow, tmpCol, FALSE ) )
+	    setEditMode( Editing, tmpRow, tmpCol );
+	break;
+    case Key_Enter: case Key_Return:
+	activateNextCell();
+	return;
+    case Key_Tab: case Key_BackTab:
+	if ( (e->key() == Key_Tab) && !(e->state() & ShiftButton) ) {
+	    if ( currentColumn() >= numCols() - 1 )
+		return;
+	    int cc  = QMIN( numCols() - 1, currentColumn() + 1 );
+	    while ( cc < numCols() ) {
+		QTableItem *i = item( currentRow(), cc );
+		if ( !d->hiddenCols.find( cc ) && !isColumnReadOnly( cc ) && (!i || i->isEnabled()) )
+		    break;
+		++cc;
+	    }
+	    setCurrentCell( currentRow(), cc );
+	} else { // Key_BackTab
+	    if ( currentColumn() == 0 )
+		return;
+	    int cc  = QMAX( 0, currentColumn() - 1 );
+	    while ( cc >= 0 ) {
+		QTableItem *i = item( currentRow(), cc );
+		if ( !d->hiddenCols.find( cc ) && !isColumnReadOnly( cc ) && (!i || i->isEnabled()) )
+		    break;
+		--cc;
+	    }
+	    setCurrentCell( currentRow(), cc );
+	}
+	return;
+    case Key_Escape:
+	e->ignore();
+	return;
+    default: // ... or start in-place editing
+	if ( e->text()[ 0 ].isPrint() ) {
+	    QTableItem *itm = item( tmpRow, tmpCol );
+	    if ( !itm || itm->editType() == QTableItem::OnTyping ) {
+		QWidget *w = beginEdit( tmpRow, tmpCol,
+					itm ? itm->isReplaceable() : TRUE );
+		if ( w ) {
+		    setEditMode( ( !itm || itm && itm->isReplaceable()
+				   ? Replacing : Editing ), tmpRow, tmpCol );
+		    QApplication::sendEvent( w, e );
+		    return;
+		}
+	    }
+	}
+	e->ignore();
+	return;
+    }
+
+    if ( navigationKey ) {
+	fixCell( tmpRow, tmpCol, e->key() );
+	if ( ( e->state() & ShiftButton ) == ShiftButton &&
+	     selMode != NoSelection && selMode != SingleRow ) {
+	    bool justCreated = FALSE;
+	    setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+	    if ( !currentSel ) {
+		justCreated = TRUE;
+		currentSel = new QTableSelection();
+		selections.append( currentSel );
+		if ( !isRowSelection( selectionMode() ) )
+		    currentSel->init( oldRow, oldCol );
+		else
+		    currentSel->init( oldRow < 0 ? 0 : oldRow, 0 );
+	    }
+	    QTableSelection oldSelection = *currentSel;
+	    if ( !isRowSelection( selectionMode() ) )
+		currentSel->expandTo( tmpRow, tmpCol );
+	    else
+		currentSel->expandTo( tmpRow, numCols() - 1 );
+	    repaintSelections( justCreated ? 0 : &oldSelection, currentSel );
+	    emit selectionChanged();
+	} else {
+	    setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+	    if ( !isRowSelection( selectionMode() ) ) {
+		clearSelection();
+	    } else {
+		bool currentInSelection = tmpRow == oldRow && isSelected( tmpRow, tmpCol, FALSE );
+		if ( !currentInSelection ) {
+		    bool hasOldSel = FALSE;
+		    QTableSelection oldSelection;
+		    if ( selectionMode() == MultiRow ) {
+			bool b = signalsBlocked();
+			blockSignals( TRUE );
+			clearSelection();
+			blockSignals( b );
+		    } else {
+			if ( currentSel ) {
+			    oldSelection = *currentSel;
+			    hasOldSel = TRUE;
+			    selections.removeRef( currentSel );
+			    leftHeader->setSectionState( oldSelection.topRow(), QTableHeader::Normal );
+			}
+		    }
+		    currentSel = new QTableSelection();
+		    selections.append( currentSel );
+		    currentSel->init( tmpRow, 0 );
+		    currentSel->expandTo( tmpRow, numCols() - 1 );
+		    repaintSelections( hasOldSel ? &oldSelection : 0, currentSel, !hasOldSel );
+		    emit selectionChanged();
+		}
+	    }
+	}
+    } else {
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+    }
+}
+
+/*! \reimp
+*/
+
+void QTable::focusInEvent( QFocusEvent* )
+{
+    d->inMenuMode = FALSE;
+    QWidget *editorWidget = cellWidget( editRow, editCol );
+    updateCell( curRow, curCol );
+    if ( style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus, this ) )
+	repaintSelections();
+    if ( isEditing() && editorWidget )
+	editorWidget->setFocus();
+
+    QPoint cellPos( columnPos( curCol ) + leftMargin() - contentsX(), rowPos( curRow ) + topMargin() - contentsY() );
+    QTableItem *itm = item( curRow, curCol );
+    setMicroFocusHint( cellPos.x(), cellPos.y(), columnWidth( curCol ), rowHeight( curRow ), ( itm && itm->editType() != QTableItem::Never ) );
+}
+
+
+/*! \reimp
+*/
+
+void QTable::focusOutEvent( QFocusEvent* )
+{
+    updateCell( curRow, curCol );
+    if (style().styleHint( QStyle::SH_ItemView_ChangeHighlightOnFocus, this )) {
+	d->inMenuMode =
+	    QFocusEvent::reason() == QFocusEvent::Popup ||
+	    (qApp->focusWidget() && qApp->focusWidget()->inherits("QMenuBar"));
+	if ( !d->inMenuMode )
+	    repaintSelections();
+    }
+}
+
+/*! \reimp
+*/
+
+QSize QTable::sizeHint() const
+{
+    if ( cachedSizeHint().isValid() )
+	return cachedSizeHint();
+
+    constPolish();
+
+    QSize s = tableSize();
+    QSize sh;
+    if ( s.width() < 500 && s.height() < 500 ) {
+	sh = QSize( tableSize().width() + VERTICALMARGIN + 5,
+		    tableSize().height() + topMargin() + 5 );
+    } else {
+    	sh = QScrollView::sizeHint();
+    	if ( !topHeader->isHidden() )
+		sh.setHeight( sh.height() + topHeader->height() );
+    	if ( !leftHeader->isHidden() )
+		sh.setWidth( sh.width() + leftHeader->width() );
+    }
+    setCachedSizeHint( sh );
+    return sh;
+}
+
+/*! \reimp
+*/
+
+void QTable::viewportResizeEvent( QResizeEvent *e )
+{
+    QScrollView::viewportResizeEvent( e );
+    updateGeometries();
+}
+
+/*! \reimp
+*/
+
+void QTable::showEvent( QShowEvent *e )
+{
+    QScrollView::showEvent( e );
+    QRect r( cellGeometry( numRows() - 1, numCols() - 1 ) );
+    resizeContents( r.right() + 1, r.bottom() + 1 );
+    updateGeometries();
+}
+
+/*! \reimp
+*/
+
+void QTable::paintEvent( QPaintEvent *e )
+{
+    QRect topLeftCorner = QStyle::visualRect( QRect(frameWidth(), frameWidth(), VERTICALMARGIN, topMargin() ), rect() );
+    erase( topLeftCorner ); // erase instead of widget on top
+    QScrollView::paintEvent( e );
+
+#ifdef Q_OS_TEMP
+    QPainter p( this );
+    p.drawLine( topLeftCorner.bottomLeft(), topLeftCorner.bottomRight() );
+    p.drawLine( topLeftCorner.bottomRight(), topLeftCorner.topRight() );
+#endif
+}
+
+static bool inUpdateCell = FALSE;
+
+/*!
+    Repaints the cell at \a row, \a col.
+*/
+
+void QTable::updateCell( int row, int col )
+{
+    if ( inUpdateCell || row < 0 || col < 0 )
+	return;
+    inUpdateCell = TRUE;
+    QRect cg = cellGeometry( row, col );
+    QRect r( contentsToViewport( QPoint( cg.x() - 2, cg.y() - 2 ) ),
+	     QSize( cg.width() + 4, cg.height() + 4 ) );
+    QApplication::postEvent( viewport(), new QPaintEvent( r, FALSE ) );
+    inUpdateCell = FALSE;
+}
+
+void QTable::repaintCell( int row, int col )
+{
+    if ( row == -1 || col == -1 )
+	return;
+    QRect cg = cellGeometry( row, col );
+    QRect r( QPoint( cg.x() - 2, cg.y() - 2 ),
+	     QSize( cg.width() + 4, cg.height() + 4 ) );
+    repaintContents( r, FALSE );
+}
+
+void QTable::contentsToViewport2( int x, int y, int& vx, int& vy )
+{
+    const QPoint v = contentsToViewport2( QPoint( x, y ) );
+    vx = v.x();
+    vy = v.y();
+}
+
+QPoint QTable::contentsToViewport2( const QPoint &p )
+{
+    return QPoint( p.x() - contentsX(),
+		   p.y() - contentsY() );
+}
+
+QPoint QTable::viewportToContents2( const QPoint& vp )
+{
+    return QPoint( vp.x() + contentsX(),
+		   vp.y() + contentsY() );
+}
+
+void QTable::viewportToContents2( int vx, int vy, int& x, int& y )
+{
+    const QPoint c = viewportToContents2( QPoint( vx, vy ) );
+    x = c.x();
+    y = c.y();
+}
+
+/*!
+    This function should be called whenever the column width of \a col
+    has been changed. It updates the geometry of any affected columns
+    and repaints the table to reflect the changes it has made.
+*/
+
+void QTable::columnWidthChanged( int col )
+{
+    int p = columnPos( col );
+    if ( d->hasColSpan )
+	p = contentsX();
+    updateContents( p, contentsY(), contentsWidth(), visibleHeight() );
+    QSize s( tableSize() );
+    int w = contentsWidth();
+    resizeContents( s.width(), s.height() );
+    if ( contentsWidth() < w )
+	repaintContents( s.width(), contentsY(),
+			 w - s.width() + 1, visibleHeight(), TRUE );
+    else
+	repaintContents( w, contentsY(),
+			 s.width() - w + 1, visibleHeight(), FALSE );
+
+    // update widgets that are affected by this change
+    if ( widgets.size() )
+	for ( int c = col; c <= d->lastVisCol; ++c )
+	    updateColWidgets( c );
+    delayedUpdateGeometries();
+}
+
+/*!
+    This function should be called whenever the row height of \a row
+    has been changed. It updates the geometry of any affected rows and
+    repaints the table to reflect the changes it has made.
+*/
+
+void QTable::rowHeightChanged( int row )
+{
+    int p = rowPos( row );
+    if ( d->hasRowSpan )
+	p = contentsY();
+    updateContents( contentsX(), p, visibleWidth(), contentsHeight() );
+    QSize s( tableSize() );
+    int h = contentsHeight();
+    resizeContents( s.width(), s.height() );
+    if ( contentsHeight() < h ) {
+	repaintContents( contentsX(), contentsHeight(),
+			 visibleWidth(), h - s.height() + 1, TRUE );
+    } else {
+	repaintContents( contentsX(), h,
+			 visibleWidth(), s.height() - h + 1, FALSE );
+    }
+
+    // update widgets that are affected by this change
+    if ( widgets.size() ) {
+	d->lastVisRow = rowAt( contentsY() + visibleHeight() + ( s.height() - h + 1 ) );
+	for ( int r = row; r <= d->lastVisRow; ++r )
+	    updateRowWidgets( r );
+    }
+    delayedUpdateGeometries();
+}
+
+/*! \internal */
+
+void QTable::updateRowWidgets( int row )
+{
+    for ( int i = 0; i < numCols(); ++i ) {
+	QWidget *w = cellWidget( row, i );
+	if ( !w )
+	    continue;
+	moveChild( w, columnPos( i ), rowPos( row ) );
+	w->resize( columnWidth( i ) - 1, rowHeight( row ) - 1 );
+    }
+}
+
+/*! \internal */
+
+void QTable::updateColWidgets( int col )
+{
+    for ( int i = 0; i < numRows(); ++i ) {
+	QWidget *w = cellWidget( i, col );
+	if ( !w )
+	    continue;
+	moveChild( w, columnPos( col ), rowPos( i ) );
+	w->resize( columnWidth( col ) - 1, rowHeight( i ) - 1 );
+    }
+}
+
+/*!
+    This function is called when column order is to be changed, i.e.
+    when the user moved the column header \a section from \a fromIndex
+    to \a toIndex.
+
+    If you want to change the column order programmatically, call
+    swapRows() or swapColumns();
+
+    \sa QHeader::indexChange() rowIndexChanged()
+*/
+
+void QTable::columnIndexChanged( int, int fromIndex, int toIndex )
+{
+    if ( doSort && lastSortCol == fromIndex && topHeader )
+	topHeader->setSortIndicator( toIndex, topHeader->sortIndicatorOrder() );
+    repaintContents( contentsX(), contentsY(),
+		     visibleWidth(), visibleHeight(), FALSE );
+}
+
+/*!
+    This function is called when the order of the rows is to be
+    changed, i.e. the user moved the row header section \a section
+    from \a fromIndex to \a toIndex.
+
+    If you want to change the order programmatically, call swapRows()
+    or swapColumns();
+
+    \sa QHeader::indexChange() columnIndexChanged()
+*/
+
+void QTable::rowIndexChanged( int, int, int )
+{
+    repaintContents( contentsX(), contentsY(),
+		     visibleWidth(), visibleHeight(), FALSE );
+}
+
+/*!
+    This function is called when the column \a col has been clicked.
+    The default implementation sorts this column if sorting() is TRUE.
+*/
+
+void QTable::columnClicked( int col )
+{
+    if ( !sorting() )
+	return;
+
+    if ( col == lastSortCol ) {
+	asc = !asc;
+    } else {
+	lastSortCol = col;
+	asc = TRUE;
+    }
+    sortColumn( lastSortCol, asc );
+}
+
+/*!
+    \property QTable::sorting
+    \brief whether a click on the header of a column sorts that column
+
+    \sa sortColumn()
+*/
+
+void QTable::setSorting( bool b )
+{
+    doSort = b;
+    if ( topHeader )
+ 	topHeader->setSortIndicator( b ? lastSortCol : -1 );
+}
+
+bool QTable::sorting() const
+{
+    return doSort;
+}
+
+static bool inUpdateGeometries = FALSE;
+
+void QTable::delayedUpdateGeometries()
+{
+    d->geomTimer->start( 0, TRUE );
+}
+
+void QTable::updateGeometriesSlot()
+{
+    updateGeometries();
+}
+
+/*!
+    This function updates the geometries of the left and top header.
+    You do not normally need to call this function.
+*/
+
+void QTable::updateGeometries()
+{
+    if ( inUpdateGeometries )
+	return;
+    inUpdateGeometries = TRUE;
+    QSize ts = tableSize();
+    if ( topHeader->offset() &&
+	 ts.width() < topHeader->offset() + topHeader->width() )
+	horizontalScrollBar()->setValue( ts.width() - topHeader->width() );
+    if ( leftHeader->offset() &&
+	 ts.height() < leftHeader->offset() + leftHeader->height() )
+	verticalScrollBar()->setValue( ts.height() - leftHeader->height() );
+
+    leftHeader->setGeometry( QStyle::visualRect( QRect( frameWidth(), topMargin() + frameWidth(),
+			     VERTICALMARGIN, visibleHeight() ), rect() ) );
+    topHeader->setGeometry( QStyle::visualRect( QRect(VERTICALMARGIN + frameWidth(), frameWidth(),
+						      visibleWidth(), topMargin() ), rect() ) );
+    horizontalScrollBar()->raise();
+    verticalScrollBar()->raise();
+    topHeader->updateStretches();
+    leftHeader->updateStretches();
+    inUpdateGeometries = FALSE;
+}
+
+/*!
+    Returns the width of column \a col.
+
+    \sa setColumnWidth() rowHeight()
+*/
+
+int QTable::columnWidth( int col ) const
+{
+    return topHeader->sectionSize( col );
+}
+
+/*!
+    Returns the height of row \a row.
+
+    \sa setRowHeight() columnWidth()
+*/
+
+int QTable::rowHeight( int row ) const
+{
+    return leftHeader->sectionSize( row );
+}
+
+/*!
+    Returns the x-coordinate of the column \a col in content
+    coordinates.
+
+    \sa columnAt() rowPos()
+*/
+
+int QTable::columnPos( int col ) const
+{
+    return topHeader->sectionPos( col );
+}
+
+/*!
+    Returns the y-coordinate of the row \a row in content coordinates.
+
+    \sa rowAt() columnPos()
+*/
+
+int QTable::rowPos( int row ) const
+{
+    return leftHeader->sectionPos( row );
+}
+
+/*!
+    Returns the number of the column at position \a x. \a x must be
+    given in content coordinates.
+
+    \sa columnPos() rowAt()
+*/
+
+int QTable::columnAt( int x ) const
+{
+    return topHeader->sectionAt( x );
+}
+
+/*!
+    Returns the number of the row at position \a y. \a y must be given
+    in content coordinates.
+
+    \sa rowPos() columnAt()
+*/
+
+int QTable::rowAt( int y ) const
+{
+    return leftHeader->sectionAt( y );
+}
+
+/*!
+    Returns the bounding rectangle of the cell at \a row, \a col in
+    content coordinates.
+*/
+
+QRect QTable::cellGeometry( int row, int col ) const
+{
+    QTableItem *itm = item( row, col );
+
+    if ( !itm || itm->rowSpan() == 1 && itm->colSpan() == 1 )
+	return QRect( columnPos( col ), rowPos( row ),
+		      columnWidth( col ), rowHeight( row ) );
+
+    while ( row != itm->row() )
+	row--;
+    while ( col != itm->col() )
+	col--;
+
+    QRect rect( columnPos( col ), rowPos( row ),
+		columnWidth( col ), rowHeight( row ) );
+
+    for ( int r = 1; r < itm->rowSpan(); ++r )
+	rect.setHeight( rect.height() + rowHeight( r + row ) );
+
+    for ( int c = 1; c < itm->colSpan(); ++c )
+	rect.setWidth( rect.width() + columnWidth( c + col ) );
+
+    return rect;
+}
+
+/*!
+    Returns the size of the table.
+
+    This is the same as the coordinates of the bottom-right edge of
+    the last table cell.
+*/
+
+QSize QTable::tableSize() const
+{
+    return QSize( columnPos( numCols() - 1 ) + columnWidth( numCols() - 1 ),
+		  rowPos( numRows() - 1 ) + rowHeight( numRows() - 1 ) );
+}
+
+/*!
+    \property QTable::numRows
+    \brief The number of rows in the table
+
+    \sa numCols
+*/
+
+int QTable::numRows() const
+{
+    return leftHeader->count();
+}
+
+/*!
+    \property QTable::numCols
+    \brief The number of columns in the table
+
+    \sa numRows
+*/
+
+int QTable::numCols() const
+{
+    return topHeader->count();
+}
+
+void QTable::saveContents( QPtrVector<QTableItem> &tmp,
+			   QPtrVector<QTable::TableWidget> &tmp2)
+{
+    int nCols = numCols();
+    if ( editRow != -1 && editCol != -1 )
+	endEdit( editRow, editCol, FALSE, edMode != Editing );
+    tmp.resize( contents.size() );
+    tmp2.resize( widgets.size() );
+    int i;
+    for ( i = 0; i < (int)tmp.size(); ++i ) {
+	QTableItem *item = contents[ i ];
+	if ( item && ( item->row() * nCols) + item->col() == i )
+	    tmp.insert( i, item );
+	else
+	    tmp.insert( i, 0 );
+    }
+    for ( i = 0; i < (int)tmp2.size(); ++i ) {
+	QWidget *w = widgets[ i ];
+	if ( w )
+	    tmp2.insert( i, new TableWidget( w, i / nCols, i % nCols ) );
+	else
+	    tmp2.insert( i, 0 );
+    }
+}
+
+void QTable::updateHeaderAndResizeContents( QTableHeader *header,
+					    int num, int rowCol,
+					    int width, bool &updateBefore )
+{
+    updateBefore = rowCol < num;
+    if ( rowCol > num ) {
+	header->QHeader::resizeArrays( rowCol );
+	header->QTableHeader::resizeArrays( rowCol );
+	int old = num;
+	clearSelection( FALSE );
+	int i = 0;
+	for ( i = old; i < rowCol; ++i )
+	    header->addLabel( QString::null, width );
+    } else {
+	clearSelection( FALSE );
+	if ( header == leftHeader ) {
+	    while ( numRows() > rowCol )
+		header->removeLabel( numRows() - 1 );
+	} else {
+	    while ( numCols() > rowCol )
+		header->removeLabel( numCols() - 1 );
+	}
+    }
+
+    contents.setAutoDelete( FALSE );
+    contents.clear();
+    contents.setAutoDelete( TRUE );
+    widgets.setAutoDelete( FALSE );
+    widgets.clear();
+    widgets.setAutoDelete( TRUE );
+    resizeData( numRows() * numCols() );
+
+    // keep numStretches in sync
+    int n = 0;
+    for ( uint i = 0; i < header->stretchable.size(); i++ )
+	n += ( header->stretchable.at(i) & 1 ); // avoid cmp
+     header->numStretches = n;
+}
+
+void QTable::restoreContents( QPtrVector<QTableItem> &tmp,
+			      QPtrVector<QTable::TableWidget> &tmp2 )
+{
+    int i;
+    int nCols = numCols();
+    for ( i = 0; i < (int)tmp.size(); ++i ) {
+	QTableItem *it = tmp[ i ];
+	if ( it ) {
+	    int idx = ( it->row() * nCols ) + it->col();
+	    if ( (uint)idx < contents.size() &&
+		 it->row() == idx /  nCols && it->col() == idx % nCols ) {
+		contents.insert( idx, it );
+		if ( it->rowSpan() > 1 || it->colSpan() > 1 ) {
+		    int ridx, iidx;
+		    for ( int irow = 0; irow < it->rowSpan(); irow++ ) {
+			ridx = idx + irow * nCols;
+			for ( int icol = 0; icol < it->colSpan(); icol++ ) {
+			    iidx = ridx + icol;
+			    if ( idx != iidx && (uint)iidx < contents.size() )
+				contents.insert( iidx, it );
+			}
+		    }
+
+		}
+	    } else {
+		delete it;
+	    }
+	}
+    }
+    for ( i = 0; i < (int)tmp2.size(); ++i ) {
+	TableWidget *w = tmp2[ i ];
+	if ( w ) {
+	    int idx = ( w->row * nCols ) + w->col;
+	    if ( (uint)idx < widgets.size() &&
+		 w->row == idx / nCols && w->col == idx % nCols )
+		widgets.insert( idx, w->wid );
+	    else
+		delete w->wid;
+	    delete w;
+	}
+    }
+}
+
+void QTable::finishContentsResze( bool updateBefore )
+{
+    QRect r( cellGeometry( numRows() - 1, numCols() - 1 ) );
+    resizeContents( r.right() + 1, r.bottom() + 1 );
+    updateGeometries();
+    if ( updateBefore )
+	repaintContents( contentsX(), contentsY(),
+			 visibleWidth(), visibleHeight(), TRUE );
+    else
+	repaintContents( contentsX(), contentsY(),
+			 visibleWidth(), visibleHeight(), FALSE );
+
+    if ( isRowSelection( selectionMode() ) ) {
+	int r = curRow;
+	curRow = -1;
+	setCurrentCell( r, curCol );
+    }
+}
+
+void QTable::setNumRows( int r )
+{
+    if ( r < 0 )
+	return;
+
+    if (r < numRows()) {
+	// Removed rows are no longer hidden, and should thus be removed from "hiddenRows"
+	for (int rr = numRows()-1; rr >= r; --rr) {
+	    if (d->hiddenRows.find(rr))
+		d->hiddenRows.remove(rr);
+	}
+    }
+
+    QPtrVector<QTableItem> tmp;
+    QPtrVector<TableWidget> tmp2;
+    saveContents( tmp, tmp2 );
+
+    bool isUpdatesEnabled = leftHeader->isUpdatesEnabled();
+    leftHeader->setUpdatesEnabled( FALSE );
+
+    bool updateBefore;
+    updateHeaderAndResizeContents( leftHeader, numRows(), r, 20, updateBefore );
+
+    int w = fontMetrics().width( QString::number( r ) + "W" );
+    if ( VERTICALMARGIN > 0 && w > VERTICALMARGIN )
+	setLeftMargin( w );
+
+    restoreContents( tmp, tmp2 );
+
+    leftHeader->calculatePositions();
+    finishContentsResze( updateBefore );
+    leftHeader->setUpdatesEnabled( isUpdatesEnabled );
+    if ( isUpdatesEnabled )
+	leftHeader->update();
+    leftHeader->updateCache();
+    if ( curRow >= numRows() ) {
+	curRow = numRows() - 1;
+	if ( curRow < 0 )
+	    curCol = -1;
+	else
+	    repaintCell( curRow, curCol );
+    }
+
+    if ( curRow > numRows() )
+	curRow = numRows();
+}
+
+void QTable::setNumCols( int c )
+{
+    if ( c < 0 )
+	return;
+
+    if (c < numCols()) {
+	// Removed columns are no longer hidden, and should thus be removed from "hiddenCols"
+	for (int cc = numCols()-1; cc >= c; --cc) {
+	    if (d->hiddenCols.find(cc))
+		d->hiddenCols.remove(cc);
+	}
+    }
+
+    QPtrVector<QTableItem> tmp;
+    QPtrVector<TableWidget> tmp2;
+    saveContents( tmp, tmp2 );
+
+    bool isUpdatesEnabled = topHeader->isUpdatesEnabled();
+    topHeader->setUpdatesEnabled( FALSE );
+
+    bool updateBefore;
+    updateHeaderAndResizeContents( topHeader, numCols(), c, 100, updateBefore );
+
+    restoreContents( tmp, tmp2 );
+
+    topHeader->calculatePositions();
+    finishContentsResze( updateBefore );
+    topHeader->setUpdatesEnabled( isUpdatesEnabled );
+    if ( isUpdatesEnabled )
+	topHeader->update();
+    topHeader->updateCache();
+    if ( curCol >= numCols() ) {
+	curCol = numCols() - 1;
+	if ( curCol < 0 )
+	    curRow = -1;
+	else
+	    repaintCell( curRow, curCol );
+    }
+}
+
+/*! Sets the section labels of the verticalHeader() to \a labels */
+
+void QTable::setRowLabels( const QStringList &labels )
+{
+    leftHeader->setLabels(labels);
+}
+
+/*! Sets the section labels of the horizontalHeader() to \a labels */
+
+void QTable::setColumnLabels( const QStringList &labels )
+{
+   topHeader->setLabels(labels);
+}
+
+/*!
+    This function returns the widget which should be used as an editor
+    for the contents of the cell at \a row, \a col.
+
+    If \a initFromCell is TRUE, the editor is used to edit the current
+    contents of the cell (so the editor widget should be initialized
+    with this content). If \a initFromCell is FALSE, the content of
+    the cell is replaced with the new content which the user entered
+    into the widget created by this function.
+
+    The default functionality is as follows: if \a initFromCell is
+    TRUE or the cell has a QTableItem and the table item's
+    QTableItem::isReplaceable() is FALSE then the cell is asked to
+    create an appropriate editor (using QTableItem::createEditor()).
+    Otherwise a QLineEdit is used as the editor.
+
+    If you want to create your own editor for certain cells, implement
+    a custom QTableItem subclass and reimplement
+    QTableItem::createEditor().
+
+    If you are not using \l{QTableItem}s and you don't want to use a
+    QLineEdit as the default editor, subclass QTable and reimplement
+    this function with code like this:
+    \code
+    QTableItem *i = item( row, col );
+    if ( initFromCell || ( i && !i->isReplaceable() ) )
+	// If we had a QTableItem ask the base class to create the editor
+	return QTable::createEditor( row, col, initFromCell );
+    else
+	return ...(create your own editor)
+    \endcode
+    Ownership of the editor widget is transferred to the caller.
+
+    If you reimplement this function return 0 for read-only cells. You
+    will need to reimplement setCellContentFromEditor() to retrieve
+    the data the user entered.
+
+    \sa QTableItem::createEditor()
+*/
+
+QWidget *QTable::createEditor( int row, int col, bool initFromCell ) const
+{
+    if ( isReadOnly() || isRowReadOnly( row ) || isColumnReadOnly( col ) )
+	return 0;
+
+    QWidget *e = 0;
+
+    // the current item in the cell should be edited if possible
+    QTableItem *i = item( row, col );
+    if ( initFromCell || ( i && !i->isReplaceable() ) ) {
+	if ( i ) {
+	    if ( i->editType() == QTableItem::Never )
+		return 0;
+
+	    e = i->createEditor();
+	    if ( !e )
+		return 0;
+	}
+    }
+
+    // no contents in the cell yet, so open the default editor
+    if ( !e ) {
+	e = new QLineEdit( viewport(), "qt_lineeditor" );
+	( (QLineEdit*)e )->setFrame( FALSE );
+    }
+
+    return e;
+}
+
+/*!
+    This function is called to start in-place editing of the cell at
+    \a row, \a col. Editing is achieved by creating an editor
+    (createEditor() is called) and setting the cell's editor with
+    setCellWidget() to the newly created editor. (After editing is
+    complete endEdit() will be called to replace the cell's content
+    with the editor's content.) If \a replace is TRUE the editor will
+    start empty; otherwise it will be initialized with the cell's
+    content (if any), i.e. the user will be modifying the original
+    cell content.
+
+    \sa endEdit()
+*/
+
+QWidget *QTable::beginEdit( int row, int col, bool replace )
+{
+    if ( isReadOnly() || isRowReadOnly( row ) || isColumnReadOnly( col ) )
+	return 0;
+    QTableItem *itm = item( row, col );
+    if ( itm && !itm->isEnabled() )
+	return 0;
+    if ( cellWidget( row, col ) )
+	return 0;
+    ensureCellVisible( row, col );
+    QWidget *e = createEditor( row, col, !replace );
+    if ( !e )
+	return 0;
+    setCellWidget( row, col, e );
+    e->setActiveWindow();
+    e->setFocus();
+    updateCell( row, col );
+    return e;
+}
+
+/*!
+    This function is called when in-place editing of the cell at \a
+    row, \a col is requested to stop.
+
+    If the cell is not being edited or \a accept is FALSE the function
+    returns and the cell's contents are left unchanged.
+
+    If \a accept is TRUE the content of the editor must be transferred
+    to the relevant cell. If \a replace is TRUE the current content of
+    this cell should be replaced by the content of the editor (this
+    means removing the current QTableItem of the cell and creating a
+    new one for the cell). Otherwise (if possible) the content of the
+    editor should just be set to the existing QTableItem of this cell.
+
+    setCellContentFromEditor() is called to replace the contents of
+    the cell with the contents of the cell's editor.
+
+    Finally clearCellWidget() is called to remove the editor widget.
+
+    \sa setCellContentFromEditor(), beginEdit()
+*/
+
+void QTable::endEdit( int row, int col, bool accept, bool replace )
+{
+    QWidget *editor = cellWidget( row, col );
+    if ( !editor )
+	return;
+
+    if ( !accept ) {
+	if ( row == editRow && col == editCol )
+	    setEditMode( NotEditing, -1, -1 );
+	clearCellWidget( row, col );
+	updateCell( row, col );
+	viewport()->setFocus();
+	updateCell( row, col );
+	return;
+    }
+
+    QTableItem *i = item( row, col );
+    QString oldContent;
+    if ( i )
+	oldContent = i->text();
+
+    if ( !i || replace ) {
+	setCellContentFromEditor( row, col );
+	i = item( row, col );
+    } else {
+	i->setContentFromEditor( editor );
+    }
+
+    if ( row == editRow && col == editCol )
+	setEditMode( NotEditing, -1, -1 );
+
+    viewport()->setFocus();
+    updateCell( row, col );
+
+    if (!i || (oldContent != i->text()))
+	emit valueChanged( row, col );
+
+    clearCellWidget( row, col );
+}
+
+/*!
+    This function is called to replace the contents of the cell at \a
+    row, \a col with the contents of the cell's editor.
+
+    If there already exists a QTableItem for the cell,
+    it calls QTableItem::setContentFromEditor() on this QTableItem.
+
+    If, for example, you want to create different \l{QTableItem}s
+    depending on the contents of the editor, you might reimplement
+    this function.
+
+    If you want to work without \l{QTableItem}s, you will need to
+    reimplement this function to save the data the user entered into
+    your data structure. (See the notes on large tables.)
+
+    \sa QTableItem::setContentFromEditor() createEditor()
+*/
+
+void QTable::setCellContentFromEditor( int row, int col )
+{
+    QWidget *editor = cellWidget( row, col );
+    if ( !editor )
+	return;
+
+    QTableItem *i = item( row, col );
+    if ( i ) {
+	i->setContentFromEditor( editor );
+    } else {
+	QLineEdit *le = ::qt_cast<QLineEdit*>(editor);
+	if ( le )
+	    setText( row, col, le->text() );
+    }
+}
+
+/*!
+    Returns TRUE if the \l EditMode is \c Editing or \c Replacing;
+    otherwise (i.e. the \l EditMode is \c NotEditing) returns FALSE.
+
+    \sa QTable::EditMode
+*/
+
+bool QTable::isEditing() const
+{
+    return edMode != NotEditing;
+}
+
+/*!
+    Returns the current edit mode
+
+    \sa QTable::EditMode
+*/
+
+QTable::EditMode QTable::editMode() const
+{
+    return edMode;
+}
+
+/*!
+    Returns the current edited row
+*/
+
+int QTable::currEditRow() const
+{
+    return editRow;
+}
+
+/*!
+    Returns the current edited column
+*/
+
+int QTable::currEditCol() const
+{
+    return editCol;
+}
+
+/*!
+    Returns a single integer which identifies a particular \a row and \a
+    col by mapping the 2D table to a 1D array.
+
+    This is useful, for example, if you have a sparse table and want to
+    use a QIntDict to map integers to the cells that are used.
+*/
+
+int QTable::indexOf( int row, int col ) const
+{
+    return ( row * numCols() ) + col;
+}
+
+/*! \internal
+*/
+
+void QTable::repaintSelections( QTableSelection *oldSelection,
+				QTableSelection *newSelection,
+				bool updateVertical, bool updateHorizontal )
+{
+    if ( !oldSelection && !newSelection )
+	return;
+    if ( oldSelection && newSelection && *oldSelection == *newSelection )
+	return;
+    if ( oldSelection && !oldSelection->isActive() )
+ 	oldSelection = 0;
+
+    bool optimizeOld = FALSE;
+    bool optimizeNew = FALSE;
+
+    QRect old;
+    if ( oldSelection )
+	old = rangeGeometry( oldSelection->topRow(),
+			     oldSelection->leftCol(),
+			     oldSelection->bottomRow(),
+			     oldSelection->rightCol(),
+			     optimizeOld );
+    else
+	old = QRect( 0, 0, 0, 0 );
+
+    QRect cur;
+    if ( newSelection )
+	cur = rangeGeometry( newSelection->topRow(),
+			     newSelection->leftCol(),
+			     newSelection->bottomRow(),
+			     newSelection->rightCol(),
+			     optimizeNew );
+    else
+	cur = QRect( 0, 0, 0, 0 );
+    int i;
+
+    if ( !optimizeOld || !optimizeNew ||
+	 old.width() > SHRT_MAX || old.height() > SHRT_MAX ||
+	 cur.width() > SHRT_MAX || cur.height() > SHRT_MAX ) {
+	QRect rr = cur.unite( old );
+	repaintContents( rr, FALSE );
+    } else {
+	old = QRect( contentsToViewport2( old.topLeft() ), old.size() );
+	cur = QRect( contentsToViewport2( cur.topLeft() ), cur.size() );
+	QRegion r1( old );
+	QRegion r2( cur );
+ 	QRegion r3 = r1.subtract( r2 );
+ 	QRegion r4 = r2.subtract( r1 );
+
+	for ( i = 0; i < (int)r3.rects().count(); ++i ) {
+	    QRect r( r3.rects()[ i ] );
+	    r = QRect( viewportToContents2( r.topLeft() ), r.size() );
+	    repaintContents( r, FALSE );
+	}
+	for ( i = 0; i < (int)r4.rects().count(); ++i ) {
+	    QRect r( r4.rects()[ i ] );
+	    r = QRect( viewportToContents2( r.topLeft() ), r.size() );
+	    repaintContents( r, FALSE );
+	}
+    }
+
+    int top, left, bottom, right;
+    top = QMIN( oldSelection ? oldSelection->topRow() : newSelection->topRow(),
+		newSelection ? newSelection->topRow() :oldSelection->topRow() );
+    left = QMIN( oldSelection ? oldSelection->leftCol() : newSelection->leftCol(),
+		 newSelection ? newSelection->leftCol() : oldSelection->leftCol() );
+    bottom = QMAX( oldSelection ? oldSelection->bottomRow() : newSelection->bottomRow(),
+		   newSelection ? newSelection->bottomRow() : oldSelection->bottomRow() );
+    right = QMAX( oldSelection ? oldSelection->rightCol() : newSelection->rightCol(),
+		  newSelection ? newSelection->rightCol() : oldSelection->rightCol() );
+
+    if ( updateHorizontal && numCols() > 0 && left >= 0 && !isRowSelection( selectionMode() ) ) {
+	register int *s = &topHeader->states.data()[left];
+	for ( i = left; i <= right; ++i ) {
+	    if ( !isColumnSelected( i ) )
+		*s = QTableHeader::Normal;
+	    else if ( isColumnSelected( i, TRUE ) )
+		*s = QTableHeader::Selected;
+	    else
+		*s = QTableHeader::Bold;
+	    ++s;
+	}
+	topHeader->repaint( FALSE );
+    }
+
+    if ( updateVertical && numRows() > 0 && top >= 0 ) {
+	register int *s = &leftHeader->states.data()[top];
+	for ( i = top; i <= bottom; ++i ) {
+	    if ( !isRowSelected( i ) )
+		*s = QTableHeader::Normal;
+	    else if ( isRowSelected( i, TRUE ) )
+		*s = QTableHeader::Selected;
+	    else
+		*s = QTableHeader::Bold;
+	    ++s;
+	}
+	leftHeader->repaint( FALSE );
+    }
+}
+
+/*!
+    Repaints all selections
+*/
+
+void QTable::repaintSelections()
+{
+    if ( selections.isEmpty() )
+	return;
+
+    QRect r;
+    for ( QTableSelection *s = selections.first(); s; s = selections.next() ) {
+	bool b;
+	r = r.unite( rangeGeometry( s->topRow(),
+				    s->leftCol(),
+				    s->bottomRow(),
+				    s->rightCol(), b ) );
+    }
+
+    repaintContents( r, FALSE );
+}
+
+/*!
+    Clears all selections and repaints the appropriate regions if \a
+    repaint is TRUE.
+
+    \sa removeSelection()
+*/
+
+void QTable::clearSelection( bool repaint )
+{
+    if ( selections.isEmpty() )
+	return;
+    bool needRepaint = !selections.isEmpty();
+
+    QRect r;
+    for ( QTableSelection *s = selections.first(); s; s = selections.next() ) {
+	bool b;
+	r = r.unite( rangeGeometry( s->topRow(),
+				    s->leftCol(),
+				    s->bottomRow(),
+				    s->rightCol(), b ) );
+    }
+
+    currentSel = 0;
+    selections.clear();
+
+    if ( needRepaint && repaint )
+	repaintContents( r, FALSE );
+
+    leftHeader->setSectionStateToAll( QTableHeader::Normal );
+    leftHeader->repaint( FALSE );
+    if ( !isRowSelection( selectionMode() ) ) {
+	topHeader->setSectionStateToAll( QTableHeader::Normal );
+	topHeader->repaint( FALSE );
+    }
+    topHeader->setSectionState( curCol, QTableHeader::Bold );
+    leftHeader->setSectionState( curRow, QTableHeader::Bold );
+    emit selectionChanged();
+}
+
+/*! \internal
+*/
+
+QRect QTable::rangeGeometry( int topRow, int leftCol,
+			     int bottomRow, int rightCol, bool &optimize )
+{
+    topRow = QMAX( topRow, rowAt( contentsY() ) );
+    leftCol = QMAX( leftCol, columnAt( contentsX() ) );
+    int ra = rowAt( contentsY() + visibleHeight() );
+    if ( ra != -1 )
+	bottomRow = QMIN( bottomRow, ra );
+    int ca = columnAt( contentsX() + visibleWidth() );
+    if ( ca != -1 )
+	rightCol = QMIN( rightCol, ca );
+    optimize = TRUE;
+    QRect rect;
+    for ( int r = topRow; r <= bottomRow; ++r ) {
+	for ( int c = leftCol; c <= rightCol; ++c ) {
+	    rect = rect.unite( cellGeometry( r, c ) );
+	    QTableItem *i = item( r, c );
+	    if ( i && ( i->rowSpan() > 1 || i->colSpan() > 1 ) )
+		optimize = FALSE;
+	}
+    }
+    return rect;
+}
+
+/*!
+    This function is called to activate the next cell if in-place
+    editing was finished by pressing the Enter key.
+
+    The default behaviour is to move from top to bottom, i.e. move to
+    the cell beneath the cell being edited. Reimplement this function
+    if you want different behaviour, e.g. moving from left to right.
+*/
+
+void QTable::activateNextCell()
+{
+    int firstRow = 0;
+    while ( d->hiddenRows.find( firstRow ) )
+	firstRow++;
+    int firstCol = 0;
+    while ( d->hiddenCols.find( firstCol ) )
+	firstCol++;
+    int nextRow = curRow;
+    int nextCol = curCol;
+    while ( d->hiddenRows.find( ++nextRow ) );
+    if ( nextRow >= numRows() ) {
+	nextRow = firstRow;
+	while ( d->hiddenCols.find( ++nextCol ) );
+	if ( nextCol >= numCols() )
+	    nextCol = firstCol;
+    }
+
+    if ( !currentSel || !currentSel->isActive() ||
+	 ( currentSel->leftCol() == currentSel->rightCol() &&
+	   currentSel->topRow() == currentSel->bottomRow() ) ) {
+	clearSelection();
+	setCurrentCell( nextRow, nextCol );
+    } else {
+	if ( curRow < currentSel->bottomRow() )
+	    setCurrentCell( nextRow, curCol );
+	else if ( curCol < currentSel->rightCol() )
+	    setCurrentCell( currentSel->topRow(), nextCol );
+	else
+	    setCurrentCell( currentSel->topRow(), currentSel->leftCol() );
+    }
+
+}
+
+/*! \internal
+*/
+
+void QTable::fixRow( int &row, int y )
+{
+    if ( row == -1 ) {
+	if ( y < 0 )
+	    row = 0;
+	else
+	    row = numRows() - 1;
+    }
+}
+
+/*! \internal
+*/
+
+void QTable::fixCol( int &col, int x )
+{
+    if ( col == -1 ) {
+	if ( x < 0 )
+	    col = 0;
+	else
+	    col = numCols() - 1;
+    }
+}
+
+struct SortableTableItem
+{
+    QTableItem *item;
+};
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+#ifdef Q_OS_TEMP
+static int _cdecl cmpTableItems( const void *n1, const void *n2 )
+#else
+static int cmpTableItems( const void *n1, const void *n2 )
+#endif
+{
+    if ( !n1 || !n2 )
+	return 0;
+
+    SortableTableItem *i1 = (SortableTableItem *)n1;
+    SortableTableItem *i2 = (SortableTableItem *)n2;
+
+    return i1->item->key().localeAwareCompare( i2->item->key() );
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+/*!
+    Sorts column \a col. If \a ascending is TRUE the sort is in
+    ascending order, otherwise the sort is in descending order.
+
+    If \a wholeRows is TRUE, entire rows are sorted using swapRows();
+    otherwise only cells in the column are sorted using swapCells().
+
+    Note that if you are not using QTableItems you will need to
+    reimplement swapRows() and swapCells(). (See the notes on large
+    tables.)
+
+    \sa swapRows()
+*/
+
+void QTable::sortColumn( int col, bool ascending, bool wholeRows )
+{
+    int filledRows = 0, i;
+    for ( i = 0; i < numRows(); ++i ) {
+	QTableItem *itm = item( i, col );
+	if ( itm )
+	    filledRows++;
+    }
+
+    if ( !filledRows )
+	return;
+
+    SortableTableItem *items = new SortableTableItem[ filledRows ];
+    int j = 0;
+    for ( i = 0; i < numRows(); ++i ) {
+	QTableItem *itm = item( i, col );
+	if ( !itm )
+	    continue;
+	items[ j++ ].item = itm;
+    }
+
+    qsort( items, filledRows, sizeof( SortableTableItem ), cmpTableItems );
+
+    bool updatesEnabled = isUpdatesEnabled();
+    setUpdatesEnabled( FALSE );
+    for ( i = 0; i < numRows(); ++i ) {
+	if ( i < filledRows ) {
+	    if ( ascending ) {
+		if ( items[ i ].item->row() == i )
+		    continue;
+		if ( wholeRows )
+		    swapRows( items[ i ].item->row(), i );
+		else
+		    swapCells( items[ i ].item->row(), col, i, col );
+	    } else {
+		if ( items[ i ].item->row() == filledRows - i - 1 )
+		    continue;
+		if ( wholeRows )
+		    swapRows( items[ i ].item->row(), filledRows - i - 1 );
+		else
+		    swapCells( items[ i ].item->row(), col,
+			       filledRows - i - 1, col );
+	    }
+	}
+    }
+    setUpdatesEnabled( updatesEnabled );
+    if ( topHeader )
+ 	topHeader->setSortIndicator( col, ascending ? Qt::Ascending : Qt::Descending );
+
+    if ( !wholeRows )
+	repaintContents( columnPos( col ), contentsY(),
+			 columnWidth( col ), visibleHeight(), FALSE );
+    else
+	repaintContents( contentsX(), contentsY(),
+			 visibleWidth(), visibleHeight(), FALSE );
+
+    delete [] items;
+}
+
+/*!
+    Hides row \a row.
+
+    \sa showRow() hideColumn()
+*/
+
+void QTable::hideRow( int row )
+{
+    if ( d->hiddenRows.find( row ) )
+	return;
+    d->hiddenRows.replace( row, new int( leftHeader->sectionSize( row ) ) );
+    leftHeader->resizeSection( row, 0 );
+    leftHeader->setResizeEnabled( FALSE, row );
+    if ( isRowStretchable(row) )
+	leftHeader->numStretches--;
+    rowHeightChanged( row );
+    if ( curRow == row ) {
+	int r = curRow;
+	int c = curCol;
+	int k = ( r >= numRows() - 1 ? Key_Up : Key_Down );
+	fixCell( r, c, k );
+	if ( numRows() > 0 )
+	    setCurrentCell( r, c );
+    }
+}
+
+/*!
+    Hides column \a col.
+
+    \sa showColumn() hideRow()
+*/
+
+void QTable::hideColumn( int col )
+{
+    if ( !numCols() || d->hiddenCols.find( col ) )
+	return;
+    d->hiddenCols.replace( col, new int( topHeader->sectionSize( col ) ) );
+    topHeader->resizeSection( col, 0 );
+    topHeader->setResizeEnabled( FALSE, col );
+    if ( isColumnStretchable(col) )
+	topHeader->numStretches--;
+    columnWidthChanged( col );
+    if ( curCol == col ) {
+	int r = curRow;
+	int c = curCol;
+	int k = ( c >= numCols() - 1 ? Key_Left : Key_Right );
+	fixCell( r, c, k );
+	if ( numCols() > 0 )
+	    setCurrentCell( r, c );
+    }
+}
+
+/*!
+    Shows row \a row.
+
+    \sa hideRow() showColumn()
+*/
+
+void QTable::showRow( int row )
+{
+    int *h = d->hiddenRows.find( row );
+    if ( h ) {
+	int rh = *h;
+	d->hiddenRows.remove( row );
+	setRowHeight( row, rh );
+	if ( isRowStretchable(row) )
+	    leftHeader->numStretches++;
+    } else if ( rowHeight( row ) == 0 ) {
+	setRowHeight( row, 20 );
+    }
+    leftHeader->setResizeEnabled( TRUE, row );
+}
+
+/*!
+    Shows column \a col.
+
+    \sa hideColumn() showRow()
+*/
+
+void QTable::showColumn( int col )
+{
+    int *w = d->hiddenCols.find( col );
+    if ( w ) {
+	int cw = *w;
+	d->hiddenCols.remove( col );
+	setColumnWidth( col, cw );
+	if ( isColumnStretchable( col ) )
+	    topHeader->numStretches++;
+    } else if ( columnWidth( col ) == 0 ) {
+	setColumnWidth( col, 20 );
+    }
+    topHeader->setResizeEnabled( TRUE, col );
+}
+
+/*!
+    Returns TRUE if row \a row is hidden; otherwise returns
+    FALSE.
+
+    \sa hideRow(), isColumnHidden()
+*/
+bool QTable::isRowHidden( int row ) const
+{
+    return d->hiddenRows.find( row );
+}
+
+/*!
+    Returns TRUE if column \a col is hidden; otherwise returns
+    FALSE.
+
+    \sa hideColumn(), isRowHidden()
+*/
+bool QTable::isColumnHidden( int col ) const
+{
+    return d->hiddenCols.find( col );
+}
+
+/*!
+    Resizes column \a col to be \a w pixels wide.
+
+    \sa columnWidth() setRowHeight()
+*/
+
+void QTable::setColumnWidth( int col, int w )
+{
+    int *ow = d->hiddenCols.find( col );
+    if ( ow ) {
+	d->hiddenCols.replace( col, new int( w ) );
+    } else {
+	topHeader->resizeSection( col, w );
+	columnWidthChanged( col );
+    }
+}
+
+/*!
+    Resizes row \a row to be \a h pixels high.
+
+    \sa rowHeight() setColumnWidth()
+*/
+
+void QTable::setRowHeight( int row, int h )
+{
+    int *oh = d->hiddenRows.find( row );
+    if ( oh ) {
+	d->hiddenRows.replace( row, new int( h ) );
+    } else {
+	leftHeader->resizeSection( row, h );
+	rowHeightChanged( row );
+    }
+}
+
+/*!
+    Resizes column \a col so that the column width is wide enough to
+    display the widest item the column contains.
+
+    \sa adjustRow()
+*/
+
+void QTable::adjustColumn( int col )
+{
+    int w = topHeader->sectionSizeHint( col, fontMetrics() ).width();
+    if ( topHeader->iconSet( col ) )
+	w += topHeader->iconSet( col )->pixmap().width();
+    w = QMAX( w, 20 );
+    for ( int i = 0; i < numRows(); ++i ) {
+	QTableItem *itm = item( i, col );
+	if ( !itm ) {
+	    QWidget *widget = cellWidget( i, col );
+	    if ( widget )
+		w = QMAX( w, widget->sizeHint().width() );
+	} else {
+	    if ( itm->colSpan() > 1 )
+		w = QMAX( w, itm->sizeHint().width() / itm->colSpan() );
+	    else
+		w = QMAX( w, itm->sizeHint().width() );
+	}
+    }
+    w = QMAX( w, QApplication::globalStrut().width() );
+    setColumnWidth( col, w );
+}
+
+/*!
+    Resizes row \a row so that the row height is tall enough to
+    display the tallest item the row contains.
+
+    \sa adjustColumn()
+*/
+
+void QTable::adjustRow( int row )
+{
+    int h = 20;
+    h = QMAX( h, leftHeader->sectionSizeHint( row, leftHeader->fontMetrics() ).height() );
+    if ( leftHeader->iconSet( row ) )
+	h = QMAX( h, leftHeader->iconSet( row )->pixmap().height() );
+    for ( int i = 0; i < numCols(); ++i ) {
+	QTableItem *itm = item( row, i );
+	if ( !itm ) {
+	    QWidget *widget = cellWidget( row, i );
+	    if ( widget )
+		h = QMAX( h, widget->sizeHint().height() );
+	} else {
+	    if ( itm->rowSpan() > 1 )
+		h = QMAX( h, itm->sizeHint().height() / itm->rowSpan() );
+	    else
+		h = QMAX( h, itm->sizeHint().height() );
+	}
+    }
+    h = QMAX( h, QApplication::globalStrut().height() );
+    setRowHeight( row, h );
+}
+
+/*!
+    If \a stretch is TRUE, column \a col is set to be stretchable;
+    otherwise column \a col is set to be unstretchable.
+
+    If the table widget's width decreases or increases stretchable
+    columns will grow narrower or wider to fit the space available as
+    completely as possible. The user cannot manually resize stretchable
+    columns.
+
+    \sa isColumnStretchable() setRowStretchable() adjustColumn()
+*/
+
+void QTable::setColumnStretchable( int col, bool stretch )
+{
+    topHeader->setSectionStretchable( col, stretch );
+
+    if ( stretch && d->hiddenCols.find(col) )
+	topHeader->numStretches--;
+}
+
+/*!
+    If \a stretch is TRUE, row \a row is set to be stretchable;
+    otherwise row \a row is set to be unstretchable.
+
+    If the table widget's height decreases or increases stretchable
+    rows will grow shorter or taller to fit the space available as
+    completely as possible. The user cannot manually resize
+    stretchable rows.
+
+    \sa isRowStretchable() setColumnStretchable()
+*/
+
+void QTable::setRowStretchable( int row, bool stretch )
+{
+    leftHeader->setSectionStretchable( row, stretch );
+
+    if ( stretch && d->hiddenRows.find(row) )
+	leftHeader->numStretches--;
+}
+
+/*!
+    Returns TRUE if column \a col is stretchable; otherwise returns
+    FALSE.
+
+    \sa setColumnStretchable() isRowStretchable()
+*/
+
+bool QTable::isColumnStretchable( int col ) const
+{
+    return topHeader->isSectionStretchable( col );
+}
+
+/*!
+    Returns TRUE if row \a row is stretchable; otherwise returns
+    FALSE.
+
+    \sa setRowStretchable() isColumnStretchable()
+*/
+
+bool QTable::isRowStretchable( int row ) const
+{
+    return leftHeader->isSectionStretchable( row );
+}
+
+/*!
+    Takes the table item \a i out of the table. This function does \e
+    not delete the table item. You must either delete the table item
+    yourself or put it into a table (using setItem()) which will then
+    take ownership of it.
+
+    Use this function if you want to move an item from one cell in a
+    table to another, or to move an item from one table to another,
+    reinserting the item with setItem().
+
+    If you want to exchange two cells use swapCells().
+*/
+
+void QTable::takeItem( QTableItem *i )
+{
+    if ( !i )
+	return;
+    QRect rect = cellGeometry( i->row(), i->col() );
+    contents.setAutoDelete( FALSE );
+    int bottom = i->row() + i->rowSpan();
+    if ( bottom > numRows() )
+	bottom = numRows();
+    int right = i->col() + i->colSpan();
+    if ( right > numCols() )
+	right = numCols();
+    for ( int r = i->row(); r < bottom; ++r ) {
+	for ( int c = i->col(); c < right; ++c )
+	    contents.remove( indexOf( r, c ) );
+    }
+    contents.setAutoDelete( TRUE );
+    repaintContents( rect, FALSE );
+    int orow = i->row();
+    int ocol = i->col();
+    i->setRow( -1 );
+    i->setCol( -1 );
+    i->updateEditor( orow, ocol );
+    i->t = 0;
+}
+
+/*!
+    Sets the widget \a e to the cell at \a row, \a col and takes care of
+    placing and resizing the widget when the cell geometry changes.
+
+    By default widgets are inserted into a vector with numRows() *
+    numCols() elements. In very large tables you will probably want to
+    store the widgets in a data structure that consumes less memory (see
+    the notes on large tables). To support the use of your own data
+    structure this function calls insertWidget() to add the widget to
+    the internal data structure. To use your own data structure
+    reimplement insertWidget(), cellWidget() and clearCellWidget().
+
+    Cell widgets are created dynamically with the \c new operator. The
+    cell widgets are destroyed automatically once the table is
+    destroyed; the table takes ownership of the widget when using
+    setCellWidget.
+
+*/
+
+void QTable::setCellWidget( int row, int col, QWidget *e )
+{
+    if ( !e || row >= numRows() || col >= numCols() )
+	return;
+
+    QWidget *w = cellWidget( row, col );
+    if ( w && row == editRow && col == editCol )
+	endEdit( editRow, editCol, FALSE, edMode != Editing );
+
+    e->installEventFilter( this );
+    clearCellWidget( row, col );
+    if ( e->parent() != viewport() )
+	e->reparent( viewport(), QPoint( 0,0 ) );
+    insertWidget( row, col, e );
+    QRect cr = cellGeometry( row, col );
+    e->resize( cr.size() );
+    moveChild( e, cr.x(), cr.y() );
+    e->show();
+}
+
+/*!
+    Inserts widget \a w at \a row, \a col into the internal
+    data structure. See the documentation of setCellWidget() for
+    further details.
+
+    If you don't use \l{QTableItem}s you may need to reimplement this
+    function: see the notes on large tables.
+*/
+
+void QTable::insertWidget( int row, int col, QWidget *w )
+{
+    if ( row < 0 || col < 0 || row > numRows() - 1 || col > numCols() - 1 )
+	return;
+
+    if ( (int)widgets.size() != numRows() * numCols() )
+	widgets.resize( numRows() * numCols() );
+
+    widgets.insert( indexOf( row, col ), w );
+}
+
+/*!
+    Returns the widget that has been set for the cell at \a row, \a
+    col, or 0 if no widget has been set.
+
+    If you don't use \l{QTableItem}s you may need to reimplement this
+    function: see the notes on large tables.
+
+    \sa clearCellWidget() setCellWidget()
+*/
+
+QWidget *QTable::cellWidget( int row, int col ) const
+{
+    if ( row < 0 || col < 0 || row > numRows() - 1 || col > numCols() - 1 )
+	return 0;
+
+    if ( (int)widgets.size() != numRows() * numCols() )
+	( (QTable*)this )->widgets.resize( numRows() * numCols() );
+
+    return widgets[ indexOf( row, col ) ];
+}
+
+/*!
+    Removes the widget (if there is one) set for the cell at \a row,
+    \a col.
+
+    If you don't use \l{QTableItem}s you may need to reimplement this
+    function: see the notes on large tables.
+
+    This function deletes the widget at \a row, \a col. Note that the
+    widget is not deleted immediately; instead QObject::deleteLater()
+    is called on the widget to avoid problems with timing issues.
+
+    \sa cellWidget() setCellWidget()
+*/
+
+void QTable::clearCellWidget( int row, int col )
+{
+    if ( row < 0 || col < 0 || row > numRows() - 1 || col > numCols() - 1 )
+	return;
+
+    if ( (int)widgets.size() != numRows() * numCols() )
+	widgets.resize( numRows() * numCols() );
+
+    QWidget *w = cellWidget( row, col );
+    if ( w ) {
+	w->removeEventFilter( this );
+	w->deleteLater();
+    }
+    widgets.setAutoDelete( FALSE );
+    widgets.remove( indexOf( row, col ) );
+    widgets.setAutoDelete( TRUE );
+}
+
+/*!
+    \fn void QTable::dropped ( QDropEvent * e )
+
+    This signal is emitted when a drop event occurred on the table.
+
+    \a e contains information about the drop.
+*/
+
+/*!
+    If \a b is TRUE, the table starts a drag (see dragObject()) when
+    the user presses and moves the mouse on a selected cell.
+*/
+
+void QTable::setDragEnabled( bool b )
+{
+    dEnabled = b;
+}
+
+/*!
+    If this function returns TRUE, the table supports dragging.
+
+    \sa setDragEnabled();
+*/
+
+bool QTable::dragEnabled() const
+{
+    return dEnabled;
+}
+
+/*!
+    Inserts \a count empty rows at row \a row. Also clears the selection(s).
+
+    \sa insertColumns() removeRow()
+*/
+
+void QTable::insertRows( int row, int count )
+{
+    // special case, so a call like insertRow( currentRow(), 1 ) also
+    // works, when we have 0 rows and currentRow() is -1
+    if ( row == -1 && curRow == -1 )
+	row = 0;
+    if ( row < 0 || count <= 0 )
+	return;
+
+    if ( curRow >= row && curRow < row + count )
+	curRow = row + count;
+
+    --row;
+    if ( row >= numRows() )
+	return;
+
+    bool updatesEnabled = isUpdatesEnabled();
+    setUpdatesEnabled( FALSE );
+    bool leftHeaderUpdatesEnabled = leftHeader->isUpdatesEnabled();
+    leftHeader->setUpdatesEnabled( FALSE );
+    int oldLeftMargin = leftMargin();
+
+    setNumRows( numRows() + count );
+
+    for ( int i = numRows() - count - 1; i > row; --i )
+	leftHeader->swapSections( i, i + count );
+
+    leftHeader->setUpdatesEnabled( leftHeaderUpdatesEnabled );
+    setUpdatesEnabled( updatesEnabled );
+
+    int cr = QMAX( 0, currentRow() );
+    int cc = QMAX( 0, currentColumn() );
+    if ( curRow > row )
+	curRow -= count; // this is where curRow was
+    setCurrentCell( cr, cc, TRUE, FALSE ); // without ensureCellVisible
+
+    // Repaint the header
+    if ( leftHeaderUpdatesEnabled ) {
+	int y = rowPos( row ) - contentsY();
+	if ( leftMargin() != oldLeftMargin || d->hasRowSpan )
+	    y = 0; // full repaint
+	QRect rect( 0, y, leftHeader->width(), contentsHeight() );
+	leftHeader->update( rect );
+    }
+
+    if ( updatesEnabled ) {
+	int p = rowPos( row );
+	if ( d->hasRowSpan )
+	    p = contentsY();
+	updateContents( contentsX(), p, visibleWidth(), contentsHeight() + 1 );
+    }
+}
+
+/*!
+    Inserts \a count empty columns at column \a col.  Also clears the selection(s).
+
+    \sa insertRows() removeColumn()
+*/
+
+void QTable::insertColumns( int col, int count )
+{
+    // see comment in insertRows()
+    if ( col == -1 && curCol == -1 )
+	col = 0;
+    if ( col < 0 || count <= 0 )
+	return;
+
+    if ( curCol >= col && curCol < col + count )
+	curCol = col + count;
+
+    --col;
+    if ( col >= numCols() )
+	return;
+
+    bool updatesEnabled = isUpdatesEnabled();
+    setUpdatesEnabled( FALSE );
+    bool topHeaderUpdatesEnabled = topHeader->isUpdatesEnabled();
+    topHeader->setUpdatesEnabled( FALSE );
+    int oldTopMargin = topMargin();
+
+    setNumCols( numCols() + count );
+
+    for ( int i = numCols() - count - 1; i > col; --i )
+	topHeader->swapSections( i, i + count );
+
+    topHeader->setUpdatesEnabled( topHeaderUpdatesEnabled );
+    setUpdatesEnabled( updatesEnabled );
+
+    int cr = QMAX( 0, currentRow() );
+    int cc = QMAX( 0, currentColumn() );
+    if ( curCol > col )
+	curCol -= count; // this is where curCol was
+    setCurrentCell( cr, cc, TRUE, FALSE ); // without ensureCellVisible
+
+    // Repaint the header
+    if ( topHeaderUpdatesEnabled ) {
+	int x = columnPos( col ) - contentsX();
+	if ( topMargin() != oldTopMargin || d->hasColSpan )
+	    x = 0; // full repaint
+	QRect rect( x, 0, contentsWidth(), topHeader->height() );
+	topHeader->update( rect );
+    }
+
+    if ( updatesEnabled ) {
+	int p = columnPos( col );
+	if ( d->hasColSpan )
+	    p = contentsX();
+	updateContents( p, contentsY(), contentsWidth() + 1, visibleHeight() );
+    }
+}
+
+/*!
+    Removes row \a row, and deletes all its cells including any table
+    items and widgets the cells may contain. Also clears the selection(s).
+
+    \sa hideRow() insertRows() removeColumn() removeRows()
+*/
+
+void QTable::removeRow( int row )
+{
+    if ( row < 0 || row >= numRows() )
+	return;
+    if ( row < numRows() - 1 ) {
+	if (d->hiddenRows.find(row))
+	    d->hiddenRows.remove(row);
+
+	for ( int i = row; i < numRows() - 1; ++i )
+	    ( (QTableHeader*)verticalHeader() )->swapSections( i, i + 1 );
+    }
+    setNumRows( numRows() - 1 );
+}
+
+/*!
+    Removes the rows listed in the array \a rows, and deletes all their
+    cells including any table items and widgets the cells may contain.
+
+    The array passed in must only contain valid rows (in the range
+    from 0 to numRows() - 1) with no duplicates, and must be sorted in
+    ascending order. Also clears the selection(s).
+
+    \sa removeRow() insertRows() removeColumns()
+*/
+
+void QTable::removeRows( const QMemArray<int> &rows )
+{
+    if ( rows.count() == 0 )
+	return;
+    int i;
+    for ( i = 0; i < (int)rows.count() - 1; ++i ) {
+	for ( int j = rows[i] - i; j < rows[i + 1] - i - 1; j++ ) {
+	    ( (QTableHeader*)verticalHeader() )->swapSections( j, j + i + 1 );
+	}
+    }
+
+    for ( int j = rows[i] - i; j < numRows() - (int)rows.size(); j++)
+	( (QTableHeader*)verticalHeader() )->swapSections( j, j + rows.count() );
+
+    setNumRows( numRows() - rows.count() );
+}
+
+/*!
+    Removes column \a col, and deletes all its cells including any
+    table items and widgets the cells may contain. Also clears the
+    selection(s).
+
+    \sa removeColumns() hideColumn() insertColumns() removeRow()
+*/
+
+void QTable::removeColumn( int col )
+{
+    if ( col < 0 || col >= numCols() )
+	return;
+    if ( col < numCols() - 1 ) {
+	if (d->hiddenCols.find(col))
+	    d->hiddenCols.remove(col);
+
+	for ( int i = col; i < numCols() - 1; ++i )
+	    ( (QTableHeader*)horizontalHeader() )->swapSections( i, i + 1 );
+    }
+    setNumCols( numCols() - 1 );
+}
+
+/*!
+    Removes the columns listed in the array \a cols, and deletes all
+    their cells including any table items and widgets the cells may
+    contain.
+
+    The array passed in must only contain valid columns (in the range
+    from 0 to numCols() - 1) with no duplicates, and must be sorted in
+    ascending order. Also clears the selection(s).
+
+   \sa removeColumn() insertColumns() removeRows()
+*/
+
+void QTable::removeColumns( const QMemArray<int> &cols )
+{
+    if ( cols.count() == 0 )
+	return;
+    int i;
+    for ( i = 0; i < (int)cols.count() - 1; ++i ) {
+	for ( int j = cols[i] - i; j < cols[i + 1] - i - 1; j++ ) {
+	    ( (QTableHeader*)horizontalHeader() )->swapSections( j, j + i + 1 );
+	}
+    }
+
+    for ( int j = cols[i] - i; j < numCols() - (int)cols.size(); j++)
+	( (QTableHeader*)horizontalHeader() )->swapSections( j, j + cols.count() );
+
+    setNumCols( numCols() - cols.count() );
+}
+
+/*!
+    Starts editing the cell at \a row, \a col.
+
+    If \a replace is TRUE the content of this cell will be replaced by
+    the content of the editor when editing is finished, i.e. the user
+    will be entering new data; otherwise the current content of the
+    cell (if any) will be modified in the editor.
+
+    \sa beginEdit()
+*/
+
+void QTable::editCell( int row, int col, bool replace )
+{
+    if ( row < 0 || col < 0 || row > numRows() - 1 || col > numCols() - 1 )
+	return;
+
+    if ( beginEdit( row, col, replace ) ) {
+	edMode = Editing;
+	editRow = row;
+	editCol = col;
+    }
+}
+
+#ifndef QT_NO_DRAGANDDROP
+
+/*!
+    This event handler is called whenever a QTable object receives a
+    \l QDragEnterEvent \a e, i.e. when the user pressed the mouse
+    button to drag something.
+
+    The focus is moved to the cell where the QDragEnterEvent occurred.
+*/
+
+void QTable::contentsDragEnterEvent( QDragEnterEvent *e )
+{
+    oldCurrentRow = curRow;
+    oldCurrentCol = curCol;
+    int tmpRow = rowAt( e->pos().y() );
+    int tmpCol = columnAt( e->pos().x() );
+    fixRow( tmpRow, e->pos().y() );
+    fixCol( tmpCol, e->pos().x() );
+    if (e->source() != (QObject*)cellWidget( currentRow(), currentColumn() ) )
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+    e->accept();
+}
+
+/*!
+    This event handler is called whenever a QTable object receives a
+    \l QDragMoveEvent \a e, i.e. when the user actually drags the
+    mouse.
+
+    The focus is moved to the cell where the QDragMoveEvent occurred.
+*/
+
+void QTable::contentsDragMoveEvent( QDragMoveEvent *e )
+{
+    int tmpRow = rowAt( e->pos().y() );
+    int tmpCol = columnAt( e->pos().x() );
+    fixRow( tmpRow, e->pos().y() );
+    fixCol( tmpCol, e->pos().x() );
+    if (e->source() != (QObject*)cellWidget( currentRow(), currentColumn() ) )
+	setCurrentCell( tmpRow, tmpCol, FALSE, TRUE );
+    e->accept();
+}
+
+/*!
+    This event handler is called when a drag activity leaves \e this
+    QTable object with event \a e.
+*/
+
+void QTable::contentsDragLeaveEvent( QDragLeaveEvent * )
+{
+    setCurrentCell( oldCurrentRow, oldCurrentCol, FALSE, TRUE );
+}
+
+/*!
+    This event handler is called when the user ends a drag and drop by
+    dropping something onto \e this QTable and thus triggers the drop
+    event, \a e.
+*/
+
+void QTable::contentsDropEvent( QDropEvent *e )
+{
+    setCurrentCell( oldCurrentRow, oldCurrentCol, FALSE, TRUE );
+    emit dropped( e );
+}
+
+/*!
+    If the user presses the mouse on a selected cell, starts moving
+    (i.e. dragging), and dragEnabled() is TRUE, this function is
+    called to obtain a drag object. A drag using this object begins
+    immediately unless dragObject() returns 0.
+
+    By default this function returns 0. You might reimplement it and
+    create a QDragObject depending on the selected items.
+
+    \sa dropped()
+*/
+
+QDragObject *QTable::dragObject()
+{
+    return 0;
+}
+
+/*!
+    Starts a drag.
+
+    Usually you don't need to call or reimplement this function yourself.
+
+    \sa dragObject();
+*/
+
+void QTable::startDrag()
+{
+    if ( startDragRow == -1 || startDragCol == -1 )
+	return;
+
+    startDragRow = startDragCol = -1;
+
+    QDragObject *drag = dragObject();
+    if ( !drag )
+	return;
+
+    drag->drag();
+}
+
+#endif
+
+/*! \reimp */
+void QTable::windowActivationChange( bool oldActive )
+{
+    if ( oldActive && autoScrollTimer )
+	autoScrollTimer->stop();
+
+    if ( !isVisible() )
+	return;
+
+    if ( palette().active() != palette().inactive() )
+	updateContents();
+}
+
+/*! \reimp */
+void QTable::setEnabled( bool b )
+{
+    if ( !b ) {
+	// editor will lose focus, causing a crash deep in setEnabled(),
+	// so we'll end the edit early.
+	endEdit( editRow, editCol, TRUE, edMode != Editing );
+    }
+    QScrollView::setEnabled(b);
+}
+
+
+/*
+    \class QTableHeader
+    \brief The QTableHeader class allows for creation and manipulation
+    of table headers.
+\if defined(commercial)
+    It is part of the <a href="commercialeditions.html">Qt Enterprise Edition</a>.
+\endif
+
+    \ingroup advanced
+    \module table
+
+
+   QTable uses this subclass of QHeader for its headers. QTable has a
+   horizontalHeader() for displaying column labels, and a
+   verticalHeader() for displaying row labels.
+
+*/
+
+/*
+    \enum QTableHeader::SectionState
+
+    This enum type denotes the state of the header's text
+
+    \value Normal the default
+    \value Bold
+    \value Selected  typically represented by showing the section "sunken"
+    or "pressed in"
+*/
+
+/*!
+    Creates a new table header called \a name with \a i sections. It
+    is a child of widget \a parent and attached to table \a t.
+*/
+
+QTableHeader::QTableHeader( int i, QTable *t,
+			    QWidget *parent, const char *name )
+    : QHeader( i, parent, name ), mousePressed(FALSE), startPos(-1),
+      table( t ), caching( FALSE ), resizedSection(-1),
+      numStretches( 0 )
+{
+    setIsATableHeader( TRUE );
+    d = 0;
+    states.resize( i );
+    stretchable.resize( i );
+    states.fill( Normal, -1 );
+    stretchable.fill( FALSE, -1 );
+    autoScrollTimer = new QTimer( this );
+    connect( autoScrollTimer, SIGNAL( timeout() ),
+	     this, SLOT( doAutoScroll() ) );
+#ifndef NO_LINE_WIDGET
+    line1 = new QWidget( table->viewport(), "qt_line1" );
+    line1->hide();
+    line1->setBackgroundMode( PaletteText );
+    table->addChild( line1 );
+    line2 = new QWidget( table->viewport(), "qt_line2" );
+    line2->hide();
+    line2->setBackgroundMode( PaletteText );
+    table->addChild( line2 );
+#else
+    d = new QTableHeaderPrivate;
+    d->oldLinePos = -1; //outside, in contents coords
+#endif
+    connect( this, SIGNAL( sizeChange(int,int,int) ),
+	     this, SLOT( sectionWidthChanged(int,int,int) ) );
+    connect( this, SIGNAL( indexChange(int,int,int) ),
+	     this, SLOT( indexChanged(int,int,int) ) );
+
+    stretchTimer = new QTimer( this );
+    widgetStretchTimer = new QTimer( this );
+    connect( stretchTimer, SIGNAL( timeout() ),
+	     this, SLOT( updateStretches() ) );
+    connect( widgetStretchTimer, SIGNAL( timeout() ),
+	     this, SLOT( updateWidgetStretches() ) );
+    startPos = -1;
+}
+
+/*!
+    Adds a new section, \a size pixels wide (or high for vertical
+    headers) with the label \a s. If \a size is negative the section's
+    size is calculated based on the width (or height) of the label's
+    text.
+*/
+
+void QTableHeader::addLabel( const QString &s , int size )
+{
+    QHeader::addLabel( s, size );
+    if ( count() > (int)states.size() ) {
+	int s = states.size();
+	states.resize( count() );
+	stretchable.resize( count() );
+	for ( ; s < count(); ++s ) {
+	    states[ s ] = Normal;
+	    stretchable[ s ] = FALSE;
+	}
+    }
+}
+
+void QTableHeader::removeLabel( int section )
+{
+    QHeader::removeLabel( section );
+    if ( section == (int)states.size() - 1 ) {
+	states.resize( states.size() - 1 );
+	stretchable.resize( stretchable.size() - 1 );
+    }
+}
+
+void QTableHeader::resizeArrays( int n )
+{
+    int old = states.size();
+    states.resize( n );
+    stretchable.resize( n );
+    if ( n > old ) {
+	for ( int i = old; i < n; ++i ) {
+	    stretchable[ i ] = FALSE;
+	    states[ i ] = Normal;
+	}
+    }
+}
+
+void QTableHeader::setLabel( int section, const QString & s, int size )
+{
+    QHeader::setLabel( section, s, size );
+    sectionLabelChanged( section );
+}
+
+void QTableHeader::setLabel( int section, const QIconSet & iconset,
+			     const QString & s, int size )
+{
+    QHeader::setLabel( section, iconset, s, size );
+    sectionLabelChanged( section );
+}
+
+/*!
+    Sets the SectionState of section \a s to \a astate.
+
+    \sa sectionState()
+*/
+
+void QTableHeader::setSectionState( int s, SectionState astate )
+{
+    if ( s < 0 || s >= (int)states.count() )
+	return;
+    if ( states.data()[ s ] == astate )
+	return;
+    if ( isRowSelection( table->selectionMode() ) && orientation() == Horizontal )
+	return;
+
+    states.data()[ s ] = astate;
+    if ( isUpdatesEnabled() ) {
+	if ( orientation() == Horizontal )
+	    repaint( sectionPos( s ) - offset(), 0, sectionSize( s ), height(), FALSE );
+	else
+	    repaint( 0, sectionPos( s ) - offset(), width(), sectionSize( s ), FALSE );
+    }
+}
+
+void QTableHeader::setSectionStateToAll( SectionState state )
+{
+    if ( isRowSelection( table->selectionMode() ) && orientation() == Horizontal )
+	return;
+
+    register int *d = (int *) states.data();
+    int n = count();
+
+    while (n >= 4) {
+	d[0] = state;
+	d[1] = state;
+	d[2] = state;
+	d[3] = state;
+	d += 4;
+	n -= 4;
+    }
+
+    if (n > 0) {
+	d[0] = state;
+	if (n > 1) {
+	    d[1] = state;
+	    if (n > 2) {
+		d[2] = state;
+	    }
+	}
+    }
+}
+
+/*!
+    Returns the SectionState of section \a s.
+
+    \sa setSectionState()
+*/
+
+QTableHeader::SectionState QTableHeader::sectionState( int s ) const
+{
+    return (QTableHeader::SectionState)states[ s ];
+}
+
+/*! \reimp
+*/
+
+void QTableHeader::paintEvent( QPaintEvent *e )
+{
+    QPainter p( this );
+    p.setPen( colorGroup().buttonText() );
+    int pos = orientation() == Horizontal
+		     ? e->rect().left()
+		     : e->rect().top();
+    int id = mapToIndex( sectionAt( pos + offset() ) );
+    if ( id < 0 ) {
+	if ( pos > 0 )
+	    return;
+	else
+	    id = 0;
+    }
+
+    QRegion reg = e->region();
+    for ( int i = id; i < count(); i++ ) {
+	QRect r = sRect( i );
+	reg -= r;
+	p.save();
+	if ( !( orientation() == Horizontal && isRowSelection( table->selectionMode() ) ) &&
+	     ( sectionState( i ) == Bold || sectionState( i ) == Selected ) ) {
+	    QFont f( font() );
+	    f.setBold( TRUE );
+	    p.setFont( f );
+	}
+	paintSection( &p, i, r );
+	p.restore();
+	if ( orientation() == Horizontal && r. right() >= e->rect().right() ||
+	     orientation() == Vertical && r. bottom() >= e->rect().bottom() )
+	    return;
+    }
+    if ( !reg.isEmpty() )
+	erase( reg );
+}
+
+/*!
+    \reimp
+
+    Paints the header section with index \a index into the rectangular
+    region \a fr on the painter \a p.
+*/
+
+void QTableHeader::paintSection( QPainter *p, int index, const QRect& fr )
+{
+    int section = mapToSection( index );
+    if ( section < 0 || cellSize( section ) <= 0 )
+	return;
+
+   if ( sectionState( index ) != Selected ||
+	 orientation() == Horizontal && isRowSelection( table->selectionMode() ) ) {
+	QHeader::paintSection( p, index, fr );
+   } else {
+       QStyle::SFlags flags = QStyle::Style_Off | ( orient == Horizontal ? QStyle::Style_Horizontal : 0 );
+       if(isEnabled())
+	   flags |= QStyle::Style_Enabled;
+       if(isClickEnabled()) {
+	   if(sectionState(index) == Selected) {
+	       flags |= QStyle::Style_Down;
+	       if(!mousePressed)
+		   flags |= QStyle::Style_Sunken;
+	   }
+       }
+       if(!(flags & QStyle::Style_Down))
+	   flags |= QStyle::Style_Raised;
+       style().drawPrimitive( QStyle::PE_HeaderSection, p, QRect(fr.x(), fr.y(), fr.width(), fr.height()),
+			      colorGroup(), flags );
+       paintSectionLabel( p, index, fr );
+   }
+}
+
+static int real_pos( const QPoint &p, Qt::Orientation o )
+{
+    if ( o == Qt::Horizontal )
+	return p.x();
+    return p.y();
+}
+
+/*! \reimp
+*/
+
+void QTableHeader::mousePressEvent( QMouseEvent *e )
+{
+    if ( e->button() != LeftButton )
+	return;
+    QHeader::mousePressEvent( e );
+    mousePressed = TRUE;
+    pressPos = real_pos( e->pos(), orientation() );
+    if ( !table->currentSel || ( e->state() & ShiftButton ) != ShiftButton )
+	startPos = -1;
+    setCaching( TRUE );
+    resizedSection = -1;
+#ifdef QT_NO_CURSOR
+    isResizing = FALSE;
+#else
+    isResizing = cursor().shape() != ArrowCursor;
+    if ( !isResizing && sectionAt( pressPos ) != -1 )
+	doSelection( e );
+#endif
+}
+
+/*! \reimp
+*/
+
+void QTableHeader::mouseMoveEvent( QMouseEvent *e )
+{
+    if ( (e->state() & MouseButtonMask) != LeftButton // Using LeftButton simulates old behavior.
+#ifndef QT_NO_CURSOR
+         || cursor().shape() != ArrowCursor
+#endif
+         || ( ( e->state() & ControlButton ) == ControlButton &&
+              ( orientation() == Horizontal
+	     ? table->columnMovingEnabled() : table->rowMovingEnabled() ) ) ) {
+	QHeader::mouseMoveEvent( e );
+	return;
+    }
+
+    if ( !doSelection( e ) )
+	QHeader::mouseMoveEvent( e );
+}
+
+bool QTableHeader::doSelection( QMouseEvent *e )
+{
+    int p = real_pos( e->pos(), orientation() ) + offset();
+
+    if ( isRowSelection( table->selectionMode() ) ) {
+	if ( orientation() == Horizontal )
+	    return TRUE;
+	if ( table->selectionMode() == QTable::SingleRow ) {
+	    int secAt = sectionAt( p );
+	    if ( secAt == -1 )
+		return TRUE;
+	    table->setCurrentCell( secAt, table->currentColumn() );
+	    return TRUE;
+	}
+    }
+
+    if ( startPos == -1 ) {
+ 	int secAt = sectionAt( p );
+	if ( ( e->state() & ControlButton ) != ControlButton &&
+	     ( e->state() & ShiftButton ) != ShiftButton ||
+	     table->selectionMode() == QTable::Single ||
+	     table->selectionMode() == QTable::SingleRow ) {
+	    startPos = p;
+	    bool b = table->signalsBlocked();
+	    table->blockSignals( TRUE );
+	    table->clearSelection();
+	    table->blockSignals( b );
+	}
+	saveStates();
+
+	if ( table->selectionMode() != QTable::NoSelection ) {
+	    startPos = p;
+	    QTableSelection *oldSelection = table->currentSel;
+
+	    if ( orientation() == Vertical ) {
+		if ( !table->isRowSelected( secAt, TRUE ) ) {
+		    table->currentSel = new QTableSelection();
+		    table->selections.append( table->currentSel );
+		    table->currentSel->init( secAt, 0 );
+		    table->currentSel->expandTo( secAt, table->numCols() - 1 );
+		} else if ( table->currentSel ) {
+		    table->currentSel->init( secAt, 0 );
+		}
+		table->setCurrentCell( secAt, 0 );
+	    } else { // orientation == Horizontal
+		if ( !table->isColumnSelected( secAt, TRUE ) ) {
+		    table->currentSel = new QTableSelection();
+		    table->selections.append( table->currentSel );
+		    table->currentSel->init( 0, secAt );
+		    table->currentSel->expandTo( table->numRows() - 1, secAt );
+		} else if ( table->currentSel ) {
+		    table->currentSel->init( 0, secAt );
+		}
+		table->setCurrentCell( 0, secAt );
+	    }
+ 	    table->repaintSelections( oldSelection, table->currentSel,
+ 				      orientation() == Horizontal,
+ 				      orientation() == Vertical );
+	    if ( sectionAt( p ) != -1 )
+ 		endPos = p;
+ 	    return TRUE;
+	}
+    }
+    if ( sectionAt( p ) != -1 )
+	endPos = p;
+    if ( startPos != -1 ) {
+	updateSelections();
+	p -= offset();
+	if ( orientation() == Horizontal && ( p < 0 || p > width() ) ) {
+	    doAutoScroll();
+	    autoScrollTimer->start( 100, TRUE );
+	} else if ( orientation() == Vertical && ( p < 0 || p > height() ) ) {
+	    doAutoScroll();
+	    autoScrollTimer->start( 100, TRUE );
+	}
+	return TRUE;
+    }
+    return table->selectionMode() == QTable::NoSelection;
+}
+
+static inline bool mayOverwriteMargin( int before, int after )
+{
+    /*
+      0 is the only user value that we always respect. We also never
+      shrink a margin, in case the user wanted it that way.
+    */
+    return before != 0 && before < after;
+}
+
+void QTableHeader::sectionLabelChanged( int section )
+{
+    emit sectionSizeChanged( section );
+
+    // this does not really belong here
+    if ( orientation() == Horizontal ) {
+	int h = sizeHint().height();
+	if ( h != height() && mayOverwriteMargin(table->topMargin(), h) )
+	    table->setTopMargin( h );
+    } else {
+	int w = sizeHint().width();
+	if ( w != width() && mayOverwriteMargin( ( QApplication::reverseLayout() ? table->rightMargin() : table->leftMargin() ), w) )
+	    table->setLeftMargin( w );
+    }
+}
+
+/*! \reimp */
+void QTableHeader::mouseReleaseEvent( QMouseEvent *e )
+{
+    if ( e->button() != LeftButton )
+	return;
+    autoScrollTimer->stop();
+    mousePressed = FALSE;
+    setCaching( FALSE );
+    QHeader::mouseReleaseEvent( e );
+#ifndef NO_LINE_WIDGET
+    line1->hide();
+    line2->hide();
+#else
+    if ( d->oldLinePos >= 0 )
+	if ( orientation() == Horizontal )
+	    table->updateContents( d->oldLinePos, table->contentsY(),
+				   1, table->visibleHeight() );
+	else
+	    table->updateContents(  table->contentsX(), d->oldLinePos,
+				    table->visibleWidth(), 1 );
+    d->oldLinePos = -1;
+#endif
+    if ( resizedSection != -1 ) {
+	emit sectionSizeChanged( resizedSection );
+	updateStretches();
+    }
+
+    //Make sure all newly selected sections are painted one last time
+    QRect selectedRects;
+    for ( int i = 0; i < count(); i++ ) {
+	if(sectionState( i ) == Selected)
+	    selectedRects |= sRect( i );
+    }
+    if(!selectedRects.isNull())
+	repaint(selectedRects);
+}
+
+/*! \reimp
+*/
+
+void QTableHeader::mouseDoubleClickEvent( QMouseEvent *e )
+{
+    if ( e->button() != LeftButton )
+	return;
+    if ( isResizing ) {
+	int p = real_pos( e->pos(), orientation() ) + offset();
+	int section = sectionAt( p );
+	if ( section == -1 )
+	    return;
+	section--;
+	if ( p >= sectionPos( count() - 1 ) + sectionSize( count() - 1 ) )
+	    ++section;
+	while ( sectionSize( section ) == 0 )
+	    section--;
+	if ( section < 0 )
+	    return;
+	int oldSize = sectionSize( section );
+	if ( orientation() == Horizontal ) {
+	    table->adjustColumn( section );
+	    int newSize = sectionSize( section );
+	    if ( oldSize != newSize )
+		emit sizeChange( section, oldSize, newSize );
+	    for ( int i = 0; i < table->numCols(); ++i ) {
+		if ( table->isColumnSelected( i ) && sectionSize( i ) != 0 )
+		    table->adjustColumn( i );
+	    }
+	} else {
+	    table->adjustRow( section );
+	    int newSize = sectionSize( section );
+	    if ( oldSize != newSize )
+		emit sizeChange( section, oldSize, newSize );
+	    for ( int i = 0; i < table->numRows(); ++i ) {
+		if ( table->isRowSelected( i )  && sectionSize( i ) != 0 )
+		    table->adjustRow( i );
+	    }
+	}
+    }
+}
+
+/*! \reimp
+*/
+
+void QTableHeader::resizeEvent( QResizeEvent *e )
+{
+    stretchTimer->stop();
+    widgetStretchTimer->stop();
+    QHeader::resizeEvent( e );
+    if ( numStretches == 0 )
+	return;
+    stretchTimer->start( 0, TRUE );
+}
+
+void QTableHeader::updateStretches()
+{
+    if ( numStretches == 0 )
+	return;
+
+    int dim = orientation() == Horizontal ? width() : height();
+    if ( sectionPos(count() - 1) + sectionSize(count() - 1) == dim )
+	return;
+    int i;
+    int pd = dim - ( sectionPos(count() - 1)
+		     + sectionSize(count() - 1) );
+    bool block = signalsBlocked();
+    blockSignals( TRUE );
+    for ( i = 0; i < (int)stretchable.count(); ++i ) {
+	if ( !stretchable[i] ||
+	     ( stretchable[i] && table->d->hiddenCols[i] ) )
+	    continue;
+	pd += sectionSize( i );
+    }
+    pd /= numStretches;
+    for ( i = 0; i < (int)stretchable.count(); ++i ) {
+	if ( !stretchable[i] ||
+	     ( stretchable[i] && table->d->hiddenCols[i] ) )
+	    continue;
+	if ( i == (int)stretchable.count() - 1 &&
+	     sectionPos( i ) + pd < dim )
+	    pd = dim - sectionPos( i );
+	resizeSection( i, QMAX( 20, pd ) );
+    }
+    blockSignals( block );
+    table->repaintContents( FALSE );
+    widgetStretchTimer->start( 100, TRUE );
+}
+
+void QTableHeader::updateWidgetStretches()
+{
+    QSize s = table->tableSize();
+    table->resizeContents( s.width(), s.height() );
+    for ( int i = 0; i < table->numCols(); ++i )
+	table->updateColWidgets( i );
+}
+
+void QTableHeader::updateSelections()
+{
+    if ( table->selectionMode() == QTable::NoSelection ||
+	 (isRowSelection( table->selectionMode() ) && orientation() != Vertical  ) )
+	return;
+    int a = sectionAt( startPos );
+    int b = sectionAt( endPos );
+    int start = QMIN( a, b );
+    int end = QMAX( a, b );
+    register int *s = states.data();
+    for ( int i = 0; i < count(); ++i ) {
+	if ( i < start || i > end )
+	    *s = oldStates.data()[ i ];
+	else
+	    *s = Selected;
+	++s;
+    }
+    repaint( FALSE );
+
+    if (table->currentSel) {
+	QTableSelection oldSelection = *table->currentSel;
+	if ( orientation() == Vertical )
+	    table->currentSel->expandTo( b, table->horizontalHeader()->count() - 1 );
+	else
+	    table->currentSel->expandTo( table->verticalHeader()->count() - 1, b );
+	table->repaintSelections( &oldSelection, table->currentSel,
+				  orientation() == Horizontal,
+				  orientation() == Vertical );
+    }
+    emit table->selectionChanged();
+}
+
+void QTableHeader::saveStates()
+{
+    oldStates.resize( count() );
+    register int *s = states.data();
+    register int *s2 = oldStates.data();
+    for ( int i = 0; i < count(); ++i ) {
+	*s2 = *s;
+	++s2;
+	++s;
+    }
+}
+
+void QTableHeader::doAutoScroll()
+{
+    QPoint pos = mapFromGlobal( QCursor::pos() );
+    int p = real_pos( pos, orientation() ) + offset();
+    if ( sectionAt( p ) != -1 )
+	endPos = p;
+    if ( orientation() == Horizontal )
+	table->ensureVisible( endPos, table->contentsY() );
+    else
+	table->ensureVisible( table->contentsX(), endPos );
+    updateSelections();
+    autoScrollTimer->start( 100, TRUE );
+}
+
+void QTableHeader::sectionWidthChanged( int col, int, int )
+{
+    resizedSection = col;
+    if ( orientation() == Horizontal ) {
+#ifndef NO_LINE_WIDGET
+	table->moveChild( line1, QHeader::sectionPos( col ) - 1,
+			  table->contentsY() );
+	line1->resize( 1, table->visibleHeight() );
+	line1->show();
+	line1->raise();
+	table->moveChild( line2,
+			  QHeader::sectionPos( col ) + QHeader::sectionSize( col ) - 1,
+			  table->contentsY() );
+	line2->resize( 1, table->visibleHeight() );
+	line2->show();
+	line2->raise();
+#else
+	QPainter p( table->viewport() );
+	int lx = QHeader::sectionPos( col ) + QHeader::sectionSize( col ) - 1;
+	int ly = table->contentsY();
+
+	if ( lx != d->oldLinePos ) {
+	    QPoint pt = table->contentsToViewport( QPoint( lx, ly ) );
+	    p.drawLine( pt.x(), pt.y()+1,
+			pt.x(), pt.y()+ table->visibleHeight() );
+	    if ( d->oldLinePos >= 0 )
+		table->repaintContents( d->oldLinePos, table->contentsY(),
+				       1, table->visibleHeight() );
+
+	    d->oldLinePos = lx;
+	}
+#endif
+    } else {
+#ifndef NO_LINE_WIDGET
+	table->moveChild( line1, table->contentsX(),
+			  QHeader::sectionPos( col ) - 1 );
+	line1->resize( table->visibleWidth(), 1 );
+	line1->show();
+	line1->raise();
+	table->moveChild( line2, table->contentsX(),
+			  QHeader::sectionPos( col ) + QHeader::sectionSize( col ) - 1 );
+	line2->resize( table->visibleWidth(), 1 );
+	line2->show();
+	line2->raise();
+
+#else
+	QPainter p( table->viewport() );
+	int lx = table->contentsX();
+	int ly = QHeader::sectionPos( col ) + QHeader::sectionSize( col ) - 1;
+
+	if ( ly != d->oldLinePos ) {
+	    QPoint pt = table->contentsToViewport( QPoint( lx, ly ) );
+	    p.drawLine( pt.x()+1, pt.y(),
+			pt.x() + table->visibleWidth(), pt.y() );
+	    if ( d->oldLinePos >= 0 )
+		table->repaintContents(  table->contentsX(), d->oldLinePos,
+					table->visibleWidth(), 1 );
+	    d->oldLinePos = ly;
+	}
+
+#endif
+    }
+}
+
+/*!
+    \reimp
+
+    Returns the size of section \a section in pixels or -1 if \a
+    section is out of range.
+*/
+
+int QTableHeader::sectionSize( int section ) const
+{
+    if ( count() <= 0 || section < 0 || section >= count() )
+	return -1;
+    if ( caching && section < (int)sectionSizes.count() )
+	 return sectionSizes[ section ];
+    return QHeader::sectionSize( section );
+}
+
+/*!
+    \reimp
+
+    Returns the start position of section \a section in pixels or -1
+    if \a section is out of range.
+
+    \sa sectionAt()
+*/
+
+int QTableHeader::sectionPos( int section ) const
+{
+    if ( count() <= 0 || section < 0 || section >= count() )
+	return -1;
+    if ( caching && section < (int)sectionPoses.count() )
+	return sectionPoses[ section ];
+    return QHeader::sectionPos( section );
+}
+
+/*!
+    \reimp
+
+    Returns the number of the section at index position \a pos or -1
+    if there is no section at the position given.
+
+    \sa sectionPos()
+*/
+
+int QTableHeader::sectionAt( int pos ) const
+{
+    if ( !caching || sectionSizes.count() <= 0 || sectionPoses.count() <= 0 )
+	return QHeader::sectionAt( pos );
+    if ( count() <= 0 || pos > sectionPoses[ count() - 1 ] + sectionSizes[ count() - 1 ] )
+	return -1;
+    int l = 0;
+    int r = count() - 1;
+    int i = ( (l+r+1) / 2 );
+    while ( r - l ) {
+	if ( sectionPoses[i] > pos )
+	    r = i -1;
+	else
+	    l = i;
+	i = ( (l+r+1) / 2 );
+    }
+    if ( sectionPoses[i] <= pos &&
+	 pos <= sectionPoses[i] + sectionSizes[ mapToSection( i ) ] )
+	return mapToSection( i );
+    return -1;
+}
+
+void QTableHeader::updateCache()
+{
+    sectionPoses.resize( count() );
+    sectionSizes.resize( count() );
+    if ( !caching )
+	return;
+    for ( int i = 0; i < count(); ++i ) {
+	sectionSizes[ i ] = QHeader::sectionSize( i );
+	sectionPoses[ i ] = QHeader::sectionPos( i );
+    }
+}
+
+void QTableHeader::setCaching( bool b )
+{
+    if ( caching == b )
+	return;
+    caching = b;
+    sectionPoses.resize( count() );
+    sectionSizes.resize( count() );
+    if ( b ) {
+	for ( int i = 0; i < count(); ++i ) {
+	    sectionSizes[ i ] = QHeader::sectionSize( i );
+	    sectionPoses[ i ] = QHeader::sectionPos( i );
+	}
+    }
+}
+
+/*!
+    If \a b is TRUE, section \a s is stretchable; otherwise the
+    section is not stretchable.
+
+    \sa isSectionStretchable()
+*/
+
+void QTableHeader::setSectionStretchable( int s, bool b )
+{
+    if ( stretchable[ s ] == b )
+	return;
+    stretchable[ s ] = b;
+    if ( b )
+	numStretches++;
+    else
+	numStretches--;
+}
+
+/*!
+    Returns TRUE if section \a s is stretcheable; otherwise returns
+    FALSE.
+
+    \sa setSectionStretchable()
+*/
+
+bool QTableHeader::isSectionStretchable( int s ) const
+{
+    return stretchable[ s ];
+}
+
+void QTableHeader::swapSections( int oldIdx, int newIdx, bool swapTable )
+{
+    extern bool qt_qheader_label_return_null_strings; // qheader.cpp
+    qt_qheader_label_return_null_strings = TRUE;
+
+    QIconSet oldIconSet, newIconSet;
+    if ( iconSet( oldIdx ) )
+	oldIconSet = *iconSet( oldIdx );
+    if ( iconSet( newIdx ) )
+	newIconSet = *iconSet( newIdx );
+    QString oldLabel = label( oldIdx );
+    setLabel( oldIdx, newIconSet, label( newIdx ) );
+    setLabel( newIdx, oldIconSet, oldLabel );
+
+    qt_qheader_label_return_null_strings = FALSE;
+
+     int w1 = sectionSize( oldIdx );
+     int w2 = sectionSize( newIdx );
+     if ( w1 != w2 ) {
+	 resizeSection( oldIdx, w2 );
+	 resizeSection( newIdx, w1 );
+     }
+
+     if ( !swapTable )
+	 return;
+     if ( orientation() == Horizontal )
+	 table->swapColumns( oldIdx, newIdx );
+     else
+	 table->swapRows( oldIdx, newIdx );
+}
+
+void QTableHeader::indexChanged( int sec, int oldIdx, int newIdx )
+{
+    newIdx = mapToIndex( sec );
+    if ( oldIdx > newIdx )
+	moveSection( sec, oldIdx + 1 );
+    else
+	moveSection( sec, oldIdx );
+
+    if ( oldIdx < newIdx ) {
+	while ( oldIdx < newIdx ) {
+	    swapSections( oldIdx, oldIdx + 1 );
+	    oldIdx++;
+	}
+    } else {
+	while ( oldIdx > newIdx ) {
+	    swapSections( oldIdx - 1, oldIdx );
+	    oldIdx--;
+	}
+    }
+
+    table->repaintContents( table->contentsX(), table->contentsY(),
+			    table->visibleWidth(), table->visibleHeight() );
+}
+
+void QTableHeader::setLabels(const QStringList & labels)
+{
+    int i = 0;
+    bool updates = isUpdatesEnabled();
+    setUpdatesEnabled(FALSE);
+    for ( QStringList::ConstIterator it = labels.begin();
+	  it != labels.end() && i < count(); ++i, ++it ) {
+	if (i == (int)labels.count() - 1) {
+	    setUpdatesEnabled(updates);
+	    setLabel( i, *it );
+	} else {
+	    QHeader::setLabel( i, *it );
+	    emit sectionSizeChanged( i );
+	}
+    }
+}
+
+#include "qtable.moc"
+
+#endif // QT_NO_TABLE
