/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 2 of the License, or (at your option) any later version.
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
package org.lobobrowser.primary.ext;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFileChooser;
import org.eclipse.jdt.annotation.NonNull;
import org.lobobrowser.main.PlatformInit;
import org.lobobrowser.primary.gui.SearchDialog;
import org.lobobrowser.primary.gui.prefs.PreferencesDialog;
import org.lobobrowser.primary.settings.ToolsSettings;
import org.lobobrowser.ua.NavigationEntry;
import org.lobobrowser.ua.NavigatorWindow;
import org.lobobrowser.ua.RequestType;
public class ActionPool {
private static final Logger logger = Logger.getLogger(ActionPool.class.getName());
private final ComponentSource componentSource;
private final NavigatorWindow window;
private final Collection<EnableableAction> enableableActions;
public final Action requestManagerAction = new AbstractAction("Req Mgr") {
private static final long serialVersionUID = -5964377537581420944L;
{
putValue(MNEMONIC_KEY, KeyEvent.VK_R);
}
public void actionPerformed(final ActionEvent e) {
window.getTopFrame().manageRequests(e.getSource());
}
};
public final GoAction goAction = new GoAction();
public final SearchAction searchAction = new SearchAction();
public final ExitAction exitAction = new ExitAction();
public final AboutAction aboutAction = new AboutAction();
public final BackAction backAction = new BackAction();
public final ForwardAction forwardAction = new ForwardAction();
public final ReloadAction reloadAction = new ReloadAction();
public final StopAction stopAction = new StopAction();
public final CopyAction copyAction = new CopyAction();
// public final BookmarksAction bookmarksAction = new BookmarksAction();
public final BackMoreAction backMoreAction = new BackMoreAction();
public final ForwardMoreAction forwardMoreAction = new ForwardMoreAction();
public final RecentHostsAction recentHostsAction = new RecentHostsAction();
public final SourceAction sourceAction = new SourceAction();
public final ConsoleAction consoleAction = new ConsoleAction();
public final AddBookmarkAction addBookmarkAction = new AddBookmarkAction();
public final SearchBookmarksAction searchBookmarksAction = new SearchBookmarksAction();
public final ShowBookmarksAction showBookmarksAction = new ShowBookmarksAction();
public final ListExtensionsAction listExtensionsAction = new ListExtensionsAction();
public final OpenFileAction openFileAction = new OpenFileAction();
public final BlankWindowAction blankWindowAction = new BlankWindowAction();
public final ClonedWindowAction clonedWindowAction = new ClonedWindowAction();
public final PreferencesAction preferencesAction = new PreferencesAction();
public ActionPool(final ComponentSource componentSource, final NavigatorWindow window) {
super();
this.componentSource = componentSource;
this.window = window;
final Collection<EnableableAction> actions = new LinkedList<>();
this.enableableActions = actions;
actions.add(this.backAction);
actions.add(this.forwardAction);
actions.add(this.reloadAction);
actions.add(this.backMoreAction);
actions.add(this.forwardMoreAction);
actions.add(this.recentHostsAction);
actions.add(this.sourceAction);
}
public void updateEnabling() {
for (final EnableableAction action : this.enableableActions) {
action.updateEnabling();
}
}
public Action createNavigateAction(final String fullURL) {
try {
return new NavigateAction(new URL(fullURL));
} catch (final java.net.MalformedURLException mfu) {
logger.log(Level.WARNING, "createNavigateAction()", mfu);
throw new IllegalStateException(mfu);
}
}
public Action createNavigateAction(final @NonNull URL url) {
return new NavigateAction(url);
}
public Action createBookmarkNavigateAction(final @NonNull URL url) {
return new BookmarkNavigateAction(url);
}
public Action createGoToAction(final NavigationEntry entry) {
return new GoToAction(entry);
}
public Action addUrlPrefixNavigateAction(final String urlPrefix, final boolean urlEncode) {
final EnableableAction action = new UrlPrefixNavigateAction(urlPrefix, urlEncode);
this.enableableActions.add(action);
return action;
}
public void addBookmark() {
final NavigationEntry entry = window.getCurrentNavigationEntry();
if (entry != null) {
final java.net.URL url = entry.getUrl();
final BookmarksHistory history = BookmarksHistory.getInstance();
BookmarkInfo existingInfo = history.getExistingInfo(url.toExternalForm());
if (existingInfo == null) {
existingInfo = new BookmarkInfo();
existingInfo.setUrl(url);
existingInfo.setTitle(entry.getTitle());
existingInfo.setDescription(entry.getDescription());
}
final java.awt.Window awtWindow = window.getAwtWindow();
if (!(awtWindow instanceof java.awt.Frame)) {
throw new java.lang.IllegalStateException("Bookmaks dialog only supported when an AWT Frame is available.");
}
final AddBookmarkDialog dialog = new AddBookmarkDialog((java.awt.Frame) awtWindow, true, existingInfo);
dialog.setTitle("Add/Edit Bookmark");
dialog.setLocationByPlatform(true);
// dialog.setLocationRelativeTo(window.getAwtFrame());
dialog.setResizable(false);
dialog.pack();
dialog.setVisible(true);
final BookmarkInfo info = dialog.getBookmarkInfo();
if (info != null) {
history.addAsRecent(info.getUrl(), info);
history.save();
}
}
}
public void searchBookmarks() {
final java.awt.Window awtWindow = window.getAwtWindow();
if (!(awtWindow instanceof java.awt.Frame)) {
throw new java.lang.IllegalStateException("Search dialog only supported when an AWT Frame is available.");
}
final SearchDialog dialog = new SearchDialog((java.awt.Frame) awtWindow, true,
"Keywords will be matched against URL, title, description and tags.");
dialog.setTitle("Search Bookmarks");
dialog.setLocationByPlatform(true);
dialog.setResizable(false);
dialog.setSize(new java.awt.Dimension(200, 100));
dialog.setVisible(true);
final String keywordsText = dialog.getSearchKeywords();
if (keywordsText != null) {
try {
window.getTopFrame().navigate("about:bookmark-search?" + java.net.URLEncoder.encode(keywordsText, "UTF-8"));
} catch (final Exception thrown) {
throw new IllegalStateException("not expected", thrown);
}
}
}
public void showPreferences() {
final java.awt.Window awtWindow = window.getAwtWindow();
if (!(awtWindow instanceof java.awt.Frame)) {
throw new java.lang.IllegalStateException("Preferences dialog only supported when an AWT Frame is available.");
}
final PreferencesDialog dialog = new PreferencesDialog((java.awt.Frame) awtWindow);
dialog.setTitle("Preferences");
dialog.setLocationByPlatform(true);
dialog.setSize(new java.awt.Dimension(600, 400));
dialog.setVisible(true);
}
abstract class EnableableAction extends AbstractAction {
private static final long serialVersionUID = -8020235092808317096L;
public abstract void updateEnabling();
}
class UrlPrefixNavigateAction extends EnableableAction {
private static final long serialVersionUID = 1891756423914184152L;
private final String urlPrefix;
private final boolean urlEncode;
public UrlPrefixNavigateAction(final String urlPrefix, final boolean urlEncode) {
super();
this.urlPrefix = urlPrefix;
this.urlEncode = urlEncode;
}
@Override
public void updateEnabling() {
final NavigationEntry entry = window.getCurrentNavigationEntry();
this.setEnabled((entry != null) && !entry.getUrl().toExternalForm().startsWith(this.urlPrefix));
}
public void actionPerformed(final ActionEvent e) {
final NavigationEntry entry = window.getCurrentNavigationEntry();
if (entry == null) {
return;
}
try {
final String roughLocation = this.urlPrefix
+ (this.urlEncode ? URLEncoder.encode(entry.getUrl().toExternalForm(), "UTF-8") : entry.getUrl().toExternalForm());
componentSource.navigate(roughLocation, RequestType.PROGRAMMATIC);
} catch (final java.io.UnsupportedEncodingException uee) {
// not expected - ignore
}
}
}
class GoAction extends AbstractAction {
private static final long serialVersionUID = -1290364681806794717L;
public void actionPerformed(final ActionEvent e) {
componentSource.go();
}
}
class SearchAction extends AbstractAction {
private static final long serialVersionUID = -736644335817165661L;
public void actionPerformed(final ActionEvent e) {
componentSource.search();
}
}
class ExitAction extends AbstractAction {
private static final long serialVersionUID = -8690289288514639028L;
public void actionPerformed(final ActionEvent e) {
window.dispose();
}
}
class BlankWindowAction extends AbstractAction {
private static final long serialVersionUID = -2907691954325659197L;
public void actionPerformed(final ActionEvent e) {
try {
window.getTopFrame().open("about:blank");
} catch (final java.net.MalformedURLException mfu) {
throw new IllegalStateException("not expected", mfu);
}
}
}
class ClonedWindowAction extends EnableableAction {
private static final long serialVersionUID = 7849950571587529087L;
@Override
public void updateEnabling() {
final NavigationEntry entry = window.getCurrentNavigationEntry();
this.setEnabled((entry != null) && entry.getMethod().equals("GET"));
}
public void actionPerformed(final ActionEvent e) {
final NavigationEntry entry = window.getCurrentNavigationEntry();
if ((entry != null) && entry.getMethod().equals("GET")) {
window.getTopFrame().open(entry.getUrl());
}
}
}
class OpenFileAction extends AbstractAction {
private static final long serialVersionUID = 2075598538762531969L;
public void actionPerformed(final ActionEvent e) {
final JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
final ToolsSettings settings = ToolsSettings.getInstance();
final java.io.File directory = settings.getOpenFileDirectory();
if (directory != null) {
fileChooser.setSelectedFile(directory);
}
final int returnValue = fileChooser.showOpenDialog(window.getTopFrame().getComponent());
if (returnValue == JFileChooser.APPROVE_OPTION) {
final java.io.File selectedFile = fileChooser.getSelectedFile();
componentSource.navigate(selectedFile.toURI().toString(), RequestType.PROGRAMMATIC);
settings.setOpenFileDirectory(selectedFile);
settings.save();
}
}
}
class AboutAction extends AbstractAction {
private static final long serialVersionUID = 2320751811484772090L;
final Properties relProps = PlatformInit.getInstance().relProps;
public void actionPerformed(final ActionEvent e) {
window.getTopFrame().alert(
"gngr, a pure java web browser.\r\n"
+ "Version " + relProps.getProperty(PlatformInit.RELEASE_VERSION_STRING) + "\r\n"
+ "Published on: " + relProps.getProperty(PlatformInit.RELEASE_VERSION_RELEASE_DATE) + "\r\n"
+ "copyright (c) 2014 Uproot Labs\r\n"
+ "copyright (c) 2005, 2008 The Lobo Project.\r\n"
+ window.getUserAgent().getInfoUrl());
}
}
class BackAction extends EnableableAction {
private static final long serialVersionUID = 876416274529605321L;
@Override
public void updateEnabling() {
this.setEnabled(window.canBack());
}
public void actionPerformed(final ActionEvent e) {
window.back();
}
}
class ForwardAction extends EnableableAction {
private static final long serialVersionUID = 1544065228410858406L;
@Override
public void updateEnabling() {
this.setEnabled(window.canForward());
}
public void actionPerformed(final ActionEvent e) {
window.forward();
}
}
class ReloadAction extends EnableableAction {
private static final long serialVersionUID = 6950917394367022620L;
@Override
public void updateEnabling() {
this.setEnabled(window.canReload());
}
public void actionPerformed(final ActionEvent e) {
window.reload();
}
}
class StopAction extends AbstractAction {
private static final long serialVersionUID = -4716824000957477580L;
public void actionPerformed(final ActionEvent e) {
window.stop();
}
}
class CopyAction extends EnableableAction {
private static final long serialVersionUID = -821273079984979618L;
@Override
public void updateEnabling() {
this.setEnabled(window.canCopy());
}
public void actionPerformed(final ActionEvent e) {
window.copy();
}
}
// class BookmarksAction extends AbstractAction {
// public void actionPerformed(ActionEvent e) {
// componentSource.populateBookmarks();
// }
// }
class BackMoreAction extends EnableableAction {
private static final long serialVersionUID = -6775521598700326951L;
@Override
public void updateEnabling() {
this.setEnabled(window.canBack());
}
public void actionPerformed(final ActionEvent e) {
// Only used for enabling
}
}
class ForwardMoreAction extends EnableableAction {
private static final long serialVersionUID = -495987330645982580L;
@Override
public void updateEnabling() {
this.setEnabled(window.canForward());
}
public void actionPerformed(final ActionEvent e) {
// Only used for enabling
}
}
class RecentHostsAction extends EnableableAction {
private static final long serialVersionUID = -8163457877234153277L;
@Override
public void updateEnabling() {
this.setEnabled(ComponentSource.hasRecentEntries());
}
public void actionPerformed(final ActionEvent e) {
componentSource.populateRecentHosts();
}
}
class SourceAction extends EnableableAction {
private static final long serialVersionUID = -4337186074519005342L;
@Override
public void updateEnabling() {
this.setEnabled(window.hasSource());
}
public void actionPerformed(final ActionEvent e) {
componentSource.showSource();
}
}
class ConsoleAction extends AbstractAction {
private static final long serialVersionUID = -515678211458153749L;
public void actionPerformed(final ActionEvent e) {
ComponentSource.showConsole();
}
}
class AddBookmarkAction extends AbstractAction {
private static final long serialVersionUID = 2056965796680821875L;
public void actionPerformed(final ActionEvent e) {
addBookmark();
}
}
class SearchBookmarksAction extends AbstractAction {
private static final long serialVersionUID = 3227135764906945380L;
public void actionPerformed(final ActionEvent e) {
searchBookmarks();
}
}
class ShowBookmarksAction extends AbstractAction {
private static final long serialVersionUID = -8180169982665670397L;
public void actionPerformed(final ActionEvent e) {
try {
window.getTopFrame().navigate("about:bookmarks");
} catch (final java.net.MalformedURLException mfu) {
throw new IllegalStateException("not expected", mfu);
}
}
}
// class ManageBookmarksAction extends AbstractAction {
// public void actionPerformed(ActionEvent e) {
// componentSource.manageBookmarks();
// }
// }
class NavigateAction extends AbstractAction {
private static final long serialVersionUID = 7673811833299305183L;
private final @NonNull URL url;
public NavigateAction(final @NonNull URL url) {
this.url = url;
}
public void actionPerformed(final ActionEvent e) {
componentSource.navigate(this.url);
}
}
class BookmarkNavigateAction extends AbstractAction {
private static final long serialVersionUID = -2300129158399659228L;
private final @NonNull URL url;
public BookmarkNavigateAction(final @NonNull URL url) {
this.url = url;
}
public void actionPerformed(final ActionEvent e) {
BookmarksHistory.getInstance().touch(this.url);
componentSource.navigate(this.url);
}
}
class GoToAction extends AbstractAction {
private static final long serialVersionUID = -2171834516485737367L;
private final NavigationEntry entry;
public GoToAction(final NavigationEntry entry) {
this.entry = entry;
}
public void actionPerformed(final ActionEvent e) {
window.goTo(this.entry);
}
}
class ListExtensionsAction extends AbstractAction {
private static final long serialVersionUID = 7111881447756445698L;
public void actionPerformed(final ActionEvent e) {
// TODO
}
}
class PreferencesAction extends AbstractAction {
private static final long serialVersionUID = -628816577052900379L;
public void actionPerformed(final ActionEvent e) {
showPreferences();
}
}
}