Das K Desktop Environment

A.4. kscribble.cpp

   1 /***************************************************************************
   2                           kscribble.cpp  -  description
   3                              -------------------
   4     begin                : Mon Jan 31 11:05:05 CET 2000
   5     copyright            : (C) 2000 by Ralf Nolden
   6     email                : Ralf.Nolden@post.rwth-aachen.de
   7  ***************************************************************************/
   8 
   9 /***************************************************************************
  10  *                                                                         *
  11  *   This program is free software; you can redistribute it and/or modify  *
  12  *   it under the terms of the GNU General Public License as published by  *
  13  *   the Free Software Foundation; either version 2 of the License, or     *
  14  *   (at your option) any later version.                                   *
  15  *                                                                         *
  16  ***************************************************************************/
  17 
  18 // include files for QT
  19 #include qdir.h
  20 #include qprinter.h
  21 #include qvbox.h
  22 #include qwhatsthis.h
  23 #include qtooltip.h
  24 #include qtoolbutton.h
  25 #include qimage.h
  26 #include qdragobject.h
  27 
  28 
  29 // include files for KDE
  30 #include kiconloader.h
  31 #include kmessagebox.h
  32 #include kfiledialog.h
  33 #include kcolordlg.h
  34 #include kmenubar.h
  35 #include klocale.h
  36 #include kconfig.h
  37 
  38 // application specific includes
  39 #include "kscribble.h"
  40 #include "kscribbleview.h"
  41 #include "kscribbledoc.h"
  42 #include "resource.h"
  43 #include "kpenbrushdlg.h"
  44 
  45 
  46 KScribbleApp::KScribbleApp()
  47 {
  48   config=kapp-config();
  49   printer = new QPrinter;
  50   untitledCount=0;
  51   pDocList = new QListKScribbleDoc();
  52   pDocList-setAutoDelete(true);
  53   setAcceptDrops(true);
  54 
  55   ///////////////////////////////////////////////////////////////////
  56   // call inits to invoke all other construction parts
  57   initMenuBar();
  58   initToolBar();
  59   initStatusBar();
  60   initKeyAccel();
  61   initView();
  62   
  63   readOptions();
  64 
  65   ///////////////////////////////////////////////////////////////////
  66   // disable menu and toolbar items at startup
  67   disableCommand(ID_EDIT_UNDO);
  68 }
  69 
  70 KScribbleApp::~KScribbleApp()
  71 {
  72   delete printer;
  73 }
  74 
  75 void KScribbleApp::initKeyAccel()
  76 {
  77   keyAccel = new KAccel(this);
  78   
  79   // fileMenu accelerators
  80   keyAccel-connectItem(KStdAccel::New, this, SLOT(slotFileNew()));
  81   keyAccel-connectItem(KStdAccel::Open, this, SLOT(slotFileOpen()));
  82   keyAccel-connectItem(KStdAccel::Save, this, SLOT(slotFileSave()));
  83   keyAccel-connectItem(KStdAccel::Close, this, SLOT(slotFileClose()));
  84   keyAccel-connectItem(KStdAccel::Print, this, SLOT(slotFilePrint()));
  85   keyAccel-connectItem(KStdAccel::Quit, this, SLOT(slotFileQuit()));
  86   // editMenu accelerators
  87   keyAccel-connectItem(KStdAccel::Cut, this, SLOT(slotEditCut()));
  88   keyAccel-connectItem(KStdAccel::Copy, this, SLOT(slotEditCopy()));
  89   keyAccel-connectItem(KStdAccel::Paste, this, SLOT(slotEditPaste()));
  90 
  91   keyAccel-connectItem(KStdAccel::Help, this, SLOT(appHelpActivated()));
  92       
  93   keyAccel-changeMenuAccel(pFileMenu, ID_FILE_NEW, KStdAccel::New);
  94   keyAccel-changeMenuAccel(pFileMenu, ID_FILE_OPEN, KStdAccel::Open);
  95   keyAccel-changeMenuAccel(pFileMenu, ID_FILE_SAVE, KStdAccel::Save);
  96   keyAccel-changeMenuAccel(pFileMenu, ID_FILE_CLOSE, KStdAccel::Close);
  97   keyAccel-changeMenuAccel(pFileMenu, ID_FILE_PRINT, KStdAccel::Print);
  98   keyAccel-changeMenuAccel(pFileMenu, ID_FILE_QUIT, KStdAccel::Quit);
  99 
 100   keyAccel-changeMenuAccel(pEditMenu, ID_EDIT_CUT, KStdAccel::Cut);
 101   keyAccel-changeMenuAccel(pEditMenu, ID_EDIT_COPY, KStdAccel::Copy);
 102   keyAccel-changeMenuAccel(pEditMenu, ID_EDIT_PASTE, KStdAccel::Paste);
 103 
 104   keyAccel-readSettings();  
 105 }
 106 
 107 void KScribbleApp::initMenuBar()
 108 {
 109   ///////////////////////////////////////////////////////////////////
 110   // MENUBAR
 111   pRecentFileMenu = new QPopupMenu(this);
 112   connect(pRecentFileMenu, SIGNAL(activated(int)), SLOT(slotFileOpenRecent(int)));
 113 
 114   ///////////////////////////////////////////////////////////////////
 115   // menuBar entry file-Menu
 116   pFileMenu = new QPopupMenu(this);
 117   pFileMenu-insertItem(BarIcon("filenew"), i18n("&;New"), ID_FILE_NEW);
 118   pFileMenu-insertItem(BarIcon("fileopen"), i18n("&;Open..."), ID_FILE_OPEN);
 119   pFileMenu-insertItem(i18n("Open &;recent"), pRecentFileMenu, ID_FILE_OPEN_RECENT);
 120 
 121   pFileMenu-insertItem(i18n("&;Close"), ID_FILE_CLOSE);
 122   pFileMenu-insertSeparator();
 123   pFileMenu-insertItem(BarIcon("filefloppy") ,i18n("&;Save"), ID_FILE_SAVE);
 124   pFileMenu-insertItem(i18n("Save &;As..."), ID_FILE_SAVE_AS);
 125   pFileMenu-insertSeparator();
 126   pFileMenu-insertItem(BarIcon("fileprint"), i18n("&;Print..."), ID_FILE_PRINT);
 127   pFileMenu-insertSeparator();
 128   pFileMenu-insertItem(i18n("E&;xit"), ID_FILE_QUIT);
 129   
 130   ///////////////////////////////////////////////////////////////////
 131   // menuBar entry edit-Menu
 132   pEditMenu = new QPopupMenu(this);
 133   pEditMenu-insertItem(BarIcon("undo"), i18n("&;Undo"), ID_EDIT_UNDO);
 134   pEditMenu-insertSeparator();
 135   pEditMenu-insertItem(BarIcon("editcut"), i18n("Cu&;t"), ID_EDIT_CUT);
 136   pEditMenu-insertItem(BarIcon("editcopy"), i18n("&;Copy"), ID_EDIT_COPY);
 137   pEditMenu-insertItem(BarIcon("editpaste"), i18n("&;Paste"), ID_EDIT_PASTE);
 138   pEditMenu-insertItem(BarIcon("delete"),i18n("&;Clear All"), ID_EDIT_CLEAR_ALL);
 139 
 140   ///////////////////////////////////////////////////////////////////
 141   // menuBar entry pen-Menu
 142   pPenMenu = new QPopupMenu();
 143   pPenMenu-insertItem(i18n("&;Color"), ID_PEN_COLOR);
 144   pPenMenu-insertItem(i18n("&;Brush"), ID_PEN_BRUSH);
 145 
 146   ///////////////////////////////////////////////////////////////////
 147   // menuBar entry view-Menu
 148   pViewMenu = new QPopupMenu(this);
 149   pViewMenu-setCheckable(true);
 150   pViewMenu-insertItem(i18n("&;Toolbar"), ID_VIEW_TOOLBAR);
 151   pViewMenu-insertItem(i18n("&;Statusbar"), ID_VIEW_STATUSBAR);
 152 
 153   ///////////////////////////////////////////////////////////////////
 154   // menuBar entry window-Menu
 155   pWindowMenu = new QPopupMenu(this);
 156   pWindowMenu-setCheckable(true);
 157 
 158 
 159   ///////////////////////////////////////////////////////////////////
 160   // menuBar entry helpMenu
 161   QPopupMenu* pHelpMenu = helpMenu(i18n("KScribble" VERSION "\n\n(c) 2000 by\n"
 162                                   "Ralf Nolden\nRalf.Nolden@post.rwth-aachen.de"));
 163 
 164   ///////////////////////////////////////////////////////////////////
 165   // MENUBAR CONFIGURATION
 166   // insert your popup menus with the according menubar entries in the order
 167   // they will appear later from left to right
 168   menuBar()-insertItem(i18n("&;File"), pFileMenu);
 169   menuBar()-insertItem(i18n("&;Edit"), pEditMenu);
 170   menuBar()-insertItem(i18n("&;Pen"), pPenMenu);
 171   menuBar()-insertItem(i18n("&;View"), pViewMenu);
 172   menuBar()-insertItem(i18n("&;Window"), pWindowMenu );
 173   menuBar()-insertItem(i18n("&;Help"), pHelpMenu);
 174 
 175   ///////////////////////////////////////////////////////////////////
 176   // CONNECT THE MENU SLOTS WITH SIGNALS
 177   // for execution slots and statusbar messages
 178   connect(pFileMenu, SIGNAL(activated(int)), SLOT(commandCallback(int)));
 179   connect(pFileMenu, SIGNAL(highlighted(int)), SLOT(statusCallback(int)));
 180 
 181   connect(pEditMenu, SIGNAL(activated(int)), SLOT(commandCallback(int)));
 182   connect(pEditMenu, SIGNAL(highlighted(int)), SLOT(statusCallback(int)));
 183 
 184   connect(pPenMenu, SIGNAL(activated(int)), SLOT(commandCallback(int)));
 185   connect(pPenMenu, SIGNAL(highlighted(int)), SLOT(statusCallback(int)));
 186 
 187   connect(pViewMenu, SIGNAL(activated(int)), SLOT(commandCallback(int)));
 188   connect(pViewMenu, SIGNAL(highlighted(int)), SLOT(statusCallback(int)));
 189 
 190   connect(pWindowMenu, SIGNAL(aboutToShow() ), SLOT( windowMenuAboutToShow() ) );
 191   connect(pWindowMenu, SIGNAL(activated(int)), SLOT(commandCallback(int)));
 192   connect(pWindowMenu, SIGNAL(highlighted(int)), SLOT(statusCallback(int)));
 193 
 194 }
 195 
 196 void KScribbleApp::initToolBar()
 197 {
 198 
 199   ///////////////////////////////////////////////////////////////////
 200   // TOOLBAR
 201   toolBar()-insertButton(BarIcon("filenew"), ID_FILE_NEW, true, i18n("New File"));
 202   toolBar()-insertButton(BarIcon("fileopen"), ID_FILE_OPEN, true, i18n("Open File"));
 203   toolBar()-insertButton(BarIcon("filefloppy"), ID_FILE_SAVE, true, i18n("Save File"));
 204   toolBar()-insertButton(BarIcon("fileprint"), ID_FILE_PRINT, true, i18n("Print"));
 205   toolBar()-insertSeparator();
 206   toolBar()-insertButton(BarIcon("editcut"), ID_EDIT_CUT, true, i18n("Cut"));
 207   toolBar()-insertButton(BarIcon("editcopy"), ID_EDIT_COPY, true, i18n("Copy"));
 208   toolBar()-insertButton(BarIcon("editpaste"), ID_EDIT_PASTE, true, i18n("Paste"));
 209   toolBar()-insertSeparator();
 210   toolBar()-insertButton(BarIcon("pencolor"), ID_PEN_COLOR, true, i18n("Color") );
 211   toolBar()-insertButton(BarIcon("penwidth"), ID_PEN_BRUSH, true, i18n("Width") );
 212   toolBar()-insertSeparator();
 213   toolBar()-insertButton(BarIcon("help"), ID_HELP_CONTENTS, SIGNAL(clicked()),
 214           this, SLOT(appHelpActivated()), true,i18n("Help"));
 215 
 216   QToolButton *btnwhat = QWhatsThis::whatsThisButton(toolBar());
 217   QToolTip::add(btnwhat, i18n("What's this...?"));
 218   toolBar()-insertWidget(ID_HELP_WHATS_THIS, btnwhat-sizeHint().width(), btnwhat);
 219 
 220   ///////////////////////////////////////////////////////////////////
 221   // INSERT YOUR APPLICATION SPECIFIC TOOLBARS HERE WITH toolBar(n)
 222 
 223 
 224   ///////////////////////////////////////////////////////////////////
 225   // CONNECT THE TOOLBAR SLOTS WITH SIGNALS - add new created toolbars by their according number
 226   // connect for invoking the slot actions
 227   connect(toolBar(), SIGNAL(clicked(int)), SLOT(commandCallback(int)));
 228   // connect for the status help on holing icons pressed with the mouse button
 229   connect(toolBar(), SIGNAL(pressed(int)), SLOT(statusCallback(int)));
 230 
 231 }
 232 
 233 void KScribbleApp::initStatusBar()
 234 {
 235   ///////////////////////////////////////////////////////////////////
 236   // STATUSBAR
 237   // TODO: add your own items you need for displaying current application status.
 238   statusBar()-insertItem(i18n("Ready."), ID_STATUS_MSG);
 239 }
 240 
 241 
 242 void KScribbleApp::initView()
 243 {
 244   ////////////////////////////////////////////////////////////////////
 245   // here the main view of the KTMainWindow is created by a background box and
 246   // the QWorkspace instance for MDI view.
 247   QVBox* view_back = new QVBox( this );
 248   view_back-setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
 249   pWorkspace = new QWorkspace( view_back );
 250   connect(pWorkspace, SIGNAL(windowActivated(QWidget*)), this, SLOT(setWndTitle(QWidget*)));
 251   setView(view_back);
 252 }
 253 
 254 void KScribbleApp::setWndTitle(QWidget*){
 255   setCaption(pWorkspace-activeWindow()-caption());
 256 }
 257 
 258 void KScribbleApp::enableCommand(int id_)
 259 {
 260   ///////////////////////////////////////////////////////////////////
 261   // enable menu and toolbar functions by their ID's
 262   menuBar()-setItemEnabled(id_, true);
 263   toolBar()-setItemEnabled(id_, true);
 264 }
 265 
 266 void KScribbleApp::disableCommand(int id_)
 267 {
 268   ///////////////////////////////////////////////////////////////////
 269   // disable menu and toolbar functions by their ID's
 270   menuBar()-setItemEnabled(id_, false);
 271   toolBar()-setItemEnabled(id_, false);
 272 }
 273 
 274 void KScribbleApp::addRecentFile(const QString &;file)
 275 {
 276   if(recentFiles.contains(file))
 277     return; // it's already there
 278 
 279   if( recentFiles.count()  5)
 280     recentFiles.prepend(file);
 281   else{
 282     recentFiles.remove(recentFiles.last());
 283     recentFiles.prepend(file);
 284   }
 285 
 286   pRecentFileMenu-clear();
 287 
 288   for ( int i =0 ; i  (int)recentFiles.count(); i++){
 289     pRecentFileMenu-insertItem(recentFiles.at(i));
 290   }
 291 
 292 }
 293 
 294 void KScribbleApp::createClient(KScribbleDoc* doc)
 295 {
 296   KScribbleView* w = new KScribbleView(doc, pWorkspace,0,WDestructiveClose);
 297   w-installEventFilter(this);
 298   doc-addView(w);
 299   w-setIcon(kapp-miniIcon());
 300   if ( pWorkspace-windowList().isEmpty() ) // show the very first window in maximized mode
 301     w-showMaximized();
 302   else
 303     w-show();
 304 }
 305 
 306 void KScribbleApp::openDocumentFile(const char* file)
 307 {
 308   slotStatusMsg(i18n("Opening file..."));
 309   KScribbleDoc* doc;
 310   // check, if document already open. If yes, set the focus to the first view
 311   for(doc=pDocList-first(); doc  0; doc=pDocList-next())
 312   {
 313     if(doc-pathName()==file)
 314     {
 315        KScribbleView* view=doc-firstView();  
 316        view-setFocus();
 317        return;
 318      }
 319   }
 320   doc = new KScribbleDoc();
 321   pDocList-append(doc);
 322   doc-newDocument();
 323   // Creates an untitled window if file is 0  
 324   if(!file)
 325   {
 326     untitledCount+=1;
 327     QString fileName=QString(i18n("Untitled%1")).arg(untitledCount);
 328     doc-setPathName(fileName);
 329     doc-setTitle(fileName);
 330   }
 331   // Open the file
 332   else
 333   {
 334     QString format=QImageIO::imageFormat(file);
 335     if(!doc-openDocument(file,format))
 336       KMessageBox::error (this,i18n("Could not open document !"), i18n("Error !"));
 337     addRecentFile(file);
 338   }
 339   // create the window
 340   createClient(doc);
 341 
 342   slotStatusMsg(i18n("Ready."));
 343 }
 344 
 345 
 346 void KScribbleApp::saveOptions()
 347 {  
 348   config-setGroup("General Options");
 349   config-writeEntry("Geometry", size());
 350   config-writeEntry("Show Toolbar", toolBar()-isVisible());
 351   config-writeEntry("Show Statusbar",statusBar()-isVisible());
 352   config-writeEntry("ToolBarPos", (int) toolBar()-barPos());
 353   config-writeEntry("Recent Files", recentFiles);
 354 }
 355 
 356 
 357 void KScribbleApp::readOptions()
 358 {
 359   
 360   config-setGroup("General Options");
 361 
 362   // bar status settings
 363   bool bViewToolbar = config-readBoolEntry("Show Toolbar", true);
 364   menuBar()-setItemChecked(ID_VIEW_TOOLBAR, bViewToolbar);
 365   if(!bViewToolbar)
 366   {
 367      enableToolBar(KToolBar::Hide);
 368   }
 369   
 370   bool bViewStatusbar = config-readBoolEntry("Show Statusbar", true);
 371   menuBar()-setItemChecked(ID_VIEW_STATUSBAR, bViewStatusbar);
 372   if(!bViewStatusbar)
 373   {
 374     enableStatusBar(KStatusBar::Hide);
 375   }
 376 
 377   // bar position settings
 378   KToolBar::BarPosition toolBarPos;
 379   toolBarPos=(KToolBar::BarPosition) config-readNumEntry("ToolBarPos", KToolBar::Top);
 380   toolBar()-setBarPos(toolBarPos);
 381 
 382   // initialize the recent file list
 383   config-readListEntry("Recent Files",recentFiles);
 384 
 385   for (int i=0; i  (int) recentFiles.count(); i++)
 386   {
 387     pRecentFileMenu-insertItem(recentFiles.at(i));
 388   }
 389 
 390   QSize size=config-readSizeEntry("Geometry");
 391   if(!size.isEmpty())
 392   {
 393     resize(size);
 394   }
 395   else
 396     resize(400,350);
 397 
 398 }
 399 
 400 void KScribbleApp::saveProperties(KConfig *_cfg)
 401 {
 402 
 403 }
 404 
 405 
 406 void KScribbleApp::readProperties(KConfig* _cfg)
 407 {
 408 }    
 409 
 410 bool KScribbleApp::queryClose()
 411 {
 412 
 413   QStringList saveFiles;
 414   KScribbleDoc* doc;
 415   if(pDocList-isEmpty())
 416     return true;
 417 
 418   for(doc=pDocList-first(); doc!=0;doc=pDocList-next()){
 419     if(doc-isModified())
 420       saveFiles.append(doc-title());
 421   }
 422   if(saveFiles.isEmpty())
 423     return true;
 424         
 425   switch (KMessageBox::questionYesNoList(this,
 426       i18n("One or more documents have been modified.\nSave changes before exiting?"),saveFiles))     
 427   {
 428     case KMessageBox::Yes:
 429       for(doc=pDocList-first(); doc!=0;doc=pDocList-next()){
 430         if(doc-title().contains(i18n("Untitled")))
 431           slotFileSaveAs();
 432         else
 433         {
 434           if(!doc-saveDocument(doc-pathName())){
 435             KMessageBox::error (this,i18n("Could not save the current document !"), i18n("I/O Error !"));
 436             return false;
 437           }
 438         }
 439        }
 440       return true;
 441     case KMessageBox::No:
 442     default:
 443       return true;
 444   }
 445 }
 446 
 447 bool KScribbleApp::queryExit()
 448 {
 449   saveOptions();
 450   return true;
 451 }
 452 
 453 bool KScribbleApp::eventFilter(QObject* object, QEvent* event){
 454   if(event-type() == QEvent::Close)
 455   {
 456     QCloseEvent* e=(QCloseEvent*)event;
 457     KScribbleView* pView=(KScribbleView*)object;
 458     KScribbleDoc* pDoc=pView-getDocument();
 459     if(pDoc-canCloseFrame(pView))
 460     {
 461        pDoc-removeView(pView);
 462        if(!pDoc-firstView())
 463          pDocList-remove(pDoc);
 464        
 465       e-accept();
 466       //////////////  
 467       if(pWorkspace-windowList().count()==1)
 468         setPlainCaption(kapp-caption());
 469       else
 470         setCaption(pWorkspace-activeWindow()-caption());      
 471       //////////////
 472     }
 473     else
 474       e-ignore();
 475   }
 476   return QWidget::eventFilter( object, event );    // standard event processing
 477 }
 478 
 479 /////////////////////////////////////////////////////////////////////
 480 // SLOT IMPLEMENTATION
 481 /////////////////////////////////////////////////////////////////////
 482 
 483 
 484 void KScribbleApp::slotFileNew()
 485 {
 486   slotStatusMsg(i18n("Creating new document..."));
 487 
 488   openDocumentFile();
 489 
 490   slotStatusMsg(i18n("Ready."));
 491 }
 492 
 493 void KScribbleApp::slotFileOpen()
 494 {
 495   slotStatusMsg(i18n("Opening file..."));
 496   
 497   QString fileToOpen=KFileDialog::getOpenFileName(QDir::currentDirPath(),
 498             KImageIO::pattern(KImageIO::Reading), this, i18n("Open File..."));
 499   if(!fileToOpen.isEmpty())
 500   {
 501     openDocumentFile(fileToOpen);    
 502   }
 503 
 504   slotStatusMsg(i18n("Ready."));
 505 }
 506 
 507 void KScribbleApp::slotFileOpenRecent(int id_)
 508 {
 509   slotStatusMsg(i18n("Opening file..."));
 510     
 511   openDocumentFile(pRecentFileMenu-text(id_));
 512   
 513   slotStatusMsg(i18n("Ready."));
 514 }
 515 
 516 void KScribbleApp::slotFileSave()
 517 {
 518   slotStatusMsg(i18n("Saving file..."));
 519   KScribbleView* m = (KScribbleView*)pWorkspace-activeWindow();
 520   if( m )
 521   {
 522     KScribbleDoc* doc =  m-getDocument();
 523     if(doc-title().contains(i18n("Untitled")))
 524      slotFileSaveAs();
 525     else
 526       if(!doc-saveDocument(doc-pathName()))
 527         KMessageBox::error (this,i18n("Could not save the current document !"), i18n("I/O Error !"));
 528   }
 529   
 530 
 531   slotStatusMsg(i18n("Ready."));
 532 }
 533 
 534 void KScribbleApp::slotFileSaveAs()
 535 {
 536   slotStatusMsg(i18n("Saving file with a new filename..."));
 537 
 538   QString newName=KFileDialog::getSaveFileName(QDir::currentDirPath(),
 539                                KImageIO::pattern(KImageIO::Writing), this, i18n("Save as..."));
 540   if(!newName.isEmpty())
 541   {
 542     KScribbleView* m = (KScribbleView*)pWorkspace-activeWindow();
 543     if( m )
 544     {
 545       KScribbleDoc* doc =  m-getDocument();
 546       QString format=QFileInfo(newName).extension();
 547       format=format.upper();
 548       if(!doc-saveDocument(newName,format))
 549       {
 550         KMessageBox::error (this,i18n("Could not save the current document !"), i18n("I/O Error !"));
 551         return;
 552       }
 553       doc-changedViewList();
 554       setWndTitle(m);
 555     }
 556     
 557   }
 558 
 559   slotStatusMsg(i18n("Ready."));
 560 }
 561 
 562 void KScribbleApp::slotFileClose()
 563 {
 564   slotStatusMsg(i18n("Closing file..."));
 565   
 566   KScribbleView* m = (KScribbleView*)pWorkspace-activeWindow();
 567   if( m )
 568   {
 569     KScribbleDoc* doc=m-getDocument();
 570     doc-closeDocument();
 571   }
 572 
 573   
 574   slotStatusMsg(i18n("Ready."));
 575 }
 576 
 577 void KScribbleApp::slotFilePrint()
 578 {
 579   slotStatusMsg(i18n("Printing..."));
 580   
 581   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 582   if ( m )
 583     m-print( printer );
 584 
 585   slotStatusMsg(i18n("Ready."));
 586 }
 587 
 588 void KScribbleApp::slotFileQuit()
 589 {
 590   slotStatusMsg(i18n("Exiting..."));
 591   saveOptions();
 592   // close the first window, the list makes the next one the first again.
 593   // This ensures that queryClose() is called on each window to ask for closing
 594   KTMainWindow* w;
 595   if(memberList)
 596   {
 597     for(w=memberList-first(); w!=0; w=memberList-first())
 598     {
 599       // only close the window if the closeEvent is accepted. If the user
 600       // presses Cancel on the saveModified() dialog,
 601       // the window and the application stay open.
 602       if(!w-close())
 603       break;
 604     }
 605   }  
 606   slotStatusMsg(i18n("Ready."));
 607 }
 608 
 609 void KScribbleApp::slotEditUndo()
 610 {
 611   slotStatusMsg(i18n("Reverting last action..."));
 612   
 613   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 614   if ( m )
 615 //    m-undo();
 616 
 617   slotStatusMsg(i18n("Ready."));
 618 }
 619 
 620 void KScribbleApp::slotEditCut()
 621 {
 622   slotStatusMsg(i18n("Cutting selection..."));
 623   
 624   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 625   if ( m )
 626     m-cutSelection();  
 627 
 628   slotStatusMsg(i18n("Ready."));
 629 }
 630 
 631 void KScribbleApp::slotEditCopy()
 632 {
 633   slotStatusMsg(i18n("Copying selection to clipboard..."));
 634   
 635   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 636   if ( m )
 637     m-copySelection();
 638     
 639   slotStatusMsg(i18n("Ready."));
 640 }
 641 
 642 void KScribbleApp::slotEditPaste()
 643 {
 644   slotStatusMsg(i18n("Inserting clipboard contents..."));
 645   
 646   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 647   if ( m )
 648     m-pasteSelection();
 649     
 650   slotStatusMsg(i18n("Ready."));
 651 }
 652 
 653 void KScribbleApp::slotEditClearAll()
 654 {
 655   slotStatusMsg(i18n("Clearing the document contents..."));
 656   
 657   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 658   if ( m ){
 659     KScribbleDoc* pDoc = m-getDocument();
 660     pDoc-editClearAll();
 661   }
 662   slotStatusMsg(i18n("Ready."));
 663 }
 664 
 665 void KScribbleApp::slotPenBrush()
 666 {
 667   slotStatusMsg(i18n("Setting brush width..."));
 668 
 669   // get one window with document for a current pen width
 670   QWidgetList windows = pWorkspace-windowList();
 671   KScribbleView* m = (KScribbleView*)windows.at(0);
 672   KScribbleDoc* pDoc = m-getDocument();
 673   int curr_width=pDoc-penWidth();
 674 
 675   // create the dialog, get the new width and set the pen width for all documents
 676   KPenBrushDlg* dlg= new KPenBrushDlg(curr_width,this);
 677   if(dlg-exec()){
 678     int width=dlg-width();
 679     for ( int i = 0; i  int(windows.count()); ++i )
 680     {
 681       m = (KScribbleView*)windows.at(i);
 682       if ( m )
 683       {
 684         pDoc = m-getDocument();
 685         pDoc-setPenWidth(width);
 686       }
 687     }
 688   }
 689   slotStatusMsg(i18n("Ready."));
 690 }
 691 
 692 void KScribbleApp::slotPenColor()
 693 {
 694   slotStatusMsg(i18n("Selecting pen color..."));
 695 
 696   QColor myColor;
 697   int result = KColorDialog::getColor( myColor, this );
 698   if ( result == KColorDialog::Accepted )
 699   {
 700     QWidgetList windows = pWorkspace-windowList();
 701     KScribbleDoc* pDoc;
 702     KScribbleView* m;
 703     for ( int i = 0; i  int(windows.count()); ++i )
 704     {
 705       m = (KScribbleView*)windows.at(i);
 706       if ( m )
 707       {
 708         pDoc = m-getDocument();
 709         pDoc-setPenColor(myColor);
 710       }
 711     }
 712   }
 713   slotStatusMsg(i18n("Ready."));
 714 }
 715 
 716 
 717 void KScribbleApp::slotViewToolBar()
 718 {
 719   slotStatusMsg(i18n("Toggle the toolbar..."));
 720   ///////////////////////////////////////////////////////////////////
 721   // turn Toolbar on or off
 722   if( menuBar()-isItemChecked(ID_VIEW_TOOLBAR))
 723   {
 724     menuBar()-setItemChecked(ID_VIEW_TOOLBAR, false);
 725     enableToolBar(KToolBar::Hide);
 726   }
 727   else
 728   {
 729     menuBar()-setItemChecked(ID_VIEW_TOOLBAR, true);
 730     enableToolBar(KToolBar::Show);
 731   }    
 732 
 733   slotStatusMsg(i18n("Ready."));
 734 }
 735 
 736 void KScribbleApp::slotViewStatusBar()
 737 {
 738   slotStatusMsg(i18n("Toggle the statusbar..."));
 739   ///////////////////////////////////////////////////////////////////
 740   //turn Statusbar on or off
 741   if( menuBar()-isItemChecked(ID_VIEW_STATUSBAR))
 742   {
 743     menuBar()-setItemChecked(ID_VIEW_STATUSBAR, false);
 744     enableStatusBar(KStatusBar::Hide);
 745   }
 746   else
 747   {
 748     menuBar()-setItemChecked(ID_VIEW_STATUSBAR, true);
 749     enableStatusBar(KStatusBar::Show);
 750   }
 751 
 752   slotStatusMsg(i18n("Ready."));
 753 }
 754 
 755 void KScribbleApp::slotWindowNewWindow()
 756 {
 757   slotStatusMsg(i18n("Opening a new application window..."));
 758   
 759   KScribbleView* m = (KScribbleView*) pWorkspace-activeWindow();
 760   if ( m ){
 761      KScribbleDoc* doc = m-getDocument();
 762     createClient(doc);
 763   }
 764 
 765   slotStatusMsg(i18n("Ready."));
 766 }
 767 
 768 void KScribbleApp::slotStatusMsg(const QString &;text)
 769 {
 770   ///////////////////////////////////////////////////////////////////
 771   // change status message permanently
 772   statusBar()-clear();
 773   statusBar()-changeItem(text, ID_STATUS_MSG);
 774 }
 775 
 776 
 777 void KScribbleApp::slotStatusHelpMsg(const QString &;text)
 778 {
 779   ///////////////////////////////////////////////////////////////////
 780   // change status message of whole statusbar temporary (text, msec)
 781   statusBar()-message(text, 2000);
 782 }
 783 
 784 void KScribbleApp::windowMenuAboutToShow()
 785 {
 786   pWindowMenu-clear();
 787   
 788   pWindowMenu-insertItem(i18n("&;New Window"), ID_WINDOW_NEW_WINDOW);
 789   pWindowMenu-insertItem(i18n("&;Cascade"),
 790                           pWorkspace, SLOT(cascade() ),0 , ID_WINDOW_CASCADE );
 791   pWindowMenu-insertItem(i18n("&;Tile"),
 792                           pWorkspace, SLOT(tile() ),0 , ID_WINDOW_TILE );
 793   
 794   if ( pWorkspace-windowList().isEmpty() ) {
 795     disableCommand(ID_WINDOW_NEW_WINDOW);
 796     disableCommand(ID_WINDOW_CASCADE);
 797     disableCommand(ID_WINDOW_TILE);
 798   }
 799   
 800   pWindowMenu-insertSeparator();
 801   
 802   QWidgetList windows = pWorkspace-windowList();
 803   for ( int i = 0; i  int(windows.count()); ++i ) {
 804     int id = pWindowMenu-insertItem(QString("&;%1 ").arg(i+1)+windows.at(i)-caption(),
 805                                      this, SLOT( windowMenuActivated( int ) ) );
 806     pWindowMenu-setItemParameter( id, i );
 807     pWindowMenu-setItemChecked( id, pWorkspace-activeWindow() == windows.at(i) );
 808   }
 809 }
 810 
 811 void KScribbleApp::windowMenuActivated( int id )
 812 {
 813   QWidget* w = pWorkspace-windowList().at( id );
 814   if ( w )
 815     w-setFocus();
 816 }
 817 
 818 
 819 void KScribbleApp::commandCallback(int id_)
 820 {
 821   switch (id_)
 822   {
 823     case ID_FILE_NEW:
 824        slotFileNew();
 825          break;
 826 
 827     case ID_FILE_OPEN:
 828          slotFileOpen();
 829          break;
 830 
 831     case ID_FILE_SAVE:
 832          slotFileSave();
 833          break;
 834 
 835     case ID_FILE_SAVE_AS:
 836          slotFileSaveAs();
 837          break;
 838 
 839     case ID_FILE_CLOSE:
 840          slotFileClose();
 841          break;
 842 
 843     case ID_FILE_PRINT:
 844          slotFilePrint();
 845          break;
 846 
 847     case ID_FILE_QUIT:
 848          slotFileQuit();
 849          break;
 850 
 851     case ID_EDIT_CUT:
 852          slotEditCut();
 853          break;
 854 
 855     case ID_EDIT_COPY:
 856          slotEditCopy();
 857          break;
 858 
 859     case ID_EDIT_PASTE:
 860          slotEditPaste();
 861          break;
 862 
 863     case ID_EDIT_CLEAR_ALL:
 864          slotEditClearAll();
 865          break;
 866 
 867     case ID_PEN_BRUSH:
 868          slotPenBrush();
 869          break;
 870 
 871     case ID_PEN_COLOR:
 872          slotPenColor();
 873          break;
 874 
 875     case ID_VIEW_TOOLBAR:
 876          slotViewToolBar();
 877          break;
 878 
 879     case ID_VIEW_STATUSBAR:
 880          slotViewStatusBar();
 881          break;
 882 
 883     case ID_WINDOW_NEW_WINDOW:
 884          slotWindowNewWindow();
 885        break;
 886 
 887     default:
 888          break;
 889   }
 890 }
 891 
 892 void KScribbleApp::statusCallback(int id_)
 893 {
 894   switch (id_)
 895   {
 896     case ID_FILE_NEW:
 897          slotStatusHelpMsg(i18n("Creates a new document"));
 898          break;
 899 
 900     case ID_FILE_OPEN:
 901          slotStatusHelpMsg(i18n("Opens an existing document"));
 902          break;
 903 
 904     case ID_FILE_OPEN_RECENT:
 905          slotStatusHelpMsg(i18n("Opens a recently used file"));
 906          break;
 907 
 908     case ID_FILE_SAVE:
 909          slotStatusHelpMsg(i18n("Saves the currently active document"));
 910          break;
 911 
 912     case ID_FILE_SAVE_AS:
 913          slotStatusHelpMsg(i18n("Saves the currently active document as under a new filename"));
 914          break;
 915 
 916     case ID_FILE_CLOSE:
 917          slotStatusHelpMsg(i18n("Closes the currently active document"));
 918          break;
 919 
 920     case ID_FILE_PRINT:
 921          slotStatusHelpMsg(i18n("Prints out the actual document"));
 922          break;
 923 
 924     case ID_FILE_QUIT:
 925          slotStatusHelpMsg(i18n("Quits the application"));
 926          break;
 927 
 928     case ID_EDIT_UNDO:
 929          slotStatusHelpMsg(i18n("Reverts the last editing action"));
 930          break;
 931 
 932     case ID_EDIT_CUT:
 933          slotStatusHelpMsg(i18n("Cuts the selected section and puts it to the clipboard"));
 934          break;
 935 
 936     case ID_EDIT_COPY:
 937          slotStatusHelpMsg(i18n("Copies the selected section to the clipboard"));
 938          break;
 939 
 940     case ID_EDIT_PASTE:
 941          slotStatusHelpMsg(i18n("Pastes the clipboard contents to actual position"));
 942          break;
 943 
 944     case ID_EDIT_CLEAR_ALL:
 945          slotStatusHelpMsg(i18n("Clears the document contents"));
 946          break;
 947 
 948     case ID_PEN_BRUSH:
 949          slotStatusHelpMsg(i18n("Sets the pen width"));
 950          break;
 951 
 952     case ID_PEN_COLOR:
 953          slotStatusHelpMsg(i18n("Sets the current pen color"));
 954          break;
 955 
 956     case ID_VIEW_TOOLBAR:
 957          slotStatusHelpMsg(i18n("Enables/disables the toolbar"));
 958          break;
 959 
 960     case ID_VIEW_STATUSBAR:
 961          slotStatusHelpMsg(i18n("Enables/disables the statusbar"));
 962          break;
 963 
 964     case ID_WINDOW_NEW_WINDOW:
 965          slotStatusHelpMsg(i18n("Opens a new view for the current document"));
 966          break;
 967 
 968     case ID_WINDOW_CASCADE:
 969          slotStatusHelpMsg(i18n("Cascades all windows"));
 970          break;
 971 
 972     case ID_WINDOW_TILE:
 973          slotStatusHelpMsg(i18n("Tiles all windows"));
 974          break;
 975 
 976     default:
 977          break;
 978   }
 979 }
 980 /** accepts drops and opens a new document
 981 for each drop */
 982 void KScribbleApp::dropEvent( QDropEvent* e){
 983 
 984   QImage img;
 985   if ( QImageDrag::decode(e, img) )
 986   {
 987     KScribbleDoc* doc = new KScribbleDoc();
 988     untitledCount+=1;
 989     QString fileName=QString(i18n("Untitled%1")).arg(untitledCount);
 990     doc-setPathName(fileName);
 991     doc-setTitle(fileName);
 992     doc-newDocument();
 993     pDocList-append(doc);
 994     KPixmap tmp;
 995     tmp.resize(img.size());
 996     tmp.convertFromImage(img);
 997     doc-setPixmap(tmp);
 998     doc-resizeDocument(tmp.size());
 999     doc-setModified();
 1000     createClient(doc);
 1001   }
 1002 }
 1003 /** accepts drag events for images */
 1004 void KScribbleApp::dragEnterEvent( QDragEnterEvent* e){
 1005   e-accept(QImageDrag::canDecode(e));
 1006 }