/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ /* * Copyright (c) 2012 Thilo Cestonaro * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #ifndef SWIFT_QtWebKitChatView_H #define SWIFT_QtWebKitChatView_H #include #include #include #include #include #include #include #include "MessageSnippet.h" #include "QtChatView.h" #include #include "Swift/Controllers/Settings/SettingsProvider.h" #include class QWebPage; class QUrl; namespace Swift { class QtWebView; class QtChatTheme; class UIEventStream; class QtChatWindowJSBridge; class QtWebKitChatView : public QtChatView { Q_OBJECT public: static const QString ButtonFileTransferCancel; static const QString ButtonFileTransferSetDescription; static const QString ButtonFileTransferSendRequest; static const QString ButtonFileTransferAcceptRequest; static const QString ButtonMUCInvite; public: QtWebKitChatView(QtChatTheme* theme, QWidget* parent, UIEventStream* eventStream, SettingsProvider* settings, QMap emoticons); virtual ~QtWebKitChatView(); void addMessage(boost::shared_ptr snippet); void addLastSeenLine(); void replaceWithAction(const std::string& message, const std::string& id, const boost::posix_time::ptime& time); void replaceLastMessage(const QString& newMessage); void replaceLastMessage(const QString& newMessage, const QString& note); void replaceMessage(const std::string& newMessage, const QString& id, const QDateTime& time, const QString& style); void replaceMessage(const QString& message, const QString& id, const QDateTime& time, const QString& style); void rememberScrolledToBottom(); void setAckXML(const QString& id, const QString& xml); void setReceiptXML(const QString& id, const QString& xml); void displayReceiptInfo(const QString& id, bool showIt); QString linkimoticonify(const QString& message) const; QString getLastSentMessage(); void addToJSEnvironment(const QString&, QObject*); void setFileTransferStatus(QString id, const ChatWindow::FileTransferState state, const QString& msg); void setFileTransferProgress(QString id, const int percentageDone); void setMUCInvitationJoined(QString id); void showEmoticons(bool show); void setAckState(std::string const& id, ChatWindow::AckState); void setMessageReceiptState(const std::string& id, ChatWindow::ReceiptState state); std::string addMessage(const std::string &message, const std::string &senderName, bool senderIsSelf, boost::shared_ptr label, const std::string& avatarPath, const QString& style, const boost::posix_time::ptime& time); std::string addMessage(const QString& message, const std::string& senderName, bool senderIsSelf, boost::shared_ptr label, const std::string& avatarPath, const QString& style, const boost::posix_time::ptime& time); void setChatWindowHasFocus(bool focus); std::string addAction(const std::string &message, const std::string &senderName, bool senderIsSelf, boost::shared_ptr label, const std::string& avatarPath, const boost::posix_time::ptime& time); std::string addFileTransfer(const std::string& senderName, bool senderIsSelf, const std::string& filename, const boost::uintmax_t sizeInBytes); void addErrorMessage(const std::string& errorMessage); void addSystemMessage(const std::string& message); void addPresenceMessage(const std::string& message); void addMUCInvitation(const std::string& senderName, const JID& jid, const std::string& reason, const std::string& password, bool direct); static QString buildChatWindowButton(const QString& name, const QString& id, const QString& arg1 = QString(), const QString& arg2 = QString(), const QString& arg3 = QString()); public slots: void copySelectionToClipboard(); void scrollToBottom(); void handleLinkClicked(const QUrl&); void handleKeyPressEvent(QKeyEvent* event); void resetView(); void increaseFontSize(int numSteps = 1); void decreaseFontSize(); void resizeFont(int fontSizeSteps); private slots: void handleViewLoadFinished(bool); void handleFrameSizeChanged(); void handleClearRequested(); void handleHTMLButtonClicked(QString id, QString arg1, QString arg2, QString arg3); private: enum PreviousMessageKind { PreviosuMessageWasNone, PreviousMessageWasMessage, PreviousMessageWasSystem, PreviousMessageWasPresence, PreviousMessageWasFileTransfer, PreviousMessageWasMUCInvite }; void headerEncode(); void messageEncode(); void addToDOM(boost::shared_ptr snippet); QWebElement snippetToDOM(boost::shared_ptr snippet); bool appendToPreviousCheck(PreviousMessageKind messageKind, const std::string& senderName, bool senderIsSelf) const; void handleSettingChanged(const std::string& setting); bool viewReady_; bool isAtBottom_; QtWebView* webView_; QWebPage* webPage_; int fontSizeSteps_; QtChatTheme* theme_; QWebElement newInsertPoint_; QWebElement lineSeparator_; QWebElement lastElement_; QWebElement document_; bool previousMessageWasSelf_; QString previousSenderName_; PreviousMessageKind previousMessageKind_; int idCounter_; LastLineTracker lastLineTracker_; UIEventStream* eventStream_; std::map descriptions_; QtChatWindowJSBridge* jsBridge_; SettingsProvider* settings_; QMap emoticons_; bool showEmoticons_; }; } #endif