kmail Library API Documentation

kmfolderseldlg.cpp

00001 // kmfolderseldlg.cpp
00002 
00003 #include <config.h>
00004 #include "kmfolderseldlg.h"
00005 #include "kmfoldertree.h"
00006 #include "kmmainwidget.h"
00007 #include "globalsettings.h"
00008 
00009 #include <kdebug.h>
00010 #include <qvbox.h>
00011 
00012 #include <assert.h>
00013 
00014 namespace KMail {
00015 
00016 class FolderItem : public KListViewItem
00017 {
00018   public:
00019     FolderItem( QListView * listView );
00020     FolderItem( QListView * listView, QListViewItem * afterListViewItem );
00021     FolderItem( QListViewItem * listViewItem );
00022     FolderItem( QListViewItem * listViewItem, QListViewItem * afterListViewItem );
00023 
00024     void setFolder( KMFolder * folder ) { mFolder = folder; };
00025     const KMFolder * folder() { return mFolder; };
00026 
00027   private:
00028     KMFolder * mFolder;
00029 };
00030 
00031 //-----------------------------------------------------------------------------
00032 FolderItem::FolderItem( QListView * listView )
00033   : KListViewItem( listView ),
00034     mFolder( 0 )
00035 {}
00036 
00037 //-----------------------------------------------------------------------------
00038 FolderItem::FolderItem( QListView * listView, QListViewItem * afterListViewItem )
00039   : KListViewItem( listView, afterListViewItem ),
00040     mFolder( 0 )
00041 {}
00042 
00043 //-----------------------------------------------------------------------------
00044 FolderItem::FolderItem( QListViewItem * listViewItem )
00045   : KListViewItem( listViewItem ),
00046     mFolder( 0 )
00047 {}
00048 
00049 //-----------------------------------------------------------------------------
00050 FolderItem::FolderItem( QListViewItem * listViewItem, QListViewItem * afterListViewItem )
00051   : KListViewItem( listViewItem, afterListViewItem ),
00052     mFolder( 0 )
00053 {}
00054 
00055 
00056 //-----------------------------------------------------------------------------
00057 SimpleFolderTree::SimpleFolderTree( QWidget * parent,
00058                                     KMFolderTree * folderTree,
00059                                     const QString & preSelection,
00060                                     bool mustBeReadWrite )
00061   : KListView( parent )
00062 {
00063   assert( folderTree );
00064 
00065   int columnIdx = addColumn( i18n( "Folder" ) );
00066   setRootIsDecorated( true );
00067   setSorting( -1 );
00068 
00069   FolderItem * lastItem = 0;
00070   FolderItem * lastTopItem = 0;
00071   FolderItem * selectedItem = 0;
00072   int lastDepth = 0;
00073 
00074   for ( QListViewItemIterator it( folderTree ) ; it.current() ; ++it ) {
00075     KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( it.current() );
00076 
00077     if ( !fti || fti->protocol() == KFolderTreeItem::Search )
00078       continue;
00079 
00080     int depth = fti->depth();// - 1;
00081     //kdDebug( 5006 ) << "LastDepth=" << lastDepth << "\tdepth=" << depth
00082     //                << "\tname=" << fti->text( 0 ) << endl;
00083     FolderItem * item = 0;
00084     if ( depth <= 0 ) {
00085       // top level - first top level item or after last existing top level item
00086       if ( lastTopItem )
00087         item = new FolderItem( this, lastTopItem );
00088       else
00089         item = new FolderItem( this );
00090       lastTopItem = item;
00091       depth = 0;
00092     }
00093     else {
00094       if ( depth > lastDepth ) {
00095         // next lower level - parent node will get opened
00096         item = new FolderItem( lastItem );
00097         lastItem->setOpen( true );
00098       }
00099       else {
00100         if ( depth == lastDepth )
00101           // same level - behind previous item
00102           item = new FolderItem( lastItem->parent(), lastItem );
00103         else if ( depth < lastDepth ) {
00104           // above previous level - might be more than one level difference
00105           // but highest possibility is top level
00106           while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
00107             lastItem = static_cast<FolderItem *>( lastItem->parent() );
00108           }
00109           if ( lastItem->parent() )
00110             item = new FolderItem( lastItem->parent(), lastItem );
00111           else {
00112             // chain somehow broken - what does cause this ???
00113             kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
00114                             << "folder name=" << fti->text( 0 ) << endl;
00115             item = new FolderItem( this );
00116             lastTopItem = item;
00117           }
00118         }
00119       }
00120     }
00121 
00122     item->setText( columnIdx, fti->text( 0 ) );
00123     // Make items without folders and top level items unselectable
00124     // (i.e. root item Local Folders and IMAP accounts)
00125     if ( !fti->folder() || depth == 0 || ( mustBeReadWrite && fti->folder()->isReadOnly() ) ) {
00126       item->setSelectable( false );
00127     } else {
00128       item->setFolder( fti->folder() );
00129       if ( preSelection == item->folder()->idString() )
00130         selectedItem = item;
00131     }
00132     lastItem = item;
00133     lastDepth = depth;
00134   }
00135 
00136   if ( selectedItem ) {
00137     setSelected( selectedItem, true );
00138     ensureItemVisible( selectedItem );
00139   }
00140 }
00141 
00142 //-----------------------------------------------------------------------------
00143 const KMFolder * SimpleFolderTree::folder() const
00144 {
00145   QListViewItem * item = currentItem();
00146   if( item ) {
00147     const KMFolder * folder = static_cast<FolderItem *>( item )->folder();
00148     if( folder ) return folder;
00149   }
00150   return 0;
00151 }
00152 
00153 } // namespace KMail
00154 
00155 
00156 //-----------------------------------------------------------------------------
00157 KMFolderSelDlg::KMFolderSelDlg( KMMainWidget * parent, const QString& caption, bool mustBeReadWrite )
00158   : KDialogBase( parent, "folder dialog", true, caption,
00159                  Ok|Cancel, Ok, true ) // mainwin as parent, modal
00160 {
00161   KMFolderTree * ft = parent->folderTree();
00162   assert( ft );
00163 
00164   mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), ft,
00165                                            GlobalSettings::self()->lastSelectedFolder(),
00166                                            mustBeReadWrite );
00167   mTreeView->setFocus();
00168   connect( mTreeView, SIGNAL( doubleClicked( QListViewItem*, const QPoint&, int ) ),
00169            this, SLOT( slotSelect() ) );
00170 
00171   resize(220, 300);
00172 }
00173 
00174 
00175 //-----------------------------------------------------------------------------
00176 KMFolderSelDlg::~KMFolderSelDlg()
00177 {
00178   const KMFolder * cur = folder();
00179   if ( cur ) {
00180     GlobalSettings::self()->setLastSelectedFolder( cur->idString() );
00181   }
00182 }
00183 
00184 
00185 //-----------------------------------------------------------------------------
00186 KMFolder * KMFolderSelDlg::folder( void )
00187 {
00188   return ( KMFolder * ) mTreeView->folder();
00189 }
00190 
00191 //-----------------------------------------------------------------------------
00192 void KMFolderSelDlg::slotSelect()
00193 {
00194   accept();
00195 }
00196 
00197 
00198 //-----------------------------------------------------------------------------
00199 #include "kmfolderseldlg.moc"
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu May 3 20:23:15 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003