simplefoldertree.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef KMAIL_SIMPLEFOLDERTREE_H
00022 #define KMAIL_SIMPLEFOLDERTREE_H
00023
00024 #include "kmfoldertree.h"
00025
00026 #include <kdebug.h>
00027 #include <klistview.h>
00028
00029 class KMFolder;
00030 class KMFolderTree;
00031
00032 namespace KMail {
00033
00034 template <class T> class SimpleFolderTreeItem : public T
00035 {
00036 public:
00037 SimpleFolderTreeItem( QListView * listView ) : T( listView ), mFolder( 0 ) {}
00038 SimpleFolderTreeItem( QListView * listView, QListViewItem * afterListViewItem ) :
00039 T( listView, afterListViewItem ), mFolder( 0 ) {}
00040 SimpleFolderTreeItem( QListViewItem * listViewItem ) : T( listViewItem ), mFolder( 0 ) {}
00041 SimpleFolderTreeItem( QListViewItem * listViewItem, QListViewItem * afterListViewItem ) :
00042 T( listViewItem, afterListViewItem ), mFolder( 0 ) {}
00043
00044 void setFolder( KMFolder * folder ) { mFolder = folder; };
00045 const KMFolder * folder() { return mFolder; };
00046
00047 private:
00048 KMFolder * mFolder;
00049 };
00050
00051 template <> class SimpleFolderTreeItem<QCheckListItem> : public QCheckListItem
00052 {
00053 public:
00054 SimpleFolderTreeItem( QListView * listView ) :
00055 QCheckListItem( listView, QString(), CheckBox ), mFolder( 0 ) {}
00056 SimpleFolderTreeItem( QListView * listView, QListViewItem * afterListViewItem ) :
00057 QCheckListItem( listView, afterListViewItem, QString(), CheckBox ), mFolder( 0 ) {}
00058 SimpleFolderTreeItem( QListViewItem * listViewItem ) :
00059 QCheckListItem( listViewItem, QString(), CheckBox ), mFolder( 0 ) {}
00060 SimpleFolderTreeItem( QListViewItem * listViewItem, QListViewItem * afterListViewItem ) :
00061 QCheckListItem( listViewItem, afterListViewItem, QString(), CheckBox ), mFolder( 0 ) {}
00062
00063 void setFolder( KMFolder * folder ) { mFolder = folder; };
00064 const KMFolder * folder() { return mFolder; };
00065
00066 private:
00067 KMFolder * mFolder;
00068 };
00069
00070 template <class T> class SimpleFolderTreeBase : public KListView
00071 {
00072 public:
00073 inline SimpleFolderTreeBase( QWidget * parent, KMFolderTree *folderTree,
00074 const QString &preSelection, bool mustBeReadWrite )
00075 : KListView( parent )
00076 {
00077 assert( folderTree );
00078 int columnIdx = addColumn( i18n( "Folder" ) );
00079 setRootIsDecorated( true );
00080 setSorting( -1 );
00081
00082 SimpleFolderTreeItem<T> * lastItem = 0;
00083 SimpleFolderTreeItem<T> * lastTopItem = 0;
00084 SimpleFolderTreeItem<T> * selectedItem = 0;
00085 int lastDepth = 0;
00086
00087 for ( QListViewItemIterator it( folderTree ) ; it.current() ; ++it ) {
00088 KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( it.current() );
00089
00090 if ( !fti || fti->protocol() == KFolderTreeItem::Search )
00091 continue;
00092
00093 int depth = fti->depth();
00094
00095
00096 SimpleFolderTreeItem<T> * item = 0;
00097 if ( depth <= 0 ) {
00098
00099 if ( lastTopItem )
00100 item = new SimpleFolderTreeItem<T>( this, lastTopItem );
00101 else
00102 item = new SimpleFolderTreeItem<T>( this );
00103 lastTopItem = item;
00104 depth = 0;
00105 }
00106 else {
00107 if ( depth > lastDepth ) {
00108
00109 item = new SimpleFolderTreeItem<T>( lastItem );
00110 lastItem->setOpen( true );
00111 }
00112 else {
00113 if ( depth == lastDepth )
00114
00115 item = new SimpleFolderTreeItem<T>( lastItem->parent(), lastItem );
00116 else if ( depth < lastDepth ) {
00117
00118
00119 while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
00120 lastItem = static_cast<SimpleFolderTreeItem<T> *>( lastItem->parent() );
00121 }
00122 if ( lastItem->parent() )
00123 item = new SimpleFolderTreeItem<T>( lastItem->parent(), lastItem );
00124 else {
00125
00126 kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
00127 << "folder name=" << fti->text( 0 ) << endl;
00128 item = new SimpleFolderTreeItem<T>( this );
00129 lastTopItem = item;
00130 }
00131 }
00132 }
00133 }
00134
00135 item->setText( columnIdx, fti->text( 0 ) );
00136
00137
00138 if ( !fti->folder() || depth == 0 || ( mustBeReadWrite && fti->folder()->isReadOnly() ) ) {
00139 item->setSelectable( false );
00140 } else {
00141 item->setFolder( fti->folder() );
00142 if ( preSelection == item->folder()->idString() )
00143 selectedItem = item;
00144 }
00145 lastItem = item;
00146 lastDepth = depth;
00147 }
00148
00149 if ( selectedItem ) {
00150 setSelected( selectedItem, true );
00151 ensureItemVisible( selectedItem );
00152 }
00153 }
00154
00155 inline const KMFolder * folder() const
00156 {
00157 QListViewItem * item = currentItem();
00158 if( item ) {
00159 const KMFolder * folder = static_cast<SimpleFolderTreeItem<T> *>( item )->folder();
00160 return folder;
00161 }
00162 return 0;
00163 }
00164 };
00165
00166 typedef SimpleFolderTreeBase<KListViewItem> SimpleFolderTree;
00167
00168 }
00169
00170
00171 #endif
This file is part of the documentation for kmail Library Version 3.3.2.