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;
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) {
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;
+++ /dev/null
-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;
- }
-
- }
-}
+++ /dev/null
-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;
- }
-
-}
+++ /dev/null
-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();
- // }
- //
- // }
-}
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
}
}
- protected void logInWithPassword(String username, char[] password) {
+ public void logInWithPassword(String username, char[] password) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
username, password);
Authentication authentication = authenticationManager
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");
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";
+++ /dev/null
-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() {
- }
-}
+++ /dev/null
-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();
- }
-
-}
+++ /dev/null
-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;
- }
-}
+++ /dev/null
-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);
- }
-}
+++ /dev/null
-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);
- }
- }
- }
- }
-}
+++ /dev/null
-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
+++ /dev/null
-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;
- }
-
-}
+++ /dev/null
-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
+++ /dev/null
-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;
- }
-
-}
+++ /dev/null
-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);
-}
+++ /dev/null
-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();
- }
-
-}
+++ /dev/null
-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();
- }
-
-}
--- /dev/null
+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();
+ }
+
+}
--- /dev/null
+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);
+ }
+ }
+ }
+ }
+}
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;
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;
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;
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;
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;
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;
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;
--- /dev/null
+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;
+ }
+}
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;
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;
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;
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;
--- /dev/null
+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);
+}
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;
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;
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;
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;
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;
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;
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;
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;
--- /dev/null
+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();
+ // }
+ //
+ // }
+}
--- /dev/null
+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() {
+ }
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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();
+ }
+
+}
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;
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;
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;
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;
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;