Moved location update logic to new class called UpdateLocation.
[situare] / src / ui / updatelocation / updatelocationdialog.cpp
1 /*\r
2    Situare - A location system for Facebook\r
3    Copyright (C) 2010  Ixonos Plc. Authors:\r
4 \r
5       Katri Kaikkonen - katri.kaikkonen@ixonos.com\r
6       Henri Lampela - henri.lampela@ixonos.com\r
7 \r
8    Situare is free software; you can redistribute it and/or\r
9    modify it under the terms of the GNU General Public License\r
10    version 2 as published by the Free Software Foundation.\r
11 \r
12    Situare is distributed in the hope that it will be useful,\r
13    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15    GNU General Public License for more details.\r
16 \r
17    You should have received a copy of the GNU General Public License\r
18    along with Situare; if not, write to the Free Software\r
19    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,\r
20    USA.\r
21 */\r
22 \r
23 #include <QApplication>\r
24 #include <QCheckBox>\r
25 #include <QDebug>\r
26 #include <QDialogButtonBox>\r
27 #include <QGridLayout>\r
28 #include <QKeyEvent>\r
29 #include <QLabel>\r
30 #include <QPushButton>\r
31 #include <QScrollArea>\r
32 #include <QTextEdit>\r
33 \r
34 #include "engine/updatelocation.h"\r
35 \r
36 #include "updatelocationdialog.h"\r
37 \r
38 const int MESSAGE_MAX_LENGTH = 255;\r
39 \r
40 UpdateLocationDialog::UpdateLocationDialog(UpdateLocation *controller, QWidget *parent)\r
41     : QDialog(parent)\r
42 {\r
43     qDebug() << __PRETTY_FUNCTION__;\r
44 \r
45     m_controller = controller;\r
46 \r
47     setWindowTitle(tr("Update Location"));\r
48 \r
49     QGridLayout *gridLayout = new QGridLayout();\r
50 \r
51     m_textEdit = new QTextEdit();\r
52     m_textEdit->setAcceptRichText(false);\r
53     m_charCountLabel = new QLabel();\r
54 \r
55     if (controller->message().isEmpty())\r
56     {\r
57         m_textEdit->setText(tr("Message:"));\r
58         m_textEdit->selectAll();\r
59         m_charCountLabel->setNum(MESSAGE_MAX_LENGTH);\r
60 \r
61         connect(m_textEdit, SIGNAL(selectionChanged()),\r
62                 this, SLOT(textSelectionChanged()));\r
63     }\r
64     else\r
65     {\r
66         m_textEdit->setText(controller->message());\r
67         m_textEdit->document()->setModified(true);\r
68         textChanged();\r
69     }\r
70 \r
71     QScrollArea *scrollArea = new QScrollArea();\r
72 \r
73     QVBoxLayout* scrollAreaLayout = new QVBoxLayout;\r
74     scrollAreaLayout->setSpacing(0);\r
75     scrollAreaLayout->setMargin(0);\r
76     scrollAreaLayout->addWidget(m_textEdit);\r
77 \r
78     QWidget* scrollAreaWidget = new QWidget;\r
79     scrollAreaWidget->setLayout(scrollAreaLayout);\r
80 \r
81     scrollArea->setWidget(scrollAreaWidget);\r
82 \r
83     scrollArea->setWidgetResizable(true);\r
84     scrollArea->setFrameShape(QScrollArea::NoFrame);\r
85 \r
86     m_locationLabel = new QLabel();\r
87     m_locationLabel->setWordWrap(true);\r
88     m_checkBox = new QCheckBox(tr("Publish on Facebook"));\r
89     m_checkBox->setChecked(controller->publish());\r
90 \r
91     QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Vertical);\r
92     QPushButton *sendButton = buttonBox->addButton(QDialogButtonBox::Ok);\r
93     QPushButton *cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel);\r
94     sendButton->setText(tr("Send"));\r
95 \r
96     gridLayout->addWidget(new QLabel(tr("Location:")), 0, 0, 1, 1, Qt::AlignTop | Qt::AlignLeft);\r
97     gridLayout->addWidget(m_locationLabel, 0, 1, 1, 3);\r
98     gridLayout->addWidget(scrollArea,      1, 0, 1, 4);\r
99     gridLayout->addWidget(m_checkBox,      2, 0, 1, 2);\r
100     gridLayout->addWidget(m_charCountLabel,2, 2, 1, 1, Qt::AlignCenter);\r
101     gridLayout->addWidget(buttonBox,       2, 3, 2, 1, Qt::AlignTop);\r
102 \r
103     gridLayout->setColumnMinimumWidth(2, 2 * m_charCountLabel->fontMetrics().width(\r
104             m_charCountLabel->text()));\r
105 \r
106     setLayout(gridLayout);\r
107 \r
108     const int LAYOUT_COLUMN_ONE_STRETCH = 10;\r
109     const int LAYOUT_TOP_MARGIN = 15;\r
110     gridLayout->setColumnStretch(1, LAYOUT_COLUMN_ONE_STRETCH);\r
111 \r
112     QMargins layoutMargins = gridLayout->contentsMargins();\r
113     layoutMargins.setTop(LAYOUT_TOP_MARGIN);\r
114     gridLayout->setContentsMargins(layoutMargins);\r
115 \r
116     connect(sendButton, SIGNAL(clicked()),\r
117             this, SLOT(sendUpdate()));\r
118 \r
119     connect(cancelButton, SIGNAL(clicked()),\r
120             this, SLOT(reject()));\r
121 \r
122     connect(this, SIGNAL(rejected()), controller, SLOT(clear()));\r
123 \r
124     connect(m_textEdit, SIGNAL(textChanged()),\r
125             this, SLOT(textChanged()));\r
126 \r
127 #ifdef Q_WS_MAEMO_5\r
128     if (QAbstractKineticScroller *scroller = scrollArea->property("kineticScroller").value<\r
129                                               QAbstractKineticScroller *>()) {\r
130         scroller->setOvershootPolicy(QAbstractKineticScroller::OvershootAlwaysOff);\r
131     }\r
132 \r
133     new TextEditAutoResizer(m_textEdit);\r
134     setAttribute(Qt::WA_Maemo5StackedWindow);\r
135     setWindowFlags(Qt::Window);\r
136 #endif\r
137 \r
138     m_textEdit->setFocus(Qt::OtherFocusReason);\r
139 \r
140     setAttribute(Qt::WA_DeleteOnClose);\r
141 }\r
142 \r
143 UpdateLocationDialog::~UpdateLocationDialog()\r
144 {\r
145     qDebug() << __PRETTY_FUNCTION__;\r
146 }\r
147 \r
148 void UpdateLocationDialog::setAddress(const QString &address)\r
149 {\r
150     qDebug() << __PRETTY_FUNCTION__;\r
151 \r
152     m_locationLabel->setText(address);\r
153 }\r
154 \r
155 void UpdateLocationDialog::sendUpdate()\r
156 {\r
157     qDebug() << __PRETTY_FUNCTION__;\r
158 \r
159     m_controller->setMessage(m_textEdit->toPlainText());\r
160     m_controller->setPublish(m_checkBox->isChecked());\r
161     m_controller->send();\r
162 \r
163     accept();\r
164 }\r
165 \r
166 void UpdateLocationDialog::textChanged()\r
167 {\r
168     qDebug() << __PRETTY_FUNCTION__;\r
169 \r
170     QString msgText = m_textEdit->toPlainText().toUtf8();\r
171 \r
172     if (msgText.length() > MESSAGE_MAX_LENGTH) {\r
173         QKeyEvent event = QKeyEvent(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);\r
174         QApplication::sendEvent(m_textEdit, &event);\r
175     }\r
176 \r
177     m_charCountLabel->setNum(MESSAGE_MAX_LENGTH - m_textEdit->toPlainText().toUtf8().length());\r
178 }\r
179 \r
180 void UpdateLocationDialog::textSelectionChanged()\r
181 {\r
182     qDebug() << __PRETTY_FUNCTION__;\r
183 \r
184     if (!m_textEdit->document()->isModified())\r
185     {\r
186         m_textEdit->clear();\r
187     }\r
188     disconnect(m_textEdit, SIGNAL(selectionChanged()), this, SLOT(textSelectionChanged()));\r
189 }\r