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