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 QList<KScribbleDoc>();
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 } |