protected final TermsManager termsManager;
protected final Typology typology;
- protected final boolean editable;
+ private final boolean editable;
private CmsIcon deleteIcon;
private CmsIcon addIcon;
private Composite highlight;
protected final CmsTheme theme;
-
+
public AbstractTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
super(parent, style, item);
if (item == null)
highlightColor = parent.getDisplay().getSystemColor(SWT.COLOR_GRAY);
}
+ public boolean isEditable() {
+ return editable;
+ }
+
protected void createHighlight(Composite block) {
highlight = new Composite(block, SWT.NONE);
highlight.setBackground(highlightColor);
String display = getTermLabel(value);
lbl.setText(display);
CmsUiUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
- if (editable)
+ processTermListLabel(value, lbl);
+ if (isEditable())
lbl.addMouseListener((MouseDoubleClick) (e) -> {
startEditing();
});
}
}
else {// empty
- if (editable && !isEditing()) {
+ if (isEditable() && !isEditing()) {
ToolBar toolBar = new ToolBar(placeholder, SWT.HORIZONTAL);
ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
styleAdd(addItem);
String display = getTermLabel(currentValue);
lbl.setText(display);
CmsUiUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
-
- lbl.addMouseListener((MouseDoubleClick) (e) -> {
- startEditing();
- });
+ processTermListLabel(currentValue, lbl);
+ if (isEditable()) {
+ lbl.addMouseListener((MouseDoubleClick) (e) -> {
+ startEditing();
+ });
+ }
} else {
- ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
- ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
- styleAdd(addItem);
- addItem.addSelectionListener((Selected) (e) -> {
- startEditing();
- });
+ if (isEditable()) {
+ ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+ ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+ styleAdd(addItem);
+ addItem.addSelectionListener((Selected) (e) -> {
+ startEditing();
+ });
+ }
}
return block;
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Footer">
+ <implementation class="org.argeo.suite.ui.DefaultFooter"/>
+ <service>
+ <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+ </service>
+ <properties entry="config/footer.properties"/>
+</scr:component>
<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" immediate="false" name="Default Work Header">
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Header">
<implementation class="org.argeo.suite.ui.DefaultHeader"/>
<service>
<provide interface="org.argeo.cms.ui.CmsUiProvider"/>
- <provide interface="org.osgi.service.cm.ManagedService"/>
</service>
<properties entry="config/header.properties"/>
</scr:component>
Service-Component:\
OSGI-INF/cmsApp.xml,\
OSGI-INF/header.xml,\
+OSGI-INF/footer.xml,\
OSGI-INF/leadPane.xml,\
OSGI-INF/loginScreen.xml,\
OSGI-INF/recentItems.xml,\
--- /dev/null
+service.pid=argeo.suite.ui.footer
}
public void destroy(BundleContext bundleContext, Map<String, String> properties) {
-
+
}
-
+
public void setEntryArea(CmsUiProvider entryArea) {
this.entryArea = entryArea;
}
}
if (startMaximized)
setMaximizedControl(editorArea);
- editorArea.setLayout(new GridLayout());
+ GridLayout editorAreaLayout = new GridLayout();
+ editorAreaLayout.verticalSpacing = 0;
+ editorAreaLayout.marginBottom = 0;
+ editorAreaLayout.marginHeight = 0;
+ editorArea.setLayout(editorAreaLayout);
if (DefaultEditionLayer.this.workArea == null) {
tabbedArea = createTabbedArea(editorArea, theme);
--- /dev/null
+package org.argeo.suite.ui;
+
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.osgi.framework.BundleContext;
+
+/** Footer of a standard Argeo Suite application. */
+public class DefaultFooter implements CmsUiProvider {
+ @Override
+ public Control createUi(Composite parent, Node context) throws RepositoryException {
+ parent.setLayout(CmsUiUtils.noSpaceGridLayout());
+ Composite content = new Composite(parent, SWT.NONE);
+ Control contentControl = createContent(content, context);
+
+ // TODO support and guarantee
+
+ return contentControl;
+ }
+
+ protected Control createContent(Composite parent, Node context) throws RepositoryException {
+ return parent;
+ }
+
+ public void init(BundleContext bundleContext, Map<String, String> properties) {
+ }
+
+ public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+ }
+}
package org.argeo.suite.ui;
-import java.util.Dictionary;
import java.util.Map;
-import java.util.TreeMap;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import org.argeo.cms.ui.CmsUiProvider;
import org.argeo.cms.ui.CmsView;
import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.util.LangUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Label;
import org.osgi.framework.BundleContext;
import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedService;
-/** HEader of a standard Argeo Suite application. */
-public class DefaultHeader implements CmsUiProvider, ManagedService {
+/** Header of a standard Argeo Suite application. */
+public class DefaultHeader implements CmsUiProvider {
public final static String TITLE_PROPERTY = "argeo.suite.ui.header.title";
- private Map<String, String> properties;
-
private Localized title = null;
@Override
}
public void init(BundleContext bundleContext, Map<String, String> properties) {
- this.properties = new TreeMap<>(properties);
String titleStr = (String) properties.get(TITLE_PROPERTY);
if (titleStr != null) {
if (titleStr.startsWith("%")) {
}
- @Override
- public void updated(Dictionary<String, ?> properties) throws ConfigurationException {
- if (properties != null)
- this.properties.putAll(LangUtils.dictToStringMap(properties));
- }
-
public Localized getTitle() {
return title;
}
private String pidPrefix;
private String headerPid;
+ private String footerPid;
private String leadPanePid;
private String loginScreenPid;
throw new IllegalArgumentException("PID prefix must be set.");
headerPid = pidPrefix + "header";
+ footerPid = pidPrefix + "footer";
leadPanePid = pidPrefix + "leadPane";
loginScreenPid = pidPrefix + "loginScreen";
}
SuiteUi ui = (SuiteUi) parent;
CmsView cmsView = CmsView.getCmsView(parent);
CmsUiProvider headerUiProvider = findUiProvider(headerPid);
+ CmsUiProvider footerUiProvider = findUiProvider(footerPid);
Localized appTitle = null;
if (headerUiProvider instanceof DefaultHeader) {
appTitle = ((DefaultHeader) headerUiProvider).getTitle();
if (cmsView.isAnonymous() && publicBasePath == null) {// internal app, must login
ui.logout();
- refreshPart(headerUiProvider, ui.getHeader(), context);
+ if (headerUiProvider != null)
+ refreshPart(headerUiProvider, ui.getHeader(), context);
ui.refreshBelowHeader(false);
refreshPart(findUiProvider(loginScreenPid), ui.getBelowHeader(), context);
+ if (footerUiProvider != null)
+ refreshPart(footerUiProvider, ui.getFooter(), context);
ui.layout(true, true);
setState(ui, LOGIN);
} else {
state = null;
CmsSession cmsSession = cmsView.getCmsSession();
if (ui.getUserDir() == null) {
- if (cmsView.isAnonymous()) {
+ // FIXME NPE on CMSSession when logging in from anonymous
+ if (cmsSession==null || cmsView.isAnonymous()) {
assert publicBasePath != null;
ui.initSessions(getRepository(), publicBasePath);
} else {
if (context == null)
context = ui.getUserDir();
- refreshPart(headerUiProvider, ui.getHeader(), context);
+ if (headerUiProvider != null)
+ refreshPart(headerUiProvider, ui.getHeader(), context);
ui.refreshBelowHeader(true);
for (String key : layersByPid.keySet()) {
SuiteLayer layer = layersByPid.get(key).get();
ui.addLayer(key, layer);
}
refreshPart(findUiProvider(leadPanePid), ui.getLeadPane(), context);
+ if (footerUiProvider != null)
+ refreshPart(footerUiProvider, ui.getFooter(), context);
ui.layout(true, true);
setState(parent, state != null ? state : defaultLayerPid);
}
private CmsUiProvider findUiProvider(String pid) {
if (!uiProvidersByPid.containsKey(pid))
- throw new IllegalArgumentException("No UI provider registered as " + pid);
+ return null;
return uiProvidersByPid.get(pid).get();
}
private SuiteLayer findLayer(String pid) {
if (!layersByPid.containsKey(pid))
- throw new IllegalArgumentException("No UI provider registered as " + pid);
+ return null;
return layersByPid.get(pid).get();
}
/** Styles used by Argeo Suite work UI. */
public enum SuiteStyle implements CmsStyle {
- // Header
+ // header
header, headerTitle, headerMenu, headerMenuItem,
- // Recent items
+ // footer
+ footer,
+ // recent items
recentItems,
- // Lead pane
+ // lead pane
leadPane, leadPaneItem, leadPaneSectionTitle, leadPaneSubSectionTitle,
- // Group composite
+ // group composite
titleContainer, titleLabel, subTitleLabel, formLine, formColumn, navigationBar, navigationTitle, navigationButton,
- // Forms elements
+ // forms elements
simpleLabel, simpleText, simpleInput,
// table
titleCell,
workArea,
// tabbed area
mainTabBody, mainTabSelected, mainTab,
- // Buttons
+ // buttons
inlineButton;
@Override
private Localized title;
private Composite header;
+ private Composite footer;
private Composite belowHeader;
private Composite leadPane;
private Composite dynamicArea;
belowHeader = new Composite(this, SWT.NONE);
belowHeader.setLayoutData(CmsUiUtils.fillAll());
+
+ footer = new Composite(this, SWT.NONE);
+ footer.setLayout(CmsUiUtils.noSpaceGridLayout());
+ CmsUiUtils.style(footer, SuiteStyle.footer);
+ footer.setLayoutData(CmsUiUtils.fillWidth());
}
public void refreshBelowHeader(boolean initApp) {
return header;
}
+ Composite getFooter() {
+ return footer;
+ }
+
Composite getLeadPane() {
return leadPane;
}
title.setLayoutData(CmsUiUtils.fillWidth());
title.addSelectionListener((Selected) (e) -> showTab(tabIndex(section.getNode())));
Node node = section.getNode();
- title.setText(Jcr.getTitle(node));
+ String titleStr = Jcr.getTitle(node);
+ // TODO internationalize
+ title.setText(titleStr);
if (!singleTab) {
ToolBar toolBar = new ToolBar(sectionHeader, SWT.NONE);
ToolItem closeItem = new ToolItem(toolBar, SWT.FLAT);
private boolean showMainTitle = true;
private Integer maxMediaWidth = null;
+ private String defaultSectionStyle;
protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) {
super(parent, style, cmsEditable);
CmsUiUtils.clear(section);
Node node = section.getNode();
TextSection textSection = (TextSection) section;
+ String style = node.hasProperty(DbkAttr.role.name()) ? node.getProperty(DbkAttr.role.name()).getString()
+ : getDefaultSectionStyle();
+ if (style != null)
+ CmsUiUtils.style(textSection, style);
+
if (node.hasNode(DbkType.title.get())) {
boolean showTitle = getMainSection() == section ? showMainTitle : true;
if (showTitle) {
for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) {
Node child = ni.nextNode();
if (isDbk(child, DbkType.section)) {
- TextSection newSection = new TextSection(section, SWT.NONE, child);
+ TextSection newSection = newTextSection(section, child);
newSection.setLayoutData(CmsUiUtils.fillWidth());
refresh(newSection);
}
// section.layout(true, true);
}
+ /** To be overridden in order to provide additional SectionPart types */
+ protected TextSection newTextSection(Section section, Node node) {
+ return new TextSection(section, SWT.NONE, node);
+ }
+
/** To be overridden in order to provide additional SectionPart types */
protected SectionPart newSectionPart(TextSection textSection, Node node) {
return null;
this.showMainTitle = showMainTitle;
}
+ public String getDefaultSectionStyle() {
+ return defaultSectionStyle;
+ }
+
+ public void setDefaultSectionStyle(String defaultSectionStyle) {
+ this.defaultSectionStyle = defaultSectionStyle;
+ }
+
// FILE UPLOAD LISTENER
private class FUL implements FileUploadListener {
public void uploadProgress(FileUploadEvent event) {
cn: admin
member: uid=root,ou=People,dc=example,dc=com
-dn: cn=org.argeo.activities.editor,ou=roles,ou=node
+dn: cn=org.argeo.suite.coworker,ou=roles,ou=node
objectClass: groupOfNames
objectClass: top
-cn: org.argeo.activities.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.activities.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.activities.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=org.argeo.connect.resources.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.connect.resources.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.connect.resources.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.connect.resources.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=org.argeo.office.coworker,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.office.coworker
-member: cn=org.argeo.office.manager,ou=roles,ou=node
+cn: org.argeo.suite.coworker
+member: cn=org.argeo.suite.manager,ou=roles,ou=node
member: uid=coworker,ou=People,dc=example,dc=com
-dn: cn=org.argeo.office.manager,ou=roles,ou=node
+dn: cn=org.argeo.suite.manager,ou=roles,ou=node
objectClass: groupOfNames
objectClass: top
-cn: org.argeo.office.manager
+cn: org.argeo.suite.manager
member: uid=manager,ou=People,dc=example,dc=com
member: uid=root,ou=People,dc=example,dc=com
-dn: cn=org.argeo.people.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.people.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.people.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.people.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=org.argeo.tracker.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.tracker.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.tracker.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.tracker.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
dn: cn=userAdmin,ou=roles,ou=node
objectClass: groupOfNames
objectClass: top