1 /*
2 * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3 *
4 * See the LICENSE file for terms of use.
5 */
6
7 #include <Wt/WApplication.h>
8 #include <Wt/WBreak.h>
9 #include <Wt/WText.h>
10 #include <Wt/WPushButton.h>
11 #include <Wt/WContainerWidget.h>
12 #include <Wt/WStringUtil.h>
13 #ifndef _MSC_VER
14 #include <unistd.h>
15 #endif
16
17 #include "Composer.h"
18 #include "ComposeExample.h"
19 #include "Contact.h"
20
ComposeExample()21 ComposeExample::ComposeExample()
22 : WContainerWidget()
23 {
24 composer_ = this->addWidget(std::make_unique<Composer>());
25
26 std::vector<Contact> addressBook;
27 addressBook.push_back(Contact(U"Koen Deforche",
28 U"koen.deforche@gmail.com"));
29 addressBook.push_back(Contact(U"Koen alias1",
30 U"koen.alias1@yahoo.com"));
31 addressBook.push_back(Contact(U"Koen alias2",
32 U"koen.alias2@yahoo.com"));
33 addressBook.push_back(Contact(U"Koen alias3",
34 U"koen.alias3@yahoo.com"));
35 addressBook.push_back(Contact(U"Bartje",
36 U"jafar@hotmail.com"));
37 composer_->setAddressBook(addressBook);
38
39 std::vector<Contact> contacts;
40 contacts.push_back(Contact(U"Koen Deforche", U"koen.deforche@gmail.com"));
41
42 composer_->setTo(contacts);
43 composer_->setSubject("That's cool! Want to start your own google?");
44
45 composer_->send.connect(this, &ComposeExample::send);
46 composer_->discard.connect(this, &ComposeExample::discard);
47
48 details_ = this->addWidget(std::make_unique<WContainerWidget>());
49
50 details_->addWidget(std::make_unique<WText>(tr("example.info")));
51 }
52
send()53 void ComposeExample::send()
54 {
55 WContainerWidget *feedback = this->addWidget(std::make_unique<WContainerWidget>());
56 feedback->setStyleClass(U"feedback");
57
58 WContainerWidget *horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
59 horiz->addWidget(std::make_unique<WText>(U"<p>We could have, but did not send the following email:</p>"));
60
61 std::vector<Contact> contacts = composer_->to();
62 if (!contacts.empty())
63 horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
64 for (unsigned i = 0; i < contacts.size(); ++i) {
65 horiz->addWidget(std::make_unique<WText>(U"To: \"" + contacts[i].name + U"\" <"
66 + contacts[i].email + U">", TextFormat::Plain));
67 horiz->addWidget(std::make_unique<WBreak>());
68 }
69
70 contacts = composer_->cc();
71 if (!contacts.empty())
72 horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
73 for (unsigned i = 0; i < contacts.size(); ++i) {
74 horiz->addWidget(std::make_unique<WText>(U"Cc: \"" + contacts[i].name + U"\" <"
75 + contacts[i].email + U">", TextFormat::Plain));
76 horiz->addWidget(std::make_unique<WBreak>());
77 }
78
79 contacts = composer_->bcc();
80 if (!contacts.empty())
81 horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
82 for (unsigned i = 0; i < contacts.size(); ++i) {
83 horiz->addWidget(std::make_unique<WText>(U"Bcc: \"" + contacts[i].name + U"\" <"
84 + contacts[i].email + U">", TextFormat::Plain));
85 horiz->addWidget(std::make_unique<WBreak>());
86 }
87
88 horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
89 horiz->addWidget(std::make_unique<WText>("Subject: \"" + composer_->subject() + "\"", TextFormat::Plain));
90
91 std::vector<Attachment> attachments = composer_->attachments();
92 if (!attachments.empty())
93 horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
94 for (unsigned i = 0; i < attachments.size(); ++i) {
95 horiz->addWidget(std::make_unique<WText>(U"Attachment: \""
96 + attachments[i].fileName
97 + U"\" (" + attachments[i].contentDescription
98 + U")", TextFormat::Plain));
99
100 unlink(attachments[i].spoolFileName.c_str());
101
102 horiz->addWidget(std::make_unique<WText>(", was in spool file: "
103 + attachments[i].spoolFileName));
104 horiz->addWidget(std::make_unique<WBreak>());
105 }
106
107 std::u32string message = composer_->message();
108
109 horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
110 horiz->addWidget(std::make_unique<WText>("Message body: "));
111 horiz->addWidget(std::make_unique<WBreak>());
112
113 if (!message.empty()) {
114 horiz->addWidget(std::make_unique<WText>(message, TextFormat::Plain));
115 } else
116 horiz->addWidget(std::make_unique<WText>("<i>(empty)</i>"));
117
118 removeWidget(composer_);
119 composer_ = nullptr;
120 removeWidget(details_);
121 details_ = nullptr;
122
123 wApp->quit();
124 }
125
discard()126 void ComposeExample::discard()
127 {
128 WContainerWidget *feedback = this->addWidget(std::make_unique<WContainerWidget>());
129 feedback->setStyleClass("feedback");
130
131 WContainerWidget *horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
132 horiz->addWidget(std::make_unique<WText>("<p>Wise decision! Everyone's mailbox is already full anyway.</p>"));
133
134 removeWidget(composer_);
135 composer_ = nullptr;
136 removeWidget(details_);
137 details_ = nullptr;
138
139 wApp->quit();
140 }
141
createApplication(const WEnvironment & env)142 std::unique_ptr<WApplication> createApplication(const WEnvironment& env)
143 {
144 std::unique_ptr<WApplication> app
145 = std::make_unique<WApplication>(env);
146
147 // The following assumes composer.xml is in the webserver working directory
148 // (but does not need to be deployed within docroot):
149 app->messageResourceBundle().use(WApplication::appRoot() + "composer");
150
151 // The following assumes composer.css is deployed in the seb server at the
152 // same location as the application:
153 app->useStyleSheet("composer.css");
154
155 app->setTitle("Composer example");
156
157 app->root()->addWidget(std::make_unique<ComposeExample>());
158
159 return app;
160 }
161
main(int argc,char ** argv)162 int main(int argc, char **argv)
163 {
164 return WRun(argc, argv, &createApplication);
165 }
166
167