package org.argeo.cms.e4.rap;
import java.security.AccessController;
+import java.util.UUID;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
private BrowserNavigation browserNavigation;
private String state = null;
+ private String uid;
@PostContextCreate
boolean login(final IEventBroker eventBroker) {
+ uid = UUID.randomUUID().toString();
browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
if (browserNavigation != null)
browserNavigation.addBrowserNavigationListener(new BrowserNavigationListener() {
return CurrentUser.isAnonymous(getSubject());
}
+ @Override
+ public String getUid() {
+ return uid;
+ }
+
// CALLBACKS
protected void startupComplete() {
}
package org.argeo.cms.ui;
+import java.util.Map;
+
import javax.security.auth.login.LoginContext;
import org.eclipse.swt.widgets.Composite;
/** Provides interaction with the CMS system. */
public interface CmsView {
- //String KEY = "org.argeo.cms.ui.view";
+ final static String CMS_VIEW_UID_PROPERTY = "argeo.cms.view.uid";
+ // String KEY = "org.argeo.cms.ui.view";
+
+ String getUid();
UxContext getUxContext();
boolean isAnonymous();
+ /**
+ * Send an event to this topic. Does noothing by default., but if implemented it
+ * MUST set the {@link #CMS_VIEW_UID_PROPERTY} in the properties.
+ */
+ default void sendEvent(String topic, Map<String, Object> properties) {
+
+ }
+
static CmsView getCmsView(Composite parent) {
// find parent shell
Shell topShell = parent.getShell();
// check if already set
if (topShell.getData(CmsView.class.getName()) != null) {
CmsView registeredView = (CmsView) topShell.getData(CmsView.class.getName());
- throw new IllegalArgumentException(
- "Cms view " + registeredView + " already registered in this shell");
+ throw new IllegalArgumentException("Cms view " + registeredView + " already registered in this shell");
}
shell.setData(CmsView.class.getName(), view);
}
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import org.argeo.cms.CmsException;
import org.argeo.cms.ui.CmsConstants;
import org.argeo.cms.ui.CmsView;
+import org.argeo.eclipse.ui.Selected;
import org.argeo.jcr.JcrUtils;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.service.ResourceManager;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
public class CmsUiUtils implements CmsConstants {
// private final static Log log = LogFactory.getLog(CmsUiUtils.class);
+ /*
+ * CMS VIEW
+ */
+
+ /** Sends an event via {@link CmsView#sendEvent(String, Map)}. */
+ public static void sendEventOnSelect(Control control, String topic, Map<String, Object> properties) {
+ SelectionListener listener = (Selected) (e) -> {
+ CmsView.getCmsView(control.getParent()).sendEvent(topic, properties);
+ };
+ if (control instanceof Button) {
+ ((Button) control).addSelectionListener(listener);
+ } else
+ throw new UnsupportedOperationException("Control type " + control.getClass() + " is not supported.");
+ }
+
+ /**
+ * Convenience method to sends an event via
+ * {@link CmsView#sendEvent(String, Map)}.
+ */
+ public static void sendEventOnSelect(Control control, String topic, String key, Object value) {
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(key, value);
+ sendEventOnSelect(control, topic, properties);
+ }
+
/**
* The CMS view related to this display, or null if none is available from this
* call.
@Deprecated
public static RowData ROW_DATA_16px = new RowData(16, 16);
+ /*
+ * GRID LAYOUT
+ */
public static GridLayout noSpaceGridLayout() {
return noSpaceGridLayout(new GridLayout());
}
return layout;
}
- //
- // GRID DATA
- //
public static GridData fillAll() {
return new GridData(SWT.FILL, SWT.FILL, true, true);
}
return new RowData(16, 16);
}
+ /*
+ * FORM LAYOUT
+ */
+
+ public static FormData coversAll() {
+ FormData fdLabel = new FormData();
+ fdLabel.top = new FormAttachment(0, 0);
+ fdLabel.left = new FormAttachment(0, 0);
+ fdLabel.right = new FormAttachment(100, 0);
+ fdLabel.bottom = new FormAttachment(100, 0);
+ return fdLabel;
+ }
+
+ /*
+ * STYLING
+ */
+
/** Style widget */
public static <T extends Widget> T style(T widget, String style) {
widget.setData(CmsConstants.STYLE, style);
package org.argeo.cms.ui.util;
import java.util.Locale;
+import java.util.UUID;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
private final static Log log = LogFactory.getLog(LoginEntryPoint.class);
private LoginContext loginContext;
private UxContext uxContext = null;
+ private String uid;
@Override
public int createUI() {
+ uid = UUID.randomUUID().toString();
final Display display = createDisplay();
// UiContext.setData(CmsView.KEY, this);
}
/**
- * To be overridden. CmsLogin#createCredentialsBlock() should be called at
- * some point in order to create the credentials composite. In order to use
- * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
+ * To be overridden. CmsLogin#createCredentialsBlock() should be called at some
+ * point in order to create the credentials composite. In order to use the
+ * default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
* CmsLogin#createContent(), since it would lead to a stack overflow.
*/
protected void createLoginPage(Composite parent, CmsLogin login) {
}
+ @Override
+ public String getUid() {
+ return uid;
+ }
+
@Override
public void navigateTo(String state) {
// TODO Auto-generated method stub
import org.eclipse.rap.rwt.client.WebClient;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.EventAdmin;
/** An RWT web app integrating with a {@link CmsApp}. */
public class CmsWebApp implements ApplicationConfiguration, CmsAppListener {
private BundleContext bundleContext;
private CmsApp cmsApp;
+ private EventAdmin eventAdmin;
private ServiceRegistration<ApplicationConfiguration> rwtAppReg;
// log.warn("Theme id " + themeId + " was specified but it was not found, using default RWT theme.");
}
application.addEntryPoint("/" + uiName, () -> {
- return new CmsWebEntryPoint(this, uiName);
+ CmsWebEntryPoint entryPoint = new CmsWebEntryPoint(this, uiName);
+ entryPoint.setEventAdmin(eventAdmin);
+ return entryPoint;
}, properties);
if (log.isDebugEnabled())
log.info("Added web entry point /" + (contextName != null ? contextName : "") + "/" + uiName);
}
}
+ public void setEventAdmin(EventAdmin eventAdmin) {
+ this.eventAdmin = eventAdmin;
+ }
+
}
import static org.eclipse.rap.rwt.internal.service.ContextProvider.getApplicationContext;
import java.security.PrivilegedAction;
+import java.util.Map;
+import java.util.UUID;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import org.argeo.cms.ui.UxContext;
import org.argeo.cms.ui.dialogs.CmsFeedback;
import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.util.DefaultImageManager;
+import org.argeo.cms.ui.util.SimpleUxContext;
import org.argeo.eclipse.ui.specific.UiContext;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.application.EntryPoint;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
/** The {@link CmsView} for a {@link CmsWebApp}. */
public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationListener {
private static final long serialVersionUID = 7733510691684570402L;
private final static Log log = LogFactory.getLog(CmsWebEntryPoint.class);
+ private EventAdmin eventAdmin;
+
private final CmsWebApp cmsWebApp;
private final String uiName;
private LoginContext loginContext;
private String state;
private Throwable exception;
+ private UxContext uxContext;
+ private CmsImageManager imageManager;
private Composite ui;
+ private String uid;
+
// Client services
// private final JavaScriptExecutor jsExecutor;
private final BrowserNavigation browserNavigation;
assert uiName != null;
this.cmsWebApp = cmsWebApp;
this.uiName = uiName;
+ uid = UUID.randomUUID().toString();
// Initial login
LoginContext lc;
@Override
public Void run() {
try {
+ uxContext = new SimpleUxContext();
+ imageManager = new DefaultImageManager();
ui = cmsWebApp.getCmsApp().initUi(parent);
ui.setData(CmsApp.UI_NAME_PROPERTY, uiName);
ui.setLayoutData(CmsUiUtils.fillAll());
@Override
public UxContext getUxContext() {
- // TODO Auto-generated method stub
- return null;
+ return uxContext;
+ }
+
+ @Override
+ public String getUid() {
+ return uid;
}
@Override
@Override
public CmsImageManager getImageManager() {
- // TODO Auto-generated method stub
- return null;
+ return imageManager;
}
@Override
doRefresh();
}
+ @Override
+ public void sendEvent(String topic, Map<String, Object> properties) {
+ if (properties.containsKey(CMS_VIEW_UID_PROPERTY) && !properties.get(CMS_VIEW_UID_PROPERTY).equals(uid))
+ throw new IllegalArgumentException("Property " + CMS_VIEW_UID_PROPERTY + " is set to another CMS view uid ("
+ + properties.get(CMS_VIEW_UID_PROPERTY) + ") then " + uid);
+ properties.put(CMS_VIEW_UID_PROPERTY, uid);
+ eventAdmin.sendEvent(new Event(topic, properties));
+ }
+
/*
* EntryPoint IMPLEMENTATION
*/
return shell;
}
+ public void setEventAdmin(EventAdmin eventAdmin) {
+ this.eventAdmin = eventAdmin;
+ }
+
}
package org.argeo.cms.web;
import java.util.Map;
+import java.util.UUID;
import javax.jcr.Node;
import javax.jcr.Repository;
private CmsImageManager imageManager = new DefaultImageManager();
private UxContext uxContext = null;
+ private String uid;
public SimpleErgonomics(Repository repository, String workspace, String defaultPath, CmsUiProvider uiProvider,
Map<String, String> factoryProperties) {
@Override
protected void initUi(Composite parent) {
+ uid = UUID.randomUUID().toString();
parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
parent.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(3, false)));
public UxContext getUxContext() {
return uxContext;
}
+ @Override
+ public String getUid() {
+ return uid;
+ }
@Override
public CmsImageManager getImageManager() {
return res;
}
+ /**
+ * Get a string property from this map, expecting to find it, or
+ * <code>null</code> if not found.
+ */
+ public static String get(Map<String, ?> map, String key) {
+ Object res = map.get(key);
+ if (res == null)
+ return null;
+ return res.toString();
+ }
+
+ /**
+ * Get a string property from this map, expecting to find it.
+ *
+ * @throws IllegalArgumentException if the key was not found
+ */
+ public static String getNotNull(Map<String, ?> map, String key) {
+ Object res = map.get(key);
+ if (res == null)
+ throw new IllegalArgumentException("Map " + map + " should contain key " + key);
+ return res.toString();
+ }
+
/**
* Wraps the keys of the provided {@link Dictionary} as an {@link Iterable}.
*/