kmail
treebase.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "treebase.h"
00021 #include "kmfolder.h"
00022 #include "kmfoldertree.h"
00023 #include "simplefoldertree.h"
00024
00025 #include <kdebug.h>
00026 #include <klistview.h>
00027
00028 using namespace KMail;
00029
00030 TreeBase::TreeBase( TQWidget *parent, KMFolderTree *folderTree,
00031 const TQString &preSelection, bool mustBeReadWrite )
00032 : KListView( parent ), mFolderTree( folderTree )
00033 {
00034 Q_UNUSED( preSelection );
00035 Q_UNUSED( mustBeReadWrite );
00036 kdDebug(5006) << k_funcinfo << endl;
00037
00038 connect(this, TQT_SIGNAL(collapsed(TQListViewItem*)), TQT_SLOT(recolorRows()));
00039 connect(this, TQT_SIGNAL(expanded(TQListViewItem*)), TQT_SLOT(recolorRows()));
00040 connect( this, TQT_SIGNAL( contextMenuRequested( TQListViewItem*, const TQPoint &, int ) ),
00041 this, TQT_SLOT( slotContextMenuRequested( TQListViewItem*, const TQPoint & ) ) );
00042
00043 }
00044
00045 const KMFolder * TreeBase::folder() const
00046 {
00047 TQListViewItem * item = currentItem();
00048 if( item ) {
00049 TreeItemBase *base = dynamic_cast<TreeItemBase*>( item );
00050 assert(base);
00051 const KMFolder * folder = base->folder();
00052 return folder;
00053 }
00054 return 0;
00055 }
00056
00057 void TreeBase::setFolder( KMFolder *folder )
00058 {
00059 for ( TQListViewItemIterator it( this ) ; it.current() ; ++it )
00060 {
00061 const KMFolder *fld = dynamic_cast<TreeItemBase*>( it.current() )->folder();
00062 if ( fld == folder )
00063 {
00064 setSelected( it.current(), true );
00065 ensureItemVisible( it.current() );
00066 }
00067 }
00068 }
00069
00070 void TreeBase::addChildFolder()
00071 {
00072 kdDebug(5006) << k_funcinfo << endl;
00073
00074 const KMFolder *fld = folder();
00075 if ( fld ) {
00076 mFolderTree->addChildFolder( (KMFolder *) fld, parentWidget() );
00077 reload( mLastMustBeReadWrite, mLastShowOutbox, mLastShowImapFolders );
00078 setFolder( (KMFolder *) fld );
00079 }
00080 }
00081
00082 void TreeBase::slotContextMenuRequested( TQListViewItem *lvi, const TQPoint &p )
00083 {
00084 kdDebug(5006) << k_funcinfo << endl;
00085
00086 if (!lvi)
00087 return;
00088 setCurrentItem( lvi );
00089 setSelected( lvi, TRUE );
00090
00091 const KMFolder * folder = dynamic_cast<TreeItemBase*>( lvi )->folder();
00092 if ( !folder || folder->noContent() || folder->noChildren() )
00093 return;
00094
00095 KPopupMenu *folderMenu = new KPopupMenu;
00096 folderMenu->insertTitle( folder->label() );
00097 folderMenu->insertSeparator();
00098 folderMenu->insertItem(SmallIconSet("folder_new"),
00099 i18n("&New Subfolder..."), this,
00100 TQT_SLOT(addChildFolder()));
00101 kmkernel->setContextMenuShown( true );
00102 folderMenu->exec (p, 0);
00103 kmkernel->setContextMenuShown( false );
00104 delete folderMenu;
00105
00106 }
00107
00108 void TreeBase::recolorRows()
00109 {
00110 kdDebug(5006) << k_funcinfo << endl;
00111
00112
00113 int alt = 0;
00114 TQListViewItemIterator it ( this );
00115 while ( it.current() ) {
00116 TQListViewItem * item = it.current() ;
00117 if ( item->isVisible() ) {
00118 bool visible = true;
00119 TQListViewItem * parent = item->parent();
00120 while ( parent ) {
00121 if (!parent->isOpen()) {
00122 visible = false;
00123 break;
00124 }
00125 parent = parent->parent();
00126 }
00127
00128 if ( visible ) {
00129 TreeItemBase * treeItemBase = dynamic_cast<TreeItemBase*>( item );
00130 treeItemBase->setAlternate( alt );
00131 alt = !alt;
00132 }
00133 }
00134 ++it;
00135 }
00136 }
00137
00138 void TreeBase::reload( bool mustBeReadWrite, bool showOutbox, bool showImapFolders,
00139 const TQString& preSelection )
00140 {
00141 clear();
00142
00143 mLastMustBeReadWrite = mustBeReadWrite;
00144 mLastShowOutbox = showOutbox;
00145 mLastShowImapFolders = showImapFolders;
00146
00147 TQListViewItem * lastItem = 0;
00148 TQListViewItem * lastTopItem = 0;
00149 TQListViewItem * selectedItem = 0;
00150 int lastDepth = 0;
00151
00152 mFilter = "";
00153 TQString path;
00154
00155 for ( TQListViewItemIterator it( mFolderTree ) ; it.current() ; ++it ) {
00156 KMFolderTreeItem * fti = dynamic_cast<KMFolderTreeItem *>( it.current() );
00157
00158 if ( !fti || fti->protocol() == KFolderTreeItem::Search )
00159 continue;
00160
00161 int depth = fti->depth();
00162
00163
00164 TQListViewItem * item = 0;
00165 if ( depth <= 0 ) {
00166
00167 if ( lastTopItem )
00168 item = createItem( this, lastTopItem );
00169 else
00170 item = createItem( this );
00171 lastTopItem = item;
00172 depth = 0;
00173 path = "";
00174 }
00175 else {
00176 if ( depth > lastDepth ) {
00177
00178 item = createItem( lastItem );
00179 lastItem->setOpen( true );
00180 }
00181 else {
00182
00183 path = path.section( '/', 0, -2 - (lastDepth-depth) );
00184 if ( depth == lastDepth )
00185
00186 item = createItem( lastItem->parent(), lastItem );
00187 else if ( depth < lastDepth ) {
00188
00189
00190 while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
00191 lastItem = static_cast<TQListViewItem *>( lastItem->parent() );
00192 }
00193 if ( lastItem->parent() )
00194 item = createItem( lastItem->parent(), lastItem );
00195 else {
00196
00197 kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
00198 << "folder name=" << fti->text( 0 ) << endl;
00199 item = createItem( this );
00200 lastTopItem = item;
00201 }
00202 }
00203 }
00204 }
00205
00206 if ( depth > 0 )
00207 path += "/";
00208 path += fti->text( 0 );
00209
00210
00211 item->setText( mFolderColumn, fti->text( 0 ) );
00212 item->setText( mPathColumn, path );
00213
00214
00215 if ( !fti->folder() || depth == 0 || ( mustBeReadWrite && fti->folder()->isReadOnly() ) ) {
00216 item->setSelectable( false );
00217 } else {
00218 TreeItemBase * treeItemBase = dynamic_cast<TreeItemBase*>( item );
00219 assert(treeItemBase);
00220 treeItemBase->setFolder( fti->folder() );
00221 if ( preSelection == treeItemBase->folder()->idString() )
00222 selectedItem = item;
00223 }
00224 lastItem = item;
00225 lastDepth = depth;
00226 }
00227
00228 if ( selectedItem ) {
00229 setSelected( selectedItem, true );
00230 ensureItemVisible( selectedItem );
00231 }
00232
00233 }
00234
00235 #include "treebase.moc"
|