From 637bb618df290885daac173b5ce0c6a33667bb99 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 19 Apr 2020 09:15:31 +0200 Subject: [PATCH] Introduce Mini Desktop project. --- rcp/dep/org.argeo.dep.cms.e4.rcp/pom.xml | 2 +- .../src/org/argeo/cms/desktop/Activator.java | 30 --- .../org/argeo/swt/desktop/MiniBrowser.java | 107 ---------- .../.classpath | 0 .../.gitignore | 1 + .../.project | 2 +- .../META-INF/.gitignore | 0 .../bnd.bnd | 0 .../build.properties | 0 .../pom.xml | 18 +- .../org/argeo/minidesktop/MiniBrowser.java | 187 ++++++++++++++++++ .../minidesktop}/MiniDesktopManager.java | 5 +- .../org/argeo/minidesktop}/MiniExplorer.java | 2 +- .../argeo/minidesktop}/MiniImageViewer.java | 2 +- .../org/argeo/minidesktop}/MiniTerminal.java | 2 +- .../argeo/minidesktop}/MiniTextEditor.java | 2 +- rcp/pom.xml | 2 +- 17 files changed, 199 insertions(+), 163 deletions(-) delete mode 100644 rcp/org.argeo.cms.desktop/src/org/argeo/cms/desktop/Activator.java delete mode 100644 rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniBrowser.java rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/.classpath (100%) rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/.gitignore (75%) rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/.project (94%) rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/META-INF/.gitignore (100%) rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/bnd.bnd (100%) rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/build.properties (100%) rename rcp/{org.argeo.cms.desktop => org.argeo.minidesktop}/pom.xml (50%) create mode 100644 rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java rename rcp/{org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop => org.argeo.minidesktop/src/org/argeo/minidesktop}/MiniDesktopManager.java (98%) rename rcp/{org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop => org.argeo.minidesktop/src/org/argeo/minidesktop}/MiniExplorer.java (99%) rename rcp/{org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop => org.argeo.minidesktop/src/org/argeo/minidesktop}/MiniImageViewer.java (99%) rename rcp/{org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop => org.argeo.minidesktop/src/org/argeo/minidesktop}/MiniTerminal.java (99%) rename rcp/{org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop => org.argeo.minidesktop/src/org/argeo/minidesktop}/MiniTextEditor.java (99%) diff --git a/rcp/dep/org.argeo.dep.cms.e4.rcp/pom.xml b/rcp/dep/org.argeo.dep.cms.e4.rcp/pom.xml index d810bae82..39f46714f 100644 --- a/rcp/dep/org.argeo.dep.cms.e4.rcp/pom.xml +++ b/rcp/dep/org.argeo.dep.cms.e4.rcp/pom.xml @@ -21,7 +21,7 @@ org.argeo.slc.rcp - org.argeo.cms.desktop + org.argeo.minidesktop 2.1.86-SNAPSHOT diff --git a/rcp/org.argeo.cms.desktop/src/org/argeo/cms/desktop/Activator.java b/rcp/org.argeo.cms.desktop/src/org/argeo/cms/desktop/Activator.java deleted file mode 100644 index 4975bee69..000000000 --- a/rcp/org.argeo.cms.desktop/src/org/argeo/cms/desktop/Activator.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.argeo.cms.desktop; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -public class Activator implements BundleActivator { - - private static BundleContext context; - - static BundleContext getContext() { - return context; - } - - /* - * (non-Javadoc) - * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext bundleContext) throws Exception { - Activator.context = bundleContext; - } - - /* - * (non-Javadoc) - * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext bundleContext) throws Exception { - Activator.context = null; - } - -} diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniBrowser.java b/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniBrowser.java deleted file mode 100644 index d0ac4ee36..000000000 --- a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniBrowser.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.argeo.swt.desktop; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.browser.Browser; -import org.eclipse.swt.browser.LocationAdapter; -import org.eclipse.swt.browser.LocationEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -/** A minimalistic web browser based on {@link Browser}. */ -public class MiniBrowser { - private Browser browser; - private Text addressT; - - public MiniBrowser(Composite composite, String url) { - createUi(composite); - setUrl(url); - } - - public Control createUi(Composite parent) { - parent.setLayout(noSpaceGridLayout(new GridLayout())); - Control toolBar = createToolBar(parent); - toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - Control body = createBody(parent); - body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - return body; - } - - public Control createToolBar(Composite parent) { - Composite toolBar = new Composite(parent, SWT.NONE); - toolBar.setLayout(new FillLayout()); - addressT = new Text(toolBar, SWT.SINGLE); - addressT.addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - setUrl(addressT.getText().trim()); - } - }); - return toolBar; - } - - public Control createBody(Composite parent) { - browser = new Browser(parent, SWT.NONE); - browser.addLocationListener(new LocationAdapter() { - @Override - public void changed(LocationEvent event) { - addressT.setText(event.location); - } - - }); - browser.addTitleListener(e -> titleChanged(e.title)); - return browser; - } - - void setUrl(String url) { - if (browser != null && url != null && !url.equals(browser.getUrl())) - browser.setUrl(url.toString()); - } - - /** Called when URL changed; to be overridden, does nothing by default. */ - protected void urlChanged(String url) { - } - - /** Called when title changed; to be overridden, does nothing by default. */ - protected void titleChanged(String title) { - } - - private static GridLayout noSpaceGridLayout(GridLayout layout) { - layout.horizontalSpacing = 0; - layout.verticalSpacing = 0; - layout.marginWidth = 0; - layout.marginHeight = 0; - return layout; - } - - public static void main(String[] args) { - Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent(); - Shell shell = new Shell(display, SWT.SHELL_TRIM); - - String url = args.length > 0 ? args[0] : "https://duckduckgo.com/"; - new MiniBrowser(shell, url) { - - @Override - protected void titleChanged(String title) { - shell.setText(title); - } - }; - shell.open(); - shell.setSize(new Point(800, 480)); - - while (!shell.isDisposed()) { - if (!display.readAndDispatch()) - display.sleep(); - } - } - -} diff --git a/rcp/org.argeo.cms.desktop/.classpath b/rcp/org.argeo.minidesktop/.classpath similarity index 100% rename from rcp/org.argeo.cms.desktop/.classpath rename to rcp/org.argeo.minidesktop/.classpath diff --git a/rcp/org.argeo.cms.desktop/.gitignore b/rcp/org.argeo.minidesktop/.gitignore similarity index 75% rename from rcp/org.argeo.cms.desktop/.gitignore rename to rcp/org.argeo.minidesktop/.gitignore index 09e3bc9b2..97adb723b 100644 --- a/rcp/org.argeo.cms.desktop/.gitignore +++ b/rcp/org.argeo.minidesktop/.gitignore @@ -1,2 +1,3 @@ /bin/ /target/ +*.log \ No newline at end of file diff --git a/rcp/org.argeo.cms.desktop/.project b/rcp/org.argeo.minidesktop/.project similarity index 94% rename from rcp/org.argeo.cms.desktop/.project rename to rcp/org.argeo.minidesktop/.project index c50145246..8bf479f59 100644 --- a/rcp/org.argeo.cms.desktop/.project +++ b/rcp/org.argeo.minidesktop/.project @@ -1,6 +1,6 @@ - org.argeo.cms.desktop + org.argeo.minidesktop diff --git a/rcp/org.argeo.cms.desktop/META-INF/.gitignore b/rcp/org.argeo.minidesktop/META-INF/.gitignore similarity index 100% rename from rcp/org.argeo.cms.desktop/META-INF/.gitignore rename to rcp/org.argeo.minidesktop/META-INF/.gitignore diff --git a/rcp/org.argeo.cms.desktop/bnd.bnd b/rcp/org.argeo.minidesktop/bnd.bnd similarity index 100% rename from rcp/org.argeo.cms.desktop/bnd.bnd rename to rcp/org.argeo.minidesktop/bnd.bnd diff --git a/rcp/org.argeo.cms.desktop/build.properties b/rcp/org.argeo.minidesktop/build.properties similarity index 100% rename from rcp/org.argeo.cms.desktop/build.properties rename to rcp/org.argeo.minidesktop/build.properties diff --git a/rcp/org.argeo.cms.desktop/pom.xml b/rcp/org.argeo.minidesktop/pom.xml similarity index 50% rename from rcp/org.argeo.cms.desktop/pom.xml rename to rcp/org.argeo.minidesktop/pom.xml index 327fd0f46..aee04afc1 100644 --- a/rcp/org.argeo.cms.desktop/pom.xml +++ b/rcp/org.argeo.minidesktop/pom.xml @@ -9,21 +9,7 @@ 2.1.86-SNAPSHOT .. - org.argeo.cms.desktop - CMS Desktop + org.argeo.minidesktop + Mini Desktop jar - - - - org.argeo.commons - org.argeo.cms.ui - ${version.argeo-commons} - - - - org.argeo.slc.rcp - org.argeo.eclipse.ui.rcp - 2.1.86-SNAPSHOT - - \ No newline at end of file diff --git a/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java new file mode 100644 index 000000000..16c405d4a --- /dev/null +++ b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java @@ -0,0 +1,187 @@ +package org.argeo.minidesktop; + +import java.util.Arrays; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.browser.LocationAdapter; +import org.eclipse.swt.browser.LocationEvent; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** A very minimalistic web browser based on {@link Browser}. */ +public class MiniBrowser { + private static Point defaultShellSize = new Point(800, 480); + + private Browser browser; + private Text addressT; + + private final boolean fullscreen; + private final boolean appMode; + + public MiniBrowser(Composite composite, String url, boolean fullscreen, boolean appMode) { + this.fullscreen = fullscreen; + this.appMode = appMode; + createUi(composite); + setUrl(url); + } + + public Control createUi(Composite parent) { + parent.setLayout(noSpaceGridLayout(new GridLayout())); + if (!isAppMode()) { + Control toolBar = createToolBar(parent); + toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + } + Control body = createBody(parent); + body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + return body; + } + + protected Control createToolBar(Composite parent) { + Composite toolBar = new Composite(parent, SWT.NONE); + toolBar.setLayout(new FillLayout()); + addressT = new Text(toolBar, SWT.SINGLE); + addressT.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + setUrl(addressT.getText().trim()); + } + }); + return toolBar; + } + + protected Control createBody(Composite parent) { + browser = new Browser(parent, SWT.NONE); + if (isFullScreen()) + browser.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.keyCode == 0x77 && e.stateMask == 0x40000) {// Ctrl+W + browser.getShell().dispose(); + } + } + }); + browser.addLocationListener(new LocationAdapter() { + @Override + public void changed(LocationEvent event) { + System.out.println(event); + if (addressT != null) + addressT.setText(event.location); + } + + }); + browser.addTitleListener(e -> titleChanged(e.title)); + browser.addOpenWindowListener((e) -> { + e.browser = openNewBrowserWindow(); + }); + return browser; + } + + protected Browser openNewBrowserWindow() { + + if (isFullScreen()) { + // TODO manage multiple tabs? + return browser; + } else { + Shell newShell = new Shell(browser.getDisplay(), SWT.SHELL_TRIM); + MiniBrowser newMiniBrowser = new MiniBrowser(newShell, null, false, isAppMode()); + newShell.setSize(defaultShellSize); + newShell.open(); + return newMiniBrowser.browser; + } + } + + protected boolean isFullScreen() { + return fullscreen; + } + + void setUrl(String url) { + if (browser != null && url != null && !url.equals(browser.getUrl())) + browser.setUrl(url.toString()); + } + + /** Called when URL changed; to be overridden, does nothing by default. */ + protected void urlChanged(String url) { + } + + /** Called when title changed; to be overridden, does nothing by default. */ + protected void titleChanged(String title) { + } + + protected Browser getBrowser() { + return browser; + } + + protected boolean isAppMode() { + return appMode; + } + + private static GridLayout noSpaceGridLayout(GridLayout layout) { + layout.horizontalSpacing = 0; + layout.verticalSpacing = 0; + layout.marginWidth = 0; + layout.marginHeight = 0; + return layout; + } + + public static void main(String[] args) { + List options = Arrays.asList(args); + if (options.contains("--help")) { + System.out.println("Usage: java " + MiniBrowser.class.getName().replace('.', '/') + " [OPTION] [URL]"); + System.out.println("A minimalistic web browser Eclipse SWT Browser integration."); + System.out.println(" --fullscreen : take control of the whole screen (default is to run in a window)"); + System.out.println(" --app : open without an address bar and a toolbar"); + System.out.println(" --help : print this help and exit"); + System.exit(1); + } + boolean fullscreen = options.contains("--fullscreen"); + boolean appMode = options.contains("--app"); + String url = "https://duckduckgo.com/"; + if (options.size() > 0) { + String last = options.get(options.size() - 1); + if (!last.startsWith("--")) + url = last.trim(); + } + + Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent(); + Shell shell; + if (fullscreen) { + shell = new Shell(display, SWT.NO_TRIM); + shell.setFullScreen(true); + Rectangle bounds = display.getBounds(); + shell.setSize(bounds.width, bounds.height); + } else { + shell = new Shell(display, SWT.SHELL_TRIM); + shell.setSize(defaultShellSize); + } + + new MiniBrowser(shell, url, fullscreen, appMode) { + + @Override + protected void titleChanged(String title) { + shell.setText(title); + } + }; + shell.open(); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) + display.sleep(); + } + } + +} diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniDesktopManager.java b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java similarity index 98% rename from rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniDesktopManager.java rename to rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java index e5b8e357a..a1f6d333e 100644 --- a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniDesktopManager.java +++ b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java @@ -1,4 +1,4 @@ -package org.argeo.swt.desktop; +package org.argeo.minidesktop; import java.net.InetAddress; import java.net.UnknownHostException; @@ -54,7 +54,6 @@ public class MiniDesktopManager { rootShell = new Shell(display, SWT.NO_TRIM); rootShell.setFullScreen(true); Rectangle bounds = display.getBounds(); - rootShell.setSize(bounds.width, bounds.height); } else { rootShell = new Shell(display, SWT.SHELL_TRIM); @@ -134,7 +133,7 @@ public class MiniDesktopManager { addToolItem(toolBar, display.getSystemImage(SWT.ICON_QUESTION), "Browser", () -> { String url = "https://duckduckgo.com/"; AppContext appContext = createAppParent(); - new MiniBrowser(appContext.getAppParent(), url) { + new MiniBrowser(appContext.getAppParent(), url, false, false) { @Override protected void titleChanged(String title) { if (appContext.shell != null) diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniExplorer.java b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniExplorer.java similarity index 99% rename from rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniExplorer.java rename to rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniExplorer.java index 6f6a782fb..1395c02cf 100644 --- a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniExplorer.java +++ b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniExplorer.java @@ -1,4 +1,4 @@ -package org.argeo.swt.desktop; +package org.argeo.minidesktop; import java.io.IOException; import java.nio.file.DirectoryStream; diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniImageViewer.java b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniImageViewer.java similarity index 99% rename from rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniImageViewer.java rename to rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniImageViewer.java index d8dd663e7..86ff53fee 100644 --- a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniImageViewer.java +++ b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniImageViewer.java @@ -1,4 +1,4 @@ -package org.argeo.swt.desktop; +package org.argeo.minidesktop; import java.io.IOException; import java.net.MalformedURLException; diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniTerminal.java b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniTerminal.java similarity index 99% rename from rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniTerminal.java rename to rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniTerminal.java index 0c43e3bf0..196ad0c57 100644 --- a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniTerminal.java +++ b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniTerminal.java @@ -1,4 +1,4 @@ -package org.argeo.swt.desktop; +package org.argeo.minidesktop; import java.io.BufferedReader; import java.io.IOException; diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniTextEditor.java b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniTextEditor.java similarity index 99% rename from rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniTextEditor.java rename to rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniTextEditor.java index b5582f96c..91cd19e90 100644 --- a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/swt/desktop/MiniTextEditor.java +++ b/rcp/org.argeo.minidesktop/src/org/argeo/minidesktop/MiniTextEditor.java @@ -1,4 +1,4 @@ -package org.argeo.swt.desktop; +package org.argeo.minidesktop; import java.io.BufferedReader; import java.io.BufferedWriter; diff --git a/rcp/pom.xml b/rcp/pom.xml index d5f401005..a1386b928 100644 --- a/rcp/pom.xml +++ b/rcp/pom.xml @@ -13,8 +13,8 @@ Argeo RCP pom + org.argeo.minidesktop org.argeo.eclipse.ui.rcp - org.argeo.cms.desktop org.argeo.cms.e4.rcp dep dist -- 2.39.2