kmail Library API Documentation

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 "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();// - 1;
00094         //kdDebug( 5006 ) << "LastDepth=" << lastDepth << "\tdepth=" << depth
00095         //                << "\tname=" << fti->text( 0 ) << endl;
00096         SimpleFolderTreeItem<T> * item = 0;
00097         if ( depth <= 0 ) {
00098           // top level - first top level item or after last existing top level item
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             // next lower level - parent node will get opened
00109             item = new SimpleFolderTreeItem<T>( lastItem );
00110             lastItem->setOpen( true );
00111           }
00112           else {
00113             if ( depth == lastDepth )
00114               // same level - behind previous item
00115               item = new SimpleFolderTreeItem<T>( lastItem->parent(), lastItem );
00116             else if ( depth < lastDepth ) {
00117               // above previous level - might be more than one level difference
00118               // but highest possibility is top level
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                 // chain somehow broken - what does cause this ???
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         // Make items without folders and top level items unselectable
00137         // (i.e. root item Local Folders and IMAP accounts)
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
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Oct 17 09:55:44 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003