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: | 1006 / 1625 |
Version history: | 22 change(s) |
Referenced in: | [show references] |