/*
* Red Bee Browser
*
* Copyright (c) 2013 Tran Dinh Thoai <dthoai@yahoo.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.redbee;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.browser.CloseWindowListener;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.browser.LocationListener;
import org.eclipse.swt.browser.OpenWindowListener;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.browser.StatusTextEvent;
import org.eclipse.swt.browser.StatusTextListener;
import org.eclipse.swt.browser.TitleEvent;
import org.eclipse.swt.browser.TitleListener;
import org.eclipse.swt.browser.WindowEvent;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Window {
private static Logger logger = Logger.getLogger(Window.class);
public static String HOME_URL = "http://google.com";
private Shell shell;
private Browser browser;
private Text urlText;
private Label statusLabel;
private String homeUrl;
private Menu menu;
public Window() {
homeUrl = "";
shell = new Shell(Display.getDefault(), SWT.CLOSE | SWT.MIN | SWT.MAX | SWT.RESIZE);
decorate();
}
public Window(String homeUrl) {
this.homeUrl = homeUrl.trim();
shell = new Shell(Display.getDefault(), SWT.CLOSE | SWT.MIN | SWT.MAX | SWT.RESIZE);
decorate();
}
public Browser getBrowser() {
return browser;
}
protected void decorate() {
FormData fd;
Label label;
Text text;
MenuItem mi;
shell.setSize(800, 600);
UITool.placeCentered(shell, 800, 600);
shell.setText(Labels.get("MainWindow.Title"));
shell.setImage(Images.get("Icon.16x16"));
shell.setLayout(new FormLayout());
String xulDir = new File(System.getProperty("user.dir"), "ext/xulrunner").getAbsolutePath();
System.setProperty("org.eclipse.swt.browser.XULRunnerPath", xulDir);
text = new Text(shell, SWT.BORDER);
urlText = text;
fd = new FormData();
fd.top = new FormAttachment(0, 1);
fd.left = new FormAttachment(0, 1);
fd.right = new FormAttachment(100, -1);
text.setLayoutData(fd);
text.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent ke) {
if (ke.character == 13) {
try {
setUrl(urlText.getText());
} catch (Exception e) {
UITool.errorBox(shell, e);
}
}
}
@Override
public void keyPressed(KeyEvent ke) {
}
});
label = new Label(shell, SWT.BORDER);
statusLabel = label;
fd = new FormData();
fd.top = new FormAttachment(100, -16);
fd.left = new FormAttachment(0, 0);
fd.bottom = new FormAttachment(100, 0);
fd.right = new FormAttachment(100, 0);
label.setLayoutData(fd);
label = new Label(shell, SWT.HORIZONTAL | SWT.SEPARATOR);
fd = new FormData();
fd.top = new FormAttachment(0, 22);
fd.left = new FormAttachment(0, 0);
fd.right = new FormAttachment(100, 0);
label.setLayoutData(fd);
browser = new Browser(shell, SWT.MOZILLA);
fd = new FormData();
fd.top = new FormAttachment(0, 24);
fd.left = new FormAttachment(0, 0);
fd.bottom = new FormAttachment(100, -18);
fd.right = new FormAttachment(100, 0);
browser.setLayoutData(fd);
browser.addLocationListener(new LocationListener() {
@Override
public void changing(LocationEvent le) {
}
@Override
public void changed(LocationEvent le) {
try {
urlText.setText(le.location);
} catch (Exception e) {
}
}
});
browser.addStatusTextListener(new StatusTextListener() {
@Override
public void changed(StatusTextEvent ste) {
try {
statusLabel.setText(ste.text);
} catch (Exception e) {
}
}
});
browser.addTitleListener(new TitleListener() {
@Override
public void changed(TitleEvent te) {
try {
shell.setText(te.title);
} catch (Exception e) {
}
}
});
browser.addCloseWindowListener(new CloseWindowListener() {
@Override
public void close(WindowEvent we) {
shell.close();
}
});
browser.addOpenWindowListener(new OpenWindowListener() {
@Override
public void open(WindowEvent we) {
final WindowEvent twe = we;
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
try {
Window w = new Window();
twe.browser = w.getBrowser();
twe.browser.getShell().open();
} catch (Exception e) {
UITool.errorBox(shell, e);
}
}
});
}
});
new CustomFunction(browser, "system_close");
menu = new Menu(shell, SWT.POP_UP);
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.NewWindow"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
String url = HOME_URL;
try {
url = new URL(statusLabel.getText()).toString();
} catch (Exception e) {
}
final String turl = url;
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
try {
new Window(turl).open();
} catch (Exception e) {
UITool.errorBox(shell, e);
}
}
});
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.Back"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
browser.back();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.Forward"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
browser.forward();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.Reload"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
browser.refresh();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.Stop"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
browser.stop();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.Home"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
setUrl(HOME_URL);
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.BookmarkPage"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
String link = browser.getUrl();
try {
link = new URL(link).toString();
} catch (Exception e) {
link = "";
}
if (link.length() == 0) return;
if (link.startsWith(HOME_URL)) return;
String url = HOME_URL + "/bookmark.jsp?l=" + java.net.URLEncoder.encode(link, "UTF-8");
OpenWindowTask task = new OpenWindowTask(url);
task.start();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.BookmarkLink"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
String link = "";
try {
link = new URL(statusLabel.getText()).toString();
} catch (Exception e) {
link = "";
}
if (link.length() == 0) return;
if (link.startsWith(HOME_URL)) return;
String url = HOME_URL + "/bookmark.jsp?l=" + java.net.URLEncoder.encode(link, "UTF-8");
OpenWindowTask task = new OpenWindowTask(url);
task.start();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.BookmarkPagePreview"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
String link = browser.getUrl();
try {
link = new URL(link).toString();
} catch (Exception e) {
link = "";
}
if (link.length() == 0) return;
if (link.startsWith(HOME_URL)) return;
String url = HOME_URL + "/bookmark.jsp?l=" + java.net.URLEncoder.encode(link, "UTF-8") + "&c=1";
OpenWindowTask task = new OpenWindowTask(url);
task.start();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.BookmarkLinkPreview"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
String link = "";
try {
link = new URL(statusLabel.getText()).toString();
} catch (Exception e) {
link = "";
}
if (link.length() == 0) return;
if (link.startsWith(HOME_URL)) return;
String url = HOME_URL + "/bookmark.jsp?l=" + java.net.URLEncoder.encode(link, "UTF-8") + "&c=1";
OpenWindowTask task = new OpenWindowTask(url);
task.start();
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.CopyLink"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
try {
String url = "";
try {
url = new URL(statusLabel.getText()).toString();
} catch (Exception e) {
url = "";
}
if (url.length() > 0) {
Clipboard clipboard = new Clipboard(shell.getDisplay());
TextTransfer transfer = TextTransfer.getInstance();
clipboard.setContents(new Object[] { url }, new TextTransfer[] { transfer });
clipboard.dispose();
}
} catch (Exception e) {
}
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.SaveLink"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
String url = "";
try {
url = new URL(statusLabel.getText()).toString();
} catch (Exception e) {
url = "";
}
if (url.length() == 0) return;
if (url.startsWith(HOME_URL)) return;
DirectoryDialog dlg = new DirectoryDialog(shell);
dlg.setText(Labels.get("Window.DirDlg.Title"));
dlg.setMessage(Labels.get("Window.DirDlg.Message"));
String folder = dlg.open();
if (folder == null) return;
Cursor cursor = shell.getCursor();
shell.setCursor(new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT));
try {
String link = url;
PageSaver saver = new PageSaver(link, folder);
saver.run();
} catch (Exception e) {
UITool.errorBox(shell, e);
}
shell.setCursor(cursor);
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.SavePage"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
if (browser.getUrl().startsWith(HOME_URL)) return;
DirectoryDialog dlg = new DirectoryDialog(shell);
dlg.setText(Labels.get("Window.DirDlg.Title"));
dlg.setMessage(Labels.get("Window.DirDlg.Message"));
String folder = dlg.open();
if (folder == null) return;
Cursor cursor = shell.getCursor();
shell.setCursor(new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT));
try {
String link = urlText.getText();
PageSaver saver = new PageSaver(link, folder);
saver.run();
} catch (Exception e) {
UITool.errorBox(shell, e);
}
shell.setCursor(cursor);
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.CaptureArea"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
FileDialog dlg = new FileDialog(shell, SWT.SAVE);
dlg.setFilterExtensions(new String[] { "*.png" });
dlg.setFilterNames(new String[] { "PNG (*.png)" });
String filename = dlg.open();
if (filename == null) return;
Cursor cursor = shell.getCursor();
shell.setCursor(new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT));
try {
Thread.sleep(1000);
GC source = new GC(browser);
Image image = new Image(shell.getDisplay(), browser.getClientArea());
source.copyArea(image, 0, 0);
ImageLoader io = new ImageLoader();
io.data = new ImageData[] {image.getImageData()};
io.save(filename, SWT.IMAGE_PNG);
} catch (Exception e) {
}
shell.setCursor(cursor);
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.CapturePage"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
String link = browser.getUrl();
if (link.startsWith(HOME_URL)) return;
FileDialog dlg = new FileDialog(shell, SWT.SAVE);
dlg.setFilterExtensions(new String[] { "*.png" });
dlg.setFilterNames(new String[] { "PNG (*.png)" });
String filename = dlg.open();
if (filename == null) return;
Cursor cursor = shell.getCursor();
shell.setCursor(new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT));
try {
Thread.sleep(1000);
String url = "http://api.snapito.com/?url=" + java.net.URLEncoder.encode(link, "UTF-8");
org.jsoup.Connection conn = org.jsoup.Jsoup.connect(link);
conn.timeout(60000);
conn.ignoreContentType(true);
conn.userAgent("Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1");
conn.execute();
url = "http://cache.snapito.com/api/image?_cache_redirect=true&url=" + java.net.URLEncoder.encode(link, "UTF-8") + "&type=png";
conn.url(url);
byte[] data = conn.execute().bodyAsBytes();
OutputStream os = new FileOutputStream(filename);
os.write(data);
os.close();
} catch (Exception e) {
logger.error("", e);
UITool.errorBox(shell, e);
}
shell.setCursor(cursor);
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.CaptureLink"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
String link = "";
try {
link = new URL(statusLabel.getText()).toString();
} catch (Exception e) {
link = "";
}
if (link.length() == 0) return;
if (link.startsWith(HOME_URL)) return;
FileDialog dlg = new FileDialog(shell, SWT.SAVE);
dlg.setFilterExtensions(new String[] { "*.png" });
dlg.setFilterNames(new String[] { "PNG (*.png)" });
String filename = dlg.open();
if (filename == null) return;
Cursor cursor = shell.getCursor();
shell.setCursor(new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT));
try {
Thread.sleep(1000);
String url = "http://api.snapito.com/?url=" + java.net.URLEncoder.encode(link, "UTF-8");
org.jsoup.Connection conn = org.jsoup.Jsoup.connect(link);
conn.timeout(60000);
conn.ignoreContentType(true);
conn.userAgent("Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1");
conn.execute();
url = "http://cache.snapito.com/api/image?_cache_redirect=true&url=" + java.net.URLEncoder.encode(link, "UTF-8") + "&type=png";
conn.url(url);
byte[] data = conn.execute().bodyAsBytes();
OutputStream os = new FileOutputStream(filename);
os.write(data);
os.close();
} catch (Exception e) {
logger.error("", e);
UITool.errorBox(shell, e);
}
shell.setCursor(cursor);
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
mi = new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.PUSH);
mi.setText(Labels.get("Window.OpenFile"));
mi.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent se) {
FileDialog dlg = new FileDialog(shell);
dlg.setFilterExtensions(new String[] { "*.*" });
String filename = dlg.open();
if (filename == null) return;
filename = filename.replace("\\\\", "/");
filename = "file://" + filename;
setUrl(filename);
}
@Override
public void widgetDefaultSelected(SelectionEvent se) {
}
});
browser.setMenu(menu);
if (homeUrl.length() > 0) {
setUrl(homeUrl);
}
browser.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent ke) {
if (ke.keyCode == 108) {
if ((ke.stateMask & SWT.CTRL) > 0) {
urlText.setFocus();
urlText.setSelection(0, urlText.getText().length());
}
}
}
@Override
public void keyPressed(KeyEvent ke) {
}
});
urlText.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent ke) {
if (ke.keyCode == 108) {
if ((ke.stateMask & SWT.CTRL) > 0) {
urlText.setFocus();
urlText.setSelection(0, urlText.getText().length());
}
}
}
@Override
public void keyPressed(KeyEvent ke) {
}
});
}
public void setUrl(String url) {
try {
urlText.setText(url);
browser.setUrl(urlText.getText());
} catch (Exception e) {
UITool.errorBox(shell, e);
}
}
public void open() {
shell.open();
while (!shell.isDisposed()) {
if (!shell.getDisplay().readAndDispatch()) shell.getDisplay().sleep();
}
}
private class OpenWindowTask extends Thread {
private String link;
public OpenWindowTask(String link) {
this.link = link;
}
public void run() {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
try {
new Window(link).open();
} catch (Exception e) {
UITool.errorBox(shell, e);
}
}
});
}
}
private class CustomFunction extends BrowserFunction {
private String name;
public CustomFunction(Browser browser, String name) {
super(browser, name);
this.name = name;
}
public Object function(Object[] arguments) {
if ("system_close".equals(name)) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
shell.close();
}
});
return null;
}
return null;
}
}
}