kmail

kmfolderseldlg.cpp

00001 // kmfolderseldlg.cpp
00002 
00003 #include <config.h>
00004 #include "kmfolderseldlg.h"
00005 #include "kmfoldertree.h"
00006 #include "kmfolder.h"
00007 #include "kmmainwidget.h"
00008 #include "globalsettings.h"
00009 
00010 #include <kdebug.h>
00011 #include <klineedit.h>
00012 #include <kpopupmenu.h>
00013 #include <kiconloader.h>
00014 
00015 #include <qlayout.h>
00016 #include <qtoolbutton.h>
00017 
00018 namespace KMail {
00019 
00020 class FolderItem : public KFolderTreeItem
00021 {
00022   public:
00023     FolderItem( KFolderTree * listView );
00024     FolderItem( KFolderTreeItem * listViewItem );
00025 
00026     void setFolder( KMFolder * folder ) { mFolder = folder; };
00027     const KMFolder * folder() { return mFolder; };
00028 
00029   private:
00030     KMFolder * mFolder;
00031 };
00032 
00033 //-----------------------------------------------------------------------------
00034 FolderItem::FolderItem( KFolderTree * listView )
00035   : KFolderTreeItem( listView ),
00036     mFolder( 0 )
00037 {}
00038 
00039 //-----------------------------------------------------------------------------
00040 FolderItem::FolderItem( KFolderTreeItem * listViewItem )
00041   : KFolderTreeItem( listViewItem ),
00042     mFolder( 0 )
00043 {}
00044 
00045 //-----------------------------------------------------------------------------
00046 SimpleFolderTree::SimpleFolderTree( QWidget * parent,
00047                                     KMFolderTree * folderTree,
00048                                     const QString & preSelection,
00049                                     bool mustBeReadWrite )
00050   : KFolderTree( parent ), mFolderTree( folderTree )
00051 {
00052   setSelectionModeExt( Single );
00053   mFolderColumn = addColumn( i18n( "Folder" ) );
00054 
00055   reload( mustBeReadWrite, true, true, preSelection );
00056   readColorConfig();
00057 
00058   connect( this, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint &, int ) ),
00059            this, SLOT( slotContextMenuRequested( QListViewItem*, const QPoint & ) ) );
00060 }
00061 
00062 //-----------------------------------------------------------------------------
00063 void SimpleFolderTree::reload( bool mustBeReadWrite, bool showOutbox,
00064                                bool showImapFolders, const QString& preSelection )
00065 {
00066   mLastMustBeReadWrite = mustBeReadWrite;
00067   mLastShowOutbox = showOutbox;
00068   mLastShowImapFolders = showImapFolders;
00069 
00070   clear();
00071   FolderItem * lastItem = 0;
00072   FolderItem * lastTopItem = 0;
00073   FolderItem * selectedItem = 0;
00074   int lastDepth = 0;
00075 
00076   QString selected = preSelection;
00077   if ( selected.isEmpty() && folder() )
00078     selected = folder()->idString();
00079 
00080   for ( QListViewItemIterator it( mFolderTree ) ; it.current() ; ++it )
00081   {
00082     KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( it.current() );
00083 
00084     // search folders are never shown
00085     if ( !fti || fti->protocol() == KFolderTreeItem::Search )
00086       continue;
00087 
00088     // imap folders?
00089     if ( fti->protocol() == KFolderTreeItem::Imap && !showImapFolders )
00090       continue;
00091 
00092     // the outbox?
00093     if ( fti->type() == KFolderTreeItem::Outbox && !showOutbox )
00094       continue;
00095 
00096     int depth = fti->depth();// - 1;
00097     FolderItem * item = 0;
00098     if ( depth <= 0 ) {
00099       // top level - first top level item or after last existing top level item
00100       item = new FolderItem( this );
00101       if ( lastTopItem )
00102         item->moveItem( lastTopItem );
00103       lastTopItem = item;
00104       depth = 0;
00105     }
00106     else {
00107       if ( depth > lastDepth ) {
00108         // next lower level - parent node will get opened
00109         item = new FolderItem( lastItem );
00110         lastItem->setOpen(true);
00111       }
00112       else {
00113         if ( depth == lastDepth ) {
00114           // same level - behind previous item
00115           item = new FolderItem( static_cast<FolderItem*>(lastItem->parent()) );
00116           item->moveItem( lastItem );
00117         } else if ( depth < lastDepth ) {
00118           // above previous level - might be more than one level difference
00119           // but highest possibility is top level
00120           while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
00121             lastItem = static_cast<FolderItem *>( lastItem->parent() );
00122           }
00123           if ( lastItem->parent() ) {
00124             item = new FolderItem( static_cast<FolderItem*>(lastItem->parent()) );
00125             item->moveItem( lastItem );
00126           } else {
00127             // chain somehow broken - what does cause this ???
00128             kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
00129                             << "folder name=" << fti->text( 0 ) << endl;
00130             item = new FolderItem( this );
00131             lastTopItem = item;
00132           }
00133         }
00134       }
00135     }
00136 
00137     item->setText( mFolderColumn, fti->text( 0 ) );
00138     item->setProtocol( fti->protocol() );
00139     item->setType( fti->type() );
00140     // Make items without folders and readonly items unselectable
00141     // if we're told so
00142     if ( mustBeReadWrite && ( !fti->folder() || fti->folder()->isReadOnly() ) ) {
00143       item->setSelectable( false );
00144     } else {
00145       if ( fti->folder() ) {
00146         item->setFolder( fti->folder() );
00147         if ( selected == item->folder()->idString() )
00148           selectedItem = item;
00149       }
00150     }
00151     lastItem = item;
00152     lastDepth = depth;
00153   }
00154 
00155   if ( selectedItem ) {
00156     setSelected( selectedItem, true );
00157     ensureItemVisible( selectedItem );
00158   }
00159 }
00160 
00161 //-----------------------------------------------------------------------------
00162 const KMFolder * SimpleFolderTree::folder() const
00163 {
00164   QListViewItem * item = currentItem();
00165   if ( item ) {
00166     const KMFolder * folder = static_cast<FolderItem *>( item )->folder();
00167     if( folder ) return folder;
00168   }
00169   return 0;
00170 }
00171 
00172 //-----------------------------------------------------------------------------
00173 void SimpleFolderTree::setFolder( KMFolder *folder )
00174 {
00175   for ( QListViewItemIterator it( this ) ; it.current() ; ++it )
00176   {
00177     const KMFolder *fld = static_cast<FolderItem *>( it.current() )->folder();
00178     if ( fld == folder )
00179     {
00180       setSelected( it.current(), true );
00181       ensureItemVisible( it.current() );
00182     }
00183   }
00184 }
00185 
00186 //-----------------------------------------------------------------------------
00187 void SimpleFolderTree::setFolder( const QString& idString )
00188 {
00189   setFolder( kmkernel->findFolderById( idString ) );
00190 }
00191 
00192 //-----------------------------------------------------------------------------
00193 void SimpleFolderTree::addChildFolder()
00194 {
00195   const KMFolder *fld = folder();
00196   if ( fld ) {
00197     mFolderTree->addChildFolder( (KMFolder *) fld, parentWidget() );
00198     reload( mLastMustBeReadWrite, mLastShowOutbox, mLastShowImapFolders );
00199     setFolder( (KMFolder *) fld );
00200   }
00201 }
00202 
00203 //-----------------------------------------------------------------------------
00204 void SimpleFolderTree::slotContextMenuRequested( QListViewItem *lvi,
00205                                                  const QPoint &p )
00206 {
00207   if (!lvi)
00208     return;
00209   setCurrentItem( lvi );
00210   setSelected( lvi, TRUE );
00211 
00212   const KMFolder * folder = static_cast<FolderItem *>( lvi )->folder();
00213   if ( !folder || folder->noContent() || folder->noChildren() )
00214     return;
00215 
00216   KPopupMenu *folderMenu = new KPopupMenu;
00217   folderMenu->insertTitle( folder->label() );
00218   folderMenu->insertSeparator();
00219   folderMenu->insertItem(SmallIconSet("folder_new"),
00220                           i18n("&New Subfolder..."), this,
00221                           SLOT(addChildFolder()));
00222   kmkernel->setContextMenuShown( true );
00223   folderMenu->exec (p, 0);
00224   kmkernel->setContextMenuShown( false );
00225   delete folderMenu;
00226   folderMenu = 0;
00227 }
00228 
00229 //-----------------------------------------------------------------------------
00230 void SimpleFolderTree::readColorConfig (void)
00231 {
00232   QColor c1=QColor(kapp->palette().active().text());
00233   QColor c2=QColor(kapp->palette().active().base());
00234 
00235   mPaintInfo.colFore = c1;
00236   mPaintInfo.colBack = c2;
00237 
00238   QPalette newPal = kapp->palette();
00239   newPal.setColor( QColorGroup::Base, mPaintInfo.colBack );
00240   newPal.setColor( QColorGroup::Text, mPaintInfo.colFore );
00241   setPalette( newPal );
00242 }
00243 
00244 
00245 //-----------------------------------------------------------------------------
00246 KMFolderSelDlg::KMFolderSelDlg( KMMainWidget * parent, const QString& caption,
00247     bool mustBeReadWrite, bool useGlobalSettings )
00248   : KDialogBase( parent, "folder dialog", true, caption,
00249                  Ok|Cancel|User1, Ok, true,
00250                  KGuiItem(i18n("&New Subfolder..."), "folder_new",
00251                    i18n("Create a new subfolder under the currently selected folder"))
00252                ), // mainwin as parent, modal
00253     mUseGlobalSettings( useGlobalSettings )
00254 {
00255   KMFolderTree * ft = parent->folderTree();
00256   assert( ft );
00257 
00258   QString preSelection = mUseGlobalSettings ?
00259     GlobalSettings::self()->lastSelectedFolder() : QString::null;
00260   mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), ft,
00261                                            preSelection, mustBeReadWrite );
00262   init();
00263 }
00264 
00265 //----------------------------------------------------------------------------
00266 KMFolderSelDlg::KMFolderSelDlg( QWidget * parent, KMFolderTree * tree,
00267     const QString& caption, bool mustBeReadWrite, bool useGlobalSettings )
00268   : KDialogBase( parent, "folder dialog", true, caption,
00269                  Ok|Cancel|User1, Ok, true,
00270                  KGuiItem(i18n("&New Subfolder..."), "folder_new",
00271                    i18n("Create a new subfolder under the currently selected folder"))
00272                ), // mainwin as parent, modal
00273     mUseGlobalSettings( useGlobalSettings )
00274 {
00275   QString preSelection = mUseGlobalSettings ?
00276     GlobalSettings::self()->lastSelectedFolder() : QString::null;
00277   mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), tree,
00278                                            preSelection, mustBeReadWrite );
00279   init();
00280 }
00281 
00282 //-----------------------------------------------------------------------------
00283 void KMFolderSelDlg::init()
00284 {
00285   mTreeView->setFocus();
00286   connect( mTreeView, SIGNAL( doubleClicked( QListViewItem*, const QPoint&, int ) ),
00287            this, SLOT( slotSelect() ) );
00288   connect( mTreeView, SIGNAL( selectionChanged() ),
00289            this, SLOT( slotUpdateBtnStatus() ) );
00290 
00291   readConfig();
00292 }
00293 
00294 //-----------------------------------------------------------------------------
00295 KMFolderSelDlg::~KMFolderSelDlg()
00296 {
00297   const KMFolder * cur = folder();
00298   if ( cur && mUseGlobalSettings ) {
00299     GlobalSettings::self()->setLastSelectedFolder( cur->idString() );
00300   }
00301 
00302   writeConfig();
00303 }
00304 
00305 
00306 //-----------------------------------------------------------------------------
00307 KMFolder * KMFolderSelDlg::folder( void )
00308 {
00309   return ( KMFolder * ) mTreeView->folder();
00310 }
00311 
00312 //-----------------------------------------------------------------------------
00313 void KMFolderSelDlg::setFolder( KMFolder* folder )
00314 {
00315   mTreeView->setFolder( folder );
00316 }
00317 
00318 //-----------------------------------------------------------------------------
00319 void KMFolderSelDlg::slotSelect()
00320 {
00321   accept();
00322 }
00323 
00324 //-----------------------------------------------------------------------------
00325 void KMFolderSelDlg::slotUser1()
00326 {
00327   mTreeView->addChildFolder();
00328 }
00329 
00330 //-----------------------------------------------------------------------------
00331 void KMFolderSelDlg::slotUpdateBtnStatus()
00332 {
00333   enableButton( User1, folder() &&
00334                 ( !folder()->noContent() && !folder()->noChildren() ) );
00335 }
00336 
00337 //-----------------------------------------------------------------------------
00338 void KMFolderSelDlg::setFlags( bool mustBeReadWrite, bool showOutbox,
00339                                bool showImapFolders )
00340 {
00341   mTreeView->reload( mustBeReadWrite, showOutbox, showImapFolders );
00342 }
00343 
00344 void KMFolderSelDlg::readConfig()
00345 {
00346   KConfig *config = KGlobal::config();
00347   config->setGroup( "FolderSelectionDialog" );
00348   QSize size = config->readSizeEntry( "Size" );
00349   if ( !size.isEmpty() ) resize( size );
00350   else resize( 220, 300 );
00351 }
00352 
00353 void KMFolderSelDlg::writeConfig()
00354 {
00355   KConfig *config = KGlobal::config();
00356   config->setGroup( "FolderSelectionDialog" );
00357   config->writeEntry( "Size", size() );
00358 }
00359 
00360 } // namespace KMail
00361 
00362 #include "kmfolderseldlg.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys