Download Jar. Uses 3874K of libraries. Click here for Pure Java version (6640L/45K).
1 | !7 |
2 | |
3 | lib 1400047 // jxbrowser icons |
4 | |
5 | import com.teamdev.jxbrowser.chromium.demo.resources.Resources; |
6 | import com.teamdev.jxbrowser.chromium.events.Callback; |
7 | import com.teamdev.jxbrowser.chromium.*; |
8 | import com.teamdev.jxbrowser.chromium.events.*; |
9 | import com.teamdev.jxbrowser.chromium.internal.Environment; |
10 | import com.teamdev.jxbrowser.chromium.swing.*; |
11 | |
12 | import java.beans.*; |
13 | |
14 | p-subst {
|
15 | jxBrowser_init(); |
16 | final JDesktopPane desktop = jDesktopPane(); |
17 | showMaximizedFrame(desktop); |
18 | |
19 | swing {
|
20 | final new TabbedPane tabbedPane; |
21 | tabbedPane.addAndSelectTab(TabFactory.createTab("http://BotCompany.de"));
|
22 | tabbedPane.insertNewTabButton(); |
23 | |
24 | onInternalFrameClosing(addInternalFrame(desktop, "Browser", tabbedPane), |
25 | r { tabbedPane.disposeAllTabs() });
|
26 | } |
27 | } |
28 | |
29 | sclass TabbedPane extends JPanel {
|
30 | private final List<Tab> tabs; |
31 | private final TabCaptions captions; |
32 | private final JComponent contentContainer; |
33 | |
34 | public TabbedPane() {
|
35 | this.captions = new TabCaptions(); |
36 | this.tabs = new ArrayList<Tab>(); |
37 | this.contentContainer = new JPanel(new BorderLayout()); |
38 | |
39 | setLayout(new BorderLayout()); |
40 | add(captions, BorderLayout.NORTH); |
41 | add(contentContainer, BorderLayout.CENTER); |
42 | } |
43 | |
44 | void insertNewTabButton() {
|
45 | TabButton button = new TabButton(Resources.getIcon("new-tab.png"), "New tab");
|
46 | button.addActionListener(actionListener {
|
47 | addAndSelectTab(TabFactory.createTab()); |
48 | }); |
49 | addTabButton(button); |
50 | } |
51 | |
52 | public void disposeAllTabs() {
|
53 | for (Tab tab : getTabs()) {
|
54 | disposeTab(tab); |
55 | } |
56 | } |
57 | |
58 | private void disposeTab(Tab tab) {
|
59 | tab.getCaption().setSelected(false); |
60 | tab.getContent().dispose(); |
61 | removeTab(tab); |
62 | if (hasTabs()) {
|
63 | Tab firstTab = getFirstTab(); |
64 | firstTab.getCaption().setSelected(true); |
65 | } else |
66 | disposeInternalFrame(this); |
67 | } |
68 | |
69 | private Tab findTab(TabCaption item) {
|
70 | for (Tab tab : getTabs()) {
|
71 | if (tab.getCaption().equals(item)) {
|
72 | return tab; |
73 | } |
74 | } |
75 | return null; |
76 | } |
77 | |
78 | |
79 | void addAndSelectTab(Tab tab) {
|
80 | addTab(tab); |
81 | selectTab(tab); |
82 | } |
83 | |
84 | public void addTab(final Tab tab) {
|
85 | TabCaption caption = tab.getCaption(); |
86 | caption.addPropertyChangeListener("CloseButtonPressed", new TabCaptionCloseTabListener());
|
87 | caption.addPropertyChangeListener("TabSelected", new SelectTabListener());
|
88 | |
89 | TabContent content = tab.getContent(); |
90 | content.addPropertyChangeListener("TabClosed", new TabContentCloseTabListener());
|
91 | |
92 | captions.addTab(caption); |
93 | tabs.add(tab); |
94 | validate(); |
95 | repaint(); |
96 | } |
97 | |
98 | private boolean hasTabs() {
|
99 | return !tabs.isEmpty(); |
100 | } |
101 | |
102 | private Tab getFirstTab() {
|
103 | return tabs.get(0); |
104 | } |
105 | |
106 | private List<Tab> getTabs() {
|
107 | return new ArrayList<Tab>(tabs); |
108 | } |
109 | |
110 | public void removeTab(Tab tab) {
|
111 | TabCaption tabCaption = tab.getCaption(); |
112 | captions.removeTab(tabCaption); |
113 | tabs.remove(tab); |
114 | validate(); |
115 | repaint(); |
116 | } |
117 | |
118 | public void addTabButton(TabButton button) {
|
119 | captions.addTabButton(button); |
120 | } |
121 | |
122 | public void selectTab(Tab tab) {
|
123 | TabCaption tabCaption = tab.getCaption(); |
124 | TabCaption selectedTab = captions.getSelectedTab(); |
125 | if (selectedTab != null && !selectedTab.equals(tabCaption)) {
|
126 | selectedTab.setSelected(false); |
127 | } |
128 | captions.setSelectedTab(tabCaption); |
129 | } |
130 | |
131 | private class TabCaptionCloseTabListener implements PropertyChangeListener {
|
132 | public void propertyChange(PropertyChangeEvent evt) {
|
133 | TabCaption caption = (TabCaption) evt.getSource(); |
134 | Tab tab = findTab(caption); |
135 | disposeTab(tab); |
136 | } |
137 | } |
138 | |
139 | private class SelectTabListener implements PropertyChangeListener {
|
140 | public void propertyChange(PropertyChangeEvent evt) {
|
141 | TabCaption caption = (TabCaption) evt.getSource(); |
142 | Tab tab = findTab(caption); |
143 | if (caption.isSelected()) {
|
144 | selectTab(tab); |
145 | } |
146 | if (!caption.isSelected()) {
|
147 | TabContent content = tab.getContent(); |
148 | contentContainer.remove(content); |
149 | contentContainer.validate(); |
150 | contentContainer.repaint(); |
151 | } else {
|
152 | final TabContent content = tab.getContent(); |
153 | contentContainer.add(content, BorderLayout.CENTER); |
154 | contentContainer.validate(); |
155 | contentContainer.repaint(); |
156 | } |
157 | } |
158 | } |
159 | |
160 | private class TabContentCloseTabListener implements PropertyChangeListener {
|
161 | public void propertyChange(PropertyChangeEvent evt) {
|
162 | TabContent content = (TabContent) evt.getSource(); |
163 | Tab tab = findTab(content); |
164 | disposeTab(tab); |
165 | } |
166 | |
167 | private Tab findTab(TabContent content) {
|
168 | for (Tab tab : getTabs()) {
|
169 | if (tab.getContent().equals(content)) {
|
170 | return tab; |
171 | } |
172 | } |
173 | return null; |
174 | } |
175 | } |
176 | } |
177 | |
178 | static class TabFactory {
|
179 | |
180 | public static Tab createTab() {
|
181 | return createTab("about:blank");
|
182 | } |
183 | |
184 | public static Tab createTab(String url) {
|
185 | Browser browser = new Browser(BrowserType.LIGHTWEIGHT); |
186 | BrowserView browserView = new BrowserView(browser); |
187 | TabContent tabContent = new TabContent(browserView); |
188 | |
189 | browser.setDownloadHandler(new DefaultDownloadHandler(browserView)); |
190 | browser.setDialogHandler(new DefaultDialogHandler(browserView)); |
191 | browser.setPopupHandler(new DefaultPopupHandler()); |
192 | |
193 | final TabCaption tabCaption = new TabCaption(); |
194 | tabCaption.setTitle("about:blank");
|
195 | |
196 | tabContent.addPropertyChangeListener("PageTitleChanged", new PropertyChangeListener() {
|
197 | public void propertyChange(PropertyChangeEvent evt) {
|
198 | tabCaption.setTitle((String) evt.getNewValue()); |
199 | } |
200 | }); |
201 | |
202 | browser.loadURL(url); |
203 | return new Tab(tabCaption, tabContent); |
204 | } |
205 | } |
206 | |
207 | sclass Tab {
|
208 | |
209 | private final TabCaption caption; |
210 | private final TabContent content; |
211 | |
212 | public Tab(TabCaption caption, TabContent content) {
|
213 | this.caption = caption; |
214 | this.content = content; |
215 | } |
216 | |
217 | public TabCaption getCaption() {
|
218 | return caption; |
219 | } |
220 | |
221 | public TabContent getContent() {
|
222 | return content; |
223 | } |
224 | } |
225 | |
226 | sclass TabButton extends JButton {
|
227 | |
228 | public TabButton(Icon icon, String toolTipText) {
|
229 | setIcon(icon); |
230 | setToolTipText(toolTipText); |
231 | setOpaque(false); |
232 | setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); |
233 | setContentAreaFilled(false); |
234 | setFocusable(false); |
235 | } |
236 | |
237 | } |
238 | |
239 | sclass TabCaption extends JPanel {
|
240 | |
241 | private boolean selected; |
242 | private TabCaptionComponent component; |
243 | |
244 | public TabCaption() {
|
245 | setLayout(new BorderLayout()); |
246 | setOpaque(false); |
247 | add(createComponent(), BorderLayout.CENTER); |
248 | add(Box.createHorizontalStrut(1), BorderLayout.EAST); |
249 | } |
250 | |
251 | private JComponent createComponent() {
|
252 | component = new TabCaptionComponent(); |
253 | component.addPropertyChangeListener("CloseButtonPressed", new PropertyChangeListener() {
|
254 | public void propertyChange(PropertyChangeEvent evt) {
|
255 | firePropertyChange("CloseButtonPressed", evt.getOldValue(), evt.getNewValue());
|
256 | } |
257 | }); |
258 | component.addPropertyChangeListener("TabClicked", new PropertyChangeListener() {
|
259 | public void propertyChange(PropertyChangeEvent evt) {
|
260 | setSelected(true); |
261 | } |
262 | }); |
263 | return component; |
264 | } |
265 | |
266 | @Override |
267 | public Dimension getPreferredSize() {
|
268 | return new Dimension(155, 26); |
269 | } |
270 | |
271 | @Override |
272 | public Dimension getMinimumSize() {
|
273 | return new Dimension(50, 26); |
274 | } |
275 | |
276 | @Override |
277 | public Dimension getMaximumSize() {
|
278 | return getPreferredSize(); |
279 | } |
280 | |
281 | public void setTitle(String title) {
|
282 | component.setTitle(title); |
283 | } |
284 | |
285 | public boolean isSelected() {
|
286 | return selected; |
287 | } |
288 | |
289 | public void setSelected(boolean selected) {
|
290 | boolean oldValue = this.selected; |
291 | this.selected = selected; |
292 | component.setSelected(selected); |
293 | firePropertyChange("TabSelected", oldValue, selected);
|
294 | } |
295 | |
296 | private static class TabCaptionComponent extends JPanel {
|
297 | |
298 | private final Color defaultBackground; |
299 | private JLabel label; |
300 | |
301 | private TabCaptionComponent() {
|
302 | defaultBackground = getBackground(); |
303 | setLayout(new BorderLayout()); |
304 | setOpaque(false); |
305 | add(createLabel(), BorderLayout.CENTER); |
306 | add(createCloseButton(), BorderLayout.EAST); |
307 | } |
308 | |
309 | private JComponent createLabel() {
|
310 | label = new JLabel(); |
311 | label.setOpaque(false); |
312 | label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); |
313 | label.addMouseListener(new MouseAdapter() {
|
314 | @Override |
315 | public void mousePressed(MouseEvent e) {
|
316 | if (e.getButton() == MouseEvent.BUTTON1) {
|
317 | firePropertyChange("TabClicked", false, true);
|
318 | } |
319 | if (e.getButton() == MouseEvent.BUTTON2) {
|
320 | firePropertyChange("CloseButtonPressed", false, true);
|
321 | } |
322 | } |
323 | }); |
324 | return label; |
325 | } |
326 | |
327 | private JComponent createCloseButton() {
|
328 | JButton closeButton = new JButton(); |
329 | closeButton.setOpaque(false); |
330 | closeButton.setToolTipText("Close");
|
331 | closeButton.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); |
332 | closeButton.setPressedIcon(Resources.getIcon("close-pressed.png"));
|
333 | closeButton.setIcon(Resources.getIcon("close.png"));
|
334 | closeButton.setContentAreaFilled(false); |
335 | closeButton.setFocusable(false); |
336 | closeButton.addActionListener(new ActionListener() {
|
337 | public void actionPerformed(ActionEvent e) {
|
338 | firePropertyChange("CloseButtonPressed", false, true);
|
339 | } |
340 | }); |
341 | return closeButton; |
342 | } |
343 | |
344 | public void setTitle(final String title) {
|
345 | SwingUtilities.invokeLater(new Runnable() {
|
346 | public void run() {
|
347 | label.setText(title); |
348 | label.setToolTipText(title); |
349 | } |
350 | }); |
351 | } |
352 | |
353 | public void setSelected(boolean selected) {
|
354 | setBackground(selected ? defaultBackground : new Color(150, 150, 150)); |
355 | repaint(); |
356 | } |
357 | |
358 | @Override |
359 | public void paint(Graphics g) {
|
360 | Graphics2D g2d = (Graphics2D) g.create(); |
361 | g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, |
362 | RenderingHints.VALUE_ANTIALIAS_ON); |
363 | g2d.setPaint( |
364 | new GradientPaint(0, 0, Color.LIGHT_GRAY, 0, getHeight(), getBackground())); |
365 | g2d.fillRect(0, 0, getWidth(), getHeight()); |
366 | g2d.dispose(); |
367 | super.paint(g); |
368 | } |
369 | } |
370 | } |
371 | |
372 | sclass TabCaptions extends JPanel {
|
373 | |
374 | private TabCaption selectedTab; |
375 | |
376 | private JPanel tabsPane; |
377 | private JPanel buttonsPane; |
378 | |
379 | public TabCaptions() {
|
380 | createUI(); |
381 | } |
382 | |
383 | private void createUI() {
|
384 | setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); |
385 | setBackground(Color.DARK_GRAY); |
386 | add(createItemsPane()); |
387 | add(createButtonsPane()); |
388 | add(Box.createHorizontalGlue()); |
389 | } |
390 | |
391 | private JComponent createItemsPane() {
|
392 | tabsPane = new JPanel(); |
393 | tabsPane.setOpaque(false); |
394 | tabsPane.setLayout(new BoxLayout(tabsPane, BoxLayout.X_AXIS)); |
395 | return tabsPane; |
396 | } |
397 | |
398 | private JComponent createButtonsPane() {
|
399 | buttonsPane = new JPanel(); |
400 | buttonsPane.setOpaque(false); |
401 | buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.X_AXIS)); |
402 | return buttonsPane; |
403 | } |
404 | |
405 | public void addTab(TabCaption item) {
|
406 | tabsPane.add(item); |
407 | } |
408 | |
409 | public void removeTab(TabCaption item) {
|
410 | tabsPane.remove(item); |
411 | } |
412 | |
413 | public void addTabButton(TabButton button) {
|
414 | buttonsPane.add(button); |
415 | } |
416 | |
417 | public TabCaption getSelectedTab() {
|
418 | return selectedTab; |
419 | } |
420 | |
421 | public void setSelectedTab(TabCaption selectedTab) {
|
422 | this.selectedTab = selectedTab; |
423 | this.selectedTab.setSelected(true); |
424 | } |
425 | } |
426 | |
427 | sclass TabContent extends JPanel {
|
428 | |
429 | private final BrowserView browserView; |
430 | private final ToolBar toolBar; |
431 | private final JComponent jsConsole; |
432 | private final JComponent container; |
433 | private final JComponent browserContainer; |
434 | |
435 | public TabContent(final BrowserView browserView) {
|
436 | this.browserView = browserView; |
437 | this.browserView.getBrowser().addLoadListener(new LoadAdapter() {
|
438 | @Override |
439 | public void onFinishLoadingFrame(FinishLoadingEvent event) {
|
440 | if (event.isMainFrame()) {
|
441 | firePropertyChange("PageTitleChanged", null,
|
442 | TabContent.this.browserView.getBrowser().getTitle()); |
443 | } |
444 | } |
445 | }); |
446 | |
447 | this.browserView.getBrowser().addTitleListener(new TitleListener() {
|
448 | @Override |
449 | public void onTitleChange(TitleEvent event) {
|
450 | firePropertyChange("PageTitleChanged", null, event.getTitle());
|
451 | } |
452 | }); |
453 | |
454 | browserContainer = createBrowserContainer(); |
455 | jsConsole = createConsole(); |
456 | toolBar = createToolBar(browserView); |
457 | |
458 | container = new JPanel(new BorderLayout()); |
459 | container.add(browserContainer, BorderLayout.CENTER); |
460 | |
461 | setLayout(new BorderLayout()); |
462 | add(toolBar, BorderLayout.NORTH); |
463 | add(container, BorderLayout.CENTER); |
464 | } |
465 | |
466 | private ToolBar createToolBar(BrowserView browserView) {
|
467 | ToolBar toolBar = new ToolBar(browserView); |
468 | toolBar.addPropertyChangeListener("TabClosed", new PropertyChangeListener() {
|
469 | public void propertyChange(PropertyChangeEvent evt) {
|
470 | firePropertyChange("TabClosed", false, true);
|
471 | } |
472 | }); |
473 | toolBar.addPropertyChangeListener("JSConsoleDisplayed", new PropertyChangeListener() {
|
474 | public void propertyChange(PropertyChangeEvent evt) {
|
475 | showConsole(); |
476 | } |
477 | }); |
478 | toolBar.addPropertyChangeListener("JSConsoleClosed", new PropertyChangeListener() {
|
479 | public void propertyChange(PropertyChangeEvent evt) {
|
480 | hideConsole(); |
481 | } |
482 | }); |
483 | return toolBar; |
484 | } |
485 | |
486 | private void hideConsole() {
|
487 | showComponent(browserContainer); |
488 | } |
489 | |
490 | private void showComponent(JComponent component) {
|
491 | container.removeAll(); |
492 | container.add(component, BorderLayout.CENTER); |
493 | validate(); |
494 | } |
495 | |
496 | private void showConsole() {
|
497 | JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); |
498 | splitPane.add(browserContainer, JSplitPane.TOP); |
499 | splitPane.add(jsConsole, JSplitPane.BOTTOM); |
500 | splitPane.setResizeWeight(0.8); |
501 | splitPane.setBorder(BorderFactory.createEmptyBorder()); |
502 | showComponent(splitPane); |
503 | } |
504 | |
505 | private JComponent createConsole() {
|
506 | JSConsole result = new JSConsole(browserView.getBrowser()); |
507 | result.addPropertyChangeListener("JSConsoleClosed", new PropertyChangeListener() {
|
508 | public void propertyChange(PropertyChangeEvent evt) {
|
509 | hideConsole(); |
510 | toolBar.didJSConsoleClose(); |
511 | } |
512 | }); |
513 | return result; |
514 | } |
515 | |
516 | private JComponent createBrowserContainer() {
|
517 | JPanel container = new JPanel(new BorderLayout()); |
518 | container.add(browserView, BorderLayout.CENTER); |
519 | return container; |
520 | } |
521 | |
522 | public void dispose() {
|
523 | browserView.getBrowser().dispose(); |
524 | } |
525 | } |
526 | |
527 | sclass ToolBar extends JPanel {
|
528 | private static final String RUN_JAVASCRIPT = "Run JavaScript..."; |
529 | private static final String CLOSE_JAVASCRIPT = "Close JavaScript Console"; |
530 | private static final String DEFAULT_URL = "about:blank"; |
531 | private final JTextField addressBar; |
532 | private final BrowserView browserView; |
533 | private JButton backwardButton; |
534 | private JButton forwardButton; |
535 | private JButton refreshButton; |
536 | private JButton stopButton; |
537 | private JMenuItem consoleMenuItem; |
538 | |
539 | public ToolBar(BrowserView browserView) {
|
540 | this.browserView = browserView; |
541 | addressBar = createAddressBar(); |
542 | setLayout(new GridBagLayout()); |
543 | add(createActionsPane(), |
544 | new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, |
545 | GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); |
546 | add(addressBar, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, |
547 | GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(4, 0, 4, 5), 0, 0)); |
548 | add(createMenuButton(), new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, |
549 | GridBagConstraints.LINE_END, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 5), |
550 | 0, 0)); |
551 | } |
552 | |
553 | private static JButton createBackwardButton(final Browser browser) {
|
554 | return createButton("Back", new AbstractAction() {
|
555 | public void actionPerformed(ActionEvent e) {
|
556 | browser.goBack(); |
557 | } |
558 | }); |
559 | } |
560 | |
561 | private static JButton createForwardButton(final Browser browser) {
|
562 | return createButton("Forward", new AbstractAction() {
|
563 | public void actionPerformed(ActionEvent e) {
|
564 | browser.goForward(); |
565 | } |
566 | }); |
567 | } |
568 | |
569 | private static JButton createRefreshButton(final Browser browser) {
|
570 | return createButton("Refresh", new AbstractAction() {
|
571 | public void actionPerformed(ActionEvent e) {
|
572 | browser.reload(); |
573 | } |
574 | }); |
575 | } |
576 | |
577 | private static JButton createStopButton(final Browser browser) {
|
578 | return createButton("Stop", new AbstractAction() {
|
579 | public void actionPerformed(ActionEvent e) {
|
580 | browser.stop(); |
581 | } |
582 | }); |
583 | } |
584 | |
585 | private static JButton createButton(String caption, Action action) {
|
586 | ActionButton button = new ActionButton(caption, action); |
587 | String imageName = caption.toLowerCase(); |
588 | button.setIcon(Resources.getIcon(imageName + ".png")); |
589 | button.setRolloverIcon(Resources.getIcon(imageName + "-selected.png")); |
590 | return button; |
591 | } |
592 | |
593 | private static JCheckBoxMenuItem createCheckBoxMenuItem(String title, boolean selected, |
594 | final CheckBoxMenuItemCallback action) {
|
595 | final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(title, selected); |
596 | menuItem.addActionListener(new ActionListener() {
|
597 | public void actionPerformed(ActionEvent e) {
|
598 | action.call(menuItem.isSelected()); |
599 | } |
600 | }); |
601 | return menuItem; |
602 | } |
603 | |
604 | public void didJSConsoleClose() {
|
605 | consoleMenuItem.setText(RUN_JAVASCRIPT); |
606 | } |
607 | |
608 | private JPanel createActionsPane() {
|
609 | backwardButton = createBackwardButton(browserView.getBrowser()); |
610 | forwardButton = createForwardButton(browserView.getBrowser()); |
611 | refreshButton = createRefreshButton(browserView.getBrowser()); |
612 | stopButton = createStopButton(browserView.getBrowser()); |
613 | |
614 | JPanel actionsPanel = new JPanel(); |
615 | actionsPanel.add(backwardButton); |
616 | actionsPanel.add(forwardButton); |
617 | actionsPanel.add(refreshButton); |
618 | actionsPanel.add(stopButton); |
619 | return actionsPanel; |
620 | } |
621 | |
622 | private JTextField createAddressBar() {
|
623 | final JTextField result = new JTextField(DEFAULT_URL); |
624 | result.addActionListener(new ActionListener() {
|
625 | public void actionPerformed(ActionEvent e) {
|
626 | browserView.getBrowser().loadURL(result.getText()); |
627 | } |
628 | }); |
629 | |
630 | browserView.getBrowser().addLoadListener(new LoadAdapter() {
|
631 | @Override |
632 | public void onStartLoadingFrame(StartLoadingEvent event) {
|
633 | if (event.isMainFrame()) {
|
634 | SwingUtilities.invokeLater(new Runnable() {
|
635 | public void run() {
|
636 | refreshButton.setEnabled(false); |
637 | stopButton.setEnabled(true); |
638 | } |
639 | }); |
640 | } |
641 | } |
642 | |
643 | @Override |
644 | public void onProvisionalLoadingFrame(final ProvisionalLoadingEvent event) {
|
645 | if (event.isMainFrame()) {
|
646 | SwingUtilities.invokeLater(new Runnable() {
|
647 | @Override |
648 | public void run() {
|
649 | result.setText(event.getURL()); |
650 | result.setCaretPosition(result.getText().length()); |
651 | |
652 | Browser browser = event.getBrowser(); |
653 | forwardButton.setEnabled(browser.canGoForward()); |
654 | backwardButton.setEnabled(browser.canGoBack()); |
655 | } |
656 | }); |
657 | } |
658 | } |
659 | |
660 | @Override |
661 | public void onFinishLoadingFrame(final FinishLoadingEvent event) {
|
662 | if (event.isMainFrame()) {
|
663 | SwingUtilities.invokeLater(new Runnable() {
|
664 | public void run() {
|
665 | refreshButton.setEnabled(true); |
666 | stopButton.setEnabled(false); |
667 | } |
668 | }); |
669 | } |
670 | } |
671 | }); |
672 | return result; |
673 | } |
674 | |
675 | private JComponent createMenuButton() {
|
676 | final JPopupMenu popupMenu = new JPopupMenu(); |
677 | popupMenu.add(createConsoleMenuItem()); |
678 | popupMenu.add(createGetHTMLMenuItem()); |
679 | popupMenu.add(createPopupsMenuItem()); |
680 | popupMenu.add(createUploadFileMenuItem()); |
681 | popupMenu.add(createDownloadFileMenuItem()); |
682 | popupMenu.add(createJavaScriptDialogsMenuItem()); |
683 | popupMenu.add(createPDFViewerMenuItem()); |
684 | popupMenu.add(createFlashMenuItem()); |
685 | popupMenu.add(createGoogleMapsMenuItem()); |
686 | popupMenu.add(createHTML5VideoMenuItem()); |
687 | popupMenu.add(createZoomInMenuItem()); |
688 | popupMenu.add(createZoomOutMenuItem()); |
689 | popupMenu.add(createActualSizeMenuItem()); |
690 | popupMenu.add(createSaveWebPageMenuItem()); |
691 | popupMenu.add(createClearCacheMenuItem()); |
692 | popupMenu.add(createPreferencesSubMenu()); |
693 | popupMenu.add(createExecuteCommandSubMenu()); |
694 | popupMenu.add(createPrintMenuItem()); |
695 | popupMenu.addSeparator(); |
696 | popupMenu.add(createMoreMenuItem()); |
697 | popupMenu.addSeparator(); |
698 | //popupMenu.add(createAboutMenuItem()); |
699 | |
700 | final ActionButton button = new ActionButton("Preferences", null);
|
701 | button.setIcon(Resources.getIcon("gear.png"));
|
702 | button.addMouseListener(new MouseAdapter() {
|
703 | public void mousePressed(MouseEvent e) {
|
704 | if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
|
705 | popupMenu.show(e.getComponent(), 0, button.getHeight()); |
706 | } else {
|
707 | popupMenu.setVisible(false); |
708 | } |
709 | } |
710 | }); |
711 | return button; |
712 | } |
713 | |
714 | private Component createPrintMenuItem() {
|
715 | JMenuItem menuItem = new JMenuItem("Print...");
|
716 | menuItem.addActionListener(new ActionListener() {
|
717 | public void actionPerformed(ActionEvent e) {
|
718 | browserView.getBrowser().print(); |
719 | } |
720 | }); |
721 | return menuItem; |
722 | } |
723 | |
724 | private Component createPreferencesSubMenu() {
|
725 | JMenu menu = new JMenu("Preferences");
|
726 | BrowserPreferences preferences = browserView.getBrowser().getPreferences(); |
727 | menu.add(createCheckBoxMenuItem("JavaScript Enabled", preferences.isJavaScriptEnabled(),
|
728 | new CheckBoxMenuItemCallback() {
|
729 | public void call(boolean selected) {
|
730 | BrowserPreferences preferences = browserView.getBrowser().getPreferences(); |
731 | preferences.setJavaScriptEnabled(selected); |
732 | browserView.getBrowser().setPreferences(preferences); |
733 | browserView.getBrowser().reloadIgnoringCache(); |
734 | } |
735 | })); |
736 | menu.add(createCheckBoxMenuItem("Images Enabled", preferences.isImagesEnabled(),
|
737 | new CheckBoxMenuItemCallback() {
|
738 | public void call(boolean selected) {
|
739 | BrowserPreferences preferences = browserView.getBrowser().getPreferences(); |
740 | preferences.setImagesEnabled(selected); |
741 | browserView.getBrowser().setPreferences(preferences); |
742 | browserView.getBrowser().reloadIgnoringCache(); |
743 | } |
744 | })); |
745 | menu.add(createCheckBoxMenuItem("Plugins Enabled", preferences.isPluginsEnabled(),
|
746 | new CheckBoxMenuItemCallback() {
|
747 | public void call(boolean selected) {
|
748 | BrowserPreferences preferences = browserView.getBrowser().getPreferences(); |
749 | preferences.setPluginsEnabled(selected); |
750 | browserView.getBrowser().setPreferences(preferences); |
751 | browserView.getBrowser().reloadIgnoringCache(); |
752 | } |
753 | })); |
754 | menu.add(createCheckBoxMenuItem("JavaScript Can Access Clipboard",
|
755 | preferences.isJavaScriptCanAccessClipboard(), new CheckBoxMenuItemCallback() {
|
756 | public void call(boolean selected) {
|
757 | BrowserPreferences preferences = browserView.getBrowser().getPreferences(); |
758 | preferences.setJavaScriptCanAccessClipboard(selected); |
759 | browserView.getBrowser().setPreferences(preferences); |
760 | browserView.getBrowser().reloadIgnoringCache(); |
761 | } |
762 | })); |
763 | menu.add(createCheckBoxMenuItem("JavaScript Can Open Windows",
|
764 | preferences.isJavaScriptCanOpenWindowsAutomatically(), |
765 | new CheckBoxMenuItemCallback() {
|
766 | public void call(boolean selected) {
|
767 | BrowserPreferences preferences = browserView.getBrowser().getPreferences(); |
768 | preferences.setJavaScriptCanOpenWindowsAutomatically(selected); |
769 | browserView.getBrowser().setPreferences(preferences); |
770 | browserView.getBrowser().reloadIgnoringCache(); |
771 | } |
772 | })); |
773 | return menu; |
774 | } |
775 | |
776 | private Component createClearCacheMenuItem() {
|
777 | JMenuItem menuItem = new JMenuItem("Clear Cache");
|
778 | menuItem.addActionListener(new ActionListener() {
|
779 | public void actionPerformed(ActionEvent e) {
|
780 | browserView.getBrowser().getCacheStorage().clearCache(new Callback() {
|
781 | public void invoke() {
|
782 | JOptionPane.showMessageDialog(browserView, "Cache is cleared successfully.", |
783 | "Clear Cache", JOptionPane.INFORMATION_MESSAGE); |
784 | } |
785 | }); |
786 | } |
787 | }); |
788 | return menuItem; |
789 | } |
790 | |
791 | private Component createExecuteCommandSubMenu() {
|
792 | final JMenu menu = new JMenu("Execute Command");
|
793 | menu.addMenuListener(new MenuListener() {
|
794 | public void menuSelected(MenuEvent e) {
|
795 | Component[] menuItems = menu.getMenuComponents(); |
796 | for (Component menuItem : menuItems) {
|
797 | menuItem.setEnabled(browserView.getBrowser() |
798 | .isCommandEnabled(((CommandMenuItem) menuItem).getCommand())); |
799 | } |
800 | } |
801 | |
802 | public void menuDeselected(MenuEvent e) {
|
803 | |
804 | } |
805 | |
806 | public void menuCanceled(MenuEvent e) {
|
807 | |
808 | } |
809 | }); |
810 | |
811 | menu.add(createExecuteCommandSubMenuItem("Cut", EditorCommand.CUT));
|
812 | menu.add(createExecuteCommandSubMenuItem("Copy", EditorCommand.COPY));
|
813 | menu.add(createExecuteCommandSubMenuItem("Paste", EditorCommand.PASTE));
|
814 | menu.add(createExecuteCommandSubMenuItem("Select All", EditorCommand.SELECT_ALL));
|
815 | menu.add(createExecuteCommandSubMenuItem("Unselect", EditorCommand.UNSELECT));
|
816 | menu.add(createExecuteCommandSubMenuItem("Undo", EditorCommand.UNDO));
|
817 | menu.add(createExecuteCommandSubMenuItem("Redo", EditorCommand.REDO));
|
818 | menu.add(createExecuteCommandSubMenuItem("Insert Text...", "Insert Text",
|
819 | EditorCommand.INSERT_TEXT)); |
820 | menu.add(createExecuteCommandSubMenuItem("Find Text...", "Find Text",
|
821 | EditorCommand.FIND_STRING)); |
822 | return menu; |
823 | } |
824 | |
825 | private Component createExecuteCommandSubMenuItem(final String commandName, |
826 | final EditorCommand command) {
|
827 | final CommandMenuItem menuItem = new CommandMenuItem(commandName, command); |
828 | menuItem.addActionListener(new ActionListener() {
|
829 | public void actionPerformed(ActionEvent e) {
|
830 | browserView.getBrowser().executeCommand(command); |
831 | } |
832 | }); |
833 | return menuItem; |
834 | } |
835 | |
836 | private Component createExecuteCommandSubMenuItem(final String commandName, |
837 | final String dialogTitle, final EditorCommand command) {
|
838 | final CommandMenuItem menuItem = new CommandMenuItem(commandName, command); |
839 | menuItem.addActionListener(new ActionListener() {
|
840 | public void actionPerformed(ActionEvent e) {
|
841 | String value = JOptionPane |
842 | .showInputDialog(browserView, "Command value:", dialogTitle, |
843 | JOptionPane.PLAIN_MESSAGE); |
844 | browserView.getBrowser().executeCommand(command, value); |
845 | } |
846 | }); |
847 | return menuItem; |
848 | } |
849 | |
850 | private Component createMoreMenuItem() {
|
851 | JMenuItem menuItem = new JMenuItem("More Features...");
|
852 | menuItem.addActionListener(new ActionListener() {
|
853 | public void actionPerformed(ActionEvent e) {
|
854 | browserView.getBrowser().loadURL( |
855 | "https://jxbrowser.support.teamdev.com/support/solutions/9000049010"); |
856 | } |
857 | }); |
858 | return menuItem; |
859 | } |
860 | |
861 | private Component createSaveWebPageMenuItem() {
|
862 | JMenuItem menuItem = new JMenuItem("Save Web Page...");
|
863 | menuItem.addActionListener(new ActionListener() {
|
864 | public void actionPerformed(ActionEvent e) {
|
865 | JFileChooser fileChooser = new JFileChooser(); |
866 | fileChooser.setSelectedFile(new File("my-web-page.html"));
|
867 | int result = fileChooser.showSaveDialog(browserView); |
868 | if (result == JFileChooser.APPROVE_OPTION) {
|
869 | File selectedFile = fileChooser.getSelectedFile(); |
870 | String dirPath = new File(selectedFile.getParent(), "resources") |
871 | .getAbsolutePath(); |
872 | browserView.getBrowser().saveWebPage(selectedFile.getAbsolutePath(), dirPath, |
873 | SavePageType.COMPLETE_HTML); |
874 | } |
875 | } |
876 | }); |
877 | return menuItem; |
878 | } |
879 | |
880 | private Component createActualSizeMenuItem() {
|
881 | JMenuItem menuItem = new JMenuItem("Actual Size");
|
882 | menuItem.addActionListener(new ActionListener() {
|
883 | public void actionPerformed(ActionEvent e) {
|
884 | browserView.getBrowser().zoomReset(); |
885 | } |
886 | }); |
887 | return menuItem; |
888 | } |
889 | |
890 | private Component createZoomOutMenuItem() {
|
891 | JMenuItem menuItem = new JMenuItem("Zoom Out");
|
892 | menuItem.addActionListener(new ActionListener() {
|
893 | public void actionPerformed(ActionEvent e) {
|
894 | browserView.getBrowser().zoomOut(); |
895 | } |
896 | }); |
897 | return menuItem; |
898 | } |
899 | |
900 | private Component createZoomInMenuItem() {
|
901 | JMenuItem menuItem = new JMenuItem("Zoom In");
|
902 | menuItem.addActionListener(new ActionListener() {
|
903 | public void actionPerformed(ActionEvent e) {
|
904 | browserView.getBrowser().zoomIn(); |
905 | } |
906 | }); |
907 | return menuItem; |
908 | } |
909 | |
910 | private Component createHTML5VideoMenuItem() {
|
911 | JMenuItem menuItem = new JMenuItem("HTML5 Video");
|
912 | menuItem.addActionListener(new ActionListener() {
|
913 | public void actionPerformed(ActionEvent e) {
|
914 | browserView.getBrowser() |
915 | .loadURL("http://www.w3.org/2010/05/video/mediaevents.html");
|
916 | } |
917 | }); |
918 | return menuItem; |
919 | } |
920 | |
921 | private Component createGoogleMapsMenuItem() {
|
922 | JMenuItem menuItem = new JMenuItem("Google Maps");
|
923 | menuItem.addActionListener(new ActionListener() {
|
924 | public void actionPerformed(ActionEvent e) {
|
925 | browserView.getBrowser().loadURL("https://maps.google.com/");
|
926 | } |
927 | }); |
928 | return menuItem; |
929 | } |
930 | |
931 | private Component createJavaScriptDialogsMenuItem() {
|
932 | JMenuItem menuItem = new JMenuItem("JavaScript Dialogs");
|
933 | menuItem.addActionListener(new ActionListener() {
|
934 | public void actionPerformed(ActionEvent e) {
|
935 | browserView.getBrowser().loadURL("http://www.javascripter.net/faq/alert.htm");
|
936 | } |
937 | }); |
938 | return menuItem; |
939 | } |
940 | |
941 | private Component createDownloadFileMenuItem() {
|
942 | JMenuItem menuItem = new JMenuItem("Download File");
|
943 | menuItem.addActionListener(new ActionListener() {
|
944 | public void actionPerformed(ActionEvent e) {
|
945 | browserView.getBrowser().loadURL( |
946 | "https://s3.amazonaws.com/cloud.teamdev.com/downloads/demo/jxbrowserdemo.jnlp"); |
947 | } |
948 | }); |
949 | return menuItem; |
950 | } |
951 | |
952 | private Component createGetHTMLMenuItem() {
|
953 | JMenuItem menuItem = new JMenuItem("Get HTML");
|
954 | menuItem.addActionListener(new ActionListener() {
|
955 | public void actionPerformed(ActionEvent e) {
|
956 | String html = browserView.getBrowser().getHTML(); |
957 | Window window = SwingUtilities.getWindowAncestor(browserView); |
958 | JDialog dialog = new JDialog(window); |
959 | dialog.setModal(true); |
960 | dialog.setContentPane(new JScrollPane(new JTextArea(html))); |
961 | dialog.setSize(700, 500); |
962 | dialog.setLocationRelativeTo(null); |
963 | dialog.setVisible(true); |
964 | |
965 | } |
966 | }); |
967 | return menuItem; |
968 | } |
969 | |
970 | private JMenuItem createConsoleMenuItem() {
|
971 | consoleMenuItem = new JMenuItem(RUN_JAVASCRIPT); |
972 | consoleMenuItem.addActionListener(new ActionListener() {
|
973 | public void actionPerformed(ActionEvent e) {
|
974 | if (RUN_JAVASCRIPT.equals(consoleMenuItem.getText())) {
|
975 | consoleMenuItem.setText(CLOSE_JAVASCRIPT); |
976 | firePropertyChange("JSConsoleDisplayed", false, true);
|
977 | } else {
|
978 | consoleMenuItem.setText(RUN_JAVASCRIPT); |
979 | firePropertyChange("JSConsoleClosed", false, true);
|
980 | } |
981 | } |
982 | }); |
983 | return consoleMenuItem; |
984 | } |
985 | |
986 | private JMenuItem createUploadFileMenuItem() {
|
987 | JMenuItem menuItem = new JMenuItem("Upload File");
|
988 | menuItem.addActionListener(new ActionListener() {
|
989 | public void actionPerformed(ActionEvent e) {
|
990 | browserView.getBrowser() |
991 | .loadURL("http://www.cs.tut.fi/~jkorpela/forms/file.html#example");
|
992 | } |
993 | }); |
994 | return menuItem; |
995 | } |
996 | |
997 | private JMenuItem createPopupsMenuItem() {
|
998 | JMenuItem menuItem = new JMenuItem("Popup Windows");
|
999 | menuItem.addActionListener(new ActionListener() {
|
1000 | public void actionPerformed(ActionEvent e) {
|
1001 | browserView.getBrowser().loadURL("http://www.popuptest.com");
|
1002 | } |
1003 | }); |
1004 | return menuItem; |
1005 | } |
1006 | |
1007 | private JMenuItem createPDFViewerMenuItem() {
|
1008 | JMenuItem menuItem = new JMenuItem("PDF Viewer");
|
1009 | menuItem.addActionListener(new ActionListener() {
|
1010 | public void actionPerformed(ActionEvent e) {
|
1011 | browserView.getBrowser().loadURL("http://www.orimi.com/pdf-test.pdf");
|
1012 | } |
1013 | }); |
1014 | return menuItem; |
1015 | } |
1016 | |
1017 | private JMenuItem createFlashMenuItem() {
|
1018 | JMenuItem menuItem = new JMenuItem("Adobe Flash");
|
1019 | menuItem.addActionListener(new ActionListener() {
|
1020 | public void actionPerformed(ActionEvent e) {
|
1021 | browserView.getBrowser().loadURL("http://helpx.adobe.com/flash-player.html");
|
1022 | } |
1023 | }); |
1024 | return menuItem; |
1025 | } |
1026 | |
1027 | /*private JMenuItem createAboutMenuItem() {
|
1028 | JMenuItem menuItem = new JMenuItem("About JxBrowser Demo");
|
1029 | menuItem.addActionListener(new ActionListener() {
|
1030 | public void actionPerformed(ActionEvent e) {
|
1031 | Frame parentFrame = (Frame) SwingUtilities.getWindowAncestor(ToolBar.this); |
1032 | AboutDialog aboutDialog = new AboutDialog(parentFrame); |
1033 | aboutDialog.setVisible(true); |
1034 | } |
1035 | }); |
1036 | return menuItem; |
1037 | }*/ |
1038 | |
1039 | private boolean isFocusRequired() {
|
1040 | String url = addressBar.getText(); |
1041 | return url.isEmpty() || url.equals(DEFAULT_URL); |
1042 | } |
1043 | |
1044 | @Override |
1045 | public void addNotify() {
|
1046 | super.addNotify(); |
1047 | SwingUtilities.invokeLater(new Runnable() {
|
1048 | public void run() {
|
1049 | if (isFocusRequired()) {
|
1050 | addressBar.requestFocus(); |
1051 | addressBar.selectAll(); |
1052 | } |
1053 | } |
1054 | }); |
1055 | } |
1056 | |
1057 | private interface CheckBoxMenuItemCallback {
|
1058 | void call(boolean selected); |
1059 | } |
1060 | |
1061 | private static class ActionButton extends JButton {
|
1062 | private ActionButton(String hint, Action action) {
|
1063 | super(action); |
1064 | setContentAreaFilled(false); |
1065 | setBorder(BorderFactory.createEmptyBorder()); |
1066 | setBorderPainted(false); |
1067 | setRolloverEnabled(true); |
1068 | setToolTipText(hint); |
1069 | setText(null); |
1070 | setFocusable(false); |
1071 | setDefaultCapable(false); |
1072 | } |
1073 | } |
1074 | } |
1075 | |
1076 | sclass CommandMenuItem extends JMenuItem {
|
1077 | |
1078 | private final EditorCommand command; |
1079 | |
1080 | public CommandMenuItem(String commandName, EditorCommand command) {
|
1081 | super(commandName); |
1082 | this.command = command; |
1083 | } |
1084 | |
1085 | public EditorCommand getCommand() {
|
1086 | return command; |
1087 | } |
1088 | } |
1089 | |
1090 | sclass JSConsole extends JPanel {
|
1091 | |
1092 | private static final String NEW_LINE = "\n"; |
1093 | private static final String QUERY_LINE_START = ">> "; |
1094 | private final Browser browser; |
1095 | private final ExecutorService executor; |
1096 | private JTextArea console; |
1097 | |
1098 | public JSConsole(Browser browser) {
|
1099 | this.browser = browser; |
1100 | this.executor = Executors.newCachedThreadPool(); |
1101 | setLayout(new BorderLayout()); |
1102 | add(createTitle(), BorderLayout.NORTH); |
1103 | add(createConsoleOutput(), BorderLayout.CENTER); |
1104 | add(createConsoleInput(), BorderLayout.SOUTH); |
1105 | } |
1106 | |
1107 | private static JComponent createTitleLabel() {
|
1108 | return new JLabel("JavaScript Console");
|
1109 | } |
1110 | |
1111 | private JComponent createConsoleInput() {
|
1112 | JPanel result = new JPanel(new BorderLayout()); |
1113 | result.setBackground(Color.WHITE); |
1114 | |
1115 | JLabel label = new JLabel(QUERY_LINE_START); |
1116 | label.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 0)); |
1117 | |
1118 | final JTextField consoleInput = new JTextField(); |
1119 | consoleInput.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); |
1120 | consoleInput.addActionListener(new ActionListener() {
|
1121 | public void actionPerformed(ActionEvent e) {
|
1122 | executor.submit(new Runnable() {
|
1123 | public void run() {
|
1124 | final String script = consoleInput.getText(); |
1125 | JSValue jsValue = browser.executeJavaScriptAndReturnValue(script); |
1126 | final String executionResult = jsValue.toString(); |
1127 | SwingUtilities.invokeLater(new Runnable() {
|
1128 | public void run() {
|
1129 | updateConsoleOutput(script, executionResult); |
1130 | consoleInput.setText("");
|
1131 | } |
1132 | }); |
1133 | } |
1134 | }); |
1135 | } |
1136 | }); |
1137 | result.add(label, BorderLayout.WEST); |
1138 | result.add(consoleInput, BorderLayout.CENTER); |
1139 | return result; |
1140 | } |
1141 | |
1142 | private JComponent createConsoleOutput() {
|
1143 | console = new JTextArea(); |
1144 | console.setFont(new Font("Consolas", Font.PLAIN, 12));
|
1145 | console.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); |
1146 | console.setEditable(false); |
1147 | console.setWrapStyleWord(true); |
1148 | console.setLineWrap(true); |
1149 | console.setText("");
|
1150 | JScrollPane scrollPane = new JScrollPane(console); |
1151 | scrollPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY)); |
1152 | return scrollPane; |
1153 | } |
1154 | |
1155 | private JComponent createTitle() {
|
1156 | JPanel panel = new JPanel(new BorderLayout()); |
1157 | // panel.setBackground(new Color(182, 191, 207)); |
1158 | panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); |
1159 | panel.add(createTitleLabel(), BorderLayout.WEST); |
1160 | panel.add(createCloseButton(), BorderLayout.EAST); |
1161 | return panel; |
1162 | } |
1163 | |
1164 | private JComponent createCloseButton() {
|
1165 | JButton closeButton = new JButton(); |
1166 | closeButton.setOpaque(false); |
1167 | closeButton.setToolTipText("Close JavaScript Console");
|
1168 | closeButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); |
1169 | closeButton.setPressedIcon(Resources.getIcon("close-pressed.png"));
|
1170 | closeButton.setIcon(Resources.getIcon("close.png"));
|
1171 | closeButton.setContentAreaFilled(false); |
1172 | closeButton.setFocusable(false); |
1173 | closeButton.addActionListener(new ActionListener() {
|
1174 | public void actionPerformed(ActionEvent e) {
|
1175 | firePropertyChange("JSConsoleClosed", false, true);
|
1176 | } |
1177 | }); |
1178 | return closeButton; |
1179 | } |
1180 | |
1181 | private void updateConsoleOutput(String script, String executionResult) {
|
1182 | displayScript(script); |
1183 | displayExecutionResult(executionResult); |
1184 | console.setCaretPosition(console.getText().length()); |
1185 | } |
1186 | |
1187 | private void displayExecutionResult(String result) {
|
1188 | console.append(result); |
1189 | console.append(NEW_LINE); |
1190 | } |
1191 | |
1192 | private void displayScript(String script) {
|
1193 | console.append(QUERY_LINE_START); |
1194 | console.append(script); |
1195 | console.append(NEW_LINE); |
1196 | } |
1197 | } |
Began life as a copy of #1016155
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1016160 |
| Snippet name: | Test JxBrowser in JInternalFrame with tabs [OK] |
| Eternal ID of this version: | #1016160/23 |
| Text MD5: | e02570f7e9c299686eda85799db8a744 |
| Transpilation MD5: | eb68c59ac90c807b544c95f479c37ab7 |
| Author: | stefan |
| Category: | javax / gui |
| Type: | JavaX source code (desktop) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-06-07 19:37:31 |
| Source code size: | 44331 bytes / 1197 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 1279 / 2218 |
| Version history: | 22 change(s) |
| Referenced in: | [show references] |