24#include <tqcombobox.h> 
   25#include <tqdockarea.h> 
   26#include <tqguardedptr.h> 
   29#include <tqobjectlist.h> 
   30#include <tqprogressbar.h> 
   31#include <tqpushbutton.h> 
   32#include <tqsplitter.h> 
   34#include <tqwhatsthis.h> 
   36#include <dcopclient.h> 
   37#include <tdeapplication.h> 
   40#include <kedittoolbar.h> 
   43#include <kiconloader.h> 
   44#include <kkeydialog.h> 
   45#include <klibloader.h> 
   46#include <tdelistbox.h> 
   48#include <tdemessagebox.h> 
   49#include <tdeparts/componentfactory.h> 
   50#include <kplugininfo.h> 
   51#include <tdepopupmenu.h> 
   52#include <ksettings/dialog.h> 
   53#include <ksettings/dispatcher.h> 
   54#include <tdeshortcut.h> 
   55#include <tdestandarddirs.h> 
   56#include <kstatusbar.h> 
   57#include <kstdaction.h> 
   60#include <ksettings/componentsdialog.h> 
   61#include <kstringhandler.h> 
   62#include <krsqueezedtextlabel.h> 
   63#include <tdehtml_part.h> 
   64#include <tdehtmlview.h> 
   65#include <libtdepim/tdefileio.h> 
   68#include <tdeaboutdata.h> 
   69#include <tdemenubar.h> 
   70#include <tdestdaccel.h> 
   71#include <kcmultidialog.h> 
   74#include "aboutdialog.h" 
   75#include "iconsidepane.h" 
   76#include "mainwindow.h" 
   79#include "profiledialog.h" 
   80#include "profilemanager.h" 
   81#include "progressdialog.h" 
   82#include "statusbarprogresswidget.h" 
   83#include "broadcaststatus.h" 
   85using namespace Kontact;
 
   87class SettingsDialogWrapper : 
public KSettings::Dialog
 
   90    SettingsDialogWrapper( ContentInListView content, TQWidget * parent = 0 )
 
   91      : KSettings::Dialog( content, parent, 0 )
 
   96    void fixButtonLabel( TQWidget *widget )
 
   98      TQObject *
object = widget->child( 
"KJanusWidget::buttonBelowList" );
 
   99      TQPushButton *button = 
static_cast<TQPushButton*
>( object );
 
  101        button->setText( i18n( 
"Select Components ..." ) );
 
  105MainWindow::MainWindow()
 
  106  : Kontact::
Core(), mTopWidget( 0 ), mSplitter( 0 ),
 
  107    mCurrentPlugin( 0 ), mAboutDialog( 0 ), mReallyClose( false ), mSyncActionsEnabled( true )
 
  111  setWFlags( getWFlags() | WGroupLeader );
 
  117void MainWindow::initGUI()
 
  121  setHelpMenuEnabled( 
false );
 
  122  KHelpMenu *helpMenu = 
