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 "kmfolder.h"
00025 #include "kmfoldertree.h"
00026 #include "treebase.h"
00027
00028 #include <kdebug.h>
00029 #include <klistview.h>
00030 #include <kpopupmenu.h>
00031 #include <kiconloader.h>
00032
00033 class KMFolder;
00034 class KMFolderTree;
00035
00036 namespace KMail {
00037
00038 static int recurseFilter( TQListViewItem * item, const TQString& filter, int column )
00039 {
00040 if ( item == 0 )
00041 return 0;
00042
00043 TQListViewItem * child;
00044 child = item->firstChild();
00045
00046 int enabled = 0;
00047 while ( child ) {
00048 enabled += recurseFilter( child, filter, column );
00049 child = child->nextSibling();
00050 }
00051
00052 if ( filter.length() == 0 ||
00053 item->text( column ).find( filter, 0, false ) >= 0 ) {
00054 item->setVisible( true );
00055 ++enabled;
00056 }
00057 else {
00058 item->setVisible( !!enabled );
00059 item->setEnabled( false );
00060 }
00061
00062 return enabled;
00063 }
00064
00065 class TreeItemBase
00066 {
00067 public :
00068 TreeItemBase()
00069 : mFolder( 0 )
00070 {
00071 kdDebug(5006) << k_funcinfo << endl;
00072 }
00073 virtual ~TreeItemBase() { }
00074
00075 void setFolder( KMFolder * folder ) { mFolder = folder; };
00076 const KMFolder * folder() { return mFolder; };
00077
00078
00079 void setAlternate ( bool alternate ) {
00080 mAlternate = alternate;
00081 }
00082
00083 private:
00084 KMFolder * mFolder;
00085 bool mAlternate;
00086
00087 };
00088
00089 template <class T> class SimpleFolderTreeItem : public T, public TreeItemBase
00090 {
00091 public:
00092 SimpleFolderTreeItem( TQListView * listView ) :
00093 T( listView ), TreeItemBase()
00094 {
00095 kdDebug(5006) << k_funcinfo << endl;
00096 }
00097 SimpleFolderTreeItem( TQListView * listView, TQListViewItem * afterListViewItem ) :
00098 T( listView, afterListViewItem ) , TreeItemBase()
00099 {
00100 kdDebug(5006) << k_funcinfo << endl;
00101 }
00102 SimpleFolderTreeItem( TQListViewItem * listViewItem ) : T( listViewItem ) , TreeItemBase()
00103 {
00104 kdDebug(5006) << k_funcinfo << endl;
00105 }
00106
00107 SimpleFolderTreeItem( TQListViewItem * listViewItem, TQListViewItem * afterListViewItem ) :
00108 T( listViewItem, afterListViewItem ) , TreeItemBase()
00109 {
00110 kdDebug(5006) << k_funcinfo << endl;
00111 }
00112
00113 };
00114
00115 template <> class SimpleFolderTreeItem<TQCheckListItem> : public TQCheckListItem, public TreeItemBase
00116 {
00117 public:
00118 SimpleFolderTreeItem( TQListView * listView ) :
00119 TQCheckListItem( listView, TQString(), CheckBox ), TreeItemBase() {}
00120 SimpleFolderTreeItem( TQListView * listView, TQListViewItem * afterListViewItem ) :
00121 TQCheckListItem( listView, afterListViewItem, TQString(), CheckBox ), TreeItemBase() {}
00122 SimpleFolderTreeItem( TQListViewItem * listViewItem ) :
00123 TQCheckListItem( listViewItem, TQString(), CheckBox ) {}
00124 SimpleFolderTreeItem( TQListViewItem * listViewItem, TQListViewItem * afterListViewItem ) :
00125 TQCheckListItem( listViewItem, afterListViewItem, TQString(), CheckBox ) {}
00126
00127 };
00128
00129
00130 template <class T> class SimpleFolderTreeBase : public TreeBase
00131 {
00132
00133 public:
00134
00135
00136 inline SimpleFolderTreeBase( TQWidget * parent, KMFolderTree *folderTree,
00137 const TQString &preSelection, bool mustBeReadWrite )
00138 : TreeBase( parent, folderTree, preSelection, mustBeReadWrite )
00139 {
00140 assert( folderTree );
00141 setFolderColumn( addColumn( i18n( "Folder" ) ) );
00142 setPathColumn( addColumn( i18n( "Path" ) ) );
00143
00144 setRootIsDecorated( true );
00145 setSorting( -1 );
00146
00147 reload( mustBeReadWrite, true, true, preSelection );
00148
00149 }
00150
00151 virtual SimpleFolderTreeItem<T>* createItem( TQListView * parent )
00152 {
00153 return new SimpleFolderTreeItem<T>( parent );
00154 }
00155
00156 virtual SimpleFolderTreeItem<T>* createItem( TQListView * parent, TQListViewItem* afterListViewItem )
00157 {
00158 return new SimpleFolderTreeItem<T>( parent, afterListViewItem );
00159 }
00160
00161 virtual SimpleFolderTreeItem<T>* createItem( TQListViewItem * parent, TQListViewItem* afterListViewItem )
00162 {
00163 return new SimpleFolderTreeItem<T>( parent, afterListViewItem );
00164 }
00165
00166 virtual SimpleFolderTreeItem<T>* createItem( TQListViewItem * parent )
00167 {
00168 return new SimpleFolderTreeItem<T>( parent );
00169 }
00170
00171 inline void keyPressEvent( TQKeyEvent *e )
00172 {
00173 const char ascii = e->ascii();
00174 if ( ascii == 8 || ascii == 127 ) {
00175 if ( mFilter.length() > 0 ) {
00176 mFilter.truncate( mFilter.length()-1 );
00177 applyFilter( mFilter );
00178 }
00179 } else if ( !e->text().isEmpty() && e->text().length() == 1 && e->text().at( 0 ).isPrint() ) {
00180 applyFilter( mFilter + e->text() );
00181 } else {
00182 KListView::keyPressEvent( e );
00183 }
00184 }
00185
00186 void applyFilter( const TQString& filter )
00187 {
00188 kdDebug(5006) << k_funcinfo << filter << endl ;
00189
00190 TQListViewItemIterator clean( this );
00191 while ( clean.current() ) {
00192 TQListViewItem * item = clean.current();
00193 item->setEnabled( true );
00194 item->setVisible( true );
00195 item->setOpen( true );
00196 ++clean;
00197 }
00198
00199 mFilter = filter;
00200
00201 if ( filter.isEmpty() ) {
00202 setColumnText( pathColumn(), i18n("Path") );
00203 return;
00204 }
00205
00206
00207
00208
00209 TQListViewItemIterator it( this );
00210 while ( it.current() ) {
00211 TQListViewItem * item = it.current();
00212 if ( item->depth() <= 0 )
00213 recurseFilter( item, filter, pathColumn() );
00214 ++it;
00215 }
00216
00217
00218 recolorRows();
00219
00220
00221 TQListViewItemIterator first ( this );
00222 while ( first.current() ) {
00223 SimpleFolderTreeItem<T> * item = static_cast< SimpleFolderTreeItem<T> * >( first.current() );
00224
00225 if ( item->isVisible() && item->isSelectable() ) {
00226 setSelected( item, true );
00227 ensureItemVisible( item );
00228 break;
00229 }
00230
00231 ++first;
00232 }
00233
00234
00235 if ( filter.length() > 0 )
00236 setColumnText( pathColumn(), i18n("Path") + " ( " + filter + " )" );
00237 else
00238 setColumnText( pathColumn(), i18n("Path") );
00239
00240 mFilter = filter;
00241 }
00242
00243 };
00244
00245 typedef SimpleFolderTreeBase<KListViewItem> SimpleFolderTree;
00246
00247 }
00248
00249 #endif