mirror of
https://bitbucket.org/smil3y/kdelibs.git
synced 2025-02-23 18:32:49 +00:00
437 lines
14 KiB
C++
437 lines
14 KiB
C++
/* This file is part of the KDE project
|
|
*
|
|
* Copyright (C) 2012-2013 Dominik Haumann <dhaumann@kde.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public License
|
|
* along with this library; see the file COPYING.LIB. If not, write to
|
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef KTEXTEDITOR_MESSAGEINTERFACE_H
|
|
#define KTEXTEDITOR_MESSAGEINTERFACE_H
|
|
|
|
#include <QtCore/QObject>
|
|
#include <QtCore/QList>
|
|
#include <QtGui/QAction>
|
|
#include <QtGui/QIcon>
|
|
|
|
#include <ktexteditor/ktexteditor_export.h>
|
|
|
|
namespace KTextEditor {
|
|
|
|
class View;
|
|
class Document;
|
|
|
|
/**
|
|
* @brief This class holds a Message to display in View%s.
|
|
*
|
|
* @section message_intro Introduction
|
|
*
|
|
* The Message class holds the data used to display interactive message widgets
|
|
* in the editor. To post a message, use the MessageInterface.
|
|
*
|
|
* @section message_creation Message Creation and Deletion
|
|
*
|
|
* To create a new Message, use code like this:
|
|
* @code
|
|
* QPointer<Message> message = new Message("My information text", Message::Information);
|
|
* message->setWordWrap(true);
|
|
* // ...
|
|
* @endcode
|
|
*
|
|
* Although discouraged in general, the text of the Message can be changed
|
|
* on the fly when it is already visible with setText().
|
|
*
|
|
* Once you posted the Message through MessageInterface::postMessage(), the
|
|
* lifetime depends on the user interaction. The Message gets automatically
|
|
* deleted either if the user clicks a closing action in the message, or for
|
|
* instance if the document is reloaded.
|
|
*
|
|
* If you posted a message but want to remove it yourself again, just delete
|
|
* the message. But beware of the following warning!
|
|
*
|
|
* @warning Always use QPointer\<Message\> to guard the message pointer from
|
|
* getting invalid, if you need to access the Message after you posted
|
|
* it.
|
|
*
|
|
* @section message_positioning Positioning
|
|
*
|
|
* By default, the Message appears right above of the View. However, if desired,
|
|
* the position can be changed through setPosition(). For instance, the
|
|
* search-and-replace code in Kate Part shows the number of performed replacements
|
|
* in a message floating in the view. For further information, have a look at
|
|
* the enum MessagePosition.
|
|
*
|
|
* @section message_hiding Autohiding Messages
|
|
*
|
|
* Message%s can be shown for only a short amount of time by using the autohide
|
|
* feature. With setAutoHide() a timeout in milliseconds can be set after which
|
|
* the Message is automatically hidden. Further, use setAutoHideMode() to either
|
|
* trigger the autohide timer as soon as the widget is shown (AutoHideMode::Immediate),
|
|
* or only after user interaction with the view (AutoHideMode::AfterUserInteraction).
|
|
*
|
|
* The default autohide mode is set to AutoHideMode::AfterUserInteraction.
|
|
* This way, it is unlikely the user misses a notification.
|
|
*
|
|
* @see MessageInterface
|
|
* @author Dominik Haumann \<dhaumann@kde.org\>
|
|
* @since KDE 4.11
|
|
*/
|
|
class KTEXTEDITOR_EXPORT Message : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
//
|
|
// public data types
|
|
//
|
|
public:
|
|
/**
|
|
* Message types used as visual indicator.
|
|
* The message types match exactly the behavior of KMessageWidget::MessageType.
|
|
* For simple notifications either use Positive or Information.
|
|
*/
|
|
enum MessageType {
|
|
Positive = 0, ///< positive information message
|
|
Information, ///< information message type
|
|
Warning, ///< warning message type
|
|
Error ///< error message type
|
|
};
|
|
|
|
/**
|
|
* Message position used to place the message either above or below of the
|
|
* KTextEditor::View.
|
|
*/
|
|
enum MessagePosition {
|
|
AboveView = 0, ///< show message above view
|
|
BelowView, ///< show message below view
|
|
TopInView, ///< show message as view overlay in the top right corner
|
|
BottomInView ///< show message as view overlay om the bottom right corner
|
|
};
|
|
|
|
/**
|
|
* The AutoHideMode determines when to trigger the autoHide timer.
|
|
* @see setAutoHide(), autoHide()
|
|
*/
|
|
enum AutoHideMode {
|
|
Immediate = 0, ///< auto-hide is triggered as soon as the message is shown
|
|
AfterUserInteraction ///< auto-hide is triggered only after the user interacted with the view
|
|
};
|
|
|
|
public:
|
|
/**
|
|
* Constructor for new messages.
|
|
* @param type the message type, e.g. MessageType::Information
|
|
* @param richtext text to be displayed
|
|
*/
|
|
Message(const QString& richtext, MessageType type = Message::Information);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
virtual ~Message();
|
|
|
|
/**
|
|
* Returns the text set in the constructor.
|
|
*/
|
|
QString text() const;
|
|
|
|
/**
|
|
* Returns the icon of this message.
|
|
* If the message has no icon set, a null icon is returned.
|
|
*/
|
|
QIcon icon() const;
|
|
|
|
/**
|
|
* Returns the message type set in the constructor.
|
|
*/
|
|
MessageType messageType() const;
|
|
|
|
/**
|
|
* Adds an action to the message.
|
|
*
|
|
* By default (@p closeOnTrigger = true), the action closes the message
|
|
* displayed in all View%s. If @p closeOnTrigger is @e false, the message
|
|
* is stays open.
|
|
*
|
|
* The actions will be displayed in the order you added the actions.
|
|
*
|
|
* To connect to an action, use the following code:
|
|
* @code
|
|
* connect(action, SIGNAL(triggered()), receiver, SLOT(slotActionTriggered()));
|
|
* @endcode
|
|
*
|
|
* @param action action to be added
|
|
* @param closeOnTrigger when triggered, the message widget is closed
|
|
*
|
|
* @warning The added actions are deleted automatically.
|
|
* So do \em not delete the added actions yourself.
|
|
*/
|
|
void addAction(QAction* action, bool closeOnTrigger = true);
|
|
|
|
/**
|
|
* Accessor to all actions, mainly used in the internal implementation
|
|
* to add the actions into the gui.
|
|
*/
|
|
QList<QAction*> actions() const;
|
|
|
|
/**
|
|
* Set the auto hide timer to @p autoHideTimer milliseconds.
|
|
* If @p autoHideTimer < 0, auto hide is disabled.
|
|
* If @p autoHideTimer = 0, auto hide is enabled and set to a sane default
|
|
* value of several seconds.
|
|
*
|
|
* By default, auto hide is disabled.
|
|
*
|
|
* @see autoHide(), setAutoHideMode()
|
|
*/
|
|
void setAutoHide(int autoHideTimer = 0);
|
|
|
|
/**
|
|
* Returns the auto hide time in milliseconds.
|
|
* Please refer to setAutoHide() for an explanation of the return value.
|
|
*
|
|
* @see setAutoHide(), autoHideMode()
|
|
*/
|
|
int autoHide() const;
|
|
|
|
/**
|
|
* Sets the autoHide mode to @p mode.
|
|
* The default mode is set to AutoHideMode::AfterUserInteraction.
|
|
* @param mode autoHide mode
|
|
* @see autoHideMode(), setAutoHide()
|
|
*/
|
|
void setAutoHideMode(KTextEditor::Message::AutoHideMode mode);
|
|
|
|
/**
|
|
* Get the Message's autoHide mode.
|
|
* The default mode is set to AutoHideMode::AfterUserInteraction.
|
|
* @see setAutoHideMode(), autoHide()
|
|
*/
|
|
KTextEditor::Message::AutoHideMode autoHideMode() const;
|
|
|
|
/**
|
|
* Enabled word wrap according to @p wordWrap.
|
|
* By default, auto wrap is disabled.
|
|
*
|
|
* Word wrap is enabled automatically, if the Message's width is larger than
|
|
* the parent widget's width to avoid breaking the gui layout.
|
|
*
|
|
* @see wordWrap()
|
|
*/
|
|
void setWordWrap(bool wordWrap);
|
|
|
|
/**
|
|
* Check, whether word wrap is enabled or not.
|
|
*
|
|
* @see setWordWrap()
|
|
*/
|
|
bool wordWrap() const;
|
|
|
|
/**
|
|
* Set the priority of this message to @p priority.
|
|
* Messages with higher priority are shown first.
|
|
* The default priority is 0.
|
|
*
|
|
* @see priority()
|
|
*/
|
|
void setPriority(int priority);
|
|
|
|
/**
|
|
* Returns the priority of the message. Default is 0.
|
|
*
|
|
* @see setPriority()
|
|
*/
|
|
int priority() const;
|
|
|
|
/**
|
|
* Set the associated view of the message.
|
|
* If @p view is 0, the message is shown in all View%s of the Document.
|
|
* If @p view is given, i.e. non-zero, the message is shown only in this view.
|
|
* @param view the associated view the message should be displayed in
|
|
*/
|
|
void setView(KTextEditor::View* view);
|
|
|
|
/**
|
|
* This function returns the view you set by setView(). If setView() was
|
|
* not called, the return value is 0.
|
|
*/
|
|
KTextEditor::View* view() const;
|
|
|
|
/**
|
|
* Set the document pointer to @p document.
|
|
* This is called by the implementation, as soon as you post a message
|
|
* through MessageInterface::postMessage(), so that you do not have to
|
|
* call this yourself.
|
|
* @see MessageInterface, document()
|
|
*/
|
|
void setDocument(KTextEditor::Document* document);
|
|
|
|
/**
|
|
* Returns the document pointer this message was posted in.
|
|
* This pointer is 0 as long as the message was not posted.
|
|
*/
|
|
KTextEditor::Document* document() const;
|
|
|
|
/**
|
|
* Sets the @p position either to AboveView or BelowView.
|
|
* By default, the position is set to MessagePosition::AboveView.
|
|
* @see MessagePosition
|
|
*/
|
|
void setPosition(MessagePosition position);
|
|
|
|
/**
|
|
* Returns the desired message position of this message.
|
|
*/
|
|
MessagePosition position() const;
|
|
|
|
public Q_SLOTS:
|
|
/**
|
|
* Sets the notification contents to @p text.
|
|
* If the message was already sent through MessageInterface::postMessage(),
|
|
* the displayed text changes on the fly.
|
|
* @note Change text on the fly with care, since changing the text may
|
|
* resize the notification widget, which may result in a distracting
|
|
* user experience.
|
|
* @param richtext new notification text (rich text supported)
|
|
* @see textChanged()
|
|
*/
|
|
void setText(const QString& richtext);
|
|
|
|
/**
|
|
* Optionally set an icon for this notification.
|
|
* The icon is shown next to the message text.
|
|
* @param icon the icon to be displayed
|
|
*/
|
|
void setIcon(const QIcon& icon);
|
|
|
|
Q_SIGNALS:
|
|
/**
|
|
* This signal is emitted before the message is deleted. Afterwards, this
|
|
* pointer is invalid.
|
|
*
|
|
* Use the function document() to access the associated Document.
|
|
*
|
|
* @param message closed/processed message
|
|
*/
|
|
void closed(KTextEditor::Message* message);
|
|
|
|
/**
|
|
* This signal is emitted whenever setText() is called.
|
|
* If the message was already sent through MessageInterface::postMessage(),
|
|
* the displayed text changes on the fly.
|
|
* @note Change text on the fly with care, since changing the text may
|
|
* resize the notification widget, which may result in a distracting
|
|
* user experience.
|
|
*
|
|
* @param text new notification text (rich text supported)
|
|
* @see setText()
|
|
*/
|
|
void textChanged(const QString& text);
|
|
|
|
/**
|
|
* This signal is emitted whenever setIcon() is called.
|
|
* If the message was already sent through MessageInterface::postMessage(),
|
|
* the displayed icon changes on the fly.
|
|
* @note Change the icon on the fly with care, since changing the text may
|
|
* resize the notification widget, which may result in a distracting
|
|
* user experience.
|
|
*
|
|
* @param icon new notification icon
|
|
* @see setIcon()
|
|
*/
|
|
void iconChanged(const QIcon& icon);
|
|
|
|
private:
|
|
class MessagePrivate * const d;
|
|
};
|
|
|
|
/**
|
|
* \brief Message interface for posting interactive Message%s to a Document and its View%s.
|
|
*
|
|
* \ingroup kte_group_doc_extensions
|
|
*
|
|
* This interface allows to post Message%s to a Document. The Message then
|
|
* is shown either the specified View if Message::setView() was called, or
|
|
* in all View%s of the Document.
|
|
*
|
|
* \section message_interface Working with Messages
|
|
*
|
|
* To post a message, you first have to cast the Document to this interface,
|
|
* and then create a Message. Example:
|
|
* \code
|
|
* // doc is of type KTextEditor::Document*
|
|
* KTextEditor::MessageInterface *iface =
|
|
* qobject_cast<KTextEditor::MessageInterface*>( doc );
|
|
*
|
|
* if( !iface ) {
|
|
* // the implementation does not support the interface
|
|
* return;
|
|
* }
|
|
*
|
|
* // always use a QPointer go guard your Message, if you keep a pointer
|
|
* // after calling postMessage()
|
|
* QPointer<Message> message = new Message("text", Message::Information);
|
|
* message->setWordWrap(true);
|
|
* message->addAction(...); // add your actions...
|
|
* iface->postMessage(message);
|
|
*
|
|
* // The Message is deleted automatically if the Message gets closed,
|
|
* // meaning that you usually can forget the pointer.
|
|
* // If you really need to delete a message before the user processed it,
|
|
* guard it with a QPointer!
|
|
* \endcode
|
|
*
|
|
* @see Message
|
|
* @author Dominik Haumann \<dhaumann@kde.org\>
|
|
* @since KDE 4.11
|
|
*/
|
|
class KTEXTEDITOR_EXPORT MessageInterface
|
|
{
|
|
public:
|
|
/**
|
|
* Default constructor, for internal use.
|
|
*/
|
|
MessageInterface();
|
|
/**
|
|
* Destructor, for internal use.
|
|
*/
|
|
virtual ~MessageInterface();
|
|
|
|
/**
|
|
* Post @p message to the Document and its View%s.
|
|
* If multiple Message%s are posted, the one with the highest priority
|
|
* is shown first.
|
|
*
|
|
* Usually, you can simply forget the pointer, as the Message is deleted
|
|
* automatically, once it is processed or the document gets closed.
|
|
*
|
|
* If the Document does not have a View yet, the Message is queued and
|
|
* shown, once a View for the Document is created.
|
|
*
|
|
* @param message the message to show
|
|
* @return @e true, if @p message was posted. @e false, if message == 0.
|
|
*/
|
|
virtual bool postMessage(Message* message) = 0;
|
|
|
|
private:
|
|
class MessageInterfacePrivate * const d;
|
|
};
|
|
|
|
}
|
|
|
|
Q_DECLARE_INTERFACE(KTextEditor::MessageInterface, "org.kde.KTextEditor.MessageInterface")
|
|
|
|
#endif
|
|
|
|
// kate: space-indent on; indent-width 2; replace-tabs on;
|