2 * This file is part of NeverNote
\r
3 * Copyright 2009 Randy Baumgarte
\r
5 * This file may be licensed under the terms of of the
\r
6 * GNU General Public License Version 2 (the ``GPL'').
\r
8 * Software distributed under the License is distributed
\r
9 * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
\r
10 * express or implied. See the GPL for the specific language
\r
11 * governing rights and limitations.
\r
13 * You should have received a copy of the GPL along with this
\r
14 * program. If not, go to http://www.gnu.org/licenses/gpl.html
\r
15 * or write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
19 package cx.fbn.nevernote.gui;
\r
21 import com.trolltech.qt.core.QEvent;
\r
22 import com.trolltech.qt.core.QMimeData;
\r
23 import com.trolltech.qt.core.Qt;
\r
24 import com.trolltech.qt.gui.QAction;
\r
25 import com.trolltech.qt.gui.QContextMenuEvent;
\r
26 import com.trolltech.qt.gui.QDropEvent;
\r
27 import com.trolltech.qt.gui.QKeyEvent;
\r
28 import com.trolltech.qt.gui.QKeySequence;
\r
29 import com.trolltech.qt.gui.QMenu;
\r
30 import com.trolltech.qt.gui.QShortcut;
\r
31 import com.trolltech.qt.gui.QKeySequence.StandardKey;
\r
32 import com.trolltech.qt.network.QNetworkRequest;
\r
33 import com.trolltech.qt.webkit.QWebPage;
\r
34 import com.trolltech.qt.webkit.QWebView;
\r
36 import cx.fbn.nevernote.Global;
\r
38 public class ContentView extends QWebView {
\r
40 BrowserWindow parent;
\r
41 QMenu contextMenu = new QMenu(this);
\r
42 QMenu tableMenu = new QMenu(this);
\r
44 QShortcut cutShortcut;
\r
46 QShortcut copyShortcut;
\r
47 QAction pasteAction;
\r
48 QShortcut pasteShortcut;
\r
49 QAction pasteWithoutFormatAction;
\r
50 QShortcut pasteWithoutFormatShortcut;
\r
52 QShortcut todoShortcut;
\r
53 QAction encryptAction;
\r
54 QShortcut encryptShortcut;
\r
55 QAction downloadAttachment;
\r
56 QShortcut downloadAttachmentShortcut;
\r
57 QAction downloadImage;
\r
58 QShortcut downloadImageShortcut;
\r
59 QAction rotateImageRight;
\r
60 QShortcut rotateImageRightShortcut;
\r
61 QAction rotateImageLeft;
\r
62 QShortcut rotateImageLeftShortcut;
\r
63 QAction insertLinkAction;
\r
64 QShortcut insertLinkShortcut;
\r
65 QAction insertTableAction;
\r
66 QShortcut insertTableShortcut;
\r
67 QAction insertTableRowAction;
\r
68 QShortcut insertTableRowShortcut;
\r
69 QAction deleteTableRowAction;
\r
70 QShortcut deleteTableRowShortcut;
\r
73 QAction redBackgroundColor;
\r
75 QShortcut insertDateTimeShortcut;
\r
77 Signal1<QNetworkRequest> downloadAttachmentRequested;
\r
78 Signal1<QNetworkRequest> downloadImageRequested;
\r
80 public ContentView(BrowserWindow p) {
\r
82 contextMenu = new QMenu(this);
\r
84 openAction = new QAction(tr("Open"), this);
\r
85 openAction.setText(tr("Open"));
\r
86 contextMenu.addAction(openAction);
\r
87 openAction.triggered.connect(parent, "openFile()");
\r
89 cutAction = new QAction(tr("Cut"), this);
\r
90 cutAction.triggered.connect(parent, "cutClicked()");
\r
91 contextMenu.addAction(cutAction);
\r
92 contextMenu.insertSeparator(cutAction);
\r
93 setupShortcut(cutAction, "Edit_Cut");
\r
94 cutShortcut = new QShortcut(this);
\r
95 cutShortcut.activated.connect(parent, "cutClicked()");
\r
96 setupShortcut(cutShortcut, "Edit_Cut");
\r
98 copyAction = new QAction(tr("Copy"), this);
\r
99 copyAction.triggered.connect(parent, "copyClicked()");
\r
100 contextMenu.addAction(copyAction);
\r
101 setupShortcut(copyAction, "Edit_Copy");
\r
102 copyShortcut = new QShortcut(this);
\r
103 copyShortcut.activated.connect(parent, "copyClicked()");
\r
104 setupShortcut(copyShortcut, "Edit_Copy");
\r
106 pasteAction = pageAction(QWebPage.WebAction.Paste);
\r
107 pasteAction.disconnect();
\r
108 pasteAction.triggered.connect(parent, "pasteClicked()");
\r
110 contextMenu.addAction(pasteAction);
\r
111 setupShortcut(pasteAction, "Edit_Paste");
\r
112 pasteShortcut = new QShortcut(this);
\r
113 pasteShortcut.activated.connect(parent, "pasteClicked()");
\r
114 setupShortcut(pasteShortcut, "Edit_Paste");
\r
116 pasteWithoutFormatAction = new QAction(tr("Paste Without Formatting"), this);
\r
117 pasteWithoutFormatAction.triggered.connect(parent, "pasteWithoutFormattingClicked()");
\r
118 contextMenu.addAction(pasteWithoutFormatAction);
\r
119 setupShortcut(pasteWithoutFormatAction, "Edit_Paste_Without_Formatting");
\r
120 pasteWithoutFormatShortcut = new QShortcut(this);
\r
121 pasteWithoutFormatShortcut.activated.connect(parent, "pasteWithoutFormattingClicked()");
\r
122 setupShortcut(pasteWithoutFormatShortcut, "Edit_Paste_Without_Formatting");
\r
124 contextMenu.addSeparator();
\r
125 QMenu colorMenu = new QMenu(tr("Background Color"));
\r
126 contextMenu.addMenu(colorMenu);
\r
128 colorMenu.addAction(setupColorMenuOption("White"));
\r
129 colorMenu.addAction(setupColorMenuOption("Red"));
\r
130 colorMenu.addAction(setupColorMenuOption("Blue"));
\r
131 colorMenu.addAction(setupColorMenuOption("Green"));
\r
132 colorMenu.addAction(setupColorMenuOption("Yellow"));
\r
133 colorMenu.addAction(setupColorMenuOption("Black"));
\r
134 colorMenu.addAction(setupColorMenuOption("Grey"));
\r
135 colorMenu.addAction(setupColorMenuOption("Purple"));
\r
136 colorMenu.addAction(setupColorMenuOption("Brown"));
\r
137 colorMenu.addAction(setupColorMenuOption("Orange"));
\r
138 colorMenu.addAction(setupColorMenuOption("Powder Blue"));
\r
141 contextMenu.addSeparator();
\r
142 todoAction = new QAction(tr("To-do"), this);
\r
143 todoAction.triggered.connect(parent, "todoClicked()");
\r
144 contextMenu.addAction(todoAction);
\r
145 setupShortcut(todoAction, "Edit_Insert_Todo");
\r
146 contextMenu.insertSeparator(todoAction);
\r
147 todoShortcut = new QShortcut(this);
\r
148 todoShortcut.activated.connect(parent, "todoClicked()");
\r
149 setupShortcut(todoShortcut, "Edit_Insert_Todo");
\r
151 encryptAction = new QAction(tr("Encrypt Selected Text"), this);
\r
152 encryptAction.triggered.connect(parent, "encryptText()");
\r
153 contextMenu.addAction(encryptAction);
\r
154 contextMenu.insertSeparator(encryptAction);
\r
155 setupShortcut(encryptAction, "Edit_Encrypt_Text");
\r
156 encryptAction.setEnabled(false);
\r
157 encryptShortcut = new QShortcut(this);
\r
158 encryptShortcut.activated.connect(parent, "encryptText()");
\r
159 setupShortcut(encryptShortcut, "Edit_Encrypt_Text");
\r
161 insertLinkAction = new QAction(tr("Insert Hyperlink"), this);
\r
162 insertLinkAction.triggered.connect(parent, "insertLink()");
\r
163 setupShortcut(insertLinkAction, "Edit_Insert_Hyperlink");
\r
164 contextMenu.addAction(insertLinkAction);
\r
165 insertLinkAction.setEnabled(false);
\r
166 insertLinkShortcut = new QShortcut(this);
\r
167 setupShortcut(insertLinkShortcut, "Edit_Insert_Hyperlink");
\r
168 insertLinkShortcut.activated.connect(parent, "insertLink()");
\r
170 contextMenu.addMenu(tableMenu);
\r
171 tableMenu.setTitle("Table");
\r
172 insertTableAction = new QAction(tr("Insert Table"), this);
\r
173 insertTableAction.triggered.connect(parent, "insertTable()");
\r
174 setupShortcut(insertTableAction, "Edit_Insert_Table");
\r
175 tableMenu.addAction(insertTableAction);
\r
176 insertTableShortcut = new QShortcut(this);
\r
177 setupShortcut(insertTableShortcut, "Edit_Insert_Table");
\r
178 insertTableShortcut.activated.connect(parent, "insertTable()");
\r
180 insertTableRowAction = new QAction(tr("Insert Row"), this);
\r
181 insertTableRowAction.triggered.connect(parent, "insertTableRow()");
\r
182 setupShortcut(insertTableRowAction, "Edit_Insert_Table_Row");
\r
183 tableMenu.addAction(insertTableRowAction);
\r
184 insertTableRowShortcut = new QShortcut(this);
\r
185 setupShortcut(insertTableRowShortcut, "Edit_Insert_Table_Row");
\r
186 insertTableRowShortcut.activated.connect(parent, "insertTableRow()");
\r
188 deleteTableRowAction = new QAction(tr("Delete Row"), this);
\r
189 deleteTableRowAction.triggered.connect(parent, "deleteTableRow()");
\r
190 setupShortcut(deleteTableRowAction, "Edit_Delete_Table_Row");
\r
191 tableMenu.addAction(deleteTableRowAction);
\r
192 deleteTableRowShortcut = new QShortcut(this);
\r
193 setupShortcut(deleteTableRowShortcut, "Edit_Delete_Table_Row");
\r
194 deleteTableRowShortcut.activated.connect(parent, "deleteTableRow()");
\r
196 insertDateTimeShortcut = new QShortcut(this);
\r
197 insertDateTimeShortcut.activated.connect(parent, "insertDateTime()");
\r
198 setupShortcut(insertDateTimeShortcut, "Insert_DateTime");
\r
200 QMenu imageMenu = new QMenu();
\r
201 imageMenu.setTitle(tr("Image"));
\r
202 contextMenu.addMenu(imageMenu);
\r
203 downloadImage = pageAction(QWebPage.WebAction.DownloadImageToDisk);
\r
204 downloadImage.setText(tr("Save Image"));
\r
205 imageMenu.addAction(downloadImage);
\r
206 // contextMenu.insertSeparator(downloadImage);
\r
207 // page().downloadRequested.connect(this, "downloadImage(QNetworkRequest)");
\r
208 downloadImageRequested = new Signal1<QNetworkRequest>();
\r
210 rotateImageRight = new QAction(tr("Rotate Right"), this);
\r
211 imageMenu.addAction(rotateImageRight);
\r
212 rotateImageRight.triggered.connect(parent, "rotateImageRight()");
\r
213 rotateImageRightShortcut = new QShortcut(this);
\r
214 setupShortcut(rotateImageRightShortcut, "Edit_Image_Rotate_Right");
\r
215 rotateImageRightShortcut.activated.connect(parent, "rotateImageRight()");
\r
217 rotateImageLeft = new QAction(tr("Rotate Left"), this);
\r
218 imageMenu.addAction(rotateImageLeft);
\r
219 rotateImageLeft.triggered.connect(parent, "rotateImageLeft()");
\r
220 rotateImageLeftShortcut = new QShortcut(this);
\r
221 setupShortcut(rotateImageLeftShortcut, "Edit_Image_Rotate_Left");
\r
222 rotateImageLeftShortcut.activated.connect(parent, "rotateImageLeft()");
\r
224 downloadAttachment = pageAction(QWebPage.WebAction.DownloadLinkToDisk);
\r
225 downloadAttachment.setText(tr("Save Attachment"));
\r
226 contextMenu.addAction(downloadAttachment);
\r
227 page().downloadRequested.connect(this, "downloadAttachment(QNetworkRequest)");
\r
228 downloadAttachmentRequested = new Signal1<QNetworkRequest>();
\r
232 private void setupShortcut(QAction action, String text) {
\r
233 if (!Global.shortcutKeys.containsAction(text))
\r
235 action.setShortcut(Global.shortcutKeys.getShortcut(text));
\r
238 private void setupShortcut(QShortcut action, String text) {
\r
239 if (!Global.shortcutKeys.containsAction(text))
\r
241 action.setKey(new QKeySequence(Global.shortcutKeys.getShortcut(text)));
\r
244 private QAction setupColorMenuOption(String color) {
\r
245 QAction backgroundColor = new QAction(tr(color), this);
\r
246 color = color.replace(" ", "");
\r
247 backgroundColor.triggered.connect(this, "setBackground"+color+"()");
\r
248 return backgroundColor;
\r
252 public boolean event(QEvent event)
\r
254 if (event.type().equals(QEvent.Type.KeyPress)) {
\r
255 QKeyEvent ke = (QKeyEvent) event;
\r
256 if (ke.key() == Qt.Key.Key_Tab.value()) {
\r
257 parent.tabPressed();
\r
260 if (ke.key() == Qt.Key.Key_Backtab.value()) {
\r
261 parent.backtabPressed();
\r
265 return super.event(event);
\r
270 public void keyPressEvent(QKeyEvent e) {
\r
272 // This is done because if we set the content editable, the scroll keys are
\r
273 // ignored by webkit.
\r
274 if (e.key() == Qt.Key.Key_PageUp.value() || e.key() == Qt.Key.Key_PageDown.value()) {
\r
275 int bottom = page().mainFrame().geometry().bottom();
\r
276 int top = page().mainFrame().geometry().top();
\r
277 int scrollValue = top-bottom;
\r
278 if (e.key() == Qt.Key.Key_PageDown.value())
\r
279 scrollValue = -1*scrollValue;
\r
280 page().mainFrame().scroll(0, scrollValue);
\r
283 // This is done to allow proper pasting of resources, otherwise it messes up multiple pastes
\r
284 if (e.matches(StandardKey.Paste)) {
\r
285 parent.pasteClicked();
\r
289 super.keyPressEvent(e);
\r
292 // public void downloadImage(QNetworkRequest req) {
\r
293 // System.out.println(req.url().toString());
\r
294 // downloadImageRequested.emit(req);
\r
296 public void downloadAttachment(QNetworkRequest req) {
\r
297 downloadAttachmentRequested.emit(req);
\r
302 public void dropEvent(QDropEvent e) {
\r
304 QMimeData mime = e.mimeData();
\r
305 parent.handleUrls(mime);
\r
306 parent.contentChanged();
\r
307 // triggerPageAction(WebAction.Reload);
\r
311 public void contextMenuEvent(QContextMenuEvent event) {
\r
313 contextMenu.exec(event.globalPos());
\r
318 @SuppressWarnings("unused")
\r
319 private void setBackgroundWhite() {parent.setBackgroundColor("white");}
\r
320 @SuppressWarnings("unused")
\r
321 private void setBackgroundRed() {parent.setBackgroundColor("red");}
\r
322 @SuppressWarnings("unused")
\r
323 private void setBackgroundBlue() {parent.setBackgroundColor("blue");}
\r
324 @SuppressWarnings("unused")
\r
325 private void setBackgroundGreen() {parent.setBackgroundColor("green");}
\r
326 @SuppressWarnings("unused")
\r
327 private void setBackgroundYellow() {parent.setBackgroundColor("yellow");}
\r
328 @SuppressWarnings("unused")
\r
329 private void setBackgroundBlack() {parent.setBackgroundColor("black");}
\r
330 @SuppressWarnings("unused")
\r
331 private void setBackgroundPurple() {parent.setBackgroundColor("purple");}
\r
332 @SuppressWarnings("unused")
\r
333 private void setBackgroundBrown() {parent.setBackgroundColor("brown");}
\r
334 @SuppressWarnings("unused")
\r
335 private void setBackgroundGrey() {parent.setBackgroundColor("grey");}
\r
336 @SuppressWarnings("unused")
\r
337 private void setBackgroundOrange() {parent.setBackgroundColor("orange");}
\r
338 @SuppressWarnings("unused")
\r
339 private void setBackgroundPowderBlue() {parent.setBackgroundColor("powderblue");}
\r