From bf3739c75fcb312a99608488c8741e2ffc15ca1e Mon Sep 17 00:00:00 2001
From: Richard Maudsley <richard.maudsley@isode.com>
Date: Fri, 2 May 2014 16:57:31 +0100
Subject: Allow bookmarking of MUCs from cog menu.

Change-Id: I55f696c98598ec9bfd1ac13a2abd3c1ee2b1e9fa

diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp
index df99368..cb2616c 100644
--- a/Swift/Controllers/Chat/MUCController.cpp
+++ b/Swift/Controllers/Chat/MUCController.cpp
@@ -93,6 +93,7 @@ MUCController::MUCController (
 	chatWindow_->onOccupantSelectionChanged.connect(boost::bind(&MUCController::handleWindowOccupantSelectionChanged, this, _1));
 	chatWindow_->onOccupantActionSelected.connect(boost::bind(&MUCController::handleActionRequestedOnOccupant, this, _1, _2));
 	chatWindow_->onChangeSubjectRequest.connect(boost::bind(&MUCController::handleChangeSubjectRequest, this, _1));
+	chatWindow_->onBookmarkRequest.connect(boost::bind(&MUCController::handleBookmarkRequest, this));
 	chatWindow_->onConfigureRequest.connect(boost::bind(&MUCController::handleConfigureRequest, this, _1));
 	chatWindow_->onConfigurationFormCancelled.connect(boost::bind(&MUCController::handleConfigurationCancelled, this));
 	chatWindow_->onDestroyRequest.connect(boost::bind(&MUCController::handleDestroyRoomRequest, this));
@@ -799,6 +800,14 @@ void MUCController::handleChangeSubjectRequest(const std::string& subject) {
 	muc_->changeSubject(subject);
 }
 
+void MUCController::handleBookmarkRequest() {
+	const JID jid = muc_->getJID();
+	MUCBookmark bookmark(jid, jid.toBare().toString());
+	bookmark.setPassword(password_);
+	bookmark.setNick(nick_);
+	chatWindow_->showBookmarkWindow(bookmark);
+}
+
 void MUCController::handleConfigureRequest(Form::ref form) {
 	if (form) {
 		muc_->configureRoom(form);
diff --git a/Swift/Controllers/Chat/MUCController.h b/Swift/Controllers/Chat/MUCController.h
index 317f579..e78ff77 100644
--- a/Swift/Controllers/Chat/MUCController.h
+++ b/Swift/Controllers/Chat/MUCController.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -93,6 +93,7 @@ namespace Swift {
 			void handleJoinFailed(boost::shared_ptr<ErrorPayload> error);
 			void handleJoinTimeoutTick();
 			void handleChangeSubjectRequest(const std::string&);
+			void handleBookmarkRequest();
 			std::string roleToGroupName(MUCOccupant::Role role);
 			std::string roleToSortName(MUCOccupant::Role role);
 			JID nickToJID(const std::string& nick);
diff --git a/Swift/Controllers/UIInterfaces/ChatWindow.h b/Swift/Controllers/UIInterfaces/ChatWindow.h
index 771872a..096a59a 100644
--- a/Swift/Controllers/UIInterfaces/ChatWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatWindow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2012 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -19,6 +19,7 @@
 #include <Swiften/Elements/ChatState.h>
 #include <Swiften/Elements/Form.h>
 #include <Swiften/Elements/MUCOccupant.h>
+#include <Swiften/MUC/MUCBookmark.h>
 #include <Swift/Controllers/HighlightManager.h>
 
 
@@ -148,6 +149,7 @@ namespace Swift {
 			virtual void setAvailableRoomActions(const std::vector<RoomAction> &actions) = 0;
 			virtual void setBlockingState(BlockingState state) = 0;
 			virtual void setCanInitiateImpromptuChats(bool supportsImpromptu) = 0;
+			virtual void showBookmarkWindow(const MUCBookmark& bookmark) = 0;
 			/**
 			 * Set an alert on the window.
 			 * @param alertText Description of alert (required).
@@ -180,6 +182,7 @@ namespace Swift {
 			boost::signal<void (ContactRosterItem*)> onOccupantSelectionChanged;
 			boost::signal<void (ChatWindow::OccupantAction, ContactRosterItem*)> onOccupantActionSelected;
 			boost::signal<void (const std::string&)> onChangeSubjectRequest;
+			boost::signal<void ()> onBookmarkRequest;
 			boost::signal<void (Form::ref)> onConfigureRequest;
 			boost::signal<void ()> onDestroyRequest;
 			boost::signal<void (const std::vector<JID>&)> onInviteToChat;
diff --git a/Swift/Controllers/UnitTest/MockChatWindow.h b/Swift/Controllers/UnitTest/MockChatWindow.h
index 8aa645d..c2e2c9f 100644
--- a/Swift/Controllers/UnitTest/MockChatWindow.h
+++ b/Swift/Controllers/UnitTest/MockChatWindow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -71,6 +71,7 @@ namespace Swift {
 
 			virtual void setBlockingState(BlockingState) {}
 			virtual void setCanInitiateImpromptuChats(bool /*supportsImpromptu*/) {}
+			virtual void showBookmarkWindow(const MUCBookmark& /*bookmark*/) {}
 
 			std::string bodyFromMessage(const ChatMessage& message) {
 				boost::shared_ptr<ChatTextMessagePart> text;
diff --git a/Swift/QtUI/QtAddBookmarkWindow.cpp b/Swift/QtUI/QtAddBookmarkWindow.cpp
index 675ea03..230f2ed 100644
--- a/Swift/QtUI/QtAddBookmarkWindow.cpp
+++ b/Swift/QtUI/QtAddBookmarkWindow.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -13,6 +13,10 @@ QtAddBookmarkWindow::QtAddBookmarkWindow(UIEventStream* eventStream) : eventStre
 
 }
 
+QtAddBookmarkWindow::QtAddBookmarkWindow(UIEventStream* eventStream, const MUCBookmark& bookmark) : eventStream_(eventStream) {
+	createFormFromBookmark(bookmark);
+}
+
 bool QtAddBookmarkWindow::commit() {
 	boost::optional<MUCBookmark> bookmark = createBookmarkFromForm();
 	if (bookmark) {
diff --git a/Swift/QtUI/QtAddBookmarkWindow.h b/Swift/QtUI/QtAddBookmarkWindow.h
index f026cc3..c0dc214 100644
--- a/Swift/QtUI/QtAddBookmarkWindow.h
+++ b/Swift/QtUI/QtAddBookmarkWindow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -16,6 +16,7 @@ namespace Swift {
 		Q_OBJECT
 		public:
 			QtAddBookmarkWindow(UIEventStream* eventStream);
+			QtAddBookmarkWindow(UIEventStream* eventStream, const MUCBookmark& bookmark);
 			bool commit();
 		private:
 			UIEventStream* eventStream_;
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.cpp b/Swift/QtUI/QtBookmarkDetailWindow.cpp
index ae84b4b..3e501f2 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.cpp
+++ b/Swift/QtUI/QtBookmarkDetailWindow.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -49,4 +49,28 @@ boost::optional<MUCBookmark> QtBookmarkDetailWindow::createBookmarkFromForm() {
 	return bookmark;
 }
 
+void QtBookmarkDetailWindow::createFormFromBookmark(const MUCBookmark& bookmark) {
+	if (bookmark.getRoom().isValid()) {
+		room_->setText(P2QSTRING(bookmark.getRoom().toString()));
+	}
+
+	if (!bookmark.getName().empty()) {
+		name_->setText(P2QSTRING(bookmark.getName()));
+	}
+
+	if (bookmark.getNick()) {
+		nick_->setText(P2QSTRING((*bookmark.getNick())));
+	}
+
+	if (bookmark.getPassword()) {
+		password_->setText(P2QSTRING((*bookmark.getPassword())));
+	}
+
+	if (bookmark.getAutojoin()) {
+		autojoin_->setCheckState(Qt::Checked);
+	} else {
+		autojoin_->setCheckState(Qt::Unchecked);
+	}
+}
+
 }
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.h b/Swift/QtUI/QtBookmarkDetailWindow.h
index fd2b7b4..b223719 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.h
+++ b/Swift/QtUI/QtBookmarkDetailWindow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
@@ -22,6 +22,9 @@ namespace Swift {
 			virtual bool commit() = 0;
 			boost::optional<MUCBookmark> createBookmarkFromForm();
 
+		protected:
+			void createFormFromBookmark(const MUCBookmark& bookmark);
+
 		public slots:
 			void accept();
 	};
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index d3cce6d..f58c11b 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -46,6 +46,7 @@
 #include <SwifTools/TabComplete.h>
 
 #include <Swift/QtUI/Roster/QtOccupantListWidget.h>
+#include <Swift/QtUI/QtAddBookmarkWindow.h>
 #include <Swift/QtUI/QtPlainChatView.h>
 #include <Swift/QtUI/QtSettingsProvider.h>
 #include <Swift/QtUI/QtScaledAvatarCache.h>
@@ -627,6 +628,8 @@ void QtChatWindow::handleActionButtonClicked() {
 		}
 	}
 
+	QAction* bookmark = contextMenu.addAction(tr("Add boomark..."));
+
 	QAction* result = contextMenu.exec(QCursor::pos());
 	if (result == NULL) {
 		/* Skip processing. Note that otherwise, because the actions could be null they could match */
@@ -668,6 +671,8 @@ void QtChatWindow::handleActionButtonClicked() {
 	}
 	else if (result == unblock) {
 		onUnblockUserRequest();
+	} else if (result == bookmark) {
+		onBookmarkRequest();
 	}
 }
 
@@ -692,6 +697,11 @@ void QtChatWindow::setCanInitiateImpromptuChats(bool supportsImpromptu) {
 	supportsImpromptuChat_ = supportsImpromptu;
 }
 
+void QtChatWindow::showBookmarkWindow(const MUCBookmark& bookmark) {
+	QtAddBookmarkWindow* window = new QtAddBookmarkWindow(eventStream_, bookmark);
+	window->show();
+}
+
 void QtChatWindow::showRoomConfigurationForm(Form::ref form) {
 	if (mucConfigurationWindow_) {
 		delete mucConfigurationWindow_.data();
diff --git a/Swift/QtUI/QtChatWindow.h b/Swift/QtUI/QtChatWindow.h
index 5a4fe95..de7e45e 100644
--- a/Swift/QtUI/QtChatWindow.h
+++ b/Swift/QtUI/QtChatWindow.h
@@ -128,6 +128,7 @@ namespace Swift {
 			void setAvailableRoomActions(const std::vector<RoomAction>& actions);
 			void setBlockingState(BlockingState state);
 			virtual void setCanInitiateImpromptuChats(bool supportsImpromptu);
+			virtual void showBookmarkWindow(const MUCBookmark& bookmark);
 
 		public slots:
 			void handleChangeSplitterState(QByteArray state);
-- 
cgit v0.10.2-6-g49f6