commit bbbb093b260bea9352e983607b39239931d2bdfc Author: wangbing Date: Tue May 14 23:19:20 2024 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e5dba25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +*.iml +.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bfda315 --- /dev/null +++ b/pom.xml @@ -0,0 +1,103 @@ + + + 4.0.0 + com.example + starter-jxbrowser + 0.0.1-SNAPSHOT + jar + + + UTF-8 + UTF-8 + 8 + true + + + + + + aliyun + Aliyun Repository + default + https://maven.aliyun.com/repository/public + + + + + + aliyun + Aliyun Repository + https://maven.aliyun.com/repository/public + default + + + + + + + com.melloware + jintellitype + 1.4.0 + + + + com + jxbrowser + 6.21 + system + ${project.basedir}/src/main/resources/lib/jxbrowser-6.21.jar + + + + com + jxbrowser-linux64 + 6.21 + system + ${project.basedir}/src/main/resources/lib/jxbrowser-linux64-6.21.jar + + + + com + jxbrowser-mac + 6.21 + system + ${project.basedir}/src/main/resources/lib/jxbrowser-mac-6.21.jar + + + + com + jxbrowser-win32 + 6.21 + system + ${project.basedir}/src/main/resources/lib/jxbrowser-win32-6.21.jar + + + + com + jxbrowser-win64 + 6.21 + system + ${project.basedir}/src/main/resources/lib/jxbrowser-win64-6.21.jar + + + + + ${artifactId}-${version} + + src/main/java + + + src/main/resources + + + + ${basedir}/src/main/resources/lib + BOOT-INF/lib/ + + *.jar + + + + + diff --git a/src/main/java/com/example/jxbrowser/AboutDialog.java b/src/main/java/com/example/jxbrowser/AboutDialog.java new file mode 100644 index 0000000..ca015f8 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/AboutDialog.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2000-2018 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.teamdev.jxbrowser.chromium.ProductInfo; + +import javax.swing.*; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.Calendar; + +/** + * @author TeamDev Ltd. + */ +public class AboutDialog extends JDialog { + public AboutDialog(Frame owner) { + super(owner, "About JxBrowser Demo", true); + initContent(); + initKeyStroke(); + setResizable(false); + pack(); + setLocationRelativeTo(owner); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + } + + private void initContent() { + JTextPane aboutText = new JTextPane(); + aboutText.setContentType("text/html"); + aboutText.setText("" + + "JxBrowser Demo

" + + "Version " + ProductInfo.getVersion() + "

" + + + "This application is created for demonstration purposes only.
" + + "© " + Calendar.getInstance().get(Calendar.YEAR) + + " TeamDev Ltd. All rights reserved.

" + + + "Powered by JxBrowser. See " + + "terms of use.
" + + + "Based on Chromium project. " + + "See full list of Chromium
components, " + + "used in the current JxBrowser version.

