00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <koMainWindow.h>
00021 #include <koDocument.h>
00022 #include <koView.h>
00023 #include <koFilterManager.h>
00024 #include <koDocumentInfo.h>
00025 #include <koDocumentInfoDlg.h>
00026 #include <koQueryTrader.h>
00027 #include "KoMainWindowIface.h"
00028
00029 #include <kprinter.h>
00030 #include <qobjectlist.h>
00031
00032 #include <kdeversion.h>
00033 #include <kstdaction.h>
00034 #include <kapplication.h>
00035 #include <kfiledialog.h>
00036 #include <kfilefiltercombo.h>
00037 #include <kmessagebox.h>
00038 #include <kstandarddirs.h>
00039 #include <kio/netaccess.h>
00040 #include <kkeydialog.h>
00041 #include <kedittoolbar.h>
00042 #include <kprogress.h>
00043 #include <kpushbutton.h>
00044 #include <kdebug.h>
00045 #if ! KDE_IS_VERSION( 3,1,90 )
00046 #include <kdebugclasses.h>
00047 #endif
00048 #include <ktempfile.h>
00049 #include <krecentdocument.h>
00050 #include <kparts/partmanager.h>
00051 #include <kparts/plugin.h>
00052 #include <kparts/event.h>
00053
00054 #include <unistd.h>
00055 #include <stdlib.h>
00056 #include <klocale.h>
00057 #include <kstatusbar.h>
00058
00059 #if KDE_IS_VERSION(3,1,90)
00060 # include <kglobalsettings.h>
00061 #endif
00062
00063 class KoPartManager : public KParts::PartManager
00064 {
00065 public:
00066 KoPartManager( QWidget * parent, const char * name = 0L )
00067 : KParts::PartManager( parent, name ) {}
00068 KoPartManager( QWidget *topLevel, QObject *parent, const char *name = 0L )
00069 : KParts::PartManager( topLevel, parent, name ) {}
00070 virtual bool eventFilter( QObject *obj, QEvent *ev )
00071 {
00072 if ( !obj->isWidgetType() || obj->inherits( "KoFrame" ) )
00073 return false;
00074 return KParts::PartManager::eventFilter( obj, ev );
00075 }
00076 };
00077
00078
00079
00080 class KoFileDialog : public KFileDialog
00081 {
00082 public:
00083 KoFileDialog(const QString& startDir, const QString& filter,
00084 QWidget *parent, const char *name,
00085 bool modal)
00086 : KFileDialog( startDir, filter, parent, name, modal ) { }
00087
00088 void setSpecialMimeFilter( QStringList& mimeFilter,
00089 const QString& currentFormat, const int specialOutputFlag,
00090 const QString& nativeFormat )
00091 {
00092 Q_ASSERT( !mimeFilter.isEmpty() );
00093 Q_ASSERT( mimeFilter[0] == nativeFormat );
00094
00095
00096 QStringList::Iterator mimeFilterIt = mimeFilter.at( 1 );
00097 mimeFilter.insert( mimeFilterIt , 2, nativeFormat );
00098
00099
00100
00101
00102 setMimeFilter( mimeFilter, currentFormat.isEmpty() ? nativeFormat : currentFormat );
00103
00104
00105 KMimeType::Ptr type = KMimeType::mimeType( nativeFormat );
00106 filterWidget->changeItem( i18n("%1 (KOffice-1.1 Format)").arg( type->comment() ), KoDocument::SaveAsKOffice1dot1 );
00107 filterWidget->changeItem( i18n("%1 (Uncompressed XML Files)").arg( type->comment() ), KoDocument::SaveAsDirectoryStore );
00108
00109
00110 if (currentFormat == nativeFormat || currentFormat.isEmpty())
00111
00112 filterWidget->setCurrentItem( specialOutputFlag );
00113
00114
00115 int i = 0;
00116 for (mimeFilterIt = mimeFilter.begin (); mimeFilterIt != mimeFilter.end (); mimeFilterIt++, i++)
00117 {
00118 KMimeType::Ptr mime = KMimeType::mimeType (*mimeFilterIt);
00119 QString compatString = mime->property ("X-KDE-CompatibleApplication").toString ();
00120 if (!compatString.isEmpty ())
00121 filterWidget->changeItem (i18n ("%1 (%2 Compatible)").arg (mime->comment ()).arg (compatString), i);
00122 }
00123 }
00124
00125 int specialEntrySelected()
00126 {
00127 int i = filterWidget->currentItem();
00128
00129 if ( i == KoDocument::SaveAsKOffice1dot1 || i == KoDocument::SaveAsDirectoryStore )
00130 return i;
00131 return 0;
00132 }
00133
00134 };
00135
00136 class KoMainWindowPrivate
00137 {
00138 public:
00139 KoMainWindowPrivate()
00140 {
00141 m_rootDoc = 0L;
00142 m_manager = 0L;
00143 bMainWindowGUIBuilt = false;
00144 m_forQuit=false;
00145 m_splitted=false;
00146 m_activePart = 0L;
00147 m_activeView = 0L;
00148 m_splitter=0L;
00149 m_orientation=0L;
00150 m_removeView=0L;
00151 m_toolbarList.setAutoDelete( true );
00152 m_firstTime=true;
00153 m_progress=0L;
00154 m_paDocInfo = 0;
00155 m_paSave = 0;
00156 m_paSaveAs = 0;
00157 m_paPrint = 0;
00158 m_paPrintPreview = 0;
00159 statusBarLabel = 0L;
00160 m_dcopObject = 0;
00161 m_sendfile = 0;
00162 m_paCloseFile = 0L;
00163 m_reloadfile = 0L;
00164 m_importFile = 0;
00165 m_exportFile = 0;
00166 m_isImporting = false;
00167 m_isExporting = false;
00168 m_windowSizeDirty = false;
00169 m_lastExportSpecialOutputFlag = 0;
00170 }
00171 ~KoMainWindowPrivate()
00172 {
00173 delete m_dcopObject;
00174 }
00175
00176 KoDocument *m_rootDoc;
00177 QPtrList<KoView> m_rootViews;
00178 KParts::PartManager *m_manager;
00179
00180 KParts::Part *m_activePart;
00181 KoView *m_activeView;
00182
00183 QLabel * statusBarLabel;
00184 KProgress *m_progress;
00185
00186 QPtrList<KAction> m_splitViewActionList;
00187
00188
00189 QPtrList<KAction> m_veryHackyActionList;
00190 QSplitter *m_splitter;
00191 KSelectAction *m_orientation;
00192 KAction *m_removeView;
00193 KoMainWindowIface *m_dcopObject;
00194
00195 QPtrList <KAction> m_toolbarList;
00196
00197 bool bMainWindowGUIBuilt;
00198 bool m_splitted;
00199 bool m_forQuit;
00200 bool m_firstTime;
00201 bool m_windowSizeDirty;
00202
00203 KAction *m_paDocInfo;
00204 KAction *m_paSave;
00205 KAction *m_paSaveAs;
00206 KAction *m_paPrint;
00207 KAction *m_paPrintPreview;
00208 KAction *m_sendfile;
00209 KAction *m_paCloseFile;
00210 KAction *m_reloadfile;
00211 KAction *m_importFile;
00212 KAction *m_exportFile;
00213
00214 bool m_isImporting;
00215 bool m_isExporting;
00216
00217 KURL m_lastExportURL;
00218 QCString m_lastExportFormat;
00219 int m_lastExportSpecialOutputFlag;
00220 };
00221
00222 KoMainWindow::KoMainWindow( KInstance *instance, const char* name )
00223 : KParts::MainWindow( name )
00224 {
00225 setStandardToolBarMenuEnabled(true);
00226 Q_ASSERT(instance);
00227 d = new KoMainWindowPrivate;
00228
00229 d->m_manager = new KoPartManager( this );
00230 d->m_manager->setSelectionPolicy( KParts::PartManager::TriState );
00231 d->m_manager->setAllowNestedParts( true );
00232 d->m_manager->setIgnoreScrollBars( true );
00233 d->m_manager->setActivationButtonMask( Qt::LeftButton | Qt::MidButton );
00234
00235 connect( d->m_manager, SIGNAL( activePartChanged( KParts::Part * ) ),
00236 this, SLOT( slotActivePartChanged( KParts::Part * ) ) );
00237
00238 if ( instance )
00239 setInstance( instance, false );
00240
00241
00242
00243 QString doc;
00244 QStringList allFiles = KGlobal::dirs()->findAllResources( "data", "koffice/koffice_shell.rc" );
00245 setXMLFile( findMostRecentXMLFile( allFiles, doc ) );
00246 setLocalXMLFile( locateLocal( "data", "koffice/koffice_shell.rc" ) );
00247
00248 KStdAction::openNew( this, SLOT( slotFileNew() ), actionCollection(), "file_new" );
00249 KStdAction::open( this, SLOT( slotFileOpen() ), actionCollection(), "file_open" );
00250 m_recent = KStdAction::openRecent( this, SLOT(slotFileOpenRecent(const KURL&)), actionCollection() );
00251 d->m_paSave = KStdAction::save( this, SLOT( slotFileSave() ), actionCollection(), "file_save" );
00252 d->m_paSaveAs = KStdAction::saveAs( this, SLOT( slotFileSaveAs() ), actionCollection(), "file_save_as" );
00253 d->m_paPrint = KStdAction::print( this, SLOT( slotFilePrint() ), actionCollection(), "file_print" );
00254 d->m_paPrintPreview = KStdAction::printPreview( this, SLOT( slotFilePrintPreview() ), actionCollection(), "file_print_preview" );
00255 d->m_paCloseFile = KStdAction::close( this, SLOT( slotFileClose() ), actionCollection(), "file_close" );
00256 KStdAction::quit( this, SLOT( slotFileQuit() ), actionCollection(), "file_quit" );
00257
00258 d->m_sendfile = new KAction( i18n( "Send File..."), "mail_send", 0,
00259 this, SLOT( slotEmailFile() ),
00260 actionCollection(), "file_send_file");
00261 d->m_reloadfile = new KAction( i18n( "Reload"), 0,
00262 this, SLOT( slotReloadFile() ),
00263 actionCollection(), "file_reload_file");
00264
00265 d->m_importFile = new KAction( i18n( "I&mport..." ), 0,
00266 this, SLOT( slotImportFile() ),
00267 actionCollection(), "file_import_file");
00268 d->m_exportFile = new KAction( i18n( "E&xport..." ), 0,
00269 this, SLOT( slotExportFile() ),
00270 actionCollection(), "file_export_file");
00271
00272 d->m_paDocInfo = new KAction( i18n( "&Document Information" ), "documentinfo", 0,
00273 this, SLOT( slotDocumentInfo() ),
00274 actionCollection(), "file_documentinfo" );
00275
00276 KStdAction::keyBindings( this, SLOT( slotConfigureKeys() ), actionCollection() );
00277 KStdAction::configureToolbars( this, SLOT( slotConfigureToolbars() ), actionCollection() );
00278
00279 d->m_paDocInfo->setEnabled( false );
00280 d->m_paSaveAs->setEnabled( false );
00281 d->m_reloadfile->setEnabled( false );
00282 d->m_importFile->setEnabled( true );
00283 d->m_exportFile->setEnabled( false );
00284 d->m_paSave->setEnabled( false );
00285 d->m_paPrint->setEnabled( false );
00286 d->m_paPrintPreview->setEnabled( false );
00287 d->m_sendfile->setEnabled( false);
00288 d->m_paCloseFile->setEnabled( false);
00289
00290 d->m_splitter=new QSplitter(Qt::Vertical, this, "mw-splitter");
00291 setCentralWidget( d->m_splitter );
00292
00293
00294 d->m_veryHackyActionList.append(
00295 new KAction(i18n("&Close All Views"), "fileclose",
00296 0, this, SLOT(slotCloseAllViews()),
00297 actionCollection(), "view_closeallviews") );
00298
00299
00300 d->m_splitViewActionList.append(new KAction(i18n("&Split View"), "view_split", 0,
00301 this, SLOT(slotSplitView()),
00302 actionCollection(), "view_split"));
00303 d->m_removeView=new KAction(i18n("&Remove View"), "view_remove", 0,
00304 this, SLOT(slotRemoveView()),
00305 actionCollection(), "view_rm_splitter");
00306 d->m_splitViewActionList.append(d->m_removeView);
00307 d->m_removeView->setEnabled(false);
00308 d->m_orientation=new KSelectAction(i18n("Splitter &Orientation"), "view_orientation", 0,
00309 this, SLOT(slotSetOrientation()),
00310 actionCollection(), "view_splitter_orientation");
00311 QStringList items;
00312 items << i18n("&Vertical")
00313 << i18n("&Horizontal");
00314 d->m_orientation->setItems(items);
00315 d->m_orientation->setCurrentItem(static_cast<int>(d->m_splitter->orientation()));
00316 d->m_splitViewActionList.append(d->m_orientation);
00317 d->m_splitViewActionList.append(new KActionSeparator(this));
00318
00319
00320 KConfig * config = instance ? instance->config() : KGlobal::config();
00321 m_recent->loadEntries( config );
00322
00323 createShellGUI();
00324 d->bMainWindowGUIBuilt = true;
00325
00326 if ( !initialGeometrySet() )
00327 {
00328
00329 #if KDE_IS_VERSION(3,1,90)
00330 const int deskWidth = KGlobalSettings::desktopGeometry(this).width();
00331 #else
00332 const int deskWidth = QApplication::desktop()->width();
00333 #endif
00334 if (deskWidth > 1100)
00335 resize( 1000, 800 );
00336 if (deskWidth > 850)
00337 resize( 800, 600 );
00338 else
00339 resize( 600, 400 );
00340 }
00341
00342
00343 config->setGroup( "MainWindow" );
00344
00345 restoreWindowSize( config );
00346 }
00347
00348 KoMainWindow::~KoMainWindow()
00349 {
00350
00351 if (d->m_rootDoc)
00352 d->m_rootDoc->removeShell(this);
00353
00354
00355 d->m_manager->setActivePart(0);
00356
00357 if(d->m_rootViews.findRef(d->m_activeView)==-1) {
00358 delete d->m_activeView;
00359 d->m_activeView=0L;
00360 }
00361 d->m_rootViews.setAutoDelete( true );
00362 d->m_rootViews.clear();
00363
00364
00365
00366
00367 if ( d->m_rootDoc && d->m_rootDoc->viewCount() == 0 &&
00368 !d->m_rootDoc->isEmbedded())
00369 {
00370
00371 delete d->m_rootDoc;
00372 }
00373
00374 delete d->m_manager;
00375 delete d;
00376 }
00377
00378 void KoMainWindow::setRootDocument( KoDocument *doc )
00379 {
00380 if ( d->m_rootDoc == doc )
00381 return;
00382
00383
00384 QPtrList<KoView> oldRootViews = d->m_rootViews;
00385 d->m_rootViews.clear();
00386 KoDocument *oldRootDoc = d->m_rootDoc;
00387
00388 if ( oldRootDoc )
00389 oldRootDoc->removeShell( this );
00390
00391 d->m_rootDoc = doc;
00392
00393 if ( doc )
00394 {
00395 doc->setSelectable( false );
00396
00397 d->m_rootViews.append( doc->createView( d->m_splitter, "view" ) );
00398 d->m_rootViews.current()->setPartManager( d->m_manager );
00399
00400 d->m_rootViews.current()->show();
00401
00402 if ( !d->m_rootDoc->shells().contains( this ) )
00403 d->m_rootDoc->addShell( this );
00404 d->m_removeView->setEnabled(false);
00405 d->m_orientation->setEnabled(false);
00406 }
00407
00408 bool enable = d->m_rootDoc != 0 ? true : false;
00409 d->m_paDocInfo->setEnabled( enable );
00410 d->m_paSave->setEnabled( enable );
00411 d->m_paSaveAs->setEnabled( enable );
00412 d->m_importFile->setEnabled( enable );
00413 d->m_exportFile->setEnabled( enable );
00414 d->m_paPrint->setEnabled( enable );
00415 d->m_paPrintPreview->setEnabled( enable );
00416 d->m_sendfile->setEnabled( enable);
00417 d->m_paCloseFile->setEnabled( enable);
00418 updateCaption();
00419
00420 d->m_manager->setActivePart( d->m_rootDoc, d->m_rootViews.current() );
00421
00422 oldRootViews.setAutoDelete( true );
00423 oldRootViews.clear();
00424
00425 if ( oldRootDoc && oldRootDoc->viewCount() == 0 )
00426 {
00427
00428 delete oldRootDoc;
00429 }
00430 }
00431
00432 void KoMainWindow::updateReloadFileAction(KoDocument *doc)
00433 {
00434 d->m_reloadfile->setEnabled( doc && !doc->url().isEmpty()&&doc->isModified());
00435 }
00436
00437 void KoMainWindow::setRootDocumentDirect( KoDocument *doc, const QPtrList<KoView> & views )
00438 {
00439 d->m_rootDoc = doc;
00440 d->m_rootViews = views;
00441 bool enable = d->m_rootDoc != 0 ? true : false;
00442 d->m_paDocInfo->setEnabled( enable );
00443 d->m_paSave->setEnabled( enable );
00444 d->m_paSaveAs->setEnabled( enable );
00445 d->m_exportFile->setEnabled( enable );
00446 d->m_paPrint->setEnabled( enable );
00447 d->m_paPrintPreview->setEnabled( enable );
00448 d->m_sendfile->setEnabled( enable);
00449 d->m_paCloseFile->setEnabled( enable );
00450 }
00451
00452 void KoMainWindow::addRecentURL( const KURL& url )
00453 {
00454 kdDebug(30003) << "KoMainWindow::addRecentURL url=" << url.prettyURL() << endl;
00455
00456
00457 if ( !url.isEmpty() )
00458 {
00459 bool ok = true;
00460 if ( url.isLocalFile() )
00461 {
00462 QString path = url.path( -1 );
00463 QStringList tmpDirs = KGlobal::dirs()->resourceDirs( "tmp" );
00464 for ( QStringList::Iterator it = tmpDirs.begin() ; ok && it != tmpDirs.end() ; ++it )
00465 if ( path.contains( *it ) )
00466 ok = false;
00467 if ( ok )
00468 KRecentDocument::add(path);
00469 }
00470 else
00471 KRecentDocument::add(url.url(-1), true);
00472
00473 if ( ok )
00474 m_recent->addURL( url );
00475 saveRecentFiles();
00476 }
00477 }
00478
00479 void KoMainWindow::saveRecentFiles()
00480 {
00481
00482 KConfig * config = instance() ? instance()->config() : KGlobal::config();
00483 kdDebug(30003) << this << " Saving recent files list into config. instance()=" << instance() << endl;
00484 m_recent->saveEntries( config );
00485 config->sync();
00486 if (KMainWindow::memberList)
00487 {
00488
00489
00490 KMainWindow *window = KMainWindow::memberList->first();
00491 for (; window; window = KMainWindow::memberList->next())
00492 static_cast<KoMainWindow *>(window)->reloadRecentFileList();
00493 }
00494 }
00495
00496 void KoMainWindow::reloadRecentFileList()
00497 {
00498 KConfig * config = instance() ? instance()->config() : KGlobal::config();
00499 m_recent->loadEntries( config );
00500 }
00501
00502 KoDocument* KoMainWindow::createDoc() const
00503 {
00504 QCString mimetype=KoDocument::readNativeFormatMimeType();
00505 KoDocumentEntry entry=KoDocumentEntry::queryByMimeType(mimetype);
00506 return entry.createDoc();
00507 }
00508
00509 void KoMainWindow::updateCaption()
00510 {
00511
00512 if ( !d->m_rootDoc )
00513 setCaption(QString::null);
00514 else if ( rootDocument()->isCurrent() )
00515 {
00516 QString caption;
00517
00518 if ( rootDocument()->documentInfo() )
00519 {
00520 KoDocumentInfoPage * page = rootDocument()->documentInfo()->page( QString::fromLatin1("about") );
00521 if (page)
00522 caption = static_cast<KoDocumentInfoAbout *>(page)->title();
00523 }
00524 if ( caption.isEmpty() )
00525 {
00526
00527 caption = rootDocument()->url().prettyURL( 0, KURL::StripFileProtocol );
00528 }
00529
00530 setCaption( caption, rootDocument()->isModified() );
00531 }
00532 }
00533
00534 void KoMainWindow::updateCaption( QString caption, bool mod )
00535 {
00536
00537 setCaption( caption, mod );
00538 }
00539
00540 KoDocument *KoMainWindow::rootDocument() const
00541 {
00542 return d->m_rootDoc;
00543 }
00544
00545 KoView *KoMainWindow::rootView() const
00546 {
00547 if(d->m_rootViews.find(d->m_activeView)!=-1)
00548 return d->m_activeView;
00549 return d->m_rootViews.first();
00550 }
00551
00552 KParts::PartManager *KoMainWindow::partManager()
00553 {
00554 return d->m_manager;
00555 }
00556
00557 bool KoMainWindow::openDocument( const KURL & url )
00558 {
00559 return openDocumentInternal( url );
00560 }
00561
00562
00563 bool KoMainWindow::openDocument( KoDocument *newdoc, const KURL & url )
00564 {
00565 return openDocumentInternal( url, newdoc );
00566 }
00567
00568
00569 bool KoMainWindow::openDocumentInternal( const KURL & url, KoDocument *newdoc )
00570 {
00571
00572
00573 if ( !newdoc )
00574 newdoc = createDoc();
00575
00576 d->m_firstTime=true;
00577 connect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
00578 connect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
00579 connect(newdoc, SIGNAL(canceled( const QString & )), this, SLOT(slotLoadCanceled( const QString & )));
00580 newdoc->addShell( this );
00581 bool openRet = (!isImporting ()) ? newdoc->openURL(url) : newdoc->import(url);
00582 if(!newdoc || !openRet)
00583 {
00584 delete newdoc;
00585 return false;
00586 }
00587 updateReloadFileAction(newdoc);
00588 return true;
00589 }
00590
00591
00592 void KoMainWindow::slotLoadCompleted()
00593 {
00594 kdDebug(30003) << "KoMainWindow::slotLoadCompleted" << endl;
00595 KoDocument* doc = rootDocument();
00596 KoDocument* newdoc = (KoDocument *)(sender());
00597
00598 if ( doc && doc->isEmpty() && !doc->isEmbedded() )
00599 {
00600
00601 setRootDocument( newdoc );
00602 }
00603 else if ( doc && !doc->isEmpty() )
00604 {
00605
00606
00607
00608 KoMainWindow *s = new KoMainWindow( newdoc->instance() );
00609 s->show();
00610 newdoc->removeShell( this );
00611 s->setRootDocument( newdoc );
00612 }
00613 else
00614 {
00615
00616 setRootDocument( newdoc );
00617 }
00618 disconnect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
00619 disconnect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
00620 disconnect(newdoc, SIGNAL(canceled( const QString & )), this, SLOT(slotLoadCanceled( const QString & )));
00621 }
00622
00623 void KoMainWindow::slotLoadCanceled( const QString & errMsg )
00624 {
00625 kdDebug(30003) << "KoMainWindow::slotLoadCanceled" << endl;
00626 if ( !errMsg.isEmpty() )
00627 KMessageBox::error( this, errMsg );
00628
00629
00630 KoDocument* newdoc = (KoDocument *)(sender());
00631 disconnect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
00632 disconnect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
00633 disconnect(newdoc, SIGNAL(canceled( const QString & )), this, SLOT(slotLoadCanceled( const QString & )));
00634 }
00635
00636 void KoMainWindow::slotSaveCanceled( const QString &errMsg )
00637 {
00638 kdDebug(30003) << "KoMainWindow::slotSaveCanceled" << endl;
00639 if ( !errMsg.isEmpty() )
00640 KMessageBox::error( this, errMsg );
00641 slotSaveCompleted();
00642 }
00643
00644 void KoMainWindow::slotSaveCompleted()
00645 {
00646 kdDebug(30003) << "KoMainWindow::slotSaveCompleted" << endl;
00647 KoDocument* pDoc = (KoDocument *)(sender());
00648 disconnect(pDoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
00649 disconnect(pDoc, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
00650 disconnect(pDoc, SIGNAL(canceled( const QString & )),
00651 this, SLOT(slotSaveCanceled( const QString & )));
00652 }
00653
00654
00655 bool KoMainWindow::exportConfirmation( const QCString &outputFormat, const QCString &nativeFormat )
00656 {
00657 if ( outputFormat != nativeFormat )
00658 {
00659 KMimeType::Ptr mime = KMimeType::mimeType( outputFormat );
00660
00661 const bool neverHeardOfIt = ( mime->name() == KMimeType::defaultMimeType() );
00662 QString comment = neverHeardOfIt ?
00663 i18n( "%1 (unknown file type)" ).arg( outputFormat )
00664 : mime->comment();
00665
00666
00667 int ret;
00668 if (!isExporting ())
00669 {
00670 ret = KMessageBox::warningContinueCancel
00671 (
00672 this,
00673 i18n( "<qt>Saving as a %1 may result in some loss of formatting."
00674 "<p>Do you still want to save in this format?</qt>" )
00675 .arg( QString( "<b>%1</b>" ).arg( comment ) ),
00676 i18n( "Confirm Save" ),
00677 KStdGuiItem::save (),
00678 "NonNativeSaveConfirmation",
00679 true
00680 );
00681 }
00682 else
00683 {
00684 ret = KMessageBox::warningContinueCancel
00685 (
00686 this,
00687 i18n( "<qt>Exporting as a %1 may result in some loss of formatting."
00688 "<p>Do you still want to export to this format?</qt>" )
00689 .arg( QString( "<b>%1</b>" ).arg( comment ) ),
00690 i18n( "Confirm Export" ),
00691 i18n ("Export"),
00692 "NonNativeExportConfirmation",
00693 true
00694 );
00695 }
00696
00697 return (ret == KMessageBox::Continue);
00698 }
00699 else
00700 return true;
00701 }
00702
00703 bool KoMainWindow::saveDocument( bool saveas )
00704 {
00705 KoDocument* pDoc = rootDocument();
00706 if(!pDoc)
00707 return true;
00708 connect(pDoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
00709 connect(pDoc, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
00710 connect(pDoc, SIGNAL(canceled( const QString & )),
00711 this, SLOT(slotSaveCanceled( const QString & )));
00712
00713 KURL oldURL = pDoc->url();
00714 QString oldFile = pDoc->file();
00715 QCString _native_format = pDoc->nativeFormatMimeType();
00716 QCString oldOutputFormat = pDoc->outputMimeType();
00717 int oldSpecialOutputFlag = pDoc->specialOutputFlag();
00718 QString suggestedFilename = pDoc->url().path();
00719
00720 QStringList mimeFilter = KoFilterManager::mimeFilter( _native_format, KoFilterManager::Export );
00721 if (mimeFilter.findIndex (oldOutputFormat) < 0 && !isExporting())
00722 {
00723 kdDebug(30003) << "KoMainWindow::saveDocument no export filter for " << oldOutputFormat << endl;
00724
00725
00726
00727
00728
00729 if ( !suggestedFilename.isEmpty () )
00730 {
00731 int c = suggestedFilename.findRev ('.');
00732
00733 KMimeType::Ptr mime = KMimeType::mimeType( _native_format );
00734 QString ext = mime->property( "X-KDE-NativeExtension" ).toString();
00735 if (!ext.isEmpty ())
00736 {
00737 if (c < 0)
00738 suggestedFilename += ext;
00739 else
00740 suggestedFilename = suggestedFilename.left (c) + ext;
00741 }
00742 else
00743 {
00744
00745 suggestedFilename = suggestedFilename.left (c);
00746 }
00747 }
00748
00749
00750 saveas = true;
00751 }
00752
00753 bool ret = false;
00754
00755 if ( pDoc->url().isEmpty() || saveas )
00756 {
00757
00758
00759 bool justChangingFilterOptions = false;
00760
00761 KoFileDialog *dialog = new KoFileDialog(isExporting() ? d->m_lastExportURL.path() : suggestedFilename,
00762 QString::null, this, "file dialog", true);
00763
00764 if (!isExporting())
00765 dialog->setCaption( i18n("Save Document As") );
00766 else
00767 dialog->setCaption( i18n("Export Document As") );
00768
00769 #if KDE_IS_VERSION(3,1,92)
00770 dialog->setOperationMode( KFileDialog::Saving );
00771 #else
00772 dialog->setOperationMode( KFileDialog::Other );
00773 dialog->setKeepLocation( true );
00774 dialog->okButton()->setGuiItem( KStdGuiItem::save() );
00775 #endif
00776 dialog->setSpecialMimeFilter( mimeFilter,
00777 isExporting() ? d->m_lastExportFormat : pDoc->mimeType(),
00778 isExporting() ? d->m_lastExportSpecialOutputFlag : oldSpecialOutputFlag,
00779 _native_format );
00780
00781 KURL newURL;
00782 QCString outputFormat = _native_format;
00783 int specialOutputFlag = 0;
00784 bool bOk;
00785 do {
00786 bOk=true;
00787 if(dialog->exec()==QDialog::Accepted) {
00788 newURL=dialog->selectedURL();
00789 outputFormat=dialog->currentMimeFilter().latin1();
00790 specialOutputFlag = dialog->specialEntrySelected();
00791 kdDebug(30003) << "KoMainWindow::saveDocument outputFormat = " << outputFormat << endl;
00792
00793 if (!isExporting())
00794 justChangingFilterOptions = (newURL == pDoc->url()) &&
00795 (outputFormat == pDoc->mimeType()) &&
00796 (specialOutputFlag == oldSpecialOutputFlag);
00797 else
00798 justChangingFilterOptions = (newURL == d->m_lastExportURL) &&
00799 (outputFormat == d->m_lastExportFormat) &&
00800 (specialOutputFlag == d->m_lastExportSpecialOutputFlag);
00801 }
00802 else
00803 {
00804 bOk = false;
00805 break;
00806 }
00807
00808 if ( newURL.isEmpty() )
00809 {
00810 bOk = false;
00811 break;
00812 }
00813
00814
00815
00816 #if (!KDE_IS_VERSION (3, 1, 90))
00817 if ( QFileInfo( newURL.path() ).extension().isEmpty() ) {
00818
00819 KMimeType::Ptr mime = KMimeType::mimeType( outputFormat );
00820 QString extension = mime->property( "X-KDE-NativeExtension" ).toString();
00821 kdDebug(30003) << "KoMainWindow::saveDocument outputFormat=" << outputFormat << " extension=" << extension << endl;
00822 newURL.setPath( newURL.path() + extension );
00823 }
00824 #endif
00825
00826
00827
00828 #if KDE_IS_VERSION(3,1,90)
00829 if ( KIO::NetAccess::exists( newURL, false , this ) && !justChangingFilterOptions )
00830 #else
00831 if ( KIO::NetAccess::exists( newURL, this ) && !justChangingFilterOptions )
00832 #endif
00833 {
00834 bOk = KMessageBox::questionYesNo( this,
00835 i18n("A document with this name already exists.\n"\
00836 "Do you want to overwrite it?"),
00837 i18n("Warning") ) == KMessageBox::Yes;
00838 }
00839 } while ( !bOk );
00840
00841 delete dialog;
00842
00843 if (bOk)
00844 {
00845 bool wantToSave = true;
00846
00847
00848 if (!justChangingFilterOptions || pDoc->confirmNonNativeSave (isExporting ()))
00849 wantToSave = exportConfirmation (outputFormat, _native_format);
00850
00851 if (wantToSave)
00852 {
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878 pDoc->setOutputMimeType( outputFormat, specialOutputFlag );
00879 if (!isExporting ())
00880 {
00881 ret = pDoc->saveAs( newURL );
00882
00883 if (ret)
00884 {
00885 kdDebug(30003) << "Successful Save As!" << endl;
00886 addRecentURL( newURL );
00887 }
00888 else
00889 {
00890 kdDebug(30003) << "Failed Save As!" << endl;
00891 pDoc->setURL( oldURL ), pDoc->setFile( oldFile );
00892 pDoc->setOutputMimeType( oldOutputFormat, oldSpecialOutputFlag );
00893 }
00894 }
00895 else
00896 {
00897 ret = pDoc->exp0rt( newURL );
00898
00899 if (ret)
00900 {
00901
00902 d->m_lastExportURL = newURL;
00903 d->m_lastExportFormat = outputFormat;
00904 d->m_lastExportSpecialOutputFlag = specialOutputFlag;
00905 }
00906
00907
00908 pDoc->setOutputMimeType( oldOutputFormat, oldSpecialOutputFlag );
00909 }
00910
00911 pDoc->setTitleModified();
00912 }
00913 else
00914 ret = false;
00915 }
00916 else
00917 ret = false;
00918 }
00919 else {
00920 bool needConfirm = pDoc->confirmNonNativeSave( false );
00921 if (!needConfirm ||
00922 (needConfirm && exportConfirmation ( oldOutputFormat , _native_format ))
00923 )
00924 {
00925
00926 ret = pDoc->save();
00927
00928 if (!ret)
00929 {
00930 kdDebug(30003) << "Failed Save!" << endl;
00931 pDoc->setURL( oldURL ), pDoc->setFile( oldFile );
00932 }
00933 }
00934 else
00935 ret = false;
00936 }
00937
00938
00939
00940
00941
00942
00943
00944
00945 #if 0
00946 if (ret && !isExporting())
00947 {
00948
00949
00950
00951 if ( wasModified && pDoc->outputMimeType() != _native_format )
00952 pDoc->setModified( true );
00953 }
00954 #endif
00955
00956 return ret;
00957 }
00958
00959 void KoMainWindow::closeEvent(QCloseEvent *e) {
00960 if(queryClose()) {
00961 saveWindowSettings();
00962 setRootDocument(0L);
00963 KParts::MainWindow::closeEvent(e);
00964 }
00965 }
00966
00967 void KoMainWindow::saveWindowSettings()
00968 {
00969 if (d->m_windowSizeDirty && rootDocument())
00970 {
00971
00972 instance()->config()->setGroup( "MainWindow" );
00973
00974 saveWindowSize( instance()->config() );
00975 d->m_windowSizeDirty = false;
00976
00977
00978 saveMainWindowSettings( KGlobal::config(), rootDocument()->instance()->instanceName() );
00979 KGlobal::config()->sync();
00980 resetAutoSaveSettings();
00981 }
00982 }
00983
00984 void KoMainWindow::resizeEvent( QResizeEvent * e )
00985 {
00986 d->m_windowSizeDirty = true;
00987 KParts::MainWindow::resizeEvent( e );
00988 }
00989
00990 bool KoMainWindow::queryClose()
00991 {
00992 if ( rootDocument() == 0 )
00993 return true;
00994
00995
00996 if ( !d->m_forQuit && rootDocument()->shellCount() > 1 )
00997
00998 return true;
00999
01000
01001 if ( d->m_rootDoc->isEmbedded() )
01002 return true;
01003
01004
01005 if ( d->m_rootDoc->isModified() )
01006 {
01007 QString name;
01008 if ( rootDocument()->documentInfo() )
01009 {
01010 name = rootDocument()->documentInfo()->title();
01011 }
01012 if ( name.isEmpty() )
01013 name = rootDocument()->url().fileName();
01014
01015 if ( name.isEmpty() )
01016 name = i18n( "Untitled" );
01017
01018 int res = KMessageBox::warningYesNoCancel( this,
01019 i18n( "<p>The document <b>'%1'</b> has been modified.</p><p>Do you want to save it?</p>" ).arg(name),
01020 QString::null,
01021 KStdGuiItem::save(),
01022 KStdGuiItem::discard());
01023
01024 switch(res) {
01025 case KMessageBox::Yes : {
01026 d->m_rootDoc->setDoNotSaveExtDoc();
01027 bool isNative = ( d->m_rootDoc->outputMimeType() == d->m_rootDoc->nativeFormatMimeType() );
01028 if (! saveDocument( !isNative ) )
01029 return false;
01030 break;
01031 }
01032 case KMessageBox::No :
01033 rootDocument()->removeAutoSaveFiles();
01034 rootDocument()->setModified( false );
01035 break;
01036 default :
01037 return false;
01038 }
01039 }
01040
01041 if ( d->m_rootDoc->queryCloseExternalChildren() == KMessageBox::Cancel )
01042 {
01043 return false;
01044 }
01045
01046 return true;
01047 }
01048
01049
01050 void KoMainWindow::chooseNewDocument( int initDocFlags )
01051 {
01052 KoDocument* doc = rootDocument();
01053 KoDocument *newdoc=createDoc();
01054 if (!newdoc)
01055 return;
01056 connect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
01057 newdoc->setInitDocFlags( (KoDocument::InitDocFlags)initDocFlags );
01058 if(!newdoc->initDoc())
01059 {
01060 delete newdoc;
01061 return;
01062 }
01063 if ( doc && doc->isEmpty() && !doc->isEmbedded() )
01064 {
01065 setRootDocument( newdoc );
01066 return;
01067 }
01068 else if ( doc && !doc->isEmpty() )
01069 {
01070 KoMainWindow *s = new KoMainWindow( newdoc->instance() );
01071 s->show();
01072 s->setRootDocument( newdoc );
01073 return;
01074 }
01075 disconnect(newdoc, SIGNAL(sigProgress(int)), this, SLOT(slotProgress(int)));
01076 setRootDocument( newdoc );
01077 }
01078
01079 void KoMainWindow::slotFileNew()
01080 {
01081 chooseNewDocument( KoDocument::InitDocFileNew );
01082 }
01083
01084 void KoMainWindow::slotFileOpen()
01085 {
01086 KFileDialog *dialog=new KFileDialog(QString::null, QString::null, this, "file dialog", true);
01087 if (!isImporting())
01088 dialog->setCaption( i18n("Open Document") );
01089 else
01090 dialog->setCaption( i18n("Import Document") );
01091
01092 dialog->setMimeFilter( KoFilterManager::mimeFilter( KoDocument::readNativeFormatMimeType(),
01093 KoFilterManager::Import ) );
01094 if(dialog->exec()!=QDialog::Accepted) {
01095 delete dialog;
01096 return;
01097 }
01098 KURL url( dialog->selectedURL() );
01099 delete dialog;
01100
01101 if ( url.isEmpty() )
01102 return;
01103
01104 (void) openDocumentInternal( url, 0L );
01105 }
01106
01107 void KoMainWindow::slotFileOpenRecent( const KURL & url )
01108 {
01109 (void) openDocument( url );
01110 }
01111
01112 void KoMainWindow::slotFileSave()
01113 {
01114 if ( saveDocument() )
01115 emit documentSaved();
01116 }
01117
01118 void KoMainWindow::slotFileSaveAs()
01119 {
01120 if ( saveDocument( true ) )
01121 emit documentSaved();
01122 }
01123
01124 void KoMainWindow::slotDocumentInfo()
01125 {
01126 if ( !rootDocument() )
01127 return;
01128
01129 KoDocumentInfo *docInfo = rootDocument()->documentInfo();
01130
01131 if ( !docInfo )
01132 return;
01133
01134 KoDocumentInfoDlg *dlg = new KoDocumentInfoDlg( docInfo, this, "documentInfoDlg" );
01135 if ( dlg->exec() )
01136 {
01137 dlg->save();
01138 rootDocument()->setModified( true );
01139 rootDocument()->setTitleModified();
01140 }
01141
01142 delete dlg;
01143 }
01144
01145 void KoMainWindow::slotFileClose()
01146 {
01147 if (queryClose())
01148 {
01149 saveWindowSettings();
01150 setRootDocument( 0 );
01151 delete d->m_rootDoc;
01152 d->m_rootDoc = 0;
01153 chooseNewDocument( KoDocument::InitDocFileClose );
01154 }
01155 }
01156
01157 void KoMainWindow::slotFileQuit()
01158 {
01159 if (queryClose()) {
01160 close();
01161 }
01162 }
01163
01164 void KoMainWindow::print(bool quick) {
01165 if ( !rootView() )
01166 {
01167 kdDebug(30003) << "KoMainWindow::slotFilePrint : No root view!" << endl;
01168 return;
01169 }
01170
01171 KPrinter printer( true );
01172 QString title = rootView()->koDocument()->documentInfo()->title();
01173 QString fileName = rootView()->koDocument()->url().fileName();
01174
01175
01176 KMimeType::Ptr mime = KMimeType::mimeType( rootView()->koDocument()->outputMimeType() );
01177 if ( mime ) {
01178 QString extension = mime->property( "X-KDE-NativeExtension" ).toString();
01179
01180 if ( fileName.endsWith( extension ) )
01181 fileName.truncate( fileName.length() - extension.length() );
01182 }
01183
01184 if ( title.isEmpty() )
01185 title = fileName;
01186 printer.setDocName( title );
01187 printer.setDocFileName( fileName );
01188 printer.setDocDirectory( rootView()->koDocument()->url().directory() );
01189
01190
01191
01192 rootView()->setupPrinter( printer );
01193
01194 if ( quick || printer.setup( this ) )
01195 rootView()->print( printer );
01196 }
01197
01198
01199 void KoMainWindow::slotFilePrint()
01200 {
01201 print(false);
01202 }
01203
01204 void KoMainWindow::slotFilePrintPreview()
01205 {
01206 if ( !rootView() )
01207 {
01208 kdWarning() << "KoMainWindow::slotFilePrint : No root view!" << endl;
01209 return;
01210 }
01211 KPrinter printer( false );
01212 KTempFile tmpFile;
01213
01214
01215
01216
01217 printer.setFromTo( printer.minPage(), printer.maxPage() );
01218 rootView()->setupPrinter( printer );
01219
01220 QString oldFileName = printer.outputFileName();
01221 printer.setOutputFileName( tmpFile.name() );
01222 printer.setPreviewOnly( true );
01223 int oldNumCopies = printer.numCopies();
01224 printer.setNumCopies( 1 );
01225
01226
01227 QString oldKDEPreview = printer.option( "kde-preview" );
01228 printer.setOption( "kde-preview", "0" );
01229
01230 rootView()->print(printer);
01231
01232
01233
01234 printer.setOutputFileName( oldFileName );
01235 printer.setNumCopies( oldNumCopies );
01236 printer.setOption( "kde-preview", oldKDEPreview );
01237 }
01238
01239 void KoMainWindow::slotConfigureKeys()
01240 {
01241 KoView *view = rootView();
01242
01243 Q_ASSERT( view );
01244 if ( !view )
01245 return;
01246
01247 KKeyDialog dlg;
01248 dlg.insert( actionCollection() );
01249 dlg.insert( view->actionCollection() );
01250 if ( rootDocument() )
01251 dlg.insert( rootDocument()->actionCollection() );
01252 dlg.configure();
01253 }
01254
01255 void KoMainWindow::slotConfigureToolbars()
01256 {
01257 if (rootDocument())
01258 saveMainWindowSettings( KGlobal::config(), rootDocument()->instance()->instanceName() );
01259 KEditToolbar edit(factory());
01260 connect(&edit,SIGNAL(newToolbarConfig()),this,SLOT(slotNewToolbarConfig()));
01261 (void) edit.exec();
01262 }
01263
01264 void KoMainWindow::slotNewToolbarConfig()
01265 {
01266 if (rootDocument())
01267 applyMainWindowSettings( KGlobal::config(), rootDocument()->instance()->instanceName() );
01268 KXMLGUIFactory *factory = guiFactory();
01269
01270
01271 if( !d->m_activeView )
01272 return;
01273
01274
01275 factory->plugActionList(d->m_activeView, "view_closeallviews",
01276 d->m_veryHackyActionList);
01277
01278
01279 if(d->m_rootViews.findRef(d->m_activeView)!=-1)
01280 factory->plugActionList(d->m_activeView, "view_split",
01281 d->m_splitViewActionList );
01282 plugActionList( "toolbarlist", d->m_toolbarList );
01283 }
01284
01285 void KoMainWindow::slotToolbarToggled( bool toggle )
01286 {
01287
01288
01289 KToolBar * bar = toolBar( sender()->name() );
01290 if (bar)
01291 {
01292 if (toggle)
01293 bar->show();
01294 else
01295 bar->hide();
01296
01297 if (rootDocument())
01298 saveMainWindowSettings( KGlobal::config(), rootDocument()->instance()->instanceName() );
01299 }
01300 else
01301 kdWarning(30003) << "slotToolbarToggled : Toolbar " << sender()->name() << " not found!" << endl;
01302 }
01303
01304 bool KoMainWindow::toolbarIsVisible(const char *tbName)
01305 {
01306 QWidget *tb = toolBar( tbName);
01307 return !tb->isHidden();
01308 }
01309
01310 void KoMainWindow::showToolbar( const char * tbName, bool shown )
01311 {
01312 QWidget * tb = toolBar( tbName );
01313 if ( !tb )
01314 {
01315 kdWarning(30003) << "KoMainWindow: toolbar " << tbName << " not found." << endl;
01316 return;
01317 }
01318 if ( shown )
01319 tb->show();
01320 else
01321 tb->hide();
01322
01323
01324 QPtrListIterator<KAction> it( d->m_toolbarList );
01325 for ( ; it.current() ; ++it )
01326 if ( !strcmp( it.current()->name(), tbName ) )
01327 {
01328
01329 static_cast<KToggleAction *>(it.current())->setChecked( shown );
01330 break;
01331 }
01332 }
01333
01334 void KoMainWindow::slotSplitView() {
01335 d->m_splitted=true;
01336 d->m_rootViews.append(d->m_rootDoc->createView(d->m_splitter, "splitted-view"));
01337 d->m_rootViews.current()->show();
01338 d->m_rootViews.current()->setPartManager( d->m_manager );
01339 d->m_manager->setActivePart( d->m_rootDoc, d->m_rootViews.current() );
01340 d->m_removeView->setEnabled(true);
01341 d->m_orientation->setEnabled(true);
01342 }
01343
01344 void KoMainWindow::slotCloseAllViews() {
01345
01346
01347 d->m_forQuit=true;
01348 if(queryClose()) {
01349
01350 if(d->m_rootDoc && d->m_rootDoc->isEmbedded()) {
01351 hide();
01352 d->m_rootDoc->removeShell(this);
01353 QPtrListIterator<KoMainWindow> it(d->m_rootDoc->shells());
01354 while (it.current()) {
01355 it.current()->hide();
01356 delete it.current();
01357
01358 d->m_rootDoc=0;
01359 }
01360 }
01361
01362 else
01363 setRootDocument( 0L );
01364 close();
01365 }
01366 d->m_forQuit=false;
01367 }
01368
01369 void KoMainWindow::slotRemoveView() {
01370 KoView *view;
01371 if(d->m_rootViews.findRef(d->m_activeView)!=-1)
01372 view=d->m_rootViews.current();
01373 else
01374 view=d->m_rootViews.first();
01375 view->hide();
01376 if ( !d->m_rootViews.removeRef(view) )
01377 kdWarning() << "view not found in d->m_rootViews!" << endl;
01378
01379 if(d->m_rootViews.count()==1)
01380 {
01381 d->m_removeView->setEnabled(false);
01382 d->m_orientation->setEnabled(false);
01383 }
01384
01385 d->m_manager->setActivePart( 0, 0 );
01386
01387 delete view;
01388 view=0L;
01389
01390 d->m_rootViews.first()->setPartManager( d->m_manager );
01391 d->m_manager->setActivePart( d->m_rootDoc, d->m_rootViews.first() );
01392
01393 if(d->m_rootViews.count()==1)
01394 d->m_splitted=false;
01395 }
01396
01397 void KoMainWindow::slotSetOrientation() {
01398 d->m_splitter->setOrientation(static_cast<Qt::Orientation>
01399 (d->m_orientation->currentItem()));
01400 }
01401
01402 void KoMainWindow::slotProgress(int value) {
01403
01404 if(value==-1) {
01405 if ( d->m_progress )
01406 {
01407 statusBar()->removeWidget(d->m_progress);
01408 delete d->m_progress;
01409 d->m_progress=0L;
01410 }
01411 d->m_firstTime=true;
01412 return;
01413 }
01414 if(d->m_firstTime)
01415 {
01416
01417
01418 QObjectList *l = queryList( "QStatusBar" );
01419 if ( !l || !l->first() ) {
01420 statusBar()->show();
01421 QApplication::sendPostedEvents( this, QEvent::ChildInserted );
01422 setUpLayout();
01423 }
01424 delete l;
01425
01426 if ( d->m_progress )
01427 {
01428 statusBar()->removeWidget(d->m_progress);
01429 delete d->m_progress;
01430 d->m_progress=0L;
01431 }
01432 statusBar()->setMaximumHeight(statusBar()->height());
01433 d->m_progress=new KProgress(statusBar());
01434
01435 statusBar()->addWidget( d->m_progress, 0, true );
01436 d->m_progress->show();
01437 d->m_firstTime=false;
01438 }
01439 d->m_progress->setProgress(value);
01440 kapp->processEvents();
01441 }
01442
01443
01444 void KoMainWindow::slotActivePartChanged( KParts::Part *newPart )
01445 {
01446
01447
01448
01449
01450
01451
01452
01453
01454 if ( d->m_activePart && d->m_activePart == newPart && !d->m_splitted )
01455 {
01456
01457 return;
01458 }
01459
01460 KXMLGUIFactory *factory = guiFactory();
01461
01462 setUpdatesEnabled( false );
01463
01464 if ( d->m_activeView )
01465 {
01466 KParts::GUIActivateEvent ev( false );
01467 QApplication::sendEvent( d->m_activePart, &ev );
01468 QApplication::sendEvent( d->m_activeView, &ev );
01469
01470
01471 factory->removeClient( d->m_activeView );
01472
01473 unplugActionList( "toolbarlist" );
01474 d->m_toolbarList.clear();
01475 }
01476
01477 if ( !d->bMainWindowGUIBuilt )
01478 {
01479
01480 KParts::Plugin::loadPlugins( this, this, instance(), true );
01481 createShellGUI();
01482 }
01483
01484 if ( newPart && d->m_manager->activeWidget() && d->m_manager->activeWidget()->inherits( "KoView" ) )
01485 {
01486 d->m_activeView = (KoView *)d->m_manager->activeWidget();
01487 d->m_activePart = newPart;
01488
01489
01490 factory->addClient( d->m_activeView );
01491
01492
01493
01494 factory->plugActionList(d->m_activeView, "view_closeallviews",
01495 d->m_veryHackyActionList);
01496
01497 if(d->m_rootViews.findRef(d->m_activeView)!=-1)
01498 factory->plugActionList(d->m_activeView, "view_split", d->m_splitViewActionList );
01499
01500
01501 setAutoSaveSettings( newPart->instance()->instanceName(), false );
01502
01503
01504
01505 QPtrList<QWidget> toolBarList = factory->containers( "ToolBar" );
01506 QPtrListIterator<QWidget> it( toolBarList );
01507 for ( ; it.current() ; ++it )
01508 {
01509 if ( it.current()->inherits("KToolBar") )
01510 {
01511 KToolBar * tb = static_cast<KToolBar *>(it.current());
01512 KToggleAction * act = new KToggleAction( i18n("Show %1 Toolbar").arg( tb->text() ), 0,
01513 actionCollection(), tb->name() );
01514 connect( act, SIGNAL( toggled( bool ) ), this, SLOT( slotToolbarToggled( bool ) ) );
01515 act->setChecked ( !tb->isHidden() );
01516 d->m_toolbarList.append( act );
01517 }
01518 else
01519 kdWarning(30003) << "Toolbar list contains a " << it.current()->className() << " which is not a toolbar!" << endl;
01520 }
01521 plugActionList( "toolbarlist", d->m_toolbarList );
01522
01523
01524
01525 KParts::GUIActivateEvent ev( true );
01526 QApplication::sendEvent( d->m_activePart, &ev );
01527 QApplication::sendEvent( d->m_activeView, &ev );
01528 }
01529 else
01530 {
01531 d->m_activeView = 0L;
01532 d->m_activePart = 0L;
01533 }
01534 setUpdatesEnabled( true );
01535 }
01536
01537 QLabel * KoMainWindow::statusBarLabel()
01538 {
01539 if ( !d->statusBarLabel )
01540 {
01541 d->statusBarLabel = new QLabel( statusBar() );
01542 statusBar()->addWidget( d->statusBarLabel, 1, true );
01543 }
01544 return d->statusBarLabel;
01545 }
01546
01547 void KoMainWindow::setMaxRecentItems(uint _number)
01548 {
01549 m_recent->setMaxItems( _number );
01550 }
01551
01552 DCOPObject * KoMainWindow::dcopObject()
01553 {
01554 if ( !d->m_dcopObject )
01555 {
01556 d->m_dcopObject = new KoMainWindowIface( this );
01557 }
01558
01559 return d->m_dcopObject;
01560 }
01561
01562 void KoMainWindow::slotEmailFile()
01563 {
01564 saveDocument();
01565
01566
01567
01568 QString fileURL = d->m_rootDoc->url().url();
01569 QString theSubject = d->m_rootDoc->url().fileName(false);
01570 kdDebug(30003) << "(" << fileURL <<")" << endl;
01571 QStringList urls;
01572 urls.append( fileURL );
01573 if (!fileURL.isEmpty())
01574 kapp->invokeMailer(QString::null, QString::null, QString::null, theSubject,
01575 QString::null,
01576 QString::null,
01577 urls);
01578
01579
01580
01581 else
01582 KMessageBox::detailedSorry (this, i18n("ERROR: File not found."),
01583 i18n("To send a file you must first have saved the file to the filesystem."),
01584 i18n("Error: File Not Found!"));
01585 }
01586
01587 void KoMainWindow::slotReloadFile()
01588 {
01589 KoDocument* pDoc = rootDocument();
01590 if(!pDoc || pDoc->url().isEmpty() || !pDoc->isModified())
01591 return;
01592
01593 bool bOk = KMessageBox::questionYesNo( this,
01594 i18n("You will lose all your changes!\n"
01595 "Do you want to continue?"),
01596 i18n("Warning") ) == KMessageBox::Yes;
01597 if ( !bOk )
01598 return;
01599
01600 KURL url = pDoc->url();
01601 if ( pDoc && !pDoc->isEmpty() )
01602 {
01603 setRootDocument( 0L );
01604 delete d->m_rootDoc;
01605 d->m_rootDoc = 0L;
01606 }
01607 openDocument( url );
01608 return;
01609
01610 }
01611
01612 void KoMainWindow::slotImportFile()
01613 {
01614 kdDebug(30003) << "slotImportFile()" << endl;
01615
01616 d->m_isImporting = true;
01617 slotFileOpen();
01618 d->m_isImporting = false;
01619 }
01620
01621 void KoMainWindow::slotExportFile()
01622 {
01623 kdDebug(30003) << "slotExportFile()" << endl;
01624
01625 d->m_isExporting = true;
01626 slotFileSaveAs();
01627 d->m_isExporting = false;
01628 }
01629
01630 bool KoMainWindow::isImporting() const
01631 {
01632 return d->m_isImporting;
01633 }
01634
01635 bool KoMainWindow::isExporting() const
01636 {
01637 return d->m_isExporting;
01638 }
01639
01640 #include <koMainWindow.moc>