new KHelpMenu( 
this, 0, 
true, actionCollection() );
 
  123  connect( helpMenu, TQ_SIGNAL( showAboutApplication() ),
 
  124           TQ_SLOT( showAboutDialog() ) );
 
  126  TDETrader::OfferList offers = TDETrader::self()->query(
 
  127      TQString::fromLatin1( 
"Kontact/Plugin" ),
 
  128      TQString( 
"[X-TDE-KontactPluginVersion] == %1" ).arg( KONTACT_PLUGIN_VERSION ) );
 
  129  mPluginInfos = KPluginInfo::fromServices( offers, Prefs::self()->config(), 
"Plugins" );
 
  131  KPluginInfo::List::Iterator it;
 
  132  for ( it = mPluginInfos.begin(); it != mPluginInfos.end(); ++it ) {
 
  135    TDEAction *action = 
new TDEAction( (*it)->name(), (*it)->icon(), TDEShortcut(),
 
  136                                   this, TQ_SLOT(slotActionTriggered()),
 
  137                                   actionCollection(), (*it)->pluginName().latin1() );
 
  138    action->setName( (*it)->pluginName().latin1() );
 
  139    action->setWhatsThis( i18n( 
"Switch to plugin %1" ).arg( (*it)->name() ) );
 
  141    TQVariant hasPartProp = (*it)->property( 
"X-TDE-KontactPluginHasPart" );
 
  142    if ( !hasPartProp.isValid() || hasPartProp.toBool() ) {
 
  143      mActionPlugins.append( action );
 
  147  KStdAction::keyBindings( 
this, TQ_SLOT( configureShortcuts() ), actionCollection() );
 
  148  KStdAction::configureToolbars( 
this, TQ_SLOT( configureToolbars() ), actionCollection() );
 
  149  setXMLFile( 
"kontactui.rc" );
 
  151  setStandardToolBarMenuEnabled( 
true );
 
  158  setAutoSaveSettings();
 
  160  connect( Kontact::ProfileManager::self(), TQ_SIGNAL( profileLoaded( 
const TQString& ) ),
 
  161           this, TQ_SLOT( slotLoadProfile( 
const TQString& ) ) );
 
  162  connect( Kontact::ProfileManager::self(), TQ_SIGNAL( saveToProfileRequested( 
const TQString& ) ),
 
  163           this, TQ_SLOT( slotSaveToProfile( 
const TQString& ) ) );
 
  167void MainWindow::initObject()
 
  170  mPartManager = 
new KParts::PartManager( 
this );
 
  171  connect( mPartManager, TQ_SIGNAL( activePartChanged( KParts::Part* ) ),
 
  172           this, TQ_SLOT( slotActivePartChanged( KParts::Part* ) ) );
 
  175    mSidePane->updatePlugins();
 
  178  KSettings::Dispatcher::self()->registerInstance( instance(), 
this,
 
  179                                                   TQ_SLOT( updateConfig() ) );
 
  188  slotShowStatusMsg( TQString() );
 
  190  connect( KPIM::BroadcastStatus::instance(), TQ_SIGNAL( statusMsg( 
const TQString& ) ),
 
  191           this, TQ_SLOT( slotShowStatusMsg( 
const TQString&  ) ) );
 
  194  activatePluginModule();
 
  196  if ( Prefs::lastVersionSeen() == tdeApp->aboutData()->version() ) {
 
  197    selectPlugin( mCurrentPlugin );
 
  200  paintAboutScreen( introductionString() );
 
  201  Prefs::setLastVersionSeen( tdeApp->aboutData()->version() );
 
  204MainWindow::~MainWindow()
 
  208  TQPtrList<KParts::Part> parts = *mPartManager->parts();
 
  210  for ( KParts::Part *p = parts.last(); p; p = parts.prev() ) {
 
  215  Prefs::self()->writeConfig();
 
  218void MainWindow::setActivePluginModule( 
const TQString &module )
 
  220  mActiveModule = module;
 
  221  activatePluginModule();
 
  224void MainWindow::activatePluginModule()
 
  226  if ( !mActiveModule.isEmpty() ) {
 
  227    PluginList::ConstIterator end = mPlugins.end();
 
  228    for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it )
 
  229      if ( ( *it )->identifier().contains( mActiveModule ) ) {
 
  236void MainWindow::initWidgets()
 
  239  mTopWidget = 
new TQHBox( 
this );
 
  240  mTopWidget->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
 
  241  setCentralWidget( mTopWidget );
 
  244  mSplitter = 
new TQSplitter( mTopWidget );
 
  245  mBox = 
new TQHBox( mTopWidget );
 
  246  mSidePane = 
new IconSidePane( 
this, mSplitter );
 
  247  mSidePane->setSizePolicy( TQSizePolicy( TQSizePolicy::Maximum,
 
  248                                         TQSizePolicy::Preferred ) );
 
  250  TQValueList<int> sizes;
 
  252  mSplitter->setSizes(sizes);
 
  259    vBox = 
new TQVBox( mSplitter );
 
  261    vBox = 
new TQVBox( mBox );
 
  264  vBox->setSpacing( 0 );
 
  266  mPartsStack = 
new TQWidgetStack( vBox );
 
  269  TQString loading = i18n( 
"<h2 style='text-align:center; margin-top: 0px; margin-bottom: 0px'>%1</h2>" )
 
  270                    .arg( i18n(
"Loading Kontact...") );
 
  272  paintAboutScreen( loading );
 
  275  KPIM::ProgressDialog *progressDialog = 
new KPIM::ProgressDialog( statusBar(), 
this );
 
  276  progressDialog->hide();
 
  278  mLittleProgress = 
new KPIM::StatusbarProgressWidget( progressDialog, statusBar() );
 
  280  mStatusMsgLabel = 
new KRSqueezedTextLabel( i18n( 
" Initializing..." ), statusBar() );
 
  281  mStatusMsgLabel->setAlignment( AlignLeft | AlignVCenter );
 
  283  statusBar()->addWidget( mStatusMsgLabel, 10 , 
false );
 
  284  statusBar()->addWidget( mLittleProgress, 0 , 
true );
 
  285  mLittleProgress->show();
 
  289void MainWindow::paintAboutScreen( 
const TQString& msg )
 
  291  TQString location = locate( 
"data", 
"kontact/about/main.html" );
 
  292  TQString content = KPIM::kFileToString( location );
 
  293  content = content.arg( locate( 
"data", 
"libtdepim/about/kde_infopage.css" ) );
 
  294  if ( tdeApp->reverseLayout() )
 
  295    content = content.arg( 
"@import \"%1\";" ).arg( locate( 
"data", 
"libtdepim/about/kde_infopage_rtl.css" ) );
 
  297    content = content.arg( 
"" );
 
  299  mIntroPart->begin( KURL( location ) );
 
  301  TQString appName( i18n( 
"TDE Kontact" ) );
 
  302  TQString catchPhrase( i18n( 
"Get Organized!" ) );
 
  303  TQString quickDescription( i18n( 
"The TDE Personal Information Management Suite" ) );
 
  305  mIntroPart->write( content.arg( TQFont().pointSize() + 2 ).arg( appName )
 
  306      .arg( catchPhrase ).arg( quickDescription ).arg( msg ) );
 
  310void MainWindow::initAboutScreen()
 
  312  TQHBox *introbox = 
new TQHBox( mPartsStack );
 
  313  mPartsStack->addWidget( introbox );
 
  314  mPartsStack->raiseWidget( introbox );
 
  315  mIntroPart = 
new TDEHTMLPart( introbox );
 
  316  mIntroPart->widget()->setFocusPolicy( TQWidget::WheelFocus );
 
  318  mIntroPart->setPluginsEnabled( 
false );
 
  319  mIntroPart->setJScriptEnabled( 
false ); 
 
  320  mIntroPart->setJavaEnabled( 
false );    
 
  321  mIntroPart->setMetaRefreshEnabled( 
false );
 
  322  mIntroPart->setURLCursor( KCursor::handCursor() );
 
  323  mIntroPart->view()->setLineWidth( 0 );
 
  325  connect( mIntroPart->browserExtension(),
 
  326           TQ_SIGNAL( openURLRequest( 
const KURL&, 
const KParts::URLArgs& ) ),
 
  327           TQ_SLOT( slotOpenUrl( 
const KURL& ) ) );
 
  329  connect( mIntroPart->browserExtension(),
 
  330           TQ_SIGNAL( createNewWindow( 
const KURL&, 
const KParts::URLArgs& ) ),
 
  331           TQ_SLOT( slotOpenUrl( 
const KURL& ) ) );
 
  334void MainWindow::setupActions()
 
  336  KStdAction::quit( 
this, TQ_SLOT( slotQuit() ), actionCollection() );
 
  337  mNewActions = 
new TDEToolBarPopupAction( KGuiItem( i18n( 
"New" ), 
"" ),
 
  338                                         TDEStdAccel::shortcut(TDEStdAccel::New), 
this, TQ_SLOT( slotNewClicked() ),
 
  339                                         actionCollection(), 
"action_new" );
 
  341  TDEConfig* 
const cfg = Prefs::self()->config();
 
  342  cfg->setGroup( 
"Kontact Groupware Settings" );
 
  343  mSyncActionsEnabled = cfg->readBoolEntry( 
"GroupwareMailFoldersEnabled", 
true );
 
  345  if ( mSyncActionsEnabled ) {
 
  346    mSyncActions = 
new TDEToolBarPopupAction( KGuiItem( i18n( 
"Synchronize" ) ),
 
  347                                            TDEStdAccel::shortcut(TDEStdAccel::Reload), 
this, TQ_SLOT( slotSyncClicked() ),
 
  348                                            actionCollection(), 
"action_sync" );
 
  350  new TDEAction( i18n( 
"Configure Kontact..." ), 
"configure", 0, 
this, TQ_SLOT( slotPreferences() ),
 
  351               actionCollection(), 
"settings_configure_kontact" );
 
  353  new TDEAction( i18n( 
"Configure &Profiles..." ), 0, 
this, TQ_SLOT( slotConfigureProfiles() ),
 
  354               actionCollection(), 
"settings_configure_kontact_profiles" );
 
  356  new TDEAction( i18n( 
"&Kontact Introduction" ), 0, 
this, TQ_SLOT( slotShowIntroduction() ),
 
  357               actionCollection(), 
"help_introduction" );
 
  358  new TDEAction( i18n( 
"&Tip of the Day" ), 0, 
this, TQ_SLOT( slotShowTip() ),
 
  359               actionCollection(), 
"help_tipofday" );
 
  361  KWidgetAction* spacerAction = 
new KWidgetAction( 
new TQWidget( 
this ), 
"SpacerAction", 
"", 0, 0, actionCollection(), 
"navigator_spacer_item" );
 
  362  spacerAction->setAutoSized( 
true );
 
  365void MainWindow::slotConfigureProfiles()
 
  367  TQGuardedPtr<Kontact::ProfileDialog> dlg = 
new Kontact::ProfileDialog( 
this );
 
  368  dlg->setModal( 
true );
 
  374    void copyConfigEntry( TDEConfig* source, TDEConfig* dest, 
const TQString& group, 
const TQString& key, 
const TQString& defaultValue=TQString() )
 
  376        source->setGroup( group );
 
  377        dest->setGroup( group );
 
  378        dest->writeEntry( key, source->readEntry( key, defaultValue ) );
 
  382void MainWindow::slotSaveToProfile( 
const TQString& 
id )
 
  384  const TQString path = Kontact::ProfileManager::self()->profileById( 
id ).saveLocation();
 
  388  TDEConfig* 
const cfg = Prefs::self()->config();
 
  389  Prefs::self()->writeConfig();
 
  390  saveMainWindowSettings( cfg );
 
  393  TDEConfig profile( path+
"/kontactrc", 
false, 
false );
 
  394  ::copyConfigEntry( cfg, &profile, 
"MainWindow Toolbar navigatorToolBar", 
"Hidden", 
"true" );
 
  395  ::copyConfigEntry( cfg, &profile, 
"View", 
"SidePaneSplitter" );
 
  396  ::copyConfigEntry( cfg, &profile, 
"Icons", 
"Theme" );
 
  398  for ( PluginList::Iterator it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  399    if ( !(*it)->isRunningStandalone() ) {
 
  402    (*it)->saveToProfile( path );
 
  406void MainWindow::slotLoadProfile( 
const TQString& 
id )
 
  408  const TQString path = Kontact::ProfileManager::self()->profileById( 
id ).saveLocation();
 
  412  TDEConfig* 
const cfg = Prefs::self()->config();
 
  413  Prefs::self()->writeConfig();
 
  414  saveMainWindowSettings( cfg );
 
  417  const TDEConfig profile( path+
"/kontactrc", 
false, 
false );
 
  418  const TQStringList groups = profile.groupList();
 
  419  for ( TQStringList::ConstIterator it = groups.begin(), end = groups.end(); it != end; ++it )
 
  421    cfg->setGroup( *it );
 
  422    typedef TQMap<TQString, TQString> StringMap;
 
  423    const StringMap entries = profile.entryMap( *it );
 
  424    for ( StringMap::ConstIterator it2 = entries.begin(), end = entries.end(); it2 != end; ++it2 )
 
  426      if ( it2.data() == 
"KONTACT_PROFILE_DELETE_KEY" )
 
  427        cfg->deleteEntry( it2.key() );
 
  429        cfg->writeEntry( it2.key(), it2.data() );
 
  434  Prefs::self()->readConfig();
 
  435  applyMainWindowSettings( cfg );
 
  436  TDEIconTheme::reconfigure();
 
  437  const WId wid = winId();
 
  438  KIPC::sendMessage( KIPC::PaletteChanged, wid );
 
  439  KIPC::sendMessage( KIPC::FontChanged, wid );
 
  440  KIPC::sendMessage( KIPC::StyleChanged, wid );
 
  441  KIPC::sendMessage( KIPC::SettingsChanged, wid );
 
  442  for ( 
int i = 0; i < TDEIcon::LastGroup; ++i )
 
  443      KIPC::sendMessage( KIPC::IconChanged, wid, i );
 
  447  for ( PluginList::Iterator it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  448    if ( !(*it)->isRunningStandalone() ) {
 
  449        kdDebug() << 
"Ensure loaded: " << (*it)->identifier() << endl;
 
  452    (*it)->loadProfile( path );
 
  456bool MainWindow::isPluginLoaded( 
const KPluginInfo *info )
 
  458  return (pluginFromInfo( info ) != 0);
 
  461Plugin *MainWindow::pluginFromInfo( 
const KPluginInfo *info )
 
  463  PluginList::ConstIterator end = mPlugins.end();
 
  464  for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it )
 
  465    if ( (*it)->identifier() == info->pluginName() )
 
  471Plugin *MainWindow::pluginFromAction( 
const TDEAction *action )
 
  473  PluginList::ConstIterator end = mPlugins.end();
 
  474  for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it ) {
 
  475    if ( (*it)->identifier() == action->name() ) {
 
  482bool MainWindow::isPluginLoadedByAction( 
const TDEAction *action )
 
  484  KPluginInfo::List::ConstIterator it;
 
  485  for ( it = mPluginInfos.begin(); it != mPluginInfos.end(); ++it ) {
 
  486    if ( !(*it)->isPluginEnabled() )
 
  488    if ( isPluginLoaded( *it ) ) {
 
  489      Plugin *plugin = pluginFromInfo( *it );
 
  491        if ( plugin->
identifier() == action->name() ) {
 
  500void MainWindow::sortActionsByWeight()
 
  502  TQPtrList<TDEAction> sorted;
 
  504  TQPtrListIterator<TDEAction> eit( mActionPlugins );
 
  506  while ( ( action = eit.current() ) != 0 ) {
 
  508    TQPtrListIterator<TDEAction> sortIt( sorted );
 
  511    Plugin *p1 = pluginFromAction( action );
 
  512    while ( ( saction = sortIt.current() ) != 0 ) {
 
  513      Plugin *p2 = pluginFromAction( saction );
 
  521    sorted.insert( at, action );
 
  523  mActionPlugins = sorted;
 
  526void MainWindow::loadPlugins()
 
  528  TQPtrList<Plugin> plugins;
 
  529  TQPtrList<KParts::Part> loadDelayed;
 
  532  KPluginInfo::List::ConstIterator it;
 
  533  for ( it = mPluginInfos.begin(); it != mPluginInfos.end(); ++it ) {
 
  534    if ( !(*it)->isPluginEnabled() )
 
  536    if ( isPluginLoaded( *it ) ) {
 
  537      Plugin *plugin = pluginFromInfo( *it );
 
  543    kdDebug(5600) << 
"Loading Plugin: " << (*it)->name() << endl;
 
  545      KParts::ComponentFactory::createInstanceFromService<Kontact::Plugin>(
 
  546          (*it)->service(), 
this );
 
  553    plugin->
setIcon( (*it)->icon() );
 
  555    TQVariant libNameProp = (*it)->property( 
"X-TDE-KontactPartLibraryName" );
 
  556    TQVariant exeNameProp = (*it)->property( 
"X-TDE-KontactPartExecutableName" );
 
  557    TQVariant loadOnStart = (*it)->property( 
"X-TDE-KontactPartLoadOnStart" );
 
  558    TQVariant hasPartProp = (*it)->property( 
"X-TDE-KontactPluginHasPart" );
 
  560    if ( !loadOnStart.isNull() && loadOnStart.toBool() )
 
  561      mDelayedPreload.append( plugin );
 
  563    kdDebug(5600) << 
"LIBNAMEPART: " << libNameProp.toString() << endl;
 
  567    if ( hasPartProp.isValid() )
 
  570    for ( i = 0; i < plugins.count(); ++i ) {
 
  571      Plugin *p = plugins.at( i );
 
  576    plugins.insert( i, plugin );
 
  579  for ( i = 0; i < plugins.count(); ++ i ) {
 
  580    Plugin *plugin = plugins.at( i );
 
  583    TQPtrList<TDEAction> *actionList = plugin->
newActions();
 
  585    for ( action = actionList->first(); action; action = actionList->next() ) {
 
  586      kdDebug(5600) << 
"Plugging " << action->name() << endl;
 
  587      action->plug( mNewActions->popupMenu() );
 
  588      if ( action->name() == plugin->
identifier() ) {
 
  589        mPluginAction.insert( plugin, action );
 
  593    if ( mSyncActionsEnabled ) {
 
  595      for ( action = actionList->first(); action; action = actionList->next() ) {
 
  596        kdDebug(5600) << 
"Plugging " << action->name() << endl;
 
  597        action->plug( mSyncActions->popupMenu() );
 
  604  mNewActions->setEnabled( mPlugins.size() != 0 );
 
  605  if ( mSyncActionsEnabled )
 
  606    mSyncActions->setEnabled( mPlugins.size() != 0 );
 
  609void MainWindow::unloadPlugins()
 
  611  KPluginInfo::List::ConstIterator end = mPluginInfos.constEnd();
 
  612  KPluginInfo::List::ConstIterator it;
 
  613  for ( it = mPluginInfos.constBegin(); it != end; ++it ) {
 
  614    if ( !(*it)->isPluginEnabled() )
 
  619void MainWindow::updateShortcuts()
 
  621  TQPtrList<TDEAction> loadedActions;
 
  623  sortActionsByWeight();
 
  625  TQPtrListIterator<TDEAction> it( mActionPlugins );
 
  628  while ( ( action = it.current() ) != 0 ) {
 
  630    if ( isPluginLoadedByAction( action ) ) {
 
  631      loadedActions.append( action );
 
  632      TQString shortcut = TQString( 
"CTRL+%1" ).arg( i );
 
  633      action->setShortcut( TDEShortcut( shortcut ) );
 
  636      action->setShortcut( TDEShortcut() );
 
  639  unplugActionList( 
"navigator_actionlist" );
 
  640  factory()->plugActionList( 
this, TQString( 
"navigator_actionlist" ), loadedActions );
 
  643bool MainWindow::removePlugin( 
const KPluginInfo *info )
 
  645  PluginList::Iterator end = mPlugins.end();
 
  646  for ( PluginList::Iterator it = mPlugins.begin(); it != end; ++it ) {
 
  647    if ( ( *it )->identifier() == info->pluginName() ) {
 
  651      TQPtrList<TDEAction> *actionList = plugin->
newActions();
 
  652      for ( action = actionList->first(); action; action = actionList->next() ) {
 
  653        kdDebug(5600) << 
"Unplugging " << action->name() << endl;
 
  654        action->unplug( mNewActions->popupMenu() );
 
  657      if ( mSyncActionsEnabled ) {
 
  659        for ( action = actionList->first(); action; action = actionList->next() ) {
 
  660          kdDebug(5600) << 
"Unplugging " << action->name() << endl;
 
  661          action->unplug( mSyncActions->popupMenu() );
 
  664      removeChildClient( plugin );
 
  666      if ( mCurrentPlugin == plugin )
 
  669      plugin->deleteLater(); 
 
  670      mPlugins.remove( it );
 
  673        mPluginAction.remove( plugin );
 
  676      if ( mCurrentPlugin == 0 ) {
 
  677        PluginList::Iterator it;
 
  678        for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  679          if ( (*it)->showInSideBar() ) {
 
  693  kdDebug(5600) << 
"Added plugin" << endl;
 
  695  mPlugins.append( plugin );
 
  698  insertChildClient( plugin );
 
  701void MainWindow::partLoaded( 
Kontact::Plugin*, KParts::ReadOnlyPart *part )
 
  704  if ( mPartsStack->id( part->widget() ) != -1 )
 
  707  mPartsStack->addWidget( part->widget() );
 
  709  mPartManager->addPart( part, 
false );
 
  711  part->widget()->hide();
 
  714void MainWindow::slotActivePartChanged( KParts::Part *part )
 
  721  kdDebug(5600) << 
"Part activated: " << part << 
" with stack id. " 
  722      << mPartsStack->id( part->widget() )<< endl;
 
  726  statusBar()->clear();
 
  729void MainWindow::slotNewClicked()
 
  731  TDEAction *action = mCurrentPlugin->newActions()->first();
 
  735    PluginList::Iterator it;
 
  736    for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  737      action = (*it)->newActions()->first();
 
  746void MainWindow::slotSyncClicked()
 
  748  TDEAction *action = mCurrentPlugin->syncActions()->first();
 
  752    PluginList::Iterator it;
 
  753    for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  754      action = (*it)->syncActions()->first();
 
  763TDEToolBar* Kontact::MainWindow::findToolBar(
const char* name)
 
  766  return static_cast<TDEToolBar *
>(child(name, 
"TDEToolBar"));
 
  769void MainWindow::slotActionTriggered()
 
  771  const TDEAction *actionSender = 
static_cast<const TDEAction*
>( sender() );
 
  772  TQString identifier = actionSender->name();
 
  773  if ( !identifier.isEmpty() ) {
 
  774    selectPlugin( identifier );
 
  784    statusBar()->message( i18n( 
"Application is running standalone. Foregrounding..." ), 1000 );
 
  785    mSidePane->indicateForegrunding( plugin );
 
  790  TDEApplication::setOverrideCursor( TQCursor( TQt::WaitCursor ) );
 
  792  KParts::Part *part = plugin->
part();
 
  795    TDEApplication::restoreOverrideCursor();
 
  796    KMessageBox::error( 
this, i18n( 
"Cannot load part for %1." )
 
  797                              .arg( plugin->
title() )
 
  798                        + 
"\n" + lastErrorMessage() );
 
  799    plugin->setDisabled( 
true );
 
  800    mSidePane->updatePlugins();
 
  805  TQWidget *focusWidget = tdeApp->focusWidget();
 
  806  if ( mCurrentPlugin && focusWidget ) {
 
  808    TQWidget *parent = focusWidget->parentWidget();
 
  810      if ( parent == mCurrentPlugin->part()->widget() )
 
  811        mFocusWidgets.insert( mCurrentPlugin->identifier(), TQGuardedPtr<TQWidget>( focusWidget ) );
 
  813      parent = parent->parentWidget();
 
  818    mSidePane->selectPlugin( plugin->
identifier() );
 
  823  mPartManager->setActivePart( part );
 
  824  TQWidget *
view = part->widget();
 
  828    mPartsStack->raiseWidget( view );
 
  831    if ( mFocusWidgets.contains( plugin->
identifier() ) ) {
 
  832      focusWidget = mFocusWidgets[ plugin->
identifier() ];
 
  834        focusWidget->setFocus();
 
  838    mCurrentPlugin = plugin;
 
  839    TDEAction *newAction = plugin->
newActions()->first();
 
  840    TDEAction *syncAction = plugin->
syncActions()->first();
 
  842    createGUI( plugin->
part() );
 
  844    TDEToolBar* navigatorToolBar = findToolBar( 
"navigatorToolBar" );
 
  846    if ( navigatorToolBar && !navigatorToolBar->isHidden() &&
 
  847         navigatorToolBar->barPos() == TDEToolBar::Top ) {
 
  848      topDock()->moveDockWindow( navigatorToolBar, -1 );
 
  851    setCaption( i18n( 
"Plugin dependent window title" ,
"%1 - Kontact" ).arg( plugin->
title() ) );
 
  854      mNewActions->setIcon( newAction->icon() );
 
  855      mNewActions->setText( newAction->text() );
 
  857      PluginList::Iterator it;
 
  858      for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  859        newAction = (*it)->newActions()->first();
 
  861          mNewActions->setIcon( newAction->icon() );
 
  862          mNewActions->setText( newAction->text() );
 
  867    if ( mSyncActionsEnabled ) {
 
  869        mSyncActions->setIcon( syncAction->icon() );
 
  870        mSyncActions->setText( syncAction->text() );
 
  872        PluginList::Iterator it;
 
  873        for ( it = mPlugins.begin(); it != mPlugins.end(); ++it ) {
 
  874          syncAction = (*it)->syncActions()->first();
 
  876            mSyncActions->setIcon( syncAction->icon() );
 
  877            mSyncActions->setText( syncAction->text() );
 
  886  TQStringList::ConstIterator it;
 
  887  for ( it = invisibleActions.begin(); it != invisibleActions.end(); ++it ) {
 
  888    TDEAction *action = part->actionCollection()->action( (*it).latin1() );
 
  890      TQPtrListIterator<TDEToolBar> it(  toolBarIterator() );
 
  891      for (  ; it.current() ; ++it ) {
 
  892        action->unplug( it.current() );
 
  897  TDEApplication::restoreOverrideCursor();
 
  900void MainWindow::selectPlugin( 
const TQString &pluginName )
 
  902  PluginList::ConstIterator end = mPlugins.end();
 
  903  for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it )
 
  904    if ( ( *it )->identifier() == pluginName ) {
 
  910void MainWindow::loadSettings()
 
  913    mSplitter->setSizes( Prefs::self()->mSidePaneSplitter );
 
  916  PluginList::ConstIterator it;
 
  917  for ( it = mDelayedPreload.begin(); it != mDelayedPreload.end(); ++it )
 
  920  selectPlugin( Prefs::self()->mActivePlugin );
 
  923void MainWindow::saveSettings()
 
  926    Prefs::self()->mSidePaneSplitter = mSplitter->sizes();
 
  928  if ( mCurrentPlugin )
 
  929    Prefs::self()->mActivePlugin = mCurrentPlugin->identifier();
 
  932void MainWindow::slotShowTip()
 
  937void MainWindow::slotShowIntroduction()
 
  939  mPartsStack->raiseWidget( 0 ); 
 
  942void MainWindow::showTip( 
bool force )
 
  945  PluginList::ConstIterator end = mPlugins.end();
 
  946  for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it ) {
 
  947    TQString file = (*it)->tipFile();
 
  948    if ( !file.isEmpty() )
 
  952  KTipDialog::showMultiTip( 
this, tips, force );
 
  955void MainWindow::slotQuit()
 
  961void MainWindow::slotPreferences()
 
  963  static SettingsDialogWrapper *dlg = 0;
 
  966    TQValueList<KPluginInfo*> filteredPlugins = mPluginInfos;
 
  967    PluginList::ConstIterator it;
 
  968    for ( it = mPlugins.begin(); it != mPlugins.end(); ++it )
 
  969      if ( (*it)->isRunningStandalone() ) {
 
  970        TQValueList<KPluginInfo*>::ConstIterator infoIt;
 
  971        for ( infoIt = filteredPlugins.begin(); infoIt != filteredPlugins.end(); ++infoIt ) {
 
  972          if ( (*infoIt)->pluginName() == (*it)->identifier() ) {
 
  973            filteredPlugins.remove( *infoIt );
 
  978    dlg = 
new SettingsDialogWrapper( KSettings::Dialog::Configurable, 
this );
 
  979    dlg->addPluginInfos( filteredPlugins );
 
  980    connect( dlg, TQ_SIGNAL( pluginSelectionChanged() ),
 
  981             TQ_SLOT( pluginsChanged() ) );
 
  985  dlg->fixButtonLabel( 
this );
 
  988int MainWindow::startServiceFor( 
const TQString& serviceType,
 
  989                                 const TQString& constraint,
 
  990                                 const TQString& preferences,
 
  991                                 TQString *error, TQCString* dcopService,
 
  994  PluginList::ConstIterator end = mPlugins.end();
 
  995  for ( PluginList::ConstIterator it = mPlugins.begin(); it != end; ++it ) {
 
  996    if ( (*it)->createDCOPInterface( serviceType ) ) {
 
  997      kdDebug(5600) << 
"found interface for " << serviceType << endl;
 
  999        *dcopService = (*it)->dcopClient()->appId();
 
 1000      kdDebug(5600) << 
"appId=" << (*it)->dcopClient()->appId() << endl;
 
 1006    "Didn't find dcop interface, falling back to external process" << endl;
 
 1008  return KDCOPServiceStarter::startServiceFor( serviceType, constraint,
 
 1009      preferences, error, dcopService, flags );
 
 1012void MainWindow::pluginsChanged()
 
 1016  mSidePane->updatePlugins();
 
 1020void MainWindow::updateConfig()
 
 1022  kdDebug( 5600 ) << k_funcinfo << endl;
 
 1028void MainWindow::showAboutDialog()
 
 1030  TDEApplication::setOverrideCursor( TQCursor( TQt::WaitCursor ) );
 
 1032  if ( !mAboutDialog )
 
 1033    mAboutDialog = 
new AboutDialog( 
this );
 
 1035  mAboutDialog->show();
 
 1036  mAboutDialog->raise();
 
 1037  TDEApplication::restoreOverrideCursor();
 
 1040void MainWindow::configureShortcuts()
 
 1042  KKeyDialog dialog( 
true, 
this );
 
 1043  dialog.insert( actionCollection() );
 
 1045  if ( mCurrentPlugin && mCurrentPlugin->part() )
 
 1046    dialog.insert( mCurrentPlugin->part()->actionCollection() );
 
 1051void MainWindow::configureToolbars()
 
 1053  saveMainWindowSettings( TDEGlobal::config(), 
"MainWindow" );
 
 1055  KEditToolbar edit( factory() );
 
 1056  connect( &edit, TQ_SIGNAL( newToolbarConfig() ),
 
 1057           this, TQ_SLOT( slotNewToolbarConfig() ) );
 
 1061void MainWindow::slotNewToolbarConfig()
 
 1063  if ( mCurrentPlugin && mCurrentPlugin->part() ) {
 
 1064    createGUI( mCurrentPlugin->part() );
 
 1066  if ( mCurrentPlugin ) {
 
 1067    applyMainWindowSettings( TDEGlobal::config(), 
"MainWindow" );
 
 1072void MainWindow::slotOpenUrl( 
const KURL &url )
 
 1074  if ( url.protocol() == 
"exec" ) {
 
 1075    if ( url.path() == 
"/switch" ) {
 
 1076      selectPlugin( mCurrentPlugin );
 
 1078    if ( url.path() == 
"/gwwizard" ) {
 
 1079      KRun::runCommand( 
"groupwarewizard" );
 
 1082    if ( url.path().startsWith( 
"/help" ) ) {
 
 1083      TQString app( 
"kontact" );
 
 1084      if ( !url.query().isEmpty() ) {
 
 1085        app = url.query().mid( 1 );
 
 1087      tdeApp->invokeHelp( TQString(), app );
 
 1090    new KRun( url, 
this );
 
 1094void MainWindow::readProperties( TDEConfig *config )
 
 1096  Core::readProperties( config );
 
 1098  TQStringList activePlugins = config->readListEntry( 
"ActivePlugins" );
 
 1099  TQValueList<Plugin*>::ConstIterator it = mPlugins.begin();
 
 1100  TQValueList<Plugin*>::ConstIterator end = mPlugins.end();
 
 1101  for ( ; it != end; ++it ) {
 
 1104      TQStringList::ConstIterator activePlugin = activePlugins.find( plugin->
identifier() );
 
 1105      if ( activePlugin != activePlugins.end() ) {
 
 1112void MainWindow::saveProperties( TDEConfig *config )
 
 1114  Core::saveProperties( config );
 
 1116  TQStringList activePlugins;
 
 1118  KPluginInfo::List::Iterator it = mPluginInfos.begin();
 
 1119  KPluginInfo::List::Iterator end = mPluginInfos.end();
 
 1120  for ( ; it != end; ++it ) {
 
 1121    KPluginInfo *info = *it;
 
 1122    if ( info->isPluginEnabled() ) {
 
 1123      Plugin *plugin = pluginFromInfo( info );
 
 1125        activePlugins.append( plugin->
identifier() );
 
 1131  config->writeEntry( 
"ActivePlugins", activePlugins );
 
 1134bool MainWindow::queryClose()
 
 1137  if ( tdeApp->sessionSaving() )
 
 1140  bool localClose = 
true;
 
 1141  TQValueList<Plugin*>::ConstIterator end = mPlugins.end();
 
 1142  TQValueList<Plugin*>::ConstIterator it = mPlugins.begin();
 
 1143  for ( ; it != end; ++it ) {
 
 1153void MainWindow::slotShowStatusMsg( 
const TQString &msg )
 
 1155  if ( !statusBar() || !mStatusMsgLabel )
 
 1158  mStatusMsgLabel->setText( msg );
 
 1161TQString MainWindow::introductionString()
 
 1163  TDEIconLoader *iconloader = TDEGlobal::iconLoader();
 
 1164  int iconSize = iconloader->currentSize( TDEIcon::Desktop );
 
 1166  TQString handbook_icon_path = iconloader->iconPath( 
"contents2",  TDEIcon::Desktop );
 
 1167  TQString html_icon_path = iconloader->iconPath( 
"text-html",  TDEIcon::Desktop );
 
 1168  TQString wizard_icon_path = iconloader->iconPath( 
"wizard",  TDEIcon::Desktop );
 
 1170  TQString info = i18n( 
"<h2 style='text-align:center; margin-top: 0px;'>Welcome to Kontact %1</h2>" 
 1172      "<table align=\"center\">" 
 1173      "<tr><td><a href=\"%1\"><img width=\"%1\" height=\"%1\" src=\"%1\" /></a></td>" 
 1174      "<td><a href=\"%1\">%1</a><br><span id=\"subtext\"><nobr>%1</td></tr>" 
 1175      "<tr><td><a href=\"%1\"><img width=\"%1\" height=\"%1\" src=\"%1\" /></a></td>" 
 1176      "<td><a href=\"%1\">%1</a><br><span id=\"subtext\"><nobr>%1</td></tr>" 
 1177      "<tr><td><a href=\"%1\"><img width=\"%1\" height=\"%1\" src=\"%1\" /></a></td>" 
 1178      "<td><a href=\"%1\">%1</a><br><span id=\"subtext\"><nobr>%1</td></tr>" 
 1180      "<p style=\"margin-bottom: 0px\"> <a href=\"%1\">Skip this introduction</a></p>" )
 
 1181      .arg( tdeApp->aboutData()->version() )
 
 1182      .arg( i18n( 
"Kontact handles your e-mail, addressbook, calendar, to-do list and more." ) )
 
 1183      .arg( 
"exec:/help?kontact" )
 
 1186      .arg( handbook_icon_path )
 
 1187      .arg( 
"exec:/help?kontact" )
 
 1188      .arg( i18n( 
"Read Manual" ) )
 
 1189      .arg( i18n( 
"Learn more about Kontact and its components" ) )
 
 1190      .arg( 
"http://kontact.org" )
 
 1193      .arg( html_icon_path )
 
 1194      .arg( 
"http://kontact.org" )
 
 1195      .arg( i18n( 
"Visit Kontact Website" ) )
 
 1196      .arg( i18n( 
"Access online resources and tutorials" ) )
 
 1197      .arg( 
"exec:/gwwizard" )
 
 1200      .arg( wizard_icon_path )
 
 1201      .arg( 
"exec:/gwwizard" )
 
 1202      .arg( i18n( 
"Configure Kontact as Groupware Client" ) )
 
 1203      .arg( i18n( 
"Prepare Kontact for use in corporate networks" ) )
 
 1204      .arg( 
"exec:/switch" );
 
 1208#include "mainwindow.moc" 
This class provides the interface to the Kontact core for the plugins.
Base class for all Plugins in Kontact.
KParts::ReadOnlyPart * part()
You can use this method if you need to access the current part.
virtual TQStringList invisibleToolbarActions() const
Returns a list of action name which shall be hidden in the main toolbar.
TQString title() const
Returns the localized title.
virtual bool isRunningStandalone()
Reimplement this method and return whether a standalone application is still running This is only req...
virtual bool queryClose() const
Reimplement this method if you want to add checks before closing down the main kontact window.
virtual bool showInSideBar() const
Returns whether the plugin provides a part that should be shown in the sidebar.
void setTitle(const TQString &title)
Sets the localized title.
void setIcon(const TQString &icon)
Sets the icon name.
TQPtrList< TDEAction > * syncActions() const
FIXME: write API doc for Kontact::Plugin::syncActions().
virtual void bringToForeground()
Reimplement this method if your application needs a different approach to be brought in the foregroun...
void setPartLibraryName(const TQCString &)
Set name of library which contains the KPart used by this plugin.
void setIdentifier(const TQString &identifier)
Sets the identifier.
virtual void select()
This function is called when the plugin is selected by the user before the widget of the KPart belong...
TQString identifier() const
Returns the identifier.
virtual int weight() const
Return the weight of the plugin.
virtual void saveProperties(TDEConfig *)
Session management: save properties.
virtual void readProperties(TDEConfig *)
Session management: read properties.
virtual void configUpdated()
This function is called whenever the config dialog has been closed successfully.
void setShowInSideBar(bool hasPart)
Set if the plugin provides a part that should be shown in the sidebar.
TQPtrList< TDEAction > * newActions() const
FIXME: write API doc for Kontact::Plugin::newActions().
void setExecutableName(const TQString &bin)
Sets the name of executable (if existant).
bool view(TQWidget *parent, Attachment *attachment)