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