[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdepim/kmail
From: Szymon Stefanek <pragma () kvirc ! net>
Date: 2008-04-30 19:52:01
Message-ID: 1209585121.939182.10216.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 802831 by stefanek:
Splitted the folder selection stuff into two files: move towards a nicer source \
layout. Added a missing null pointer check that caused crashes on tree nodes without \
a real folder.
M +1 -0 CMakeLists.txt
M +1 -1 antispamwizard.cpp
M +5 -306 folderselectiondialog.cpp
M +1 -118 folderselectiondialog.h
A folderselectiontreewidget.cpp [License: GPL (v2+)]
A folderselectiontreewidget.h [License: GPL (v2+)]
--- trunk/KDE/kdepim/kmail/CMakeLists.txt #802830:802831
@@ -102,6 +102,7 @@
kmsearchpatternedit.cpp
kmfilteraction.cpp
kmsearchpattern.cpp
+ folderselectiontreewidget.cpp
folderselectiondialog.cpp
kmfilter.cpp
kmfilterdlg.cpp
--- trunk/KDE/kdepim/kmail/antispamwizard.cpp #802830:802831
@@ -35,7 +35,7 @@
#include "kmfilteraction.h"
#include "kmfiltermgr.h"
#include "kmkernel.h"
-#include "folderselectiondialog.h"
+#include "folderselectiontreewidget.h"
#include "kmfoldertree.h"
#include "kmmainwin.h"
#include "networkaccount.h"
--- trunk/KDE/kdepim/kmail/folderselectiondialog.cpp #802830:802831
@@ -22,320 +22,19 @@
*****************************************************************************/
#include "folderselectiondialog.h"
+#include "folderselectiontreewidget.h"
#include "kmfoldertree.h"
#include "kmfolder.h"
#include "kmmainwidget.h"
#include "globalsettings.h"
-#include <kdebug.h>
-#include <klineedit.h>
-#include <kmenu.h>
-#include <kiconloader.h>
#include <kvbox.h>
#include <kconfiggroup.h>
#include <QLayout>
-#include <QToolButton>
namespace KMail {
-class FolderSelectionTreeWidgetItem : public KPIM::FolderTreeWidgetItem
-{
-public:
- FolderSelectionTreeWidgetItem( KPIM::FolderTreeWidget * listView )
- : KPIM::FolderTreeWidgetItem( listView ), mFolder( 0 ) {};
-
- FolderSelectionTreeWidgetItem( KPIM::FolderTreeWidgetItem * listViewItem )
- : KPIM::FolderTreeWidgetItem( listViewItem ), mFolder( 0 ) {};
-
-public:
- void setFolder( KMFolder * folder )
- { mFolder = folder; };
-
- KMFolder * folder()
- { return mFolder; };
-
-private:
- KMFolder * mFolder;
-};
-
-
-FolderSelectionTreeWidget::FolderSelectionTreeWidget( QWidget * parent , \
KMFolderTree * folderTree )
- : KPIM::FolderTreeWidget( parent ), mFolderTree( folderTree )
-{
- setSelectionMode( QTreeWidget::SingleSelection );
-
- mNameColumnIndex = addColumn( i18n( "Folder" ) );
- mPathColumnIndex = addColumn( i18n( "Path" ) );
-
- setContextMenuPolicy( Qt::CustomContextMenu );
- connect(
- this, SIGNAL( customContextMenuRequested( const QPoint & ) ),
- this, SLOT( slotContextMenuRequested( const QPoint & ) )
- );
-}
-
-void FolderSelectionTreeWidget::recursiveReload( KMFolderTreeItem *fti , \
FolderSelectionTreeWidgetItem *parent )
-{
- // search folders are never shown
- if ( fti->protocol() == KFolderTreeItem::Search )
- return;
-
- // imap folders?
- if ( fti->protocol() == KFolderTreeItem::Imap && !mLastShowImapFolders )
- return;
-
- // the outbox?
- if ( fti->type() == KFolderTreeItem::Outbox && !mLastShowOutbox )
- return;
-
- // top level
- FolderSelectionTreeWidgetItem *item = parent ? new FolderSelectionTreeWidgetItem( \
parent ) : new FolderSelectionTreeWidgetItem( this );
-
- // Build the path (ParentItemPath/CurrentItemName)
- QString path;
- if( parent )
- path = parent->text( mPathColumnIndex ) + "/";
- path += fti->text( 0 );
-
- item->setText( mNameColumnIndex , fti->text( 0 ) );
- item->setText( mPathColumnIndex , path );
- item->setProtocol( (KPIM::FolderTreeWidgetItem::Protocol)( fti->protocol() ) );
- item->setFolderType( (KPIM::FolderTreeWidgetItem::FolderType)( fti->type() ) );
- QPixmap pix = fti->normalIcon(KIconLoader::SizeSmall);
- item->setIcon( mNameColumnIndex , pix.isNull() ? SmallIcon( "folder" ) : QIcon( \
pix ) );
- item->setExpanded( true );
-
- // Make items without folders and readonly items unselectable
- // if we're told so
- if ( mLastMustBeReadWrite && ( !fti->folder() || fti->folder()->isReadOnly() ) ) {
- item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
- } else {
- if ( fti->folder() )
- item->setFolder( fti->folder() );
- }
-
- for (
- KMFolderTreeItem * child = static_cast<KMFolderTreeItem *>( fti->firstChild() \
);
- child;
- child = static_cast<KMFolderTreeItem *>( child->nextSibling() )
- )
- recursiveReload( child , item );
-}
-
-void FolderSelectionTreeWidget::reload( bool mustBeReadWrite, bool showOutbox,
- bool showImapFolders, const QString& preSelection )
-{
- mLastMustBeReadWrite = mustBeReadWrite;
- mLastShowOutbox = showOutbox;
- mLastShowImapFolders = showImapFolders;
-
- clear();
-
- QString selected = preSelection;
- if ( selected.isEmpty() && folder() )
- selected = folder()->idString();
-
- mFilter = "";
-
- for (
- KMFolderTreeItem * fti = static_cast<KMFolderTreeItem *>( \
mFolderTree->firstChild() ) ;
- fti;
- fti = static_cast<KMFolderTreeItem *>( fti->nextSibling() )
- )
- recursiveReload( fti , 0 );
-
- if ( preSelection.isEmpty() )
- return; // nothing more to do
-
- QTreeWidgetItemIterator it( this );
- while ( FolderSelectionTreeWidgetItem * fitem = \
static_cast<FolderSelectionTreeWidgetItem *>( *it ) )
- {
- if ( fitem->folder()->idString() == preSelection )
- {
- // found
- fitem->setSelected( true );
- scrollToItem( fitem );
- return;
- }
- ++it;
- }
-
-}
-
-KMFolder * FolderSelectionTreeWidget::folder() const
-{
- QTreeWidgetItem * item = currentItem();
- if ( item ) {
- if ( item->flags() & Qt::ItemIsSelectable )
- return static_cast<FolderSelectionTreeWidgetItem *>( item )->folder();
- }
- return 0;
-}
-
-void FolderSelectionTreeWidget::setFolder( KMFolder *folder )
-{
- for ( QTreeWidgetItemIterator it( this ) ; *it ; ++it )
- {
- const KMFolder *fld = static_cast<FolderSelectionTreeWidgetItem *>( *it \
)->folder();
- if ( fld == folder )
- {
- ( *it )->setSelected( true );
- scrollToItem( *it );
- return;
- }
- }
-}
-
-void FolderSelectionTreeWidget::setFolder( const QString& idString )
-{
- setFolder( kmkernel->findFolderById( idString ) );
-}
-
-void FolderSelectionTreeWidget::addChildFolder()
-{
- const KMFolder *fld = folder();
- if ( fld ) {
- mFolderTree->addChildFolder( (KMFolder *) fld, parentWidget() );
- reload( mLastMustBeReadWrite, mLastShowOutbox, mLastShowImapFolders );
- setFolder( (KMFolder *) fld );
- }
-}
-
-void FolderSelectionTreeWidget::slotContextMenuRequested( const QPoint &p )
-{
- QTreeWidgetItem * lvi = itemAt( p );
-
- if (!lvi)
- return;
- setCurrentItem( lvi );
- lvi->setSelected( true );
-
- const KMFolder * folder = static_cast<FolderSelectionTreeWidgetItem *>( lvi \
)->folder();
- if ( !folder || folder->noContent() || folder->noChildren() )
- return;
-
- KMenu *folderMenu = new KMenu;
- folderMenu->addTitle( folder->label() );
- folderMenu->addSeparator();
- folderMenu->addAction( KIcon("folder-new"),
- i18n("&New Subfolder..."), this,
- SLOT(addChildFolder()) );
- kmkernel->setContextMenuShown( true );
- folderMenu->exec ( viewport()->mapToGlobal( p ) , 0);
- kmkernel->setContextMenuShown( false );
- delete folderMenu;
- folderMenu = 0;
-}
-
-void FolderSelectionTreeWidget::applyFilter( const QString& filter )
-{
- if ( filter.isEmpty() )
- {
- // Empty filter:
- // reset all items to enabled, visible, expanded and not selected
- QTreeWidgetItemIterator clean( this );
- while ( QTreeWidgetItem *item = *clean )
- {
- item->setDisabled( false );
- item->setHidden( false );
- item->setExpanded( true );
- item->setSelected( false );
- ++clean;
- }
-
- setColumnText( mPathColumnIndex , i18n("Path") );
- return;
- }
-
- // Not empty filter.
- // Reset all items to disabled, hidden, closed and not selected
- QTreeWidgetItemIterator clean( this );
- while ( QTreeWidgetItem *item = *clean )
- {
- item->setDisabled( true );
- item->setHidden( true );
- item->setExpanded( false );
- item->setSelected( false );
- ++clean;
- }
-
- // Now search...
- QList<QTreeWidgetItem *> lItems = findItems( mFilter , Qt::MatchContains | \
Qt::MatchRecursive , mPathColumnIndex );
-
- for( QList<QTreeWidgetItem *>::Iterator it = lItems.begin(); it != lItems.end(); \
++it)
- {
- ( *it )->setDisabled( false );
- ( *it )->setHidden( false );
- // Open all the parents up to this item
- QTreeWidgetItem * p = ( *it )->parent();
- while( p )
- {
- p->setDisabled( false ); // we'd like to keep it disabled, but it disables the \
entire child tree :/
- p->setHidden( false );
- p->setExpanded( true );
- p = p->parent();
- }
- }
-
-
- // Iterate through the list to find the first selectable item
- QTreeWidgetItemIterator first ( this );
- while ( FolderSelectionTreeWidgetItem * item = static_cast< \
FolderSelectionTreeWidgetItem* >( *first ) )
- {
- if ( ( !item->isHidden() ) && ( !item->isDisabled() ) && ( item->flags() & \
Qt::ItemIsSelectable ) )
- {
- item->setSelected( true );
- scrollToItem( item );
- break;
- }
- ++first;
- }
-
- // Display and save the current filter
- if ( filter.length() > 0 )
- setColumnText( mPathColumnIndex , i18n("Path") + " ( " + filter + " )" );
- else
- setColumnText( mPathColumnIndex , i18n("Path") );
-
-}
-
-void FolderSelectionTreeWidget::keyPressEvent( QKeyEvent *e )
-{
- // Handle keyboard filtering.
- // Each key with text is appended to our search filter (which gets displayed
- // in the header for the Path column). Backpace removes text from the filter
- // while the del button clears the filter completly.
-
- QString s = e->text();
-
- switch(e->key())
- {
- case Qt::Key_Backspace:
- if ( mFilter.length() > 0 )
- mFilter.truncate( mFilter.length()-1 );
- applyFilter( mFilter );
- return;
- break;
- case Qt::Key_Delete:
- mFilter = "";
- applyFilter( mFilter);
- return;
- break;
- default:
- if ( !s.isEmpty() )
- {
- mFilter += s;
- applyFilter( mFilter );
- return;
- }
- break;
- }
-
- KPIM::FolderTreeWidget::keyPressEvent( e );
-}
-
-
FolderSelectionDialog::FolderSelectionDialog( KMMainWidget * parent, const QString& \
caption, bool mustBeReadWrite, bool useGlobalSettings )
: KDialog( parent ), // mainwin as parent, modal
@@ -356,10 +55,10 @@
void FolderSelectionDialog::init( KMFolderTree *tree , bool mustBeReadWrite )
{
- setButtons( Ok|Cancel|User1 );
+ setButtons( Ok | Cancel | User1 );
setObjectName( "folder dialog" );
- setButtonGuiItem( User1, KGuiItem(i18n("&New Subfolder..."), "folder-new",
- i18n("Create a new subfolder under the currently selected folder")) );
+ setButtonGuiItem( User1, KGuiItem( i18n("&New Subfolder...") , "folder-new",
+ i18n("Create a new subfolder under the currently selected folder") ) );
QString preSelection = mUseGlobalSettings ?
GlobalSettings::self()->lastSelectedFolder() : QString();
@@ -443,7 +142,7 @@
KConfigGroup group( config, myConfigGroupName );
group.writeEntry( "Size", size() );
- mTreeView->saveLayout( group ); // assume success
+ mTreeView->saveLayout( group ); // assume success (there's nothing we can do \
anyway) }
} // namespace KMail
--- trunk/KDE/kdepim/kmail/folderselectiondialog.h #802830:802831
@@ -25,133 +25,16 @@
*****************************************************************************/
#include <kdialog.h> // kdelibs
-#include <foldertreewidget.h> // libkdepim
class KMFolder;
class KMFolderTree;
class KMMainWidget;
-class KMFolderTreeItem;
namespace KMail {
-class FolderSelectionTreeWidgetItem;
+class FolderSelectionTreeWidget;
-/**
- * @brief A simple tree of folders useful for a "quick selection"
- *
- * This widget displays a two column tree of folders with the folder
- * name on the left and its full path on the right. The tree is filled
- * by fetching data from a KMFolderTree.
- *
- * Items can be filtered by typing in a string to be matched in the
- * folder path.
- */
-class FolderSelectionTreeWidget : public KPIM::FolderTreeWidget
-{
- Q_OBJECT
-private:
- int mNameColumnIndex; //< The index of the folder name column
- int mPathColumnIndex; //< The index of the path column
- KMFolderTree* mFolderTree; //< The KMFolderTree to fetch the data from
- QString mFilter; //< The current folder path filter string
- bool mLastMustBeReadWrite; //< Internal state for reload()
- bool mLastShowOutbox; //< Internal state for reload()
- bool mLastShowImapFolders; //< Internal state for reload()
-public:
- /**
- * Construct the simple folder tree.
- * Note that the widget is initially empty and you must call reload()
- * to fill it up.
- *
- * @param parent The parent widget
- * @param folderTree The folder tree to fetch the hierarchy of folders from
- */
- FolderSelectionTreeWidget(
- QWidget *parent,
- KMFolderTree *folderTree
- );
-
-public:
- /**
- * Reload the tree and select which folders to show and which not
- *
- * @param: mustBeReadWrite If true, the read-only folders become non selectable
- * @param: showOutbox If trye, the otbox folder is shown
- * @param: showImapFolders Wheter to show the IMAP folder hierarchy
- * @param: preSelection The initial folder to select
- */
- void reload(
- bool mustBeReadWrite,
- bool showOutbox,
- bool showImapFolders,
- const QString &preSelection = QString()
- );
-
- /**
- * Return the currently selected folder, or 0 if no folder is selected (yet)
- */
- KMFolder * folder() const;
-
- /**
- * Set the current folder.
- * The folder parameter must come from the KMFolderTree specified in the
- * constructor.
- */
- void setFolder( KMFolder *folder );
- /**
- * Set the current folder.
- * This is an overload that first lookups the folder by id in kmkernel.
- */
- void setFolder( const QString &idString );
-
- /**
- * Apply the given filter string.
- * Folders NOT matching the string are hidden and disabled (can't be selected).
- */
- void applyFilter( const QString& filter );
-
- /**
- * Returns the folder name column logical index.
- */
- int nameColumnIndex()
- { return mNameColumnIndex; };
-
- /**
- * Returns the folder path column logical index.
- */
- int pathColumnIndex()
- { return mPathColumnIndex; };
-
-public slots:
- /**
- * Invokes the child folder creation dialog on the currently selected
- * folder in the widget. Nothing happens if there is no current folder.
- */
- void addChildFolder();
-
-protected slots:
- /**
- * Pops up a contextual menu for the currently selected folder.
- * At the moment of writing the menu allows to invoke the addChildFolder()
- * method.
- */
- void slotContextMenuRequested( const QPoint & );
-
-protected:
- /**
- * Handles key presses for the purpose of filtering.
- */
- virtual void keyPressEvent( QKeyEvent *e );
-
- /**
- * Recursively fetches folder items from the KMFolderTree
- * by starting at fti (as root). This is internal api: use reload() instead.
- */
- void recursiveReload( KMFolderTreeItem *fti , FolderSelectionTreeWidgetItem \
*parent );
-
-};
-
/**
* @brief A dialog used to select a mail folder
*/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic