From 64de5f2d37daf02d9c086d06e73f295e8470274d Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 21 Oct 2022 07:21:05 +0200 Subject: [PATCH] Move legacy code and icons to Argeo JCR --- swt/org.argeo.cms.jcr.e4/.project | 5 + .../OSGI-INF/cmsAdminRap.xml | 8 + .../OSGI-INF/homeRepository.xml | 8 + .../OSGI-INF/userAdminWrapper.xml | 10 + swt/org.argeo.cms.jcr.e4/bnd.bnd | 8 +- .../e4xmi/cms-devops.e4xmi | 129 ++++++ .../argeo/cms/e4/files/NodeFsBrowserView.java | 47 ++ .../org/argeo/cms/e4/files/package-info.java | 2 + .../argeo/cms/e4/monitoring/BundleNode.java | 46 ++ .../argeo/cms/e4/monitoring/BundlesView.java | 114 +++++ .../cms/e4/monitoring/CmsSessionsView.java | 173 ++++++++ .../argeo/cms/e4/monitoring/ModulesView.java | 91 ++++ .../e4/monitoring/OsgiConfigurationsView.java | 163 +++++++ .../cms/e4/monitoring/OsgiExplorerImages.java | 15 + .../e4/monitoring/ServiceReferenceNode.java | 46 ++ .../cms/e4/monitoring/StateLabelProvider.java | 82 ++++ .../argeo/cms/e4/monitoring/package-info.java | 2 + .../org/argeo/cms/e4/parts/EgoDashboard.java | 41 ++ .../org/argeo/cms/e4/users/GroupEditor.java | 2 +- .../org/argeo/cms/e4/users/GroupsView.java | 2 +- .../cms/e4/users/UserBatchUpdateWizard.java | 2 +- .../org/argeo/cms/e4/users/UserEditor.java | 2 +- .../src/org/argeo/cms/e4/users/UsersView.java | 2 +- .../argeo/cms/jcr/e4/rap/CmsE4AdminApp.java | 17 + .../icons/actions/add.png | Bin 0 -> 254 bytes .../icons/actions/close-all.png | Bin 0 -> 521 bytes .../icons/actions/delete.png | Bin 0 -> 376 bytes .../icons/actions/edit.png | Bin 0 -> 619 bytes .../icons/actions/save-all.png | Bin 0 -> 252 bytes .../icons/actions/save.png | Bin 0 -> 239 bytes swt/org.argeo.cms.jcr.ui/icons/active.gif | Bin 0 -> 193 bytes swt/org.argeo.cms.jcr.ui/icons/add.gif | Bin 0 -> 318 bytes swt/org.argeo.cms.jcr.ui/icons/add.png | Bin 0 -> 245 bytes swt/org.argeo.cms.jcr.ui/icons/addFolder.gif | Bin 0 -> 343 bytes .../icons/addPrivileges.gif | Bin 0 -> 564 bytes swt/org.argeo.cms.jcr.ui/icons/addRepo.gif | Bin 0 -> 964 bytes .../icons/addWorkspace.png | Bin 0 -> 479 bytes swt/org.argeo.cms.jcr.ui/icons/adminLog.gif | Bin 0 -> 617 bytes swt/org.argeo.cms.jcr.ui/icons/batch.gif | Bin 0 -> 223 bytes swt/org.argeo.cms.jcr.ui/icons/begin.gif | Bin 0 -> 210 bytes swt/org.argeo.cms.jcr.ui/icons/binary.png | Bin 0 -> 523 bytes swt/org.argeo.cms.jcr.ui/icons/browser.gif | Bin 0 -> 582 bytes swt/org.argeo.cms.jcr.ui/icons/bundles.gif | Bin 0 -> 344 bytes .../icons/changePassword.gif | Bin 0 -> 563 bytes swt/org.argeo.cms.jcr.ui/icons/clear.gif | Bin 0 -> 545 bytes swt/org.argeo.cms.jcr.ui/icons/close-all.png | Bin 0 -> 538 bytes swt/org.argeo.cms.jcr.ui/icons/commit.gif | Bin 0 -> 583 bytes swt/org.argeo.cms.jcr.ui/icons/delete.png | Bin 0 -> 447 bytes swt/org.argeo.cms.jcr.ui/icons/dumpNode.gif | Bin 0 -> 564 bytes swt/org.argeo.cms.jcr.ui/icons/file.gif | Bin 0 -> 577 bytes swt/org.argeo.cms.jcr.ui/icons/folder.gif | Bin 0 -> 219 bytes swt/org.argeo.cms.jcr.ui/icons/getSize.gif | Bin 0 -> 587 bytes swt/org.argeo.cms.jcr.ui/icons/group.png | Bin 0 -> 467 bytes swt/org.argeo.cms.jcr.ui/icons/home.gif | Bin 0 -> 583 bytes swt/org.argeo.cms.jcr.ui/icons/home.png | Bin 0 -> 266 bytes swt/org.argeo.cms.jcr.ui/icons/import_fs.png | Bin 0 -> 729 bytes swt/org.argeo.cms.jcr.ui/icons/installed.gif | Bin 0 -> 183 bytes swt/org.argeo.cms.jcr.ui/icons/loading.gif | Bin 3208 -> 0 bytes swt/org.argeo.cms.jcr.ui/icons/log.gif | Bin 0 -> 572 bytes swt/org.argeo.cms.jcr.ui/icons/logout.png | Bin 0 -> 328 bytes .../icons/maintenance.gif | Bin 0 -> 583 bytes .../icons/noPic-goldenRatio-640px.png | Bin 6246 -> 0 bytes .../icons/noPic-square-640px.png | Bin 4314 -> 0 bytes swt/org.argeo.cms.jcr.ui/icons/node.gif | Bin 0 -> 586 bytes swt/org.argeo.cms.jcr.ui/icons/nodes.gif | Bin 0 -> 166 bytes .../icons/osgi_explorer.gif | Bin 0 -> 344 bytes swt/org.argeo.cms.jcr.ui/icons/password.gif | Bin 0 -> 564 bytes .../icons/person-logged-in.png | Bin 0 -> 359 bytes swt/org.argeo.cms.jcr.ui/icons/person.png | Bin 0 -> 384 bytes swt/org.argeo.cms.jcr.ui/icons/query.png | Bin 0 -> 1086 bytes swt/org.argeo.cms.jcr.ui/icons/refresh.png | Bin 0 -> 387 bytes .../icons/remote_connected.gif | Bin 0 -> 159 bytes .../icons/remote_disconnected.gif | Bin 0 -> 155 bytes swt/org.argeo.cms.jcr.ui/icons/remove.gif | Bin 0 -> 351 bytes .../icons/removePrivileges.gif | Bin 0 -> 636 bytes swt/org.argeo.cms.jcr.ui/icons/rename.gif | Bin 0 -> 889 bytes .../icons/repositories.gif | Bin 0 -> 588 bytes .../icons/repository_connected.gif | Bin 0 -> 328 bytes .../icons/repository_disconnected.gif | Bin 0 -> 209 bytes swt/org.argeo.cms.jcr.ui/icons/resolved.gif | Bin 0 -> 176 bytes swt/org.argeo.cms.jcr.ui/icons/role.gif | Bin 0 -> 563 bytes swt/org.argeo.cms.jcr.ui/icons/rollback.gif | Bin 0 -> 376 bytes swt/org.argeo.cms.jcr.ui/icons/save-all.png | Bin 0 -> 283 bytes swt/org.argeo.cms.jcr.ui/icons/save.gif | Bin 0 -> 640 bytes swt/org.argeo.cms.jcr.ui/icons/save.png | Bin 0 -> 226 bytes .../icons/save_security.png | Bin 0 -> 706 bytes .../icons/save_security_disabled.png | Bin 0 -> 387 bytes swt/org.argeo.cms.jcr.ui/icons/security.gif | Bin 0 -> 324 bytes .../icons/service_published.gif | Bin 0 -> 197 bytes .../icons/service_referenced.gif | Bin 0 -> 185 bytes swt/org.argeo.cms.jcr.ui/icons/sort.gif | Bin 0 -> 162 bytes swt/org.argeo.cms.jcr.ui/icons/starting.gif | Bin 0 -> 181 bytes swt/org.argeo.cms.jcr.ui/icons/sync.gif | Bin 0 -> 353 bytes swt/org.argeo.cms.jcr.ui/icons/user.gif | Bin 0 -> 310 bytes swt/org.argeo.cms.jcr.ui/icons/users.gif | Bin 0 -> 598 bytes swt/org.argeo.cms.jcr.ui/icons/workgroup.png | Bin 0 -> 744 bytes swt/org.argeo.cms.jcr.ui/icons/workgroup.xcf | Bin 0 -> 1896 bytes .../icons/workspace_connected.png | Bin 0 -> 498 bytes .../icons/workspace_disconnected.png | Bin 0 -> 493 bytes .../cms/swt/useradmin/LdifUsersTable.java | 401 ++++++++++++++++++ .../cms/swt/useradmin/PickUpUserDialog.java | 245 +++++++++++ .../org/argeo/cms/swt/useradmin/UserLP.java | 76 ++++ .../argeo/cms/swt/useradmin/UsersImages.java | 14 + .../argeo/cms/swt/useradmin/ViewerUtils.java | 58 +++ .../argeo/cms/swt/useradmin/package-info.java | 2 + .../src/org/argeo/cms/ui/theme/CmsImages.java | 49 +++ .../org/argeo/cms/ui/theme/package-info.java | 2 + .../eclipse/ui/dialogs/ErrorFeedback.java | 106 +++++ .../eclipse/ui/dialogs/FeedbackDialog.java | 141 ++++++ .../eclipse/ui/dialogs/LightweightDialog.java | 256 +++++++++++ .../argeo/eclipse/ui/dialogs/SingleValue.java | 130 ++++++ .../eclipse/ui/dialogs/package-info.java | 2 + 112 files changed, 2493 insertions(+), 6 deletions(-) create mode 100644 swt/org.argeo.cms.jcr.e4/OSGI-INF/cmsAdminRap.xml create mode 100644 swt/org.argeo.cms.jcr.e4/OSGI-INF/homeRepository.xml create mode 100644 swt/org.argeo.cms.jcr.e4/OSGI-INF/userAdminWrapper.xml create mode 100644 swt/org.argeo.cms.jcr.e4/e4xmi/cms-devops.e4xmi create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/NodeFsBrowserView.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/package-info.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundleNode.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundlesView.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/CmsSessionsView.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ModulesView.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiConfigurationsView.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiExplorerImages.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ServiceReferenceNode.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/StateLabelProvider.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/package-info.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/parts/EgoDashboard.java create mode 100644 swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/jcr/e4/rap/CmsE4AdminApp.java create mode 100644 swt/org.argeo.cms.jcr.ui/icons/actions/add.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/actions/close-all.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/actions/delete.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/actions/edit.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/actions/save-all.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/actions/save.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/active.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/add.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/add.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/addFolder.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/addPrivileges.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/addRepo.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/addWorkspace.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/adminLog.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/batch.gif create mode 100755 swt/org.argeo.cms.jcr.ui/icons/begin.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/binary.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/browser.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/bundles.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/changePassword.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/clear.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/close-all.png create mode 100755 swt/org.argeo.cms.jcr.ui/icons/commit.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/delete.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/dumpNode.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/file.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/folder.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/getSize.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/group.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/home.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/home.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/import_fs.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/installed.gif delete mode 100644 swt/org.argeo.cms.jcr.ui/icons/loading.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/log.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/logout.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/maintenance.gif delete mode 100644 swt/org.argeo.cms.jcr.ui/icons/noPic-goldenRatio-640px.png delete mode 100644 swt/org.argeo.cms.jcr.ui/icons/noPic-square-640px.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/node.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/nodes.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/osgi_explorer.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/password.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/person-logged-in.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/person.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/query.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/refresh.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/remote_connected.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/remote_disconnected.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/remove.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/removePrivileges.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/rename.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/repositories.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/repository_connected.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/repository_disconnected.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/resolved.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/role.gif create mode 100755 swt/org.argeo.cms.jcr.ui/icons/rollback.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/save-all.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/save.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/save.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/save_security.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/save_security_disabled.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/security.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/service_published.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/service_referenced.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/sort.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/starting.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/sync.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/user.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/users.gif create mode 100644 swt/org.argeo.cms.jcr.ui/icons/workgroup.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/workgroup.xcf create mode 100644 swt/org.argeo.cms.jcr.ui/icons/workspace_connected.png create mode 100644 swt/org.argeo.cms.jcr.ui/icons/workspace_disconnected.png create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/LdifUsersTable.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/PickUpUserDialog.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UserLP.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UsersImages.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/ViewerUtils.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/package-info.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/CmsImages.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/package-info.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/ErrorFeedback.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/FeedbackDialog.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/SingleValue.java create mode 100644 swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/package-info.java diff --git a/swt/org.argeo.cms.jcr.e4/.project b/swt/org.argeo.cms.jcr.e4/.project index 01f8dd2..290b0e6 100644 --- a/swt/org.argeo.cms.jcr.e4/.project +++ b/swt/org.argeo.cms.jcr.e4/.project @@ -20,6 +20,11 @@ + + org.eclipse.pde.ds.core.builder + + + org.eclipse.pde.PluginNature diff --git a/swt/org.argeo.cms.jcr.e4/OSGI-INF/cmsAdminRap.xml b/swt/org.argeo.cms.jcr.e4/OSGI-INF/cmsAdminRap.xml new file mode 100644 index 0000000..33dd78d --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/OSGI-INF/cmsAdminRap.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/swt/org.argeo.cms.jcr.e4/OSGI-INF/homeRepository.xml b/swt/org.argeo.cms.jcr.e4/OSGI-INF/homeRepository.xml new file mode 100644 index 0000000..2722aab --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/OSGI-INF/homeRepository.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/swt/org.argeo.cms.jcr.e4/OSGI-INF/userAdminWrapper.xml b/swt/org.argeo.cms.jcr.e4/OSGI-INF/userAdminWrapper.xml new file mode 100644 index 0000000..cc7087b --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/OSGI-INF/userAdminWrapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/swt/org.argeo.cms.jcr.e4/bnd.bnd b/swt/org.argeo.cms.jcr.e4/bnd.bnd index fde6c09..906f959 100644 --- a/swt/org.argeo.cms.jcr.e4/bnd.bnd +++ b/swt/org.argeo.cms.jcr.e4/bnd.bnd @@ -1,3 +1,5 @@ +Bundle-ActivationPolicy: lazy + Import-Package: \ org.eclipse.swt,\ org.eclipse.swt.widgets;version="0.0.0",\ @@ -9,4 +11,8 @@ javax.jcr.nodetype,\ org.apache.jackrabbit.*;version="[2,3)",\ org.argeo.cms,\ org.argeo.jcr,\ -* \ No newline at end of file +* + +Service-Component: OSGI-INF/homeRepository.xml,\ +OSGI-INF/userAdminWrapper.xml,\ +OSGI-INF/cmsAdminRap.xml,\ diff --git a/swt/org.argeo.cms.jcr.e4/e4xmi/cms-devops.e4xmi b/swt/org.argeo.cms.jcr.e4/e4xmi/cms-devops.e4xmi new file mode 100644 index 0000000..a3d955a --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/e4xmi/cms-devops.e4xmi @@ -0,0 +1,129 @@ + + + + + shellMaximized + auth.cn=admin,ou=roles,ou=node + + + auth.cn=admin,ou=roles,ou=node + + + + + + + + + + + + + usersEditorArea + + + + + + + + + + + + + + + + + + + + + + + + + ViewMenu + + + + + + + + + + dataExplorer + + + + + + + + + + + + + + + + + + + + + + + + + auth.cn=admin,ou=roles,ou=node + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/NodeFsBrowserView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/NodeFsBrowserView.java new file mode 100644 index 0000000..aabfbf5 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/NodeFsBrowserView.java @@ -0,0 +1,47 @@ +package org.argeo.cms.e4.files; + +import java.net.URI; +import java.nio.file.FileSystem; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.spi.FileSystemProvider; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; + +import org.argeo.eclipse.ui.fs.SimpleFsBrowser; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +/** Browse the node file system. */ +public class NodeFsBrowserView { + // public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + + // ".nodeFsBrowserView"; + + @Inject + FileSystemProvider nodeFileSystemProvider; + + @PostConstruct + public void createPartControl(Composite parent) { + try { + // URI uri = new URI("node://root:demo@localhost:7070/"); + URI uri = new URI("node:///"); + FileSystem fileSystem = nodeFileSystemProvider.getFileSystem(uri); + if (fileSystem == null) + fileSystem = nodeFileSystemProvider.newFileSystem(uri, null); + Path nodePath = fileSystem.getPath("/"); + + Path localPath = Paths.get(System.getProperty("user.home")); + + SimpleFsBrowser browser = new SimpleFsBrowser(parent, SWT.NO_FOCUS); + browser.setInput(nodePath, localPath); +// AdvancedFsBrowser browser = new AdvancedFsBrowser(); +// browser.createUi(parent, localPath); + } catch (Exception e) { + throw new RuntimeException("Cannot open file system browser", e); + } + } + + public void setFocus() { + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/package-info.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/package-info.java new file mode 100644 index 0000000..b481dd4 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/files/package-info.java @@ -0,0 +1,2 @@ +/** Files browser perspective. */ +package org.argeo.cms.e4.files; \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundleNode.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundleNode.java new file mode 100644 index 0000000..e953683 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundleNode.java @@ -0,0 +1,46 @@ +package org.argeo.cms.e4.monitoring; + +import org.argeo.cms.ux.widgets.TreeParent; +import org.osgi.framework.Bundle; +import org.osgi.framework.ServiceReference; + +/** A tree element representing a {@link Bundle} */ +class BundleNode extends TreeParent { + private final Bundle bundle; + + public BundleNode(Bundle bundle) { + this(bundle, false); + } + + @SuppressWarnings("rawtypes") + public BundleNode(Bundle bundle, boolean hasChildren) { + super(bundle.getSymbolicName()); + this.bundle = bundle; + + if (hasChildren) { + // REFERENCES + ServiceReference[] usedServices = bundle.getServicesInUse(); + if (usedServices != null) { + for (ServiceReference sr : usedServices) { + if (sr != null) + addChild(new ServiceReferenceNode(sr, false)); + } + } + + // SERVICES + ServiceReference[] registeredServices = bundle + .getRegisteredServices(); + if (registeredServices != null) { + for (ServiceReference sr : registeredServices) { + if (sr != null) + addChild(new ServiceReferenceNode(sr, true)); + } + } + } + + } + + Bundle getBundle() { + return bundle; + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundlesView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundlesView.java new file mode 100644 index 0000000..c639255 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/BundlesView.java @@ -0,0 +1,114 @@ +//package org.argeo.eclipse.ui.workbench.osgi; +//public class BundlesView {} + +package org.argeo.cms.e4.monitoring; + +import javax.annotation.PostConstruct; + +import org.argeo.eclipse.ui.ColumnViewerComparator; +import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils; +import org.eclipse.e4.ui.di.Focus; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; + +/** + * Overview of the bundles as a table. Equivalent to Equinox 'ss' console + * command. + */ +public class BundlesView { + private final static BundleContext bc = FrameworkUtil.getBundle(BundlesView.class).getBundleContext(); + private TableViewer viewer; + + @PostConstruct + public void createPartControl(Composite parent) { + viewer = new TableViewer(parent); + viewer.setContentProvider(new BundleContentProvider()); + viewer.getTable().setHeaderVisible(true); + + EclipseUiSpecificUtils.enableToolTipSupport(viewer); + + // ID + TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(30); + column.getColumn().setText("ID"); + column.getColumn().setAlignment(SWT.RIGHT); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -3122136344359358605L; + + public String getText(Object element) { + return Long.toString(((Bundle) element).getBundleId()); + } + }); + new ColumnViewerComparator(column); + + // State + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(18); + column.getColumn().setText("State"); + column.setLabelProvider(new StateLabelProvider()); + new ColumnViewerComparator(column); + + // Symbolic name + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(250); + column.getColumn().setText("Symbolic Name"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -4280840684440451080L; + + public String getText(Object element) { + return ((Bundle) element).getSymbolicName(); + } + }); + new ColumnViewerComparator(column); + + // Version + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(250); + column.getColumn().setText("Version"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = 6871926308708629989L; + + public String getText(Object element) { + Bundle bundle = (org.osgi.framework.Bundle) element; + return bundle.getVersion().toString(); + } + }); + new ColumnViewerComparator(column); + + viewer.setInput(bc); + + } + + @Focus + public void setFocus() { + if (viewer != null) + viewer.getControl().setFocus(); + } + + /** Content provider managing the array of bundles */ + private static class BundleContentProvider implements IStructuredContentProvider { + private static final long serialVersionUID = -8533792785725875977L; + + public Object[] getElements(Object inputElement) { + if (inputElement instanceof BundleContext) { + BundleContext bc = (BundleContext) inputElement; + return bc.getBundles(); + } + return null; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/CmsSessionsView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/CmsSessionsView.java new file mode 100644 index 0000000..95b1eb2 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/CmsSessionsView.java @@ -0,0 +1,173 @@ +//package org.argeo.eclipse.ui.workbench.osgi; +//public class BundlesView {} + +package org.argeo.cms.e4.monitoring; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.argeo.api.cms.CmsSession; +import org.argeo.cms.auth.RoleNameUtils; +import org.argeo.eclipse.ui.ColumnViewerComparator; +import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils; +import org.argeo.util.LangUtils; +import org.eclipse.e4.ui.di.Focus; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +/** + * Overview of the active CMS sessions. + */ +public class CmsSessionsView { + private final static BundleContext bc = FrameworkUtil.getBundle(CmsSessionsView.class).getBundleContext(); + + private TableViewer viewer; + + @PostConstruct + public void createPartControl(Composite parent) { + viewer = new TableViewer(parent); + viewer.setContentProvider(new CmsSessionContentProvider()); + viewer.getTable().setHeaderVisible(true); + + EclipseUiSpecificUtils.enableToolTipSupport(viewer); + + int longColWidth = 150; + int smallColWidth = 100; + + // Display name + TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(longColWidth); + column.getColumn().setText("User"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -5234573509093747505L; + + public String getText(Object element) { + return ((CmsSession) element).getDisplayName(); + } + + public String getToolTipText(Object element) { + return ((CmsSession) element).getUserDn().toString(); + } + }); + new ColumnViewerComparator(column); + + // Creation time + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(smallColWidth); + column.getColumn().setText("Since"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -5234573509093747505L; + + public String getText(Object element) { + return LangUtils.since(((CmsSession) element).getCreationTime()); + } + + public String getToolTipText(Object element) { + return ((CmsSession) element).getCreationTime().toString(); + } + }); + new ColumnViewerComparator(column); + + // Username + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(smallColWidth); + column.getColumn().setText("Username"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -5234573509093747505L; + + public String getText(Object element) { + String userDn = ((CmsSession) element).getUserDn(); + return RoleNameUtils.getLastRdnValue(userDn); + } + + public String getToolTipText(Object element) { + return ((CmsSession) element).getUserDn().toString(); + } + }); + new ColumnViewerComparator(column); + + // UUID + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(smallColWidth); + column.getColumn().setText("UUID"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -5234573509093747505L; + + public String getText(Object element) { + return ((CmsSession) element).getUuid().toString(); + } + + public String getToolTipText(Object element) { + return getText(element); + } + }); + new ColumnViewerComparator(column); + + // Local ID + column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setWidth(smallColWidth); + column.getColumn().setText("Local ID"); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = -5234573509093747505L; + + public String getText(Object element) { + return ((CmsSession) element).getLocalId(); + } + + public String getToolTipText(Object element) { + return getText(element); + } + }); + new ColumnViewerComparator(column); + + viewer.setInput(bc); + + } + + @Focus + public void setFocus() { + if (viewer != null) + viewer.getControl().setFocus(); + } + + /** Content provider managing the array of bundles */ + private static class CmsSessionContentProvider implements IStructuredContentProvider { + private static final long serialVersionUID = -8533792785725875977L; + + public Object[] getElements(Object inputElement) { + if (inputElement instanceof BundleContext) { + BundleContext bc = (BundleContext) inputElement; + Collection> srs; + try { + srs = bc.getServiceReferences(CmsSession.class, null); + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException("Cannot retrieve CMS sessions", e); + } + List res = new ArrayList<>(); + for (ServiceReference sr : srs) { + res.add(bc.getService(sr)); + } + return res.toArray(); + } + return null; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ModulesView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ModulesView.java new file mode 100644 index 0000000..6317882 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ModulesView.java @@ -0,0 +1,91 @@ +package org.argeo.cms.e4.monitoring; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.argeo.cms.ux.widgets.TreeParent; +import org.eclipse.e4.ui.di.Focus; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; + +/** The OSGi runtime from a module perspective. */ +public class ModulesView { + private final static BundleContext bc = FrameworkUtil.getBundle(ModulesView.class).getBundleContext(); + private TreeViewer viewer; + + @PostConstruct + public void createPartControl(Composite parent) { + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + viewer.setContentProvider(new ModulesContentProvider()); + viewer.setLabelProvider(new ModulesLabelProvider()); + viewer.setInput(bc); + } + + @Focus + public void setFocus() { + viewer.getTree().setFocus(); + } + + private class ModulesContentProvider implements ITreeContentProvider { + private static final long serialVersionUID = 3819934804640641721L; + + public Object[] getElements(Object inputElement) { + return getChildren(inputElement); + } + + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof BundleContext) { + BundleContext bundleContext = (BundleContext) parentElement; + Bundle[] bundles = bundleContext.getBundles(); + + List modules = new ArrayList(); + for (Bundle bundle : bundles) { + if (bundle.getState() == Bundle.ACTIVE) + modules.add(new BundleNode(bundle, true)); + } + return modules.toArray(); + } else if (parentElement instanceof TreeParent) { + return ((TreeParent) parentElement).getChildren(); + } else { + return null; + } + } + + public Object getParent(Object element) { + // TODO Auto-generated method stub + return null; + } + + public boolean hasChildren(Object element) { + if (element instanceof TreeParent) { + return ((TreeParent) element).hasChildren(); + } + return false; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + private class ModulesLabelProvider extends StateLabelProvider { + private static final long serialVersionUID = 5290046145534824722L; + + @Override + public String getText(Object element) { + if (element instanceof BundleNode) + return element.toString() + " [" + ((BundleNode) element).getBundle().getBundleId() + "]"; + return element.toString(); + } + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiConfigurationsView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiConfigurationsView.java new file mode 100644 index 0000000..5db8bd1 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiConfigurationsView.java @@ -0,0 +1,163 @@ +package org.argeo.cms.e4.monitoring; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Dictionary; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.argeo.cms.swt.CmsException; +import org.argeo.util.LangUtils; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; + +public class OsgiConfigurationsView { + private final static BundleContext bc = FrameworkUtil.getBundle(OsgiConfigurationsView.class).getBundleContext(); + + @PostConstruct + public void createPartControl(Composite parent) { + ConfigurationAdmin configurationAdmin = bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); + + TreeViewer viewer = new TreeViewer(parent); + // viewer.getTree().setHeaderVisible(true); + + TreeViewerColumn tvc = new TreeViewerColumn(viewer, SWT.NONE); + tvc.getColumn().setWidth(400); + tvc.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = 835407996597566763L; + + @Override + public String getText(Object element) { + if (element instanceof Configuration) { + return ((Configuration) element).getPid(); + } else if (element instanceof Prop) { + return ((Prop) element).key; + } + return super.getText(element); + } + + @Override + public Image getImage(Object element) { + if (element instanceof Configuration) + return OsgiExplorerImages.CONFIGURATION; + return null; + } + + }); + + tvc = new TreeViewerColumn(viewer, SWT.NONE); + tvc.getColumn().setWidth(400); + tvc.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = 6999659261190014687L; + + @Override + public String getText(Object element) { + if (element instanceof Configuration) { + // return ((Configuration) element).getFactoryPid(); + return null; + } else if (element instanceof Prop) { + return ((Prop) element).value.toString(); + } + return super.getText(element); + } + }); + + viewer.setContentProvider(new ConfigurationsContentProvider()); + viewer.setInput(configurationAdmin); + } + + static class ConfigurationsContentProvider implements ITreeContentProvider { + private static final long serialVersionUID = -4892768279440981042L; + private ConfigurationComparator configurationComparator = new ConfigurationComparator(); + + @Override + public void dispose() { + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + @Override + public Object[] getElements(Object inputElement) { + ConfigurationAdmin configurationAdmin = (ConfigurationAdmin) inputElement; + try { + Configuration[] configurations = configurationAdmin.listConfigurations(null); + Arrays.sort(configurations, configurationComparator); + return configurations; + } catch (IOException | InvalidSyntaxException e) { + throw new CmsException("Cannot list configurations", e); + } + } + + @Override + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof Configuration) { + List res = new ArrayList<>(); + Configuration configuration = (Configuration) parentElement; + Dictionary props = configuration.getProperties(); + keys: for (String key : LangUtils.keys(props)) { + if (Constants.SERVICE_PID.equals(key)) + continue keys; + if (ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)) + continue keys; + res.add(new Prop(configuration, key, props.get(key))); + } + return res.toArray(new Prop[res.size()]); + } + return null; + } + + @Override + public Object getParent(Object element) { + if (element instanceof Prop) + return ((Prop) element).configuration; + return null; + } + + @Override + public boolean hasChildren(Object element) { + if (element instanceof Configuration) + return true; + return false; + } + + } + + static class Prop { + final Configuration configuration; + final String key; + final Object value; + + public Prop(Configuration configuration, String key, Object value) { + this.configuration = configuration; + this.key = key; + this.value = value; + } + + } + + static class ConfigurationComparator implements Comparator { + + @Override + public int compare(Configuration o1, Configuration o2) { + return o1.getPid().compareTo(o2.getPid()); + } + + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiExplorerImages.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiExplorerImages.java new file mode 100644 index 0000000..7217fe6 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/OsgiExplorerImages.java @@ -0,0 +1,15 @@ +package org.argeo.cms.e4.monitoring; + +import org.argeo.cms.ui.theme.CmsImages; +import org.eclipse.swt.graphics.Image; + +/** Shared icons. */ +public class OsgiExplorerImages extends CmsImages { + public final static Image INSTALLED = createIcon("installed.gif"); + public final static Image RESOLVED = createIcon("resolved.gif"); + public final static Image STARTING = createIcon("starting.gif"); + public final static Image ACTIVE = createIcon("active.gif"); + public final static Image SERVICE_PUBLISHED = createIcon("service_published.gif"); + public final static Image SERVICE_REFERENCED = createIcon("service_referenced.gif"); + public final static Image CONFIGURATION = createIcon("node.gif"); +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ServiceReferenceNode.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ServiceReferenceNode.java new file mode 100644 index 0000000..1c60811 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/ServiceReferenceNode.java @@ -0,0 +1,46 @@ +package org.argeo.cms.e4.monitoring; + +import org.argeo.cms.ux.widgets.TreeParent; +import org.osgi.framework.Bundle; +import org.osgi.framework.ServiceReference; + +/** A tree element representing a {@link ServiceReference} */ +@SuppressWarnings({ "rawtypes" }) +class ServiceReferenceNode extends TreeParent { + private final ServiceReference serviceReference; + private final boolean published; + + public ServiceReferenceNode(ServiceReference serviceReference, + boolean published) { + super(serviceReference.toString()); + this.serviceReference = serviceReference; + this.published = published; + + if (isPublished()) { + Bundle[] usedBundles = serviceReference.getUsingBundles(); + if (usedBundles != null) { + for (Bundle b : usedBundles) { + if (b != null) + addChild(new BundleNode(b)); + } + } + } else { + Bundle provider = serviceReference.getBundle(); + addChild(new BundleNode(provider)); + } + + for (String key : serviceReference.getPropertyKeys()) { + addChild(new TreeParent(key + "=" + + serviceReference.getProperty(key))); + } + + } + + public ServiceReference getServiceReference() { + return serviceReference; + } + + public boolean isPublished() { + return published; + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/StateLabelProvider.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/StateLabelProvider.java new file mode 100644 index 0000000..5cb5b65 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/StateLabelProvider.java @@ -0,0 +1,82 @@ +package org.argeo.cms.e4.monitoring; + +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.swt.graphics.Image; +import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; + +/** Label provider showing the sate of bundles */ +class StateLabelProvider extends ColumnLabelProvider { + private static final long serialVersionUID = -7885583135316000733L; + + @Override + public Image getImage(Object element) { + int state; + if (element instanceof Bundle) + state = ((Bundle) element).getState(); + else if (element instanceof BundleNode) + state = ((BundleNode) element).getBundle().getState(); + else if (element instanceof ServiceReferenceNode) + if (((ServiceReferenceNode) element).isPublished()) + return OsgiExplorerImages.SERVICE_PUBLISHED; + else + return OsgiExplorerImages.SERVICE_REFERENCED; + else + return null; + + switch (state) { + case Bundle.UNINSTALLED: + return OsgiExplorerImages.INSTALLED; + case Bundle.INSTALLED: + return OsgiExplorerImages.INSTALLED; + case Bundle.RESOLVED: + return OsgiExplorerImages.RESOLVED; + case Bundle.STARTING: + return OsgiExplorerImages.STARTING; + case Bundle.STOPPING: + return OsgiExplorerImages.STARTING; + case Bundle.ACTIVE: + return OsgiExplorerImages.ACTIVE; + default: + return null; + } + } + + @Override + public String getText(Object element) { + return null; + } + + @Override + public String getToolTipText(Object element) { + Bundle bundle = (Bundle) element; + Integer state = bundle.getState(); + switch (state) { + case Bundle.UNINSTALLED: + return "UNINSTALLED"; + case Bundle.INSTALLED: + return "INSTALLED"; + case Bundle.RESOLVED: + return "RESOLVED"; + case Bundle.STARTING: + String activationPolicy = bundle.getHeaders() + .get(Constants.BUNDLE_ACTIVATIONPOLICY).toString(); + + // .get("Bundle-ActivationPolicy").toString(); + // FIXME constant triggers the compilation failure + if (activationPolicy != null + && activationPolicy.equals(Constants.ACTIVATION_LAZY)) + // && activationPolicy.equals("lazy")) + // FIXME constant triggers the compilation failure + // && activationPolicy.equals(Constants.ACTIVATION_LAZY)) + return "<>"; + return "STARTING"; + case Bundle.STOPPING: + return "STOPPING"; + case Bundle.ACTIVE: + return "ACTIVE"; + default: + return null; + } + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/package-info.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/package-info.java new file mode 100644 index 0000000..873bf31 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/monitoring/package-info.java @@ -0,0 +1,2 @@ +/** Monitoring perspective. */ +package org.argeo.cms.e4.monitoring; \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/parts/EgoDashboard.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/parts/EgoDashboard.java new file mode 100644 index 0000000..f2a73f2 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/parts/EgoDashboard.java @@ -0,0 +1,41 @@ +package org.argeo.cms.e4.parts; + +import java.time.ZonedDateTime; + +import javax.annotation.PostConstruct; + +import org.argeo.api.cms.CmsSession; +import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.swt.CmsSwtUtils; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; + +/** A canonical view of the logged in user. */ +public class EgoDashboard { +// private BundleContext bc = FrameworkUtil.getBundle(EgoDashboard.class).getBundleContext(); + + @PostConstruct + public void createPartControl(Composite p) { + p.setLayout(new GridLayout()); + String username = CurrentUser.getUsername(); + + CmsSwtUtils.lbl(p, "" + CurrentUser.getDisplayName() + ""); + CmsSwtUtils.txt(p, username); + CmsSwtUtils.lbl(p, "Roles:"); + roles: for (String role : CurrentUser.roles()) { + if (username.equals(role)) + continue roles; + CmsSwtUtils.txt(p, role); + } + +// Subject subject = Subject.getSubject(AccessController.getContext()); +// if (subject != null) { + CmsSession cmsSession = CurrentUser.getCmsSession(); + ZonedDateTime loggedIndSince = cmsSession.getCreationTime(); + CmsSwtUtils.lbl(p, "Session:"); + CmsSwtUtils.txt(p, cmsSession.getUuid().toString()); + CmsSwtUtils.lbl(p, "Logged in since:"); + CmsSwtUtils.txt(p, loggedIndSince.toString()); +// } + } +} diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupEditor.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupEditor.java index d54f8bc..80c5998 100644 --- a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupEditor.java +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupEditor.java @@ -25,11 +25,11 @@ import org.argeo.cms.e4.users.providers.RoleIconLP; import org.argeo.cms.e4.users.providers.UserFilter; import org.argeo.cms.jcr.CmsJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.useradmin.LdifUsersTable; import org.argeo.cms.ui.eclipse.forms.AbstractFormPart; import org.argeo.cms.ui.eclipse.forms.IManagedForm; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.parts.LdifUsersTable; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.argeo.util.naming.LdapAttrs; diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupsView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupsView.java index 73e4f5d..84a279e 100644 --- a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupsView.java +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/GroupsView.java @@ -15,6 +15,7 @@ import org.argeo.cms.e4.users.providers.DomainNameLP; import org.argeo.cms.e4.users.providers.RoleIconLP; import org.argeo.cms.e4.users.providers.UserDragListener; import org.argeo.cms.swt.CmsException; +import org.argeo.cms.swt.useradmin.LdifUsersTable; //import org.argeo.cms.ui.workbench.WorkbenchUiPlugin; //import org.argeo.cms.ui.workbench.internal.useradmin.UiUserAdminListener; //import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper; @@ -25,7 +26,6 @@ import org.argeo.cms.swt.CmsException; //import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserTableDefaultDClickListener; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.parts.LdifUsersTable; import org.argeo.util.naming.LdapAttrs; import org.argeo.util.naming.LdapObjs; import org.eclipse.e4.ui.di.Focus; diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserBatchUpdateWizard.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserBatchUpdateWizard.java index 4fc59d3..6f075f1 100644 --- a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserBatchUpdateWizard.java +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserBatchUpdateWizard.java @@ -14,9 +14,9 @@ import org.argeo.cms.e4.users.providers.DomainNameLP; import org.argeo.cms.e4.users.providers.MailLP; import org.argeo.cms.e4.users.providers.UserNameLP; import org.argeo.cms.swt.CmsException; +import org.argeo.cms.swt.useradmin.LdifUsersTable; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.parts.LdifUsersTable; import org.argeo.util.naming.LdapAttrs; import org.argeo.util.naming.LdapObjs; import org.argeo.util.transaction.WorkTransaction; diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserEditor.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserEditor.java index 66f4420..fb443e3 100644 --- a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserEditor.java +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UserEditor.java @@ -21,12 +21,12 @@ import org.argeo.cms.e4.users.providers.DomainNameLP; import org.argeo.cms.e4.users.providers.RoleIconLP; import org.argeo.cms.e4.users.providers.UserFilter; import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.useradmin.LdifUsersTable; import org.argeo.cms.ui.eclipse.forms.AbstractFormPart; //import org.argeo.cms.ui.eclipse.forms.FormToolkit; import org.argeo.cms.ui.eclipse.forms.IManagedForm; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.parts.LdifUsersTable; import org.argeo.util.naming.LdapAttrs; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.jface.action.Action; diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UsersView.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UsersView.java index 720945c..1d7c873 100644 --- a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UsersView.java +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/e4/users/UsersView.java @@ -15,9 +15,9 @@ import org.argeo.cms.e4.users.providers.MailLP; import org.argeo.cms.e4.users.providers.UserDragListener; import org.argeo.cms.e4.users.providers.UserNameLP; import org.argeo.cms.swt.CmsException; +import org.argeo.cms.swt.useradmin.LdifUsersTable; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.parts.LdifUsersTable; import org.argeo.util.naming.LdapAttrs; import org.argeo.util.naming.LdapObjs; import org.eclipse.e4.ui.di.Focus; diff --git a/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/jcr/e4/rap/CmsE4AdminApp.java b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/jcr/e4/rap/CmsE4AdminApp.java new file mode 100644 index 0000000..de497b4 --- /dev/null +++ b/swt/org.argeo.cms.jcr.e4/src/org/argeo/cms/jcr/e4/rap/CmsE4AdminApp.java @@ -0,0 +1,17 @@ +package org.argeo.cms.jcr.e4.rap; + +import org.argeo.cms.e4.rap.AbstractRapE4App; +import org.eclipse.rap.rwt.application.Application; + +/** + * Access to canonical views of the core CMS concepts, useful for devleopers and + * operators. + */ +public class CmsE4AdminApp extends AbstractRapE4App { + @Override + protected void addEntryPoints(Application application) { + addE4EntryPoint(application, "/devops", "org.argeo.cms.jcr.e4/e4xmi/cms-devops.e4xmi", + customise("Argeo CMS DevOps")); + } + +} diff --git a/swt/org.argeo.cms.jcr.ui/icons/actions/add.png b/swt/org.argeo.cms.jcr.ui/icons/actions/add.png new file mode 100644 index 0000000000000000000000000000000000000000..5c06bf082d60a1c0cb55aeadac668e2d106dc5c0 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xvd=gc;dYI$i@A8$4Yc zLo9le|NQ@N&#ci_@&yGcYrR5*>Tle2ZoyT;h7vHBEm%7|K>{>(;bJ8yTeb4vhiRC;!T0?H0O-1Y zDg=~SwDULMpSERQlbVT)3!}fk zZ#^E1;rrSTR4Nq!fTlH|xw!@9a#@9|PY9;)mWVRXa9s)jU|Z%!q3~+2wps{ zz-vg7WHFsizuhK$V4!mJkD@4Q32<-sza&>|Oxw0^zztxGsil;!BLG&6F*P_drD?hm zLVS)%Zrk>&EXxgmcy#7@P8`Potk-L{+bsZ56p>{aN~vDF3#b8Rvl&qo0T70v)#vj$ zN~uA>X{hZE)HIDP<{d$6&2qUMV)cqyK)2QN`RvV5N^!Ydp6nJ-Rn_1KN+}M9L$6p5 z(8-t)++vS^p=z4OUYpjM-EIfmmUlcJpJ2VuG3J=A*Xz%Izkl}v?vT|Gpe)N@_x%R| WxMpQW@XLw-00000Qmg$qzT3_?;|TVF=kELB^T78>OH&0XLzO<0p0KBcBYz{(nv2NL zEux~1zwU>q(dqbv6twE|GHJ;L-(%SF5Sui~C^74{ykqc|A+7Wh z5esGXd$gLVx=a+LQLp%Aq>p9WHJGX8Xv<5~`zYBqSj1{;E?tHU66jQX{0ch!u}5ds zC8UW`2zDbacEsC~EB_6nYbG>Y&G!#_cKS;hs7U9V-zUFKzpWc? zLo9mFPCCfj6u{GF&%VRxXubL!4|)qjO}gg>klxZ?TGXw~#-V zU_Y2&N}FX?r*L1YbYiM-aj|xBv2}#Mgo3?-guaA=wSS1Yfrz+)iMWB7#*ml2h^x<; ztIwFU(w+bR{{R30A^8LW0015UEC2ui01yBW000F(peK%GX`X1Rt}L1aL$Vf5mpMgx vG+WO#2NYmJDM}^)l;8n@L?90V%CN9pFcyU&MPO(u48jTlL$uClRtNw)MiWcq literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/add.gif b/swt/org.argeo.cms.jcr.ui/icons/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..252d7ebcb8c74d6e5de66ef0eb8856622a0e9d89 GIT binary patch literal 318 zcmZ?wbhEHb6krfwxXQp_S{7na6>d=(Ze15;Qy1mX8t2lT^ zHOHgY9FJamJZkN+sI|wVk6ueSb}ixP)r4bLfn?%^+sU^crQUj&`rv8W|Ns9PC;*B- zSr{1@v>9|jW`O*}z!rUAYJrE2RKG`JYNRKhwpQrnor{(Ph`sVEnyR2Kc;c~(o$WdP zMb0Wl6K^dQ-0hgs;k}oL|=^|Nm0SzrXK)y_|Qr)9ml(^YbdjmNrRk zE>Qb_f9jiy-T!ZOY@Mh)vqbp+>n)or4gNe|{QGY6|6A?fl zjZ!=6j2<7X-BD|Fb5r5B`_ukkEd770^Z)D3|DP`T59EG5^Z(Z?ku4)and9)6>(=d)mgLW n@W?m|DJ@#Om`_y7SyOTKnl&senl74~w`|?$w_~TLBZD;nnW}>Q literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/addPrivileges.gif b/swt/org.argeo.cms.jcr.ui/icons/addPrivileges.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6b251fc8553fe59749bc1a6baa172ae3d9e2723 GIT binary patch literal 564 zcmZ?wbhEHb6krfwc*el6<-kp^tmVFWt9&x&CDd(8Yuetu_-sJgrktMr1^ov~CLOAn zcC=~EiMIKt{L426Rc;Qg+8kc9HL`A7Y~zlM&OMdWk4#;C`rflom+!s3@#uZmiZfU4 zzrFh4?c5#LcAUPm+k2& zU!HCI`+o1=4~PDKI{x?5$-ke^ZJVU>^;XB9hy8z^%=+_e-k)dl|2$i;v0HIVzw*I( z7Rx#15+*@oPB6j z@yTtS*G_M`d124zw-5h=0mEPdia%Kx85jZ>bU=;*#R&uZ#D;(-IW|_grjE`IUR6<+ zt_cA=@}kTWCvY=O@8VLIoi;mwQ$tBsjBz1{hOCs7jJK7Q=L8XjHIiO7ettF{UBW7I z;y#8>{{Fs(6NEG+-Cexh-MwAhy9AYGER78uw6)AEy95-aE%bD)ZFS5oy7<*3T=gBD iogGbGyV&^{-0V$iek@Qtd}3+3i;&tDF|8m425SKKG1WZ) literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/addRepo.gif b/swt/org.argeo.cms.jcr.ui/icons/addRepo.gif new file mode 100644 index 0000000000000000000000000000000000000000..26d81c06595326b8f29d12272587491bed580e75 GIT binary patch literal 964 zcmXYwacC1~7{;HA*Cy>!P0pUJGq4827_OjnHg= z(X%RD=)Ev zX*hvbD*&I244@@I*P#eV01g8G0GoLQq~z%&O0v_3Tn{Y5(I2ll0#pI!7&O$3!M=Nm z`>X>M#4yaDGiV>9y+VNLFzo)Vo!`|BXdEb4i(*-p?C*vN zhOG<+m$MW&k3+-z^_GCrTAF-6A_W+Gc$fn$yUa>DlQf1KV_z0ae@oI{E>FEEBqJr+ zkhtdRT)tr?BJZ_92X3E#COwz-*|WCb`(}at0@jHWg_-u+(0 zGz?ACm;i>gw+R{dcGJ#s6yF{~CEucx>(9Hbl`TJ-Z?*DR!GA@8k3pk-*#Csva}9zg z&=yam>MAz6biZp?rO;Zv`{j;DuJk#9wl1LZUNsKkl!4qqkvvXYiaqx{Vf| zyd69(Z8&>jf3ny!`(1V6Vp!k*p!3c#! literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/addWorkspace.png b/swt/org.argeo.cms.jcr.ui/icons/addWorkspace.png new file mode 100644 index 0000000000000000000000000000000000000000..bbee7755fe05ebe19b59c1ffc3f4a3d77fea3faf GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*IARMP3W4?(K)-RbzW7& zqJpYr*YA9cD_ECax+=S3c)_Uqr@_kX{fzjSWj-_Pf_PE_7HNqN_FwLi}n&#M$$ z)+n{CNor}6)VePD-*=m5mI$9cx&Qm))8C$6et7-r+^&xQ|NjHsMG`PgsmTCpFenM~ z3kGT@1u!Hny-)$v%b4Wt?qYA3Y)}g1a29w(76WMyFm^kcZ3kr3c)B=-NL)@m?IXaVr4z7rm+ngS`uUp37@8NaR)tj%&yyM<`F`8%5|Ke}1Jd+N4N~Fx5Y`8*f nd6I$8xdRJw{@R!S5cAdfBv)~H#f3vacQAOm`njxgN@xNAdhX?w literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/adminLog.gif b/swt/org.argeo.cms.jcr.ui/icons/adminLog.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ef3bca66b88efa91777bdbb7b5a9b5697144fb1 GIT binary patch literal 617 zcmZ?wbhEHb6krfwc*el+Ofs_Z$H{3tn@c4AYYk9xOzQu~4ui1RM;q&W3;<1%R$5xyE zx*PTJl+(vk&d;_!jYtQ?4IQxSd{Q{dA+`vrSSTcd32crG9L-(ywFMM`tPR z>k&OLQT)g>xg*mR4s?q=SuA;|U;5Dk$%pf$wv}@4sFvSRBfq0sVMn#%=1RrKZJY;7 zg$|YoA1D&pQy{W7p6zKR`^E_N|Ns9p5CV!nSr{1@N*HuN3PEwgz<#WuM4r2)wT)Z8 zq>G2Wx38a_r>lgQLvQ+w863Qm`9$<|wHUOtXU*y2=hS0kVP@3#NsNn4^XU>3)zi?> z(QuFUGPZJwa4!*%UCqYI7$4+oayX)}L{LFbMO~dKJITq+BOs@sL|j!*Q%;#H!_U^p z!Z|X(L`Y3d>APaO|9i_Lc`pi1OkiX_$dkG3O~=8-9MjAuixkc@+0oK1W{|w-%pFNX0S0RT3Bd~u literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/batch.gif b/swt/org.argeo.cms.jcr.ui/icons/batch.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8ca14a8ba640a1122845b8804e4345daf24c8ed GIT binary patch literal 223 zcmZ?wbhEHb6krfwIKsdn-{N=Z-udGXF56B^aha7FwydIfbAR~iqKMUn5kPWPq3`lk z-({(Z8xorLH8$^UoP4zX|Nr^_@5k?-Z~y=IhyVNSXZ04}pKqV%t2!qmEX2a#|Ns9C zNI>x?3nK%AG=mOE3}hz*Ys>?+zLd;)88b5@wUTCtWfpY#2H7RP(2A7mZYjMKq9xTO zSQ!=CAeNHN%)sKdy}Qhu$$^3OAltH?7b=tvJbuU^;IcYXe4&MmP=iRq!3YK(JqBI| O=A_0jy-syS25SJFSX2-I literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/begin.gif b/swt/org.argeo.cms.jcr.ui/icons/begin.gif new file mode 100755 index 0000000000000000000000000000000000000000..feb8e94a74f14633174999f46b00c5fea61f11ce GIT binary patch literal 210 zcmZ?wbhEHb6krfwIKsd%uV?<8?j^0QTNqTcpPZj^a8=#!J?VcR?f-po_Dp~2nL$dk zql{)J+RjLEo}Cr&9}E~s0g69a7#V<8>3}qW>||i|S5WC&^1~)I%ZztbpMSDM&+22x z8g1h{UcG=1Rx&Cu+mXtP7Be`d^>IBVvFxwCs0%e`Jf>Nl-uSi7|8_}0Rs zn~RQaDL%BRbl>{&U2Cfzoan!@DdWnf%v*bFu5QZw|NlSG6Q>F<+y_$jB|(0{KoJT6 zL!VlWIM67@ByV>Yd%I+VQXq%3z$3C4NPB>>+sSM@AY-Pdi(`ny<=C^=g_;ZmS|18X zciFlHGAB7~G#8P6_E-LN3a8}p|Igmkn0FtE_vl!1!a@1{+>9NO)81Qf+y9O!_IRDQ z|Msf0^KNRh-te_}-Z9;K&V9yj+pML&S-nlWTE`&6zKr=mWu6sd%pNXPxrGsHn|xgi zdkv0eiRR3-nZdFwQTCMb6oIS=)|N>QO;M~Lw`9m1p8nL|sfO|F7S;LN^}~Q}WMJ@g L^>bP0l+XkKDjg<6 literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/browser.gif b/swt/org.argeo.cms.jcr.ui/icons/browser.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c7320c69eddd9a250ffaf7734c36617cb24ce8f GIT binary patch literal 582 zcmZ?wbhEHb6krfwc*elc+%@IbpZ^(sdvYf3%b&bIsD49O)8??|%~7peqg%JecWjUE z+@9RCGo@!|M*p7dNqh6B?Dwr*?_0Ajuwmonr(e!I`n>wm+wC{rAHMhT*Wdpw2cAth z_F~?dS3m#$zxw(A%b)*0{Qm#%@1uWzAOHEW_|K0ezrQZ|`|HBL-&YT9u{yCc?B}bJ zpRdY)zN-BBs`}@v`afTff4*-2>4y8K8y=r-czu7IG;><>%xNv3ui1RM;q&W3VtuL8 z;pN)LR+;{~8`WCjuy9uGfjP2=7pWXxtbTf>{`=DoeKmHg7nDBRCi&~6-i#*eryC_d z?o#`>Oa0d|?KM57i`y+8Z?WCfZ}R=guGjaEY_I1&)Ter|SM6~d=f+yA7dMVPtz`fI z|33pAf#OdVMh1px1|5){pg3V*U)&Jg)ZEhA)~xAh?c|`@-lXAcsjOqKuOEcXJxdMw2YXzgs2FMlJ>OFCLvaKPHtX4eilVt zWA9_pfpT(gH*N$f>RDWA@{^NylYcJnr)J<47188xYQ|vy)!tv-#3jPH$x}{&p+SN} l$x}=xVgZlVBSnS=J^^D9%O}q5N4u?RY;K*{n5@8H4FJ8>>N5ZU literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/bundles.gif b/swt/org.argeo.cms.jcr.ui/icons/bundles.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9a6bd966a5392e7755776c0c69d9385e2298f69 GIT binary patch literal 344 zcmZ?wbhEHb6krfwxXQqATF>%kT-v?-@+VE5wmHkVTv{Z9CaA~F67cSj3!gY^$Cc!j z?G@W+s5JN+bVhUKn2QwHM9hwjm>rX~I;&tw`sx;`<&9Fy8>Hryh|MVxn~^IrIYVSd zuIRr@wUg6@|LqU{|NlP&ErH@s7DfgJ1qL0EB_KaBu$4MYDDcqXVm$F=!ovcCwuZ(M z1_2`}5wFLbOdR`~v{o2udP^N|uu`aVxi|5+pp2NF+|A>UX1MT)3sku^x3o5Mak+_# zy0Njjip$E1xo~lCbUI1O&ykmK=3r;%aGpJPz5*8~3k&B=1(``w&a7LvxyVVkwK_6b F0|3)}RLKAU literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/changePassword.gif b/swt/org.argeo.cms.jcr.ui/icons/changePassword.gif new file mode 100644 index 0000000000000000000000000000000000000000..274a850e4d9b8deaa106f24b9a90f3bb959384dc GIT binary patch literal 563 zcmZ?wbhEHb6krfwc*elsmcGO*Yq@XUDxb`G33c1jnznZ@KD+(Mor3-YC6f+SOgq{% z=S185Qi?Ij z|6i&;6Au`2SMm{|nLoFGc^qHva#{rX3NNcrT2`U9tP+T{mbW;~PU2b89KNbM zVRd)nhDjM4CS`7!p4XFVHX+M;LYB?6Lg%T4&eIBA=2rU7sq|ga6dqz>@c;jRhQSRK zf3h$#FnBTOfSd`669)DP4PH&nO`>e9qAgv`JmS18-QC=xyv!53xtOMRaY_hJo9)FR zDJIOvIMIHUq@=KbAVaskoSclkh=>qBdzYQ8tcI+No$ZmMc1_mm2Il%|=hdXt)TPyI zygXFRJWaJU^$d-SEmc*myxf#^O>|V=>FHT$8@e|;D<~-{>AAQz{p)I~`SHNXL&MQQ MNG?W0Lx8~=0EiT{v;Y7A literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/clear.gif b/swt/org.argeo.cms.jcr.ui/icons/clear.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bc10f9d07cbd44b89abef5dc3732b76491db431 GIT binary patch literal 545 zcmZ?wbhEHb6krfwc*el6XlmuWNoDgVmCx!eUN)n4PJijj*$oS)RBc?`zIJ}gzV(xK ztm@setn0wWDZAHB*u8e*zrVld^p!51Ub}N;@3qt0ubhbqaZ-0IJ^!vxxKfiwb`}^na$!!lV9Q^wB z*~gcUzP)|+_097iAK!j^^Zf76@BjY%{`>papPxVe{rU6%-@pH0z%X=x;!hSv1_n0< z9gvejal*h}*WlLF+|t_C#M{}`-r?HU&)dW0;@~V`=E~L1XJ%?@@8rtgBkX9r+*p*m zoyW=6NXb@&r-#GD#@fzOnxmalSyNF#QiijKOi*b(^5~A7d;9p_WMyUB4%0kq)@+a^3?Dy!WZ1WF z{|n{=`}h3-8nW``%aLiHUQBg$Bbl!@#d!zcw%;`4QyY z{rdWP2G5^8WjJ{75L}_WygbZ%$icE;#foK#jA#Lc(-1TO)(m1WBa1@4a}(&D1RY%+ z27Z1%bX!q0gQF2kRILXF7=x;c3d4g353$*f62*+@@r)kYIKTxUb_BZQ10yk-L4l~C zAdem+7mNpc?|h`T2Q;j7agXP*+<8&S8v$?wL-F5KlvW;h#Z9KDJ?WxWwYdfZ_ zU9j#{=hU^!HlOL3y0&}D()XW#HFZvT{QAeM55GQr{nbBn#l08bAHMqW`1SYa?|$5S z`Qz!^A76j`nKXOZy_etLeERYE`|qzme*gIOXZpNFrB$`F=g-e6$X~E{&Z2#}Q&vVT zT|V>AubZDfTwJws+P}Z=et+8j`|HsueL1@}cW>X=w|U*f4QnQS|8!~Fx{lv(R{egv zZts@v<@0NPKbgL_MQlTv(2hEhEmgw18%1|DitcU_TahcUrciKok>Hv_q1A;#%d!Pl z#j0_Ck3_2h;g5rdMeMy6NQ*%pelT}A&M_ap6U%z>ew-p2PG-ig0 zJw`H$iZTnVy=`qg43??4+mX*la4GamYaX=rL{kCS7^W zv-;;RoVRrF))GFXVPSLoj*VTDx}?rycUKQL_uKBxs?xk{?CjEN-d;8?Ey_Z_g(QSj syeFw>UU|sG#KJ8Q)1k1kiJezYr{cp0he=H=JTe9z6C4;9J1|%S0M7>4$N&HU literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/delete.png b/swt/org.argeo.cms.jcr.ui/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..676a39dcfa1f55439af9dbffc29dd6a3c0710498 GIT binary patch literal 447 zcmV;w0YLtVP)i_@&aY;l$R5*=e{Qv(y10{e7ne)O%Szw=zN8x;h6aj3CubUdz%~wb< zKo(z?zqkrqeFFy0c2Xj8a6h5@n+QiQM)A!jo@n09;X_+TJ zm~#Q{0+?ntrr)wGOn(?mMJ}oduzflSa|ui{0|Ntt6xT~OeW7b7VJ?ArA%TtQw=B#y zWJB&-Xm5vUh5<2-w`{zuU%ODe@YGs$88hR*NMwco|1&Z$GNK0ZpMNY2$X;Ybjs45#1d-$4&tCUk{={;~34wH`-uK`{V1w9x@G z(_aQtk&7zGv4dg&HqHP3Gol!REsA03pa5O-pMNY2Ctn-g`u&e}EjB}VS--AAcEN&Q z|5zU*Ylelk?6Dgm=mGochw!h@zq!j87)VIUuqZ}P$_)Si|A*t})=C0!>_lWetrJ-yMN}2`!9byeD&kO%kPg~ z|9JA|$MbhTUVQ+n|MmUnp9!;;-v^0*fBWg@*B^gAfBW_D_4g-le|-A(Thk*uyK&}} zIZNAStp57r_xGQ_r_Nn6W8R`!3l_{O}Tjt3|DuWZV=vMKY{-kPhMGXMYo&oHEb;!hSv1_oCK9gwR* zal*hpvB9;exuvzmzN53Ft;vSHe}a>JkL`pB&MuQ%tr+I&F~~bOJKD8c=;~@}F=}b5 zuvxcSimK{pYG~?+iki2Y^6|;-)Ra4D)@m$rYMYMoDU()1*~^E8FB`S$3khwL*?HTb zRY96}mB3ncY3){S9v%rPK_v+_39(jw#b1(=;=fs2MFb=kC^Ry$FmZAu94QD;V6X-N Du-DPt literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/file.gif b/swt/org.argeo.cms.jcr.ui/icons/file.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef302880717d12cc7dcc93a5ec9409488a788e7f GIT binary patch literal 577 zcmZ?wbhEHb6krfwc*elsm$lF@Yk_~(g0RA6@s(>r3zvl!E{&^PlisvBy=hZM)24#1 z9pw}ERe;dm+Gz(r{{H{r&;OtQ{(t!Q|KtDv-~Rvq{{R1v|Nnpf|Nra%|KI=r|M~y_ z-~a!`S@y+Q4#n9HCE1Rpxvu3o4n>&`#aWIO`R*0@-c7}JwfXjydCp}yuI;7P)2fXp zRG4;`S*&W)UD#kSyUuV%wZWWvqeU&IE7~m{9cy0KrnROYC}Z5GBYybE5lN#yT~U6Xo$Ra(3=+D1dScga+z`_1)0SMcgq@9vNlLp4}NkYYq1|o9u5f+1+4#yxaU}r`gdi^F!@s8_V^#R2r-=)!$xYw6WY^bAj4_ zFkpZI#h)yU3=A?1Iv@d%oeZoI3hI3+ne)<@xV>1B`(fEuK?V+&Lu+13upU?-aN>~% z+leJYmV$v?7gmUP30m^pSR?jZz)|4A1_>U)M7|eWr0xntihbB2lP8!e@?(!&ykzXZ OhQ@l`mR1!-25SJE4`R#! literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/getSize.gif b/swt/org.argeo.cms.jcr.ui/icons/getSize.gif new file mode 100644 index 0000000000000000000000000000000000000000..b05bf3e3dd02120798859e837bd3b390f66aa343 GIT binary patch literal 587 zcmZ?wbhEHb6krfwc*ekRv-bA&{#(adPVdV-dTj3L#YtdRX+5WUX2w z(-vFTULXH?VId1*4qQE?UvFyH@8UAS)2iGqbV>BKOFPVatj)@-JZAVj>|g(<^`-hy>{)Xwc9Uj|N7(Wj!WBP=SGC|`$tU*DOsCSxGdeP!#ZbieEyPz zoW+r+?;I^!7MHr%qisuG`u+7xmOcf&*{y(8b4!y?z($L>+Y2O z{{QXgzYqWZ|2W`baU#Ow!-S3-83`Q{5+52G{=Rwh9}E~M28usf7#SEc8FWA~_PQF%CtBoHOzbku^^EnU#9I9&tz7M` zEgUq{QeLMuJ4&i+8<;8jr>6f%ZSj|vlCgMojZ@|FxqumlsmC;YB%TG%FycS$(DEX{ WN5W7--^?UMt><`u;u#hu25SKL^x~cX literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/group.png b/swt/org.argeo.cms.jcr.ui/icons/group.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6683aff0871f801af323cad0f879991201b795 GIT binary patch literal 467 zcmV;^0WAKBP)OJ)Eo zSBV~P1@QF@>>x?2U^J!Xq21|)Tdgb!;3EbrRYfU>AT#W`y_7H9@}_(P@Kfg!+GE@V zJjn(-cZMB5aSTj9Kitk*UWvI-UCYEw`D5rS;40yho^x#$sGAt6F03L*o+;UMU%ozL zg$YLPTL8&5qw&W(fDHR69(#?72n4%|NJ~6Y$Gmc1BJ4+i0RX{jbCbiOXubdd002ov JPDHLkV1lLV!NULm literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/home.gif b/swt/org.argeo.cms.jcr.ui/icons/home.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd0c66950972e9fd6b4eee2a45293db7b0402a95 GIT binary patch literal 583 zcmZ?wbhEHb6krfwc*ek>=hf;IH{B?(Il6LneC_)9y7e)Ys}kzgCpT_NZrqsBx;3M1 zYfjfr^Oy#Un1=ILZ(q4_=gaqB7ao7P|N7gr_usES|9bEBw__J?ox6Jb!jmu8UwnP~ z{`vgb@~XsXFsG`()# z)P`jC{<4g|#s1N)K&pC%tK(wV?&6UV6I0Yt5EGW+>Ef1>5|vq# o@xi~D$(7S6WrD(k7KT$!PO1slaf?Yx}nH z1q*BE`DeYVcQRbO^a_X31KTqK5eiK?rGLJ(cPCtl`>k}Gfj5HHCvxLYme_`MZLG7U zOn?68yTFjVUHPbqVrdd~dTrF+$K=9`u-cBon6*RrB@+1`k*RVfqK zWKLN-Y3qThI}T3WabVi6gUikwU4G`sw)-cx-8;Vh-iht^j~{$}>etJ8|G%F3c7NLc zkB9!h-u(aj!~Z{@zq#1`|LKzdUvK}v)%hPN_2K;g4;TJ_y88c8$^VO`j}O-Ve|zHQ zroy9LW}B-F4z-)^Z#LQ8V7$H7=yQ)xE;9@A0!;d-r7D-u^zZTq8C!Eum$( oGn1lA$3G!YEyl(MRmC^VDelI0bKcdR0Xmhz)78&qol`;+01Q4Zvj6}9 literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/installed.gif b/swt/org.argeo.cms.jcr.ui/icons/installed.gif new file mode 100644 index 0000000000000000000000000000000000000000..298871653f056a8123af853bd587a3a394a208f0 GIT binary patch literal 183 zcmZ?wbhEHb6krfwIKsg2JR$LfrojmVlM|YTCuDU#`Nn+ojrm&Ea6(e+`Q+}C&Ne6A z?M~WReVf$xJR#w0P0icp=KufyGY}0Ff3h$#FbFc}fOLTDWMDN(Q0Ys_oR_g`UCwH~ wf;~&Tl5cyRGV#A}pn33MfPoClO2#9M3=T}1PDxg(O9XD{96I`To)d#L0F!by`Tzg` literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/loading.gif b/swt/org.argeo.cms.jcr.ui/icons/loading.gif deleted file mode 100644 index 3288d1035d70bb86517e2c233f1a904e41f06b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 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 literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/maintenance.gif b/swt/org.argeo.cms.jcr.ui/icons/maintenance.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5690ecb1b06ab9fbbc0cbee019c5049c0d727cb GIT binary patch literal 583 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 diff --git a/swt/org.argeo.cms.jcr.ui/icons/node.gif b/swt/org.argeo.cms.jcr.ui/icons/node.gif new file mode 100644 index 0000000000000000000000000000000000000000..364c0e70b1d6dc48f9d9abfceafbb4f63e5e1edb GIT binary patch literal 586 zcmZ?wbhEHb6krfwc*el6W%tD&KmUCB_Pefs%iNVm(`#3L`uh9Zk3TTdfM8Hb2nXEy7Tt)cRyde`|-ygpG`u5}Z!`D9^y!!t5&5tK+PqXU%vnDpS5D*?Bx$%1I52TfB*C4 zho3Lr|9Jo9*Qam4r_5RU^xco=?|;1d`19kp-=Dty`uOeF_g{Zz%wJ?aBVon4?KL}U z=PjDIXzA<~E2ghqJ!Rv%iCZ`H?cLhBb5qa$Z5{vr|7RG2K=CIFBLjmogAT~;pg3V* zU*6#C?9|fQ*3#7Ez|qs&=g{fw$YEh_(bwZR(Vo%V(wvc%nT5gBexjZ1R0~=5wQKDr z+A^tZW!kbu#de~N$!c9=Ha2M^n~Byk^UQS?E#bAEXeGK@^s17wsMSO>DMP8dckgML zP1Ms|ZJ^B~EF!5lQC0tx{#gcn)rnjRs}(d96cimaI$9DN+l4u7Z3-qFXzuiIHmI5L XgV9NeM?!&bXM&>>OK%esBZD;nX%XK6 literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/nodes.gif b/swt/org.argeo.cms.jcr.ui/icons/nodes.gif new file mode 100644 index 0000000000000000000000000000000000000000..bba3dbc69e5fe573644be01ece5ea0f5c374851e GIT binary patch literal 166 zcmZ?wbhEHb6krfw*v!Ci_x8uyj^#5pT$nR=`rO&=+gDbd-ductfBAnfV88&1KUo+V z7&sYpKr$dR7+8W0PI~s5n)o+QxEk5W;U3r^q*Rtwl$hzz!{oH%Zad4#14_*;9Vw5# zvUx1|Q0}Cf)^y9~)2ts6%?wP>8&xNBzTI$zg*9xh5rrn?;V;j*FfdpH04k_I ALI3~& literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/osgi_explorer.gif b/swt/org.argeo.cms.jcr.ui/icons/osgi_explorer.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9a6bd966a5392e7755776c0c69d9385e2298f69 GIT binary patch literal 344 zcmZ?wbhEHb6krfwxXQqATF>%kT-v?-@+VE5wmHkVTv{Z9CaA~F67cSj3!gY^$Cc!j z?G@W+s5JN+bVhUKn2QwHM9hwjm>rX~I;&tw`sx;`<&9Fy8>Hryh|MVxn~^IrIYVSd zuIRr@wUg6@|LqU{|NlP&ErH@s7DfgJ1qL0EB_KaBu$4MYDDcqXVm$F=!ovcCwuZ(M z1_2`}5wFLbOdR`~v{o2udP^N|uu`aVxi|5+pp2NF+|A>UX1MT)3sku^x3o5Mak+_# zy0Njjip$E1xo~lCbUI1O&ykmK=3r;%aGpJPz5*8~3k&B=1(``w&a7LvxyVVkwK_6b F0|3)}RLKAU literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/password.gif b/swt/org.argeo.cms.jcr.ui/icons/password.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6b251fc8553fe59749bc1a6baa172ae3d9e2723 GIT binary patch literal 564 zcmZ?wbhEHb6krfwc*el6<-kp^tmVFWt9&x&CDd(8Yuetu_-sJgrktMr1^ov~CLOAn zcC=~EiMIKt{L426Rc;Qg+8kc9HL`A7Y~zlM&OMdWk4#;C`rflom+!s3@#uZmiZfU4 zzrFh4?c5#LcAUPm+k2& zU!HCI`+o1=4~PDKI{x?5$-ke^ZJVU>^;XB9hy8z^%=+_e-k)dl|2$i;v0HIVzw*I( z7Rx#15+*@oPB6j z@yTtS*G_M`d124zw-5h=0mEPdia%Kx85jZ>bU=;*#R&uZ#D;(-IW|_grjE`IUR6<+ zt_cA=@}kTWCvY=O@8VLIoi;mwQ$tBsjBz1{hOCs7jJK7Q=L8XjHIiO7ettF{UBW7I z;y#8>{{Fs(6NEG+-Cexh-MwAhy9AYGER78uw6)AEy95-aE%bD)ZFS5oy7<*3T=gBD iogGbGyV&^{-0V$iek@Qtd}3+3i;&tDF|8m425SKKG1WZ) literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/person-logged-in.png b/swt/org.argeo.cms.jcr.ui/icons/person-logged-in.png new file mode 100644 index 0000000000000000000000000000000000000000..87acc143578dd58ab75d0f3de6b315d4232eb582 GIT binary patch literal 359 zcmV-t0hs=YP)k{qZ~=$|fd)N*8vxaO9*6~yRjLRuf$2LR{-GQ40f-Gj zhOj^d)}w3AF<@f|QG-aYx%G!(%7tIZ(gILDhKx`@&qtP(;AUi4;mwI+rO*2B3}1f# zM|Vjg6EwgWPz_+h@VJT~6SnY(XTlQN40qmR_!+AhNH11nK~7z8^*5XkVqDRmhCfxme^DGC|Y! z1!DY*o}@u~aVBL@GUj1pL<-1%$cDp{GIcT&CD|DuzyKqYWqdoBV*>yH002ovPDHLk FV1nI1hQ9y+ literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/person.png b/swt/org.argeo.cms.jcr.ui/icons/person.png new file mode 100644 index 0000000000000000000000000000000000000000..7d979a531ea9aca4c035c4f24bb773604796ef06 GIT binary patch literal 384 zcmV-`0e}99P)1R5*>Tld(?1P!xv0UQ*~HENl>QL=vMT3t@lHs%g4Om=am38RZ;kS4_IV5#lxt`f?-SCq#q%-%!=)Z!Y9_xn>Dc+B)wZBn^?%2Y%T7sx17L3e_$56j3nX{r`R+>Rn! zkpFFDzGtlm^o7oqQOIFEPvXORu6sTJS^$9DZMElL0nFhHb1?mm2UE=9tPtR3j7FDI zdz4EowMU3XSG7F>xS7QBo5JU6?pzViwtsYFSlq87-*N)CaFj*81C?r$EqB{AJQ?Nx eS*Eo9y3U^#!ga8$J%Ee=0000NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1lAyW#gtdPu@Iv@+POWXX=9OS>O>_%)r2R z1cVu&+uB-9mxU-|IVbz4>o(p8sw8hP~s2 zbhgd@D2EVBmlDxHpUNtR%68Yl1)mE!9vU-B?vb*QyTJ4CPO0RHqQfWSE_A*3tW(%@ zk>#85D;}N7SH64mG%sG=9K{s%qtDzy$a}))O}CkQJars%X7dQGnZBtrO=7!)uWyv^ nh1IveWIvG9FWnz`{ohq_0ZqyD{@ok4g96ag)z4*}Q$iB}>U+SI literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/refresh.png b/swt/org.argeo.cms.jcr.ui/icons/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..71b3481c9d4801ad73858501dbcbdd2c6f3d5627 GIT binary patch literal 387 zcmV-}0et?6P)typjR3aBk30N?-#eg>YSLjF7y}+ifUPA_ zg42ibo-t_|*Z^I8ZcM?Xj-Wuo8!2LAo=rGrN#N;4pe_!sYJ^|V4=llzN_UX#zick2 zce=JjLyrQg002ovPDHLkV1j9zouU8$ literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/remote_connected.gif b/swt/org.argeo.cms.jcr.ui/icons/remote_connected.gif new file mode 100644 index 0000000000000000000000000000000000000000..1492b4efae265051c43c5f2870c1f71f97c899e3 GIT binary patch literal 159 zcmZ?wbhEHb6krfw*v!CSZy#S@Z~y=Q{QLL!|G#g4f4+Tvy#4+Q8p}12WsEYxhqZ46z5UO4 xC{IX5qW?tG!t@NQxhzk8CmDO_&kQNvl+j$RV9uyFP1Eu=fc2X4FC}0Hs=5U literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/remote_disconnected.gif b/swt/org.argeo.cms.jcr.ui/icons/remote_disconnected.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c54da9ad04e75a4d661cde11103d636f93d003d GIT binary patch literal 155 zcmZ?wbhEHb6krfw*v!E2|NsBjuU{`)wrug@#S0fMoHuXYtXZ?BPoLh`*Vo?O-q6rc zTwI)ykpWc300xRbSr{1@co}p+Jdha-EFK$9dakw&zEL&p%2fxEV~JG{)JlUE`OP?D z!tp7LBO$spo_UuSlZOsdj7V$IN)8qgb5G%_nP;YGg)w^yPV`w5a_zD}ep0G83xhQP D%T+uT literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/remove.gif b/swt/org.argeo.cms.jcr.ui/icons/remove.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ae6decd03fb76703952b2cc8eaf9e41ed577933 GIT binary patch literal 351 zcmZ?wbhEHb6krfwxXQqA+}QL>Vab=`lFvmYpNmUxXz4%DF}bf}d|cDunVH>FGrOY- z+D{EEKZPcINzVS9ob?$uHn=&y~n$8D`1 z2l;<(sQc1T_xQ+>|Ns9p5DgT6vM@3*7&7R9bb$QCz*ci$MuCTpRKMGd^bncK1eb^v zqDfrti^MpzbSB1VUt0b}aql73M;xvKD|}WtK1fk5iV!?;_@hVR1O_f%UNKGv4?_+f zX(=fl4i6boi78XK>s@7pr?3jKN=S;#aFP{YATA>-vrJN4*4aRuZH4n{cJUaejfg!)lQ^<$D6M-{Y>Dd-&6G`OLqe_zM=xUuO29h0X9 zmd9;@$m*$?T}8C;Gc&sr?)E3$?M}Mef3OeyXdmR0InOI=`N;rh-@H{HJt97NM4SqD zI~n12D#Gn?kbgkgCjat{r(!*WDmRB#ZT=LJ@F_GQyk=`;-L?mb(Xov?uB4VMuah~K z7xy_i>vMAUm*nivDcP%=tZS3c>Dj-m(_&+{VnP3bFNGzai%LEhmwqWO+0w6E zGU-sow4;^Nk6i7j`O;AL6^I&Zcg%EYnscIU{;BT8XS-IMnY#M){W&X+Zm7MpY{A?e z*G_Khys%p@Zf1b_z@@(6mXY>C&Tkzn;%LgxCKY9D=>AP2d-|zkV;n3et z$Nzph`SIt% z7__IY`QXlYV3NJYfe^+83<{Igb=Z^`4!k%rQ=dEBL-F%6pZ><4e-i{AKXsEfGwWJo wSj>EJzF_383kAtf4>D^fXY61RRO;f(^b literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/rename.gif b/swt/org.argeo.cms.jcr.ui/icons/rename.gif new file mode 100644 index 0000000000000000000000000000000000000000..8048405a782b4e283a28717437d42d49d0d183d8 GIT binary patch literal 889 zcmYL|Pe>GT6vsca&bnKuZKIPbL|ArM7C{jY+h$vV|57l6u#PKKMyw&!VWq{!(ZWN> zE_vu6>2V1U3wbld)O9;_kT4MIP$%iK6ohNB`0MwZHT)gkyx*HQ-}imr_onMwXXwJ9 z4<7~4UHb1g`s@RJ^7-U!i(cHBc{iqSecGCI>BWPXUal8k$J#sF+rn+dgT>;*^TmTA zY#w)gul@^-FiJVRg}zOtOB53DivQ92nbD)gTP2@&cR5ky!>ba7jVtPqCu<*f+zf5|kC#pP&%Lu+@nC`18yqu@b7Ta3d8_`Unic zoWN2VQtQ?ZC)%@HyBEZ=6@3;~$bL2rXYQ+lpum>tA`M5n`4=_08zmOY(?qthdu82Q zVrEZlSi(pMUS*zSH+~vMpX#OXVJNa;I!)gDy3F4QeTry0(_3fc%agV9os%#-CA96UclUT*X(_7?1vn;yG4c5x4lB(=}If;K#{3 mJ!OrRJ+n*XWP{ literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/repositories.gif b/swt/org.argeo.cms.jcr.ui/icons/repositories.gif new file mode 100644 index 0000000000000000000000000000000000000000..c13bea1ca4123cee4276db0a468963bf2ca6fa94 GIT binary patch literal 588 zcmZ?wbhEHb6krfwc*el+`SaKR|EpfTI{fnG=|4Y~{Qb56-=9lAUseA8u<*~f|e{QkZp@nt_=Q$jntgwHs z^S;@xzusLuG*M|^zw(nU&hPg}?w;YXW19D?Gd<7G&w6-v-i{6PkF@g~YT?<}t+u06 z^TSrV2kSkyPxgB@op)a&-~LAaZ!2WCwQAp5>9=J<;LnHK9`p7<5360>udf`^tuZ06y_nalWR`t`=c7 zPX6|;E(v9M9b;E*RT0U#k|Iq~$_@<7Tq|8P%c2}fQEvenVYws`UykL0Nn!y3Z^oQ+>ZL!wE|2ISloN?$o#rdvz?#i z>xYh3*R7lQ)SSLPa$ff_z~xE2fYOO64PGTj6eh|0im9zS@FdzoO;km5)rTdIC-+D> KxACwrSOWlhFVLI- literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/repository_connected.gif b/swt/org.argeo.cms.jcr.ui/icons/repository_connected.gif new file mode 100644 index 0000000000000000000000000000000000000000..a15fa55380a15b034026ae13e7f62dc231ab2433 GIT binary patch literal 328 zcmZ?wbhEHb6krfwxXQrr`)kkNUweOjEIPEs>i36ff4;2w^JVS#M-eA>hW&h5`tw!e z&sR;~A18gim-zX*)0gXBzaM4)eo}gPx%RPDrhjhv{JHJ-^=86>IkK-0svcgXa(J=& z>6QBLPdj`&Y4Q4)|K3R=uXn0EU9b0ei|xmwA-gAA?4Dw|Ym(*mdhSDgst0@3-p=EB zyhMLvt<{TmrT_o`Gms7xf3h$#Fz7MpfV6`A#K4y7FulM-M@&$%^VugyiB@JWm4pZr ztLEoRm=;D^FHh$zVNj8g2z`~gNnp?QtrMT{iHL+>nf!0x^Y5i~vQ@>670nH`?Jce~ mW!?Td+WbsBGK#u7{>nO2rYY)3`|HW+EL*0uc$JGIgEasv#fKRH literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/repository_disconnected.gif b/swt/org.argeo.cms.jcr.ui/icons/repository_disconnected.gif new file mode 100644 index 0000000000000000000000000000000000000000..4576dc5635fc40f20c0ad41d96b081e891bf8633 GIT binary patch literal 209 zcmZ?wbhEHb6krfwIKsg2?%lK7w@y8Jc;(6C8&@tJeD(6dwJS$%-#mTq&iQ+HF5J3) z;_9Wt=T7Z7eSF*H^ZU-9-gW2ZnZx^5pEczu{_pUy?XYIbNix2N!yLs)>gIiY~ zI(YE^|Njg~K=CIFBLjmpgAPaxWG4fw-vhP2l*p`%RWlbob8wibb17?=m(BGxZh}qB z%1ImNsxix+^|+*v+>!b|vg1=;h<5Q4pRlD7>&vv*=Iix0EDSuE6FuY0uBOWEAsW-} Ji7+u(0{~PHYlr{< literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/resolved.gif b/swt/org.argeo.cms.jcr.ui/icons/resolved.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4a1ea1507068ad913d6151b496e2b303bec9dfe GIT binary patch literal 176 zcmZ?wbhEHb6krfwIKsdX(zwmBe0@;cuHd#^aw&_I)0bG5Z?LS`AP_T0C~mH3{5-LQ z`I5;CWKtH%q%M+4StygbP%d?`QpQrX?B(h?%m4rX&wv*w{$ycfU=U@{0jUDn$-t_c zpxT#`IWJ??x}4KN!Oi?Ij z|6i&;6Au`2SMm{|nLoFGc^qHva#{rX3NNcrT2`U9tP+T{mbW;~PU2b89KNbM zVRd)nhDjM4CS`7!p4XFVHX+M;LYB?6Lg%T4&eIBA=2rU7sq|ga6dqz>@c;jRhQSRK zf3h$#FnBTOfSd`669)DP4PH&nO`>e9qAgv`JmS18-QC=xyv!53xtOMRaY_hJo9)FR zDJIOvIMIHUq@=KbAVaskoSclkh=>qBdzYQ8tcI+No$ZmMc1_mm2Il%|=hdXt)TPyI zygXFRJWaJU^$d-SEmc*myxf#^O>|V=>FHT$8@e|;D<~-{>AAQz{p)I~`SHNXL&MQQ MNG?W0Lx8~=0EiT{v;Y7A literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/rollback.gif b/swt/org.argeo.cms.jcr.ui/icons/rollback.gif new file mode 100755 index 0000000000000000000000000000000000000000..c75399599d43dfb24941415a96ae81de26f7bedf GIT binary patch literal 376 zcmZ?wbhEHb6krfwxN61_SGM@)iz!d89sB)q-oL-^uWYD(^y<{O!+%DO)~%{xx&{!XxwYk1r~^u%=@Brrwn+r)^j}@!;&7_~L1&mX@q- z4B9s%`^|@+KhMU0{r+Z^fx(PH z2c!h#CkD2u4zmj~s%7~27X{sLP*CeQcFAlur@|yJSEj&Nmcx;&O|AFXtT$N|Akd{L zQk3J@zvXE2pN2ODSIo^!n;02GjZO3!7z|aEolUv9P4%Ws)l(De=ixCmF%j-$kXP00 zXJlb9)mgnpO3B4|Ig2D?2ZOAFq6<^gUbg*gGU_g@O!JN(m(X_MG&*Zu$T#0AcwM5`9>j?*jS5h$#n9cML9B`k&w1Ahrp@dn^nQ6hjyA5Yq z4FdX)*fA`XXZYx>(AR#dImW87v!lR@gZD*yz;xS&uJ6nrYm#^-xEHlDo6Jd2Xl&(R z7MfskeX+NZVE_k*B!icHPs9f0yD<(o7!nR8wy4Q%Vo>J$_&=bE(d6Go*IXt$W~q)+ dMu!GQhM#-1R^(heG8^a-22WQ%mvv4FO#lh0W2OKA literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/save.gif b/swt/org.argeo.cms.jcr.ui/icons/save.gif new file mode 100644 index 0000000000000000000000000000000000000000..654ad7b42407b334d90cc794efa27de55104d422 GIT binary patch literal 640 zcmZ?wbhEHb6krfwc*el+6w~t;=?ud9vy7?cE^q z*1q%4_Md-x_|o&km!6%t_VVPl7w2!kK6mTY)%$O+-hXrZ@w-PaKBPA<&u(2-(6RIc zNcPq9H=oX5zOnP@<=ao*J$&)u*_+SB-Al@Q7r*)NC8Bg!<-|)ZjH0s zngDZi_XtN5{Q%otw$=^~0s8um5jL8}0j~D0PWDc&0mjBw5oSh40pT}qg$J-}SVowt zsmpdhlU7$VjnL5(6Vnq{eg9rmMO7z4Qd#5=&;S2!TLcV~Sf{ZGJ2fOQEKqFF=5g={ zX-sWo;gpxKxS`?7)yyxaVsIcy!HI>JM{dQMpw>oDKCTTS4GxnV&13{JoirL$k1;TD bvT!H}I5;%1u=EHWIJ9Nu<>e7fj11NQ?2-~h literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/save.png b/swt/org.argeo.cms.jcr.ui/icons/save.png new file mode 100644 index 0000000000000000000000000000000000000000..f27ef2d26bad58ee0416704ffbd5dc1059750299 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XT0C7GLn>}1r6eR2G$bV*WKyVOcx=E_$SiPuvF0v@Bk~uH zur%CY(0a!a%FL#~{BLpMgzj(7hCCJuC-=8Y9Xrr;eC3Zlstl%g1m`pMvK(Sc@nFzn zo-jAA|GbDA8yDkM-i#JEUAsFLJN6o|@H+T=e00e1cj#x@#mMfl<%@#QZw7}3Muz*H W5@s=~eQ`kdFnGH9xvX#O4^Kg(>T{!Ta!*|a;=YAjj=TQKY zKEJ&A=t&i4W@o9YDBnbW?-`@O;Yj62$|`Ko+}b9=P*{SYu=J03#OT;RqkqJc;x@Oo zOBR4O3atfg1fSne)RK%?-++C7e~N1awg4DWSVlmg#Pag4%?m);nHE40K-t>@*j&KU z%5Gq3Ma&W=dK#&&uL2;rJdL~SD$bL)QGj4l4dRxKwMn#Xyx$>*v&N`tIAAmECkd`D zF!bzKx`1r_d%l=*8+Eswl@k|sGd1eR=bpw{S~(V0w_R)=MQJ>6=IPH=8A=nq6gaCdl&K8ljaau6xx0MAs9a7>$G>{s(8-R*+Sk71`uF zev%JR2!Zijb~UiBOy!-jSGaWRsgx`{=Hj)l_K1m<1KuLu4s1iA zn8F-x#ahKz<%S2uUB*Cy2_=U6B0uYVAn8%cXW8w3R+=%f#{QCQlRsPud<-7iO} zJ$^KGX<6+8An-dz+!8=giu459D729b)%L5N6u#nKk07*qoM6N<$f)08+u>b%7 literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/save_security_disabled.png b/swt/org.argeo.cms.jcr.ui/icons/save_security_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7d08d9adfe6fc7c82be26a196a90c1a9e4841a GIT binary patch literal 387 zcmV-}0et?6P)*h6Ni!dau}WH#AXao zN|FoRzFbI>Qcg%{*v5jWc9EzaN`a&yj{n=)z8 z9I|>S?8tf6^~;Gc=GlW=H}3rN8832Pyc!oK3>!9v5p64e`l})1OFa2hZ~k$NhAvvz zmy;~nvWiPTtl_sk^EE|IQdqVHW_)*DTL`4eLqf}ek3GCA1u~_c>V&4IrXwGaB!wj7 hBo0Ka_g!?=gg4txhOcH~fzki~002ovPDHLkV1kPOoGSnT literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/security.gif b/swt/org.argeo.cms.jcr.ui/icons/security.gif new file mode 100644 index 0000000000000000000000000000000000000000..57fb95edc3fe1e6cafc9f7bdc17e6bf886057030 GIT binary patch literal 324 zcmZ?wbhEHb6krfwxXQrr|4Y^XFV&x3w*LP<^Z(Cv|DQ4Ze<||+h3Nm6qW@nT|9@lh z|3moy&sG0FSO5Pu^U-PVH&+7x-?zWKN$c`P?VCHTE^iCEygm5DLY-|L^2-W^msKb& zt59232}D}UTbyPm@hoW$U)7zkx;t^hq>K%dGPg|6>q#}6kYzm~%Vt`k^VCA;X@xFR z3ti?``p&8JUD6aDVqx(A|9=Lef#OdVMg|5$1|5(Nke?XX5)aHM@X(R!Ke41pQ^#_q zDwAVC&?GkI;|>l|rF&HpS0ug+k;q_cxX5APvhjKo^KA#YDcowGBXt}MbvcElgt*#8 nMC1g;^_(@?IM_Kvw6qO%rn{=MvWjT)BmCdH>AyS7xlgyky6X6}xX* z1EorLhcq0C?KoXG=T!URa~(_0bu2#Hx#aBBb(g2Ey|iTKjpe&||hddZ5;qk~uG9)wI6NUFSaUSS{>Za!ZN*?!N=wZiNd) sIZmi7WXNEWTGUu#wO7JG@>rJQ1{Id|3`>PLoK>C{{5opa%D`X^0EsGB(EtDd literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/service_referenced.gif b/swt/org.argeo.cms.jcr.ui/icons/service_referenced.gif new file mode 100644 index 0000000000000000000000000000000000000000..c24a95fba3116080010f8ed5a3764e4d90276584 GIT binary patch literal 185 zcmZ?wbhEHb6krfwIKsg2`OC-8Up_p#x#jEYV_PSwY@edKYr5L+`<=hpK-Tb}4S|Q`*q2II~1}O{@I>|Nj|?28usf7#SD@8FWB8Kz1^)nkA_8rDV>_Sha3N z;)c9QdlqLOZ_Bai@A%`uPF**XjMmUwGAU-6$GW(pMcgqb z(|2w9;dV}`sl!pnk4?!TK`?#5FDL$gHF5i7)qQg`cF$1XJyZSvvl;8!CMAi|&nQV6n>fz?Ps zwJ#-eUdF0*IbH&~j0_v1I4TmBoId!c=P<+44xhfs9!jheEmS+E9{!nODz$daHc=)9 FYXDFdK#l+a literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/sync.gif b/swt/org.argeo.cms.jcr.ui/icons/sync.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4fa052de1013330d4541abd6d4d72292bf0cc20 GIT binary patch literal 353 zcmV-n0iOOxNk%w1VGsZi0M!5hiG+nnZ@^M!k4#^MRce%2ZJ1SRlUs0_Oks#mWQ$T~ zk6m+}NM)9Fe~(LVqH(I_lEUw!%kiq&`hL0K>G=Qg`u@@K|HtX`{P>*w_?`LfS^V{z z_T^;uAfoP!!Pl}FvXe~_`xH@ zmmKcCF2Rx@rj%^HgcZJxCc20#xrZy?j}NwkF}8v+vwb$Qem1dvI{*Lw0000000000 z00000A^8LW0027xEC2ui01yBW000Jlz@2bNEEz1OCBW9Gn(60SWa+}gzo||X6OdpAC pniZ}UB2{8+qLvgXp{K+VYbvgzz|tvZD96;vC(6Ls8R^Ji4FH!Gg(Uz0 literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/users.gif b/swt/org.argeo.cms.jcr.ui/icons/users.gif new file mode 100644 index 0000000000000000000000000000000000000000..2de7edd6467d1cda72bf3f3261a851ef5123c3d1 GIT binary patch literal 598 zcmZ?wbhEHb6krfwc*ek>-T+ljue_7{>xtp$SJo0$c(Z|!5 z?OV6+`s!Vm*6g~ta{IYW2d=N%b7{lg%j@@CTD$A~hP{^>rfi+|z>vY9 z12PO0Ck*VH8#0=jTUuKJg(6#hMZ;R{l7%y@_*^r@Qw&-og}YQ^cr$#(eOuy;wYXAU zd0kUw^gI)q9sF!#%@hO}%wj`>oSN<9ZDN(Zq@|c+gQFdr-4gv{mAuV0*kVJHBAP|? ztz%Vu%w2EFI%~H`2E_8HOQ|u%hMTk+M#ZMfSu&=5apzikqw&ERb{Up4DlZN!5}0Vn oe$M8?gaXEyQmrWw8HH*r)0xr|5*(5;1iCoXyjJN*axho}0DT+s*Z=?k literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/workgroup.png b/swt/org.argeo.cms.jcr.ui/icons/workgroup.png new file mode 100644 index 0000000000000000000000000000000000000000..7fef996df81185952a0fff9f45f03d2b9f366b42 GIT binary patch literal 744 zcmVP)sQr5zTgou@-)nI4Q z_z97qenKOSpDL*l{YhFW9YNcv%;*zQED7qe%C8o}I33Ja_elEM9j)j-0tI0QVlg z;P8PBJWYJ~oqqGs!p1~jQf}Pqltf=rM5OU#!w%`_8J6l*2j!=O&AU%Yb4y#%fdlaD zbZuj0{i*$*Mlxi_C#YFkO`u{f_d1If%w^ev>GUV_jE6!6u>BUZdyU= z(|df+kpBFRom*EIBe-a^v6Bvru@Ft5lp+jrJZkR(Q^0ctF$H3dfGP0!X@W@QC@6)| z@(aKMT2byh%$nijIu2NkBbG1-z-X`$F~^~Dx=&dg%#Rvk0GFN&w=SQSTc6BStbE?l z$9Q@IUo`Dc`ly;3r?Yc_s&bFSn;~9x4Uo+QY(IXpw)lyE)1G6k($hUa<*X`hHSKWt aANmG6@Ks~v8-MHo0000%K$YDwa&fo|Ap~hTRv;1(0CM~;n+nM#YLQ4C$lg!S{ z^Umz^&b;rg*^*bFE!LZ~CQGgnP*z5j{HIV=DttVH8k<%LK#KA#ss=R%^|`1|d8;u0 zd9*9d_}WBEUY6OIXtr4l2m!9EAl_c+%r$E5)?AArfr&Sn_10XgO&c$pM4Nd}mNq#l zS(YW7l;~0dmhM@iR9V;lyF;bL_JS89H1?yYu~DDW zpNRTsfW}WbBn+zJ$1U)eFYs3^@SjAV-mAzmbd-AK$d$d|k~%G#sB9f`)jJnsYPo?I zAtt~;q(@RqkseqEe*{GF&$-!9Kod|yBp@-85C9k@I|?vNb{OCs*>eDA$({u`L-q{7 zDYB;ky3j_t@K(ijt^uU*AVmRD6cB~y-o3jwE{}OM9;EO*U>*n_05{L@LOH+@j^PA6 z0au6#2?qg6Z!kB6Qh<^fW=7Z#;GAZr1t&n!6f+emA_|90p+kzbM6s4AbbWnYCy#k` z8XZ#T#+h+J2ar0<49m8M=@C)^Hk@Ei2pa&_S2NYZdVp8mj9W+nNZ!xv7n0FB7)N9s zQLK|GBnBRnVqv+Yh82?PKU58I(i)n!GJd)WjKglU*_Df`_PA zFBdu&&SDj%q z>kpI?@Lpj9`*wF-$!4~(WCyMi1FW0{mX8l$QKW_LSoK%+( z&S=b}&^qx^IK`6?{&cE{!Y@9_32z!p4%-cf@S=!@P3id0#HP*|kK?k~oZnAb2e0pj z)_1(1pDCyC`0nG7JG~K__081OFJ(Eu-}P?v-u=n$9-ti_80zC1cWry4ksCOFSO&)X zIDL1!?=5cN(jfxAo$TlKjI@_!aD&041Y~~Q#+gRjy&0UpDw~?J^>eQk`Szx8gZqeb zUq2_l-kvIQgI`jZ*On>1-@Zl6_B$waT{nv#`nHG#Gj0mMv$@2K>379)XFWAlwsY^p zrY=R_Fg+*d-6Bh;mNB( zK2YI05a5GXTV>!@kgvZoIdYH>-jV_TO$2UFp7!yVZ}w2eSEt8#-|fj>AAhm$8)~X* zinn!)G-dI@TB1BQ#S4y!oOwR@BZakNY+Zg~GufI)%zR u?)mP5D5+Du0P literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/icons/workspace_connected.png b/swt/org.argeo.cms.jcr.ui/icons/workspace_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..0430baaf50765aa5c313b3da35d3d2ad5092f2d0 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*Qt#iQyV)wt9y$IC&#DE zO-PxS03=iACa2GgPn{bUKQAz5aZv0c*U%NNVJp0%mbOkjVd=ltGGL8;$SMuD&3c|2 z^u0Ffdu=fFTRUm%n@QW=OxpT-(ze%gkA9ka?9;rXpXMF=wDQ`|l~;ePy!K<`!@s{? z&ii(M+W(J-{=eS*=3@8%r%V3d>iiEBxmf!DYVG5LwKq2vURYCcac$*=HI@It0O(RY z;D%)CX`r-ONswPKL_LWl!@_<)L!b$aN#5=*_IAkzr9cj6fk$L9koEv$x0Bg+Kt`vh zi(`ny<AEIQcD@AqbASA9v%ZozqTFR<<1)U%4zb-%jBWwMK#pi#lx%#VY-?ue4er>q-cjMi^8}9$x`0(%F2S@%qzVLhd z>}6d|^V(Yf|NjqkFIEsNey9{EVNnv~7YtNJ4q&j35j+JngE7h5-NoK6*#Kl9XMsm# zF_88EW4Dvpc0fjxr;B5V#N}iIcV?a&tUiqlkq6G)xN)L|QSHEy6H6AaR8dtr!@=ak z^K4JjuQs+efd$8pa)+E)vzD9vjDm55sY%FI1&67uDhHM=TDORYG3$*2BVT2uYo*2m z7S0c+6dB|_90J0Ef~1&4Djb-Y9xZw#^vKBQk;5!$6@?@HECrQ(oD2+&b{Zbe>4Mxq P*D!dx`njxgN@xNA4VCJx literal 0 HcmV?d00001 diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/LdifUsersTable.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/LdifUsersTable.java new file mode 100644 index 0000000..a30d2f7 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/LdifUsersTable.java @@ -0,0 +1,401 @@ +package org.argeo.cms.swt.useradmin; + +import java.util.ArrayList; +import java.util.List; + +import org.argeo.eclipse.ui.ColumnDefinition; +import org.argeo.eclipse.ui.EclipseUiException; +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.osgi.service.useradmin.User; + +/** + * Generic composite that display a filter and a table viewer to display users + * (can also be groups) + * + * Warning: this class does not extends TableViewer. Use the + * getTableViewer method to access it. + * + */ +public abstract class LdifUsersTable extends Composite { + private static final long serialVersionUID = -7385959046279360420L; + + // Context + // private UserAdmin userAdmin; + + // Configuration + private List columnDefs = new ArrayList(); + private boolean hasFilter; + private boolean preventTableLayout = false; + private boolean hasSelectionColumn; + private int tableStyle; + + // Local UI Objects + private TableViewer usersViewer; + private Text filterTxt; + + /* EXPOSED METHODS */ + + /** + * @param parent + * @param style + */ + public LdifUsersTable(Composite parent, int style) { + super(parent, SWT.NO_FOCUS); + this.tableStyle = style; + } + + // TODO workaround the bug of the table layout in the Form + public LdifUsersTable(Composite parent, int style, boolean preventTableLayout) { + super(parent, SWT.NO_FOCUS); + this.tableStyle = style; + this.preventTableLayout = preventTableLayout; + } + + /** This must be called before the call to populate method */ + public void setColumnDefinitions(List columnDefinitions) { + this.columnDefs = columnDefinitions; + } + + /** + * + * @param addFilter + * choose to add a field to filter results or not + * @param addSelection + * choose to add a column to select some of the displayed results or + * not + */ + public void populate(boolean addFilter, boolean addSelection) { + // initialization + Composite parent = this; + hasFilter = addFilter; + hasSelectionColumn = addSelection; + + // Main Layout + GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); + layout.verticalSpacing = 5; + this.setLayout(layout); + if (hasFilter) + createFilterPart(parent); + + Composite tableComp = new Composite(parent, SWT.NO_FOCUS); + tableComp.setLayoutData(EclipseUiUtils.fillAll()); + usersViewer = createTableViewer(tableComp); + usersViewer.setContentProvider(new UsersContentProvider()); + } + + /** + * + * @param showMore + * display static filters on creation + * @param addSelection + * choose to add a column to select some of the displayed results or + * not + */ + public void populateWithStaticFilters(boolean showMore, boolean addSelection) { + // initialization + Composite parent = this; + hasFilter = true; + hasSelectionColumn = addSelection; + + // Main Layout + GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); + layout.verticalSpacing = 5; + this.setLayout(layout); + createStaticFilterPart(parent, showMore); + + Composite tableComp = new Composite(parent, SWT.NO_FOCUS); + tableComp.setLayoutData(EclipseUiUtils.fillAll()); + usersViewer = createTableViewer(tableComp); + usersViewer.setContentProvider(new UsersContentProvider()); + } + + /** Enable access to the selected users or groups */ + public List getSelectedUsers() { + if (hasSelectionColumn) { + Object[] elements = ((CheckboxTableViewer) usersViewer).getCheckedElements(); + + List result = new ArrayList(); + for (Object obj : elements) { + result.add((User) obj); + } + return result; + } else + throw new EclipseUiException( + "Unvalid request: no selection column " + "has been created for the current table"); + } + + /** Returns the User table viewer, typically to add doubleclick listener */ + public TableViewer getTableViewer() { + return usersViewer; + } + + /** + * Force the refresh of the underlying table using the current filter string if + * relevant + */ + public void refresh() { + String filter = hasFilter ? filterTxt.getText().trim() : null; + if ("".equals(filter)) + filter = null; + refreshFilteredList(filter); + } + + /** Effective repository request: caller must implement this method */ + abstract protected List listFilteredElements(String filter); + + // protected List listFilteredElements(String filter) { + // List users = new ArrayList(); + // try { + // Role[] roles = userAdmin.getRoles(filter); + // // Display all users and groups + // for (Role role : roles) + // users.add((User) role); + // } catch (InvalidSyntaxException e) { + // throw new EclipseUiException("Unable to get roles with filter: " + // + filter, e); + // } + // return users; + // } + + /* GENERIC COMPOSITE METHODS */ + @Override + public boolean setFocus() { + if (hasFilter) + return filterTxt.setFocus(); + else + return usersViewer.getTable().setFocus(); + } + + @Override + public void dispose() { + super.dispose(); + } + + /* LOCAL CLASSES AND METHODS */ + // Will be usefull to rather use a virtual table viewer + private void refreshFilteredList(String filter) { + List users = listFilteredElements(filter); + usersViewer.setInput(users.toArray()); + } + + private class UsersContentProvider implements IStructuredContentProvider { + private static final long serialVersionUID = 1L; + + public Object[] getElements(Object inputElement) { + return (Object[]) inputElement; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + /* MANAGE FILTER */ + private void createFilterPart(Composite parent) { + // Text Area for the filter + filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL); + filterTxt.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false)); + filterTxt.addModifyListener(new ModifyListener() { + private static final long serialVersionUID = 1L; + + public void modifyText(ModifyEvent event) { + refreshFilteredList(filterTxt.getText()); + } + }); + } + + private void createStaticFilterPart(Composite parent, boolean showMore) { + Composite filterComp = new Composite(parent, SWT.NO_FOCUS); + filterComp.setLayout(new GridLayout(2, false)); + filterComp.setLayoutData(EclipseUiUtils.fillWidth()); + // generic search + filterTxt = new Text(filterComp, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL); + filterTxt.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false)); + // filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | + // GridData.HORIZONTAL_ALIGN_FILL)); + filterTxt.addModifyListener(new ModifyListener() { + private static final long serialVersionUID = 1L; + + public void modifyText(ModifyEvent event) { + refreshFilteredList(filterTxt.getText()); + } + }); + + // add static filter abilities + Link moreLk = new Link(filterComp, SWT.NONE); + Composite staticFilterCmp = new Composite(filterComp, SWT.NO_FOCUS); + staticFilterCmp.setLayoutData(EclipseUiUtils.fillWidth(2)); + populateStaticFilters(staticFilterCmp); + + MoreLinkListener listener = new MoreLinkListener(moreLk, staticFilterCmp, showMore); + // initialise the layout + listener.refresh(); + moreLk.addSelectionListener(listener); + } + + /** Overwrite to add static filters */ + protected void populateStaticFilters(Composite staticFilterCmp) { + } + + // private void addMoreSL(final Link more) { + // more.addSelectionListener( } + + private class MoreLinkListener extends SelectionAdapter { + private static final long serialVersionUID = -524987616510893463L; + private boolean isShown; + private final Composite staticFilterCmp; + private final Link moreLk; + + public MoreLinkListener(Link moreLk, Composite staticFilterCmp, boolean isShown) { + this.moreLk = moreLk; + this.staticFilterCmp = staticFilterCmp; + this.isShown = isShown; + } + + @Override + public void widgetSelected(SelectionEvent e) { + isShown = !isShown; + refresh(); + } + + public void refresh() { + GridData gd = (GridData) staticFilterCmp.getLayoutData(); + if (isShown) { + moreLk.setText(" Less... "); + gd.heightHint = SWT.DEFAULT; + } else { + moreLk.setText(" More... "); + gd.heightHint = 0; + } + forceLayout(); + } + } + + private void forceLayout() { + LdifUsersTable.this.getParent().layout(true, true); + } + + private TableViewer createTableViewer(final Composite parent) { + + int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL; + if (hasSelectionColumn) + style = style | SWT.CHECK; + Table table = new Table(parent, style); + TableColumnLayout layout = new TableColumnLayout(); + + // TODO the table layout does not works with the scrolled form + + if (preventTableLayout) { + parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + table.setLayoutData(EclipseUiUtils.fillAll()); + } else + parent.setLayout(layout); + + TableViewer viewer; + if (hasSelectionColumn) + viewer = new CheckboxTableViewer(table); + else + viewer = new TableViewer(table); + table.setLinesVisible(true); + table.setHeaderVisible(true); + + TableViewerColumn column; + // int offset = 0; + if (hasSelectionColumn) { + // offset = 1; + column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE, 25); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = 1L; + + @Override + public String getText(Object element) { + return null; + } + }); + layout.setColumnData(column.getColumn(), new ColumnWeightData(25, 25, false)); + + SelectionAdapter selectionAdapter = new SelectionAdapter() { + private static final long serialVersionUID = 1L; + + boolean allSelected = false; + + @Override + public void widgetSelected(SelectionEvent e) { + allSelected = !allSelected; + ((CheckboxTableViewer) usersViewer).setAllChecked(allSelected); + } + }; + column.getColumn().addSelectionListener(selectionAdapter); + } + + // NodeViewerComparator comparator = new NodeViewerComparator(); + // TODO enable the sort by click on the header + // int i = offset; + for (ColumnDefinition colDef : columnDefs) + createTableColumn(viewer, layout, colDef); + + // column = ViewerUtils.createTableViewerColumn(viewer, + // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize()); + // column.setLabelProvider(new CLProvider(colDef.getPropertyName())); + // column.getColumn().addSelectionListener( + // JcrUiUtils.getNodeSelectionAdapter(i, + // colDef.getPropertyType(), colDef.getPropertyName(), + // comparator, viewer)); + // i++; + // } + + // IMPORTANT: initialize comparator before setting it + // JcrColumnDefinition firstCol = colDefs.get(0); + // comparator.setColumn(firstCol.getPropertyType(), + // firstCol.getPropertyName()); + // viewer.setComparator(comparator); + + return viewer; + } + + /** Default creation of a column for a user table */ + private TableViewerColumn createTableColumn(TableViewer tableViewer, TableColumnLayout layout, + ColumnDefinition columnDef) { + + boolean resizable = true; + TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE); + TableColumn column = tvc.getColumn(); + + column.setText(columnDef.getLabel()); + column.setWidth(columnDef.getMinWidth()); + column.setResizable(resizable); + + ColumnLabelProvider lp = columnDef.getLabelProvider(); + // add a reference to the display to enable font management + // if (lp instanceof UserAdminAbstractLP) + // ((UserAdminAbstractLP) lp).setDisplay(tableViewer.getTable() + // .getDisplay()); + tvc.setLabelProvider(lp); + + layout.setColumnData(column, new ColumnWeightData(columnDef.getWeight(), columnDef.getMinWidth(), resizable)); + + return tvc; + } +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/PickUpUserDialog.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/PickUpUserDialog.java new file mode 100644 index 0000000..dbf6577 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/PickUpUserDialog.java @@ -0,0 +1,245 @@ +package org.argeo.cms.swt.useradmin; + +import java.util.ArrayList; +import java.util.List; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.eclipse.ui.ColumnDefinition; +import org.argeo.eclipse.ui.EclipseUiException; +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.util.naming.LdapAttrs; +import org.argeo.util.naming.LdapObjs; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.TrayDialog; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +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.Shell; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.useradmin.Group; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; +import org.osgi.service.useradmin.UserAdmin; + +/** Dialog with a user (or group) list to pick up one */ +public class PickUpUserDialog extends TrayDialog { + private static final long serialVersionUID = -1420106871173920369L; + + // Business objects + private final UserAdmin userAdmin; + private User selectedUser; + + // this page widgets and UI objects + private String title; + private LdifUsersTable userTableViewerCmp; + private TableViewer userViewer; + private List columnDefs = new ArrayList(); + + /** + * A dialog to pick up a group or a user, showing a table with default + * columns + */ + public PickUpUserDialog(Shell parentShell, String title, UserAdmin userAdmin) { + super(parentShell); + this.title = title; + this.userAdmin = userAdmin; + + columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_ICON), "", + 24, 24)); + columnDefs.add(new ColumnDefinition( + new UserLP(UserLP.COL_DISPLAY_NAME), "Common Name", 150, 100)); + columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DOMAIN), + "Domain", 100, 120)); + columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DN), + "Distinguished Name", 300, 100)); + } + + /** A dialog to pick up a group or a user */ + public PickUpUserDialog(Shell parentShell, String title, + UserAdmin userAdmin, List columnDefs) { + super(parentShell); + this.title = title; + this.userAdmin = userAdmin; + this.columnDefs = columnDefs; + } + + @Override + protected void okPressed() { + if (getSelected() == null) + MessageDialog.openError(getShell(), "No user chosen", + "Please, choose a user or press Cancel."); + else + super.okPressed(); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogArea = (Composite) super.createDialogArea(parent); + dialogArea.setLayout(new FillLayout()); + + Composite bodyCmp = new Composite(dialogArea, SWT.NO_FOCUS); + bodyCmp.setLayout(new GridLayout()); + + // Create and configure the table + userTableViewerCmp = new MyUserTableViewer(bodyCmp, SWT.MULTI + | SWT.H_SCROLL | SWT.V_SCROLL); + + userTableViewerCmp.setColumnDefinitions(columnDefs); + userTableViewerCmp.populateWithStaticFilters(false, false); + GridData gd = EclipseUiUtils.fillAll(); + gd.minimumHeight = 300; + userTableViewerCmp.setLayoutData(gd); + userTableViewerCmp.refresh(); + + // Controllers + userViewer = userTableViewerCmp.getTableViewer(); + userViewer.addDoubleClickListener(new MyDoubleClickListener()); + userViewer + .addSelectionChangedListener(new MySelectionChangedListener()); + + parent.pack(); + return dialogArea; + } + + public User getSelected() { + if (selectedUser == null) + return null; + else + return selectedUser; + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText(title); + } + + class MyDoubleClickListener implements IDoubleClickListener { + public void doubleClick(DoubleClickEvent evt) { + if (evt.getSelection().isEmpty()) + return; + + Object obj = ((IStructuredSelection) evt.getSelection()) + .getFirstElement(); + if (obj instanceof User) { + selectedUser = (User) obj; + okPressed(); + } + } + } + + class MySelectionChangedListener implements ISelectionChangedListener { + @Override + public void selectionChanged(SelectionChangedEvent event) { + if (event.getSelection().isEmpty()) { + selectedUser = null; + return; + } + Object obj = ((IStructuredSelection) event.getSelection()) + .getFirstElement(); + if (obj instanceof Group) { + selectedUser = (Group) obj; + } + } + } + + private class MyUserTableViewer extends LdifUsersTable { + private static final long serialVersionUID = 8467999509931900367L; + + private final String[] knownProps = { LdapAttrs.uid.name(), + LdapAttrs.cn.name(), LdapAttrs.DN }; + + private Button showSystemRoleBtn; + private Button showUserBtn; + + public MyUserTableViewer(Composite parent, int style) { + super(parent, style); + } + + protected void populateStaticFilters(Composite staticFilterCmp) { + staticFilterCmp.setLayout(new GridLayout()); + showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK); + showSystemRoleBtn.setText("Show system roles "); + + showUserBtn = new Button(staticFilterCmp, SWT.CHECK); + showUserBtn.setText("Show users "); + + SelectionListener sl = new SelectionAdapter() { + private static final long serialVersionUID = -7033424592697691676L; + + @Override + public void widgetSelected(SelectionEvent e) { + refresh(); + } + }; + + showSystemRoleBtn.addSelectionListener(sl); + showUserBtn.addSelectionListener(sl); + } + + @Override + protected List listFilteredElements(String filter) { + Role[] roles; + try { + StringBuilder builder = new StringBuilder(); + + StringBuilder filterBuilder = new StringBuilder(); + if (notNull(filter)) + for (String prop : knownProps) { + filterBuilder.append("("); + filterBuilder.append(prop); + filterBuilder.append("=*"); + filterBuilder.append(filter); + filterBuilder.append("*)"); + } + + String typeStr = "(" + LdapAttrs.objectClass.name() + "=" + + LdapObjs.groupOfNames.name() + ")"; + if ((showUserBtn.getSelection())) + typeStr = "(|(" + LdapAttrs.objectClass.name() + "=" + + LdapObjs.inetOrgPerson.name() + ")" + typeStr + + ")"; + + if (!showSystemRoleBtn.getSelection()) + typeStr = "(& " + typeStr + "(!(" + LdapAttrs.DN + "=*" + + CmsConstants.SYSTEM_ROLES_BASEDN + ")))"; + + if (filterBuilder.length() > 1) { + builder.append("(&" + typeStr); + builder.append("(|"); + builder.append(filterBuilder.toString()); + builder.append("))"); + } else { + builder.append(typeStr); + } + roles = userAdmin.getRoles(builder.toString()); + } catch (InvalidSyntaxException e) { + throw new EclipseUiException( + "Unable to get roles with filter: " + filter, e); + } + List users = new ArrayList(); + for (Role role : roles) + if (!users.contains(role)) + users.add((User) role); + return users; + } + } + + private boolean notNull(String string) { + if (string == null) + return false; + else + return !"".equals(string.trim()); + } +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UserLP.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UserLP.java new file mode 100644 index 0000000..b3ab40e --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UserLP.java @@ -0,0 +1,76 @@ +package org.argeo.cms.swt.useradmin; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.cms.auth.UserAdminUtils; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; + +/** Centralize label providers for the group table */ +class UserLP extends ColumnLabelProvider { + private static final long serialVersionUID = -4645930210988368571L; + + final static String COL_ICON = "colID.icon"; + final static String COL_DN = "colID.dn"; + final static String COL_DISPLAY_NAME = "colID.displayName"; + final static String COL_DOMAIN = "colID.domain"; + + final String currType; + + // private Font italic; + private Font bold; + + UserLP(String colId) { + this.currType = colId; + } + + @Override + public Font getFont(Object element) { + // Current user as bold + if (UserAdminUtils.isCurrentUser(((User) element))) { + if (bold == null) + bold = JFaceResources.getFontRegistry().defaultFontDescriptor().setStyle(SWT.BOLD) + .createFont(Display.getCurrent()); + return bold; + } + return null; + } + + @Override + public Image getImage(Object element) { + if (COL_ICON.equals(currType)) { + User user = (User) element; + String dn = user.getName(); + if (dn.endsWith(CmsConstants.SYSTEM_ROLES_BASEDN)) + return UsersImages.ICON_ROLE; + else if (user.getType() == Role.GROUP) + return UsersImages.ICON_GROUP; + else + return UsersImages.ICON_USER; + } else + return null; + } + + @Override + public String getText(Object element) { + User user = (User) element; + return getText(user); + + } + + public String getText(User user) { + if (COL_DN.equals(currType)) + return user.getName(); + else if (COL_DISPLAY_NAME.equals(currType)) + return UserAdminUtils.getCommonName(user); + else if (COL_DOMAIN.equals(currType)) + return UserAdminUtils.getDomainName(user); + else + return ""; + } +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UsersImages.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UsersImages.java new file mode 100644 index 0000000..21fc5af --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/UsersImages.java @@ -0,0 +1,14 @@ +package org.argeo.cms.swt.useradmin; + +import org.argeo.cms.ui.theme.CmsImages; +import org.eclipse.swt.graphics.Image; + +/** Specific users icons. */ +public class UsersImages { + private final static String PREFIX = "icons/"; + + public final static Image ICON_USER = CmsImages.createImg(PREFIX + "person.png"); + public final static Image ICON_GROUP = CmsImages.createImg(PREFIX + "group.png"); + public final static Image ICON_ROLE = CmsImages.createImg(PREFIX + "role.gif"); + public final static Image ICON_CHANGE_PASSWORD = CmsImages.createImg(PREFIX + "security.gif"); +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/ViewerUtils.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/ViewerUtils.java new file mode 100644 index 0000000..d186783 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/ViewerUtils.java @@ -0,0 +1,58 @@ +package org.argeo.cms.swt.useradmin; + +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TreeColumn; + +/** + * Centralise useful methods to manage JFace Table, Tree and TreeColumn viewers. + */ +public class ViewerUtils { + + /** + * Creates a basic column for the given table. For the time being, we do not + * support movable columns. + */ + public static TableColumn createColumn(Table parent, String name, int style, int width) { + TableColumn result = new TableColumn(parent, style); + result.setText(name); + result.setWidth(width); + result.setResizable(true); + return result; + } + + /** + * Creates a TableViewerColumn for the given viewer. For the time being, we do + * not support movable columns. + */ + public static TableViewerColumn createTableViewerColumn(TableViewer parent, String name, int style, int width) { + TableViewerColumn tvc = new TableViewerColumn(parent, style); + TableColumn column = tvc.getColumn(); + column.setText(name); + column.setWidth(width); + column.setResizable(true); + return tvc; + } + + // public static TableViewerColumn createTableViewerColumn(TableViewer parent, + // Localized name, int style, int width) { + // return createTableViewerColumn(parent, name.lead(), style, width); + // } + + /** + * Creates a TreeViewerColumn for the given viewer. For the time being, we do + * not support movable columns. + */ + public static TreeViewerColumn createTreeViewerColumn(TreeViewer parent, String name, int style, int width) { + TreeViewerColumn tvc = new TreeViewerColumn(parent, style); + TreeColumn column = tvc.getColumn(); + column.setText(name); + column.setWidth(width); + column.setResizable(true); + return tvc; + } +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/package-info.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/package-info.java new file mode 100644 index 0000000..3597bfc --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/swt/useradmin/package-info.java @@ -0,0 +1,2 @@ +/** SWT/JFace users management components. */ +package org.argeo.cms.swt.useradmin; \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/CmsImages.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/CmsImages.java new file mode 100644 index 0000000..1c4d79e --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/CmsImages.java @@ -0,0 +1,49 @@ +package org.argeo.cms.ui.theme; + +import java.net.URL; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; + +public class CmsImages { + private static BundleContext themeBc = FrameworkUtil.getBundle(CmsImages.class).getBundleContext(); + + final public static String ICONS_BASE = "icons/"; + final public static String TYPES_BASE = ICONS_BASE + "types/"; + final public static String ACTIONS_BASE = ICONS_BASE + "actions/"; + + public static Image createIcon(String name) { + return createImg(CmsImages.ICONS_BASE + name); + } + + public static Image createAction(String name) { + return createImg(CmsImages.ACTIONS_BASE + name); + } + + public static Image createType(String name) { + return createImg(CmsImages.TYPES_BASE + name); + } + + public static Image createImg(String name) { + return CmsImages.createDesc(name).createImage(Display.getDefault()); + } + + public static ImageDescriptor createDesc(String name) { + return createDesc(themeBc, name); + } + + public static ImageDescriptor createDesc(BundleContext bc, String name) { + URL url = bc.getBundle().getResource(name); + if (url == null) + return ImageDescriptor.getMissingImageDescriptor(); + return ImageDescriptor.createFromURL(url); + } + + public static Image createImg(BundleContext bc, String name) { + return createDesc(bc, name).createImage(Display.getDefault()); + } + +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/package-info.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/package-info.java new file mode 100644 index 0000000..7d3a260 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/theme/package-info.java @@ -0,0 +1,2 @@ +/** Argeo CMS core theme images. */ +package org.argeo.cms.ui.theme; \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/ErrorFeedback.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/ErrorFeedback.java new file mode 100644 index 0000000..a388e74 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/ErrorFeedback.java @@ -0,0 +1,106 @@ +package org.argeo.eclipse.ui.dialogs; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.argeo.api.cms.CmsLog; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +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; + +/** + * Generic error dialog to be used in try/catch blocks. + * + * @deprecated Use CMS dialogs instead. + */ +@Deprecated +public class ErrorFeedback extends TitleAreaDialog { + private static final long serialVersionUID = -8918084784628179044L; + + private final static CmsLog log = CmsLog.getLog(ErrorFeedback.class); + + private final String message; + private final Throwable exception; + + public static void show(String message, Throwable e) { + // rethrow ThreaDeath in order to make sure that RAP will properly clean + // up the UI thread + if (e instanceof ThreadDeath) + throw (ThreadDeath) e; + + new ErrorFeedback(newShell(), message, e).open(); + } + + public static void show(String message) { + new ErrorFeedback(newShell(), message, null).open(); + } + + private static Shell newShell() { + return new Shell(getDisplay(), SWT.NO_TRIM); + } + + /** Tries to find a display */ + private static Display getDisplay() { + try { + Display display = Display.getCurrent(); + if (display != null) + return display; + else + return Display.getDefault(); + } catch (Exception e) { + return Display.getCurrent(); + } + } + + public ErrorFeedback(Shell parentShell, String message, Throwable e) { + super(parentShell); + setShellStyle(SWT.NO_TRIM); + this.message = message; + this.exception = e; + log.error(message, e); + } + + protected Point getInitialSize() { + if (exception != null) + return new Point(800, 600); + else + return new Point(400, 300); + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + setMessage(message != null ? message + (exception != null ? ": " + exception.getMessage() : "") + : exception != null ? exception.getMessage() : "Unkown Error", IMessageProvider.ERROR); + + if (exception != null) { + Text stack = new Text(composite, SWT.MULTI | SWT.LEAD | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + stack.setEditable(false); + stack.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + StringWriter sw = new StringWriter(); + exception.printStackTrace(new PrintWriter(sw)); + stack.setText(sw.toString()); + } + + parent.pack(); + return composite; + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText("Error"); + } +} \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/FeedbackDialog.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/FeedbackDialog.java new file mode 100644 index 0000000..f2715bc --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/FeedbackDialog.java @@ -0,0 +1,141 @@ +package org.argeo.eclipse.ui.dialogs; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.argeo.api.cms.CmsLog; +import org.argeo.eclipse.ui.EclipseUiException; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ShellAdapter; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +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.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** + * Generic lightweight dialog, not based on JFace. + * + * @deprecated Use CMS dialogs instead. + */ +@Deprecated +public class FeedbackDialog extends LightweightDialog { + private final static CmsLog log = CmsLog.getLog(FeedbackDialog.class); + + private String message; + private Throwable exception; + +// private Shell parentShell; + private Shell shell; + + public static void show(String message, Throwable e) { + // rethrow ThreaDeath in order to make sure that RAP will properly clean + // up the UI thread + if (e instanceof ThreadDeath) + throw (ThreadDeath) e; + + new FeedbackDialog(getDisplay().getActiveShell(), message, e).open(); + } + + public static void show(String message) { + new FeedbackDialog(getDisplay().getActiveShell(), message, null).open(); + } + + /** Tries to find a display */ + private static Display getDisplay() { + try { + Display display = Display.getCurrent(); + if (display != null) + return display; + else + return Display.getDefault(); + } catch (Exception e) { + return Display.getCurrent(); + } + } + + public FeedbackDialog(Shell parentShell, String message, Throwable e) { + super(parentShell); + this.message = message; + this.exception = e; + log.error(message, e); + } + + public int open() { + if (shell != null) + throw new EclipseUiException("There is already a shell"); + shell = new Shell(getDisplay(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); + shell.setLayout(new GridLayout()); + // shell.setText("Error"); + shell.setSize(getInitialSize()); + createDialogArea(shell); + // shell.pack(); + // shell.layout(); + + Rectangle shellBounds = Display.getCurrent().getBounds();// RAP + Point dialogSize = shell.getSize(); + int x = shellBounds.x + (shellBounds.width - dialogSize.x) / 2; + int y = shellBounds.y + (shellBounds.height - dialogSize.y) / 2; + shell.setLocation(x, y); + + shell.addShellListener(new ShellAdapter() { + private static final long serialVersionUID = -2701270481953688763L; + + @Override + public void shellDeactivated(ShellEvent e) { + closeShell(); + } + }); + + shell.open(); + return OK; + } + + protected void closeShell() { + shell.close(); + shell.dispose(); + shell = null; + } + + protected Point getInitialSize() { + // if (exception != null) + // return new Point(800, 600); + // else + return new Point(400, 300); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = new Composite(parent, SWT.NONE); + dialogarea.setLayout(new GridLayout()); + // Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + Label messageLbl = new Label(dialogarea, SWT.NONE); + if (message != null) + messageLbl.setText(message); + else if (exception != null) + messageLbl.setText(exception.getLocalizedMessage()); + + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + if (exception != null) { + Text stack = new Text(composite, SWT.MULTI | SWT.LEAD | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + stack.setEditable(false); + stack.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + StringWriter sw = new StringWriter(); + exception.printStackTrace(new PrintWriter(sw)); + stack.setText(sw.toString()); + } + + // parent.pack(); + return composite; + } +} \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java new file mode 100644 index 0000000..615e141 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java @@ -0,0 +1,256 @@ +package org.argeo.eclipse.ui.dialogs; + +import org.argeo.api.cms.CmsLog; +import org.argeo.eclipse.ui.EclipseUiException; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.ShellAdapter; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +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; + +/** Generic lightweight dialog, not based on JFace. */ +@Deprecated +public class LightweightDialog { + private final static CmsLog log = CmsLog.getLog(LightweightDialog.class); + + // must be the same value as org.eclipse.jface.window.Window#OK + public final static int OK = 0; + // must be the same value as org.eclipse.jface.window.Window#CANCEL + public final static int CANCEL = 1; + + private Shell parentShell; + private Shell backgroundShell; + private Shell foregoundShell; + + private Integer returnCode = null; + private boolean block = true; + + private String title; + + /** Tries to find a display */ + private static Display getDisplay() { + try { + Display display = Display.getCurrent(); + if (display != null) + return display; + else + return Display.getDefault(); + } catch (Exception e) { + return Display.getCurrent(); + } + } + + public LightweightDialog(Shell parentShell) { + this.parentShell = parentShell; + } + + public int open() { + if (foregoundShell != null) + throw new EclipseUiException("There is already a shell"); + backgroundShell = new Shell(parentShell, SWT.ON_TOP); + backgroundShell.setFullScreen(true); + // if (parentShell != null) { + // backgroundShell.setBounds(parentShell.getBounds()); + // } else + // backgroundShell.setMaximized(true); + backgroundShell.setAlpha(128); + backgroundShell.setBackground(getDisplay().getSystemColor(SWT.COLOR_BLACK)); + foregoundShell = new Shell(backgroundShell, SWT.NO_TRIM | SWT.ON_TOP); + if (title != null) + setTitle(title); + foregoundShell.setLayout(new GridLayout()); + foregoundShell.setSize(getInitialSize()); + createDialogArea(foregoundShell); + // shell.pack(); + // shell.layout(); + + Rectangle shellBounds = parentShell != null ? parentShell.getBounds() : Display.getCurrent().getBounds();// RAP + Point dialogSize = foregoundShell.getSize(); + int x = shellBounds.x + (shellBounds.width - dialogSize.x) / 2; + int y = shellBounds.y + (shellBounds.height - dialogSize.y) / 2; + foregoundShell.setLocation(x, y); + + foregoundShell.addShellListener(new ShellAdapter() { + private static final long serialVersionUID = -2701270481953688763L; + + @Override + public void shellDeactivated(ShellEvent e) { + if (hasChildShells()) + return; + if (returnCode == null)// not yet closed + closeShell(CANCEL); + } + + @Override + public void shellClosed(ShellEvent e) { + notifyClose(); + } + + }); + + backgroundShell.open(); + foregoundShell.open(); + // after the foreground shell has been opened + backgroundShell.addFocusListener(new FocusListener() { + private static final long serialVersionUID = 3137408447474661070L; + + @Override + public void focusLost(FocusEvent event) { + } + + @Override + public void focusGained(FocusEvent event) { + if (hasChildShells()) + return; + if (returnCode == null)// not yet closed + closeShell(CANCEL); + } + }); + + if (block) { + block(); + } + if (returnCode == null) + returnCode = OK; + return returnCode; + } + + public void block() { + try { + runEventLoop(foregoundShell); + } catch (ThreadDeath t) { + returnCode = CANCEL; + if (log.isTraceEnabled()) + log.error("Thread death, canceling dialog", t); + } catch (Throwable t) { + returnCode = CANCEL; + log.error("Cannot open blocking lightweight dialog", t); + } + } + + private boolean hasChildShells() { + if (foregoundShell == null) + return false; + return foregoundShell.getShells().length != 0; + } + + // public synchronized int openAndWait() { + // open(); + // while (returnCode == null) + // try { + // wait(100); + // } catch (InterruptedException e) { + // // silent + // } + // return returnCode; + // } + + private synchronized void notifyClose() { + if (returnCode == null) + returnCode = CANCEL; + notifyAll(); + } + + protected void closeShell(int returnCode) { + this.returnCode = returnCode; + if (CANCEL == returnCode) + onCancel(); + if (foregoundShell != null && !foregoundShell.isDisposed()) { + foregoundShell.close(); + foregoundShell.dispose(); + foregoundShell = null; + } + + if (backgroundShell != null && !backgroundShell.isDisposed()) { + backgroundShell.close(); + backgroundShell.dispose(); + } + } + + protected Point getInitialSize() { + // if (exception != null) + // return new Point(800, 600); + // else + return new Point(600, 400); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = new Composite(parent, SWT.NONE); + dialogarea.setLayout(new GridLayout()); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + return dialogarea; + } + + protected Shell getBackgroundShell() { + return backgroundShell; + } + + protected Shell getForegoundShell() { + return foregoundShell; + } + + public void setBlockOnOpen(boolean shouldBlock) { + block = shouldBlock; + } + + public void pack() { + foregoundShell.pack(); + } + + private void runEventLoop(Shell loopShell) { + Display display; + if (foregoundShell == null) { + display = Display.getCurrent(); + } else { + display = loopShell.getDisplay(); + } + + while (loopShell != null && !loopShell.isDisposed()) { + try { + if (!display.readAndDispatch()) { + display.sleep(); + } + } catch (UnsupportedOperationException e) { + throw e; + } catch (Throwable e) { + handleException(e); + } + } + if (!display.isDisposed()) + display.update(); + } + + protected void handleException(Throwable t) { + if (t instanceof ThreadDeath) { + // Don't catch ThreadDeath as this is a normal occurrence when + // the thread dies + throw (ThreadDeath) t; + } + // Try to keep running. + t.printStackTrace(); + } + + /** @return false, if the dialog should not be closed. */ + protected boolean onCancel() { + return true; + } + + public void setTitle(String title) { + this.title = title; + if (title != null && getForegoundShell() != null) + getForegoundShell().setText(title); + } + + public Integer getReturnCode() { + return returnCode; + } + +} \ No newline at end of file diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/SingleValue.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/SingleValue.java new file mode 100644 index 0000000..8ce9b44 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/SingleValue.java @@ -0,0 +1,130 @@ +package org.argeo.eclipse.ui.dialogs; + +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +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.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** + * Dialog to retrieve a single value. + * + * @deprecated Use CMS dialogs instead. + */ +@Deprecated +public class SingleValue extends TitleAreaDialog { + private static final long serialVersionUID = 2843538207460082349L; + + private Text valueT; + private String value; + private final String title, message, label; + private final Boolean multiline; + + public static String ask(String label, String message) { + SingleValue svd = new SingleValue(label, message); + if (svd.open() == Window.OK) + return svd.getString(); + else + return null; + } + + public static Long askLong(String label, String message) { + SingleValue svd = new SingleValue(label, message); + if (svd.open() == Window.OK) + return svd.getLong(); + else + return null; + } + + public static Double askDouble(String label, String message) { + SingleValue svd = new SingleValue(label, message); + if (svd.open() == Window.OK) + return svd.getDouble(); + else + return null; + } + + public SingleValue(String label, String message) { + this(Display.getDefault().getActiveShell(), label, message, label, false); + } + + public SingleValue(Shell parentShell, String title, String message, String label, Boolean multiline) { + super(parentShell); + this.title = title; + this.message = message; + this.label = label; + this.multiline = multiline; + } + + protected Point getInitialSize() { + if (multiline) + return new Point(450, 350); + + else + return new Point(400, 270); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayoutData(EclipseUiUtils.fillAll()); + GridLayout layout = new GridLayout(2, false); + layout.marginWidth = layout.marginHeight = 20; + composite.setLayout(layout); + + valueT = createLT(composite, label); + + setMessage(message, IMessageProvider.NONE); + + parent.pack(); + valueT.setFocus(); + return composite; + } + + @Override + protected void okPressed() { + value = valueT.getText(); + super.okPressed(); + } + + /** Creates label and text. */ + protected Text createLT(Composite parent, String label) { + new Label(parent, SWT.NONE).setText(label); + Text text; + if (multiline) { + text = new Text(parent, SWT.LEAD | SWT.BORDER | SWT.MULTI); + text.setLayoutData(EclipseUiUtils.fillAll()); + } else { + text = new Text(parent, SWT.LEAD | SWT.BORDER | SWT.SINGLE); + text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); + } + return text; + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText(title); + } + + public String getString() { + return value; + } + + public Long getLong() { + return Long.valueOf(getString()); + } + + public Double getDouble() { + return Double.valueOf(getString()); + } +} diff --git a/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/package-info.java b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/package-info.java new file mode 100644 index 0000000..d6ab148 --- /dev/null +++ b/swt/org.argeo.cms.jcr.ui/src/org/argeo/eclipse/ui/dialogs/package-info.java @@ -0,0 +1,2 @@ +/** Generic SWT/JFace dialogs. */ +package org.argeo.eclipse.ui.dialogs; \ No newline at end of file -- 2.39.2