/* * #%L * gitools-ui-platform * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * 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 version 3 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 program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.ui.platform.panel; import org.gitools.ui.platform.settings.Settings; import org.gitools.utils.HttpUtils; import org.lobobrowser.html.FormInput; import org.lobobrowser.html.UserAgentContext; import org.lobobrowser.html.gui.HtmlPanel; import org.lobobrowser.html.test.SimpleHtmlRendererContext; import org.lobobrowser.html.test.SimpleUserAgentContext; import org.w3c.dom.html2.HTMLElement; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.net.Proxy; import java.net.URL; import java.util.HashMap; import java.util.Map; public class Html4Panel extends JPanel { HtmlPanel panel; SimpleHtmlRendererContext rcontext; public Html4Panel() { createComponents(); } private void createComponents() { panel = new HtmlPanel(); panel.setBackground(Color.WHITE); SimpleUserAgentContext agent = new SimpleUserAgentContext(); if (Settings.get().isProxyEnabled()) { agent.setProxy(Settings.get().getProxy()); } rcontext = new LocalHtmlRendererContext(panel, agent); setLayout(new BorderLayout()); add(panel, BorderLayout.CENTER); } private boolean linkClicked(HTMLElement linkNode) throws LinkVetoException { String rel = linkNode.getAttribute("rel"); String href = linkNode.getAttribute("href"); String target = linkNode.getAttribute("target"); if ("action".equalsIgnoreCase(rel)) { String name = href; Map<String, String> params = new HashMap<>(); int pos = href.indexOf('?'); if (pos >= 0) { name = href.substring(0, pos); String p1 = pos < href.length() ? href.substring(pos + 1) : ""; if (!p1.isEmpty()) { String[] p2 = p1.split("\\&"); for (String p3 : p2) { pos = p3.indexOf('='); if (pos > 0) { String id = p3.substring(0, pos); String value = pos < p3.length() ? p3.substring(pos + 1) : ""; params.put(id, value); } } } } performAction(name, params); throw new LinkVetoException(); } else if ("load".equalsIgnoreCase(rel)) { performLoad(href); } else if ("save".equalsIgnoreCase(rel)) { performSave(href); } else if ("_external".equalsIgnoreCase(target)) { HttpUtils.openURLInBrowser(href, getRootPane()); throw new LinkVetoException(); } else { return true; } return false; } protected void submitForm(String method, URL action, String target, String enctype, FormInput[] formInputs) throws LinkVetoException { } protected void performAction(String name, Map<String, String> params) { } protected void performLoad(String href) { } protected void performSave(String href) { } public void navigate(URL url) throws Exception { rcontext.navigate(url, "_this"); } public static class LinkVetoException extends Exception { public LinkVetoException() { } } private class LocalHtmlRendererContext extends SimpleHtmlRendererContext { public LocalHtmlRendererContext(HtmlPanel panel, UserAgentContext userAgentContext) { super(panel, userAgentContext); } @Override public void onMouseOver(HTMLElement element, MouseEvent event) { super.onMouseOver(element, event); Cursor cursor = null; if ("a".equalsIgnoreCase(element.getTagName())) { cursor = new Cursor(Cursor.HAND_CURSOR); } else { cursor = new Cursor(Cursor.DEFAULT_CURSOR); } setCursor(cursor); } @Override public void onMouseOut(HTMLElement element, MouseEvent event) { super.onMouseOut(element, event); Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR); setCursor(cursor); } @Override public boolean onMouseClick(HTMLElement element, MouseEvent event) { if ("a".equalsIgnoreCase(element.getTagName())) { try { return Html4Panel.this.linkClicked(element); } catch (LinkVetoException ex) { return false; } } return true; } @Override public void submitForm(String method, URL action, String target, String enctype, FormInput[] formInputs) { try { Html4Panel.this.submitForm(method, action, target, enctype, formInputs); super.submitForm(method, action, target, enctype, formInputs); } catch (LinkVetoException ex) { } } @Override protected Proxy getProxy() { return Settings.get().getProxy(); } } }