simplefoldertree.h
00001 /* 00002 Copyright (c) 2007 Volker Krause <vkrause@kde.org> 00003 Copyright (c) 2003 Andreas Gungl <a.gungl@gmx.de> 00004 Copyright (c) Stefan Taferner <taferner@kde.org> 00005 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 2 of the License, or 00009 (at your option) any later version. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program; if not, write to the Free Software 00018 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 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 // Set the flag which determines if this is an alternate row 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 // Reset all items to visible, enabled, and open 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 // Set the visibility and enabled status of each list item. 00207 // The recursive algorithm is necessary because visiblity 00208 // changes are automatically applied to child nodes by TQt. 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 // Recolor the rows appropriately 00218 recolorRows(); 00219 00220 // Iterate through the list to find the first selectable item 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 // Display and save the current filter 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