diff options
| -rw-r--r-- | Swift/Controllers/AdHocManager.cpp | 8 | ||||
| -rw-r--r-- | Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h | 21 | ||||
| -rw-r--r-- | Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp | 61 | ||||
| -rw-r--r-- | Swift/QtUI/QtAdHocCommandWithJIDWindow.h | 32 | ||||
| -rw-r--r-- | Swift/QtUI/QtFormWidget.cpp | 55 | ||||
| -rw-r--r-- | Swift/QtUI/QtFormWidget.h | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.cpp | 12 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.h | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtSwift.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtUIFactory.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtUIFactory.h | 3 | ||||
| -rw-r--r-- | Swift/QtUI/SConscript | 1 | 
12 files changed, 184 insertions, 25 deletions
| diff --git a/Swift/Controllers/AdHocManager.cpp b/Swift/Controllers/AdHocManager.cpp index 59e139b..b179ec6 100644 --- a/Swift/Controllers/AdHocManager.cpp +++ b/Swift/Controllers/AdHocManager.cpp @@ -17,2 +17,3 @@  #include <Swift/Controllers/UIInterfaces/AdHocCommandWindowFactory.h> +#include <Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h>  #include <Swift/Controllers/UIEvents/UIEventStream.h> @@ -83,2 +84,9 @@ void AdHocManager::handleUIEvent(boost::shared_ptr<UIEvent> event) {  	} +	boost::shared_ptr<RequestAdHocWithJIDUIEvent> adHocJIDEvent = boost::dynamic_pointer_cast<RequestAdHocWithJIDUIEvent>(event); +	if (!!adHocJIDEvent) { +		boost::shared_ptr<OutgoingAdHocCommandSession> command = boost::make_shared<OutgoingAdHocCommandSession>(adHocJIDEvent->getJID(), adHocJIDEvent->getNode(), iqRouter_); +		boost::shared_ptr<AdHocController> controller = boost::make_shared<AdHocController>(factory_, command); +		controller->onDeleting.connect(boost::bind(&AdHocManager::removeController, this, controller)); +		controllers_.push_back(controller); +	}  } diff --git a/Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h b/Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h new file mode 100644 index 0000000..2b1fcea --- /dev/null +++ b/Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2014 Kevin Smith and Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include "Swift/Controllers/UIEvents/UIEvent.h" + +namespace Swift { +	class RequestAdHocWithJIDUIEvent : public UIEvent { +		public: +			RequestAdHocWithJIDUIEvent(const JID& jid, const std::string& node) : jid_(jid), node_(node) {} +			JID getJID() const { return jid_; } +			std::string getNode() const { return node_; } +		private: +			JID jid_; +			std::string node_; +	}; +} diff --git a/Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp b/Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp new file mode 100644 index 0000000..7f33f77 --- /dev/null +++ b/Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2010-2014 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <boost/bind.hpp> +#include <QLabel> +#include <QPushButton> +#include <QBoxLayout> +#include <QDialogButtonBox> +#include <Swiften/Elements/Command.h> +#include <Swift/Controllers/UIEvents/UIEventStream.h> +#include <Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h> +#include <Swift/QtUI/QtAdHocCommandWithJIDWindow.h> +#include <Swift/QtUI/QtFormWidget.h> +#include <Swift/QtUI/QtSwiftUtil.h> + +const int FormLayoutIndex = 1; + +namespace Swift { +QtAdHocCommandWithJIDWindow::QtAdHocCommandWithJIDWindow(UIEventStream* uiEventStream) : uiEventStream_(uiEventStream) { +	QVBoxLayout* hlayout = new QVBoxLayout(this); + +	QLabel* jidLabel = new QLabel("JID:", this); +	hlayout->addWidget(jidLabel); +	jid_ = new QLineEdit(this); +	hlayout->addWidget(jid_); + +	QLabel* commandLabel = new QLabel("Command:", this); +	hlayout->addWidget(commandLabel); +	node_ = new QLineEdit(this); +	hlayout->addWidget(node_); + +	QDialogButtonBox* buttonBox = new QDialogButtonBox(this); +	QPushButton* rejectButton = buttonBox->addButton("Cancel", QDialogButtonBox::RejectRole); +	connect(rejectButton, SIGNAL(clicked()), this, SLOT(handleRejectClick())); +	QPushButton* acceptButton = buttonBox->addButton("Complete", QDialogButtonBox::AcceptRole); +	connect(acceptButton, SIGNAL(clicked()), this, SLOT(handleAcceptClick())); +	hlayout->addWidget(buttonBox); + +	setLayout(hlayout); +	show(); +} + +QtAdHocCommandWithJIDWindow::~QtAdHocCommandWithJIDWindow() { +} + +void QtAdHocCommandWithJIDWindow::handleAcceptClick() { +	const JID jid = JID(Q2PSTRING(jid_->text())); +	const std::string node = Q2PSTRING(node_->text()); +	boost::shared_ptr<UIEvent> event(new RequestAdHocWithJIDUIEvent(jid, node)); +	uiEventStream_->send(event); +	accept(); +} + +void QtAdHocCommandWithJIDWindow::handleRejectClick() { +	reject(); +} + +} diff --git a/Swift/QtUI/QtAdHocCommandWithJIDWindow.h b/Swift/QtUI/QtAdHocCommandWithJIDWindow.h new file mode 100644 index 0000000..b168827 --- /dev/null +++ b/Swift/QtUI/QtAdHocCommandWithJIDWindow.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2010-2012 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <QDialog> +#include <QLineEdit> + +#include <Swiften/AdHoc/OutgoingAdHocCommandSession.h> + +class QBoxLayout; + +namespace Swift { +	class UIEventStream; +	class QtFormWidget; +	class QtAdHocCommandWithJIDWindow : public QDialog { +		Q_OBJECT +		public: +			QtAdHocCommandWithJIDWindow(UIEventStream* eventStream); +			virtual ~QtAdHocCommandWithJIDWindow(); +		public slots: +			void handleAcceptClick(); +			void handleRejectClick(); +		private: +			UIEventStream* uiEventStream_; +			QLineEdit* jid_; +			QLineEdit* node_; +	}; +} diff --git a/Swift/QtUI/QtFormWidget.cpp b/Swift/QtUI/QtFormWidget.cpp index 874c8a1..b4840e9 100644 --- a/Swift/QtUI/QtFormWidget.cpp +++ b/Swift/QtUI/QtFormWidget.cpp @@ -1,3 +1,3 @@  /* - * Copyright (c) 2010-2013 Kevin Smith + * Copyright (c) 2010-2014 Kevin Smith   * Licensed under the GNU General Public License v3. @@ -39,7 +39,23 @@ QtFormWidget::QtFormWidget(Form::ref form, QWidget* parent) : QWidget(parent), f  	QGridLayout* layout = new QGridLayout(scroll); -	foreach (boost::shared_ptr<FormField> field, form->getFields()) { -		QWidget* widget = createWidget(field); -		if (widget) { -			layout->addWidget(new QLabel(field->getLabel().c_str(), this), row, 0); -			layout->addWidget(widget, row++, 1); +	const std::vector<Form::FormItem> items = form->getItems(); +	if (items.empty()) { /* single item forms */ +		foreach (FormField::ref field, form->getFields()) { +			QWidget* widget = createWidget(field, field->getType(), 0); +			if (widget) { +				layout->addWidget(new QLabel(field->getLabel().c_str(), this), row, 0); +				layout->addWidget(widget, row++, 1); +			} +		} +	} else { /* multi-item forms */ +		const Form::FormItem& headers = form->getFields(); +		for (size_t i = 0; i < items.size(); ++i) { +			const Form::FormItem& item = items[i]; +			assert(item.size() == headers.size()); +			for (size_t j = 0; j < item.size(); ++j) { +				QWidget* widget = createWidget(item[j], headers[j]->getType(), i); +				if (widget) { +					layout->addWidget(new QLabel(item[j]->getLabel().c_str(), this), row, 0); +					layout->addWidget(widget, row++, 1); +				} +			}  		} @@ -85,5 +101,5 @@ QListWidget* QtFormWidget::createList(FormField::ref field) { -QWidget* QtFormWidget::createWidget(FormField::ref field) { +QWidget* QtFormWidget::createWidget(FormField::ref field, const FormField::Type type, const size_t index) {  	QWidget* widget = NULL; -	if (field->getType() == FormField::BooleanType) { +	if (type == FormField::BooleanType) {  		QCheckBox* checkWidget = new QCheckBox(this); @@ -92,3 +108,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::FixedType) { +	if (type == FormField::FixedType) {  		QString value = field->getFixedValue().c_str(); @@ -96,6 +112,6 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::ListSingleType) { +	if (type == FormField::ListSingleType) {  		widget = createList(field);  	} -	if (field->getType() == FormField::TextMultiType) { +	if (type == FormField::TextMultiType) {  		QString value = field->getTextMultiValue().c_str(); @@ -105,3 +121,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::TextPrivateType) { +	if (type == FormField::TextPrivateType) {  		QString value = field->getTextPrivateValue().c_str(); @@ -111,3 +127,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::TextSingleType) { +	if (type == FormField::TextSingleType) {  		QString value = field->getTextSingleValue().c_str(); @@ -115,3 +131,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::JIDSingleType) { +	if (type == FormField::JIDSingleType) {  		QString value = field->getJIDSingleValue().toString().c_str(); @@ -119,3 +135,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::JIDMultiType) { +	if (type == FormField::JIDMultiType) {  		QString text = boost::join(field->getValues(), "\n").c_str(); @@ -125,6 +141,11 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::ListMultiType) { +	if (type == FormField::ListMultiType) {  		widget = createList(field);  	} -	fields_[field->getName()] = widget; +	std::string indexString; +	if (index) { +		/* for multi-item forms we need to distinguish between the different rows */ +		indexString = boost::lexical_cast<std::string>(index); +	} +	fields_[field->getName() + indexString] = widget;  	return widget; diff --git a/Swift/QtUI/QtFormWidget.h b/Swift/QtUI/QtFormWidget.h index c7aae73..f58ff4b 100644 --- a/Swift/QtUI/QtFormWidget.h +++ b/Swift/QtUI/QtFormWidget.h @@ -1,3 +1,3 @@  /* - * Copyright (c) 2011 Kevin Smith + * Copyright (c) 2011-2014 Kevin Smith   * Licensed under the GNU General Public License v3. @@ -25,3 +25,3 @@ class QtFormWidget : public QWidget {  	private: -		QWidget* createWidget(FormField::ref field); +		QWidget* createWidget(FormField::ref field, const FormField::Type type, const size_t index);  		QListWidget* createList(FormField::ref field); diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index 31a8234..1db8c77 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -42,2 +42,3 @@  #include <Swift/QtUI/QtUISettingConstants.h> +#include <Swift/QtUI/QtAdHocCommandWithJIDWindow.h>  #if defined(SWIFTEN_PLATFORM_MACOSX) @@ -52,3 +53,3 @@ namespace Swift { -QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist) : QWidget(), MainWindow(false), loginMenus_(loginMenus) { +QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID) : QWidget(), MainWindow(false), loginMenus_(loginMenus) {  	uiEventStream_ = uiEventStream; @@ -177,2 +178,7 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr  	actionsMenu->addAction(chatUserAction_); +	if (enableAdHocCommandOnJID) { +		otherAdHocAction_ = new QAction(tr("Run Other Command"), this); +		connect(otherAdHocAction_, SIGNAL(triggered()), this, SLOT(handleOtherAdHocActionTriggered())); +		actionsMenu->addAction(otherAdHocAction_); +	}  	serverAdHocMenu_ = new QMenu(tr("Run Server Command"), this); @@ -271,2 +277,6 @@ void QtMainWindow::handleChatUserActionTriggered(bool /*checked*/) { +void QtMainWindow::handleOtherAdHocActionTriggered() { +	new QtAdHocCommandWithJIDWindow(uiEventStream_); +} +  void QtMainWindow::handleSignOutAction() { diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h index f1f6900..84fab15 100644 --- a/Swift/QtUI/QtMainWindow.h +++ b/Swift/QtUI/QtMainWindow.h @@ -41,3 +41,3 @@ namespace Swift {  		public: -			QtMainWindow(SettingsProvider*, UIEventStream* eventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist); +			QtMainWindow(SettingsProvider*, UIEventStream* eventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID);  			virtual ~QtMainWindow(); @@ -71,2 +71,3 @@ namespace Swift {  			void handleChatUserActionTriggered(bool checked); +			void handleOtherAdHocActionTriggered();  			void handleAdHocActionTriggered(bool checked); @@ -89,2 +90,3 @@ namespace Swift {  			QAction* chatUserAction_; +			QAction* otherAdHocAction_;  			QAction* showOfflineAction_; diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp index 183f64d..d2224ba 100644 --- a/Swift/QtUI/QtSwift.cpp +++ b/Swift/QtUI/QtSwift.cpp @@ -91,2 +91,3 @@ po::options_description QtSwift::getOptionsDescription() {  		("start-minimized", "Don't show the login/roster window at startup") +		("enable-jid-adhocs", "Enable AdHoc commands to custom JID's.")  #if QT_VERSION >= 0x040800 @@ -164,2 +165,3 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa +	bool enableAdHocCommandOnJID = options.count("enable-jid-adhocs") > 0;  	tabs_ = options.count("no-tabs") && !splitter_ ? NULL : new QtChatTabs(splitter_ != NULL); @@ -212,3 +214,3 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa  		} -		QtUIFactory* uiFactory = new QtUIFactory(settingsHierachy_, qtSettings_, tabs_, splitter_, systemTrays_[i], chatWindowFactory_, networkFactories_.getTimerFactory(), statusCache_, startMinimized, !emoticons.empty()); +		QtUIFactory* uiFactory = new QtUIFactory(settingsHierachy_, qtSettings_, tabs_, splitter_, systemTrays_[i], chatWindowFactory_, networkFactories_.getTimerFactory(), statusCache_, startMinimized, !emoticons.empty(), enableAdHocCommandOnJID);  		uiFactories_.push_back(uiFactory); diff --git a/Swift/QtUI/QtUIFactory.cpp b/Swift/QtUI/QtUIFactory.cpp index afd2a9e..701170c 100644 --- a/Swift/QtUI/QtUIFactory.cpp +++ b/Swift/QtUI/QtUIFactory.cpp @@ -38,3 +38,3 @@ namespace Swift { -QtUIFactory::QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist) : settings(settings), qtOnlySettings(qtOnlySettings), tabs(tabs), netbookSplitter(netbookSplitter), systemTray(systemTray), chatWindowFactory(chatWindowFactory), timerFactory_(timerFactory), lastMainWindow(NULL), loginWindow(NULL), statusCache(statusCache), startMinimized(startMinimized), emoticonsExist_(emoticonsExist) { +QtUIFactory::QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist, bool enableAdHocCommandOnJID) : settings(settings), qtOnlySettings(qtOnlySettings), tabs(tabs), netbookSplitter(netbookSplitter), systemTray(systemTray), chatWindowFactory(chatWindowFactory), timerFactory_(timerFactory), lastMainWindow(NULL), loginWindow(NULL), statusCache(statusCache), startMinimized(startMinimized), emoticonsExist_(emoticonsExist), enableAdHocCommandOnJID_(enableAdHocCommandOnJID) {  	chatFontSize = settings->getSetting(QtUISettingConstants::CHATWINDOW_FONT_SIZE); @@ -83,3 +83,3 @@ FileTransferListWidget* QtUIFactory::createFileTransferListWidget() {  MainWindow* QtUIFactory::createMainWindow(UIEventStream* eventStream) { -	lastMainWindow  = new QtMainWindow(settings, eventStream, loginWindow->getMenus(), statusCache, emoticonsExist_); +	lastMainWindow  = new QtMainWindow(settings, eventStream, loginWindow->getMenus(), statusCache, emoticonsExist_, enableAdHocCommandOnJID_);  	return lastMainWindow; diff --git a/Swift/QtUI/QtUIFactory.h b/Swift/QtUI/QtUIFactory.h index 721aa76..4c50572 100644 --- a/Swift/QtUI/QtUIFactory.h +++ b/Swift/QtUI/QtUIFactory.h @@ -34,3 +34,3 @@ namespace Swift {  		public: -			QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist); +			QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist, bool enableAdHocCommandOnJID); @@ -75,2 +75,3 @@ namespace Swift {  			bool emoticonsExist_; +			bool enableAdHocCommandOnJID_;  	}; diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index 53dbea9..dd7d0c3 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -121,2 +121,3 @@ sources = [      "QtAdHocCommandWindow.cpp", +    "QtAdHocCommandWithJIDWindow.cpp",      "QtUtilities.cpp", | 
 Swift
 Swift