Clean up and re-organise CMS
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 11 Feb 2015 17:34:41 +0000 (17:34 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 11 Feb 2015 17:34:41 +0000 (17:34 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@7791 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

56 files changed:
org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java
org.argeo.cms/src/org/argeo/cms/BundleResourceLoader.java
org.argeo.cms/src/org/argeo/cms/CmsApplication.java
org.argeo.cms/src/org/argeo/cms/CmsEntryPointFactory.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsInstallPage.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsLink.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsLogin.java
org.argeo.cms/src/org/argeo/cms/CmsMsg.java
org.argeo.cms/src/org/argeo/cms/CmsSession.java
org.argeo.cms/src/org/argeo/cms/CmsUtils.java [deleted file]
org.argeo.cms/src/org/argeo/cms/DefaultsResourceBundle.java [deleted file]
org.argeo.cms/src/org/argeo/cms/IdentityTextInterpreter.java [deleted file]
org.argeo.cms/src/org/argeo/cms/MenuLink.java [deleted file]
org.argeo.cms/src/org/argeo/cms/Msg.java [deleted file]
org.argeo.cms/src/org/argeo/cms/OpenUserMenu.java [deleted file]
org.argeo.cms/src/org/argeo/cms/SimpleCmsHeader.java [deleted file]
org.argeo.cms/src/org/argeo/cms/SimpleDynamicPages.java [deleted file]
org.argeo.cms/src/org/argeo/cms/SimpleStaticPage.java [deleted file]
org.argeo.cms/src/org/argeo/cms/TextInterpreter.java [deleted file]
org.argeo.cms/src/org/argeo/cms/UrlResourceLoader.java [deleted file]
org.argeo.cms/src/org/argeo/cms/UserMenu.java [deleted file]
org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/i18n/Msg.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/ImageManagerImpl.java
org.argeo.cms/src/org/argeo/cms/internal/SimpleEditableImage.java
org.argeo.cms/src/org/argeo/cms/internal/text/AbstractTextViewer.java
org.argeo.cms/src/org/argeo/cms/maintenance/Browse.java
org.argeo.cms/src/org/argeo/cms/maintenance/NonAdminPage.java
org.argeo.cms/src/org/argeo/cms/text/CustomTextEditor.java
org.argeo.cms/src/org/argeo/cms/text/IdentityTextInterpreter.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/text/Img.java
org.argeo.cms/src/org/argeo/cms/text/Paragraph.java
org.argeo.cms/src/org/argeo/cms/text/StandardTextEditor.java
org.argeo.cms/src/org/argeo/cms/text/TextEditorHeader.java
org.argeo.cms/src/org/argeo/cms/text/TextInterpreter.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/text/TextSection.java
org.argeo.cms/src/org/argeo/cms/text/WikiPage.java
org.argeo.cms/src/org/argeo/cms/users/UserPage.java
org.argeo.cms/src/org/argeo/cms/users/UserPart.java
org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java
org.argeo.cms/src/org/argeo/cms/users/UserViewer.java
org.argeo.cms/src/org/argeo/cms/users/UserViewerOld.java
org.argeo.cms/src/org/argeo/cms/users/Users.java
org.argeo.cms/src/org/argeo/cms/util/CmsLink.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/CmsUtils.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/MenuLink.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/OpenUserMenu.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/SimpleCmsHeader.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/SimpleDynamicPages.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/SimpleStaticPage.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/UserMenu.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/viewers/Section.java
org.argeo.cms/src/org/argeo/cms/widgets/EditableImage.java
org.argeo.cms/src/org/argeo/cms/widgets/EditableText.java
org.argeo.cms/src/org/argeo/cms/widgets/JcrComposite.java
org.argeo.cms/src/org/argeo/cms/widgets/StyledControl.java

index 1c9fc483d5bac03f52209d6d5de251e7328d89ba..49a7b98dfc4fe635665f608e67eaccefa21b209b 100644 (file)
@@ -14,6 +14,7 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.i18n.Msg;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
index e42a001843990918b73377e4d9fe203096e40a13..8740c0d2656cf106b0320d3b6d70c72ea9e09f10 100644 (file)
@@ -9,7 +9,7 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 
 /** {@link ResourceLoader} implementation wrapping an {@link Bundle}. */
-public class BundleResourceLoader implements ResourceLoader {
+class BundleResourceLoader implements ResourceLoader {
        private final BundleContext bundleContext;
 
        public BundleResourceLoader(BundleContext bundleContext) {
index 90df56a61a967d65c2c46ab4ba1ee8bb8252b608..e113d7b2e3ff50afd32d05e8cb173b3f28137578 100644 (file)
@@ -22,6 +22,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.internal.ImageManagerImpl;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.gemini.blueprint.context.BundleContextAware;
 import org.eclipse.rap.rwt.RWT;
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsEntryPointFactory.java b/org.argeo.cms/src/org/argeo/cms/CmsEntryPointFactory.java
deleted file mode 100644 (file)
index 873ae81..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-package org.argeo.cms;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.security.Privilege;
-import javax.jcr.version.VersionManager;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.internal.ImageManagerImpl;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.application.EntryPoint;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/** Creates and registers an {@link EntryPoint} */
-@Deprecated
-class CmsEntryPointFactory {
-       private final static Log log = LogFactory
-                       .getLog(CmsEntryPointFactory.class);
-
-       private Repository repository;
-       private String workspace = null;
-       private String basePath = "/";
-       private List<String> roPrincipals = Arrays.asList("anonymous", "everyone");
-       private List<String> rwPrincipals = Arrays.asList("everyone");
-
-       private CmsLogin cmsLogin;
-
-       private CmsUiProvider header;
-       private Map<String, CmsUiProvider> pages = new LinkedHashMap<String, CmsUiProvider>();
-
-       private Integer headerHeight = 40;
-
-       // Managers
-       private CmsImageManager imageManager = new ImageManagerImpl();
-
-       public EntryPoint create() {
-               CmsEntryPoint cmsEntryPoint = new CmsEntryPoint(repository, workspace);
-               CmsSession.current.set(cmsEntryPoint);
-               return cmsEntryPoint;
-       }
-
-       public void init() throws RepositoryException {
-               if (workspace == null)
-                       throw new CmsException(
-                                       "Workspace must be set when calling initialization."
-                                                       + " Please make sure that read-only and read-write roles"
-                                                       + " have been properly configured:"
-                                                       + " the defaults are open.");
-
-               Session session = null;
-               try {
-                       session = JcrUtils.loginOrCreateWorkspace(repository, workspace);
-                       VersionManager vm = session.getWorkspace().getVersionManager();
-                       if (!vm.isCheckedOut("/"))
-                               vm.checkout("/");
-                       JcrUtils.mkdirs(session, basePath);
-                       for (String principal : rwPrincipals)
-                               JcrUtils.addPrivilege(session, basePath, principal,
-                                               Privilege.JCR_WRITE);
-                       for (String principal : roPrincipals)
-                               JcrUtils.addPrivilege(session, basePath, principal,
-                                               Privilege.JCR_READ);
-
-                       for (String pageName : pages.keySet()) {
-                               try {
-                                       initPage(session, pages.get(pageName));
-                                       session.save();
-                               } catch (Exception e) {
-                                       throw new CmsException(
-                                                       "Cannot initialize page " + pageName, e);
-                               }
-                       }
-
-               } finally {
-                       JcrUtils.logoutQuietly(session);
-               }
-       }
-
-       protected void initPage(Session adminSession, CmsUiProvider page)
-                       throws RepositoryException {
-               if (page instanceof LifeCycleUiProvider)
-                       ((LifeCycleUiProvider) page).init(adminSession);
-       }
-
-       public void destroy() {
-               for (String pageName : pages.keySet()) {
-                       try {
-                               CmsUiProvider page = pages.get(pageName);
-                               if (page instanceof LifeCycleUiProvider)
-                                       ((LifeCycleUiProvider) page).destroy();
-                       } catch (Exception e) {
-                               log.error("Cannot destroy page " + pageName, e);
-                       }
-               }
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void setWorkspace(String workspace) {
-               this.workspace = workspace;
-       }
-
-       public void setCmsLogin(CmsLogin cmsLogin) {
-               this.cmsLogin = cmsLogin;
-       }
-
-       public void setHeader(CmsUiProvider header) {
-               this.header = header;
-       }
-
-       public void setPages(Map<String, CmsUiProvider> pages) {
-               this.pages = pages;
-       }
-
-       public void setBasePath(String basePath) {
-               this.basePath = basePath;
-       }
-
-       public void setRoPrincipals(List<String> roPrincipals) {
-               this.roPrincipals = roPrincipals;
-       }
-
-       public void setRwPrincipals(List<String> rwPrincipals) {
-               this.rwPrincipals = rwPrincipals;
-       }
-
-       public void setHeaderHeight(Integer headerHeight) {
-               this.headerHeight = headerHeight;
-       }
-
-       private class CmsEntryPoint extends AbstractCmsEntryPoint {
-               private Composite headerArea;
-               private Composite bodyArea;
-
-               public CmsEntryPoint(Repository repository, String workspace) {
-                       super(repository, workspace);
-               }
-
-               @Override
-               protected void createContents(Composite parent) {
-                       try {
-                               getShell().getDisplay().setData(CmsSession.KEY, this);
-
-                               parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                               true));
-                               parent.setLayout(CmsUtils.noSpaceGridLayout());
-
-                               headerArea = new Composite(parent, SWT.NONE);
-                               headerArea.setLayout(new FillLayout());
-                               GridData headerData = new GridData(SWT.FILL, SWT.FILL, false,
-                                               false);
-                               headerData.heightHint = headerHeight;
-                               headerArea.setLayoutData(headerData);
-                               refreshHeader();
-
-                               bodyArea = new Composite(parent, SWT.NONE);
-                               bodyArea.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_BODY);
-                               bodyArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                               true));
-                               bodyArea.setBackgroundMode(SWT.INHERIT_DEFAULT);
-                               bodyArea.setLayout(CmsUtils.noSpaceGridLayout());
-                       } catch (Exception e) {
-                               throw new CmsException("Cannot create entrypoint contents", e);
-                       }
-               }
-
-               @Override
-               protected void refreshHeader() {
-                       if (headerArea == null)
-                               return;
-                       for (Control child : headerArea.getChildren())
-                               child.dispose();
-                       try {
-                               header.createUi(headerArea, getNode());
-                       } catch (RepositoryException e) {
-                               throw new CmsException("Cannot refresh header", e);
-                       }
-                       headerArea.layout(true, true);
-               }
-
-               @SuppressWarnings("unused")
-               @Override
-               protected void refreshBody() {
-                       if (bodyArea == null)
-                               return;
-                       // clear
-                       for (Control child : bodyArea.getChildren())
-                               child.dispose();
-                       bodyArea.setLayout(CmsUtils.noSpaceGridLayout());
-
-                       // Exception
-                       Throwable exception = getException();
-                       if (exception != null) {
-                               new Label(bodyArea, SWT.NONE).setText("Unreachable state : "
-                                               + getState());
-                               if (getNode() != null)
-                                       new Label(bodyArea, SWT.NONE).setText("Context : "
-                                                       + getNode());
-
-                               Text errorText = new Text(bodyArea, SWT.MULTI | SWT.H_SCROLL
-                                               | SWT.V_SCROLL);
-                               errorText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                               true));
-                               StringWriter sw = new StringWriter();
-                               exception.printStackTrace(new PrintWriter(sw));
-                               errorText.setText(sw.toString());
-                               IOUtils.closeQuietly(sw);
-                               resetException();
-                               // TODO report
-                       } else {
-                               String state = getState();
-                               String page = null;
-                               try {
-                                       if (state == null)
-                                               throw new CmsException("State cannot be null");
-                                       if (page == null)
-                                               throw new CmsException("Page cannot be null");
-                                       // else if (state.length() == 0)
-                                       // log.debug("empty state");
-                                       else if (pages.containsKey(page))
-                                               pages.get(page).createUi(bodyArea, getNode());
-                                       else {
-                                               // try {
-                                               // RWT.getResponse().sendError(404);
-                                               // } catch (IOException e) {
-                                               // log.error("Cannot send 404 code", e);
-                                               // }
-                                               throw new CmsException("Unsupported state " + state);
-                                       }
-                               } catch (RepositoryException e) {
-                                       throw new CmsException("Cannot refresh body", e);
-                               }
-                       }
-                       bodyArea.layout(true, true);
-               }
-
-               @Override
-               protected void logAsAnonymous() {
-                       cmsLogin.logInAsAnonymous();
-               }
-
-               @Override
-               protected Node getDefaultNode(Session session)
-                               throws RepositoryException {
-                       if (!session.hasPermission(basePath, "read")) {
-                               if (session.getUserID().equals("anonymous"))
-                                       throw new CmsLoginRequiredException();
-                               else
-                                       throw new CmsException("Unauthorized");
-                       }
-                       return session.getNode(basePath);
-               }
-
-               @Override
-               public CmsImageManager getImageManager() {
-                       return imageManager;
-               }
-
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsInstallPage.java b/org.argeo.cms/src/org/argeo/cms/CmsInstallPage.java
deleted file mode 100644 (file)
index d7c69d6..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.argeo.cms;
-
-import javax.jcr.Node;
-
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-public class CmsInstallPage implements CmsUiProvider {
-       private Text text;
-
-       @Override
-       public Control createUi(Composite parent, Node context) {
-               text = new Text(parent, SWT.MULTI);
-               text.setData(RWT.CUSTOM_VARIANT, "cms_install");
-               return text;
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsLink.java b/org.argeo.cms/src/org/argeo/cms/CmsLink.java
deleted file mode 100644 (file)
index 5ccfd63..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-package org.argeo.cms;
-
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import javax.jcr.Node;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.eclipse.gemini.blueprint.context.BundleContextAware;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.service.ResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.osgi.framework.BundleContext;
-import org.springframework.beans.factory.InitializingBean;
-
-/** A link to an internal or external location. */
-public class CmsLink implements CmsUiProvider, InitializingBean,
-               BundleContextAware {
-       private final static Log log = LogFactory.getLog(CmsLink.class);
-
-       private String label;
-       private String custom;
-       private String target;
-       private String image;
-       private MouseListener mouseListener;
-
-       private int verticalAlignment = SWT.CENTER;
-
-       // internal
-       //private Boolean isUrl = false;
-       private Integer imageWidth, imageHeight;
-
-       private BundleContext bundleContext;
-
-       public CmsLink() {
-               super();
-       }
-
-       public CmsLink(String label, String target) {
-               this(label, target, null);
-       }
-
-       public CmsLink(String label, String target, String custom) {
-               super();
-               this.label = label;
-               this.target = target;
-               this.custom = custom;
-               afterPropertiesSet();
-       }
-
-       @Override
-       public void afterPropertiesSet() {
-//             if (target != null) {
-//                     if (target.startsWith("/")) {
-//                             isUrl = true;
-//                     } else {
-//                             try {
-//                                     new URL(target);
-//                                     isUrl = true;
-//                             } catch (MalformedURLException e1) {
-//                                     isUrl = false;
-//                             }
-//                     }
-//             }
-
-               if (image != null) {
-                       ImageData image = loadImage();
-                       imageWidth = image.width;
-                       imageHeight = image.height;
-               }
-       }
-
-       @Override
-       public Control createUi(final Composite parent, Node context) {
-               Composite comp = new Composite(parent, SWT.BOTTOM);
-               comp.setLayout(CmsUtils.noSpaceGridLayout());
-
-               Label link = new Label(comp, SWT.NONE);
-               link.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
-               GridData layoutData = new GridData(SWT.CENTER, verticalAlignment, true,
-                               true);
-               if (image != null) {
-                       layoutData.heightHint = imageHeight;
-                       if (label == null)
-                               layoutData.widthHint = imageWidth;
-               }
-
-               link.setLayoutData(layoutData);
-               if (custom != null) {
-                       comp.setData(RWT.CUSTOM_VARIANT, custom);
-                       link.setData(RWT.CUSTOM_VARIANT, custom);
-               } else {
-                       comp.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK);
-                       link.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK);
-               }
-
-               // label
-               StringBuilder labelText = new StringBuilder();
-               if (target != null) {
-                       labelText
-                                       .append("<a style='color:inherit;text-decoration:inherit;' href=\"");
-//                     if (!isUrl)
-//                             labelText.append('#');
-                       labelText.append(target);
-                       labelText.append("\">");
-               }
-               if (image != null) {
-                       registerImageIfNeeded();
-                       String imageLocation = RWT.getResourceManager().getLocation(image);
-                       labelText.append("<img width='").append(imageWidth)
-                                       .append("' height='").append(imageHeight)
-                                       .append("' src=\"").append(imageLocation).append("\"/>");
-
-                       // final Image img = loadImage(parent.getDisplay());
-                       // link.setImage(img);
-                       // link.addDisposeListener(new DListener(img));
-               }
-
-               if (label != null) {
-                       // link.setText(label);
-                       labelText.append(' ').append(label);
-               }
-
-               if (target != null)
-                       labelText.append("</a>");
-
-               link.setText(labelText.toString());
-
-               // link.setCursor(link.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
-               // CmsSession cmsSession = (CmsSession) parent.getDisplay().getData(
-               // CmsSession.KEY);
-               if (mouseListener != null)
-                       link.addMouseListener(mouseListener);
-
-               return comp;
-       }
-
-       private void registerImageIfNeeded() {
-               ResourceManager resourceManager = RWT.getResourceManager();
-               if (!resourceManager.isRegistered(image)) {
-                       URL res = getImageUrl();
-                       InputStream inputStream = null;
-                       try {
-                               IOUtils.closeQuietly(inputStream);
-                               inputStream = res.openStream();
-                               resourceManager.register(image, inputStream);
-                               if (log.isTraceEnabled())
-                                       log.trace("Registered image " + image);
-                       } catch (Exception e) {
-                               throw new CmsException("Cannot load image " + image, e);
-                       } finally {
-                               IOUtils.closeQuietly(inputStream);
-                       }
-               }
-       }
-
-       private ImageData loadImage() {
-               URL url = getImageUrl();
-               ImageData result = null;
-               InputStream inputStream = null;
-               try {
-                       inputStream = url.openStream();
-                       result = new ImageData(inputStream);
-                       if (log.isTraceEnabled())
-                               log.trace("Loaded image " + image);
-               } catch (Exception e) {
-                       throw new CmsException("Cannot load image " + image, e);
-               } finally {
-                       IOUtils.closeQuietly(inputStream);
-               }
-               return result;
-       }
-
-       private URL getImageUrl() {
-               URL url;
-               try {
-                       // pure URL
-                       url = new URL(image);
-               } catch (MalformedURLException e1) {
-                       // in OSGi bundle
-                       if (bundleContext == null)
-                               throw new CmsException("No bundle context available");
-                       url = bundleContext.getBundle().getResource(image);
-               }
-
-               if (url == null)
-                       throw new CmsException("No image " + image + " available.");
-
-               return url;
-       }
-
-       public void setLabel(String label) {
-               this.label = label;
-       }
-
-       public void setCustom(String custom) {
-               this.custom = custom;
-       }
-
-       public void setTarget(String target) {
-               this.target = target;
-               // try {
-               // new URL(target);
-               // isUrl = true;
-               // } catch (MalformedURLException e1) {
-               // isUrl = false;
-               // }
-       }
-
-       public void setImage(String image) {
-               this.image = image;
-       }
-
-       @Override
-       public void setBundleContext(BundleContext bundleContext) {
-               this.bundleContext = bundleContext;
-       }
-
-       public void setMouseListener(MouseListener mouseListener) {
-               this.mouseListener = mouseListener;
-       }
-
-       public void setvAlign(String vAlign) {
-               if ("bottom".equals(vAlign)) {
-                       verticalAlignment = SWT.BOTTOM;
-               } else if ("top".equals(vAlign)) {
-                       verticalAlignment = SWT.TOP;
-               } else if ("center".equals(vAlign)) {
-                       verticalAlignment = SWT.CENTER;
-               } else {
-                       throw new CmsException("Unsupported vertical allignment " + vAlign
-                                       + " (must be: top, bottom or center)");
-               }
-       }
-
-       // private class MListener extends MouseAdapter {
-       // private static final long serialVersionUID = 3634864186295639792L;
-       //
-       // @Override
-       // public void mouseDown(MouseEvent e) {
-       // if (e.button == 1) {
-       // }
-       // }
-       // }
-       //
-       // private class DListener implements DisposeListener {
-       // private static final long serialVersionUID = -3808587499269394812L;
-       // private final Image img;
-       //
-       // public DListener(Image img) {
-       // super();
-       // this.img = img;
-       // }
-       //
-       // @Override
-       // public void widgetDisposed(DisposeEvent event) {
-       // img.dispose();
-       // }
-       //
-       // }
-}
index 54ed1efcba840632e4695e96e8651e26f3a179cb..e8a2e48fd0523d6417f86514540e13d8e71c78c2 100644 (file)
@@ -26,7 +26,7 @@ public class CmsLogin {
        private AuthenticationManager authenticationManager;
        private String systemKey = KernelConstants.DEFAULT_SECURITY_KEY;
 
-       protected void logInAsAnonymous() {
+       public void logInAsAnonymous() {
                // TODO Better deal with anonymous authentication
                try {
                        List<SimpleGrantedAuthority> anonAuthorities = Collections
@@ -45,7 +45,7 @@ public class CmsLogin {
                }
        }
 
-       protected void logInWithPassword(String username, char[] password) {
+       public void logInWithPassword(String username, char[] password) {
                UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                                username, password);
                Authentication authentication = authenticationManager
index a69d20970724f6284dc87d3f5189df3b7ffb2fe9..bffd494ce668ee06fe7853830e2a63eefd664360 100644 (file)
@@ -1,5 +1,8 @@
 package org.argeo.cms;
 
+import org.argeo.cms.i18n.DefaultsResourceBundle;
+import org.argeo.cms.i18n.Msg;
+
 /** Standard CMS messages. */
 public class CmsMsg extends DefaultsResourceBundle {
        public final static Msg username = new Msg("username");
index 0f4e5410900761a21546c518adadc04da852dd42..38c2b6c9989b0111af77feb7d5d66efdd80e16ea 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.cms;
 
+import org.argeo.cms.i18n.Msg;
+
 /** Provides interaction with the CMS system. UNSTABLE API at this stage. */
 public interface CmsSession {
        public final static String KEY = "org.argeo.connect.web.cmsSession";
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsUtils.java b/org.argeo.cms/src/org/argeo/cms/CmsUtils.java
deleted file mode 100644 (file)
index 10e5238..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.argeo.cms;
-
-import java.io.InputStream;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.io.IOUtils;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.service.ResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Widget;
-
-/** Static utilities for the CMS framework. */
-public class CmsUtils implements CmsConstants {
-       /** @deprecated Use rowData16px() instead. GridData should not be reused. */
-       @Deprecated
-       public static RowData ROW_DATA_16px = new RowData(16, 16);
-
-       public static GridLayout noSpaceGridLayout() {
-               return noSpaceGridLayout(new GridLayout());
-       }
-
-       public static GridLayout noSpaceGridLayout(GridLayout layout) {
-               layout.horizontalSpacing = 0;
-               layout.verticalSpacing = 0;
-               layout.marginWidth = 0;
-               layout.marginHeight = 0;
-               return layout;
-       }
-
-       //
-       // GRID DATA
-       //
-       public static GridData fillWidth() {
-               return grabWidth(SWT.FILL, SWT.FILL);
-       }
-
-       public static GridData fillAll() {
-               return new GridData(SWT.FILL, SWT.FILL, true, true);
-       }
-
-       public static GridData grabWidth(int horizontalAlignment,
-                       int verticalAlignment) {
-               return new GridData(horizontalAlignment, horizontalAlignment, true,
-                               false);
-       }
-
-       public static RowData rowData16px() {
-               return new RowData(16, 16);
-       }
-
-       public static void style(Widget widget, String style) {
-               widget.setData(CmsConstants.STYLE, style);
-       }
-
-       public static void markup(Widget widget) {
-               widget.setData(CmsConstants.MARKUP, true);
-       }
-
-       /** @return the path or null if not instrumented */
-       public static String getDataPath(Widget widget) {
-               // JCR item
-               Object data = widget.getData();
-               if (data != null && data instanceof Item) {
-                       try {
-                               return ((Item) data).getPath();
-                       } catch (RepositoryException e) {
-                               throw new CmsException("Cannot find data path of " + data
-                                               + " for " + widget);
-                       }
-               }
-
-               // JCR path
-               data = widget.getData(Property.JCR_PATH);
-               if (data != null)
-                       return data.toString();
-
-               return null;
-       }
-
-       /** Dispose all children of a Composite */
-       public static void clear(Composite composite) {
-               for (Control child : composite.getChildren())
-                       child.dispose();
-       }
-
-       //
-       // JCR
-       //
-       public static Node getOrAddEmptyFile(Node parent, Enum<?> child)
-                       throws RepositoryException {
-               if (has(parent, child))
-                       return child(parent, child);
-               return JcrUtils.copyBytesAsFile(parent, child.name(), new byte[0]);
-       }
-
-       public static Node child(Node parent, Enum<?> en)
-                       throws RepositoryException {
-               return parent.getNode(en.name());
-       }
-
-       public static Boolean has(Node parent, Enum<?> en)
-                       throws RepositoryException {
-               return parent.hasNode(en.name());
-       }
-
-       public static Node getOrAdd(Node parent, Enum<?> en)
-                       throws RepositoryException {
-               return getOrAdd(parent, en, null);
-       }
-
-       public static Node getOrAdd(Node parent, Enum<?> en, String primaryType)
-                       throws RepositoryException {
-               if (has(parent, en))
-                       return child(parent, en);
-               else if (primaryType == null)
-                       return parent.addNode(en.name());
-               else
-                       return parent.addNode(en.name(), primaryType);
-       }
-
-       // IMAGES
-       public static String img(String src, String width, String height) {
-               return imgBuilder(src, width, height).append("/>").toString();
-       }
-
-       public static String img(String src, Point size) {
-               return img(src, Integer.toString(size.x), Integer.toString(size.y));
-       }
-
-       public static StringBuilder imgBuilder(String src, String width,
-                       String height) {
-               return new StringBuilder(64).append("<img width='").append(width)
-                               .append("' height='").append(height).append("' src='")
-                               .append(src).append("'");
-       }
-
-       public static String noImg(Point size) {
-               ResourceManager rm = RWT.getResourceManager();
-               return CmsUtils.img(rm.getLocation(NO_IMAGE), size);
-       }
-
-       public static String noImg() {
-               return noImg(NO_IMAGE_SIZE);
-       }
-
-       public static Image noImage(Point size) {
-               ResourceManager rm = RWT.getResourceManager();
-               InputStream in = null;
-               try {
-                       in = rm.getRegisteredContent(NO_IMAGE);
-                       ImageData id = new ImageData(in);
-                       ImageData scaled = id.scaledTo(size.x, size.y);
-                       Image image = new Image(Display.getCurrent(), scaled);
-                       return image;
-               } finally {
-                       IOUtils.closeQuietly(in);
-               }
-       }
-
-       private CmsUtils() {
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/DefaultsResourceBundle.java b/org.argeo.cms/src/org/argeo/cms/DefaultsResourceBundle.java
deleted file mode 100644 (file)
index 2d78758..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.argeo.cms;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Enumeration;
-import java.util.ResourceBundle;
-import java.util.Vector;
-
-/** Expose the default values as a {@link ResourceBundle} */
-public class DefaultsResourceBundle extends ResourceBundle {
-
-       @Override
-       protected Object handleGetObject(String key) {
-               Object obj;
-               try {
-                       Field field = getClass().getField(key);
-                       obj = field.getType().getMethod("getDefault")
-                                       .invoke(field.get(null));
-               } catch (Exception e) {
-                       throw new CmsException("Cannot get default for " + key, e);
-               }
-               return obj;
-       }
-
-       @Override
-       public Enumeration<String> getKeys() {
-               Vector<String> res = new Vector<String>();
-               final Field[] fieldArray = getClass().getDeclaredFields();
-
-               for (Field field : fieldArray) {
-                       if (Modifier.isStatic(field.getModifiers())
-                                       && field.getType().isAssignableFrom(Msg.class)) {
-                               res.add(field.getName());
-                       }
-               }
-               return res.elements();
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/IdentityTextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/IdentityTextInterpreter.java
deleted file mode 100644 (file)
index c66cd86..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.argeo.cms;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-/** Based on HTML with a few Wiki-like shortcuts. */
-public class IdentityTextInterpreter implements TextInterpreter, CmsNames {
-
-       @Override
-       public void write(Item item, String content) {
-               try {
-                       if (item instanceof Node) {
-                               Node node = (Node) item;
-                               if (node.isNodeType(CmsTypes.CMS_STYLED)) {
-                                       String raw = convertToStorage(node, content);
-                                       node.setProperty(CMS_CONTENT, raw);
-                               } else {
-                                       throw new CmsException("Don't know how to interpret "
-                                                       + node);
-                               }
-                       } else {// property
-                               Property property = (Property) item;
-                               property.setValue(content);
-                       }
-                       item.getSession().save();
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot set content on " + item, e);
-               }
-       }
-
-       @Override
-       public String read(Item item) {
-               try {
-                       String raw = raw(item);
-                       return convertFromStorage(item, raw);
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot get " + item + " for edit", e);
-               }
-       }
-
-       @Override
-       public String raw(Item item) {
-               try {
-                       if (item instanceof Node) {
-                               Node node = (Node) item;
-                               if (node.isNodeType(CmsTypes.CMS_STYLED)) {
-                                       // WORKAROUND FOR BROKEN PARARAPHS
-                                       if (!node.hasProperty(CMS_CONTENT)) {
-                                               node.setProperty(CMS_CONTENT, "");
-                                               node.getSession().save();
-                                       }
-                                       
-                                       return node.getProperty(CMS_CONTENT).getString();
-                               } else {
-                                       throw new CmsException("Don't know how to interpret "
-                                                       + node);
-                               }
-                       } else {// property
-                               Property property = (Property) item;
-                               return property.getString();
-                       }
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot get " + item + " content", e);
-               }
-       }
-
-       protected String convertToStorage(Item item, String content)
-                       throws RepositoryException {
-               return content;
-
-       }
-
-       protected String convertFromStorage(Item item, String content)
-                       throws RepositoryException {
-               return content;
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/MenuLink.java b/org.argeo.cms/src/org/argeo/cms/MenuLink.java
deleted file mode 100644 (file)
index 75be3f1..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.argeo.cms;
-
-/**
- * Convenience class setting the custom style {@link CmsStyles#CMS_MENU_LINK} on
- * a {@link CmsLink} when simple menus are used.
- */
-public class MenuLink extends CmsLink {
-       public MenuLink() {
-               setCustom(CmsStyles.CMS_MENU_LINK);
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/Msg.java b/org.argeo.cms/src/org/argeo/cms/Msg.java
deleted file mode 100644 (file)
index 057b74a..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.argeo.cms;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-import org.eclipse.rap.rwt.RWT;
-
-/** A single message to be internationalised. */
-public class Msg {
-       private String id;
-       private ClassLoader classLoader;
-       private final Object defaultLocal;
-
-       public Msg() {
-               defaultLocal = null;
-       }
-
-       public Msg(Object defaultMessage) {
-               this.defaultLocal = defaultMessage;
-       }
-
-       public String getId() {
-               return id;
-       }
-
-       public void setId(String id) {
-               this.id = id;
-       }
-
-       public ClassLoader getClassLoader() {
-               return classLoader;
-       }
-
-       public void setClassLoader(ClassLoader classLoader) {
-               this.classLoader = classLoader;
-       }
-
-       public Object getDefault() {
-               return defaultLocal;
-       }
-
-       public String toString() {
-               return local().toString();
-       }
-
-       /** When used as the first word of a sentence. */
-       public String lead() {
-               String raw = toString();
-               return raw.substring(0, 1).toUpperCase(RWT.getLocale())
-                               + raw.substring(1);
-       }
-
-       public Object local() {
-               CmsSession cmSession = CmsSession.current.get();
-               Object local = cmSession.local(this);
-               if (local == null)
-                       local = getDefault();
-               if (local == null)
-                       throw new CmsException("No translation found for " + id);
-               return local;
-       }
-
-       public static void init(Class<?> clss) {
-               final Field[] fieldArray = clss.getDeclaredFields();
-               ClassLoader loader = clss.getClassLoader();
-
-               for (Field field : fieldArray) {
-                       if (Modifier.isStatic(field.getModifiers())
-                                       && field.getType().isAssignableFrom(Msg.class)) {
-                               try {
-                                       Object obj = field.get(null);
-                                       String id = clss.getCanonicalName() + "." + field.getName();
-                                       obj.getClass().getMethod("setId", String.class)
-                                                       .invoke(obj, id);
-                                       obj.getClass()
-                                                       .getMethod("setClassLoader", ClassLoader.class)
-                                                       .invoke(obj, loader);
-                               } catch (Exception e) {
-                                       throw new CmsException("Cannot prepare field " + field);
-                               }
-                       }
-               }
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/OpenUserMenu.java b/org.argeo.cms/src/org/argeo/cms/OpenUserMenu.java
deleted file mode 100644 (file)
index 55c149e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.argeo.cms;
-
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Control;
-
-/** Open the user menu when clicked */
-public class OpenUserMenu extends MouseAdapter {
-       private static final long serialVersionUID = 3634864186295639792L;
-       private CmsLogin cmsLogin;
-
-       @Override
-       public void mouseDown(MouseEvent e) {
-               if (e.button == 1) {
-                       new UserMenu(cmsLogin, (Control) e.getSource());
-               }
-       }
-
-       public void setCmsLogin(CmsLogin cmsLogin) {
-               this.cmsLogin = cmsLogin;
-       }
-
-}
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/SimpleCmsHeader.java b/org.argeo.cms/src/org/argeo/cms/SimpleCmsHeader.java
deleted file mode 100644 (file)
index 24c9242..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.argeo.cms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** A header in three parts */
-public class SimpleCmsHeader implements CmsUiProvider {
-       private List<CmsUiProvider> lead = new ArrayList<CmsUiProvider>();
-       private List<CmsUiProvider> center = new ArrayList<CmsUiProvider>();
-       private List<CmsUiProvider> end = new ArrayList<CmsUiProvider>();
-
-       private Boolean subPartsSameWidth = false;
-
-       @Override
-       public Control createUi(Composite parent, Node context)
-                       throws RepositoryException {
-               Composite header = new Composite(parent, SWT.NONE);
-               header.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_HEADER);
-               header.setBackgroundMode(SWT.INHERIT_DEFAULT);
-               header.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(3, false)));
-
-               configurePart(context, header, lead);
-               configurePart(context, header, center);
-               configurePart(context, header, end);
-               return header;
-       }
-
-       protected void configurePart(Node context, Composite parent,
-                       List<CmsUiProvider> partProviders) throws RepositoryException {
-               final int style;
-               final String custom;
-               if (lead == partProviders) {
-                       style = SWT.LEAD;
-                       custom = CmsStyles.CMS_HEADER_LEAD;
-               } else if (center == partProviders) {
-                       style = SWT.CENTER;
-                       custom = CmsStyles.CMS_HEADER_CENTER;
-               } else if (end == partProviders) {
-                       style = SWT.END;
-                       custom = CmsStyles.CMS_HEADER_END;
-               } else {
-                       throw new CmsException("Unsupported part providers "
-                                       + partProviders);
-               }
-
-               Composite part = new Composite(parent, SWT.NONE);
-               part.setData(RWT.CUSTOM_VARIANT, custom);
-               GridData gridData = new GridData(style, SWT.FILL, true, true);
-               part.setLayoutData(gridData);
-               part.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(partProviders
-                               .size(), subPartsSameWidth)));
-               for (CmsUiProvider uiProvider : partProviders) {
-                       Control subPart = uiProvider.createUi(part, context);
-                       subPart.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                       true));
-               }
-       }
-
-       public void setLead(List<CmsUiProvider> lead) {
-               this.lead = lead;
-       }
-
-       public void setCenter(List<CmsUiProvider> center) {
-               this.center = center;
-       }
-
-       public void setEnd(List<CmsUiProvider> end) {
-               this.end = end;
-       }
-
-       public void setSubPartsSameWidth(Boolean subPartsSameWidth) {
-               this.subPartsSameWidth = subPartsSameWidth;
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/SimpleDynamicPages.java b/org.argeo.cms/src/org/argeo/cms/SimpleDynamicPages.java
deleted file mode 100644 (file)
index 5de40bb..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.argeo.cms;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.Value;
-
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-public class SimpleDynamicPages implements CmsUiProvider {
-
-       @Override
-       public Control createUi(Composite parent, Node context)
-                       throws RepositoryException {
-               if (context == null)
-                       throw new CmsException("Context cannot be null");
-               parent.setLayout(new GridLayout(2, false));
-
-               // parent
-               if (!context.getPath().equals("/")) {
-                       new CmsLink("..", context.getParent().getPath()).createUi(parent,
-                                       context);
-                       new Label(parent, SWT.NONE).setText(context.getParent()
-                                       .getPrimaryNodeType().getName());
-               }
-
-               // context
-               Label contextL = new Label(parent, SWT.NONE);
-               contextL.setData(RWT.MARKUP_ENABLED, true);
-               contextL.setText("<b>" + context.getName() + "</b>");
-               new Label(parent, SWT.NONE).setText(context.getPrimaryNodeType()
-                               .getName());
-
-               // children
-               // Label childrenL = new Label(parent, SWT.NONE);
-               // childrenL.setData(RWT.MARKUP_ENABLED, true);
-               // childrenL.setText("<i>Children:</i>");
-               // childrenL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false,
-               // false, 2, 1));
-
-               for (NodeIterator nIt = context.getNodes(); nIt.hasNext();) {
-                       Node child = nIt.nextNode();
-                       new CmsLink(child.getName(), child.getPath()).createUi(parent,
-                                       context);
-
-                       new Label(parent, SWT.NONE).setText(child.getPrimaryNodeType()
-                                       .getName());
-               }
-
-               // properties
-               // Label propsL = new Label(parent, SWT.NONE);
-               // propsL.setData(RWT.MARKUP_ENABLED, true);
-               // propsL.setText("<i>Properties:</i>");
-               // propsL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false,
-               // 2, 1));
-               for (PropertyIterator pIt = context.getProperties(); pIt.hasNext();) {
-                       Property property = pIt.nextProperty();
-
-                       Label label = new Label(parent, SWT.NONE);
-                       label.setText(property.getName());
-                       label.setToolTipText(JcrUtils
-                                       .getPropertyDefinitionAsString(property));
-
-                       new Label(parent, SWT.NONE).setText(getPropAsString(property));
-               }
-
-               return null;
-       }
-
-       private String getPropAsString(Property property)
-                       throws RepositoryException {
-               String result = "";
-               DateFormat timeFormatter = new SimpleDateFormat("");
-               if (property.isMultiple()) {
-                       result = getMultiAsString(property, ", ");
-               } else {
-                       Value value = property.getValue();
-                       if (value.getType() == PropertyType.BINARY)
-                               result = "<binary>";
-                       else if (value.getType() == PropertyType.DATE)
-                               result = timeFormatter.format(value.getDate().getTime());
-                       else
-                               result = value.getString();
-               }
-               return result;
-       }
-
-       private String getMultiAsString(Property property, String separator)
-                       throws RepositoryException {
-               if (separator == null)
-                       separator = "; ";
-               Value[] values = property.getValues();
-               StringBuilder builder = new StringBuilder();
-               for (Value val : values) {
-                       String currStr = val.getString();
-                       if (!"".equals(currStr.trim()))
-                               builder.append(currStr).append(separator);
-               }
-               if (builder.lastIndexOf(separator) >= 0)
-                       return builder.substring(0, builder.length() - separator.length());
-               else
-                       return builder.toString();
-       }
-}
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/SimpleStaticPage.java b/org.argeo.cms/src/org/argeo/cms/SimpleStaticPage.java
deleted file mode 100644 (file)
index 1cb0300..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.argeo.cms;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-public class SimpleStaticPage implements CmsUiProvider {
-       private String text;
-
-       @Override
-       public Control createUi(Composite parent, Node context)
-                       throws RepositoryException {
-               Label textC = new Label(parent,  SWT.WRAP);
-               textC.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_STATIC_TEXT);
-               textC.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
-               textC.setText(text);
-               
-               return textC;
-       }
-
-       public void setText(String text) {
-               this.text = text;
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/TextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/TextInterpreter.java
deleted file mode 100644 (file)
index f7cbca7..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.argeo.cms;
-
-import javax.jcr.Item;
-
-/** Convert from/to data layer to/from presentation layer. */
-public interface TextInterpreter {
-       public String raw(Item item);
-
-       public String read(Item item);
-
-       public void write(Item item, String content);
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/UrlResourceLoader.java b/org.argeo.cms/src/org/argeo/cms/UrlResourceLoader.java
deleted file mode 100644 (file)
index fb4e2cd..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.argeo.cms;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import org.eclipse.rap.rwt.service.ResourceLoader;
-
-/** {@link ResourceLoader} implementation wrapping an {@link URL}. */
-@Deprecated
-public class UrlResourceLoader implements ResourceLoader {
-       private final URL url;
-
-       public UrlResourceLoader(URL url) {
-               super();
-               this.url = url;
-       }
-
-       @Override
-       public InputStream getResourceAsStream(String resourceName)
-                       throws IOException {
-               return url.openStream();
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/UserMenu.java b/org.argeo.cms/src/org/argeo/cms/UserMenu.java
deleted file mode 100644 (file)
index 41ff9ab..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.argeo.cms;
-
-import static org.argeo.cms.internal.kernel.KernelConstants.SPRING_SECURITY_CONTEXT_KEY;
-
-import javax.servlet.http.HttpSession;
-
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-/** The site-related user menu */
-public class UserMenu extends Shell implements CmsStyles {
-       private static final long serialVersionUID = -5788157651532106301L;
-
-       private CmsLogin cmsLogin;
-       private String username = null;
-
-       public UserMenu(CmsLogin cmsLogin, Control source) {
-               super(source.getDisplay(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
-               this.cmsLogin = cmsLogin;
-
-               setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU);
-
-               username = SecurityContextHolder.getContext().getAuthentication()
-                               .getName();
-               if (username.equals("anonymous")) {
-                       username = null;
-                       anonymousUi();
-               } else {
-                       userUi();
-               }
-
-               pack();
-               layout();
-               setLocation(source.toDisplay(source.getSize().x - getSize().x,
-                               source.getSize().y));
-
-               addShellListener(new ShellAdapter() {
-                       private static final long serialVersionUID = 5178980294808435833L;
-
-                       @Override
-                       public void shellDeactivated(ShellEvent e) {
-                               close();
-                               dispose();
-                       }
-
-               });
-
-               open();
-
-       }
-
-       protected void userUi() {
-               setLayout(new GridLayout());
-
-               Label l = new Label(this, SWT.NONE);
-               l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM);
-               l.setData(RWT.MARKUP_ENABLED, true);
-               l.setLayoutData(CmsUtils.fillWidth());
-               l.setText("<b>" + username + "</b>");
-
-               final CmsSession cmsSession = (CmsSession) getDisplay().getData(
-                               CmsSession.KEY);
-               l = new Label(this, SWT.NONE);
-               l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM);
-               l.setText(CmsMsg.logout.lead());
-               GridData lData = CmsUtils.fillWidth();
-               lData.widthHint = 120;
-               l.setLayoutData(lData);
-
-               l.addMouseListener(new MouseAdapter() {
-                       private static final long serialVersionUID = 6444395812777413116L;
-
-                       public void mouseDown(MouseEvent e) {
-                               SecurityContextHolder.getContext().setAuthentication(null);
-                               HttpSession httpSession = RWT.getRequest().getSession();
-                               httpSession.removeAttribute(SPRING_SECURITY_CONTEXT_KEY);
-                               close();
-                               dispose();
-                               cmsSession.authChange();
-                       }
-               });
-       }
-
-       protected void anonymousUi() {
-               Integer textWidth = 150;
-               setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU);
-               setLayout(new GridLayout(2, false));
-
-               new Label(this, SWT.NONE).setText(CmsMsg.username.lead());
-               final Text username = new Text(this, SWT.BORDER);
-               username.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_USERNAME);
-               GridData gd = CmsUtils.fillWidth();
-               gd.widthHint = textWidth;
-               username.setLayoutData(gd);
-
-               new Label(this, SWT.NONE).setText(CmsMsg.password.lead());
-               final Text password = new Text(this, SWT.BORDER | SWT.PASSWORD);
-               password.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_PASSWORD);
-               gd = CmsUtils.fillWidth();
-               gd.widthHint = textWidth;
-               password.setLayoutData(gd);
-
-               // Listeners
-               TraverseListener tl = new TraverseListener() {
-                       private static final long serialVersionUID = -1158892811534971856L;
-
-                       public void keyTraversed(TraverseEvent e) {
-                               if (e.detail == SWT.TRAVERSE_RETURN)
-                                       login(username.getText(), password.getTextChars());
-                       }
-               };
-               username.addTraverseListener(tl);
-               password.addTraverseListener(tl);
-       }
-
-       protected void login(String username, char[] password) {
-               CmsSession cmsSession = (CmsSession) getDisplay().getData(
-                               CmsSession.KEY);
-               cmsLogin.logInWithPassword(username, password);
-               close();
-               dispose();
-               // refreshUi(source.getParent());
-               cmsSession.authChange();
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java b/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java
new file mode 100644 (file)
index 0000000..2fc9cbc
--- /dev/null
@@ -0,0 +1,41 @@
+package org.argeo.cms.i18n;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Enumeration;
+import java.util.ResourceBundle;
+import java.util.Vector;
+
+import org.argeo.cms.CmsException;
+
+/** Expose the default values as a {@link ResourceBundle} */
+public class DefaultsResourceBundle extends ResourceBundle {
+
+       @Override
+       protected Object handleGetObject(String key) {
+               Object obj;
+               try {
+                       Field field = getClass().getField(key);
+                       obj = field.getType().getMethod("getDefault")
+                                       .invoke(field.get(null));
+               } catch (Exception e) {
+                       throw new CmsException("Cannot get default for " + key, e);
+               }
+               return obj;
+       }
+
+       @Override
+       public Enumeration<String> getKeys() {
+               Vector<String> res = new Vector<String>();
+               final Field[] fieldArray = getClass().getDeclaredFields();
+
+               for (Field field : fieldArray) {
+                       if (Modifier.isStatic(field.getModifiers())
+                                       && field.getType().isAssignableFrom(Msg.class)) {
+                               res.add(field.getName());
+                       }
+               }
+               return res.elements();
+       }
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java
new file mode 100644 (file)
index 0000000..dd38c74
--- /dev/null
@@ -0,0 +1,86 @@
+package org.argeo.cms.i18n;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsSession;
+import org.eclipse.rap.rwt.RWT;
+
+/** A single message to be internationalised. */
+public class Msg {
+       private String id;
+       private ClassLoader classLoader;
+       private final Object defaultLocal;
+
+       public Msg() {
+               defaultLocal = null;
+       }
+
+       public Msg(Object defaultMessage) {
+               this.defaultLocal = defaultMessage;
+       }
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public ClassLoader getClassLoader() {
+               return classLoader;
+       }
+
+       public void setClassLoader(ClassLoader classLoader) {
+               this.classLoader = classLoader;
+       }
+
+       public Object getDefault() {
+               return defaultLocal;
+       }
+
+       public String toString() {
+               return local().toString();
+       }
+
+       /** When used as the first word of a sentence. */
+       public String lead() {
+               String raw = toString();
+               return raw.substring(0, 1).toUpperCase(RWT.getLocale())
+                               + raw.substring(1);
+       }
+
+       public Object local() {
+               CmsSession cmSession = CmsSession.current.get();
+               Object local = cmSession.local(this);
+               if (local == null)
+                       local = getDefault();
+               if (local == null)
+                       throw new CmsException("No translation found for " + id);
+               return local;
+       }
+
+       public static void init(Class<?> clss) {
+               final Field[] fieldArray = clss.getDeclaredFields();
+               ClassLoader loader = clss.getClassLoader();
+
+               for (Field field : fieldArray) {
+                       if (Modifier.isStatic(field.getModifiers())
+                                       && field.getType().isAssignableFrom(Msg.class)) {
+                               try {
+                                       Object obj = field.get(null);
+                                       String id = clss.getCanonicalName() + "." + field.getName();
+                                       obj.getClass().getMethod("setId", String.class)
+                                                       .invoke(obj, id);
+                                       obj.getClass()
+                                                       .getMethod("setClassLoader", ClassLoader.class)
+                                                       .invoke(obj, loader);
+                               } catch (Exception e) {
+                                       throw new CmsException("Cannot prepare field " + field);
+                               }
+                       }
+               }
+       }
+}
index db36f719f44694cab9c3e0011abb8ebdc7339720..b1d27e516092fe63eda29a750660f7227d974a8f 100644 (file)
@@ -24,7 +24,7 @@ import org.argeo.cms.CmsException;
 import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.CmsTypes;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.service.ResourceManager;
index e3211ef13a53bead4522f697382beb7a1b02ae29..67e500ffc008c579a90de6501ff445671b743704 100644 (file)
@@ -2,7 +2,7 @@ package org.argeo.cms.internal;
 
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.widgets.EditableImage;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.Composite;
index cbed63e8c88ebca94fda59774b31cdd0b64519b6..57939b5172082f1580dfda7ad388915657065e65 100644 (file)
@@ -1,7 +1,7 @@
 package org.argeo.cms.internal.text;
 
 import static javax.jcr.Property.JCR_TITLE;
-import static org.argeo.cms.CmsUtils.fillWidth;
+import static org.argeo.cms.util.CmsUtils.fillWidth;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -24,12 +24,12 @@ import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.CmsSession;
 import org.argeo.cms.CmsTypes;
-import org.argeo.cms.CmsUtils;
-import org.argeo.cms.IdentityTextInterpreter;
-import org.argeo.cms.TextInterpreter;
+import org.argeo.cms.text.IdentityTextInterpreter;
 import org.argeo.cms.text.Img;
 import org.argeo.cms.text.Paragraph;
+import org.argeo.cms.text.TextInterpreter;
 import org.argeo.cms.text.TextSection;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.AbstractPageViewer;
 import org.argeo.cms.viewers.EditablePart;
 import org.argeo.cms.viewers.NodePart;
index 3fff4e421343a31e24204b0a554a840abbf76521..e3561e104777b9be7e26107c3c153060a2c5f044 100644 (file)
@@ -18,11 +18,11 @@ import javax.jcr.Value;
 
 import org.argeo.ArgeoException;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsLink;
 import org.argeo.cms.CmsTypes;
 import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.CmsUtils;
 import org.argeo.cms.text.Img;
+import org.argeo.cms.util.CmsLink;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.widgets.EditableImage;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
index 7c1a18a1486ec0fbd70279260ad7df038674d032..b27d506592a020a7bde95f4d8851820c953bc8c7 100644 (file)
@@ -4,7 +4,7 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
index 6ff78108fc3fc88c221c5e96efdeccdf587fc6e8..900dce2ae48232e8d5a83f645e6cde89fadc3be1 100644 (file)
@@ -1,6 +1,6 @@
 package org.argeo.cms.text;
 
-import static org.argeo.cms.CmsUtils.fillWidth;
+import static org.argeo.cms.util.CmsUtils.fillWidth;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
diff --git a/org.argeo.cms/src/org/argeo/cms/text/IdentityTextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/text/IdentityTextInterpreter.java
new file mode 100644 (file)
index 0000000..db90ea0
--- /dev/null
@@ -0,0 +1,83 @@
+package org.argeo.cms.text;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsNames;
+import org.argeo.cms.CmsTypes;
+
+/** Based on HTML with a few Wiki-like shortcuts. */
+public class IdentityTextInterpreter implements TextInterpreter, CmsNames {
+
+       @Override
+       public void write(Item item, String content) {
+               try {
+                       if (item instanceof Node) {
+                               Node node = (Node) item;
+                               if (node.isNodeType(CmsTypes.CMS_STYLED)) {
+                                       String raw = convertToStorage(node, content);
+                                       node.setProperty(CMS_CONTENT, raw);
+                               } else {
+                                       throw new CmsException("Don't know how to interpret "
+                                                       + node);
+                               }
+                       } else {// property
+                               Property property = (Property) item;
+                               property.setValue(content);
+                       }
+                       item.getSession().save();
+               } catch (RepositoryException e) {
+                       throw new CmsException("Cannot set content on " + item, e);
+               }
+       }
+
+       @Override
+       public String read(Item item) {
+               try {
+                       String raw = raw(item);
+                       return convertFromStorage(item, raw);
+               } catch (RepositoryException e) {
+                       throw new CmsException("Cannot get " + item + " for edit", e);
+               }
+       }
+
+       @Override
+       public String raw(Item item) {
+               try {
+                       if (item instanceof Node) {
+                               Node node = (Node) item;
+                               if (node.isNodeType(CmsTypes.CMS_STYLED)) {
+                                       // WORKAROUND FOR BROKEN PARARAPHS
+                                       if (!node.hasProperty(CMS_CONTENT)) {
+                                               node.setProperty(CMS_CONTENT, "");
+                                               node.getSession().save();
+                                       }
+                                       
+                                       return node.getProperty(CMS_CONTENT).getString();
+                               } else {
+                                       throw new CmsException("Don't know how to interpret "
+                                                       + node);
+                               }
+                       } else {// property
+                               Property property = (Property) item;
+                               return property.getString();
+                       }
+               } catch (RepositoryException e) {
+                       throw new CmsException("Cannot get " + item + " content", e);
+               }
+       }
+
+       protected String convertToStorage(Item item, String content)
+                       throws RepositoryException {
+               return content;
+
+       }
+
+       protected String convertFromStorage(Item item, String content)
+                       throws RepositoryException {
+               return content;
+       }
+}
index 83c32087f68d78003c3fcff134d7c7ac879a0225..54f702bbafb90f656adc55dca09792078671d80b 100644 (file)
@@ -6,8 +6,8 @@ import javax.jcr.RepositoryException;
 import org.argeo.cms.CmsException;
 import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsSession;
-import org.argeo.cms.CmsUtils;
 import org.argeo.cms.internal.JcrFileUploadReceiver;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.NodePart;
 import org.argeo.cms.viewers.Section;
 import org.argeo.cms.viewers.SectionPart;
index d917c45d43d8871a65ecb3d2d53ac55618a60b3a..a7a7964f493365914e1cc1072398a9c5a1963597 100644 (file)
@@ -3,7 +3,7 @@ package org.argeo.cms.text;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.Section;
 import org.argeo.cms.viewers.SectionPart;
 import org.argeo.cms.widgets.EditableText;
index 7a3de3be92221577da056f9f1cf1698e70cb9123..4ce8d1fd92a840e02bd61ca5627c39cdfa802e9e 100644 (file)
@@ -8,8 +8,8 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsTypes;
-import org.argeo.cms.CmsUtils;
 import org.argeo.cms.internal.text.AbstractTextViewer;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.Section;
 import org.eclipse.swt.widgets.Composite;
 
index 6821fcb53d1d539609aeda713266ef8a7a7031d0..e70a4d06e850f9a8f3155b3e7a93a3d2af662c9c 100644 (file)
@@ -4,7 +4,7 @@ import java.util.Observable;
 import java.util.Observer;
 
 import org.argeo.cms.CmsEditable;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
diff --git a/org.argeo.cms/src/org/argeo/cms/text/TextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/text/TextInterpreter.java
new file mode 100644 (file)
index 0000000..f39a2b3
--- /dev/null
@@ -0,0 +1,12 @@
+package org.argeo.cms.text;
+
+import javax.jcr.Item;
+
+/** Convert from/to data layer to/from presentation layer. */
+public interface TextInterpreter {
+       public String raw(Item item);
+
+       public String read(Item item);
+
+       public void write(Item item, String content);
+}
index 09456f2c7a864955a0af9b5f8f4ec1c7eaac3fb0..ac93e4b65cc116a4a38775d1a2be2cc1b320f9f8 100644 (file)
@@ -4,7 +4,7 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsNames;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.Section;
 import org.eclipse.swt.widgets.Composite;
 
index 17c3d9c3a59065499951f1b11307aa46b8fc5749..65afeca4be9837d5f36bb56da94bffec6ad98922 100644 (file)
@@ -6,11 +6,11 @@ import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
 import org.argeo.cms.CmsEditable;
-import org.argeo.cms.CmsLink;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.CmsTypes;
 import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsLink;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.JcrVersionCmsEditable;
 import org.argeo.cms.widgets.ScrolledPage;
 import org.argeo.jcr.JcrUtils;
index ef0e9313e93b6961c6c24f13408e8aec5c393070..83998baadd7572482c307d07396797f29bcd1d35 100644 (file)
@@ -5,7 +5,7 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.JcrVersionCmsEditable;
 import org.argeo.cms.widgets.ScrolledPage;
 import org.argeo.security.UserAdminService;
index 66f50b885a8c1fcc2c8c2665a6c2007e690829c4..1c42134f1e5af0007c49771ca3edf4f1a66dd726 100644 (file)
@@ -9,7 +9,7 @@ import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
 import org.argeo.ArgeoException;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.EditablePart;
 import org.argeo.cms.viewers.NodePart;
 import org.argeo.cms.widgets.StyledControl;
index 8efcba26113a67301097c7fe93243487a913d42d..f4acb8a9d410b23566e3a5e642711c3b3f9c61af 100644 (file)
@@ -7,7 +7,7 @@ import javax.jcr.Item;
 import javax.jcr.RepositoryException;
 
 import org.argeo.ArgeoException;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.EditablePart;
 import org.argeo.cms.viewers.NodePart;
 import org.argeo.cms.widgets.StyledControl;
index a520da1bd791ba0e718a4ad23818c3481ed7646d..48ca70a6947d3a2c220cb329976a4aa8b47fa8d7 100644 (file)
@@ -5,7 +5,7 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.AbstractPageViewer;
 import org.argeo.cms.viewers.EditablePart;
 import org.eclipse.swt.SWT;
index ad0b62f458f962b43de8409dac2b9274adb59021..6b522f5d9ed07d4a000e551e6da719fb474d598d 100644 (file)
@@ -11,7 +11,7 @@ import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.EditablePart;
 import org.argeo.cms.viewers.JcrVersionCmsEditable;
 import org.eclipse.jface.viewers.ContentViewer;
index cc164b7692c88b390068cc6f05e06e8d89d0c82a..c5f0c7ee5045dea682b700cea14540b0e9fe802c 100644 (file)
@@ -14,8 +14,8 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.CmsUtils;
 import org.argeo.cms.maintenance.NonAdminPage;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.eclipse.ui.dialogs.UserCreationWizard;
 import org.argeo.eclipse.ui.parts.UsersTable;
 import org.argeo.jcr.ArgeoNames;
diff --git a/org.argeo.cms/src/org/argeo/cms/util/CmsLink.java b/org.argeo.cms/src/org/argeo/cms/util/CmsLink.java
new file mode 100644 (file)
index 0000000..674dc30
--- /dev/null
@@ -0,0 +1,273 @@
+package org.argeo.cms.util;
+
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.jcr.Node;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsStyles;
+import org.argeo.cms.CmsUiProvider;
+import org.eclipse.gemini.blueprint.context.BundleContextAware;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.service.ResourceManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.osgi.framework.BundleContext;
+import org.springframework.beans.factory.InitializingBean;
+
+/** A link to an internal or external location. */
+public class CmsLink implements CmsUiProvider, InitializingBean,
+               BundleContextAware {
+       private final static Log log = LogFactory.getLog(CmsLink.class);
+
+       private String label;
+       private String custom;
+       private String target;
+       private String image;
+       private MouseListener mouseListener;
+
+       private int verticalAlignment = SWT.CENTER;
+
+       // internal
+       //private Boolean isUrl = false;
+       private Integer imageWidth, imageHeight;
+
+       private BundleContext bundleContext;
+
+       public CmsLink() {
+               super();
+       }
+
+       public CmsLink(String label, String target) {
+               this(label, target, null);
+       }
+
+       public CmsLink(String label, String target, String custom) {
+               super();
+               this.label = label;
+               this.target = target;
+               this.custom = custom;
+               afterPropertiesSet();
+       }
+
+       @Override
+       public void afterPropertiesSet() {
+//             if (target != null) {
+//                     if (target.startsWith("/")) {
+//                             isUrl = true;
+//                     } else {
+//                             try {
+//                                     new URL(target);
+//                                     isUrl = true;
+//                             } catch (MalformedURLException e1) {
+//                                     isUrl = false;
+//                             }
+//                     }
+//             }
+
+               if (image != null) {
+                       ImageData image = loadImage();
+                       imageWidth = image.width;
+                       imageHeight = image.height;
+               }
+       }
+
+       @Override
+       public Control createUi(final Composite parent, Node context) {
+               Composite comp = new Composite(parent, SWT.BOTTOM);
+               comp.setLayout(CmsUtils.noSpaceGridLayout());
+
+               Label link = new Label(comp, SWT.NONE);
+               link.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
+               GridData layoutData = new GridData(SWT.CENTER, verticalAlignment, true,
+                               true);
+               if (image != null) {
+                       layoutData.heightHint = imageHeight;
+                       if (label == null)
+                               layoutData.widthHint = imageWidth;
+               }
+
+               link.setLayoutData(layoutData);
+               if (custom != null) {
+                       comp.setData(RWT.CUSTOM_VARIANT, custom);
+                       link.setData(RWT.CUSTOM_VARIANT, custom);
+               } else {
+                       comp.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK);
+                       link.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK);
+               }
+
+               // label
+               StringBuilder labelText = new StringBuilder();
+               if (target != null) {
+                       labelText
+                                       .append("<a style='color:inherit;text-decoration:inherit;' href=\"");
+//                     if (!isUrl)
+//                             labelText.append('#');
+                       labelText.append(target);
+                       labelText.append("\">");
+               }
+               if (image != null) {
+                       registerImageIfNeeded();
+                       String imageLocation = RWT.getResourceManager().getLocation(image);
+                       labelText.append("<img width='").append(imageWidth)
+                                       .append("' height='").append(imageHeight)
+                                       .append("' src=\"").append(imageLocation).append("\"/>");
+
+                       // final Image img = loadImage(parent.getDisplay());
+                       // link.setImage(img);
+                       // link.addDisposeListener(new DListener(img));
+               }
+
+               if (label != null) {
+                       // link.setText(label);
+                       labelText.append(' ').append(label);
+               }
+
+               if (target != null)
+                       labelText.append("</a>");
+
+               link.setText(labelText.toString());
+
+               // link.setCursor(link.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
+               // CmsSession cmsSession = (CmsSession) parent.getDisplay().getData(
+               // CmsSession.KEY);
+               if (mouseListener != null)
+                       link.addMouseListener(mouseListener);
+
+               return comp;
+       }
+
+       private void registerImageIfNeeded() {
+               ResourceManager resourceManager = RWT.getResourceManager();
+               if (!resourceManager.isRegistered(image)) {
+                       URL res = getImageUrl();
+                       InputStream inputStream = null;
+                       try {
+                               IOUtils.closeQuietly(inputStream);
+                               inputStream = res.openStream();
+                               resourceManager.register(image, inputStream);
+                               if (log.isTraceEnabled())
+                                       log.trace("Registered image " + image);
+                       } catch (Exception e) {
+                               throw new CmsException("Cannot load image " + image, e);
+                       } finally {
+                               IOUtils.closeQuietly(inputStream);
+                       }
+               }
+       }
+
+       private ImageData loadImage() {
+               URL url = getImageUrl();
+               ImageData result = null;
+               InputStream inputStream = null;
+               try {
+                       inputStream = url.openStream();
+                       result = new ImageData(inputStream);
+                       if (log.isTraceEnabled())
+                               log.trace("Loaded image " + image);
+               } catch (Exception e) {
+                       throw new CmsException("Cannot load image " + image, e);
+               } finally {
+                       IOUtils.closeQuietly(inputStream);
+               }
+               return result;
+       }
+
+       private URL getImageUrl() {
+               URL url;
+               try {
+                       // pure URL
+                       url = new URL(image);
+               } catch (MalformedURLException e1) {
+                       // in OSGi bundle
+                       if (bundleContext == null)
+                               throw new CmsException("No bundle context available");
+                       url = bundleContext.getBundle().getResource(image);
+               }
+
+               if (url == null)
+                       throw new CmsException("No image " + image + " available.");
+
+               return url;
+       }
+
+       public void setLabel(String label) {
+               this.label = label;
+       }
+
+       public void setCustom(String custom) {
+               this.custom = custom;
+       }
+
+       public void setTarget(String target) {
+               this.target = target;
+               // try {
+               // new URL(target);
+               // isUrl = true;
+               // } catch (MalformedURLException e1) {
+               // isUrl = false;
+               // }
+       }
+
+       public void setImage(String image) {
+               this.image = image;
+       }
+
+       @Override
+       public void setBundleContext(BundleContext bundleContext) {
+               this.bundleContext = bundleContext;
+       }
+
+       public void setMouseListener(MouseListener mouseListener) {
+               this.mouseListener = mouseListener;
+       }
+
+       public void setvAlign(String vAlign) {
+               if ("bottom".equals(vAlign)) {
+                       verticalAlignment = SWT.BOTTOM;
+               } else if ("top".equals(vAlign)) {
+                       verticalAlignment = SWT.TOP;
+               } else if ("center".equals(vAlign)) {
+                       verticalAlignment = SWT.CENTER;
+               } else {
+                       throw new CmsException("Unsupported vertical allignment " + vAlign
+                                       + " (must be: top, bottom or center)");
+               }
+       }
+
+       // private class MListener extends MouseAdapter {
+       // private static final long serialVersionUID = 3634864186295639792L;
+       //
+       // @Override
+       // public void mouseDown(MouseEvent e) {
+       // if (e.button == 1) {
+       // }
+       // }
+       // }
+       //
+       // private class DListener implements DisposeListener {
+       // private static final long serialVersionUID = -3808587499269394812L;
+       // private final Image img;
+       //
+       // public DListener(Image img) {
+       // super();
+       // this.img = img;
+       // }
+       //
+       // @Override
+       // public void widgetDisposed(DisposeEvent event) {
+       // img.dispose();
+       // }
+       //
+       // }
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/util/CmsUtils.java b/org.argeo.cms/src/org/argeo/cms/util/CmsUtils.java
new file mode 100644 (file)
index 0000000..c1b319f
--- /dev/null
@@ -0,0 +1,178 @@
+package org.argeo.cms.util;
+
+import java.io.InputStream;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.cms.CmsConstants;
+import org.argeo.cms.CmsException;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.service.ResourceManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Widget;
+
+/** Static utilities for the CMS framework. */
+public class CmsUtils implements CmsConstants {
+       /** @deprecated Use rowData16px() instead. GridData should not be reused. */
+       @Deprecated
+       public static RowData ROW_DATA_16px = new RowData(16, 16);
+
+       public static GridLayout noSpaceGridLayout() {
+               return noSpaceGridLayout(new GridLayout());
+       }
+
+       public static GridLayout noSpaceGridLayout(GridLayout layout) {
+               layout.horizontalSpacing = 0;
+               layout.verticalSpacing = 0;
+               layout.marginWidth = 0;
+               layout.marginHeight = 0;
+               return layout;
+       }
+
+       //
+       // GRID DATA
+       //
+       public static GridData fillWidth() {
+               return grabWidth(SWT.FILL, SWT.FILL);
+       }
+
+       public static GridData fillAll() {
+               return new GridData(SWT.FILL, SWT.FILL, true, true);
+       }
+
+       public static GridData grabWidth(int horizontalAlignment,
+                       int verticalAlignment) {
+               return new GridData(horizontalAlignment, horizontalAlignment, true,
+                               false);
+       }
+
+       public static RowData rowData16px() {
+               return new RowData(16, 16);
+       }
+
+       public static void style(Widget widget, String style) {
+               widget.setData(CmsConstants.STYLE, style);
+       }
+
+       public static void markup(Widget widget) {
+               widget.setData(CmsConstants.MARKUP, true);
+       }
+
+       /** @return the path or null if not instrumented */
+       public static String getDataPath(Widget widget) {
+               // JCR item
+               Object data = widget.getData();
+               if (data != null && data instanceof Item) {
+                       try {
+                               return ((Item) data).getPath();
+                       } catch (RepositoryException e) {
+                               throw new CmsException("Cannot find data path of " + data
+                                               + " for " + widget);
+                       }
+               }
+
+               // JCR path
+               data = widget.getData(Property.JCR_PATH);
+               if (data != null)
+                       return data.toString();
+
+               return null;
+       }
+
+       /** Dispose all children of a Composite */
+       public static void clear(Composite composite) {
+               for (Control child : composite.getChildren())
+                       child.dispose();
+       }
+
+       //
+       // JCR
+       //
+       public static Node getOrAddEmptyFile(Node parent, Enum<?> child)
+                       throws RepositoryException {
+               if (has(parent, child))
+                       return child(parent, child);
+               return JcrUtils.copyBytesAsFile(parent, child.name(), new byte[0]);
+       }
+
+       public static Node child(Node parent, Enum<?> en)
+                       throws RepositoryException {
+               return parent.getNode(en.name());
+       }
+
+       public static Boolean has(Node parent, Enum<?> en)
+                       throws RepositoryException {
+               return parent.hasNode(en.name());
+       }
+
+       public static Node getOrAdd(Node parent, Enum<?> en)
+                       throws RepositoryException {
+               return getOrAdd(parent, en, null);
+       }
+
+       public static Node getOrAdd(Node parent, Enum<?> en, String primaryType)
+                       throws RepositoryException {
+               if (has(parent, en))
+                       return child(parent, en);
+               else if (primaryType == null)
+                       return parent.addNode(en.name());
+               else
+                       return parent.addNode(en.name(), primaryType);
+       }
+
+       // IMAGES
+       public static String img(String src, String width, String height) {
+               return imgBuilder(src, width, height).append("/>").toString();
+       }
+
+       public static String img(String src, Point size) {
+               return img(src, Integer.toString(size.x), Integer.toString(size.y));
+       }
+
+       public static StringBuilder imgBuilder(String src, String width,
+                       String height) {
+               return new StringBuilder(64).append("<img width='").append(width)
+                               .append("' height='").append(height).append("' src='")
+                               .append(src).append("'");
+       }
+
+       public static String noImg(Point size) {
+               ResourceManager rm = RWT.getResourceManager();
+               return CmsUtils.img(rm.getLocation(NO_IMAGE), size);
+       }
+
+       public static String noImg() {
+               return noImg(NO_IMAGE_SIZE);
+       }
+
+       public static Image noImage(Point size) {
+               ResourceManager rm = RWT.getResourceManager();
+               InputStream in = null;
+               try {
+                       in = rm.getRegisteredContent(NO_IMAGE);
+                       ImageData id = new ImageData(in);
+                       ImageData scaled = id.scaledTo(size.x, size.y);
+                       Image image = new Image(Display.getCurrent(), scaled);
+                       return image;
+               } finally {
+                       IOUtils.closeQuietly(in);
+               }
+       }
+
+       private CmsUtils() {
+       }
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/util/MenuLink.java b/org.argeo.cms/src/org/argeo/cms/util/MenuLink.java
new file mode 100644 (file)
index 0000000..d491d3c
--- /dev/null
@@ -0,0 +1,13 @@
+package org.argeo.cms.util;
+
+import org.argeo.cms.CmsStyles;
+
+/**
+ * Convenience class setting the custom style {@link CmsStyles#CMS_MENU_LINK} on
+ * a {@link CmsLink} when simple menus are used.
+ */
+public class MenuLink extends CmsLink {
+       public MenuLink() {
+               setCustom(CmsStyles.CMS_MENU_LINK);
+       }
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/util/OpenUserMenu.java b/org.argeo.cms/src/org/argeo/cms/util/OpenUserMenu.java
new file mode 100644 (file)
index 0000000..4d4fe75
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.cms.util;
+
+import org.argeo.cms.CmsLogin;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.widgets.Control;
+
+/** Open the user menu when clicked */
+public class OpenUserMenu extends MouseAdapter {
+       private static final long serialVersionUID = 3634864186295639792L;
+       private CmsLogin cmsLogin;
+
+       @Override
+       public void mouseDown(MouseEvent e) {
+               if (e.button == 1) {
+                       new UserMenu(cmsLogin, (Control) e.getSource());
+               }
+       }
+
+       public void setCmsLogin(CmsLogin cmsLogin) {
+               this.cmsLogin = cmsLogin;
+       }
+
+}
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/util/SimpleCmsHeader.java b/org.argeo.cms/src/org/argeo/cms/util/SimpleCmsHeader.java
new file mode 100644 (file)
index 0000000..aa1bb73
--- /dev/null
@@ -0,0 +1,88 @@
+package org.argeo.cms.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsStyles;
+import org.argeo.cms.CmsUiProvider;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** A header in three parts */
+public class SimpleCmsHeader implements CmsUiProvider {
+       private List<CmsUiProvider> lead = new ArrayList<CmsUiProvider>();
+       private List<CmsUiProvider> center = new ArrayList<CmsUiProvider>();
+       private List<CmsUiProvider> end = new ArrayList<CmsUiProvider>();
+
+       private Boolean subPartsSameWidth = false;
+
+       @Override
+       public Control createUi(Composite parent, Node context)
+                       throws RepositoryException {
+               Composite header = new Composite(parent, SWT.NONE);
+               header.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_HEADER);
+               header.setBackgroundMode(SWT.INHERIT_DEFAULT);
+               header.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(3, false)));
+
+               configurePart(context, header, lead);
+               configurePart(context, header, center);
+               configurePart(context, header, end);
+               return header;
+       }
+
+       protected void configurePart(Node context, Composite parent,
+                       List<CmsUiProvider> partProviders) throws RepositoryException {
+               final int style;
+               final String custom;
+               if (lead == partProviders) {
+                       style = SWT.LEAD;
+                       custom = CmsStyles.CMS_HEADER_LEAD;
+               } else if (center == partProviders) {
+                       style = SWT.CENTER;
+                       custom = CmsStyles.CMS_HEADER_CENTER;
+               } else if (end == partProviders) {
+                       style = SWT.END;
+                       custom = CmsStyles.CMS_HEADER_END;
+               } else {
+                       throw new CmsException("Unsupported part providers "
+                                       + partProviders);
+               }
+
+               Composite part = new Composite(parent, SWT.NONE);
+               part.setData(RWT.CUSTOM_VARIANT, custom);
+               GridData gridData = new GridData(style, SWT.FILL, true, true);
+               part.setLayoutData(gridData);
+               part.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(partProviders
+                               .size(), subPartsSameWidth)));
+               for (CmsUiProvider uiProvider : partProviders) {
+                       Control subPart = uiProvider.createUi(part, context);
+                       subPart.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+                                       true));
+               }
+       }
+
+       public void setLead(List<CmsUiProvider> lead) {
+               this.lead = lead;
+       }
+
+       public void setCenter(List<CmsUiProvider> center) {
+               this.center = center;
+       }
+
+       public void setEnd(List<CmsUiProvider> end) {
+               this.end = end;
+       }
+
+       public void setSubPartsSameWidth(Boolean subPartsSameWidth) {
+               this.subPartsSameWidth = subPartsSameWidth;
+       }
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/util/SimpleDynamicPages.java b/org.argeo.cms/src/org/argeo/cms/util/SimpleDynamicPages.java
new file mode 100644 (file)
index 0000000..b6155cf
--- /dev/null
@@ -0,0 +1,118 @@
+package org.argeo.cms.util;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsUiProvider;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+public class SimpleDynamicPages implements CmsUiProvider {
+
+       @Override
+       public Control createUi(Composite parent, Node context)
+                       throws RepositoryException {
+               if (context == null)
+                       throw new CmsException("Context cannot be null");
+               parent.setLayout(new GridLayout(2, false));
+
+               // parent
+               if (!context.getPath().equals("/")) {
+                       new CmsLink("..", context.getParent().getPath()).createUi(parent,
+                                       context);
+                       new Label(parent, SWT.NONE).setText(context.getParent()
+                                       .getPrimaryNodeType().getName());
+               }
+
+               // context
+               Label contextL = new Label(parent, SWT.NONE);
+               contextL.setData(RWT.MARKUP_ENABLED, true);
+               contextL.setText("<b>" + context.getName() + "</b>");
+               new Label(parent, SWT.NONE).setText(context.getPrimaryNodeType()
+                               .getName());
+
+               // children
+               // Label childrenL = new Label(parent, SWT.NONE);
+               // childrenL.setData(RWT.MARKUP_ENABLED, true);
+               // childrenL.setText("<i>Children:</i>");
+               // childrenL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false,
+               // false, 2, 1));
+
+               for (NodeIterator nIt = context.getNodes(); nIt.hasNext();) {
+                       Node child = nIt.nextNode();
+                       new CmsLink(child.getName(), child.getPath()).createUi(parent,
+                                       context);
+
+                       new Label(parent, SWT.NONE).setText(child.getPrimaryNodeType()
+                                       .getName());
+               }
+
+               // properties
+               // Label propsL = new Label(parent, SWT.NONE);
+               // propsL.setData(RWT.MARKUP_ENABLED, true);
+               // propsL.setText("<i>Properties:</i>");
+               // propsL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false,
+               // 2, 1));
+               for (PropertyIterator pIt = context.getProperties(); pIt.hasNext();) {
+                       Property property = pIt.nextProperty();
+
+                       Label label = new Label(parent, SWT.NONE);
+                       label.setText(property.getName());
+                       label.setToolTipText(JcrUtils
+                                       .getPropertyDefinitionAsString(property));
+
+                       new Label(parent, SWT.NONE).setText(getPropAsString(property));
+               }
+
+               return null;
+       }
+
+       private String getPropAsString(Property property)
+                       throws RepositoryException {
+               String result = "";
+               DateFormat timeFormatter = new SimpleDateFormat("");
+               if (property.isMultiple()) {
+                       result = getMultiAsString(property, ", ");
+               } else {
+                       Value value = property.getValue();
+                       if (value.getType() == PropertyType.BINARY)
+                               result = "<binary>";
+                       else if (value.getType() == PropertyType.DATE)
+                               result = timeFormatter.format(value.getDate().getTime());
+                       else
+                               result = value.getString();
+               }
+               return result;
+       }
+
+       private String getMultiAsString(Property property, String separator)
+                       throws RepositoryException {
+               if (separator == null)
+                       separator = "; ";
+               Value[] values = property.getValues();
+               StringBuilder builder = new StringBuilder();
+               for (Value val : values) {
+                       String currStr = val.getString();
+                       if (!"".equals(currStr.trim()))
+                               builder.append(currStr).append(separator);
+               }
+               if (builder.lastIndexOf(separator) >= 0)
+                       return builder.substring(0, builder.length() - separator.length());
+               else
+                       return builder.toString();
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/util/SimpleStaticPage.java b/org.argeo.cms/src/org/argeo/cms/util/SimpleStaticPage.java
new file mode 100644 (file)
index 0000000..6e09000
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.cms.util;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.CmsStyles;
+import org.argeo.cms.CmsUiProvider;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+public class SimpleStaticPage implements CmsUiProvider {
+       private String text;
+
+       @Override
+       public Control createUi(Composite parent, Node context)
+                       throws RepositoryException {
+               Label textC = new Label(parent,  SWT.WRAP);
+               textC.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_STATIC_TEXT);
+               textC.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
+               textC.setText(text);
+               
+               return textC;
+       }
+
+       public void setText(String text) {
+               this.text = text;
+       }
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/util/UserMenu.java b/org.argeo.cms/src/org/argeo/cms/util/UserMenu.java
new file mode 100644 (file)
index 0000000..9831156
--- /dev/null
@@ -0,0 +1,143 @@
+package org.argeo.cms.util;
+
+import static org.argeo.cms.internal.kernel.KernelConstants.SPRING_SECURITY_CONTEXT_KEY;
+
+import javax.servlet.http.HttpSession;
+
+import org.argeo.cms.CmsLogin;
+import org.argeo.cms.CmsMsg;
+import org.argeo.cms.CmsSession;
+import org.argeo.cms.CmsStyles;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+/** The site-related user menu */
+public class UserMenu extends Shell implements CmsStyles {
+       private static final long serialVersionUID = -5788157651532106301L;
+
+       private CmsLogin cmsLogin;
+       private String username = null;
+
+       public UserMenu(CmsLogin cmsLogin, Control source) {
+               super(source.getDisplay(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+               this.cmsLogin = cmsLogin;
+
+               setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU);
+
+               username = SecurityContextHolder.getContext().getAuthentication()
+                               .getName();
+               if (username.equals("anonymous")) {
+                       username = null;
+                       anonymousUi();
+               } else {
+                       userUi();
+               }
+
+               pack();
+               layout();
+               setLocation(source.toDisplay(source.getSize().x - getSize().x,
+                               source.getSize().y));
+
+               addShellListener(new ShellAdapter() {
+                       private static final long serialVersionUID = 5178980294808435833L;
+
+                       @Override
+                       public void shellDeactivated(ShellEvent e) {
+                               close();
+                               dispose();
+                       }
+
+               });
+
+               open();
+
+       }
+
+       protected void userUi() {
+               setLayout(new GridLayout());
+
+               Label l = new Label(this, SWT.NONE);
+               l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM);
+               l.setData(RWT.MARKUP_ENABLED, true);
+               l.setLayoutData(CmsUtils.fillWidth());
+               l.setText("<b>" + username + "</b>");
+
+               final CmsSession cmsSession = (CmsSession) getDisplay().getData(
+                               CmsSession.KEY);
+               l = new Label(this, SWT.NONE);
+               l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM);
+               l.setText(CmsMsg.logout.lead());
+               GridData lData = CmsUtils.fillWidth();
+               lData.widthHint = 120;
+               l.setLayoutData(lData);
+
+               l.addMouseListener(new MouseAdapter() {
+                       private static final long serialVersionUID = 6444395812777413116L;
+
+                       public void mouseDown(MouseEvent e) {
+                               SecurityContextHolder.getContext().setAuthentication(null);
+                               HttpSession httpSession = RWT.getRequest().getSession();
+                               httpSession.removeAttribute(SPRING_SECURITY_CONTEXT_KEY);
+                               close();
+                               dispose();
+                               cmsSession.authChange();
+                       }
+               });
+       }
+
+       protected void anonymousUi() {
+               Integer textWidth = 150;
+               setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU);
+               setLayout(new GridLayout(2, false));
+
+               new Label(this, SWT.NONE).setText(CmsMsg.username.lead());
+               final Text username = new Text(this, SWT.BORDER);
+               username.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_USERNAME);
+               GridData gd = CmsUtils.fillWidth();
+               gd.widthHint = textWidth;
+               username.setLayoutData(gd);
+
+               new Label(this, SWT.NONE).setText(CmsMsg.password.lead());
+               final Text password = new Text(this, SWT.BORDER | SWT.PASSWORD);
+               password.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_PASSWORD);
+               gd = CmsUtils.fillWidth();
+               gd.widthHint = textWidth;
+               password.setLayoutData(gd);
+
+               // Listeners
+               TraverseListener tl = new TraverseListener() {
+                       private static final long serialVersionUID = -1158892811534971856L;
+
+                       public void keyTraversed(TraverseEvent e) {
+                               if (e.detail == SWT.TRAVERSE_RETURN)
+                                       login(username.getText(), password.getTextChars());
+                       }
+               };
+               username.addTraverseListener(tl);
+               password.addTraverseListener(tl);
+       }
+
+       protected void login(String username, char[] password) {
+               CmsSession cmsSession = (CmsSession) getDisplay().getData(
+                               CmsSession.KEY);
+               cmsLogin.logInWithPassword(username, password);
+               close();
+               dispose();
+               // refreshUi(source.getParent());
+               cmsSession.authChange();
+       }
+
+}
index c09b179872b98e8bb1119f5d190e5a7d52f350dc..af7fd877f35c63b0f62d1470bddc16940deb72ee 100644 (file)
@@ -9,7 +9,7 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsException;
 import org.argeo.cms.CmsNames;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.widgets.JcrComposite;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
index 00a7c2669d042f3599dd44be7f761bae621075cc..2e70eb89f0fda8f15216ee64d939f70eb08333ba 100644 (file)
@@ -5,7 +5,7 @@ import javax.jcr.RepositoryException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
index a117711fcba89ab00a5dc0d2a96385905de769e1..e7c56ea72831759fc775db62e0e47da506194297 100644 (file)
@@ -3,7 +3,7 @@ package org.argeo.cms.widgets;
 import javax.jcr.Item;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
index 7704d4092e2f650f2cf3232e5ca046c9ce8c88a4..358b453155184ff26b71f502f225667062a88d66 100644 (file)
@@ -7,7 +7,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 
index 0e0fd24ae533ab2b69e71638890cb540f5061d84..a2c6935d279000ce433813552b420b8e499dc87c 100644 (file)
@@ -5,7 +5,7 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsConstants;
 import org.argeo.cms.CmsNames;
-import org.argeo.cms.CmsUtils;
+import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.widgets.Composite;