home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / qt3_emx.zip / examples / mdi / application.cpp next >
C/C++ Source or Header  |  2001-10-11  |  10KB  |  369 lines

  1. /****************************************************************************
  2. ** $Id:  qt/application.cpp   3.0.0   edited Sep 10 14:04 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include "application.h"
  12. #include <qworkspace.h>
  13. #include <qimage.h>
  14. #include <qpixmap.h>
  15. #include <qtoolbar.h>
  16. #include <qtoolbutton.h>
  17. #include <qpopupmenu.h>
  18. #include <qmenubar.h>
  19. #include <qmovie.h>
  20. #include <qmultilineedit.h>
  21. #include <qfile.h>
  22. #include <qfiledialog.h>
  23. #include <qlabel.h>
  24. #include <qstatusbar.h>
  25. #include <qmessagebox.h>
  26. #include <qprinter.h>
  27. #include <qapplication.h>
  28. #include <qpushbutton.h>
  29. #include <qaccel.h>
  30. #include <qtextstream.h>
  31. #include <qpainter.h>
  32. #include <qpaintdevicemetrics.h>
  33. #include <qwhatsthis.h>
  34. #include <qobjectlist.h>
  35. #include <qvbox.h>
  36.  
  37. #include "filesave.xpm"
  38. #include "fileopen.xpm"
  39. #include "fileprint.xpm"
  40.  
  41.  
  42. const char * fileOpenText = "Click this button to open a <em>new file</em>. <br><br>"
  43. "You can also select the <b>Open command</b> from the File menu.";
  44. const char * fileSaveText = "Click this button to save the file you are "
  45. "editing.  You will be prompted for a file name.\n\n"
  46. "You can also select the Save command from the File menu.\n\n"
  47. "Note that implementing this function is left as an exercise for the reader.";
  48. const char * filePrintText = "Click this button to print the file you "
  49. "are editing.\n\n"
  50. "You can also select the Print command from the File menu.";
  51.  
  52. ApplicationWindow::ApplicationWindow()
  53.     : QMainWindow( 0, "example application main window", WDestructiveClose )
  54. {
  55.     int id;
  56.  
  57.     QPixmap openIcon, saveIcon;
  58.  
  59.     fileTools = new QToolBar( this, "file operations" );
  60.     addToolBar( fileTools, tr( "File Operations" ), DockTop, TRUE );
  61.  
  62.     openIcon = QPixmap( fileopen );
  63.     QToolButton * fileOpen
  64.     = new QToolButton( openIcon, "Open File", QString::null,
  65.                this, SLOT(load()), fileTools, "open file" );
  66.  
  67.     saveIcon = QPixmap( filesave );
  68.     QToolButton * fileSave
  69.     = new QToolButton( saveIcon, "Save File", QString::null,
  70.                this, SLOT(save()), fileTools, "save file" );
  71.  
  72. #ifndef QT_NO_PRINTER
  73.     printer = new QPrinter;
  74.     QPixmap printIcon;
  75.  
  76.     printIcon = QPixmap( fileprint );
  77.     QToolButton * filePrint
  78.     = new QToolButton( printIcon, "Print File", QString::null,
  79.                this, SLOT(print()), fileTools, "print file" );
  80.     QWhatsThis::add( filePrint, filePrintText );
  81. #endif
  82.  
  83.     (void)QWhatsThis::whatsThisButton( fileTools );
  84.  
  85.     QWhatsThis::add( fileOpen, fileOpenText );
  86.     QWhatsThis::add( fileSave, fileSaveText );
  87.  
  88.     QPopupMenu * file = new QPopupMenu( this );
  89.     menuBar()->insertItem( "&File", file );
  90.  
  91.     file->insertItem( "&New", this, SLOT(newDoc()), CTRL+Key_N );
  92.  
  93.     id = file->insertItem( openIcon, "&Open...",
  94.                this, SLOT(load()), CTRL+Key_O );
  95.     file->setWhatsThis( id, fileOpenText );
  96.  
  97.     id = file->insertItem( saveIcon, "&Save",
  98.                this, SLOT(save()), CTRL+Key_S );
  99.     file->setWhatsThis( id, fileSaveText );
  100.     id = file->insertItem( "Save &As...", this, SLOT(saveAs()) );
  101.     file->setWhatsThis( id, fileSaveText );
  102. #ifndef QT_NO_PRINTER
  103.     file->insertSeparator();
  104.     id = file->insertItem( printIcon, "&Print...",
  105.                this, SLOT(print()), CTRL+Key_P );
  106.     file->setWhatsThis( id, filePrintText );
  107. #endif
  108.     file->insertSeparator();
  109.     file->insertItem( "&Close", this, SLOT(closeWindow()), CTRL+Key_W );
  110.     file->insertItem( "&Quit", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q );
  111.  
  112.     windowsMenu = new QPopupMenu( this );
  113.     windowsMenu->setCheckable( TRUE );
  114.     connect( windowsMenu, SIGNAL( aboutToShow() ),
  115.          this, SLOT( windowsMenuAboutToShow() ) );
  116.     menuBar()->insertItem( "&Windows", windowsMenu );
  117.  
  118.     menuBar()->insertSeparator();
  119.     QPopupMenu * help = new QPopupMenu( this );
  120.     menuBar()->insertItem( "&Help", help );
  121.  
  122.     help->insertItem( "&About", this, SLOT(about()), Key_F1);
  123.     help->insertItem( "About &Qt", this, SLOT(aboutQt()));
  124.     help->insertSeparator();
  125.     help->insertItem( "What's &This", this, SLOT(whatsThis()), SHIFT+Key_F1);
  126.  
  127.     QVBox* vb = new QVBox( this );
  128.     vb->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
  129.     ws = new QWorkspace( vb );
  130.     ws->setScrollBarsEnabled( TRUE );
  131.     setCentralWidget( vb );
  132.  
  133.     statusBar()->message( "Ready", 2000 );
  134. }
  135.  
  136.  
  137. ApplicationWindow::~ApplicationWindow()
  138. {
  139. #ifndef QT_NO_PRINTER
  140.     delete printer;
  141. #endif
  142. }
  143.  
  144.  
  145.  
  146. MDIWindow* ApplicationWindow::newDoc()
  147. {
  148.     MDIWindow* w = new MDIWindow( ws, 0, WDestructiveClose );
  149.     connect( w, SIGNAL( message(const QString&, int) ), statusBar(), SLOT( message(const QString&, int )) );
  150.     w->setCaption("unnamed document");
  151.     w->setIcon( QPixmap("document.xpm") );
  152.     // show the very first window in maximized mode
  153.     if ( ws->windowList().isEmpty() )
  154.     w->showMaximized();
  155.     else
  156.     w->show();
  157.     return w;
  158. }
  159.  
  160. void ApplicationWindow::load()
  161. {
  162.     QString fn = QFileDialog::getOpenFileName( QString::null, QString::null, this );
  163.     if ( !fn.isEmpty() ) {
  164.     MDIWindow* w = newDoc();
  165.     w->load( fn );
  166.     }  else {
  167.     statusBar()->message( "Loading aborted", 2000 );
  168.     }
  169. }
  170.  
  171. void ApplicationWindow::save()
  172. {
  173.     MDIWindow* m = (MDIWindow*)ws->activeWindow();
  174.     if ( m )
  175.     m->save();
  176. }
  177.  
  178.  
  179. void ApplicationWindow::saveAs()
  180. {
  181.     MDIWindow* m = (MDIWindow*)ws->activeWindow();
  182.     if ( m )
  183.     m->saveAs();
  184. }
  185.  
  186.  
  187. void ApplicationWindow::print()
  188. {
  189. #ifndef QT_NO_PRINTER
  190.     MDIWindow* m = (MDIWindow*)ws->activeWindow();
  191.     if ( m )
  192.     m->print( printer );
  193. #endif
  194. }
  195.  
  196.  
  197. void ApplicationWindow::closeWindow()
  198. {
  199.     MDIWindow* m = (MDIWindow*)ws->activeWindow();
  200.     if ( m )
  201.     m->close();
  202. }
  203.  
  204. void ApplicationWindow::about()
  205. {
  206.     QMessageBox::about( this, "Qt Application Example",
  207.             "This example demonstrates simple use of\n "
  208.             "Qt's Multiple Document Interface (MDI).");
  209. }
  210.  
  211.  
  212. void ApplicationWindow::aboutQt()
  213. {
  214.     QMessageBox::aboutQt( this, "Qt Application Example" );
  215. }
  216.  
  217.  
  218. void ApplicationWindow::windowsMenuAboutToShow()
  219. {
  220.     windowsMenu->clear();
  221.     int cascadeId = windowsMenu->insertItem("&Cascade", ws, SLOT(cascade() ) );
  222.     int tileId = windowsMenu->insertItem("&Tile", ws, SLOT(tile() ) );
  223.     if ( ws->windowList().isEmpty() ) {
  224.     windowsMenu->setItemEnabled( cascadeId, FALSE );
  225.     windowsMenu->setItemEnabled( tileId, FALSE );
  226.     }
  227.     windowsMenu->insertSeparator();
  228.     QWidgetList windows = ws->windowList();
  229.     for ( int i = 0; i < int(windows.count()); ++i ) {
  230.     int id = windowsMenu->insertItem(windows.at(i)->caption(),
  231.                      this, SLOT( windowsMenuActivated( int ) ) );
  232.     windowsMenu->setItemParameter( id, i );
  233.     windowsMenu->setItemChecked( id, ws->activeWindow() == windows.at(i) );
  234.     }
  235. }
  236.  
  237. void ApplicationWindow::windowsMenuActivated( int id )
  238. {
  239.     QWidget* w = ws->windowList().at( id );
  240.     if ( w )
  241.     w->showNormal();
  242.     w->setFocus();
  243. }
  244.  
  245. MDIWindow::MDIWindow( QWidget* parent, const char* name, int wflags )
  246.     : QMainWindow( parent, name, wflags )
  247. {
  248.     mmovie = 0;
  249.     medit = new QMultiLineEdit( this );
  250.     setFocusProxy( medit );
  251.     setCentralWidget( medit );
  252. }
  253.  
  254. MDIWindow::~MDIWindow()
  255. {
  256.     delete mmovie;
  257. }
  258.  
  259.  
  260. void MDIWindow::load( const QString& fn )
  261. {
  262.     filename  = fn;
  263.     QFile f( filename );
  264.     if ( !f.open( IO_ReadOnly ) )
  265.     return;
  266.  
  267.     if(fn.contains(".gif")) {
  268.     QWidget * tmp=new QWidget(this);
  269.     setFocusProxy(tmp);
  270.     setCentralWidget(tmp);
  271.     medit->hide();
  272.     delete medit;
  273.     QMovie * qm=new QMovie(fn);
  274. #ifdef Q_WS_QWS // temporary speed-test hack
  275.     qm->setDisplayWidget(tmp);
  276. #endif
  277.     tmp->setBackgroundMode(QWidget::NoBackground);
  278.     tmp->show();
  279.     mmovie=qm;
  280.     } else {
  281.     mmovie = 0;
  282.  
  283.     QTextStream t(&f);
  284.     QString s = t.read();
  285.     medit->setText( s );
  286.     f.close();
  287.  
  288.  
  289.     }
  290.     setCaption( filename );
  291.     emit message( QString("Loaded document %1").arg(filename), 2000 );
  292. }
  293.  
  294. void MDIWindow::save()
  295. {
  296.     if ( filename.isEmpty() ) {
  297.         saveAs();
  298.         return;
  299.     }
  300.  
  301.     QString text = medit->text();
  302.     QFile f( filename );
  303.     if ( !f.open( IO_WriteOnly ) ) {
  304.         emit message( QString("Could not write to %1").arg(filename),
  305.               2000 );
  306.         return;
  307.     }
  308.  
  309.     QTextStream t( &f );
  310.     t << text;
  311.     f.close();
  312.  
  313.     setCaption( filename );
  314.  
  315.     emit message( QString( "File %1 saved" ).arg( filename ), 2000 );
  316. }
  317.  
  318. void MDIWindow::saveAs()
  319. {
  320.     QString fn = QFileDialog::getSaveFileName( filename, QString::null, this );
  321.     if ( !fn.isEmpty() ) {
  322.         filename = fn;
  323.         save();
  324.     } else {
  325.         emit message( "Saving aborted", 2000 );
  326.     }
  327. }
  328.  
  329. void MDIWindow::print( QPrinter* printer)
  330. {
  331. #ifndef QT_NO_PRINTER
  332.     const int Margin = 10;
  333.     int pageNo = 1;
  334.  
  335.     if ( printer->setup(this) ) {        // printer dialog
  336.     emit message( "Printing...", 0 );
  337.     QPainter p;
  338.     if ( !p.begin( printer ) )
  339.         return;                // paint on printer
  340.     p.setFont( medit->font() );
  341.     int yPos        = 0;            // y position for each line
  342.     QFontMetrics fm = p.fontMetrics();
  343.     QPaintDeviceMetrics metrics( printer ); // need width/height
  344.     // of printer surface
  345.     for( int i = 0 ; i < medit->numLines() ; i++ ) {
  346.         if ( Margin + yPos > metrics.height() - Margin ) {
  347.         QString msg( "Printing (page " );
  348.         msg += QString::number( ++pageNo );
  349.         msg += ")...";
  350.         emit message( msg, 0 );
  351.         printer->newPage();        // no more room on this page
  352.         yPos = 0;            // back to top of page
  353.         }
  354.         p.drawText( Margin, Margin + yPos,
  355.             metrics.width(), fm.lineSpacing(),
  356.             ExpandTabs | DontClip,
  357.             medit->textLine( i ) );
  358.         yPos = yPos + fm.lineSpacing();
  359.     }
  360.     p.end();                // send job to printer
  361.     emit message( "Printing completed", 2000 );
  362.     } else {
  363.     emit message( "Printing aborted", 2000 );
  364.     }
  365. #endif
  366. }
  367.  
  368.  
  369.