00001
00002
00003 #include <config.h>
00004 #include "kmfolderseldlg.h"
00005 #include "kmfoldertree.h"
00006 #include "kmfolder.h"
00007 #include "kmmainwidget.h"
00008 #include "globalsettings.h"
00009
00010 #include <kdebug.h>
00011 #include <klineedit.h>
00012 #include <kpopupmenu.h>
00013 #include <kiconloader.h>
00014
00015 #include <qlayout.h>
00016 #include <qtoolbutton.h>
00017
00018 namespace KMail {
00019
00020 class FolderItem : public KFolderTreeItem
00021 {
00022 public:
00023 FolderItem( KFolderTree * listView );
00024 FolderItem( KFolderTreeItem * listViewItem );
00025
00026 void setFolder( KMFolder * folder ) { mFolder = folder; };
00027 const KMFolder * folder() { return mFolder; };
00028
00029 private:
00030 KMFolder * mFolder;
00031 };
00032
00033
00034 FolderItem::FolderItem( KFolderTree * listView )
00035 : KFolderTreeItem( listView ),
00036 mFolder( 0 )
00037 {}
00038
00039
00040 FolderItem::FolderItem( KFolderTreeItem * listViewItem )
00041 : KFolderTreeItem( listViewItem ),
00042 mFolder( 0 )
00043 {}
00044
00045
00046 SimpleFolderTree::SimpleFolderTree( QWidget * parent,
00047 KMFolderTree * folderTree,
00048 const QString & preSelection,
00049 bool mustBeReadWrite )
00050 : KFolderTree( parent ), mFolderTree( folderTree )
00051 {
00052 setSelectionModeExt( Single );
00053 mFolderColumn = addColumn( i18n( "Folder" ) );
00054
00055 reload( mustBeReadWrite, true, true, preSelection );
00056 readColorConfig();
00057
00058 connect( this, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint &, int ) ),
00059 this, SLOT( slotContextMenuRequested( QListViewItem*, const QPoint & ) ) );
00060 }
00061
00062
00063 void SimpleFolderTree::reload( bool mustBeReadWrite, bool showOutbox,
00064 bool showImapFolders, const QString& preSelection )
00065 {
00066 mLastMustBeReadWrite = mustBeReadWrite;
00067 mLastShowOutbox = showOutbox;
00068 mLastShowImapFolders = showImapFolders;
00069
00070 clear();
00071 FolderItem * lastItem = 0;
00072 FolderItem * lastTopItem = 0;
00073 FolderItem * selectedItem = 0;
00074 int lastDepth = 0;
00075
00076 QString selected = preSelection;
00077 if ( selected.isEmpty() && folder() )
00078 selected = folder()->idString();
00079
00080 for ( QListViewItemIterator it( mFolderTree ) ; it.current() ; ++it )
00081 {
00082 KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( it.current() );
00083
00084
00085 if ( !fti || fti->protocol() == KFolderTreeItem::Search )
00086 continue;
00087
00088
00089 if ( fti->protocol() == KFolderTreeItem::Imap && !showImapFolders )
00090 continue;
00091
00092
00093 if ( fti->type() == KFolderTreeItem::Outbox && !showOutbox )
00094 continue;
00095
00096 int depth = fti->depth();
00097 FolderItem * item = 0;
00098 if ( depth <= 0 ) {
00099
00100 item = new FolderItem( this );
00101 if ( lastTopItem )
00102 item->moveItem( lastTopItem );
00103 lastTopItem = item;
00104 depth = 0;
00105 }
00106 else {
00107 if ( depth > lastDepth ) {
00108
00109 item = new FolderItem( lastItem );
00110 lastItem->setOpen(true);
00111 }
00112 else {
00113 if ( depth == lastDepth ) {
00114
00115 item = new FolderItem( static_cast<FolderItem*>(lastItem->parent()) );
00116 item->moveItem( lastItem );
00117 } else if ( depth < lastDepth ) {
00118
00119
00120 while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
00121 lastItem = static_cast<FolderItem *>( lastItem->parent() );
00122 }
00123 if ( lastItem->parent() ) {
00124 item = new FolderItem( static_cast<FolderItem*>(lastItem->parent()) );
00125 item->moveItem( lastItem );
00126 } else {
00127
00128 kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
00129 << "folder name=" << fti->text( 0 ) << endl;
00130 item = new FolderItem( this );
00131 lastTopItem = item;
00132 }
00133 }
00134 }
00135 }
00136
00137 item->setText( mFolderColumn, fti->text( 0 ) );
00138 item->setProtocol( fti->protocol() );
00139 item->setType( fti->type() );
00140
00141
00142 if ( mustBeReadWrite && ( !fti->folder() || fti->folder()->isReadOnly() ) ) {
00143 item->setSelectable( false );
00144 } else {
00145 if ( fti->folder() ) {
00146 item->setFolder( fti->folder() );
00147 if ( selected == item->folder()->idString() )
00148 selectedItem = item;
00149 }
00150 }
00151 lastItem = item;
00152 lastDepth = depth;
00153 }
00154
00155 if ( selectedItem ) {
00156 setSelected( selectedItem, true );
00157 ensureItemVisible( selectedItem );
00158 }
00159 }
00160
00161
00162 const KMFolder * SimpleFolderTree::folder() const
00163 {
00164 QListViewItem * item = currentItem();
00165 if ( item ) {
00166 const KMFolder * folder = static_cast<FolderItem *>( item )->folder();
00167 if( folder ) return folder;
00168 }
00169 return 0;
00170 }
00171
00172
00173 void SimpleFolderTree::setFolder( KMFolder *folder )
00174 {
00175 for ( QListViewItemIterator it( this ) ; it.current() ; ++it )
00176 {
00177 const KMFolder *fld = static_cast<FolderItem *>( it.current() )->folder();
00178 if ( fld == folder )
00179 {
00180 setSelected( it.current(), true );
00181 ensureItemVisible( it.current() );
00182 }
00183 }
00184 }
00185
00186
00187 void SimpleFolderTree::setFolder( const QString& idString )
00188 {
00189 setFolder( kmkernel->findFolderById( idString ) );
00190 }
00191
00192
00193 void SimpleFolderTree::addChildFolder()
00194 {
00195 const KMFolder *fld = folder();
00196 if ( fld ) {
00197 mFolderTree->addChildFolder( (KMFolder *) fld, parentWidget() );
00198 reload( mLastMustBeReadWrite, mLastShowOutbox, mLastShowImapFolders );
00199 setFolder( (KMFolder *) fld );
00200 }
00201 }
00202
00203
00204 void SimpleFolderTree::slotContextMenuRequested( QListViewItem *lvi,
00205 const QPoint &p )
00206 {
00207 if (!lvi)
00208 return;
00209 setCurrentItem( lvi );
00210 setSelected( lvi, TRUE );
00211
00212 const KMFolder * folder = static_cast<FolderItem *>( lvi )->folder();
00213 if ( !folder || folder->noContent() || folder->noChildren() )
00214 return;
00215
00216 KPopupMenu *folderMenu = new KPopupMenu;
00217 folderMenu->insertTitle( folder->label() );
00218 folderMenu->insertSeparator();
00219 folderMenu->insertItem(SmallIconSet("folder_new"),
00220 i18n("&New Subfolder..."), this,
00221 SLOT(addChildFolder()));
00222 kmkernel->setContextMenuShown( true );
00223 folderMenu->exec (p, 0);
00224 kmkernel->setContextMenuShown( false );
00225 delete folderMenu;
00226 folderMenu = 0;
00227 }
00228
00229
00230 void SimpleFolderTree::readColorConfig (void)
00231 {
00232 QColor c1=QColor(kapp->palette().active().text());
00233 QColor c2=QColor(kapp->palette().active().base());
00234
00235 mPaintInfo.colFore = c1;
00236 mPaintInfo.colBack = c2;
00237
00238 QPalette newPal = kapp->palette();
00239 newPal.setColor( QColorGroup::Base, mPaintInfo.colBack );
00240 newPal.setColor( QColorGroup::Text, mPaintInfo.colFore );
00241 setPalette( newPal );
00242 }
00243
00244
00245
00246 KMFolderSelDlg::KMFolderSelDlg( KMMainWidget * parent, const QString& caption,
00247 bool mustBeReadWrite, bool useGlobalSettings )
00248 : KDialogBase( parent, "folder dialog", true, caption,
00249 Ok|Cancel|User1, Ok, true,
00250 KGuiItem(i18n("&New Subfolder..."), "folder_new",
00251 i18n("Create a new subfolder under the currently selected folder"))
00252 ),
00253 mUseGlobalSettings( useGlobalSettings )
00254 {
00255 KMFolderTree * ft = parent->folderTree();
00256 assert( ft );
00257
00258 QString preSelection = mUseGlobalSettings ?
00259 GlobalSettings::self()->lastSelectedFolder() : QString::null;
00260 mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), ft,
00261 preSelection, mustBeReadWrite );
00262 init();
00263 }
00264
00265
00266 KMFolderSelDlg::KMFolderSelDlg( QWidget * parent, KMFolderTree * tree,
00267 const QString& caption, bool mustBeReadWrite, bool useGlobalSettings )
00268 : KDialogBase( parent, "folder dialog", true, caption,
00269 Ok|Cancel|User1, Ok, true,
00270 KGuiItem(i18n("&New Subfolder..."), "folder_new",
00271 i18n("Create a new subfolder under the currently selected folder"))
00272 ),
00273 mUseGlobalSettings( useGlobalSettings )
00274 {
00275 QString preSelection = mUseGlobalSettings ?
00276 GlobalSettings::self()->lastSelectedFolder() : QString::null;
00277 mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), tree,
00278 preSelection, mustBeReadWrite );
00279 init();
00280 }
00281
00282
00283 void KMFolderSelDlg::init()
00284 {
00285 mTreeView->setFocus();
00286 connect( mTreeView, SIGNAL( doubleClicked( QListViewItem*, const QPoint&, int ) ),
00287 this, SLOT( slotSelect() ) );
00288 connect( mTreeView, SIGNAL( selectionChanged() ),
00289 this, SLOT( slotUpdateBtnStatus() ) );
00290
00291 readConfig();
00292 }
00293
00294
00295 KMFolderSelDlg::~KMFolderSelDlg()
00296 {
00297 const KMFolder * cur = folder();
00298 if ( cur && mUseGlobalSettings ) {
00299 GlobalSettings::self()->setLastSelectedFolder( cur->idString() );
00300 }
00301
00302 writeConfig();
00303 }
00304
00305
00306
00307 KMFolder * KMFolderSelDlg::folder( void )
00308 {
00309 return ( KMFolder * ) mTreeView->folder();
00310 }
00311
00312
00313 void KMFolderSelDlg::setFolder( KMFolder* folder )
00314 {
00315 mTreeView->setFolder( folder );
00316 }
00317
00318
00319 void KMFolderSelDlg::slotSelect()
00320 {
00321 accept();
00322 }
00323
00324
00325 void KMFolderSelDlg::slotUser1()
00326 {
00327 mTreeView->addChildFolder();
00328 }
00329
00330
00331 void KMFolderSelDlg::slotUpdateBtnStatus()
00332 {
00333 enableButton( User1, folder() &&
00334 ( !folder()->noContent() && !folder()->noChildren() ) );
00335 }
00336
00337
00338 void KMFolderSelDlg::setFlags( bool mustBeReadWrite, bool showOutbox,
00339 bool showImapFolders )
00340 {
00341 mTreeView->reload( mustBeReadWrite, showOutbox, showImapFolders );
00342 }
00343
00344 void KMFolderSelDlg::readConfig()
00345 {
00346 KConfig *config = KGlobal::config();
00347 config->setGroup( "FolderSelectionDialog" );
00348 QSize size = config->readSizeEntry( "Size" );
00349 if ( !size.isEmpty() ) resize( size );
00350 else resize( 220, 300 );
00351 }
00352
00353 void KMFolderSelDlg::writeConfig()
00354 {
00355 KConfig *config = KGlobal::config();
00356 config->setGroup( "FolderSelectionDialog" );
00357 config->writeEntry( "Size", size() );
00358 }
00359
00360 }
00361
00362 #include "kmfolderseldlg.moc"