]> git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java
d4da349ceca4e6c4cbb153ea879525680ce63882
[lgpl/argeo-commons.git] / swt / org.argeo.swt.minidesktop / src / org / argeo / minidesktop / MiniBrowser.java
1 package org.argeo.minidesktop;
2
3 import java.util.Arrays;
4 import java.util.List;
5
6 import org.eclipse.swt.SWT;
7 import org.eclipse.swt.browser.Browser;
8 import org.eclipse.swt.browser.LocationAdapter;
9 import org.eclipse.swt.browser.LocationEvent;
10 import org.eclipse.swt.events.KeyAdapter;
11 import org.eclipse.swt.events.KeyEvent;
12 import org.eclipse.swt.events.SelectionAdapter;
13 import org.eclipse.swt.events.SelectionEvent;
14 import org.eclipse.swt.graphics.Point;
15 import org.eclipse.swt.graphics.Rectangle;
16 import org.eclipse.swt.layout.FillLayout;
17 import org.eclipse.swt.layout.GridData;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.swt.widgets.Control;
21 import org.eclipse.swt.widgets.Display;
22 import org.eclipse.swt.widgets.Shell;
23 import org.eclipse.swt.widgets.Text;
24
25 /** A very minimalistic web browser based on {@link Browser}. */
26 public class MiniBrowser {
27 private static Point defaultShellSize = new Point(800, 480);
28
29 private Browser browser;
30 private Text addressT;
31
32 private final boolean fullscreen;
33 private final boolean appMode;
34
35 public MiniBrowser(Composite composite, String url, boolean fullscreen, boolean appMode) {
36 this.fullscreen = fullscreen;
37 this.appMode = appMode;
38 createUi(composite);
39 setUrl(url);
40 }
41
42 public Control createUi(Composite parent) {
43 parent.setLayout(noSpaceGridLayout(new GridLayout()));
44 if (!isAppMode()) {
45 Control toolBar = createToolBar(parent);
46 toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
47 }
48 Control body = createBody(parent);
49 body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
50 return body;
51 }
52
53 protected Control createToolBar(Composite parent) {
54 Composite toolBar = new Composite(parent, SWT.NONE);
55 toolBar.setLayout(new FillLayout());
56 addressT = new Text(toolBar, SWT.SINGLE);
57 addressT.addSelectionListener(new SelectionAdapter() {
58
59 @Override
60 public void widgetDefaultSelected(SelectionEvent e) {
61 setUrl(addressT.getText().trim());
62 }
63 });
64 return toolBar;
65 }
66
67 protected Control createBody(Composite parent) {
68 browser = new Browser(parent, SWT.NONE);
69 if (isFullScreen())
70 browser.addKeyListener(new KeyAdapter() {
71 @Override
72 public void keyPressed(KeyEvent e) {
73 if (e.keyCode == 0x77 && e.stateMask == 0x40000) {// Ctrl+W
74 browser.getShell().dispose();
75 }
76 }
77 });
78 browser.addLocationListener(new LocationAdapter() {
79 @Override
80 public void changed(LocationEvent event) {
81 System.out.println(event);
82 if (addressT != null)
83 addressT.setText(event.location);
84 }
85
86 });
87
88 // FIXME make it portable
89 // browser.addTitleListener(e -> titleChanged(e.title));
90 // browser.addOpenWindowListener((e) -> {
91 // e.browser = openNewBrowserWindow();
92 // });
93 return browser;
94 }
95
96 protected Browser openNewBrowserWindow() {
97
98 if (isFullScreen()) {
99 // TODO manage multiple tabs?
100 return browser;
101 } else {
102 Shell newShell = new Shell(browser.getDisplay(), SWT.SHELL_TRIM);
103 MiniBrowser newMiniBrowser = new MiniBrowser(newShell, null, false, isAppMode());
104 newShell.setSize(defaultShellSize);
105 newShell.open();
106 return newMiniBrowser.browser;
107 }
108 }
109
110 protected boolean isFullScreen() {
111 return fullscreen;
112 }
113
114 void setUrl(String url) {
115 if (browser != null && url != null && !url.equals(browser.getUrl()))
116 browser.setUrl(url.toString());
117 }
118
119 /** Called when URL changed; to be overridden, does nothing by default. */
120 protected void urlChanged(String url) {
121 }
122
123 /** Called when title changed; to be overridden, does nothing by default. */
124 protected void titleChanged(String title) {
125 }
126
127 protected Browser getBrowser() {
128 return browser;
129 }
130
131 protected boolean isAppMode() {
132 return appMode;
133 }
134
135 private static GridLayout noSpaceGridLayout(GridLayout layout) {
136 layout.horizontalSpacing = 0;
137 layout.verticalSpacing = 0;
138 layout.marginWidth = 0;
139 layout.marginHeight = 0;
140 return layout;
141 }
142
143 public static void main(String[] args) {
144 List<String> options = Arrays.asList(args);
145 if (options.contains("--help")) {
146 System.out.println("Usage: java " + MiniBrowser.class.getName().replace('.', '/') + " [OPTION] [URL]");
147 System.out.println("A minimalistic web browser Eclipse SWT Browser integration.");
148 System.out.println(" --fullscreen : take control of the whole screen (default is to run in a window)");
149 System.out.println(" --app : open without an address bar and a toolbar");
150 System.out.println(" --help : print this help and exit");
151 System.exit(1);
152 }
153 boolean fullscreen = options.contains("--fullscreen");
154 boolean appMode = options.contains("--app");
155 String url = "https://start.duckduckgo.com/";
156 if (options.size() > 0) {
157 String last = options.get(options.size() - 1);
158 if (!last.startsWith("--"))
159 url = last.trim();
160 }
161
162 Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
163 Shell shell;
164 if (fullscreen) {
165 shell = new Shell(display, SWT.NO_TRIM);
166 shell.setFullScreen(true);
167 Rectangle bounds = display.getBounds();
168 shell.setSize(bounds.width, bounds.height);
169 } else {
170 shell = new Shell(display, SWT.SHELL_TRIM);
171 shell.setSize(defaultShellSize);
172 }
173
174 new MiniBrowser(shell, url, fullscreen, appMode) {
175
176 @Override
177 protected void titleChanged(String title) {
178 shell.setText(title);
179 }
180 };
181 shell.open();
182
183 while (!shell.isDisposed()) {
184 if (!display.readAndDispatch())
185 display.sleep();
186 }
187 }
188
189 }