" + + + "This demo uses WebKit and FFMpeg projects under LGPL.
" + + + "See licence text " + + "LGPL v.2 and " + + "LGPL v.2.1
"); + aboutText.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + aboutText.setEditable(false); + aboutText.addHyperlinkListener(new HyperlinkListener() { + @SuppressWarnings("ParameterNameDiffersFromOverriddenParameter") + @Override + public void hyperlinkUpdate(HyperlinkEvent event) { + if (event.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { + try { + Desktop desktop = Desktop.getDesktop(); + desktop.browse(event.getURL().toURI()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + }); + add(aboutText, BorderLayout.CENTER); + } + + private void initKeyStroke() { + addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + dispose(); + } + } + }); + JRootPane rootPane = getRootPane(); + KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false); + rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "ESCAPE"); + rootPane.getActionMap().put("ESCAPE", new AbstractAction() { + private static final long serialVersionUID = 6693635607417495802L; + + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + } +} diff --git a/src/main/java/com/example/jxbrowser/CommandMenuItem.java b/src/main/java/com/example/jxbrowser/CommandMenuItem.java new file mode 100644 index 0000000..ca8807b --- /dev/null +++ b/src/main/java/com/example/jxbrowser/CommandMenuItem.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.teamdev.jxbrowser.chromium.EditorCommand; + +import javax.swing.*; + +/** + * @author Artem Trofimov + */ +public class CommandMenuItem extends JMenuItem { + + private final EditorCommand command; + + public CommandMenuItem(String commandName, EditorCommand command) { + super(commandName); + this.command = command; + } + + public EditorCommand getCommand() { + return command; + } +} diff --git a/src/main/java/com/example/jxbrowser/JSConsole.java b/src/main/java/com/example/jxbrowser/JSConsole.java new file mode 100644 index 0000000..d418a00 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/JSConsole.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.example.jxbrowser.resources.Resources; +import com.teamdev.jxbrowser.chromium.Browser; +import com.teamdev.jxbrowser.chromium.JSValue; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author TeamDev Ltd. + */ +public class JSConsole extends JPanel { + + private static final String NEW_LINE = "\n"; + private static final String QUERY_LINE_START = ">> "; + private final Browser browser; + private final ExecutorService executor; + private JTextArea console; + + public JSConsole(Browser browser) { + this.browser = browser; + this.executor = Executors.newCachedThreadPool(); + setLayout(new BorderLayout()); + add(createTitle(), BorderLayout.NORTH); + add(createConsoleOutput(), BorderLayout.CENTER); + add(createConsoleInput(), BorderLayout.SOUTH); + } + + private static JComponent createTitleLabel() { + return new JLabel("JavaScript Console"); + } + + private JComponent createConsoleInput() { + JPanel result = new JPanel(new BorderLayout()); + result.setBackground(Color.WHITE); + + JLabel label = new JLabel(QUERY_LINE_START); + label.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 0)); + + final JTextField consoleInput = new JTextField(); + consoleInput.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); + consoleInput.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + executor.submit(new Runnable() { + public void run() { + final String script = consoleInput.getText(); + JSValue jsValue = browser.executeJavaScriptAndReturnValue(script); + final String executionResult = jsValue.toString(); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + updateConsoleOutput(script, executionResult); + consoleInput.setText(""); + } + }); + } + }); + } + }); + result.add(label, BorderLayout.WEST); + result.add(consoleInput, BorderLayout.CENTER); + return result; + } + + private JComponent createConsoleOutput() { + console = new JTextArea(); + console.setFont(new Font("Consolas", Font.PLAIN, 12)); + console.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + console.setEditable(false); + console.setWrapStyleWord(true); + console.setLineWrap(true); + console.setText(""); + JScrollPane scrollPane = new JScrollPane(console); + scrollPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY)); + return scrollPane; + } + + private JComponent createTitle() { + JPanel panel = new JPanel(new BorderLayout()); +// panel.setBackground(new Color(182, 191, 207)); + panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + panel.add(createTitleLabel(), BorderLayout.WEST); + panel.add(createCloseButton(), BorderLayout.EAST); + return panel; + } + + private JComponent createCloseButton() { + JButton closeButton = new JButton(); + closeButton.setOpaque(false); + closeButton.setToolTipText("Close JavaScript Console"); + closeButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + closeButton.setPressedIcon(Resources.getIcon("close-pressed.png")); + closeButton.setIcon(Resources.getIcon("close.png")); + closeButton.setContentAreaFilled(false); + closeButton.setFocusable(false); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + firePropertyChange("JSConsoleClosed", false, true); + } + }); + return closeButton; + } + + private void updateConsoleOutput(String script, String executionResult) { + displayScript(script); + displayExecutionResult(executionResult); + console.setCaretPosition(console.getText().length()); + } + + private void displayExecutionResult(String result) { + console.append(result); + console.append(NEW_LINE); + } + + private void displayScript(String script) { + console.append(QUERY_LINE_START); + console.append(script); + console.append(NEW_LINE); + } +} diff --git a/src/main/java/com/example/jxbrowser/JxBrowserDemo.java b/src/main/java/com/example/jxbrowser/JxBrowserDemo.java new file mode 100644 index 0000000..51eabdd --- /dev/null +++ b/src/main/java/com/example/jxbrowser/JxBrowserDemo.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.example.jxbrowser.resources.Resources; +import com.teamdev.jxbrowser.chromium.ba; +import com.teamdev.jxbrowser.chromium.internal.Environment; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.math.BigInteger; + +/** + * @author TeamDev Ltd. + */ +public class JxBrowserDemo { + + static { + // 破解jxbrowser的代码块 导入下面的包是关键 + // import com.teamdev.jxbrowser.chromium.ba; + try { + Field e = ba.class.getDeclaredField("e"); + e.setAccessible(true); + Field f = ba.class.getDeclaredField("f"); + f.setAccessible(true); + Field modifersField = Field.class.getDeclaredField("modifiers"); + modifersField.setAccessible(true); + modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL); + modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + e.set(null, new BigInteger("1")); + f.set(null, new BigInteger("1")); + modifersField.setAccessible(false); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + + private static void initEnvironment() throws Exception { + System.setProperty("apple.laf.useScreenMenuBar", "true"); + System.setProperty("com.apple.mrj.application.apple.menu.about.name", "JxBrowser Demo"); + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + JPopupMenu.setDefaultLightWeightPopupEnabled(false); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); + } + + public static void main(String[] args) throws Exception { + initEnvironment(); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + initAndDisplayUI(); + } + }); + } + + private static void initAndDisplayUI() { + final TabbedPane tabbedPane = new TabbedPane(); + insertTab(tabbedPane, TabFactory.createFirstTab()); + insertNewTabButton(tabbedPane); + + JFrame frame = new JFrame("JxBrowser Demo"); + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.addWindowListener(new WindowAdapter() { + @SuppressWarnings("CallToSystemExit") + @Override + public void windowClosing(WindowEvent e) { + tabbedPane.disposeAllTabs(); + if (Environment.isMac()) { + System.exit(0); + } + } + }); + frame.add(tabbedPane, BorderLayout.CENTER); + frame.setSize(1024, 700); + frame.setLocationRelativeTo(null); +// frame.setIconImage(Resources.getIcon("jxbrowser16x16.png").getImage()); + frame.setVisible(true); + } + + private static void insertNewTabButton(final TabbedPane tabbedPane) { + TabButton button = new TabButton(Resources.getIcon("new-tab.png"), "New tab"); + button.addActionListener(new ActionListener() { + public void actionPerformed(final ActionEvent e) { + insertTab(tabbedPane, TabFactory.createTab()); + } + }); + tabbedPane.addTabButton(button); + } + + private static void insertTab(TabbedPane tabbedPane, Tab tab) { + tabbedPane.addTab(tab); + tabbedPane.selectTab(tab); + } +} diff --git a/src/main/java/com/example/jxbrowser/Tab.java b/src/main/java/com/example/jxbrowser/Tab.java new file mode 100644 index 0000000..16c5304 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/Tab.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +/** + * @author TeamDev Ltd. + */ +public class Tab { + + private final TabCaption caption; + private final TabContent content; + + public Tab(TabCaption caption, TabContent content) { + this.caption = caption; + this.content = content; + } + + public TabCaption getCaption() { + return caption; + } + + public TabContent getContent() { + return content; + } +} diff --git a/src/main/java/com/example/jxbrowser/TabButton.java b/src/main/java/com/example/jxbrowser/TabButton.java new file mode 100644 index 0000000..223fad1 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/TabButton.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import javax.swing.*; + +/** + * @author TeamDev Ltd. + */ +public class TabButton extends JButton { + + public TabButton(Icon icon, String toolTipText) { + setIcon(icon); + setToolTipText(toolTipText); + setOpaque(false); + setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + setContentAreaFilled(false); + setFocusable(false); + } + +} diff --git a/src/main/java/com/example/jxbrowser/TabCaption.java b/src/main/java/com/example/jxbrowser/TabCaption.java new file mode 100644 index 0000000..c3dd9b5 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/TabCaption.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + + +import com.example.jxbrowser.resources.Resources; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * @author TeamDev Ltd. + */ +public class TabCaption extends JPanel { + + private boolean selected; + private TabCaptionComponent component; + + public TabCaption() { + setLayout(new BorderLayout()); + setOpaque(false); + add(createComponent(), BorderLayout.CENTER); + add(Box.createHorizontalStrut(1), BorderLayout.EAST); + } + + private JComponent createComponent() { + component = new TabCaptionComponent(); + component.addPropertyChangeListener("CloseButtonPressed", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + firePropertyChange("CloseButtonPressed", evt.getOldValue(), evt.getNewValue()); + } + }); + component.addPropertyChangeListener("TabClicked", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + setSelected(true); + } + }); + return component; + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(155, 26); + } + + @Override + public Dimension getMinimumSize() { + return new Dimension(50, 26); + } + + @Override + public Dimension getMaximumSize() { + return getPreferredSize(); + } + + public void setTitle(String title) { + component.setTitle(title); + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + boolean oldValue = this.selected; + this.selected = selected; + component.setSelected(selected); + firePropertyChange("TabSelected", oldValue, selected); + } + + private static class TabCaptionComponent extends JPanel { + + private final Color defaultBackground; + private JLabel label; + + private TabCaptionComponent() { + defaultBackground = getBackground(); + setLayout(new BorderLayout()); + setOpaque(false); + add(createLabel(), BorderLayout.CENTER); + add(createCloseButton(), BorderLayout.EAST); + } + + private JComponent createLabel() { + label = new JLabel(); + label.setOpaque(false); + label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); + label.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + if (e.getButton() == MouseEvent.BUTTON1) { + firePropertyChange("TabClicked", false, true); + } + if (e.getButton() == MouseEvent.BUTTON2) { + firePropertyChange("CloseButtonPressed", false, true); + } + } + }); + return label; + } + + private JComponent createCloseButton() { + JButton closeButton = new JButton(); + closeButton.setOpaque(false); + closeButton.setToolTipText("Close"); + closeButton.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); + closeButton.setPressedIcon(Resources.getIcon("close-pressed.png")); + closeButton.setIcon(Resources.getIcon("close.png")); + closeButton.setContentAreaFilled(false); + closeButton.setFocusable(false); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + firePropertyChange("CloseButtonPressed", false, true); + } + }); + return closeButton; + } + + public void setTitle(final String title) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + label.setText(title); + label.setToolTipText(title); + } + }); + } + + public void setSelected(boolean selected) { + setBackground(selected ? defaultBackground : new Color(150, 150, 150)); + repaint(); + } + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g.create(); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setPaint( + new GradientPaint(0, 0, Color.LIGHT_GRAY, 0, getHeight(), getBackground())); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.dispose(); + super.paint(g); + } + } +} diff --git a/src/main/java/com/example/jxbrowser/TabCaptions.java b/src/main/java/com/example/jxbrowser/TabCaptions.java new file mode 100644 index 0000000..3ff61f5 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/TabCaptions.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import javax.swing.*; +import java.awt.*; + +/** + * @author TeamDev Ltd. + */ +public class TabCaptions extends JPanel { + + private TabCaption selectedTab; + + private JPanel tabsPane; + private JPanel buttonsPane; + + public TabCaptions() { + createUI(); + } + + private void createUI() { + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + setBackground(Color.DARK_GRAY); + add(createItemsPane()); + add(createButtonsPane()); + add(Box.createHorizontalGlue()); + } + + private JComponent createItemsPane() { + tabsPane = new JPanel(); + tabsPane.setOpaque(false); + tabsPane.setLayout(new BoxLayout(tabsPane, BoxLayout.X_AXIS)); + return tabsPane; + } + + private JComponent createButtonsPane() { + buttonsPane = new JPanel(); + buttonsPane.setOpaque(false); + buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.X_AXIS)); + return buttonsPane; + } + + public void addTab(TabCaption item) { + tabsPane.add(item); + } + + public void removeTab(TabCaption item) { + tabsPane.remove(item); + } + + public void addTabButton(TabButton button) { + buttonsPane.add(button); + } + + public TabCaption getSelectedTab() { + return selectedTab; + } + + public void setSelectedTab(TabCaption selectedTab) { + this.selectedTab = selectedTab; + this.selectedTab.setSelected(true); + } +} diff --git a/src/main/java/com/example/jxbrowser/TabContent.java b/src/main/java/com/example/jxbrowser/TabContent.java new file mode 100644 index 0000000..f0d3bda --- /dev/null +++ b/src/main/java/com/example/jxbrowser/TabContent.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent; +import com.teamdev.jxbrowser.chromium.events.LoadAdapter; +import com.teamdev.jxbrowser.chromium.events.TitleEvent; +import com.teamdev.jxbrowser.chromium.events.TitleListener; +import com.teamdev.jxbrowser.chromium.swing.BrowserView; + +import javax.swing.*; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * @author TeamDev Ltd. + */ +public class TabContent extends JPanel { + + private final BrowserView browserView; + private final ToolBar toolBar; + private final JComponent jsConsole; + private final JComponent container; + private final JComponent browserContainer; + + public TabContent(final BrowserView browserView) { + this.browserView = browserView; + this.browserView.getBrowser().addLoadListener(new LoadAdapter() { + @Override + public void onFinishLoadingFrame(FinishLoadingEvent event) { + if (event.isMainFrame()) { + firePropertyChange("PageTitleChanged", null, + TabContent.this.browserView.getBrowser().getTitle()); + } + } + }); + + this.browserView.getBrowser().addTitleListener(new TitleListener() { + @Override + public void onTitleChange(TitleEvent event) { + firePropertyChange("PageTitleChanged", null, event.getTitle()); + } + }); + + browserContainer = createBrowserContainer(); + jsConsole = createConsole(); + toolBar = createToolBar(browserView); + + container = new JPanel(new BorderLayout()); + container.add(browserContainer, BorderLayout.CENTER); + + setLayout(new BorderLayout()); + add(toolBar, BorderLayout.NORTH); + add(container, BorderLayout.CENTER); + } + + private ToolBar createToolBar(BrowserView browserView) { + ToolBar toolBar = new ToolBar(browserView); + toolBar.addPropertyChangeListener("TabClosed", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + firePropertyChange("TabClosed", false, true); + } + }); + toolBar.addPropertyChangeListener("JSConsoleDisplayed", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + showConsole(); + } + }); + toolBar.addPropertyChangeListener("JSConsoleClosed", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + hideConsole(); + } + }); + return toolBar; + } + + private void hideConsole() { + showComponent(browserContainer); + } + + private void showComponent(JComponent component) { + container.removeAll(); + container.add(component, BorderLayout.CENTER); + validate(); + } + + private void showConsole() { + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + splitPane.add(browserContainer, JSplitPane.TOP); + splitPane.add(jsConsole, JSplitPane.BOTTOM); + splitPane.setResizeWeight(0.8); + splitPane.setBorder(BorderFactory.createEmptyBorder()); + showComponent(splitPane); + } + + private JComponent createConsole() { + JSConsole result = new JSConsole(browserView.getBrowser()); + result.addPropertyChangeListener("JSConsoleClosed", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + hideConsole(); + toolBar.didJSConsoleClose(); + } + }); + return result; + } + + private JComponent createBrowserContainer() { + JPanel container = new JPanel(new BorderLayout()); + container.add(browserView, BorderLayout.CENTER); + return container; + } + + public void dispose() { + browserView.getBrowser().dispose(); + } +} diff --git a/src/main/java/com/example/jxbrowser/TabFactory.java b/src/main/java/com/example/jxbrowser/TabFactory.java new file mode 100644 index 0000000..cf7ea9e --- /dev/null +++ b/src/main/java/com/example/jxbrowser/TabFactory.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.teamdev.jxbrowser.chromium.Browser; +import com.teamdev.jxbrowser.chromium.swing.BrowserView; +import com.teamdev.jxbrowser.chromium.swing.DefaultDialogHandler; +import com.teamdev.jxbrowser.chromium.swing.DefaultDownloadHandler; +import com.teamdev.jxbrowser.chromium.swing.DefaultPopupHandler; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * @author TeamDev Ltd. + */ +public final class TabFactory { + + public static Tab createFirstTab() { + return createTab("https://www.teamdev.com/jxbrowser"); + } + + public static Tab createTab() { + return createTab("about:blank"); + } + + public static Tab createTab(String url) { + Browser browser = new Browser(); + BrowserView browserView = new BrowserView(browser); + TabContent tabContent = new TabContent(browserView); + + browser.setDownloadHandler(new DefaultDownloadHandler(browserView)); + browser.setDialogHandler(new DefaultDialogHandler(browserView)); + browser.setPopupHandler(new DefaultPopupHandler()); + + final TabCaption tabCaption = new TabCaption(); + tabCaption.setTitle("about:blank"); + + tabContent.addPropertyChangeListener("PageTitleChanged", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + tabCaption.setTitle((String) evt.getNewValue()); + } + }); + + browser.loadURL(url); + return new Tab(tabCaption, tabContent); + } +} diff --git a/src/main/java/com/example/jxbrowser/TabbedPane.java b/src/main/java/com/example/jxbrowser/TabbedPane.java new file mode 100644 index 0000000..6a70172 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/TabbedPane.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import javax.swing.*; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.List; + +/** + * @author TeamDev Ltd. + */ +public class TabbedPane extends JPanel { + + private final List tabs; + private final TabCaptions captions; + private final JComponent contentContainer; + + public TabbedPane() { + this.captions = new TabCaptions(); + this.tabs = new ArrayList(); + this.contentContainer = new JPanel(new BorderLayout()); + + setLayout(new BorderLayout()); + add(captions, BorderLayout.NORTH); + add(contentContainer, BorderLayout.CENTER); + } + + public void disposeAllTabs() { + for (Tab tab : getTabs()) { + disposeTab(tab); + } + } + + private void disposeTab(Tab tab) { + tab.getCaption().setSelected(false); + tab.getContent().dispose(); + removeTab(tab); + if (hasTabs()) { + Tab firstTab = getFirstTab(); + firstTab.getCaption().setSelected(true); + } else { + Window window = SwingUtilities.getWindowAncestor(this); + if (window != null) { + window.setVisible(false); + window.dispose(); + } + } + } + + private Tab findTab(TabCaption item) { + for (Tab tab : getTabs()) { + if (tab.getCaption().equals(item)) { + return tab; + } + } + return null; + } + + public void addTab(final Tab tab) { + TabCaption caption = tab.getCaption(); + caption.addPropertyChangeListener("CloseButtonPressed", new TabCaptionCloseTabListener()); + caption.addPropertyChangeListener("TabSelected", new SelectTabListener()); + + TabContent content = tab.getContent(); + content.addPropertyChangeListener("TabClosed", new TabContentCloseTabListener()); + + captions.addTab(caption); + tabs.add(tab); + validate(); + repaint(); + } + + private boolean hasTabs() { + return !tabs.isEmpty(); + } + + private Tab getFirstTab() { + return tabs.get(0); + } + + private List getTabs() { + return new ArrayList(tabs); + } + + public void removeTab(Tab tab) { + TabCaption tabCaption = tab.getCaption(); + captions.removeTab(tabCaption); + tabs.remove(tab); + validate(); + repaint(); + } + + public void addTabButton(TabButton button) { + captions.addTabButton(button); + } + + public void selectTab(Tab tab) { + TabCaption tabCaption = tab.getCaption(); + TabCaption selectedTab = captions.getSelectedTab(); + if (selectedTab != null && !selectedTab.equals(tabCaption)) { + selectedTab.setSelected(false); + } + captions.setSelectedTab(tabCaption); + } + + private class TabCaptionCloseTabListener implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent evt) { + TabCaption caption = (TabCaption) evt.getSource(); + Tab tab = findTab(caption); + disposeTab(tab); + } + } + + private class SelectTabListener implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent evt) { + TabCaption caption = (TabCaption) evt.getSource(); + Tab tab = findTab(caption); + if (caption.isSelected()) { + selectTab(tab); + } + if (!caption.isSelected()) { + TabContent content = tab.getContent(); + contentContainer.remove(content); + contentContainer.validate(); + contentContainer.repaint(); + } else { + final TabContent content = tab.getContent(); + contentContainer.add(content, BorderLayout.CENTER); + contentContainer.validate(); + contentContainer.repaint(); + } + } + } + + private class TabContentCloseTabListener implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent evt) { + TabContent content = (TabContent) evt.getSource(); + Tab tab = findTab(content); + disposeTab(tab); + } + + private Tab findTab(TabContent content) { + for (Tab tab : getTabs()) { + if (tab.getContent().equals(content)) { + return tab; + } + } + return null; + } + } +} diff --git a/src/main/java/com/example/jxbrowser/ToolBar.java b/src/main/java/com/example/jxbrowser/ToolBar.java new file mode 100644 index 0000000..db03a8a --- /dev/null +++ b/src/main/java/com/example/jxbrowser/ToolBar.java @@ -0,0 +1,582 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser; + +import com.example.jxbrowser.resources.Resources; +import com.teamdev.jxbrowser.chromium.Browser; +import com.teamdev.jxbrowser.chromium.BrowserPreferences; +import com.teamdev.jxbrowser.chromium.EditorCommand; +import com.teamdev.jxbrowser.chromium.SavePageType; +import com.teamdev.jxbrowser.chromium.events.Callback; +import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent; +import com.teamdev.jxbrowser.chromium.events.LoadAdapter; +import com.teamdev.jxbrowser.chromium.events.ProvisionalLoadingEvent; +import com.teamdev.jxbrowser.chromium.events.StartLoadingEvent; +import com.teamdev.jxbrowser.chromium.swing.BrowserView; + +import javax.swing.*; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; + +/** + * @author TeamDev Ltd. + */ +public class ToolBar extends JPanel { + private static final String RUN_JAVASCRIPT = "Run JavaScript..."; + private static final String CLOSE_JAVASCRIPT = "Close JavaScript Console"; + private static final String DEFAULT_URL = "about:blank"; + private final JTextField addressBar; + private final BrowserView browserView; + private JButton backwardButton; + private JButton forwardButton; + private JButton refreshButton; + private JButton stopButton; + private JMenuItem consoleMenuItem; + + public ToolBar(BrowserView browserView) { + this.browserView = browserView; + addressBar = createAddressBar(); + setLayout(new GridBagLayout()); + add(createActionsPane(), + new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, + GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + add(addressBar, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, + GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(4, 0, 4, 5), 0, 0)); + add(createMenuButton(), new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, + GridBagConstraints.LINE_END, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 5), + 0, 0)); + } + + private static JButton createBackwardButton(final Browser browser) { + return createButton("Back", new AbstractAction() { + public void actionPerformed(ActionEvent e) { + browser.goBack(); + } + }); + } + + private static JButton createForwardButton(final Browser browser) { + return createButton("Forward", new AbstractAction() { + public void actionPerformed(ActionEvent e) { + browser.goForward(); + } + }); + } + + private static JButton createRefreshButton(final Browser browser) { + return createButton("Refresh", new AbstractAction() { + public void actionPerformed(ActionEvent e) { + browser.reload(); + } + }); + } + + private static JButton createStopButton(final Browser browser) { + return createButton("Stop", new AbstractAction() { + public void actionPerformed(ActionEvent e) { + browser.stop(); + } + }); + } + + private static JButton createButton(String caption, Action action) { + ActionButton button = new ActionButton(caption, action); + String imageName = caption.toLowerCase(); + button.setIcon(Resources.getIcon(imageName + ".png")); + button.setRolloverIcon(Resources.getIcon(imageName + "-selected.png")); + return button; + } + + private static JCheckBoxMenuItem createCheckBoxMenuItem(String title, boolean selected, + final CheckBoxMenuItemCallback action) { + final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(title, selected); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + action.call(menuItem.isSelected()); + } + }); + return menuItem; + } + + public void didJSConsoleClose() { + consoleMenuItem.setText(RUN_JAVASCRIPT); + } + + private JPanel createActionsPane() { + backwardButton = createBackwardButton(browserView.getBrowser()); + forwardButton = createForwardButton(browserView.getBrowser()); + refreshButton = createRefreshButton(browserView.getBrowser()); + stopButton = createStopButton(browserView.getBrowser()); + + JPanel actionsPanel = new JPanel(); + actionsPanel.add(backwardButton); + actionsPanel.add(forwardButton); + actionsPanel.add(refreshButton); + actionsPanel.add(stopButton); + return actionsPanel; + } + + private JTextField createAddressBar() { + final JTextField result = new JTextField(DEFAULT_URL); + result.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL(result.getText()); + } + }); + + browserView.getBrowser().addLoadListener(new LoadAdapter() { + @Override + public void onStartLoadingFrame(StartLoadingEvent event) { + if (event.isMainFrame()) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + refreshButton.setEnabled(false); + stopButton.setEnabled(true); + } + }); + } + } + + @Override + public void onProvisionalLoadingFrame(final ProvisionalLoadingEvent event) { + if (event.isMainFrame()) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + result.setText(event.getURL()); + result.setCaretPosition(result.getText().length()); + + Browser browser = event.getBrowser(); + forwardButton.setEnabled(browser.canGoForward()); + backwardButton.setEnabled(browser.canGoBack()); + } + }); + } + } + + @Override + public void onFinishLoadingFrame(final FinishLoadingEvent event) { + if (event.isMainFrame()) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + refreshButton.setEnabled(true); + stopButton.setEnabled(false); + } + }); + } + } + }); + return result; + } + + private JComponent createMenuButton() { + final JPopupMenu popupMenu = new JPopupMenu(); + popupMenu.add(createConsoleMenuItem()); + popupMenu.add(createGetHTMLMenuItem()); + popupMenu.add(createPopupsMenuItem()); + popupMenu.add(createUploadFileMenuItem()); + popupMenu.add(createDownloadFileMenuItem()); + popupMenu.add(createJavaScriptDialogsMenuItem()); + popupMenu.add(createPDFViewerMenuItem()); + popupMenu.add(createFlashMenuItem()); + popupMenu.add(createGoogleMapsMenuItem()); + popupMenu.add(createHTML5VideoMenuItem()); + popupMenu.add(createZoomInMenuItem()); + popupMenu.add(createZoomOutMenuItem()); + popupMenu.add(createActualSizeMenuItem()); + popupMenu.add(createSaveWebPageMenuItem()); + popupMenu.add(createClearCacheMenuItem()); + popupMenu.add(createPreferencesSubMenu()); + popupMenu.add(createExecuteCommandSubMenu()); + popupMenu.add(createPrintMenuItem()); + popupMenu.addSeparator(); + popupMenu.add(createMoreMenuItem()); + popupMenu.addSeparator(); + popupMenu.add(createAboutMenuItem()); + + final ActionButton button = new ActionButton("Preferences", null); + button.setIcon(Resources.getIcon("gear.png")); + button.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { + popupMenu.show(e.getComponent(), 0, button.getHeight()); + } else { + popupMenu.setVisible(false); + } + } + }); + return button; + } + + private Component createPrintMenuItem() { + JMenuItem menuItem = new JMenuItem("Print..."); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().print(); + } + }); + return menuItem; + } + + private Component createPreferencesSubMenu() { + JMenu menu = new JMenu("Preferences"); + BrowserPreferences preferences = browserView.getBrowser().getPreferences(); + menu.add(createCheckBoxMenuItem("JavaScript Enabled", preferences.isJavaScriptEnabled(), + new CheckBoxMenuItemCallback() { + public void call(boolean selected) { + BrowserPreferences preferences = browserView.getBrowser().getPreferences(); + preferences.setJavaScriptEnabled(selected); + browserView.getBrowser().setPreferences(preferences); + browserView.getBrowser().reloadIgnoringCache(); + } + })); + menu.add(createCheckBoxMenuItem("Images Enabled", preferences.isImagesEnabled(), + new CheckBoxMenuItemCallback() { + public void call(boolean selected) { + BrowserPreferences preferences = browserView.getBrowser().getPreferences(); + preferences.setImagesEnabled(selected); + browserView.getBrowser().setPreferences(preferences); + browserView.getBrowser().reloadIgnoringCache(); + } + })); + menu.add(createCheckBoxMenuItem("Plugins Enabled", preferences.isPluginsEnabled(), + new CheckBoxMenuItemCallback() { + public void call(boolean selected) { + BrowserPreferences preferences = browserView.getBrowser().getPreferences(); + preferences.setPluginsEnabled(selected); + browserView.getBrowser().setPreferences(preferences); + browserView.getBrowser().reloadIgnoringCache(); + } + })); + menu.add(createCheckBoxMenuItem("JavaScript Can Access Clipboard", + preferences.isJavaScriptCanAccessClipboard(), new CheckBoxMenuItemCallback() { + public void call(boolean selected) { + BrowserPreferences preferences = browserView.getBrowser().getPreferences(); + preferences.setJavaScriptCanAccessClipboard(selected); + browserView.getBrowser().setPreferences(preferences); + browserView.getBrowser().reloadIgnoringCache(); + } + })); + menu.add(createCheckBoxMenuItem("JavaScript Can Open Windows", + preferences.isJavaScriptCanOpenWindowsAutomatically(), + new CheckBoxMenuItemCallback() { + public void call(boolean selected) { + BrowserPreferences preferences = browserView.getBrowser().getPreferences(); + preferences.setJavaScriptCanOpenWindowsAutomatically(selected); + browserView.getBrowser().setPreferences(preferences); + browserView.getBrowser().reloadIgnoringCache(); + } + })); + return menu; + } + + private Component createClearCacheMenuItem() { + JMenuItem menuItem = new JMenuItem("Clear Cache"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().getCacheStorage().clearCache(new Callback() { + public void invoke() { + JOptionPane.showMessageDialog(browserView, "Cache is cleared successfully.", + "Clear Cache", JOptionPane.INFORMATION_MESSAGE); + } + }); + } + }); + return menuItem; + } + + private Component createExecuteCommandSubMenu() { + final JMenu menu = new JMenu("Execute Command"); + menu.addMenuListener(new MenuListener() { + public void menuSelected(MenuEvent e) { + Component[] menuItems = menu.getMenuComponents(); + for (Component menuItem : menuItems) { + menuItem.setEnabled(browserView.getBrowser() + .isCommandEnabled(((CommandMenuItem) menuItem).getCommand())); + } + } + + public void menuDeselected(MenuEvent e) { + + } + + public void menuCanceled(MenuEvent e) { + + } + }); + + menu.add(createExecuteCommandSubMenuItem("Cut", EditorCommand.CUT)); + menu.add(createExecuteCommandSubMenuItem("Copy", EditorCommand.COPY)); + menu.add(createExecuteCommandSubMenuItem("Paste", EditorCommand.PASTE)); + menu.add(createExecuteCommandSubMenuItem("Select All", EditorCommand.SELECT_ALL)); + menu.add(createExecuteCommandSubMenuItem("Unselect", EditorCommand.UNSELECT)); + menu.add(createExecuteCommandSubMenuItem("Undo", EditorCommand.UNDO)); + menu.add(createExecuteCommandSubMenuItem("Redo", EditorCommand.REDO)); + menu.add(createExecuteCommandSubMenuItem("Insert Text...", "Insert Text", + EditorCommand.INSERT_TEXT)); + menu.add(createExecuteCommandSubMenuItem("Find Text...", "Find Text", + EditorCommand.FIND_STRING)); + return menu; + } + + private Component createExecuteCommandSubMenuItem(final String commandName, + final EditorCommand command) { + final CommandMenuItem menuItem = new CommandMenuItem(commandName, command); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().executeCommand(command); + } + }); + return menuItem; + } + + private Component createExecuteCommandSubMenuItem(final String commandName, + final String dialogTitle, final EditorCommand command) { + final CommandMenuItem menuItem = new CommandMenuItem(commandName, command); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String value = JOptionPane + .showInputDialog(browserView, "Command value:", dialogTitle, + JOptionPane.PLAIN_MESSAGE); + browserView.getBrowser().executeCommand(command, value); + } + }); + return menuItem; + } + + private Component createMoreMenuItem() { + JMenuItem menuItem = new JMenuItem("More Features..."); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL( + "https://jxbrowser.support.teamdev.com/support/solutions/9000049010"); + } + }); + return menuItem; + } + + private Component createSaveWebPageMenuItem() { + JMenuItem menuItem = new JMenuItem("Save Web Page..."); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setSelectedFile(new File("my-web-page.html")); + int result = fileChooser.showSaveDialog(browserView); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + String dirPath = new File(selectedFile.getParent(), "resources") + .getAbsolutePath(); + browserView.getBrowser().saveWebPage(selectedFile.getAbsolutePath(), dirPath, + SavePageType.COMPLETE_HTML); + } + } + }); + return menuItem; + } + + private Component createActualSizeMenuItem() { + JMenuItem menuItem = new JMenuItem("Actual Size"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().zoomReset(); + } + }); + return menuItem; + } + + private Component createZoomOutMenuItem() { + JMenuItem menuItem = new JMenuItem("Zoom Out"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().zoomOut(); + } + }); + return menuItem; + } + + private Component createZoomInMenuItem() { + JMenuItem menuItem = new JMenuItem("Zoom In"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().zoomIn(); + } + }); + return menuItem; + } + + private Component createHTML5VideoMenuItem() { + JMenuItem menuItem = new JMenuItem("HTML5 Video"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser() + .loadURL("http://www.w3.org/2010/05/video/mediaevents.html"); + } + }); + return menuItem; + } + + private Component createGoogleMapsMenuItem() { + JMenuItem menuItem = new JMenuItem("Google Maps"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL("https://maps.google.com/"); + } + }); + return menuItem; + } + + private Component createJavaScriptDialogsMenuItem() { + JMenuItem menuItem = new JMenuItem("JavaScript Dialogs"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL("http://www.javascripter.net/faq/alert.htm"); + } + }); + return menuItem; + } + + private Component createDownloadFileMenuItem() { + JMenuItem menuItem = new JMenuItem("Download File"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL( + "https://s3.amazonaws.com/cloud.teamdev.com/downloads/demo/jxbrowserdemo.jnlp"); + } + }); + return menuItem; + } + + private Component createGetHTMLMenuItem() { + JMenuItem menuItem = new JMenuItem("Get HTML"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String html = browserView.getBrowser().getHTML(); + Window window = SwingUtilities.getWindowAncestor(browserView); + JDialog dialog = new JDialog(window); + dialog.setModal(true); + dialog.setContentPane(new JScrollPane(new JTextArea(html))); + dialog.setSize(700, 500); + dialog.setLocationRelativeTo(null); + dialog.setVisible(true); + + } + }); + return menuItem; + } + + private JMenuItem createConsoleMenuItem() { + consoleMenuItem = new JMenuItem(RUN_JAVASCRIPT); + consoleMenuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (RUN_JAVASCRIPT.equals(consoleMenuItem.getText())) { + consoleMenuItem.setText(CLOSE_JAVASCRIPT); + firePropertyChange("JSConsoleDisplayed", false, true); + } else { + consoleMenuItem.setText(RUN_JAVASCRIPT); + firePropertyChange("JSConsoleClosed", false, true); + } + } + }); + return consoleMenuItem; + } + + private JMenuItem createUploadFileMenuItem() { + JMenuItem menuItem = new JMenuItem("Upload File"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser() + .loadURL("http://www.cs.tut.fi/~jkorpela/forms/file.html#example"); + } + }); + return menuItem; + } + + private JMenuItem createPopupsMenuItem() { + JMenuItem menuItem = new JMenuItem("Popup Windows"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL("http://www.popuptest.com"); + } + }); + return menuItem; + } + + private JMenuItem createPDFViewerMenuItem() { + JMenuItem menuItem = new JMenuItem("PDF Viewer"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL("http://www.orimi.com/pdf-test.pdf"); + } + }); + return menuItem; + } + + private JMenuItem createFlashMenuItem() { + JMenuItem menuItem = new JMenuItem("Adobe Flash"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + browserView.getBrowser().loadURL("http://helpx.adobe.com/flash-player.html"); + } + }); + return menuItem; + } + + private JMenuItem createAboutMenuItem() { + JMenuItem menuItem = new JMenuItem("About JxBrowser Demo"); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Frame parentFrame = (Frame) SwingUtilities.getWindowAncestor(ToolBar.this); + AboutDialog aboutDialog = new AboutDialog(parentFrame); + aboutDialog.setVisible(true); + } + }); + return menuItem; + } + + private boolean isFocusRequired() { + String url = addressBar.getText(); + return url.isEmpty() || url.equals(DEFAULT_URL); + } + + @Override + public void addNotify() { + super.addNotify(); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (isFocusRequired()) { + addressBar.requestFocus(); + addressBar.selectAll(); + } + } + }); + } + + private interface CheckBoxMenuItemCallback { + void call(boolean selected); + } + + private static class ActionButton extends JButton { + private ActionButton(String hint, Action action) { + super(action); + setContentAreaFilled(false); + setBorder(BorderFactory.createEmptyBorder()); + setBorderPainted(false); + setRolloverEnabled(true); + setToolTipText(hint); + setText(null); + setFocusable(false); + setDefaultCapable(false); + } + } +} diff --git a/src/main/java/com/example/jxbrowser/resources/Resources.java b/src/main/java/com/example/jxbrowser/resources/Resources.java new file mode 100644 index 0000000..35453a6 --- /dev/null +++ b/src/main/java/com/example/jxbrowser/resources/Resources.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2000-2017 TeamDev Ltd. All rights reserved. + * TeamDev PROPRIETARY and CONFIDENTIAL. + * Use is subject to license terms. + */ + +package com.example.jxbrowser.resources; + +import javax.swing.*; + +public class Resources { + + public static ImageIcon getIcon(String fileName) { +// return new ImageIcon(Resources.class.getResource(fileName)); + return null; + } +} diff --git a/src/main/java/com/example/jxbrowser/resources/back-selected.png b/src/main/java/com/example/jxbrowser/resources/back-selected.png new file mode 100644 index 0000000..84e6d6e Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/back-selected.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/back.png b/src/main/java/com/example/jxbrowser/resources/back.png new file mode 100644 index 0000000..fe03a8e Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/back.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/close-pressed.png b/src/main/java/com/example/jxbrowser/resources/close-pressed.png new file mode 100644 index 0000000..5841e70 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/close-pressed.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/close.png b/src/main/java/com/example/jxbrowser/resources/close.png new file mode 100644 index 0000000..a1eebf4 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/close.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/forward-selected.png b/src/main/java/com/example/jxbrowser/resources/forward-selected.png new file mode 100644 index 0000000..3cb3bc8 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/forward-selected.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/forward.png b/src/main/java/com/example/jxbrowser/resources/forward.png new file mode 100644 index 0000000..9d7d1e0 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/forward.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/gear.png b/src/main/java/com/example/jxbrowser/resources/gear.png new file mode 100644 index 0000000..a6385fd Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/gear.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/go.png b/src/main/java/com/example/jxbrowser/resources/go.png new file mode 100644 index 0000000..2b5ccca Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/go.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/home-selected.png b/src/main/java/com/example/jxbrowser/resources/home-selected.png new file mode 100644 index 0000000..874785d Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/home-selected.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/home.png b/src/main/java/com/example/jxbrowser/resources/home.png new file mode 100644 index 0000000..55a12fd Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/home.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/jxbrowser16x16.png b/src/main/java/com/example/jxbrowser/resources/jxbrowser16x16.png new file mode 100644 index 0000000..20b1fef Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/jxbrowser16x16.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/jxbrowser32x32.png b/src/main/java/com/example/jxbrowser/resources/jxbrowser32x32.png new file mode 100644 index 0000000..9013da2 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/jxbrowser32x32.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/new-tab.png b/src/main/java/com/example/jxbrowser/resources/new-tab.png new file mode 100644 index 0000000..2ab5c16 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/new-tab.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/refresh-selected.png b/src/main/java/com/example/jxbrowser/resources/refresh-selected.png new file mode 100644 index 0000000..e0773cc Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/refresh-selected.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/refresh.png b/src/main/java/com/example/jxbrowser/resources/refresh.png new file mode 100644 index 0000000..fabdef1 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/refresh.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/stop-selected.png b/src/main/java/com/example/jxbrowser/resources/stop-selected.png new file mode 100644 index 0000000..c04fe88 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/stop-selected.png differ diff --git a/src/main/java/com/example/jxbrowser/resources/stop.png b/src/main/java/com/example/jxbrowser/resources/stop.png new file mode 100644 index 0000000..6e12306 Binary files /dev/null and b/src/main/java/com/example/jxbrowser/resources/stop.png differ diff --git a/src/main/resources/META-INF/teamdev.licenses b/src/main/resources/META-INF/teamdev.licenses new file mode 100644 index 0000000..cb17ce1 --- /dev/null +++ b/src/main/resources/META-INF/teamdev.licenses @@ -0,0 +1,12 @@ +Product: JxBrowser +Version: 6.x +Licensed to:Enterprise +License type: Enterprise +License info: JxBrowser Demo License +Expiration date: 01-01-9999 +Support expiration date: NO SUPPORT +Generation date: 01-01-9999 +Platforms: win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64 +Company name: TeamDev Ltd. +SigB: 1 +SigA: 1 \ No newline at end of file diff --git a/src/main/resources/lib/jxbrowser-6.21.jar b/src/main/resources/lib/jxbrowser-6.21.jar new file mode 100644 index 0000000..0c727a5 Binary files /dev/null and b/src/main/resources/lib/jxbrowser-6.21.jar differ diff --git a/src/main/resources/lib/jxbrowser-linux64-6.21.jar b/src/main/resources/lib/jxbrowser-linux64-6.21.jar new file mode 100644 index 0000000..2b91684 Binary files /dev/null and b/src/main/resources/lib/jxbrowser-linux64-6.21.jar differ diff --git a/src/main/resources/lib/jxbrowser-mac-6.21.jar b/src/main/resources/lib/jxbrowser-mac-6.21.jar new file mode 100644 index 0000000..e5fe7f0 Binary files /dev/null and b/src/main/resources/lib/jxbrowser-mac-6.21.jar differ diff --git a/src/main/resources/lib/jxbrowser-win32-6.21.jar b/src/main/resources/lib/jxbrowser-win32-6.21.jar new file mode 100644 index 0000000..2551d3c Binary files /dev/null and b/src/main/resources/lib/jxbrowser-win32-6.21.jar differ diff --git a/src/main/resources/lib/jxbrowser-win64-6.21.jar b/src/main/resources/lib/jxbrowser-win64-6.21.jar new file mode 100644 index 0000000..9eedef7 Binary files /dev/null and b/src/main/resources/lib/jxbrowser-win64-6.21.jar differ