You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
8.8 KiB
287 lines
8.8 KiB
/****************************************************************************** |
|
* |
|
* Copyright 2008 Szymon Tomasz Stefanek <pragma@kvirc.net> |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
* |
|
*******************************************************************************/ |
|
|
|
#ifndef __KMAIL_MESSAGELISTVIEW_CORE_WIDGETBASE_H__ |
|
#define __KMAIL_MESSAGELISTVIEW_CORE_WIDGETBASE_H__ |
|
|
|
#include <QWidget> |
|
#include <QString> |
|
#include <QList> |
|
|
|
#include "messagelistview/core/enums.h" |
|
#include "messagelistview/core/sortorder.h" |
|
|
|
class KLineEdit; |
|
class QTimer; |
|
class QToolButton; |
|
class QActionGroup; |
|
class QHeaderView; |
|
class KMenu; |
|
|
|
namespace KPIM |
|
{ |
|
class MessageStatus; |
|
} |
|
|
|
namespace KMail |
|
{ |
|
|
|
namespace MessageListView |
|
{ |
|
|
|
namespace Core |
|
{ |
|
|
|
class Aggregation; |
|
class Filter; |
|
class GroupHeaderItem; |
|
class Manager; |
|
class MessageItem; |
|
class Theme; |
|
class StorageModel; |
|
class View; |
|
|
|
/** |
|
* Provides a widget which has the messagelist and the most important helper widgets, |
|
* like the search line and the comboboxes for changing status filtering, aggregation etc. |
|
*/ |
|
class Widget : public QWidget |
|
{ |
|
friend class View; |
|
friend class Manager; |
|
|
|
Q_OBJECT |
|
public: |
|
Widget( QWidget *parent ); |
|
~Widget(); |
|
|
|
private: |
|
View *mView; |
|
QString mLastAggregationId; |
|
QString mLastThemeId; |
|
KLineEdit * mSearchEdit; |
|
QTimer * mSearchTimer; |
|
QToolButton * mStatusFilterButton; |
|
QToolButton * mSortOrderButton; |
|
QToolButton * mAggregationButton; |
|
QToolButton * mThemeButton; |
|
|
|
StorageModel * mStorageModel; ///< The currently displayed storage. The storage itself |
|
/// is owned by MessageListView::Widget. |
|
Aggregation * mAggregation; ///< The currently set aggregation mode, a deep copy |
|
Theme * mTheme; ///< The currently set theme, a deep copy |
|
SortOrder mSortOrder; ///< The currently set sort order |
|
Filter * mFilter; ///< The currently applied filter, owned by us. |
|
bool mStorageUsesPrivateTheme; ///< true if the corrent folder does not use the global theme |
|
bool mStorageUsesPrivateAggregation; ///< true if the corrent folder does not use the global aggregation |
|
bool mStorageUsesPrivateSortOrder; ///< true if the corrent folder does not use the global sort order |
|
public: |
|
/** |
|
* Sets the storage model for this Widget. |
|
* |
|
* Pre-selection is the action of automatically selecting a message just after the folder |
|
* has finished loading. See Model::setStorageModel() for more information. |
|
*/ |
|
void setStorageModel( StorageModel * storageModel, PreSelectionMode preSelectionMode = PreSelectLastSelected ); |
|
|
|
/** |
|
* Returns the StorageModel currently set. May be 0. |
|
*/ |
|
StorageModel * storageModel() const |
|
{ return mStorageModel; }; |
|
|
|
/** |
|
* Returns the search line of this widget. Can be 0 if the quick search |
|
* is disabled in the global configuration. |
|
*/ |
|
KLineEdit *quickSearch() const |
|
{ return mSearchEdit; } |
|
|
|
/** |
|
* Returns the View attached to this Widget. Never 0. |
|
*/ |
|
View * view() const |
|
{ return mView; }; |
|
|
|
/** |
|
* Returns the KPIM::MessageStatus in the current quicksearch field. |
|
*/ |
|
KPIM::MessageStatus currentFilterStatus() const; |
|
|
|
/** |
|
* Returns the search term in the current quicksearch field. |
|
*/ |
|
QString currentFilterSearchString() const; |
|
|
|
/** |
|
* Returns the id of the MessageItem::Tag currently set in the quicksearch field. |
|
*/ |
|
QString currentFilterTagId() const; |
|
|
|
protected: |
|
/** |
|
* This is called by Manager when the option sets stored within have changed. |
|
*/ |
|
void aggregationsChanged(); |
|
|
|
/** |
|
* This is called by Manager when the option sets stored within have changed. |
|
*/ |
|
void themesChanged(); |
|
|
|
/** |
|
* Called when the "Message Status/Tag" filter menu is opened by the user. |
|
* You may override this function in order to add some "custom tag" entries |
|
* to the menu. The entries should be placed in a QActionGroup which should be returned |
|
* to the caller. The QAction objects associated to the entries should have |
|
* the string id of the tag set as data() and the tag icon set as icon(). |
|
* The default implementation does nothing. |
|
*/ |
|
virtual QActionGroup * fillMessageTagMenu( KMenu * menu ); |
|
|
|
/** |
|
* This is called by View when a message is single-clicked (thus selected and made current) |
|
*/ |
|
virtual void viewMessageSelected( MessageItem *msg ); |
|
|
|
/** |
|
* This is called by View when a message is double-clicked or activated by other input means |
|
*/ |
|
virtual void viewMessageActivated( MessageItem *msg ); |
|
|
|
/** |
|
* This is called by View when selection changes. |
|
*/ |
|
virtual void viewSelectionChanged(); |
|
|
|
/** |
|
* This is called by View when a message is right clicked. |
|
*/ |
|
virtual void viewMessageListContextPopupRequest( const QList< MessageItem * > &selectedItems, const QPoint &globalPos ); |
|
|
|
/** |
|
* This is called by View when a group header is right clicked. |
|
*/ |
|
virtual void viewGroupHeaderContextPopupRequest( GroupHeaderItem *group, const QPoint &globalPos ); |
|
|
|
/** |
|
* This is called by View when a drag enter event is received |
|
*/ |
|
virtual void viewDragEnterEvent( QDragEnterEvent * e ); |
|
|
|
/** |
|
* This is called by View when a drag move event is received |
|
*/ |
|
virtual void viewDragMoveEvent( QDragMoveEvent * e ); |
|
|
|
/** |
|
* This is called by View when a drop event is received |
|
*/ |
|
virtual void viewDropEvent( QDropEvent * e ); |
|
|
|
/** |
|
* This is called by View when a drag can possibly be started |
|
*/ |
|
virtual void viewStartDragRequest(); |
|
|
|
/** |
|
* This is called by View when a message item is manipulated by the user |
|
* in a way that it's status should change. (e.g, by clicking on a status icon, for example). |
|
*/ |
|
virtual void viewMessageStatusChangeRequest( MessageItem *msg, const KPIM::MessageStatus &set, const KPIM::MessageStatus &clear ); |
|
|
|
/** |
|
* This is called by View to signal a start of a (possibly lengthy) job batch. |
|
*/ |
|
virtual void viewJobBatchStarted(); |
|
|
|
/** |
|
* This is called by View to signal the end of a (possibly lengthy) job batch. |
|
*/ |
|
virtual void viewJobBatchTerminated(); |
|
|
|
signals: |
|
/** |
|
* Emitted when a full search is requested. |
|
*/ |
|
void fullSearchRequest(); |
|
|
|
protected slots: |
|
|
|
void themeMenuAboutToShow(); |
|
void aggregationMenuAboutToShow(); |
|
void themeSelected( bool ); |
|
void configureThemes(); |
|
void setPrivateThemeForStorage(); |
|
void setPrivateAggregationForStorage(); |
|
void setPrivateSortOrderForStorage(); |
|
void aggregationSelected( bool ); |
|
void statusMenuAboutToShow(); |
|
void statusSelected( QAction *action ); |
|
void tagIdSelected( QAction *action ); |
|
void searchEditTextEdited( const QString &text ); |
|
void searchTimerFired(); |
|
void searchEditClearButtonClicked(); |
|
void sortOrderMenuAboutToShow(); |
|
void messageSortingSelected( QAction *action ); |
|
void messageSortDirectionSelected( QAction *action ); |
|
void groupSortingSelected( QAction *action ); |
|
void groupSortDirectionSelected( QAction *action ); |
|
|
|
/** |
|
* Handles header section clicks switching the Aggregation MessageSorting on-the-fly. |
|
*/ |
|
void slotViewHeaderSectionClicked( int logicalIndex ); |
|
|
|
private: |
|
|
|
/** |
|
* Small helper for switching SortOrder::MessageSorting and SortOrder::SortDirection |
|
* on the fly. |
|
* After doing this, the sort indicator in the header is updated. |
|
*/ |
|
void switchMessageSorting( SortOrder::MessageSorting messageSorting, |
|
SortOrder::SortDirection sortDirection, |
|
int logicalHeaderColumnIndex ); |
|
|
|
/** |
|
* Check if our sort order can still be used with this aggregation. |
|
* This can happen if the global aggregation changed, for example we can now |
|
* have "most recent in subtree" sorting with an aggregation without threading. |
|
* If this happens, reset to the default sort order and don't use the global sort |
|
* order. |
|
*/ |
|
void checkSortOrder( const StorageModel *storageModel ); |
|
|
|
void setDefaultAggregationForStorageModel( const StorageModel * storageModel ); |
|
void setDefaultThemeForStorageModel( const StorageModel * storageModel ); |
|
void setDefaultSortOrderForStorageModel( const StorageModel * storageModel ); |
|
void applyFilter(); |
|
}; |
|
|
|
} // namespace Core |
|
|
|
} // namespace MessageListView |
|
|
|
} // namespace KMail |
|
|
|
|
|
#endif //!__KMAIL_MESSAGELISTVIEW_CORE_WIDGET_H__ |
|
|
|
|