summaryrefslogtreecommitdiffstats
path: root/kmail/kmfolderseldlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmail/kmfolderseldlg.cpp')
-rw-r--r--kmail/kmfolderseldlg.cpp445
1 files changed, 14 insertions, 431 deletions
diff --git a/kmail/kmfolderseldlg.cpp b/kmail/kmfolderseldlg.cpp
index 607b42435..00849b6e7 100644
--- a/kmail/kmfolderseldlg.cpp
+++ b/kmail/kmfolderseldlg.cpp
@@ -2,7 +2,6 @@
#include <config.h>
#include "kmfolderseldlg.h"
-#include "kmfoldertree.h"
#include "kmfolder.h"
#include "kmmainwidget.h"
#include "globalsettings.h"
@@ -14,429 +13,10 @@
#include <tqlayout.h>
#include <tqtoolbutton.h>
-
-namespace KMail {
-
-class FolderItem : public KFolderTreeItem
-{
- public:
- FolderItem( KFolderTree * listView );
- FolderItem( KFolderTreeItem * listViewItem );
-
- void setFolder( KMFolder * folder ) { mFolder = folder; };
- const KMFolder * folder() { return mFolder; };
-
- // Redefine isAlternate() for proper row coloring behavior.
- // KListViewItem::isAlternate() is not virtual! Therefore,
- // it is necessary to overload paintCell() below. If it were
- // made virtual, paintCell() would no longer be necessary.
- bool isAlternate () {
- return mAlternate;
- }
-
- // Set the flag which determines if this is an alternate row
- void setAlternate ( bool alternate ) {
- mAlternate = alternate;
- }
-
- // Must overload paintCell because neither KListViewItem::isAlternate()
- // or KListViewItem::backgroundColor() are virtual!
- virtual void paintCell( TQPainter *p, const TQColorGroup &cg,
- int column, int width, int alignment )
- {
- KListView* view = static_cast< KListView* >( listView() );
-
- // Set alternate background to invalid
- TQColor nocolor;
- TQColor alt = view->alternateBackground();
- view->setAlternateBackground( nocolor );
-
- // Set the base and text to the appropriate colors
- TQColorGroup *cgroup = (TQColorGroup *)&view->viewport()->colorGroup();
- TQColor base = cgroup->base();
- TQColor text = cgroup->text();
- cgroup->setColor( TQColorGroup::Base, isAlternate() ? alt : base );
- cgroup->setColor( TQColorGroup::Text, isEnabled() ? text : Qt::lightGray );
-
- // Call the parent paint routine
- KListViewItem::paintCell( p, cg, column, width, alignment );
-
- // Restore the base and alternate background
- cgroup->setColor( TQColorGroup::Base, base );
- cgroup->setColor( TQColorGroup::Text, text );
- view->setAlternateBackground( alt );
- }
-
- private:
- KMFolder * mFolder;
- bool mAlternate;
-};
-
-//-----------------------------------------------------------------------------
-FolderItem::FolderItem( KFolderTree * listView )
- : KFolderTreeItem( listView ),
- mFolder( 0 )
-{}
-
-//-----------------------------------------------------------------------------
-FolderItem::FolderItem( KFolderTreeItem * listViewItem )
- : KFolderTreeItem( listViewItem ),
- mFolder( 0 )
-{}
-
-//-----------------------------------------------------------------------------
-SimpleFolderTree::SimpleFolderTree( TQWidget * parent,
- KMFolderTree * folderTree,
- const TQString & preSelection,
- bool mustBeReadWrite )
- : KFolderTree( parent ), mFolderTree( folderTree )
-{
- setSelectionModeExt( Single );
- mFolderColumn = addColumn( i18n( "Folder" ), 0 );
- mPathColumn = addColumn( i18n( "Path" ), 0 );
- setAllColumnsShowFocus( true );
- setAlternateBackground( TQColor( 0xf0, 0xf0, 0xf0 ) );
-
- reload( mustBeReadWrite, true, true, preSelection );
- readColorConfig();
-
- applyFilter( "" );
-
- connect(this, TQT_SIGNAL(collapsed(TQListViewItem*)), TQT_SLOT(recolorRows()));
- connect(this, TQT_SIGNAL(expanded(TQListViewItem*)), TQT_SLOT(recolorRows()));
-
- connect( this, TQT_SIGNAL( contextMenuRequested( TQListViewItem*, const TQPoint &, int ) ),
- this, TQT_SLOT( slotContextMenuRequested( TQListViewItem*, const TQPoint & ) ) );
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::reload( bool mustBeReadWrite, bool showOutbox,
- bool showImapFolders, const TQString& preSelection )
-{
- mLastMustBeReadWrite = mustBeReadWrite;
- mLastShowOutbox = showOutbox;
- mLastShowImapFolders = showImapFolders;
-
- clear();
- FolderItem * lastItem = 0;
- FolderItem * lastTopItem = 0;
- FolderItem * selectedItem = 0;
- int lastDepth = 0;
-
- TQString selected = preSelection;
- if ( selected.isEmpty() && folder() )
- selected = folder()->idString();
-
- mFilter = "";
- TQString path;
-
- for ( TQListViewItemIterator it( mFolderTree ) ; it.current() ; ++it )
- {
- KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( it.current() );
-
- // search folders are never shown
- if ( !fti || fti->protocol() == KFolderTreeItem::Search )
- continue;
-
- // imap folders?
- if ( fti->protocol() == KFolderTreeItem::Imap && !showImapFolders )
- continue;
-
- // the outbox?
- if ( fti->type() == KFolderTreeItem::Outbox && !showOutbox )
- continue;
-
- int depth = fti->depth();// - 1;
- FolderItem * item = 0;
- if ( depth <= 0 ) {
- // top level - first top level item or after last existing top level item
- item = new FolderItem( this );
- if ( lastTopItem )
- item->moveItem( lastTopItem );
- lastTopItem = item;
- depth = 0;
- path = "";
- }
- else {
- if ( depth > lastDepth ) {
- // next lower level - parent node will get opened
- item = new FolderItem( lastItem );
- lastItem->setOpen(true);
- }
- else {
- path = path.section( '/', 0, -2 - (lastDepth-depth) );
-
- if ( depth == lastDepth ) {
- // same level - behind previous item
- item = new FolderItem( static_cast<FolderItem*>(lastItem->parent()) );
- item->moveItem( lastItem );
- } else if ( depth < lastDepth ) {
- // above previous level - might be more than one level difference
- // but highest possibility is top level
- while ( ( depth <= --lastDepth ) && lastItem->parent() ) {
- lastItem = static_cast<FolderItem *>( lastItem->parent() );
- }
- if ( lastItem->parent() ) {
- item = new FolderItem( static_cast<FolderItem*>(lastItem->parent()) );
- item->moveItem( lastItem );
- } else {
- // chain somehow broken - what does cause this ???
- kdDebug( 5006 ) << "You shouldn't get here: depth=" << depth
- << "folder name=" << fti->text( 0 ) << endl;
- item = new FolderItem( this );
- lastTopItem = item;
- }
- }
- }
- }
-
- if ( depth > 0 )
- path += "/";
- path += fti->text( 0 );
-
- item->setText( mFolderColumn, fti->text( 0 ) );
- item->setText( mPathColumn, path );
-
- item->setProtocol( fti->protocol() );
- item->setType( fti->type() );
-
- // Make items without folders and readonly items unselectable
- // if we're told so
- if ( mustBeReadWrite && ( !fti->folder() || fti->folder()->isReadOnly() ) ) {
- item->setSelectable( false );
- } else {
- if ( fti->folder() ) {
- item->setFolder( fti->folder() );
- if ( selected == item->folder()->idString() )
- selectedItem = item;
- }
- }
- lastItem = item;
- lastDepth = depth;
- }
-
- if ( selectedItem ) {
- setSelected( selectedItem, true );
- ensureItemVisible( selectedItem );
- }
-}
-
-//-----------------------------------------------------------------------------
-const KMFolder * SimpleFolderTree::folder() const
-{
- TQListViewItem * item = currentItem();
- if ( item ) {
- const KMFolder * folder = static_cast<FolderItem *>( item )->folder();
- if( folder ) return folder;
- }
- return 0;
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::setFolder( KMFolder *folder )
-{
- for ( TQListViewItemIterator it( this ) ; it.current() ; ++it )
- {
- const KMFolder *fld = static_cast<FolderItem *>( it.current() )->folder();
- if ( fld == folder )
- {
- setSelected( it.current(), true );
- ensureItemVisible( it.current() );
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::setFolder( const TQString& idString )
-{
- setFolder( kmkernel->findFolderById( idString ) );
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::addChildFolder()
-{
- const KMFolder *fld = folder();
- if ( fld ) {
- mFolderTree->addChildFolder( (KMFolder *) fld, parentWidget() );
- reload( mLastMustBeReadWrite, mLastShowOutbox, mLastShowImapFolders );
- setFolder( (KMFolder *) fld );
- }
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::slotContextMenuRequested( TQListViewItem *lvi,
- const TQPoint &p )
-{
- if (!lvi)
- return;
- setCurrentItem( lvi );
- setSelected( lvi, TRUE );
-
- const KMFolder * folder = static_cast<FolderItem *>( lvi )->folder();
- if ( !folder || folder->noContent() || folder->noChildren() )
- return;
-
- KPopupMenu *folderMenu = new KPopupMenu;
- folderMenu->insertTitle( folder->label() );
- folderMenu->insertSeparator();
- folderMenu->insertItem(SmallIconSet("folder_new"),
- i18n("&New Subfolder..."), this,
- TQT_SLOT(addChildFolder()));
- kmkernel->setContextMenuShown( true );
- folderMenu->exec (p, 0);
- kmkernel->setContextMenuShown( false );
- delete folderMenu;
- folderMenu = 0;
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::readColorConfig (void)
-{
- TQColor c1=TQColor(kapp->palette().active().text());
- TQColor c2=TQColor(kapp->palette().active().base());
-
- mPaintInfo.colFore = c1;
- mPaintInfo.colBack = c2;
-
- TQPalette newPal = kapp->palette();
- newPal.setColor( TQColorGroup::Base, mPaintInfo.colBack );
- newPal.setColor( TQColorGroup::Text, mPaintInfo.colFore );
- setPalette( newPal );
-}
-
-
-//-----------------------------------------------------------------------------
-static int recurseFilter( TQListViewItem * item, const TQString& filter, int column )
-{
- if ( item == 0 )
- return 0;
-
- TQListViewItem * child;
- child = item->firstChild();
-
- int enabled = 0;
- while ( child ) {
- enabled += recurseFilter( child, filter, column );
- child = child->nextSibling();
- }
-
- if ( filter.length() == 0 ||
- item->text( column ).find( filter, 0, false ) >= 0 ) {
- item->setVisible( true );
- ++enabled;
- }
- else {
- item->setVisible( !!enabled );
- item->setEnabled( false );
- }
-
- return enabled;
-}
-
-void SimpleFolderTree::recolorRows()
-{
- // Iterate through the list to set the alternate row flags.
- int alt = 0;
- TQListViewItemIterator it ( this );
- while ( it.current() ) {
- FolderItem * item = static_cast< FolderItem* >( it.current() );
-
- if ( item->isVisible() ) {
- bool visible = true;
- TQListViewItem * parent = item->parent();
- while ( parent ) {
- if (!parent->isOpen()) {
- visible = false;
- break;
- }
- parent = parent->parent();
- }
-
- if ( visible ) {
- item->setAlternate( alt );
- alt = !alt;
- }
- }
-
- ++it;
- }
-}
-
-void SimpleFolderTree::applyFilter( const TQString& filter )
-{
- // Reset all items to visible, enabled, and open
- TQListViewItemIterator clean( this );
- while ( clean.current() ) {
- TQListViewItem * item = clean.current();
- item->setEnabled( true );
- item->setVisible( true );
- item->setOpen( true );
- ++clean;
- }
-
- mFilter = filter;
-
- if ( filter.isEmpty() ) {
- setColumnText( mPathColumn, i18n("Path") );
- return;
- }
-
- // Set the visibility and enabled status of each list item.
- // The recursive algorithm is necessary because visiblity
- // changes are automatically applied to child nodes by Qt.
- TQListViewItemIterator it( this );
- while ( it.current() ) {
- TQListViewItem * item = it.current();
- if ( item->depth() <= 0 )
- recurseFilter( item, filter, mPathColumn );
- ++it;
- }
-
- // Recolor the rows appropriately
- recolorRows();
-
- // Iterate through the list to find the first selectable item
- TQListViewItemIterator first ( this );
- while ( first.current() ) {
- FolderItem * item = static_cast< FolderItem* >( first.current() );
-
- if ( item->isVisible() && item->isSelectable() ) {
- setSelected( item, true );
- ensureItemVisible( item );
- break;
- }
-
- ++first;
- }
-
- // Display and save the current filter
- if ( filter.length() > 0 )
- setColumnText( mPathColumn, i18n("Path") + " ( " + filter + " )" );
- else
- setColumnText( mPathColumn, i18n("Path") );
-
- mFilter = filter;
-}
-
-//-----------------------------------------------------------------------------
-void SimpleFolderTree::keyPressEvent( TQKeyEvent *e ) {
- int ch = e->ascii();
-
- if ( ch >= 32 && ch <= 126 )
- applyFilter( mFilter + ch );
-
- else if ( ch == 8 || ch == 127 ) {
- if ( mFilter.length() > 0 ) {
- mFilter.truncate( mFilter.length()-1 );
- applyFilter( mFilter );
- }
- }
-
- else
- KListView::keyPressEvent( e );
-}
+#include <tqlabel.h>
+using namespace KMail;
//-----------------------------------------------------------------------------
KMFolderSelDlg::KMFolderSelDlg( KMMainWidget * parent, const TQString& caption,
bool mustBeReadWrite, bool useGlobalSettings )
@@ -452,7 +32,9 @@ KMFolderSelDlg::KMFolderSelDlg( KMMainWidget * parent, const TQString& caption,
TQString preSelection = mUseGlobalSettings ?
GlobalSettings::self()->lastSelectedFolder() : TQString::null;
- mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), ft,
+ TQWidget * container = makeVBoxMainWidget();
+ new TQLabel( i18n("You can start typing to filter the list of folders"), container );
+ mTreeView = new KMail::SimpleFolderTree( container, ft,
preSelection, mustBeReadWrite );
init();
}
@@ -469,7 +51,9 @@ KMFolderSelDlg::KMFolderSelDlg( TQWidget * parent, KMFolderTree * tree,
{
TQString preSelection = mUseGlobalSettings ?
GlobalSettings::self()->lastSelectedFolder() : TQString::null;
- mTreeView = new KMail::SimpleFolderTree( makeVBoxMainWidget(), tree,
+ TQWidget * container = makeVBoxMainWidget();
+ new TQLabel( i18n("You can start typing to filter the list of folders"), container );
+ mTreeView = new KMail::SimpleFolderTree( container, tree,
preSelection, mustBeReadWrite );
init();
}
@@ -547,13 +131,13 @@ void KMFolderSelDlg::readConfig()
TQValueList<int> widths = config->readIntListEntry( "ColumnWidths" );
if ( !widths.isEmpty() ) {
- mTreeView->setColumnWidth(mTreeView->mFolderColumn, widths[0]);
- mTreeView->setColumnWidth(mTreeView->mPathColumn, widths[1]);
+ mTreeView->setColumnWidth(mTreeView->folderColumn(), widths[0]);
+ mTreeView->setColumnWidth(mTreeView->pathColumn(), widths[1]);
}
else {
int colWidth = width() / 2;
- mTreeView->setColumnWidth(mTreeView->mFolderColumn, colWidth);
- mTreeView->setColumnWidth(mTreeView->mPathColumn, colWidth);
+ mTreeView->setColumnWidth(mTreeView->folderColumn(), colWidth);
+ mTreeView->setColumnWidth(mTreeView->pathColumn(), colWidth);
}
}
@@ -564,11 +148,10 @@ void KMFolderSelDlg::writeConfig()
config->writeEntry( "Size", size() );
TQValueList<int> widths;
- widths.push_back(mTreeView->columnWidth(mTreeView->mFolderColumn));
- widths.push_back(mTreeView->columnWidth(mTreeView->mPathColumn));
+ widths.push_back(mTreeView->columnWidth(mTreeView->folderColumn()));
+ widths.push_back(mTreeView->columnWidth(mTreeView->pathColumn()));
config->writeEntry( "ColumnWidths", widths );
}
-} // namespace KMail
#include "kmfolderseldlg.moc"