/*
* This file is part of NixNote
* Copyright 2009 Randy Baumgarte
*
* This file may be licensed under the terms of of the
* GNU General Public License Version 2 (the ``GPL'').
*
* Software distributed under the License is distributed
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the GPL for the specific language
* governing rights and limitations.
*
* You should have received a copy of the GPL along with this
* program. If not, go to http://www.gnu.org/licenses/gpl.html
* or write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package cx.fbn.nevernote.gui;
import com.trolltech.qt.core.QEvent;
import com.trolltech.qt.core.QMimeData;
import com.trolltech.qt.core.Qt;
import com.trolltech.qt.gui.QAction;
import com.trolltech.qt.gui.QContextMenuEvent;
import com.trolltech.qt.gui.QDropEvent;
import com.trolltech.qt.gui.QKeyEvent;
import com.trolltech.qt.gui.QKeySequence;
import com.trolltech.qt.gui.QKeySequence.StandardKey;
import com.trolltech.qt.gui.QMenu;
import com.trolltech.qt.gui.QShortcut;
import com.trolltech.qt.network.QNetworkRequest;
import com.trolltech.qt.webkit.QWebPage;
import com.trolltech.qt.webkit.QWebView;
import cx.fbn.nevernote.Global;
public class ContentView extends QWebView {
BrowserWindow parent;
QMenu contextMenu = new QMenu(this);
QMenu tableMenu = new QMenu(this);
QAction cutAction;
QShortcut cutShortcut;
QAction copyAction;
QShortcut copyShortcut;
QAction pasteAction;
QShortcut pasteShortcut;
QAction pasteWithoutFormatAction;
QShortcut pasteWithoutFormatShortcut;
QAction todoAction;
QShortcut todoShortcut;
QAction encryptAction;
QShortcut encryptShortcut;
QAction downloadAttachment;
QShortcut downloadAttachmentShortcut;
QAction downloadImage;
QShortcut downloadImageShortcut;
QAction rotateImageRight;
QShortcut rotateImageRightShortcut;
QAction rotateImageLeft;
QShortcut rotateImageLeftShortcut;
QAction insertLinkAction;
QShortcut insertLinkShortcut;
QAction insertLatexAction;
QShortcut insertLatexShortcut;
QAction insertTableAction;
QShortcut insertTableShortcut;
QAction insertTableRowAction;
QShortcut insertTableRowShortcut;
QAction insertTableColumnAction;
QShortcut insertTableColumnShortcut;
QAction deleteTableRowAction;
QShortcut deleteTableRowShortcut;
QAction deleteTableColumnAction;
QShortcut deleteTableColumnShortcut;
QAction openAction;
QAction insertQuickLinkAction;
QShortcut insertQuickLinkShortcut;
QMenu imageMenu;
QAction redBackgroundColor;
QShortcut insertDateTimeShortcut;
Signal1<QNetworkRequest> downloadAttachmentRequested;
Signal1<QNetworkRequest> downloadImageRequested;
public ContentView(BrowserWindow p) {
parent=p;
contextMenu = new QMenu(this);
openAction = new QAction(tr("Open"), this);
openAction.setText(tr("Open"));
contextMenu.addAction(openAction);
openAction.triggered.connect(parent, "openFile()");
cutAction = new QAction(tr("Cut"), this);
cutAction.triggered.connect(parent, "cutClicked()");
contextMenu.addAction(cutAction);
contextMenu.insertSeparator(cutAction);
setupShortcut(cutAction, "Edit_Cut");
cutShortcut = new QShortcut(this);
cutShortcut.activated.connect(parent, "cutClicked()");
setupShortcut(cutShortcut, "Edit_Cut");
copyAction = new QAction(tr("Copy"), this);
copyAction.triggered.connect(parent, "copyClicked()");
contextMenu.addAction(copyAction);
setupShortcut(copyAction, "Edit_Copy");
copyShortcut = new QShortcut(this);
copyShortcut.activated.connect(parent, "copyClicked()");
setupShortcut(copyShortcut, "Edit_Copy");
pasteAction = pageAction(QWebPage.WebAction.Paste);
pasteAction.disconnect();
pasteAction.triggered.connect(parent, "pasteClicked()");
contextMenu.addAction(pasteAction);
setupShortcut(pasteAction, "Edit_Paste");
pasteShortcut = new QShortcut(this);
pasteShortcut.activated.connect(parent, "pasteClicked()");
setupShortcut(pasteShortcut, "Edit_Paste");
pasteWithoutFormatAction = new QAction(tr("Paste Without Formatting"), this);
pasteWithoutFormatAction.triggered.connect(parent, "pasteWithoutFormattingClicked()");
contextMenu.addAction(pasteWithoutFormatAction);
setupShortcut(pasteWithoutFormatAction, "Edit_Paste_Without_Formatting");
// pasteWithoutFormatShortcut = new QShortcut(this);
// pasteWithoutFormatShortcut.activated.connect(parent, "pasteWithoutFormattingClicked()");
// setupShortcut(pasteWithoutFormatShortcut, "Edit_Paste_Without_Formatting");
contextMenu.addSeparator();
QMenu colorMenu = new QMenu(tr("Background Color"));
contextMenu.addMenu(colorMenu);
colorMenu.addAction(setupColorMenuOption("White"));
colorMenu.addAction(setupColorMenuOption("Red"));
colorMenu.addAction(setupColorMenuOption("Blue"));
colorMenu.addAction(setupColorMenuOption("Green"));
colorMenu.addAction(setupColorMenuOption("Yellow"));
colorMenu.addAction(setupColorMenuOption("Black"));
colorMenu.addAction(setupColorMenuOption("Grey"));
colorMenu.addAction(setupColorMenuOption("Purple"));
colorMenu.addAction(setupColorMenuOption("Brown"));
colorMenu.addAction(setupColorMenuOption("Orange"));
colorMenu.addAction(setupColorMenuOption("Powder Blue"));
contextMenu.addSeparator();
todoAction = new QAction(tr("To-do"), this);
todoAction.triggered.connect(parent, "todoClicked()");
contextMenu.addAction(todoAction);
setupShortcut(todoAction, "Edit_Insert_Todo");
contextMenu.insertSeparator(todoAction);
todoShortcut = new QShortcut(this);
todoShortcut.activated.connect(parent, "todoClicked()");
setupShortcut(todoShortcut, "Edit_Insert_Todo");
encryptAction = new QAction(tr("Encrypt Selected Text"), this);
encryptAction.triggered.connect(parent, "encryptText()");
contextMenu.addAction(encryptAction);
contextMenu.insertSeparator(encryptAction);
setupShortcut(encryptAction, "Edit_Encrypt_Text");
encryptAction.setEnabled(false);
encryptShortcut = new QShortcut(this);
encryptShortcut.activated.connect(parent, "encryptText()");
setupShortcut(encryptShortcut, "Edit_Encrypt_Text");
insertLinkAction = new QAction(tr("Insert Hyperlink"), this);
insertLinkAction.triggered.connect(parent, "insertLink()");
setupShortcut(insertLinkAction, "Edit_Insert_Hyperlink");
contextMenu.addAction(insertLinkAction);
insertLinkAction.setEnabled(false);
insertLinkShortcut = new QShortcut(this);
setupShortcut(insertLinkShortcut, "Edit_Insert_Hyperlink");
insertLinkShortcut.activated.connect(parent, "insertLink()");
insertQuickLinkAction = new QAction(tr("Quick Link"), this);
insertQuickLinkAction.triggered.connect(parent, "insertQuickLink()");
setupShortcut(insertQuickLinkAction, "Edit_Insert_QuickLink");
contextMenu.addAction(insertQuickLinkAction);
insertQuickLinkAction.setEnabled(false);
insertQuickLinkShortcut = new QShortcut(this);
setupShortcut(insertQuickLinkShortcut, "Edit_Insert_Quicklink");
insertQuickLinkShortcut.activated.connect(parent, "insertQuickLink()");
insertLatexAction = new QAction(tr("Insert LaTeX Formula"), this);
insertLatexAction.triggered.connect(parent, "insertLatex()");
setupShortcut(insertLatexAction, "Edit_Insert_Latex");
contextMenu.addAction(insertLatexAction);
insertLatexShortcut = new QShortcut(this);
setupShortcut(insertLatexShortcut, "Edit_Insert_Latex");
insertLatexShortcut.activated.connect(parent, "insertLatex()");
contextMenu.addMenu(tableMenu);
tableMenu.setTitle("Table");
insertTableAction = new QAction(tr("Insert Table"), this);
insertTableAction.triggered.connect(parent, "insertTable()");
setupShortcut(insertTableAction, "Edit_Insert_Table");
tableMenu.addAction(insertTableAction);
insertTableShortcut = new QShortcut(this);
setupShortcut(insertTableShortcut, "Edit_Insert_Table");
insertTableShortcut.activated.connect(parent, "insertTable()");
insertTableRowAction = new QAction(tr("Insert Row"), this);
insertTableRowAction.triggered.connect(parent, "insertTableRow()");
setupShortcut(insertTableRowAction, "Edit_Insert_Table_Row");
tableMenu.addAction(insertTableRowAction);
insertTableRowShortcut = new QShortcut(this);
setupShortcut(insertTableRowShortcut, "Edit_Insert_Table_Row");
insertTableRowShortcut.activated.connect(parent, "insertTableRow()");
insertTableColumnAction = new QAction(tr("Insert Column"), this);
insertTableColumnAction.triggered.connect(parent, "insertTableColumn()");
setupShortcut(insertTableColumnAction, "Edit_Insert_Table_Column");
tableMenu.addAction(insertTableColumnAction);
insertTableColumnShortcut = new QShortcut(this);
setupShortcut(insertTableColumnShortcut, "Edit_Insert_Table_Column");
insertTableColumnShortcut.activated.connect(parent, "insertTableColumn()");
deleteTableRowAction = new QAction(tr("Delete Row"), this);
deleteTableRowAction.triggered.connect(parent, "deleteTableRow()");
setupShortcut(deleteTableRowAction, "Edit_Delete_Table_Row");
tableMenu.addAction(deleteTableRowAction);
deleteTableRowShortcut = new QShortcut(this);
setupShortcut(deleteTableRowShortcut, "Edit_Delete_Table_Row");
deleteTableRowShortcut.activated.connect(parent, "deleteTableRow()");
deleteTableColumnAction = new QAction(tr("Delete Column"), this);
deleteTableColumnAction.triggered.connect(parent, "deleteTableColumn()");
setupShortcut(deleteTableColumnAction, "Edit_Delete_Table_Column");
tableMenu.addAction(deleteTableColumnAction);
deleteTableColumnShortcut = new QShortcut(this);
setupShortcut(deleteTableColumnShortcut, "Edit_Delete_Table_Column");
deleteTableColumnShortcut.activated.connect(parent, "deleteTableColumn()");
insertDateTimeShortcut = new QShortcut(this);
insertDateTimeShortcut.activated.connect(parent, "insertDateTime()");
setupShortcut(insertDateTimeShortcut, "Insert_DateTime");
imageMenu = new QMenu();
imageMenu.setTitle(tr("Image"));
contextMenu.addMenu(imageMenu);
downloadImage = pageAction(QWebPage.WebAction.DownloadImageToDisk);
downloadImage.setText(tr("Save Image"));
imageMenu.addAction(downloadImage);
// contextMenu.insertSeparator(downloadImage);
// page().downloadRequested.connect(this, "downloadImage(QNetworkRequest)");
downloadImageRequested = new Signal1<QNetworkRequest>();
rotateImageRight = new QAction(tr("Rotate Right"), this);
imageMenu.addAction(rotateImageRight);
rotateImageRight.triggered.connect(parent, "rotateImageRight()");
rotateImageRightShortcut = new QShortcut(this);
setupShortcut(rotateImageRightShortcut, "Edit_Image_Rotate_Right");
rotateImageRightShortcut.activated.connect(parent, "rotateImageRight()");
rotateImageLeft = new QAction(tr("Rotate Left"), this);
imageMenu.addAction(rotateImageLeft);
rotateImageLeft.triggered.connect(parent, "rotateImageLeft()");
rotateImageLeftShortcut = new QShortcut(this);
setupShortcut(rotateImageLeftShortcut, "Edit_Image_Rotate_Left");
rotateImageLeftShortcut.activated.connect(parent, "rotateImageLeft()");
downloadAttachment = pageAction(QWebPage.WebAction.DownloadLinkToDisk);
downloadAttachment.setText(tr("Save Attachment"));
contextMenu.addAction(downloadAttachment);
page().downloadRequested.connect(this, "downloadAttachment(QNetworkRequest)");
downloadAttachmentRequested = new Signal1<QNetworkRequest>();
}
private void setupShortcut(QAction action, String text) {
if (!Global.shortcutKeys.containsAction(text))
return;
action.setShortcut(Global.shortcutKeys.getShortcut(text));
}
private void setupShortcut(QShortcut action, String text) {
if (!Global.shortcutKeys.containsAction(text))
return;
action.setKey(new QKeySequence(Global.shortcutKeys.getShortcut(text)));
}
private QAction setupColorMenuOption(String color) {
QAction backgroundColor = new QAction(tr(color), this);
color = color.replace(" ", "");
backgroundColor.triggered.connect(this, "setBackground"+color+"()");
return backgroundColor;
}
@Override
public boolean event(QEvent event)
{
if (event.type().equals(QEvent.Type.KeyPress)) {
QKeyEvent ke = (QKeyEvent) event;
if (ke.key() == Qt.Key.Key_Tab.value()) {
parent.tabPressed();
ke.accept();
return true;
}
if (ke.key() == Qt.Key.Key_Backtab.value()) {
parent.backtabPressed();
return true;
}
}
return super.event(event);
}
@Override
public void keyPressEvent(QKeyEvent e) {
// This is done because if we set the content editable, the scroll keys are
// ignored by webkit.
if (e.key() == Qt.Key.Key_PageUp.value() || e.key() == Qt.Key.Key_PageDown.value()) {
int bottom = page().mainFrame().geometry().bottom();
int top = page().mainFrame().geometry().top();
int scrollValue = top-bottom;
if (e.key() == Qt.Key.Key_PageDown.value())
scrollValue = -1*scrollValue;
page().mainFrame().scroll(0, scrollValue);
}
// This is done to allow proper pasting of resources, otherwise it messes up multiple pastes
if (e.matches(StandardKey.Paste)) {
parent.pasteClicked();
e.accept();
return;
}
super.keyPressEvent(e);
}
// public void downloadImage(QNetworkRequest req) {
// System.out.println(req.url().toString());
// downloadImageRequested.emit(req);
// }
public void downloadAttachment(QNetworkRequest req) {
downloadAttachmentRequested.emit(req);
}
@Override
public void dropEvent(QDropEvent e) {
setFocus();
QMimeData mime = e.mimeData();
parent.handleUrls(mime);
parent.contentChanged();
// triggerPageAction(WebAction.Reload);
}
@Override
public void contextMenuEvent(QContextMenuEvent event) {
if (event != null)
contextMenu.exec(event.globalPos());
}
@SuppressWarnings("unused")
private void setBackgroundWhite() {parent.setBackgroundColor("white");}
@SuppressWarnings("unused")
private void setBackgroundRed() {parent.setBackgroundColor("red");}
@SuppressWarnings("unused")
private void setBackgroundBlue() {parent.setBackgroundColor("blue");}
@SuppressWarnings("unused")
private void setBackgroundGreen() {parent.setBackgroundColor("green");}
@SuppressWarnings("unused")
private void setBackgroundYellow() {parent.setBackgroundColor("yellow");}
@SuppressWarnings("unused")
private void setBackgroundBlack() {parent.setBackgroundColor("black");}
@SuppressWarnings("unused")
private void setBackgroundPurple() {parent.setBackgroundColor("purple");}
@SuppressWarnings("unused")
private void setBackgroundBrown() {parent.setBackgroundColor("brown");}
@SuppressWarnings("unused")
private void setBackgroundGrey() {parent.setBackgroundColor("grey");}
@SuppressWarnings("unused")
private void setBackgroundOrange() {parent.setBackgroundColor("orange");}
@SuppressWarnings("unused")
private void setBackgroundPowderBlue() {parent.setBackgroundColor("powderblue");}
}