summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2012-02-26 14:32:39 (GMT)
committerTobias Markmann <tm@ayena.de>2012-11-11 16:38:00 (GMT)
commit684559ff499077e33d3d5e4b9ecb39afa240d067 (patch)
tree7c0f03ddb4c73e1d2d2ddd54fe3f3b9640291e75 /Swift/QtUI
parentbe6fd0b4b580d81bfe33975c28ee7a939d6c6723 (diff)
downloadswift-contrib-684559ff499077e33d3d5e4b9ecb39afa240d067.zip
swift-contrib-684559ff499077e33d3d5e4b9ecb39afa240d067.tar.bz2
Adding basic vCard edit/show support.
License: This patch is BSD-licensed, see Documentation/Licenses/BSD-simplified.txt for details.
Diffstat (limited to 'Swift/QtUI')
-rw-r--r--Swift/QtUI/QtAvatarWidget.cpp3
-rw-r--r--Swift/QtUI/QtAvatarWidget.h10
-rw-r--r--Swift/QtUI/QtProfileWindow.cpp155
-rw-r--r--Swift/QtUI/QtProfileWindow.h77
-rw-r--r--Swift/QtUI/QtProfileWindow.ui85
-rw-r--r--Swift/QtUI/QtSwiftUtil.h2
-rw-r--r--Swift/QtUI/QtVCardWidget/QtResizableLineEdit.cpp44
-rw-r--r--Swift/QtUI/QtVCardWidget/QtResizableLineEdit.h33
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardAddressField.cpp104
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardAddressField.h104
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardAddressField.ui229
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.cpp67
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.h89
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.ui152
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.cpp65
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.h65
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.ui76
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.cpp44
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.h60
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.ui59
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardEMailField.cpp127
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardEMailField.h84
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardEMailField.ui139
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h27
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardJIDField.cpp67
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardJIDField.h63
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardJIDField.ui79
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.cpp100
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.h68
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.ui169
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.cpp162
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.h74
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.ui260
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardRoleField.cpp55
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardRoleField.h63
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardRoleField.ui76
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.cpp95
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.h93
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.ui174
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardTitleField.cpp55
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardTitleField.h63
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardTitleField.ui76
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardURLField.cpp65
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardURLField.h63
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardURLField.ui79
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp429
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.h58
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.ui143
-rw-r--r--Swift/QtUI/Roster/QtOccupantListWidget.cpp1
-rw-r--r--Swift/QtUI/Roster/QtRosterWidget.cpp5
-rw-r--r--Swift/QtUI/SConscript34
51 files changed, 4442 insertions, 127 deletions
diff --git a/Swift/QtUI/QtAvatarWidget.cpp b/Swift/QtUI/QtAvatarWidget.cpp
index f0bdf3c..ae9559a 100644
--- a/Swift/QtUI/QtAvatarWidget.cpp
+++ b/Swift/QtUI/QtAvatarWidget.cpp
@@ -68,6 +68,9 @@ void QtAvatarWidget::setAvatar(const ByteArray& data, const std::string& type) {
}
void QtAvatarWidget::mousePressEvent(QMouseEvent* event) {
+ if (!editable) {
+ return;
+ }
QMenu menu;
QAction* selectPicture = new QAction(tr("Select picture ..."), this);
diff --git a/Swift/QtUI/QtAvatarWidget.h b/Swift/QtUI/QtAvatarWidget.h
index 8830d82..f4ac4cf 100644
--- a/Swift/QtUI/QtAvatarWidget.h
+++ b/Swift/QtUI/QtAvatarWidget.h
@@ -15,6 +15,7 @@ class QLabel;
namespace Swift {
class QtAvatarWidget : public QWidget {
Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
public:
QtAvatarWidget(QWidget* parent);
@@ -28,9 +29,18 @@ namespace Swift {
return type;
}
+ void setEditable(bool b) {
+ editable = b;
+ }
+
+ bool isEditable() const {
+ return editable;
+ }
+
void mousePressEvent(QMouseEvent* event);
private:
+ bool editable;
ByteArray data;
std::string type;
QLabel* label;
diff --git a/Swift/QtUI/QtProfileWindow.cpp b/Swift/QtUI/QtProfileWindow.cpp
index 0faa78f..558d685 100644
--- a/Swift/QtUI/QtProfileWindow.cpp
+++ b/Swift/QtUI/QtProfileWindow.cpp
@@ -1,100 +1,76 @@
/*
- * Copyright (c) 2011 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
*/
#include "QtProfileWindow.h"
+#include "ui_QtProfileWindow.h"
-#include <QImage>
-#include <QPixmap>
-#include <QSizePolicy>
-#include <QGridLayout>
-#include <QLabel>
-#include <QLineEdit>
-#include <QPushButton>
+#include <QCloseEvent>
#include <QMovie>
+#include <QShortcut>
#include "QtSwiftUtil.h"
-#include "QtAvatarWidget.h"
namespace Swift {
-QtProfileWindow::QtProfileWindow() {
- setWindowTitle(tr("Edit Profile"));
-
- QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
- sizePolicy.setHorizontalStretch(0);
- sizePolicy.setVerticalStretch(0);
- sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth());
- setSizePolicy(sizePolicy);
-
- QVBoxLayout* layout = new QVBoxLayout(this);
- layout->setContentsMargins(10, 10, 10, 10);
-
- QHBoxLayout* topLayout = new QHBoxLayout();
-
- avatar = new QtAvatarWidget(this);
- topLayout->addWidget(avatar);
-
- QVBoxLayout* fieldsLayout = new QVBoxLayout();
-
- QHBoxLayout* horizontalLayout_2 = new QHBoxLayout();
- nicknameLabel = new QLabel(tr("Nickname:"), this);
- horizontalLayout_2->addWidget(nicknameLabel);
- nickname = new QLineEdit(this);
- horizontalLayout_2->addWidget(nickname);
-
- fieldsLayout->addLayout(horizontalLayout_2);
-
- errorLabel = new QLabel(this);
- errorLabel->setAlignment(Qt::AlignHCenter);
- fieldsLayout->addWidget(errorLabel);
-
- fieldsLayout->addItem(new QSpacerItem(198, 17, QSizePolicy::Minimum, QSizePolicy::Expanding));
- topLayout->addLayout(fieldsLayout);
-
- layout->addLayout(topLayout);
-
- QHBoxLayout* horizontalLayout = new QHBoxLayout();
- horizontalLayout->setContentsMargins(0, 0, 0, 0);
- horizontalLayout->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
-
- throbberLabel = new QLabel(this);
- throbberLabel->setMovie(new QMovie(":/icons/throbber.gif", QByteArray(), this));
- horizontalLayout->addWidget(throbberLabel);
-
- saveButton = new QPushButton(tr("Save"), this);
- saveButton->setDefault( true );
- connect(saveButton, SIGNAL(clicked()), SLOT(handleSave()));
- horizontalLayout->addWidget(saveButton);
+QtProfileWindow::QtProfileWindow(QWidget* parent) :
+ QWidget(parent),
+ ui(new Ui::QtProfileWindow) {
+ ui->setupUi(this);
+ new QShortcut(QKeySequence::Close, this, SLOT(close()));
+ ui->throbberLabel->setMovie(new QMovie(":/icons/throbber.gif", QByteArray(), this));
+ connect(ui->savePushButton, SIGNAL(clicked()), SLOT(handleSave()));
+ setEditable(false);
+}
- fieldsLayout->addLayout(horizontalLayout);
+QtProfileWindow::~QtProfileWindow() {
+ delete ui;
+}
- resize(360, 120);
+void QtProfileWindow::setJID(const JID& jid) {
+ this->jid = jid;
+ updateTitle();
}
-void QtProfileWindow::setVCard(Swift::VCard::ref vcard) {
- this->vcard = vcard;
- nickname->setText(P2QSTRING(vcard->getNickname()));
- avatar->setAvatar(vcard->getPhoto(), vcard->getPhotoType());
+void QtProfileWindow::setVCard(VCard::ref vcard) {
+ ui->vcard->setVCard(vcard);
}
void QtProfileWindow::setEnabled(bool b) {
- nickname->setEnabled(b);
- nicknameLabel->setEnabled(b);
- avatar->setEnabled(b);
- saveButton->setEnabled(b);
+ ui->vcard->setEnabled(b);
+ ui->savePushButton->setEnabled(b);
+}
+
+void QtProfileWindow::setEditable(bool b) {
+ if (b) {
+ ui->savePushButton->show();
+ ui->vcard->setEditable(true);
+ } else {
+ ui->savePushButton->hide();
+ ui->vcard->setEditable(false);
+ }
+ updateTitle();
}
void QtProfileWindow::setProcessing(bool processing) {
if (processing) {
- throbberLabel->movie()->start();
- throbberLabel->show();
+ ui->throbberLabel->movie()->start();
+ ui->throbberLabel->show();
}
else {
- throbberLabel->hide();
- throbberLabel->movie()->stop();
+ ui->throbberLabel->hide();
+ ui->throbberLabel->movie()->stop();
+ }
+}
+
+void QtProfileWindow::setError(const std::string& error) {
+ if (!error.empty()) {
+ ui->errorLabel->setText("<font color='red'>" + P2QSTRING(error) + "</font>");
+ }
+ else {
+ ui->errorLabel->setText("");
}
}
@@ -103,31 +79,30 @@ void QtProfileWindow::show() {
QWidget::activateWindow();
}
-void QtProfileWindow::hideEvent(QHideEvent* event) {
- QWidget::hideEvent(event);
-}
-
void QtProfileWindow::hide() {
QWidget::hide();
}
-void QtProfileWindow::handleSave() {
- assert(vcard);
- vcard->setNickname(Q2PSTRING(nickname->text()));
- vcard->setPhoto(avatar->getAvatarData());
- vcard->setPhotoType(avatar->getAvatarType());
- onVCardChangeRequest(vcard);
-}
-
-void QtProfileWindow::setError(const std::string& error) {
- if (!error.empty()) {
- errorLabel->setText("<font color='red'>" + P2QSTRING(error) + "</font>");
+void QtProfileWindow::updateTitle() {
+ QString jidString;
+ if (jid.isValid()) {
+ jidString = QString(" ( %1 )").arg(P2QSTRING(jid.toString()));
}
- else {
- errorLabel->setText("");
+
+ if (ui->vcard->isEditable()) {
+ setWindowTitle(tr("Edit Profile") + jidString);
+ } else {
+ setWindowTitle(tr("Show Profile") + jidString);
}
}
+void QtProfileWindow::closeEvent(QCloseEvent* event) {
+ event->accept();
+ onWindowClosed(this);
+}
+void QtProfileWindow::handleSave() {
+ onVCardChangeRequest(ui->vcard->getVCard());
+}
}
diff --git a/Swift/QtUI/QtProfileWindow.h b/Swift/QtUI/QtProfileWindow.h
index edb9cce..29a832d 100644
--- a/Swift/QtUI/QtProfileWindow.h
+++ b/Swift/QtUI/QtProfileWindow.h
@@ -1,48 +1,51 @@
/*
- * Copyright (c) 2011 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
*/
#pragma once
-#include <QWidget>
+#include <Swiften/JID/JID.h>
#include <Swift/Controllers/UIInterfaces/ProfileWindow.h>
-class QLabel;
-class QLineEdit;
-class QHBoxLayout;
-class QPushButton;
+#include <QWidget>
+
+namespace Ui {
+ class QtProfileWindow;
+}
namespace Swift {
- class QtAvatarWidget;
-
- class QtProfileWindow : public QWidget, public ProfileWindow {
- Q_OBJECT
- public:
- QtProfileWindow();
-
- void setVCard(Swift::VCard::ref);
- void setEnabled(bool);
- void setProcessing(bool);
- virtual void setError(const std::string&);
- void show();
- void hide();
-
- void hideEvent (QHideEvent* event);
-
- private slots:
- void handleSave();
-
- private:
- VCard::ref vcard;
- QtAvatarWidget* avatar;
- QLabel* nicknameLabel;
- QLineEdit* nickname;
- QLabel* throbberLabel;
- QLabel* errorLabel;
- QHBoxLayout* horizontalLayout;
- QPushButton* saveButton;
- };
+
+class QtProfileWindow : public QWidget, public ProfileWindow {
+ Q_OBJECT
+
+ public:
+ explicit QtProfileWindow(QWidget* parent = 0);
+ virtual ~QtProfileWindow();
+
+ virtual void setJID(const JID& jid);
+ virtual void setVCard(VCard::ref vcard);
+
+ virtual void setEnabled(bool b);
+ virtual void setProcessing(bool processing);
+ virtual void setError(const std::string& error);
+ virtual void setEditable(bool b);
+
+ virtual void show();
+ virtual void hide();
+
+ private:
+ void updateTitle();
+ virtual void closeEvent(QCloseEvent* event);
+
+ private slots:
+ void handleSave();
+
+ private:
+ Ui::QtProfileWindow* ui;
+ JID jid;
+};
+
}
diff --git a/Swift/QtUI/QtProfileWindow.ui b/Swift/QtUI/QtProfileWindow.ui
new file mode 100644
index 0000000..68a36da
--- /dev/null
+++ b/Swift/QtUI/QtProfileWindow.ui
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QtProfileWindow</class>
+ <widget class="QWidget" name="QtProfileWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>334</width>
+ <height>197</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Edit Profile</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout" stretch="1,0">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="Swift::QtVCardWidget" name="vcard" native="true"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="errorLabel">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="throbberLabel">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::NoTextInteraction</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="savePushButton">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtVCardWidget</class>
+ <extends>QWidget</extends>
+ <header>Swift/QtUI/QtVCardWidget/QtVCardWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtSwiftUtil.h b/Swift/QtUI/QtSwiftUtil.h
index 2d0f970..c903af1 100644
--- a/Swift/QtUI/QtSwiftUtil.h
+++ b/Swift/QtUI/QtSwiftUtil.h
@@ -9,4 +9,6 @@
#define P2QSTRING(a) QString::fromUtf8(a.c_str())
#define Q2PSTRING(a) std::string(a.toUtf8())
+#include <boost/date_time/posix_time/posix_time.hpp>
+
#define B2QDATE(a) QDateTime::fromTime_t((a - boost::posix_time::from_time_t(0)).total_seconds())
diff --git a/Swift/QtUI/QtVCardWidget/QtResizableLineEdit.cpp b/Swift/QtUI/QtVCardWidget/QtResizableLineEdit.cpp
new file mode 100644
index 0000000..d4357cb
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtResizableLineEdit.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtResizableLineEdit.h"
+
+#include <QDebug>
+
+namespace Swift {
+
+QtResizableLineEdit::QtResizableLineEdit(QWidget* parent) :
+ QLineEdit(parent) {
+ connect(this, SIGNAL(textChanged(QString)), SLOT(textChanged(QString)));
+ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+}
+
+QtResizableLineEdit::~QtResizableLineEdit() {
+}
+
+bool QtResizableLineEdit::isEditable() const {
+ return editable;
+}
+void QtResizableLineEdit::setEditable(const bool editable) {
+ this->editable = editable;
+ if (editable) {
+ setReadOnly(false);
+ } else {
+ setReadOnly(true);
+ }
+}
+
+
+QSize QtResizableLineEdit::sizeHint() const {
+ int w = fontMetrics().boundingRect(text().isEmpty() ? placeholderText() : text()).width() + 10;
+ return QSize(w, height());
+}
+
+void QtResizableLineEdit::textChanged(QString) {
+ updateGeometry();
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtResizableLineEdit.h b/Swift/QtUI/QtVCardWidget/QtResizableLineEdit.h
new file mode 100644
index 0000000..9022d38
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtResizableLineEdit.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QLineEdit>
+
+namespace Swift {
+
+ class QtResizableLineEdit : public QLineEdit {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+
+ public:
+ explicit QtResizableLineEdit(QWidget* parent = 0);
+ ~QtResizableLineEdit();
+
+ bool isEditable() const;
+ void setEditable(const bool);
+
+ virtual QSize sizeHint() const;
+
+ private slots:
+ void textChanged(QString);
+
+ private:
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardAddressField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardAddressField.cpp
new file mode 100644
index 0000000..c1a08f1
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardAddressField.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardAddressField.h"
+#include "ui_QtVCardAddressField.h"
+
+#define GETTER_SETTER_CHECKBOX_IMPL( METHOD_NAME, UI_NAME ) \
+ void QtVCardAddressField::set##METHOD_NAME(const bool METHOD_NAME) { \
+ ui->checkBox##UI_NAME->setChecked(METHOD_NAME); \
+ } \
+ \
+ bool QtVCardAddressField::get##METHOD_NAME() const { \
+ return ui->checkBox##UI_NAME->checkState() == Qt::Checked; \
+ }
+
+#define GETTER_SETTER_LINEEDIT_IMPL( METHOD_NAME, UI_NAME ) \
+ void QtVCardAddressField::set##METHOD_NAME(const QString METHOD_NAME) { \
+ ui->lineEdit##UI_NAME->setText(METHOD_NAME); \
+ } \
+ \
+ QString QtVCardAddressField::get##METHOD_NAME() const { \
+ return ui->lineEdit##UI_NAME->text(); \
+ }
+
+namespace Swift {
+
+QtVCardAddressField::QtVCardAddressField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardAddressField) {
+ ui->setupUi(this);
+ setEditable(editable);
+}
+
+QtVCardAddressField::~QtVCardAddressField() {
+ delete ui;
+}
+
+bool QtVCardAddressField::isEditable() const {
+ return editable;
+}
+
+void QtVCardAddressField::setEditable(bool editable) {
+ this->editable = editable;
+ QList<QCheckBox*> allCheckBoxes = findChildren<QCheckBox*>();
+ foreach(QCheckBox* checkbox, allCheckBoxes) {
+ if (editable) {
+ checkbox->setEnabled(true);
+ } else {
+ checkbox->setEnabled(false);
+ }
+ }
+
+ QList<QtResizableLineEdit*> allLineEdits = findChildren<QtResizableLineEdit*>();
+ foreach(QtResizableLineEdit* lineEdit, allLineEdits) {
+ if (editable) {
+ lineEdit->show();
+ lineEdit->setEditable(true);
+ } else {
+ lineEdit->setEditable(false);
+ if (lineEdit->text().isEmpty()) {
+ lineEdit->hide();
+ } else {
+ lineEdit->show();
+ }
+ }
+ }
+
+ if (editable) {
+ ui->comboBoxDOM_INTL->setEnabled(true);
+ } else {
+ ui->comboBoxDOM_INTL->setEnabled(false);
+ }
+}
+
+bool QtVCardAddressField::isEmpty() const {
+ return false;
+}
+
+GETTER_SETTER_CHECKBOX_IMPL(Home, HOME)
+GETTER_SETTER_CHECKBOX_IMPL(Work, WORK)
+GETTER_SETTER_CHECKBOX_IMPL(Postal, POSTAL)
+GETTER_SETTER_CHECKBOX_IMPL(Parcel, PARCEL)
+GETTER_SETTER_CHECKBOX_IMPL(Preferred, PREF)
+
+void QtVCardAddressField::setDeliveryType(DeliveryType type) {
+ ui->comboBoxDOM_INTL->setCurrentIndex(type);
+}
+
+QtVCardAddressField::DeliveryType QtVCardAddressField::getDeliveryType() const {
+ return ui->comboBoxDOM_INTL->currentIndex() == 1 ? InternationalDelivery : DomesticDelivery;
+}
+
+GETTER_SETTER_LINEEDIT_IMPL(POBox, POBOX)
+GETTER_SETTER_LINEEDIT_IMPL(AddressExtension, EXTADD)
+GETTER_SETTER_LINEEDIT_IMPL(Street, STREET)
+GETTER_SETTER_LINEEDIT_IMPL(Locality, LOCALITY)
+GETTER_SETTER_LINEEDIT_IMPL(Region, REGION)
+GETTER_SETTER_LINEEDIT_IMPL(PostalCode, PCODE)
+GETTER_SETTER_LINEEDIT_IMPL(Country, CTRY)
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardAddressField.h b/Swift/QtUI/QtVCardWidget/QtVCardAddressField.h
new file mode 100644
index 0000000..9f2c83b
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardAddressField.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardAddressField;
+ }
+
+ class QtVCardAddressField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Address");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardAddressField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardAddressField*>(widget) != 0;
+ }
+ };
+
+ public:
+ enum DeliveryType {
+ DomesticDelivery = 0,
+ InternationalDelivery
+ };
+
+ public:
+ explicit QtVCardAddressField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardAddressField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setHome(const bool);
+ bool getHome() const;
+
+ void setWork(const bool);
+ bool getWork() const;
+
+ void setPostal(const bool);
+ bool getPostal() const;
+
+ void setParcel(const bool);
+ bool getParcel() const;
+
+ void setPreferred(const bool);
+ bool getPreferred() const;
+
+ void setPOBox(const QString);
+ QString getPOBox() const;
+
+ void setDeliveryType(DeliveryType type);
+ DeliveryType getDeliveryType() const;
+
+ void setAddressExtension(const QString);
+ QString getAddressExtension() const;
+
+ void setStreet(const QString);
+ QString getStreet() const;
+
+ void setLocality(const QString);
+ QString getLocality() const;
+
+ void setRegion(const QString);
+ QString getRegion() const;
+
+ void setPostalCode(const QString);
+ QString getPostalCode() const;
+
+ void setCountry(const QString);
+ QString getCountry() const;
+
+ private slots:
+
+ private:
+ Ui::QtVCardAddressField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardAddressField.ui b/Swift/QtUI/QtVCardWidget/QtVCardAddressField.ui
new file mode 100644
index 0000000..f5dffc8
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardAddressField.ui
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardAddressField</class>
+ <widget class="QWidget" name="Swift::QtVCardAddressField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>524</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditSTREET">
+ <property name="toolTip">
+ <string>Street</string>
+ </property>
+ <property name="placeholderText">
+ <string>Street</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditREGION">
+ <property name="toolTip">
+ <string>Region</string>
+ </property>
+ <property name="placeholderText">
+ <string>Region</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditCTRY">
+ <property name="toolTip">
+ <string>Country</string>
+ </property>
+ <property name="placeholderText">
+ <string>Country</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditPCODE">
+ <property name="toolTip">
+ <string>Postal Code</string>
+ </property>
+ <property name="placeholderText">
+ <string>Postal Code</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditLOCALITY">
+ <property name="toolTip">
+ <string>City</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="placeholderText">
+ <string>City</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditEXTADD">
+ <property name="toolTip">
+ <string>Address Extension</string>
+ </property>
+ <property name="placeholderText">
+ <string>Address Extension</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="Swift::QtResizableLineEdit" name="lineEditPOBOX">
+ <property name="toolTip">
+ <string>PO Box</string>
+ </property>
+ <property name="placeholderText">
+ <string>PO Box</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="checkBoxPREF">
+ <property name="toolTip">
+ <string>Preferred</string>
+ </property>
+ <property name="text">
+ <string>Preferred</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="checkBoxHOME">
+ <property name="toolTip">
+ <string>Home</string>
+ </property>
+ <property name="text">
+ <string>Home</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="checkBoxWORK">
+ <property name="toolTip">
+ <string>Work</string>
+ </property>
+ <property name="text">
+ <string>Work</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="checkBoxPOSTAL">
+ <property name="toolTip">
+ <string>Postal</string>
+ </property>
+ <property name="text">
+ <string>Postal</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="checkBoxPARCEL">
+ <property name="toolTip">
+ <string>Parcel</string>
+ </property>
+ <property name="text">
+ <string>Parcel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <widget class="QComboBox" name="comboBoxDOM_INTL">
+ <property name="toolTip">
+ <string>Delivery Type</string>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QComboBox::AdjustToMinimumContentsLength</enum>
+ </property>
+ <item>
+ <property name="text">
+ <string>Domestic Delivery</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>International Delivery</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.cpp
new file mode 100644
index 0000000..79e4440
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardAddressLabelField.h"
+#include "ui_QtVCardAddressLabelField.h"
+
+#define GETTER_SETTER_CHECKBOX_IMPL( METHOD_NAME, UI_NAME ) \
+ void QtVCardAddressLabelField::set##METHOD_NAME(const bool METHOD_NAME) { \
+ ui->checkBox##UI_NAME->setChecked(METHOD_NAME); \
+ } \
+ \
+ bool QtVCardAddressLabelField::get##METHOD_NAME() const { \
+ return ui->checkBox##UI_NAME->checkState() == Qt::Checked; \
+ }
+
+namespace Swift {
+
+QtVCardAddressLabelField::QtVCardAddressLabelField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardAddressLabelField) {
+ ui->setupUi(this);
+ setEditable(editable);
+}
+
+QtVCardAddressLabelField::~QtVCardAddressLabelField() {
+ delete ui;
+}
+
+bool QtVCardAddressLabelField::isEditable() const {
+ return editable;
+}
+
+void QtVCardAddressLabelField::setEditable(bool editable) {
+ this->editable = editable;
+ ui->plainTextEditLINES->setReadOnly(!editable);
+}
+
+bool QtVCardAddressLabelField::isEmpty() const {
+ return false;
+}
+
+GETTER_SETTER_CHECKBOX_IMPL(Home, HOME)
+GETTER_SETTER_CHECKBOX_IMPL(Work, WORK)
+GETTER_SETTER_CHECKBOX_IMPL(Postal, POSTAL)
+GETTER_SETTER_CHECKBOX_IMPL(Parcel, PARCEL)
+GETTER_SETTER_CHECKBOX_IMPL(Preferred, PREF)
+
+void QtVCardAddressLabelField::setDeliveryType(DeliveryType type) {
+ ui->comboBoxDOM_INTL->setCurrentIndex(type);
+}
+
+QtVCardAddressLabelField::DeliveryType QtVCardAddressLabelField::getDeliveryType() const {
+ return ui->comboBoxDOM_INTL->currentIndex() == 1 ? InternationalDelivery : DomesticDelivery;
+}
+
+void QtVCardAddressLabelField::setLines(const QString& lines) {
+ ui->plainTextEditLINES->setPlainText(lines);
+}
+
+QString QtVCardAddressLabelField::getLines() const {
+ return ui->plainTextEditLINES->toPlainText();
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.h b/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.h
new file mode 100644
index 0000000..868fbce
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardAddressLabelField;
+ }
+
+ class QtVCardAddressLabelField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Address Label");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardAddressLabelField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardAddressLabelField*>(widget) != 0;
+ }
+ };
+
+ public:
+ enum DeliveryType {
+ DomesticDelivery = 0,
+ InternationalDelivery
+ };
+
+ public:
+ explicit QtVCardAddressLabelField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardAddressLabelField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setHome(const bool);
+ bool getHome() const;
+
+ void setWork(const bool);
+ bool getWork() const;
+
+ void setPostal(const bool);
+ bool getPostal() const;
+
+ void setParcel(const bool);
+ bool getParcel() const;
+
+ void setPreferred(const bool);
+ bool getPreferred() const;
+
+ void setPOBox(const QString);
+ QString getPOBox() const;
+
+ void setDeliveryType(DeliveryType type);
+ DeliveryType getDeliveryType() const;
+
+ void setLines(const QString&);
+ QString getLines() const;
+
+ private slots:
+
+ private:
+ Ui::QtVCardAddressLabelField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.ui b/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.ui
new file mode 100644
index 0000000..dc1de27
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.ui
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardAddressLabelField</class>
+ <widget class="QWidget" name="Swift::QtVCardAddressLabelField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>614</width>
+ <height>80</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPlainTextEdit" name="plainTextEditLINES">
+ <property name="toolTip">
+ <string>Address Label</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="lineWrapMode">
+ <enum>QPlainTextEdit::NoWrap</enum>
+ </property>
+ <property name="backgroundVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>146</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="checkBoxPREF">
+ <property name="toolTip">
+ <string>Preferred</string>
+ </property>
+ <property name="text">
+ <string>Preferred</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="checkBoxHOME">
+ <property name="toolTip">
+ <string>Home</string>
+ </property>
+ <property name="text">
+ <string>Home</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="checkBoxWORK">
+ <property name="toolTip">
+ <string>Work</string>
+ </property>
+ <property name="text">
+ <string>Work</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="checkBoxPOSTAL">
+ <property name="toolTip">
+ <string>Postal</string>
+ </property>
+ <property name="text">
+ <string>Postal</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="checkBoxPARCEL">
+ <property name="toolTip">
+ <string>Parcel</string>
+ </property>
+ <property name="text">
+ <string>Parcel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <widget class="QComboBox" name="comboBoxDOM_INTL">
+ <property name="toolTip">
+ <string>Delivery Type</string>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QComboBox::AdjustToMinimumContentsLength</enum>
+ </property>
+ <item>
+ <property name="text">
+ <string>Domestic Delivery</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>International Delivery</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.cpp
new file mode 100644
index 0000000..3cad247
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardBirthdayField.h"
+#include "ui_QtVCardBirthdayField.h"
+
+#include <QLayout>
+
+namespace Swift {
+
+QtVCardBirthdayField::QtVCardBirthdayField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardBirthdayField) {
+ ui->setupUi(this);
+ connect(ui->deleteField, SIGNAL(clicked()), SLOT(onDeleteFieldPressed()));
+ setEditable(editable);
+}
+
+QtVCardBirthdayField::~QtVCardBirthdayField() {
+ delete ui;
+}
+
+bool QtVCardBirthdayField::isEditable() const {
+ return editable;
+}
+
+void QtVCardBirthdayField::setEditable(bool editable) {
+ if (editable) {
+ ui->labelBDAY->hide();
+ ui->dateEditBDAY->show();
+ ui->deleteField->show();
+ } else {
+ ui->dateEditBDAY->hide();
+ ui->deleteField->hide();
+ ui->labelBDAY->show();
+ }
+ this->editable = editable;
+}
+
+bool QtVCardBirthdayField::isEmpty() const {
+ return false;
+}
+
+void QtVCardBirthdayField::setBirthday(const QDate& date) {
+ ui->labelBDAY->setText(date.toString());
+ ui->dateEditBDAY->setDate(date);
+}
+
+QDate QtVCardBirthdayField::getBirthday() const {
+ return ui->dateEditBDAY->date();
+}
+
+void QtVCardBirthdayField::onDateChanged(QDate date) {
+ ui->labelBDAY->setText(date.toString());
+}
+
+void QtVCardBirthdayField::onDeleteFieldPressed() {
+ delete this;
+}
+
+}
+
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.h b/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.h
new file mode 100644
index 0000000..28197c0
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+#include <QDate>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardBirthdayField;
+ }
+
+ class QtVCardBirthdayField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Birthday");
+ }
+ virtual int getAllowedInstances() const {
+ return 1;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardBirthdayField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardBirthdayField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardBirthdayField(QWidget* parent = 0, bool editable = false);
+ virtual ~QtVCardBirthdayField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setBirthday(const QDate& date);
+ QDate getBirthday() const;
+
+ private slots:
+ void onDateChanged(QDate date);
+ void onDeleteFieldPressed();
+
+ private:
+ Ui::QtVCardBirthdayField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.ui b/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.ui
new file mode 100644
index 0000000..bb6ddd4
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.ui
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardBirthdayField</class>
+ <widget class="QWidget" name="Swift::QtVCardBirthdayField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelBDAY">
+ <property name="toolTip">
+ <string>Birthday</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDateEdit" name="dateEditBDAY">
+ <property name="toolTip">
+ <string>Birthday</string>
+ </property>
+ <property name="displayFormat">
+ <string>dd.MM.yyyy</string>
+ </property>
+ <property name="calendarPopup">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="deleteField">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>X</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.cpp
new file mode 100644
index 0000000..c86d72e
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardDescriptionField.h"
+#include "ui_QtVCardDescriptionField.h"
+
+namespace Swift {
+
+QtVCardDescriptionField::QtVCardDescriptionField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardDescriptionField) {
+ ui->setupUi(this);
+ setEditable(editable);
+}
+
+QtVCardDescriptionField::~QtVCardDescriptionField() {
+ delete ui;
+}
+
+bool QtVCardDescriptionField::isEditable() const {
+ return editable;
+}
+
+void QtVCardDescriptionField::setEditable(bool editable) {
+ this->editable = editable;
+ ui->plainTextEditDESC->setReadOnly(!editable);
+}
+
+bool QtVCardDescriptionField::isEmpty() const {
+ return ui->plainTextEditDESC->toPlainText().isEmpty();
+}
+
+void QtVCardDescriptionField::setDescription(const QString description) {
+ ui->plainTextEditDESC->setPlainText(description);
+}
+
+QString QtVCardDescriptionField::getDescription() const {
+ return ui->plainTextEditDESC->toPlainText();
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.h b/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.h
new file mode 100644
index 0000000..22c3a72
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardDescriptionField;
+ }
+
+ class QtVCardDescriptionField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Description");
+ }
+ virtual int getAllowedInstances() const {
+ return 1;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardDescriptionField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardDescriptionField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardDescriptionField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardDescriptionField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setDescription(const QString description);
+ QString getDescription() const;
+
+ private:
+ Ui::QtVCardDescriptionField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.ui b/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.ui
new file mode 100644
index 0000000..9ca3fe5
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.ui
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardDescriptionField</class>
+ <widget class="QWidget" name="Swift::QtVCardDescriptionField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>488</width>
+ <height>170</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPlainTextEdit" name="plainTextEditDESC">
+ <property name="toolTip">
+ <string>Description</string>
+ </property>
+ <property name="documentTitle">
+ <string/>
+ </property>
+ <property name="lineWrapMode">
+ <enum>QPlainTextEdit::NoWrap</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardEMailField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardEMailField.cpp
new file mode 100644
index 0000000..58372c2
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardEMailField.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardEMailField.h"
+#include "ui_QtVCardEMailField.h"
+
+#include <QVariant>
+
+namespace Swift {
+
+QtVCardEMailField::QtVCardEMailField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardEMailField) {
+ ui->setupUi(this);
+ connect(ui->lineEditEMAIL, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ connect(ui->comboBoxType, SIGNAL(currentIndexChanged(int)), SLOT(onEMailTypeChanged(int)));
+ setEditable(editable);
+}
+
+QtVCardEMailField::~QtVCardEMailField() {
+ delete ui;
+}
+
+bool QtVCardEMailField::isEditable() const {
+ return editable;
+}
+
+void QtVCardEMailField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->label->show();
+ ui->comboBoxType->show();
+ ui->lineEditEMAIL->show();
+ ui->labelEMAIL->hide();
+ } else {
+ ui->label->hide();
+ ui->comboBoxType->hide();
+ ui->lineEditEMAIL->hide();
+ ui->labelEMAIL->show();
+ }
+
+ foreach(QObject* widget, children()) {
+ if (!dynamic_cast<QWidget*>(widget)) continue;
+ if (widget->property("editable").isValid()) {
+ widget->setProperty("editable", QVariant(editable));
+ }
+
+ if (widget->property("readOnly").isValid()) {
+ widget->setProperty("readOnly", QVariant(!editable));
+ widget->setProperty("frame", QVariant(editable));
+ }
+
+ QCheckBox* checkbox;
+ if ((checkbox = dynamic_cast<QCheckBox*>(widget))) {
+ checkbox->setProperty("enabled", QVariant(editable));
+ }
+ }
+}
+
+bool QtVCardEMailField::isEmpty() const {
+ return ui->lineEditEMAIL->text().isEmpty();
+}
+
+void QtVCardEMailField::setAddress(const QString address) {
+ ui->lineEditEMAIL->setText(address);
+}
+
+QString QtVCardEMailField::getAddress() const {
+ return ui->lineEditEMAIL->text();
+}
+
+void QtVCardEMailField::setPreferred(const bool preferred) {
+ ui->checkBoxPREF->setChecked(preferred);
+}
+
+bool QtVCardEMailField::getPreferred() const {
+ return ui->checkBoxPREF->checkState() == Qt::Checked;
+}
+
+void QtVCardEMailField::setHome(const bool home) {
+ ui->checkBoxHOME->setChecked(home);
+}
+
+bool QtVCardEMailField::getHome() const {
+ return ui->checkBoxHOME->checkState() == Qt::Checked;
+}
+
+void QtVCardEMailField::setWork(const bool work) {
+ ui->checkBoxWORK->setChecked(work);
+}
+
+bool QtVCardEMailField::getWork() const {
+ return ui->checkBoxWORK->checkState() == Qt::Checked;
+}
+
+void QtVCardEMailField::setType(EMailType type) {
+ ui->comboBoxType->setCurrentIndex(type);
+}
+
+QtVCardEMailField::EMailType QtVCardEMailField::getType() const {
+ return ui->comboBoxType->currentIndex() == 1 ? X_400 : Internet;
+}
+
+void QtVCardEMailField::onTextChanged(const QString& text) {
+ if (ui->comboBoxType->currentIndex() == Internet && isEmailAddress(text)) {
+ ui->labelEMAIL->setText(QString("<a href=\"mailto:%1\">%1</a>").arg(text));
+ } else {
+ ui->labelEMAIL->setText(text);
+ }
+}
+
+void QtVCardEMailField::onEMailTypeChanged(int) {
+ onTextChanged(ui->labelEMAIL->text());
+}
+
+bool QtVCardEMailField::isEmailAddress(const QString& emailAddress) {
+ if ( emailAddress.length() == 0 ) {
+ return false;
+ }
+ QRegExp regex(QString("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"), Qt::CaseInsensitive);
+ return regex.exactMatch(emailAddress);
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardEMailField.h b/Swift/QtUI/QtVCardWidget/QtVCardEMailField.h
new file mode 100644
index 0000000..ff486a1
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardEMailField.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardEMailField;
+ }
+
+ class QtVCardEMailField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("EMail");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardEMailField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardEMailField*>(widget) != 0;
+ }
+ };
+
+ enum EMailType {
+ Internet = 0,
+ X_400
+ };
+
+ public:
+ explicit QtVCardEMailField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardEMailField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setAddress(const QString address);
+ QString getAddress() const;
+
+ void setPreferred(const bool preferred);
+ bool getPreferred() const;
+
+ void setHome(const bool home);
+ bool getHome() const;
+
+ void setWork(const bool work);
+ bool getWork() const;
+
+ void setType(EMailType type);
+ EMailType getType() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+ void onEMailTypeChanged(int);
+
+ private:
+ bool isEmailAddress(const QString& emailAddress);
+
+ private:
+ Ui::QtVCardEMailField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardEMailField.ui b/Swift/QtUI/QtVCardWidget/QtVCardEMailField.ui
new file mode 100644
index 0000000..abf0fa1
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardEMailField.ui
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardEMailField</class>
+ <widget class="QWidget" name="Swift::QtVCardEMailField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Type:</string>
+ </property>
+ <property name="buddy">
+ <cstring>comboBoxType</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboBoxType">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="editable">
+ <bool>false</bool>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
+ </property>
+ <property name="minimumContentsLength">
+ <number>1</number>
+ </property>
+ <item>
+ <property name="text">
+ <string>Internet</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>X.400</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelEMAIL">
+ <property name="toolTip">
+ <string>E-Mail</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditEMAIL">
+ <property name="toolTip">
+ <string>E-Mail</string>
+ </property>
+ <property name="placeholderText">
+ <string>E-Mail</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxPREF">
+ <property name="text">
+ <string>Preferred</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxHOME">
+ <property name="text">
+ <string>Home</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxWORK">
+ <property name="text">
+ <string>Work</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h b/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h
new file mode 100644
index 0000000..8a9d089
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <typeinfo>
+
+class QWidget;
+
+namespace Swift {
+
+ class QtVCardFieldInfo {
+ public:
+ static const int UNLIMITED_INSTANCES = -1;
+
+ virtual ~QtVCardFieldInfo() {
+ }
+ virtual QString getMenuName() const = 0;
+ virtual int getAllowedInstances() const = 0;
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const = 0;
+ virtual bool testInstance(QWidget*) const = 0;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardJIDField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardJIDField.cpp
new file mode 100644
index 0000000..69e2285
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardJIDField.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardJIDField.h"
+#include "ui_QtVCardJIDField.h"
+
+#include <Swiften/JID/JID.h>
+
+#include <Swift/QtUI/QtSwiftUtil.h>
+
+namespace Swift {
+
+QtVCardJIDField::QtVCardJIDField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardJIDField) {
+ ui->setupUi(this);
+ connect(ui->lineEditJID, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ setEditable(editable);
+}
+
+QtVCardJIDField::~QtVCardJIDField() {
+ delete ui;
+}
+
+bool QtVCardJIDField::isEditable() const {
+ return editable;
+}
+
+void QtVCardJIDField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->lineEditJID->show();
+ ui->labelJID->hide();
+ } else {
+ ui->lineEditJID->hide();
+ ui->labelJID->show();
+ }
+}
+
+bool QtVCardJIDField::isEmpty() const {
+ return ui->lineEditJID->text().isEmpty();
+}
+
+void QtVCardJIDField::setJID(const QString jid) {
+ ui->lineEditJID->setText(jid);
+}
+
+QString QtVCardJIDField::getJID() const {
+ return ui->lineEditJID->text();
+}
+
+void QtVCardJIDField::onTextChanged(const QString& text) {
+ if (text.isEmpty()) {
+ ui->labelJID->setText("");
+ } else {
+ if (JID(Q2PSTRING(text)).isValid()) {
+ ui->labelJID->setText(QString("<a href=\"xmpp:%1\">%1</a>").arg(text));
+ } else {
+ ui->labelJID->setText(text);
+ }
+ }
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardJIDField.h b/Swift/QtUI/QtVCardWidget/QtVCardJIDField.h
new file mode 100644
index 0000000..bd697de
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardJIDField.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardJIDField;
+ }
+
+ class QtVCardJIDField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("JID");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardJIDField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardJIDField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardJIDField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardJIDField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setJID(const QString jid);
+ QString getJID() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+
+ private:
+ Ui::QtVCardJIDField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardJIDField.ui b/Swift/QtUI/QtVCardWidget/QtVCardJIDField.ui
new file mode 100644
index 0000000..7215578
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardJIDField.ui
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardJIDField</class>
+ <widget class="QWidget" name="Swift::QtVCardJIDField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelJID">
+ <property name="toolTip">
+ <string>JID</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditJID">
+ <property name="toolTip">
+ <string>JID</string>
+ </property>
+ <property name="placeholderText">
+ <string>JID</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.cpp
new file mode 100644
index 0000000..37d35d9
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardOrganisationField.h"
+#include "ui_QtVCardOrganisationField.h"
+
+namespace Swift {
+
+QtVCardOrganisationField::QtVCardOrganisationField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardOrganisationField) {
+ ui->setupUi(this);
+ connect(ui->lineEditORGNAME, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ connect(ui->pushButtonAddUnit, SIGNAL(clicked()), SLOT(onAddUnitButtonPressed()));
+ connect(ui->pushButtonRemoveUnit, SIGNAL(clicked()), SLOT(onRemoveUnitButtonPressed()));
+ setEditable(editable);
+}
+
+QtVCardOrganisationField::~QtVCardOrganisationField() {
+ delete ui;
+}
+
+bool QtVCardOrganisationField::isEditable() const {
+ return editable;
+}
+
+void QtVCardOrganisationField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->lineEditORGNAME->show();
+ ui->labelORGNAME->hide();
+ ui->listWidgetORGUNIT->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);
+ ui->listWidgetORGUNIT->setEnabled(true);
+ ui->pushButtonAddUnit->show();
+ ui->pushButtonRemoveUnit->show();
+ } else {
+ ui->lineEditORGNAME->hide();
+ ui->labelORGNAME->show();
+ if (ui->listWidgetORGUNIT->count() > 0) {
+ ui->listWidgetORGUNIT->setEditTriggers(0);
+ ui->listWidgetORGUNIT->show();
+ } else {
+ ui->listWidgetORGUNIT->hide();
+ }
+ ui->pushButtonAddUnit->hide();
+ ui->pushButtonRemoveUnit->hide();
+ }
+}
+
+bool QtVCardOrganisationField::isEmpty() const {
+ return ui->lineEditORGNAME->text().isEmpty() && getUnits().empty();
+}
+
+void QtVCardOrganisationField::setName(const QString name) {
+ ui->lineEditORGNAME->setText(name);
+}
+
+QString QtVCardOrganisationField::getName() const {
+ return ui->lineEditORGNAME->text();
+}
+
+void QtVCardOrganisationField::setUnits(const QList<QString> units) {
+ ui->listWidgetORGUNIT->clear();
+ foreach(const QString& unit, units) {
+ QListWidgetItem* item = new QListWidgetItem(unit);
+ item->setFlags(item->flags() | Qt::ItemIsEditable);
+ ui->listWidgetORGUNIT->addItem(item);
+ }
+}
+
+QList<QString> QtVCardOrganisationField::getUnits() const {
+ QList<QString> units;
+ for (int n = 0; n < ui->listWidgetORGUNIT->count(); n++) {
+ QListWidgetItem* item = ui->listWidgetORGUNIT->item(n);
+ units.push_back(item->text());
+ }
+ return units;
+}
+
+void QtVCardOrganisationField::onTextChanged(const QString& text) {
+ ui->labelORGNAME->setText(text);
+}
+
+void QtVCardOrganisationField::onAddUnitButtonPressed() {
+ QListWidgetItem* item = new QListWidgetItem("Doubleclick to edit.");
+ item->setFlags(item->flags() | Qt::ItemIsEditable);
+ ui->listWidgetORGUNIT->addItem(item);
+}
+
+void QtVCardOrganisationField::onRemoveUnitButtonPressed() {
+ foreach (QListWidgetItem* item, ui->listWidgetORGUNIT->selectedItems()) {
+ ui->listWidgetORGUNIT->removeItemWidget(item);
+ delete item;
+ }
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.h b/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.h
new file mode 100644
index 0000000..0743823
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardOrganisationField;
+ }
+
+ class QtVCardOrganisationField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Organisation");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardOrganisationField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardOrganisationField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardOrganisationField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardOrganisationField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setName(const QString name);
+ QString getName() const;
+
+ void setUnits(const QList<QString> units);
+ QList<QString> getUnits() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+ void onAddUnitButtonPressed();
+ void onRemoveUnitButtonPressed();
+
+ private:
+ Ui::QtVCardOrganisationField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.ui b/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.ui
new file mode 100644
index 0000000..1caf2b1
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardOrganisationField.ui
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardOrganisationField</class>
+ <widget class="QWidget" name="Swift::QtVCardOrganisationField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>455</width>
+ <height>112</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelORGNAME">
+ <property name="toolTip">
+ <string>Organisation Name</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditORGNAME">
+ <property name="toolTip">
+ <string>Organisation Name</string>
+ </property>
+ <property name="placeholderText">
+ <string>Organisation Name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="1" column="0" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>5</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonRemoveUnit">
+ <property name="text">
+ <string>Remove Unit</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonAddUnit">
+ <property name="text">
+ <string>Add Unit</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0">
+ <widget class="QListWidget" name="listWidgetORGUNIT">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Organisation Units</string>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::MultiSelection</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.cpp b/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.cpp
new file mode 100644
index 0000000..2c6ef22
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardPhotoAndNameFields.h"
+#include "ui_QtVCardPhotoAndNameFields.h"
+
+#include <QDebug>
+#include <QMenu>
+
+namespace Swift {
+
+QtVCardPhotoAndNameFields::QtVCardPhotoAndNameFields(QWidget* parent) :
+ QWidget(parent),
+ ui(new Ui::QtVCardPhotoAndNameFields) {
+ ui->setupUi(this);
+ ui->lineEditPREFIX->hide();
+ ui->lineEditMIDDLE->hide();
+ ui->lineEditSUFFIX->hide();
+ ui->lineEditFN->hide();
+ ui->lineEditNICKNAME->hide();
+
+ addFieldMenu = new QMenu("Name", this);
+
+ actionSignalMapper = new QSignalMapper(this);
+
+ connect(actionSignalMapper, SIGNAL(mapped(const QString &)), this, SLOT(showField(const QString &)));
+ prepareAddFieldMenu();
+}
+
+QtVCardPhotoAndNameFields::~QtVCardPhotoAndNameFields() {
+ delete ui;
+ delete actionSignalMapper;
+}
+
+bool QtVCardPhotoAndNameFields::isEditable() const {
+ return editable;
+}
+
+void QtVCardPhotoAndNameFields::setEditable(bool editable) {
+ this->editable = editable;
+
+ foreach(QObject *widget, children()) {
+ if (!dynamic_cast<QWidget*>(widget)) continue;
+ if (widget->property("editable").isValid()) {
+ widget->setProperty("editable", QVariant(editable));
+ }
+
+ if (widget->property("readOnly").isValid()) {
+ widget->setProperty("readOnly", QVariant(!editable));
+ widget->setProperty("frame", QVariant(editable));
+ }
+ QLineEdit* lineEdit = 0;
+ if ((lineEdit = dynamic_cast<QLineEdit*>(widget))) {
+ if (lineEdit->text().isEmpty()) {
+ lineEdit->hide();
+ } else {
+ lineEdit->show();
+ }
+ }
+ }
+ prepareAddFieldMenu();
+}
+
+QMenu* QtVCardPhotoAndNameFields::getAddFieldMenu() const {
+ return addFieldMenu;
+}
+
+void QtVCardPhotoAndNameFields::setAvatar(const ByteArray &data, const std::string &type) {
+ ui->avatarWidget->setAvatar(data, type);
+}
+
+ByteArray QtVCardPhotoAndNameFields::getAvatarData() const {
+ return ui->avatarWidget->getAvatarData();
+}
+
+std::string QtVCardPhotoAndNameFields::getAvatarType() const {
+ return ui->avatarWidget->getAvatarType();
+}
+
+void QtVCardPhotoAndNameFields::setFormattedName(const QString formattedName) {
+ ui->lineEditFN->setText(formattedName);
+}
+
+QString QtVCardPhotoAndNameFields::getFormattedName() const {
+ return ui->lineEditFN->text();
+}
+
+void QtVCardPhotoAndNameFields::setNickname(const QString nickname) {
+ ui->lineEditNICKNAME->setText(nickname);
+}
+
+QString QtVCardPhotoAndNameFields::getNickname() const {
+ return ui->lineEditNICKNAME->text();
+}
+
+void QtVCardPhotoAndNameFields::setPrefix(const QString prefix) {
+ ui->lineEditPREFIX->setText(prefix);
+}
+
+QString QtVCardPhotoAndNameFields::getPrefix() const {
+ return ui->lineEditPREFIX->text();
+}
+
+void QtVCardPhotoAndNameFields::setGivenName(const QString givenName) {
+ ui->lineEditGIVEN->setText(givenName);
+}
+
+QString QtVCardPhotoAndNameFields::getGivenName() const {
+ return ui->lineEditGIVEN->text();
+}
+
+void QtVCardPhotoAndNameFields::setMiddleName(const QString middleName) {
+ ui->lineEditMIDDLE->setText(middleName);
+}
+
+QString QtVCardPhotoAndNameFields::getMiddleName() const {
+ return ui->lineEditMIDDLE->text();
+}
+
+void QtVCardPhotoAndNameFields::setFamilyName(const QString familyName) {
+ ui->lineEditFAMILY->setText(familyName);
+}
+
+QString QtVCardPhotoAndNameFields::getFamilyName() const {
+ return ui->lineEditFAMILY->text();
+}
+
+void QtVCardPhotoAndNameFields::setSuffix(const QString suffix) {
+ ui->lineEditSUFFIX->setText(suffix);
+}
+
+QString QtVCardPhotoAndNameFields::getSuffix() const {
+ return ui->lineEditSUFFIX->text();
+}
+
+void QtVCardPhotoAndNameFields::prepareAddFieldMenu() {
+ foreach(QAction* action, addFieldMenu->actions()) {
+ actionSignalMapper->removeMappings(action);
+ }
+
+ addFieldMenu->clear();
+ foreach(QObject* obj, children()) {
+ QLineEdit* lineEdit = 0;
+ if (!(lineEdit = dynamic_cast<QLineEdit*>(obj))) continue;
+ if (lineEdit->isHidden()) {
+ QAction* action = addFieldMenu->addAction(QString("Add ") + lineEdit->placeholderText(), actionSignalMapper, SLOT(map()));
+ actionSignalMapper->setMapping(action, lineEdit->objectName());
+ }
+ }
+}
+
+void QtVCardPhotoAndNameFields::showField(const QString& widgetName) {
+ QLineEdit* lineEditToShow = findChild<QLineEdit*>(widgetName);
+ if (lineEditToShow) lineEditToShow->show();
+
+ prepareAddFieldMenu();
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.h b/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.h
new file mode 100644
index 0000000..2fb7e0a
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QMenu>
+#include <QSignalMapper>
+#include <QWidget>
+
+#include <Swiften/Base/ByteArray.h>
+
+namespace Ui {
+ class QtVCardPhotoAndNameFields;
+}
+
+
+namespace Swift {
+
+ class QtVCardPhotoAndNameFields : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+
+ public :
+ explicit QtVCardPhotoAndNameFields(QWidget* parent = 0);
+ ~QtVCardPhotoAndNameFields();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ QMenu* getAddFieldMenu() const;
+
+ void setAvatar(const ByteArray& data, const std::string& type);
+ ByteArray getAvatarData() const;
+ std::string getAvatarType() const;
+
+ void setFormattedName(const QString formattedName);
+ QString getFormattedName() const;
+
+ void setNickname(const QString nickname);
+ QString getNickname() const;
+
+ void setPrefix(const QString prefix);
+ QString getPrefix() const;
+
+ void setGivenName(const QString givenName);
+ QString getGivenName() const;
+
+ void setMiddleName(const QString middleName);
+ QString getMiddleName() const;
+
+ void setFamilyName(const QString familyName);
+ QString getFamilyName() const;
+
+ void setSuffix(const QString suffix);
+ QString getSuffix() const;
+
+ public slots:
+ void showField(const QString& widgetName);
+
+ private:
+ void prepareAddFieldMenu();
+
+ private:
+ Ui::QtVCardPhotoAndNameFields* ui;
+ bool editable;
+
+ QMenu* addFieldMenu;
+ QSignalMapper* actionSignalMapper;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.ui b/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.ui
new file mode 100644
index 0000000..a30878e
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.ui
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QtVCardPhotoAndNameFields</class>
+ <widget class="QWidget" name="QtVCardPhotoAndNameFields">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>522</width>
+ <height>81</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0" rowminimumheight="0,0,0,0,0">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <property name="horizontalSpacing">
+ <number>5</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0" rowspan="5">
+ <widget class="Swift::QtAvatarWidget" name="avatarWidget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" stdset="0">
+ <string/>
+ </property>
+ <property name="flat" stdset="0">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditFN">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>18</pointsize>
+ </font>
+ </property>
+ <property name="toolTip">
+ <string>Formatted Name</string>
+ </property>
+ <property name="placeholderText">
+ <string>Formatted Name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditNICKNAME">
+ <property name="toolTip">
+ <string>Nickname</string>
+ </property>
+ <property name="frame">
+ <bool>true</bool>
+ </property>
+ <property name="placeholderText">
+ <string>Nickname</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditPREFIX">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Prefix</string>
+ </property>
+ <property name="placeholderText">
+ <string>Prefix</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditGIVEN">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Given Name</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="readOnly">
+ <bool>false</bool>
+ </property>
+ <property name="placeholderText">
+ <string>Given Name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditMIDDLE">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Middle Name</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="frame">
+ <bool>true</bool>
+ </property>
+ <property name="placeholderText">
+ <string>Middle Name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditFAMILY">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Last Name</string>
+ </property>
+ <property name="placeholderText">
+ <string>Last Name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditSUFFIX">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Suffix</string>
+ </property>
+ <property name="readOnly">
+ <bool>false</bool>
+ </property>
+ <property name="placeholderText">
+ <string>Suffix</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ <customwidget>
+ <class>Swift::QtAvatarWidget</class>
+ <extends>QWidget</extends>
+ <header>Swift/QtUI/QtAvatarWidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardRoleField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardRoleField.cpp
new file mode 100644
index 0000000..d35f732
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardRoleField.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardRoleField.h"
+#include "ui_QtVCardRoleField.h"
+
+namespace Swift {
+
+QtVCardRoleField::QtVCardRoleField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardRoleField) {
+ ui->setupUi(this);
+ connect(ui->lineEditROLE, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ setEditable(editable);
+}
+
+QtVCardRoleField::~QtVCardRoleField() {
+ delete ui;
+}
+
+bool QtVCardRoleField::isEditable() const {
+ return editable;
+}
+
+void QtVCardRoleField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->lineEditROLE->show();
+ ui->labelROLE->hide();
+ } else {
+ ui->lineEditROLE->hide();
+ ui->labelROLE->show();
+ }
+}
+
+bool QtVCardRoleField::isEmpty() const {
+ return ui->lineEditROLE->text().isEmpty();
+}
+
+void QtVCardRoleField::setRole(const QString role) {
+ ui->lineEditROLE->setText(role);
+}
+
+QString QtVCardRoleField::getRole() const {
+ return ui->lineEditROLE->text();
+}
+
+void QtVCardRoleField::onTextChanged(const QString& text) {
+ ui->labelROLE->setText(text);
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardRoleField.h b/Swift/QtUI/QtVCardWidget/QtVCardRoleField.h
new file mode 100644
index 0000000..f728170
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardRoleField.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardRoleField;
+ }
+
+ class QtVCardRoleField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Role");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardRoleField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardRoleField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardRoleField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardRoleField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setRole(const QString role);
+ QString getRole() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+
+ private:
+ Ui::QtVCardRoleField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardRoleField.ui b/Swift/QtUI/QtVCardWidget/QtVCardRoleField.ui
new file mode 100644
index 0000000..f6c482b
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardRoleField.ui
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardRoleField</class>
+ <widget class="QWidget" name="Swift::QtVCardRoleField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelROLE">
+ <property name="toolTip">
+ <string>Role</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditROLE">
+ <property name="toolTip">
+ <string>Role</string>
+ </property>
+ <property name="placeholderText">
+ <string>Role</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.cpp
new file mode 100644
index 0000000..cbc16bd
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardTelephoneField.h"
+#include "ui_QtVCardTelephoneField.h"
+
+#define GETTER_SETTER_IMPL( METHOD_NAME, UI_NAME ) \
+ void QtVCardTelephoneField::set##METHOD_NAME(const bool METHOD_NAME) { \
+ ui->checkBox##UI_NAME->setChecked(METHOD_NAME); \
+ } \
+ \
+ bool QtVCardTelephoneField::get##METHOD_NAME() const { \
+ return ui->checkBox##UI_NAME->checkState() == Qt::Checked; \
+ }
+
+namespace Swift {
+
+QtVCardTelephoneField::QtVCardTelephoneField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardTelephoneField) {
+ ui->setupUi(this);
+ connect(ui->lineEditTEL, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ setEditable(editable);
+}
+
+QtVCardTelephoneField::~QtVCardTelephoneField() {
+ delete ui;
+}
+
+bool QtVCardTelephoneField::isEditable() const {
+ return editable;
+}
+
+void QtVCardTelephoneField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->lineEditTEL->show();
+ ui->labelTEL->hide();
+ } else {
+ ui->lineEditTEL->hide();
+ ui->labelTEL->show();
+ }
+
+ foreach(QObject *widget, children()) {
+ if (!dynamic_cast<QWidget*>(widget)) continue;
+ if (widget->property("editable").isValid()) {
+ widget->setProperty("editable", QVariant(editable));
+ }
+
+ if (widget->property("readOnly").isValid()) {
+ widget->setProperty("readOnly", QVariant(!editable));
+ widget->setProperty("frame", QVariant(editable));
+ }
+
+ QCheckBox* checkbox;
+ if ((checkbox = dynamic_cast<QCheckBox*>(widget))) {
+ checkbox->setProperty("enabled", QVariant(editable));
+ }
+ }
+}
+
+bool QtVCardTelephoneField::isEmpty() const {
+ return ui->lineEditTEL->text().isEmpty();
+}
+
+void QtVCardTelephoneField::setNumber(const QString number) {
+ ui->lineEditTEL->setText(number);
+}
+
+QString QtVCardTelephoneField::getNumber() const {
+ return ui->lineEditTEL->text();
+}
+
+GETTER_SETTER_IMPL(Preferred, PREF)
+GETTER_SETTER_IMPL(Home, HOME)
+GETTER_SETTER_IMPL(Work, WORK)
+GETTER_SETTER_IMPL(Voice, VOICE)
+GETTER_SETTER_IMPL(Fax, FAX)
+GETTER_SETTER_IMPL(Pager, PAGER)
+GETTER_SETTER_IMPL(MSG, MSG)
+GETTER_SETTER_IMPL(Cell, CELL)
+GETTER_SETTER_IMPL(Video, VIDEO)
+GETTER_SETTER_IMPL(BBS, BBS)
+GETTER_SETTER_IMPL(Modem, MODEM)
+GETTER_SETTER_IMPL(ISDN, ISDN)
+GETTER_SETTER_IMPL(PCS, PCS)
+
+void QtVCardTelephoneField::onTextChanged(const QString& text) {
+ ui->labelTEL->setText(text);
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.h b/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.h
new file mode 100644
index 0000000..d3c6bb2
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardTelephoneField;
+ }
+
+ class QtVCardTelephoneField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Telephone");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardTelephoneField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardTelephoneField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardTelephoneField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardTelephoneField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setNumber(const QString address);
+ QString getNumber() const;
+
+ void setPreferred(const bool preferred);
+ bool getPreferred() const;
+
+ void setHome(const bool home);
+ bool getHome() const;
+
+ void setWork(const bool work);
+ bool getWork() const;
+
+ void setVoice(const bool);
+ bool getVoice() const;
+ void setFax(const bool);
+ bool getFax() const;
+ void setPager(const bool);
+ bool getPager() const;
+ void setMSG(const bool);
+ bool getMSG() const;
+ void setCell(const bool);
+ bool getCell() const;
+ void setVideo(const bool);
+ bool getVideo() const;
+ void setBBS(const bool);
+ bool getBBS() const;
+ void setModem(const bool);
+ bool getModem() const;
+ void setISDN(const bool);
+ bool getISDN() const;
+ void setPCS(const bool);
+ bool getPCS() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+
+ private:
+ Ui::QtVCardTelephoneField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.ui b/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.ui
new file mode 100644
index 0000000..3b100bb
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.ui
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardTelephoneField</class>
+ <widget class="QWidget" name="Swift::QtVCardTelephoneField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>629</width>
+ <height>174</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelTEL">
+ <property name="toolTip">
+ <string>Telephone</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditTEL">
+ <property name="toolTip">
+ <string>Telephone</string>
+ </property>
+ <property name="placeholderText">
+ <string>Telephone</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="checkBoxPREF">
+ <property name="text">
+ <string>Preferred</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="checkBoxHOME">
+ <property name="text">
+ <string>Home</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="checkBoxWORK">
+ <property name="text">
+ <string>Work</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="checkBoxVOICE">
+ <property name="text">
+ <string>Voice</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="checkBoxCELL">
+ <property name="text">
+ <string>Cell</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="checkBoxPAGER">
+ <property name="text">
+ <string>Pager</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="checkBoxISDN">
+ <property name="text">
+ <string>ISDN</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QCheckBox" name="checkBoxVIDEO">
+ <property name="text">
+ <string>Video</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QCheckBox" name="checkBoxMSG">
+ <property name="text">
+ <string>Voice Messaging Service</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="checkBoxFAX">
+ <property name="text">
+ <string>Fax</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="checkBoxMODEM">
+ <property name="text">
+ <string>Modem</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="2">
+ <widget class="QCheckBox" name="checkBoxPCS">
+ <property name="text">
+ <string>Personal Communication Service</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" colspan="2">
+ <widget class="QCheckBox" name="checkBoxBBS">
+ <property name="text">
+ <string>Bulletin Board System</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardTitleField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardTitleField.cpp
new file mode 100644
index 0000000..52b8103
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardTitleField.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardTitleField.h"
+#include "ui_QtVCardTitleField.h"
+
+namespace Swift {
+
+QtVCardTitleField::QtVCardTitleField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardTitleField) {
+ ui->setupUi(this);
+ connect(ui->lineEditTITLE, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ setEditable(editable);
+}
+
+QtVCardTitleField::~QtVCardTitleField() {
+ delete ui;
+}
+
+bool QtVCardTitleField::isEditable() const {
+ return editable;
+}
+
+void QtVCardTitleField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->lineEditTITLE->show();
+ ui->labelTITLE->hide();
+ } else {
+ ui->lineEditTITLE->hide();
+ ui->labelTITLE->show();
+ }
+}
+
+bool QtVCardTitleField::isEmpty() const {
+ return ui->lineEditTITLE->text().isEmpty();
+}
+
+void QtVCardTitleField::setTitle(const QString title) {
+ ui->lineEditTITLE->setText(title);
+}
+
+QString QtVCardTitleField::getTitle() const {
+ return ui->lineEditTITLE->text();
+}
+
+void QtVCardTitleField::onTextChanged(const QString& text) {
+ ui->labelTITLE->setText(text);
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardTitleField.h b/Swift/QtUI/QtVCardWidget/QtVCardTitleField.h
new file mode 100644
index 0000000..1de56e7
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardTitleField.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardTitleField;
+ }
+
+ class QtVCardTitleField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("Title");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardTitleField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardTitleField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardTitleField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardTitleField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setTitle(const QString title);
+ QString getTitle() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+
+ private:
+ Ui::QtVCardTitleField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardTitleField.ui b/Swift/QtUI/QtVCardWidget/QtVCardTitleField.ui
new file mode 100644
index 0000000..e5c9013
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardTitleField.ui
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardTitleField</class>
+ <widget class="QWidget" name="Swift::QtVCardTitleField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelTITLE">
+ <property name="toolTip">
+ <string>Title</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditTITLE">
+ <property name="toolTip">
+ <string>Title</string>
+ </property>
+ <property name="placeholderText">
+ <string>Title</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardURLField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardURLField.cpp
new file mode 100644
index 0000000..028d729
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardURLField.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardURLField.h"
+#include "ui_QtVCardURLField.h"
+
+#include <QUrl>
+
+namespace Swift {
+
+QtVCardURLField::QtVCardURLField(QWidget* parent, bool editable) :
+ QWidget(parent),
+ ui(new Ui::QtVCardURLField) {
+ ui->setupUi(this);
+ connect(ui->lineEditURL, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString)));
+ setEditable(editable);
+}
+
+QtVCardURLField::~QtVCardURLField() {
+ delete ui;
+}
+
+bool QtVCardURLField::isEditable() const {
+ return editable;
+}
+
+void QtVCardURLField::setEditable(bool editable) {
+ this->editable = editable;
+ if (this->editable) {
+ ui->lineEditURL->show();
+ ui->labelURL->hide();
+ } else {
+ ui->lineEditURL->hide();
+ ui->labelURL->show();
+ }
+}
+
+bool QtVCardURLField::isEmpty() const {
+ return ui->lineEditURL->text().isEmpty();
+}
+
+void QtVCardURLField::setURL(const QString url) {
+ ui->lineEditURL->setText(url);
+}
+
+QString QtVCardURLField::getURL() const {
+ return ui->lineEditURL->text();
+}
+
+void QtVCardURLField::onTextChanged(const QString& text) {
+ if (text.isEmpty()) {
+ ui->labelURL->setText("");
+ } else {
+ if (QUrl(text).isValid()) {
+ ui->labelURL->setText(QString("<a href=\"%1\">%1</a>").arg(text));
+ } else {
+ ui->labelURL->setText(text);
+ }
+ }
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardURLField.h b/Swift/QtUI/QtVCardWidget/QtVCardURLField.h
new file mode 100644
index 0000000..cb73345
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardURLField.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "QtVCardFieldInfo.h"
+
+namespace Swift {
+
+ namespace Ui {
+ class QtVCardURLField;
+ }
+
+ class QtVCardURLField : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+ Q_PROPERTY(bool empty READ isEmpty)
+
+ public :
+ class FieldInfo : public QtVCardFieldInfo {
+ public:
+ virtual ~FieldInfo() {
+ }
+ virtual QString getMenuName() const {
+ return tr("URL");
+ }
+ virtual int getAllowedInstances() const {
+ return UNLIMITED_INSTANCES;
+ }
+ virtual QWidget* createFieldInstance(QWidget* parent, bool editable) const {
+ return new QtVCardURLField(parent, editable);
+ }
+ virtual bool testInstance(QWidget* widget) const {
+ return dynamic_cast<QtVCardURLField*>(widget) != 0;
+ }
+ };
+
+ public:
+ explicit QtVCardURLField(QWidget* parent = 0, bool editable = false);
+ ~QtVCardURLField();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ bool isEmpty() const;
+
+ void setURL(const QString url);
+ QString getURL() const;
+
+ private slots:
+ void onTextChanged(const QString&);
+
+ private:
+ Ui::QtVCardURLField* ui;
+ bool editable;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardURLField.ui b/Swift/QtUI/QtVCardWidget/QtVCardURLField.ui
new file mode 100644
index 0000000..984d0b0
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardURLField.ui
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Swift::QtVCardURLField</class>
+ <widget class="QWidget" name="Swift::QtVCardURLField">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="labelURL">
+ <property name="toolTip">
+ <string>URL</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Swift::QtResizableLineEdit" name="lineEditURL">
+ <property name="toolTip">
+ <string>URL</string>
+ </property>
+ <property name="placeholderText">
+ <string>URL</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtResizableLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>QtResizableLineEdit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
new file mode 100644
index 0000000..ac4fca5
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
@@ -0,0 +1,429 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "QtVCardWidget.h"
+#include "ui_QtVCardWidget.h"
+
+#include <QDebug>
+#include <QLineEdit>
+#include <QMenu>
+
+#include "QtVCardAddressField.h"
+#include "QtVCardAddressLabelField.h"
+#include "QtVCardBirthdayField.h"
+#include "QtVCardDescriptionField.h"
+#include "QtVCardEMailField.h"
+#include "QtVCardJIDField.h"
+#include "QtVCardOrganisationField.h"
+#include "QtVCardRoleField.h"
+#include "QtVCardTelephoneField.h"
+#include "QtVCardTitleField.h"
+#include "QtVCardURLField.h"
+
+#include "QtSwiftUtil.h"
+
+#include <boost/algorithm/string.hpp>
+
+#include <Swiften/Base/Log.h>
+
+namespace Swift {
+
+QtVCardWidget::QtVCardWidget(QWidget* parent) :
+ QWidget(parent),
+ ui(new ::Ui::QtVCardWidget) {
+ ui->setupUi(this);
+
+ menu = new QMenu(this);
+
+ menu->addMenu(ui->photoAndName->getAddFieldMenu());
+ ui->toolButton->setMenu(menu);
+
+ addFieldType(menu, boost::make_shared<QtVCardAddressField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardEMailField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardJIDField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardBirthdayField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardTelephoneField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardRoleField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardTitleField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardOrganisationField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardURLField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardDescriptionField::FieldInfo>());
+ addFieldType(menu, boost::make_shared<QtVCardAddressLabelField::FieldInfo>());
+
+ setEditable(false);
+}
+
+QtVCardWidget::~QtVCardWidget() {
+ delete ui;
+}
+
+bool QtVCardWidget::isEditable() const {
+ return editable;
+}
+
+void QtVCardWidget::setEditable(bool editable) {
+ this->editable = editable;
+
+ ui->photoAndName->setProperty("editable", QVariant(editable));
+ //ui->photoAndName->setStyleSheet(editable ? "" : "background: transparent;");
+
+ for(int n = 0; n < ui->cardFields->count(); n++) {
+ QWidget* widget = ui->cardFields->itemAt(n)->widget();
+ if (!widget) continue;
+ if (widget->property("editable").isValid()) {
+ widget->setProperty("editable", QVariant(editable));
+ //widget->setStyleSheet(editable ? "" : "background: transparent;");
+ }
+ }
+ if (editable) {
+ ui->toolButton->show();
+ if ((findChild<QtVCardBirthdayField*>() == 0)) {
+ }
+ } else {
+ ui->toolButton->hide();
+ }
+
+ editableChanged(editable);
+}
+
+void QtVCardWidget::setVCard(VCard::ref vcard) {
+ SWIFT_LOG(debug) << std::endl;
+ clearFields();
+ this->vcard = vcard;
+ ui->photoAndName->setFormattedName(P2QSTRING(vcard->getFullName()));
+ ui->photoAndName->setNickname(P2QSTRING(vcard->getNickname()));
+ ui->photoAndName->setPrefix(P2QSTRING(vcard->getPrefix()));
+ ui->photoAndName->setGivenName(P2QSTRING(vcard->getGivenName()));
+ ui->photoAndName->setMiddleName(P2QSTRING(vcard->getMiddleName()));
+ ui->photoAndName->setFamilyName(P2QSTRING(vcard->getFamilyName()));
+ ui->photoAndName->setSuffix(P2QSTRING(vcard->getSuffix()));
+ ui->photoAndName->setAvatar(vcard->getPhoto(), vcard->getPhotoType());
+
+ foreach (const VCard::EMailAddress& address, vcard->getEMailAddresses()) {
+ QtVCardEMailField* emailField = new QtVCardEMailField(this);
+ emailField->setAddress(P2QSTRING(address.address));
+ emailField->setType(address.isX400 ? QtVCardEMailField::X_400 : QtVCardEMailField::Internet);
+ emailField->setWork(address.isWork);
+ emailField->setHome(address.isHome);
+ emailField->setPreferred(address.isPreferred);
+ ui->cardFields->insertWidget(ui->cardFields->count(), emailField);
+ }
+
+ if (!vcard->getBirthday().is_not_a_date_time()) {
+ QtVCardBirthdayField* bdayField = new QtVCardBirthdayField(this);
+ bdayField->setBirthday(B2QDATE(vcard->getBirthday()).date());
+ ui->cardFields->insertWidget(ui->cardFields->count(), bdayField);
+ }
+
+ foreach (const JID& jid, vcard->getJIDs()) {
+ QtVCardJIDField* jidField = new QtVCardJIDField(this);
+ jidField->setJID(P2QSTRING(jid.toString()));
+ ui->cardFields->insertWidget(ui->cardFields->count(), jidField);
+ }
+
+ foreach (const std::string& url, vcard->getURLs()) {
+ QtVCardURLField* urlField = new QtVCardURLField(this);
+ urlField->setURL(P2QSTRING(url));
+ ui->cardFields->insertWidget(ui->cardFields->count(), urlField);
+ }
+
+ foreach (const VCard::Telephone& telephone, vcard->getTelephones()) {
+ QtVCardTelephoneField* telField = new QtVCardTelephoneField(this);
+ telField->setNumber(P2QSTRING(telephone.number));
+ telField->setHome(telephone.isHome);
+ telField->setWork(telephone.isWork);
+ telField->setVoice(telephone.isVoice);
+ telField->setFax(telephone.isFax);
+ telField->setPager(telephone.isPager);
+ telField->setMSG(telephone.isMSG);
+ telField->setCell(telephone.isCell);
+ telField->setVideo(telephone.isVideo);
+ telField->setBBS(telephone.isBBS);
+ telField->setModem(telephone.isModem);
+ telField->setISDN(telephone.isISDN);
+ telField->setPCS(telephone.isPCS);
+ telField->setPreferred(telephone.isPreferred);
+ ui->cardFields->insertWidget(ui->cardFields->count(), telField);
+ }
+
+ if (!vcard->getDescription().empty()) {
+ QtVCardDescriptionField* descriptionField = new QtVCardDescriptionField(this);
+ descriptionField->setDescription(P2QSTRING(vcard->getDescription()));
+ ui->cardFields->insertWidget(ui->cardFields->count(), descriptionField);
+ }
+
+ foreach (const std::string& role, vcard->getRoles()) {
+ QtVCardRoleField* roleField = new QtVCardRoleField(this);
+ roleField->setRole(P2QSTRING(role));
+ ui->cardFields->insertWidget(ui->cardFields->count(), roleField);
+ }
+
+ foreach (const std::string& title, vcard->getTitles()) {
+ QtVCardTitleField* titleField = new QtVCardTitleField(this);
+ titleField->setTitle(P2QSTRING(title));
+ ui->cardFields->insertWidget(ui->cardFields->count(), titleField);
+ }
+
+ foreach (const VCard::Organization organisation, vcard->getOrganizations()) {
+ QtVCardOrganisationField* organisationField = new QtVCardOrganisationField(this);
+ organisationField->setName(P2QSTRING(organisation.name));
+
+ QList<QString> units;
+ foreach(const std::string& unit, organisation.units) {
+ units.push_back(P2QSTRING(unit));
+ }
+ organisationField->setUnits(units);
+ ui->cardFields->insertWidget(ui->cardFields->count(), organisationField);
+ }
+
+ foreach (const VCard::Address& address, vcard->getAddresses()) {
+ QtVCardAddressField* addressField = new QtVCardAddressField(this);
+ addressField->setHome(address.isHome);
+ addressField->setWork(address.isWork);
+ addressField->setPostal(address.isPostal);
+ addressField->setParcel(address.isParcel);
+ addressField->setDeliveryType(address.deliveryType == VCard::InternationalDelivery ? QtVCardAddressField::InternationalDelivery : QtVCardAddressField::DomesticDelivery);
+ addressField->setPreferred(address.isPreferred);
+
+ addressField->setPOBox(P2QSTRING(address.POBox));
+ addressField->setAddressExtension(P2QSTRING(address.addressExtension));
+ addressField->setStreet(P2QSTRING(address.street));
+ addressField->setLocality(P2QSTRING(address.locality));
+ addressField->setRegion(P2QSTRING(address.region));
+ addressField->setPostalCode(P2QSTRING(address.postalCode));
+ addressField->setCountry(P2QSTRING(address.country));
+
+ ui->cardFields->insertWidget(ui->cardFields->count(), addressField);
+ }
+
+ foreach (const VCard::AddressLabel& addressLabel, vcard->getAddressLabels()) {
+ QtVCardAddressLabelField* addressLabelField = new QtVCardAddressLabelField(this);
+ addressLabelField->setHome(addressLabel.isHome);
+ addressLabelField->setWork(addressLabel.isWork);
+ addressLabelField->setPostal(addressLabel.isPostal);
+ addressLabelField->setParcel(addressLabel.isParcel);
+ addressLabelField->setDeliveryType(addressLabel.deliveryType == VCard::InternationalDelivery ? QtVCardAddressLabelField::InternationalDelivery : QtVCardAddressLabelField::DomesticDelivery);
+ addressLabelField->setPreferred(addressLabel.isPreferred);
+
+ std::string joinedLines = boost::algorithm::join(addressLabel.lines, "\n");
+ addressLabelField->setLines(P2QSTRING(joinedLines));
+
+ ui->cardFields->insertWidget(ui->cardFields->count(), addressLabelField);
+ }
+
+ setEditable(editable);
+}
+
+VCard::ref QtVCardWidget::getVCard() {
+ SWIFT_LOG(debug) << std::endl;
+ clearEmptyFields();
+ vcard->setFullName(Q2PSTRING(ui->photoAndName->getFormattedName()));
+ vcard->setNickname(Q2PSTRING(ui->photoAndName->getNickname()));
+ vcard->setPrefix(Q2PSTRING(ui->photoAndName->getPrefix()));
+ vcard->setGivenName(Q2PSTRING(ui->photoAndName->getGivenName()));
+ vcard->setMiddleName(Q2PSTRING(ui->photoAndName->getMiddleName()));
+ vcard->setFamilyName(Q2PSTRING(ui->photoAndName->getFamilyName()));
+ vcard->setSuffix(Q2PSTRING(ui->photoAndName->getSuffix()));
+ vcard->setPhoto(ui->photoAndName->getAvatarData());
+ vcard->setPhotoType(ui->photoAndName->getAvatarType());
+
+ vcard->clearEMailAddresses();
+ vcard->clearJIDs();
+ vcard->clearURLs();
+ vcard->clearTelephones();
+ vcard->clearRoles();
+ vcard->clearTitles();
+ vcard->clearOrganizations();
+ vcard->clearAddresses();
+ vcard->clearAddressLabels();
+
+ QtVCardBirthdayField* bdayField = NULL;
+ QtVCardDescriptionField* descriptionField = NULL;
+ for(int n = 0; n < ui->cardFields->count(); n++) {
+ QWidget* widget = ui->cardFields->itemAt(n)->widget();
+
+ QtVCardEMailField* emailField;
+ if ((emailField = dynamic_cast<QtVCardEMailField*>(widget))) {
+ VCard::EMailAddress address;
+ address.address = Q2PSTRING(emailField->getAddress());
+ address.isInternet = emailField->getType() == QtVCardEMailField::Internet;
+ address.isX400 = emailField->getType() == QtVCardEMailField::X_400;
+ address.isHome = emailField->getHome();
+ address.isWork = emailField->getWork();
+ address.isPreferred = emailField->getPreferred();
+ vcard->addEMailAddress(address);
+ continue;
+ }
+
+ QtVCardJIDField* jidField;
+ if ((jidField = dynamic_cast<QtVCardJIDField*>(widget))) {
+ JID jid(Q2PSTRING(jidField->getJID()));
+ if (jid.isValid()) {
+ vcard->addJID(jid);
+ }
+ continue;
+ }
+
+ QtVCardURLField* urlField;
+ if ((urlField = dynamic_cast<QtVCardURLField*>(widget))) {
+ vcard->addURL(Q2PSTRING(urlField->getURL()));
+ continue;
+ }
+
+ QtVCardTelephoneField* telephoneField;
+ if ((telephoneField = dynamic_cast<QtVCardTelephoneField*>(widget))) {
+ VCard::Telephone telephone;
+ telephone.number = Q2PSTRING(telephoneField->getNumber());
+ telephone.isHome = telephoneField->getHome();
+ telephone.isWork = telephoneField->getWork();
+ telephone.isVoice = telephoneField->getVoice();
+ telephone.isFax = telephoneField->getFax();
+ telephone.isPager = telephoneField->getPager();
+ telephone.isMSG = telephoneField->getMSG();
+ telephone.isCell = telephoneField->getCell();
+ telephone.isVideo = telephoneField->getVideo();
+ telephone.isBBS = telephoneField->getBBS();
+ telephone.isModem = telephoneField->getModem();
+ telephone.isISDN = telephoneField->getISDN();
+ telephone.isPCS = telephoneField->getPCS();
+ telephone.isPreferred = telephoneField->getPreferred();
+ vcard->addTelephone(telephone);
+ continue;
+ }
+
+ if (dynamic_cast<QtVCardBirthdayField*>(widget)) {
+ bdayField = dynamic_cast<QtVCardBirthdayField*>(widget);
+ continue;
+ }
+
+ if (dynamic_cast<QtVCardDescriptionField*>(widget)) {
+ descriptionField = dynamic_cast<QtVCardDescriptionField*>(widget);
+ continue;
+ }
+
+ QtVCardRoleField* roleField;
+ if ((roleField = dynamic_cast<QtVCardRoleField*>(widget))) {
+ vcard->addRole(Q2PSTRING(roleField->getRole()));
+ continue;
+ }
+
+ QtVCardTitleField* titleField;
+ if ((titleField = dynamic_cast<QtVCardTitleField*>(widget))) {
+ vcard->addTitle(Q2PSTRING(titleField->getTitle()));
+ continue;
+ }
+
+ QtVCardOrganisationField* organisationField;
+ if ((organisationField = dynamic_cast<QtVCardOrganisationField*>(widget))) {
+ VCard::Organization organisation;
+ organisation.name = Q2PSTRING(organisationField->getName());
+ foreach(const QString &unit, organisationField->getUnits()) {
+ organisation.units.push_back(Q2PSTRING(unit));
+ }
+ vcard->addOrganization(organisation);
+ continue;
+ }
+
+ QtVCardAddressField* addressField;
+ if ((addressField = dynamic_cast<QtVCardAddressField*>(widget))) {
+ VCard::Address address;
+ address.isHome = addressField->getHome();
+ address.isWork = addressField->getWork();
+ address.isPostal = addressField->getPostal();
+ address.isParcel = addressField->getParcel();
+ address.deliveryType = addressField->getDeliveryType() == QtVCardAddressField::InternationalDelivery ? VCard::InternationalDelivery : VCard::DomesticDelivery;
+ address.isPreferred = addressField->getPreferred();
+
+ address.POBox = Q2PSTRING(addressField->getPOBox());
+ address.addressExtension = Q2PSTRING(addressField->getAddressExtension());
+ address.street = Q2PSTRING(addressField->getStreet());
+ address.locality = Q2PSTRING(addressField->getLocality());
+ address.region = Q2PSTRING(addressField->getRegion());
+ address.postalCode = Q2PSTRING(addressField->getPostalCode());
+ address.country = Q2PSTRING(addressField->getCountry());
+ vcard->addAddress(address);
+ continue;
+ }
+
+ QtVCardAddressLabelField* addressLabelField;
+ if ((addressLabelField = dynamic_cast<QtVCardAddressLabelField*>(widget))) {
+ VCard::AddressLabel addressLabel;
+ addressLabel.isHome = addressLabelField->getHome();
+ addressLabel.isWork = addressLabelField->getWork();
+ addressLabel.isPostal = addressLabelField->getPostal();
+ addressLabel.isParcel = addressLabelField->getParcel();
+ addressLabel.deliveryType = addressLabelField->getDeliveryType() == QtVCardAddressLabelField::InternationalDelivery ? VCard::InternationalDelivery : VCard::DomesticDelivery;
+ addressLabel.isPreferred = addressLabelField->getPreferred();
+
+ std::string lines = Q2PSTRING(addressLabelField->getLines());
+ boost::split(addressLabel.lines,lines, boost::is_any_of("\n"));
+
+ vcard->addAddressLabel(addressLabel);
+ continue;
+ }
+ }
+
+ if (bdayField) {
+ vcard->setBirthday(boost::posix_time::from_time_t(QDateTime(bdayField->getBirthday()).toTime_t()));
+ } else {
+ vcard->setBirthday(boost::posix_time::ptime());
+ }
+
+ if (descriptionField) {
+ vcard->setDescription(Q2PSTRING(descriptionField->getDescription()));
+ } else {
+ vcard->setDescription("");
+ }
+
+ return vcard;
+}
+
+void QtVCardWidget::addField() {
+ QAction* action = NULL;
+ if ((action = dynamic_cast<QAction*>(sender()))) {
+ boost::shared_ptr<QtVCardFieldInfo> fieldInfo = actionFieldInfo[action];
+ ui->cardFields->insertWidget(ui->cardFields->count(), fieldInfo->createFieldInstance(this, true));
+ }
+}
+
+void QtVCardWidget::addFieldType(QMenu* menu, boost::shared_ptr<QtVCardFieldInfo> fieldType) {
+ QAction* action = new QAction(tr("Add ") + fieldType->getMenuName(), this);
+ actionFieldInfo[action] = fieldType;
+ connect(action, SIGNAL(triggered()), this, SLOT(addField()));
+ menu->addAction(action);
+}
+
+int QtVCardWidget::fieldTypeInstances(boost::shared_ptr<QtVCardFieldInfo> fieldType) {
+ int instances = 0;
+ for (int n = 0; n < ui->cardFields->count(); n++) {
+ if (fieldType->testInstance(ui->cardFields->itemAt(n)->widget())) instances++;
+ }
+ return instances;
+}
+
+void QtVCardWidget::clearFields() {
+ assert(ui->cardFields->count() >= 0);
+ while(ui->cardFields->count() > 0) {
+ QLayoutItem* child;
+ if ((child = ui->cardFields->takeAt(0)) != 0) {
+ delete child->widget();
+ delete child;
+ }
+ }
+}
+
+void QtVCardWidget::clearEmptyFields() {
+ for (int n = 0; n < ui->cardFields->count(); n++) {
+ QWidget* field = ui->cardFields->itemAt(n)->widget();
+ if (field->property("empty").isValid() && field->property("empty").toBool()) {
+ ui->cardFields->removeWidget(field);
+ delete field;
+ n--;
+ }
+ }
+}
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.h b/Swift/QtUI/QtVCardWidget/QtVCardWidget.h
new file mode 100644
index 0000000..74850fb
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2012 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include <boost/smart_ptr/make_shared.hpp>
+
+#include "QtVCardFieldInfo.h"
+#include "QtVCardPhotoAndNameFields.h"
+
+#include <Swiften/Elements/VCard.h>
+
+namespace Ui {
+ class QtVCardWidget;
+}
+
+namespace Swift {
+
+ class QtVCardWidget : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
+
+ public :
+ explicit QtVCardWidget(QWidget* parent = 0);
+ ~QtVCardWidget();
+
+ bool isEditable() const;
+ void setEditable(bool);
+
+ void setVCard(VCard::ref vcard);
+ VCard::ref getVCard();
+
+ signals:
+ void editableChanged(bool editable);
+
+ private slots:
+ void addField();
+
+ private:
+ void addFieldType(QMenu*, boost::shared_ptr<QtVCardFieldInfo>);
+ int fieldTypeInstances(boost::shared_ptr<QtVCardFieldInfo>);
+ void clearFields();
+ void clearEmptyFields();
+
+ private:
+ VCard::ref vcard;
+ Ui::QtVCardWidget* ui;
+ bool editable;
+ QMenu* menu;
+ std::map<QAction*, boost::shared_ptr<QtVCardFieldInfo> > actionFieldInfo;
+ };
+
+}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.ui b/Swift/QtUI/QtVCardWidget/QtVCardWidget.ui
new file mode 100644
index 0000000..d005f01
--- /dev/null
+++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.ui
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QtVCardWidget</class>
+ <widget class="QWidget" name="QtVCardWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>535</width>
+ <height>126</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout" rowstretch="1,0" columnstretch="1,0">
+ <property name="margin">
+ <number>5</number>
+ </property>
+ <item row="0" column="0" colspan="2">
+ <layout class="QVBoxLayout" name="card" stretch="0,0,1">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="Swift::QtVCardPhotoAndNameFields" name="photoAndName" native="true"/>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>523</width>
+ <height>76</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinAndMaxSize</enum>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" name="cardFields">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="margin">
+ <number>5</number>
+ </property>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>1000</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1">
+ <widget class="QToolButton" name="toolButton">
+ <property name="text">
+ <string>Add Field</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>false</bool>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::NoArrow</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Swift::QtVCardPhotoAndNameFields</class>
+ <extends>QWidget</extends>
+ <header>QtVCardPhotoAndNameFields.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Swift/QtUI/Roster/QtOccupantListWidget.cpp b/Swift/QtUI/Roster/QtOccupantListWidget.cpp
index 5d26c46..12dc1e4 100644
--- a/Swift/QtUI/Roster/QtOccupantListWidget.cpp
+++ b/Swift/QtUI/Roster/QtOccupantListWidget.cpp
@@ -58,6 +58,7 @@ void QtOccupantListWidget::contextMenuEvent(QContextMenuEvent* event) {
case ChatWindow::MakeParticipant: text = tr("Make participant"); break;
case ChatWindow::MakeVisitor: text = tr("Remove voice"); break;
case ChatWindow::AddContact: text = tr("Add to contacts"); break;
+ case ChatWindow::ShowProfile: text = tr("Show profile"); break;
}
QAction* action = contextMenu.addAction(text);
actions[action] = availableAction;
diff --git a/Swift/QtUI/Roster/QtRosterWidget.cpp b/Swift/QtUI/Roster/QtRosterWidget.cpp
index 1cf073b..b783ff6 100644
--- a/Swift/QtUI/Roster/QtRosterWidget.cpp
+++ b/Swift/QtUI/Roster/QtRosterWidget.cpp
@@ -16,6 +16,7 @@
#include "Swift/Controllers/UIEvents/RenameGroupUIEvent.h"
#include "Swift/Controllers/UIEvents/SendFileUIEvent.h"
#include "Swift/Controllers/UIEvents/RequestWhiteboardUIEvent.h"
+#include "Swift/Controllers/UIEvents/ShowProfileForRosterItemUIEvent.h"
#include "QtContactEditWindow.h"
#include "Swift/Controllers/Roster/ContactRosterItem.h"
#include "Swift/Controllers/Roster/GroupRosterItem.h"
@@ -57,6 +58,7 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {
if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) {
QAction* editContact = contextMenu.addAction(tr("Edit…"));
QAction* removeContact = contextMenu.addAction(tr("Remove"));
+ QAction* showProfileForContact = contextMenu.addAction(tr("Show Profile"));
#ifdef SWIFT_EXPERIMENTAL_FT
QAction* sendFile = NULL;
if (contact->supportsFeature(ContactRosterItem::FileTransferFeature)) {
@@ -78,6 +80,9 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {
eventStream_->send(boost::make_shared<RemoveRosterItemUIEvent>(contact->getJID()));
}
}
+ else if (result == showProfileForContact) {
+ eventStream_->send(boost::make_shared<ShowProfileForRosterItemUIEvent>(contact->getJID()));
+ }
#ifdef SWIFT_EXPERIMENTAL_FT
else if (sendFile && result == sendFile) {
QString fileName = QFileDialog::getOpenFileName(this, tr("Send File"), "", tr("All Files (*);;"));
diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
index 70a1038..35eda5b 100644
--- a/Swift/QtUI/SConscript
+++ b/Swift/QtUI/SConscript
@@ -164,6 +164,40 @@ sources = [
"QtUISettingConstants.cpp"
]
+# QtVCardWidget
+sources.extend([
+ "QtVCardWidget/QtResizableLineEdit.cpp",
+ "QtVCardWidget/QtVCardAddressField.cpp",
+ "QtVCardWidget/QtVCardAddressLabelField.cpp",
+ "QtVCardWidget/QtVCardBirthdayField.cpp",
+ "QtVCardWidget/QtVCardDescriptionField.cpp",
+ "QtVCardWidget/QtVCardEMailField.cpp",
+ "QtVCardWidget/QtVCardJIDField.cpp",
+ "QtVCardWidget/QtVCardOrganisationField.cpp",
+ "QtVCardWidget/QtVCardPhotoAndNameFields.cpp",
+ "QtVCardWidget/QtVCardRoleField.cpp",
+ "QtVCardWidget/QtVCardTelephoneField.cpp",
+ "QtVCardWidget/QtVCardTitleField.cpp",
+ "QtVCardWidget/QtVCardURLField.cpp",
+ "QtVCardWidget/QtVCardWidget.cpp"
+])
+
+myenv.Uic4("QtVCardWidget/QtVCardAddressField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardAddressLabelField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardBirthdayField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardDescriptionField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardEMailField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardJIDField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardOrganisationField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardPhotoAndNameFields.ui")
+myenv.Uic4("QtVCardWidget/QtVCardRoleField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardTelephoneField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardTitleField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardURLField.ui")
+myenv.Uic4("QtVCardWidget/QtVCardWidget.ui")
+myenv.Uic4("QtProfileWindow.ui")
+
+
myenv["SWIFT_VERSION"] = Version.getBuildVersion(env.Dir("#").abspath, "swift")
version_match = re.match("(\d+)\.(\d+).*", myenv["SWIFT_VERSION"])
myenv["SWIFT_VERSION_MAJOR"] = int(version_match.group(1)) if version_match else 0