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::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::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"