[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