kmfolderseldlg.cpp
00001
00002
00003 #include <config.h>
00004 #include "kmfolderseldlg.h"
00005 #include "kmfoldertree.h"
00006 #include "kmmainwidget.h"
00007 #include "globalsettings.h"
00008
00009 #include <kdebug.h>
00010 #include <qvbox.h>
00011
00012 #include <assert.h>
00013
00014 namespace KMail {
00015
00016 class FolderItem : public KListViewItem
00017 {
00018 public:
00019 FolderItem( QListView * listView );
00020 FolderItem( QListView * listView, QListViewItem * afterListViewItem );
00021 FolderItem( QListViewItem * listViewItem );
00022 FolderItem( QListViewItem * listViewItem, QListViewItem * afterListViewItem );
00023
00024 void setFolder( KMFolder * folder ) { mFolder = folder; };
00025 const KMFolder * folder() { return mFolder; };
00026
00027 private:
00028 KMFolder * mFolder;
00029 };
00030
00031
00032 FolderItem::FolderItem( QListView * listView )
00033 : KListViewItem( listView ),
00034 mFolder( 0 )
00035 {}
00036
00037
00038 FolderItem::FolderItem( QListView * listView, QListViewItem * afterListViewItem )
00039 : KListViewItem( listView, afterListViewItem ),
00040 mFolder( 0 )
00041 {}
00042
00043
00044 FolderItem::FolderItem( QListViewItem * listViewItem )
00045 : KListViewItem( listViewItem ),
00046 mFolder( 0 )
00047 {}
00048
00049
00050 FolderItem::FolderItem( QListViewItem * listViewItem, QListViewItem * afterListViewItem )
00051 : KListViewItem( listViewItem, afterListViewItem ),
00052 mFolder( 0 )
00053 {}
00054
00055
00056
00057 SimpleFolderTree::SimpleFolderTree( QWidget * parent,
00058 KMFolderTree * folderTree,
00059 const QString & preSelection,
00060 bool mustBeReadWrite )
00061 : KListView( parent )
00062 {
00063 assert( folderTree );
00064
00065 int columnIdx = addColumn( i18n( "Folder" ) );
00066 setRootIsDecorated( true );
00067 setSorting( -1 );
00068
00069 FolderItem * lastItem = 0;
00070 FolderItem * lastTopItem = 0;
00071 FolderItem * selectedItem = 0;
00072 int lastDepth = 0;
00073
00074 for ( QListViewItemIterator it( folderTree ) ; it.current() ; ++it ) {
00075 KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( it.current() );
00076
00077 if ( !fti || fti->protocol() == KFolderTreeItem::Search )
00078 continue;
00079
00080 int depth = fti->depth();
00081
00082
00083 FolderItem * item = 0;
00084 if ( depth <= 0 ) {
00085
00086 if ( lastTopItem )
00087 item = new FolderItem( this, lastTopItem );
00088 else
00089 item = new FolderItem( this );
00090 lastTopItem = item;
00091 depth = 0;
00092 }
00093 else {
00094 if ( depth > lastDepth ) {
00095
00096 item = new FolderItem( lastItem );
00097 lastItem->setOpen( true );
00098 }
00099 else {
00100 if ( depth == lastDepth )
00101
00102 item = new FolderItem( lastItem->parent(), lastItem );
00103 else if ( depth < lastDepth ) {
00104
00105
00106 while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
00107 lastItem = static_cast<FolderItem *>( lastItem->parent() );
00108 }
00109 if ( lastItem->parent() )
00110 item = new FolderItem( lastItem->parent(), lastItem );
00111 else {
00112
00113 kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
00114 << "folder name=" << fti->text( 0 ) << endl;
00115 item = new FolderItem( this );
00116 lastTopItem = item;
00117 }
00118 }
00119 }
00120 }
00121
00122 item->setText( columnIdx, fti->text( 0 ) );
00123
00124
00125 if ( !fti->folder() || depth == 0 || ( mustBeReadWrite && fti->folder()->isReadOnly() ) ) {
00126 item->setSelectable( false );
00127 } else {
00128 item->setFolder( fti->folder() );
00129 if ( preSelection == item->folder()->idString() )
00130 selectedItem = item;
00131 }
00132 lastItem = item;
00133 lastDepth = depth;
00134 }
00135
00136 if ( selectedItem ) {
00137 setSelected( selectedItem, true );
00138 ensureItemVisible( selectedItem );
00139 }
00140 }
00141
00142
00143 const KMFolder * SimpleFolderTree::folder() const
00144 {
00145 QListViewItem * item = currentItem();
00146 if( item ) {
00147 const KMFolder * folder = static_cast<FolderItem *>( item )->folder();
00148 if( folder ) return folder;
00149 }
00150 return 0;
00151 }
00152
00153 }
00154
00155
00156
00157 KMFolderSelDlg::KMFolderSelDlg( KMMainWidget * parent, const QString& caption, bool mustBeReadWrite )
00158 : KDialogBase( parent, "folder dialog", true, caption,
00159 Ok|Cancel, Ok, true )
00160 {
00161 KMFolderTree * ft = parent->folderTree();
00162 assert( ft );
00163
00164 mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), ft,
00165 GlobalSettings::self()->lastSelectedFolder(),
00166 mustBeReadWrite );
00167 mTreeView->setFocus();
00168 connect( mTreeView, SIGNAL( doubleClicked( QListViewItem*, const QPoint&, int ) ),
00169 this, SLOT( slotSelect() ) );
00170
00171 resize(220, 300);
00172 }
00173
00174
00175
00176 KMFolderSelDlg::~KMFolderSelDlg()
00177 {
00178 const KMFolder * cur = folder();
00179 if ( cur ) {
00180 GlobalSettings::self()->setLastSelectedFolder( cur->idString() );
00181 }
00182 }
00183
00184
00185
00186 KMFolder * KMFolderSelDlg::folder( void )
00187 {
00188 return ( KMFolder * ) mTreeView->folder();
00189 }
00190
00191
00192 void KMFolderSelDlg::slotSelect()
00193 {
00194 accept();
00195 }
00196
00197
00198
00199 #include "kmfolderseldlg.moc"
This file is part of the documentation for kmail Library Version 3.3.2.