+++ /dev/null
-package org.argeo.suite.ui;
-
-import java.util.Set;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.dialogs.CmsWizardDialog;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.Selected;
-import org.argeo.naming.LdapAttrs;
-import org.argeo.suite.SuiteRole;
-import org.argeo.suite.ui.dialogs.NewUserWizard;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.SWT;
-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.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.osgi.service.useradmin.User;
-
-/** Entry to the admin area. */
-public class AdminEntryArea implements CmsUiProvider {
-
- private CmsUserManager cmsUserManager;
-
- @Override
- public Control createUi(Composite parent, Node context) throws RepositoryException {
- CmsTheme theme = CmsTheme.getCmsTheme(parent);
- parent.setLayout(new GridLayout());
- TableViewer usersViewer = new TableViewer(parent);
- usersViewer.setContentProvider(new UsersContentProvider());
-
- TableViewerColumn idCol = new TableViewerColumn(usersViewer, SWT.NONE);
- idCol.getColumn().setWidth(70);
- idCol.setLabelProvider(new ColumnLabelProvider() {
-
- @Override
- public String getText(Object element) {
-
- return getUserProperty(element, LdapAttrs.uid.name());
- }
- });
-
- TableViewerColumn givenNameCol = new TableViewerColumn(usersViewer, SWT.NONE);
- givenNameCol.getColumn().setWidth(150);
- givenNameCol.setLabelProvider(new ColumnLabelProvider() {
-
- @Override
- public String getText(Object element) {
-
- return getUserProperty(element, LdapAttrs.givenName.name());
- }
- });
-
- TableViewerColumn snCol = new TableViewerColumn(usersViewer, SWT.NONE);
- snCol.getColumn().setWidth(150);
- snCol.setLabelProvider(new ColumnLabelProvider() {
-
- @Override
- public String getText(Object element) {
-
- return getUserProperty(element, LdapAttrs.sn.name());
- }
- });
-
- TableViewerColumn mailCol = new TableViewerColumn(usersViewer, SWT.NONE);
- mailCol.getColumn().setWidth(400);
- mailCol.setLabelProvider(new ColumnLabelProvider() {
-
- @Override
- public String getText(Object element) {
-
- return getUserProperty(element, LdapAttrs.mail.name());
- }
- });
-
- Composite bottom = new Composite(parent, SWT.NONE);
- bottom.setLayoutData(CmsUiUtils.fillWidth());
- bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
- ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
- bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
- ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
- deleteItem.setEnabled(false);
-// CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
- deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
- ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
- addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
- usersViewer.addDoubleClickListener(new IDoubleClickListener() {
-
- @Override
- public void doubleClick(DoubleClickEvent event) {
- User user = (User) usersViewer.getStructuredSelection().getFirstElement();
- if (user != null) {
-// Node userNode = getOrCreateUserNode(user, context);
- CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
- SuiteEvent.eventProperties(user));
- }
-
- }
- });
- usersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
- public void selectionChanged(SelectionChangedEvent event) {
- User user = (User) usersViewer.getStructuredSelection().getFirstElement();
- if (user != null) {
-// Node userNode = getOrCreateUserNode(user, context);
- CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
- SuiteEvent.eventProperties(user));
- deleteItem.setEnabled(true);
- } else {
- deleteItem.setEnabled(false);
- }
- }
- });
-
- addItem.addSelectionListener((Selected) (e) -> {
- // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
- Wizard wizard = new NewUserWizard(null);
- CmsWizardDialog dialog = new CmsWizardDialog(parent.getShell(), wizard);
- // WizardDialog dialog = new WizardDialog(shell, wizard);
- if (dialog.open() == Window.OK) {
- // TODO create
- }
- });
-
- usersViewer.getTable().setLayoutData(CmsUiUtils.fillAll());
- usersViewer.setInput(cmsUserManager);
-
- return usersViewer.getTable();
- }
-
-// private Node getOrCreateUserNode(User user, Node context) {
-// return JcrUtils.mkdirs(Jcr.getSession(context),
-// "/" + EntityType.user.name() + "/" + getUserProperty(user, LdapAttrs.uid.name()),
-// EntityType.user.get());
-// }
-
- private String getUserProperty(Object element, String key) {
- Object value = ((User) element).getProperties().get(key);
- return value != null ? value.toString() : null;
- }
-
- class UsersContentProvider implements IStructuredContentProvider {
-
- @Override
- public Object[] getElements(Object inputElement) {
- CmsUserManager cum = (CmsUserManager) inputElement;
- Set<User> users = cum.listUsersInGroup(SuiteRole.coworker.dn(), null);
- return users.toArray();
- }
-
- @Override
- public void dispose() {
- }
-
- @Override
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- }
-
- }
-
- public void setCmsUserManager(CmsUserManager cmsUserManager) {
- this.cmsUserManager = cmsUserManager;
- }
-
-}
+++ /dev/null
-package org.argeo.suite.ui;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.naming.LdapAttrs;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.service.useradmin.User;
-
-/** Edit a suite user. */
-public class SuiteUserUiProvider implements CmsUiProvider {
- private String[] availableRoles;
- private CmsUserManager cmsUserManager;
-
- @Override
- public Control createUi(Composite parent, Node context) throws RepositoryException {
- Section main = new Section(parent, SWT.NONE, context);
- main.setLayoutData(CmsUiUtils.fillAll());
-
- String uid = context.getName();
- User user = cmsUserManager.getUserFromLocalId(uid);
-
-// Text givenName = new Text(main, SWT.SINGLE);
-// givenName.setText(getUserProperty(user, LdapAttrs.givenName.name()));
- Text givenName = SuiteUiUtils.addFormInput(main, SuiteMsg.firstName.lead(),
- getUserProperty(user, LdapAttrs.givenName.name()));
-
- Text sn = SuiteUiUtils.addFormInput(main, SuiteMsg.lastName.lead(), getUserProperty(user, LdapAttrs.sn.name()));
- // sn.setText(getUserProperty(user, LdapAttrs.sn.name()));
-
- Text email = SuiteUiUtils.addFormInput(main, SuiteMsg.email.lead(),
- getUserProperty(user, LdapAttrs.mail.name()));
- // email.setText(getUserProperty(user, LdapAttrs.mail.name()));
-
- Text uidT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name()));
- uidT.setText(uid);
-
-// Label dnL = new Label(main, SWT.NONE);
-// dnL.setText(user.getName());
-
- // roles
- // Section rolesSection = new Section(main, SWT.NONE, context);
- Group rolesSection = new Group(main, SWT.NONE);
- rolesSection.setText("Roles");
- rolesSection.setLayoutData(CmsUiUtils.fillWidth());
- rolesSection.setLayout(new GridLayout());
- // new Label(rolesSection, SWT.NONE).setText("Roles:");
- List<String> roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName()));
- for (String role : availableRoles) {
- // new Label(rolesSection, SWT.NONE).setText(role);
- Button radio = new Button(rolesSection, SWT.CHECK);
- radio.setText(role);
- if (roles.contains(role))
- radio.setSelection(true);
- }
-
- return main;
- }
-
- public void setCmsUserManager(CmsUserManager cmsUserManager) {
- this.cmsUserManager = cmsUserManager;
- }
-
- private String getUserProperty(Object element, String key) {
- Object value = ((User) element).getProperties().get(key);
- return value != null ? value.toString() : null;
- }
-
- public void init(Map<String, Object> properties) {
- availableRoles = (String[]) properties.get("availableRoles");
- }
-}
<version>2.1.18-SNAPSHOT</version>
</dependency>
+ <!-- Argeo People -->
+ <dependency>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>org.argeo.people.ui</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ </dependency>
+
<!-- Argeo Library -->
<dependency>
<groupId>org.argeo.suite</groupId>
<version>2.1.18-SNAPSHOT</version>
</dependency>
+ <!-- Argeo Environment -->
+ <dependency>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>org.argeo.geo.ui</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ </dependency>
+
<!-- Argeo Publishing -->
<dependency>
<groupId>org.argeo.suite</groupId>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+/bin/
+/target/
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.argeo.geo.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+/MANIFEST.MF
--- /dev/null
+Import-Package:\
+javax.jcr.nodetype,\
+org.osgi.service.event,\
+org.argeo.suite.ui,\
+org.argeo.api,\
+org.eclipse.swt,\
+org.eclipse.jface.viewers,\
+org.osgi.framework,\
+*
--- /dev/null
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>environment</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>org.argeo.geo.ui</artifactId>
+ <name>Geography UI</name>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>org.argeo.suite.ui</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ </dependency>
+
+ <!-- Eclipse E4 -->
+ <dependency>
+ <groupId>org.argeo.tp</groupId>
+ <artifactId>argeo-tp-rap-e4</artifactId>
+ <version>${version.argeo-tp}</version>
+ <type>pom</type>
+ <scope>provided</scope>
+ </dependency>
+ <!-- Specific -->
+ <dependency>
+ <groupId>org.argeo.commons</groupId>
+ <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+ <version>${version.argeo-commons}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+</project>
--- /dev/null
+package org.argeo.geo;
+
+public class GeoJsonToSvg {
+
+}
--- /dev/null
+package org.argeo.support.openlayers;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeConstants;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.entity.EntityNames;
+import org.argeo.entity.EntityType;
+import org.argeo.suite.ui.SuiteEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.BrowserFunction;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/** Display a map. */
+public class OpenLayersMap extends Composite {
+ private static final long serialVersionUID = 1055893020490283622L;
+
+ private final static Log log = LogFactory.getLog(OpenLayersMap.class);
+
+ private Browser browser;
+ private boolean renderCompleted = false;
+
+ private Double centerLng = null, centerLat = null;
+ private Integer zoom = null;
+ private String vectorSource = null;
+ private String gpxSource = null;
+
+ private List<String> geoJsonSources = new ArrayList<>();
+
+ private CmsView cmsView;
+
+ public OpenLayersMap(Composite parent, int style, URL mapHtml) {
+ super(parent, style);
+ cmsView = CmsView.getCmsView(parent);
+ setLayout(new GridLayout());
+
+ browser = new Browser(this, SWT.BORDER);
+ browser.setLayoutData(CmsUiUtils.fillAll());
+ String html;
+ try (InputStream in = mapHtml.openStream()) {
+ html = IOUtils.toString(in, StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ new RenderCompleted(browser, "renderCompleted");
+ new OnFeatureSelect(browser, "onFeatureSelect");
+ new OnFeatureUnselect(browser, "onFeatureUnselect");
+ new OnFeatureClick(browser, "onFeatureClick");
+ browser.setText(html);
+ }
+
+ public void setCenter(Double lng, Double lat) {
+ if (isRenderCompleted())
+ browser.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng + ", " + lat + "]))");
+ this.centerLat = lat;
+ this.centerLng = lng;
+ }
+
+ public synchronized void setRenderCompleted(boolean renderCompleted) {
+ this.renderCompleted = renderCompleted;
+ notifyAll();
+ }
+
+ public synchronized boolean isRenderCompleted() {
+ return renderCompleted;
+ }
+
+ @Override
+ public synchronized void dispose() {
+ long timeout = 500;
+ long begin = System.currentTimeMillis();
+ while (!isRenderCompleted() && ((System.currentTimeMillis() - begin) < timeout)) {
+ try {
+ wait(50);
+ } catch (InterruptedException e) {
+ // silent
+ }
+ }
+ super.dispose();
+ }
+
+ public void setZoom(int zoom) {
+ if (isRenderCompleted())
+ browser.evaluate("map.getView().setZoom(" + zoom + ")");
+ this.zoom = zoom;
+ }
+
+ public void addPoints(List<Node> geoPoints) throws RepositoryException {
+ boolean first = true;
+ StringBuffer sb = new StringBuffer("new ol.source.Vector({ features: [");
+ for (int i = 0; i < geoPoints.size(); i++) {
+ Node node = geoPoints.get(i);
+ if (node.isNodeType(EntityType.geopoint.get()) && !node.isCheckedOut()) {
+ if (first)
+ first = false;
+ else
+ sb.append(",");
+ Double lng = node.getProperty(EntityNames.GEO_LONG).getDouble();
+ Double lat = node.getProperty(EntityNames.GEO_LAT).getDouble();
+ sb.append("new ol.Feature({ geometry:");
+ sb.append("new ol.geom.Point(ol.proj.fromLonLat([");
+ sb.append(lng).append(',').append(lat);
+ sb.append("]))");
+ sb.append(",path:'").append(node.getPath()).append("'");
+ sb.append("})");
+ }
+ }
+ sb.append("] })");
+ this.vectorSource = sb.toString();
+ if (log.isTraceEnabled())
+ log.trace("Vector source: " + vectorSource);
+ renderVectorSource();
+ }
+
+ protected void renderVectorSource() {
+ if (vectorSource == null)
+ return;
+ if (isRenderCompleted())
+ browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + vectorSource + "}));");
+ }
+
+ public void addPoint(Double lng, Double lat) {
+ this.vectorSource = "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
+ + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] })";
+// if (renderCompleted) {
+// browser.evaluate(
+// "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
+// + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
+// }
+ renderVectorSource();
+ }
+
+ public void addGpx(String path) {
+ this.gpxSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GPX() })";
+ renderGpxSource();
+ }
+
+ protected void renderGpxSource() {
+ if (gpxSource == null)
+ return;
+ if (isRenderCompleted())
+ browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource + "}));");
+ }
+
+ public void addGeoJson(String path) {
+ String geoJsonSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GeoJSON() })";
+ geoJsonSources.add(geoJsonSource);
+ renderGeoJsonSources();
+ }
+
+ protected void renderGeoJsonSources() {
+ if (geoJsonSources.isEmpty())
+ return;
+ if (isRenderCompleted()) {
+ for (String geoJson : geoJsonSources) {
+ browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson + "}));");
+ }
+ }
+ }
+
+ private class RenderCompleted extends BrowserFunction {
+
+ RenderCompleted(Browser browser, String name) {
+ super(browser, name);
+ }
+
+ @Override
+ public Object function(Object[] arguments) {
+ try {
+ if (!isRenderCompleted()) {
+ setRenderCompleted(true);
+ if (zoom != null)
+ setZoom(zoom);
+ if (centerLat != null && centerLng != null) {
+ setCenter(centerLng, centerLat);
+ }
+ if (vectorSource != null)
+ renderVectorSource();
+ if (gpxSource != null)
+ renderGpxSource();
+ if (!geoJsonSources.isEmpty())
+ renderGeoJsonSources();
+ }
+ return null;
+ } catch (Exception e) {
+ log.error("Cannot render map", e);
+ return null;
+ }
+ }
+ }
+
+ private class OnFeatureSelect extends BrowserFunction {
+
+ OnFeatureSelect(Browser browser, String name) {
+ super(browser, name);
+ }
+
+ @Override
+ public Object function(Object[] arguments) {
+ if (arguments.length == 0)
+ return null;
+ String path = arguments[0].toString();
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(SuiteEvent.NODE_PATH, path);
+ properties.put(SuiteEvent.WORKSPACE, NodeConstants.SYS_WORKSPACE);
+ cmsView.sendEvent(SuiteEvent.refreshPart.topic(), properties);
+ return null;
+ }
+ }
+
+ private class OnFeatureUnselect extends BrowserFunction {
+
+ OnFeatureUnselect(Browser browser, String name) {
+ super(browser, name);
+ }
+
+ @Override
+ public Object function(Object[] arguments) {
+ return null;
+ }
+ }
+
+ private class OnFeatureClick extends BrowserFunction {
+
+ OnFeatureClick(Browser browser, String name) {
+ super(browser, name);
+ }
+
+ @Override
+ public Object function(Object[] arguments) {
+ return null;
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>argeo-suite</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>environment</artifactId>
+ <name>Argeo Environment Components</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>org.argeo.geo.ui</module>
+ </modules>
+</project>
<!-- Dependencies -->
<version.argeo-tp>2.1.27</version.argeo-tp>
<version.argeo-tp-extras>2.1.13</version.argeo-tp-extras>
- <version.argeo-commons>2.1.89</version.argeo-commons>
- <!-- <version.argeo-connect>2.1.82-SNAPSHOT</version.argeo-connect> -->
- <!-- <version.argeo-slc>2.1.17-SNAPSHOT</version.argeo-slc> -->
+ <version.argeo-commons>2.1.91-SNAPSHOT</version.argeo-commons>
<argeo.rpm.stagingRepository>/srv/rpmfactory/argeo-osgi-2-gpl/el7</argeo.rpm.stagingRepository>
<git.rw />
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+/bin/
+/target/
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.argeo.people.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+/MANIFEST.MF
--- /dev/null
+Import-Package:\
+javax.jcr.nodetype,\
+org.osgi.service.event,\
+org.argeo.suite.ui,\
+org.argeo.api,\
+org.eclipse.swt,\
+org.eclipse.jface.viewers,\
+org.eclipse.jface.window,\
+org.osgi.framework,\
+*
--- /dev/null
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>people</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>org.argeo.people.ui</artifactId>
+ <name>People UI</name>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>org.argeo.suite.ui</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ </dependency>
+
+ <!-- Eclipse E4 -->
+ <dependency>
+ <groupId>org.argeo.tp</groupId>
+ <artifactId>argeo-tp-rap-e4</artifactId>
+ <version>${version.argeo-tp}</version>
+ <type>pom</type>
+ <scope>provided</scope>
+ </dependency>
+ <!-- Specific -->
+ <dependency>
+ <groupId>org.argeo.commons</groupId>
+ <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+ <version>${version.argeo-commons}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+</project>
--- /dev/null
+package org.argeo.people.ui;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.naming.LdapAttrs;
+import org.argeo.suite.ui.SuiteMsg;
+import org.argeo.suite.ui.SuiteUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.osgi.service.useradmin.User;
+
+/** Edit a suite user. */
+public class SuiteUserUiProvider implements CmsUiProvider {
+ private String[] availableRoles;
+ private CmsUserManager cmsUserManager;
+
+ @Override
+ public Control createUi(Composite parent, Node context) throws RepositoryException {
+ Section main = new Section(parent, SWT.NONE, context);
+ main.setLayoutData(CmsUiUtils.fillAll());
+
+ String uid = context.getName();
+ User user = cmsUserManager.getUserFromLocalId(uid);
+
+// Text givenName = new Text(main, SWT.SINGLE);
+// givenName.setText(getUserProperty(user, LdapAttrs.givenName.name()));
+ Text givenName = SuiteUiUtils.addFormInput(main, SuiteMsg.firstName.lead(),
+ getUserProperty(user, LdapAttrs.givenName.name()));
+
+ Text sn = SuiteUiUtils.addFormInput(main, SuiteMsg.lastName.lead(), getUserProperty(user, LdapAttrs.sn.name()));
+ // sn.setText(getUserProperty(user, LdapAttrs.sn.name()));
+
+ Text email = SuiteUiUtils.addFormInput(main, SuiteMsg.email.lead(),
+ getUserProperty(user, LdapAttrs.mail.name()));
+ // email.setText(getUserProperty(user, LdapAttrs.mail.name()));
+
+ Text uidT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name()));
+ uidT.setText(uid);
+
+// Label dnL = new Label(main, SWT.NONE);
+// dnL.setText(user.getName());
+
+ // roles
+ // Section rolesSection = new Section(main, SWT.NONE, context);
+ Group rolesSection = new Group(main, SWT.NONE);
+ rolesSection.setText("Roles");
+ rolesSection.setLayoutData(CmsUiUtils.fillWidth());
+ rolesSection.setLayout(new GridLayout());
+ // new Label(rolesSection, SWT.NONE).setText("Roles:");
+ List<String> roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName()));
+ for (String role : availableRoles) {
+ // new Label(rolesSection, SWT.NONE).setText(role);
+ Button radio = new Button(rolesSection, SWT.CHECK);
+ radio.setText(role);
+ if (roles.contains(role))
+ radio.setSelection(true);
+ }
+
+ return main;
+ }
+
+ public void setCmsUserManager(CmsUserManager cmsUserManager) {
+ this.cmsUserManager = cmsUserManager;
+ }
+
+ private String getUserProperty(Object element, String key) {
+ Object value = ((User) element).getProperties().get(key);
+ return value != null ? value.toString() : null;
+ }
+
+ public void init(Map<String, Object> properties) {
+ availableRoles = (String[]) properties.get("availableRoles");
+ }
+}
--- /dev/null
+package org.argeo.people.ui;
+
+import java.util.Set;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.ui.CmsTheme;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.dialogs.CmsWizardDialog;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.eclipse.ui.Selected;
+import org.argeo.naming.LdapAttrs;
+import org.argeo.suite.SuiteRole;
+import org.argeo.suite.ui.SuiteEvent;
+import org.argeo.suite.ui.SuiteIcon;
+import org.argeo.suite.ui.dialogs.NewUserWizard;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swt.SWT;
+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.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.osgi.service.useradmin.User;
+
+/** Entry to the admin area. */
+public class SuiteUsersEntryArea implements CmsUiProvider {
+
+ private CmsUserManager cmsUserManager;
+
+ @Override
+ public Control createUi(Composite parent, Node context) throws RepositoryException {
+ CmsTheme theme = CmsTheme.getCmsTheme(parent);
+ parent.setLayout(new GridLayout());
+ TableViewer usersViewer = new TableViewer(parent);
+ usersViewer.setContentProvider(new UsersContentProvider());
+
+ TableViewerColumn idCol = new TableViewerColumn(usersViewer, SWT.NONE);
+ idCol.getColumn().setWidth(70);
+ idCol.setLabelProvider(new ColumnLabelProvider() {
+
+ @Override
+ public String getText(Object element) {
+
+ return getUserProperty(element, LdapAttrs.uid.name());
+ }
+ });
+
+ TableViewerColumn givenNameCol = new TableViewerColumn(usersViewer, SWT.NONE);
+ givenNameCol.getColumn().setWidth(150);
+ givenNameCol.setLabelProvider(new ColumnLabelProvider() {
+
+ @Override
+ public String getText(Object element) {
+
+ return getUserProperty(element, LdapAttrs.givenName.name());
+ }
+ });
+
+ TableViewerColumn snCol = new TableViewerColumn(usersViewer, SWT.NONE);
+ snCol.getColumn().setWidth(150);
+ snCol.setLabelProvider(new ColumnLabelProvider() {
+
+ @Override
+ public String getText(Object element) {
+
+ return getUserProperty(element, LdapAttrs.sn.name());
+ }
+ });
+
+ TableViewerColumn mailCol = new TableViewerColumn(usersViewer, SWT.NONE);
+ mailCol.getColumn().setWidth(400);
+ mailCol.setLabelProvider(new ColumnLabelProvider() {
+
+ @Override
+ public String getText(Object element) {
+
+ return getUserProperty(element, LdapAttrs.mail.name());
+ }
+ });
+
+ Composite bottom = new Composite(parent, SWT.NONE);
+ bottom.setLayoutData(CmsUiUtils.fillWidth());
+ bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
+ ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
+ bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
+ ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
+ deleteItem.setEnabled(false);
+// CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
+ deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
+ ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
+ addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
+ usersViewer.addDoubleClickListener(new IDoubleClickListener() {
+
+ @Override
+ public void doubleClick(DoubleClickEvent event) {
+ User user = (User) usersViewer.getStructuredSelection().getFirstElement();
+ if (user != null) {
+// Node userNode = getOrCreateUserNode(user, context);
+ CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
+ SuiteEvent.eventProperties(user));
+ }
+
+ }
+ });
+ usersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ User user = (User) usersViewer.getStructuredSelection().getFirstElement();
+ if (user != null) {
+// Node userNode = getOrCreateUserNode(user, context);
+ CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
+ SuiteEvent.eventProperties(user));
+ deleteItem.setEnabled(true);
+ } else {
+ deleteItem.setEnabled(false);
+ }
+ }
+ });
+
+ addItem.addSelectionListener((Selected) (e) -> {
+ // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
+ Wizard wizard = new NewUserWizard(null);
+ CmsWizardDialog dialog = new CmsWizardDialog(parent.getShell(), wizard);
+ // WizardDialog dialog = new WizardDialog(shell, wizard);
+ if (dialog.open() == Window.OK) {
+ // TODO create
+ }
+ });
+
+ usersViewer.getTable().setLayoutData(CmsUiUtils.fillAll());
+ usersViewer.setInput(cmsUserManager);
+
+ return usersViewer.getTable();
+ }
+
+// private Node getOrCreateUserNode(User user, Node context) {
+// return JcrUtils.mkdirs(Jcr.getSession(context),
+// "/" + EntityType.user.name() + "/" + getUserProperty(user, LdapAttrs.uid.name()),
+// EntityType.user.get());
+// }
+
+ private String getUserProperty(Object element, String key) {
+ Object value = ((User) element).getProperties().get(key);
+ return value != null ? value.toString() : null;
+ }
+
+ class UsersContentProvider implements IStructuredContentProvider {
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ CmsUserManager cum = (CmsUserManager) inputElement;
+ Set<User> users = cum.listUsersInGroup(SuiteRole.coworker.dn(), null);
+ return users.toArray();
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ }
+
+ public void setCmsUserManager(CmsUserManager cmsUserManager) {
+ this.cmsUserManager = cmsUserManager;
+ }
+
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>argeo-suite</artifactId>
+ <version>2.1.18-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>people</artifactId>
+ <name>Argeo People Components</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>org.argeo.people.ui</module>
+ </modules>
+</project>
<modules>
<module>core</module>
<!-- Functional areas -->
+ <module>people</module>
<module>library</module>
+ <module>environment</module>
<module>publishing</module>
<module>knowledge</module>