From: Mathieu Baudier Date: Thu, 11 Feb 2021 13:05:44 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/master' into v2.x X-Git-Tag: argeo-suite-2.1.20~1 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=bf08be4b1dd28f8d7639db1badf0bbd449b5e388;hp=883a4286c7946b2cff653fe9a2b554f54232e01c Merge remote-tracking branch 'origin/master' into v2.x Conflicts: lib/pom.xml pom.xml --- diff --git a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java index 408a0bf..1d9b6bc 100644 --- a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java +++ b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java @@ -5,6 +5,7 @@ import javax.jcr.Item; import org.argeo.cms.Localized; import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.util.CmsIcon; +import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.viewers.EditablePart; import org.argeo.cms.ui.widgets.ContextOverlay; import org.argeo.cms.ui.widgets.StyledControl; @@ -15,6 +16,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; 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; import org.eclipse.swt.widgets.ToolItem; @@ -75,6 +77,14 @@ public abstract class AbstractTermsPart extends StyledControl implements Editabl } + protected void setControlLayoutData(Control control) { + control.setLayoutData(CmsUiUtils.fillAll()); + } + + protected void setContainerLayoutData(Composite composite) { + composite.setLayoutData(CmsUiUtils.fillAll()); + } + // // STYLING // diff --git a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java index 947fbf8..9c3618d 100644 --- a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java +++ b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java @@ -5,6 +5,8 @@ import java.util.List; import javax.jcr.Item; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.cms.ui.forms.FormStyle; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.viewers.EditablePart; @@ -18,7 +20,6 @@ import org.argeo.jcr.Jcr; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; @@ -31,6 +32,7 @@ import org.eclipse.swt.widgets.ToolItem; /** {@link EditablePart} for multiple terms. */ public class MultiTermsPart extends AbstractTermsPart { private static final long serialVersionUID = -4961135649177920808L; + private final static Log log = LogFactory.getLog(MultiTermsPart.class); public MultiTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) { super(parent, style, item, termsManager, typology); @@ -39,7 +41,9 @@ public class MultiTermsPart extends AbstractTermsPart { @Override protected Control createControl(Composite box, String style) { Composite placeholder = new Composite(box, SWT.NONE); - RowLayout rl = new RowLayout(SWT.HORIZONTAL); + + boolean vertical = SWT.VERTICAL == (getStyle() & SWT.VERTICAL); + RowLayout rl = new RowLayout(vertical ? SWT.VERTICAL : SWT.HORIZONTAL); rl.wrap = true; placeholder.setLayout(rl); List currentValue = getValue(); @@ -176,8 +180,12 @@ public class MultiTermsPart extends AbstractTermsPart { List curr = Jcr.getMultiple(getNode(), property); List res = new ArrayList<>(); if (curr != null) - for (String str : curr) { + terms: for (String str : curr) { Term term = termsManager.getTerm(str); + if (term == null) { + log.warn("Ignoring term " + str + " for " + getNode() + ", as it was not found."); + continue terms; + } res.add(term); } return res; diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java b/core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java index b6e997a..aaaaafa 100644 --- a/core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java +++ b/core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java @@ -42,8 +42,8 @@ public abstract class CustomMaintenanceService extends AbstractMaintenanceServic protected void loadTerms(Node termsBase, String name) throws IOException, RepositoryException { try { - if (termsBase.hasNode(name)) - return; +// if (termsBase.hasNode(name)) +// return; String termsLoadPath = getTypologiesLoadBase() + '/' + name + ".xml"; URL termsUrl = getClass().getClassLoader().getResource(termsLoadPath); diff --git a/core/org.argeo.suite.theme.default/build.properties b/core/org.argeo.suite.theme.default/build.properties index 9cb37cd..7f8c707 100644 --- a/core/org.argeo.suite.theme.default/build.properties +++ b/core/org.argeo.suite.theme.default/build.properties @@ -1,3 +1,2 @@ bin.includes = META-INF/,\ - icons/,\ OSGI-INF/ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/add.png b/core/org.argeo.suite.theme.default/icons/types/16/add.png deleted file mode 100644 index 5c06bf0..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/add.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/close.png b/core/org.argeo.suite.theme.default/icons/types/16/close.png deleted file mode 100644 index af85e1a..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/close.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/dashboard.png b/core/org.argeo.suite.theme.default/icons/types/16/dashboard.png deleted file mode 100644 index 1235592..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/dashboard.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/delete.png b/core/org.argeo.suite.theme.default/icons/types/16/delete.png deleted file mode 100644 index dd2f428..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/delete.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/document.png b/core/org.argeo.suite.theme.default/icons/types/16/document.png deleted file mode 100644 index b168263..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/document.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/documents.png b/core/org.argeo.suite.theme.default/icons/types/16/documents.png deleted file mode 100644 index 56deec5..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/documents.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/folder.png b/core/org.argeo.suite.theme.default/icons/types/16/folder.png deleted file mode 100644 index fefbb40..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/folder.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/inbox.png b/core/org.argeo.suite.theme.default/icons/types/16/inbox.png deleted file mode 100644 index d1aa6af..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/inbox.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/location.png b/core/org.argeo.suite.theme.default/icons/types/16/location.png deleted file mode 100644 index 17c7070..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/location.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/logout.png b/core/org.argeo.suite.theme.default/icons/types/16/logout.png deleted file mode 100644 index f685ea9..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/logout.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/map.png b/core/org.argeo.suite.theme.default/icons/types/16/map.png deleted file mode 100644 index 99690e6..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/map.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/organisation.png b/core/org.argeo.suite.theme.default/icons/types/16/organisation.png deleted file mode 100644 index 2e81a6c..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/organisation.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/people.png b/core/org.argeo.suite.theme.default/icons/types/16/people.png deleted file mode 100644 index 925d571..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/people.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/person.png b/core/org.argeo.suite.theme.default/icons/types/16/person.png deleted file mode 100644 index 8f518e1..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/person.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/refresh.png b/core/org.argeo.suite.theme.default/icons/types/16/refresh.png deleted file mode 100644 index 0d39107..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/refresh.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/save.png b/core/org.argeo.suite.theme.default/icons/types/16/save.png deleted file mode 100644 index 1c58ada..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/save.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/search.png b/core/org.argeo.suite.theme.default/icons/types/16/search.png deleted file mode 100644 index d32874b..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/search.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/settings.png b/core/org.argeo.suite.theme.default/icons/types/16/settings.png deleted file mode 100644 index ac2d8c9..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/settings.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/tag.png b/core/org.argeo.suite.theme.default/icons/types/16/tag.png deleted file mode 100644 index cefdbb9..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/tag.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/task.png b/core/org.argeo.suite.theme.default/icons/types/16/task.png deleted file mode 100644 index eeb7e01..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/task.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/16/user.png b/core/org.argeo.suite.theme.default/icons/types/16/user.png deleted file mode 100644 index 13a8f76..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/16/user.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/add.png b/core/org.argeo.suite.theme.default/icons/types/32/add.png deleted file mode 100644 index 15feb20..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/add.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/close.png b/core/org.argeo.suite.theme.default/icons/types/32/close.png deleted file mode 100644 index d0729a5..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/close.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/dashboard.png b/core/org.argeo.suite.theme.default/icons/types/32/dashboard.png deleted file mode 100644 index 4c24f43..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/dashboard.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/delete.png b/core/org.argeo.suite.theme.default/icons/types/32/delete.png deleted file mode 100644 index 2ee3d88..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/delete.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/document.png b/core/org.argeo.suite.theme.default/icons/types/32/document.png deleted file mode 100644 index a4653fa..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/document.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/documents.png b/core/org.argeo.suite.theme.default/icons/types/32/documents.png deleted file mode 100644 index 29db972..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/documents.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/folder.png b/core/org.argeo.suite.theme.default/icons/types/32/folder.png deleted file mode 100644 index b98fc84..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/folder.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/inbox.png b/core/org.argeo.suite.theme.default/icons/types/32/inbox.png deleted file mode 100644 index 7583c99..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/inbox.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/location.png b/core/org.argeo.suite.theme.default/icons/types/32/location.png deleted file mode 100644 index d9207f1..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/location.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/logout.png b/core/org.argeo.suite.theme.default/icons/types/32/logout.png deleted file mode 100644 index 2d8024f..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/logout.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/map.png b/core/org.argeo.suite.theme.default/icons/types/32/map.png deleted file mode 100644 index 9a82a96..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/map.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/organisation.png b/core/org.argeo.suite.theme.default/icons/types/32/organisation.png deleted file mode 100644 index 62890c2..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/organisation.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/people.png b/core/org.argeo.suite.theme.default/icons/types/32/people.png deleted file mode 100644 index 5f53288..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/people.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/person.png b/core/org.argeo.suite.theme.default/icons/types/32/person.png deleted file mode 100644 index a6c5f1d..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/person.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/save.png b/core/org.argeo.suite.theme.default/icons/types/32/save.png deleted file mode 100644 index d7597d1..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/save.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/search.png b/core/org.argeo.suite.theme.default/icons/types/32/search.png deleted file mode 100644 index 8d89a4a..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/search.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/settings.png b/core/org.argeo.suite.theme.default/icons/types/32/settings.png deleted file mode 100644 index 4e3fa20..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/settings.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/tag.png b/core/org.argeo.suite.theme.default/icons/types/32/tag.png deleted file mode 100644 index 907e216..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/tag.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/task.png b/core/org.argeo.suite.theme.default/icons/types/32/task.png deleted file mode 100644 index b6bd243..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/task.png and /dev/null differ diff --git a/core/org.argeo.suite.theme.default/icons/types/32/user.png b/core/org.argeo.suite.theme.default/icons/types/32/user.png deleted file mode 100644 index 50fd404..0000000 Binary files a/core/org.argeo.suite.theme.default/icons/types/32/user.png and /dev/null differ diff --git a/core/org.argeo.suite.ui/OSGI-INF/leadPane.xml b/core/org.argeo.suite.ui/OSGI-INF/leadPane.xml index 9d3f2dd..0775c57 100644 --- a/core/org.argeo.suite.ui/OSGI-INF/leadPane.xml +++ b/core/org.argeo.suite.ui/OSGI-INF/leadPane.xml @@ -1,5 +1,5 @@ - + diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java index 9c2ad47..d017ee7 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java @@ -27,6 +27,7 @@ public class DefaultEditionLayer implements SuiteLayer { private CmsUiProvider workArea; private List weights = new ArrayList<>(); private boolean startMaximized = false; + private boolean singleTab = false; private Localized title = null; @Override @@ -77,6 +78,8 @@ public class DefaultEditionLayer implements SuiteLayer { weights = LangUtils.toStringList(properties.get(Property.weights.name())); startMaximized = properties.containsKey(Property.startMaximized.name()) && "true".equals(properties.get(Property.startMaximized.name())); + singleTab = properties.containsKey(Property.singleTab.name()) + && "true".equals(properties.get(Property.singleTab.name())); String titleStr = (String) properties.get(SuiteLayer.Property.title.name()); if (titleStr != null) { @@ -101,7 +104,7 @@ public class DefaultEditionLayer implements SuiteLayer { } } - public void destroy() { + public void destroy(BundleContext bundleContext, Map properties) { } @@ -115,6 +118,7 @@ public class DefaultEditionLayer implements SuiteLayer { TabbedArea createTabbedArea(Composite parent, CmsTheme theme) { TabbedArea tabbedArea = new TabbedArea(parent, SWT.NONE); + tabbedArea.setSingleTab(singleTab); tabbedArea.setBodyStyle(SuiteStyle.mainTabBody.style()); tabbedArea.setTabStyle(SuiteStyle.mainTab.style()); tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.style()); diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java index 080bac2..84a5ebd 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java @@ -116,7 +116,7 @@ public class DefaultHeader implements CmsUiProvider, ManagedService { } } - public void destroy() { + public void destroy(BundleContext bundleContext, Map properties) { } diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java index 10d386c..b2ebcb2 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java @@ -1,5 +1,6 @@ package org.argeo.suite.ui; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -13,13 +14,10 @@ import javax.jcr.RepositoryException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.cms.LocaleUtils; import org.argeo.cms.Localized; import org.argeo.cms.auth.CurrentUser; -import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ui.CmsView; -import org.argeo.cms.ui.util.CmsIcon; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.suite.RankedObject; import org.argeo.suite.SuiteUtils; @@ -29,8 +27,9 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; +import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; +import org.osgi.framework.wiring.BundleWiring; /** Side pane listing various perspectives. */ public class DefaultLeadPane implements CmsUiProvider { @@ -42,7 +41,9 @@ public class DefaultLeadPane implements CmsUiProvider { private Map> layers = Collections.synchronizedSortedMap(new TreeMap<>()); private List defaultLayers; - private List adminLayers; + private List adminLayers = new ArrayList<>(); + + private ClassLoader l10nClassLoader; @Override public Control createUi(Composite parent, Node node) throws RepositoryException { @@ -110,7 +111,7 @@ public class DefaultLeadPane implements CmsUiProvider { buttonParent = adminLayersC; else buttonParent = appLayersC; - Button b = createLayerButton(buttonParent, layerId, title, icon); + Button b = SuiteUiUtils.createLayerButton(buttonParent, layerId, title, icon, l10nClassLoader); if (first == null) first = b; } @@ -118,7 +119,10 @@ public class DefaultLeadPane implements CmsUiProvider { return first; } - public void init(Map properties) { + public void init(BundleContext bundleContext, Map properties) { + l10nClassLoader = bundleContext != null ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader() + : getClass().getClassLoader(); + String[] defaultLayers = (String[]) properties.get(Property.defaultLayers.toString()); if (defaultLayers == null) throw new IllegalArgumentException("Default layers must be set."); @@ -133,6 +137,10 @@ public class DefaultLeadPane implements CmsUiProvider { } } + public void destroy(BundleContext bundleContext, Map properties) { + + } + public void addLayer(SuiteLayer layer, Map properties) { if (properties.containsKey(Constants.SERVICE_PID)) { String pid = (String) properties.get(Constants.SERVICE_PID); @@ -151,25 +159,25 @@ public class DefaultLeadPane implements CmsUiProvider { } } - protected Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon) { - CmsTheme theme = CmsTheme.getCmsTheme(parent); - Button button = new Button(parent, SWT.PUSH); - CmsUiUtils.style(button, SuiteStyle.leadPane); - if (icon != null) - button.setImage(icon.getBigIcon(theme)); - button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false)); - // button.setToolTipText(msg.lead()); - if (msg != null) { - Label lbl = new Label(parent, SWT.CENTER); - CmsUiUtils.style(lbl, SuiteStyle.leadPane); - // CmsUiUtils.markup(lbl); - ClassLoader l10nClassLoader = getClass().getClassLoader(); - String txt = LocaleUtils.lead(msg, l10nClassLoader); -// String txt = msg.lead(); - lbl.setText(txt); - lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false)); - } - CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer); - return button; - } +// protected Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon) { +// CmsTheme theme = CmsTheme.getCmsTheme(parent); +// Button button = new Button(parent, SWT.PUSH); +// CmsUiUtils.style(button, SuiteStyle.leadPane); +// if (icon != null) +// button.setImage(icon.getBigIcon(theme)); +// button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false)); +// // button.setToolTipText(msg.lead()); +// if (msg != null) { +// Label lbl = new Label(parent, SWT.CENTER); +// CmsUiUtils.style(lbl, SuiteStyle.leadPane); +// // CmsUiUtils.markup(lbl); +// ClassLoader l10nClassLoader = getClass().getClassLoader(); +// String txt = LocaleUtils.lead(msg, l10nClassLoader); +//// String txt = msg.lead(); +// lbl.setText(txt); +// lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false)); +// } +// CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer); +// return button; +// } } diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java index 994ea84..c081662 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java @@ -9,7 +9,7 @@ import org.eclipse.swt.widgets.Composite; /** An UI layer for the main work area. */ public interface SuiteLayer extends CmsUiProvider { static enum Property { - title, icon, weights, startMaximized; + title, icon, weights, startMaximized, singleTab; } void view(CmsUiProvider uiProvider, Composite workArea, Node context); diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java index 79edb64..0cfee18 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java @@ -7,12 +7,15 @@ import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; +import org.argeo.cms.LocaleUtils; import org.argeo.cms.Localized; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.ui.CmsEditable; +import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsView; import org.argeo.cms.ui.dialogs.LightweightDialog; import org.argeo.cms.ui.util.CmsEvent; +import org.argeo.cms.ui.util.CmsIcon; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.entity.EntityNames; @@ -324,6 +327,27 @@ public class SuiteUiUtils { return event.getTopic().equals(cmsEvent.topic()); } + public static Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon, + ClassLoader l10nClassLoader) { + CmsTheme theme = CmsTheme.getCmsTheme(parent); + Button button = new Button(parent, SWT.PUSH); + CmsUiUtils.style(button, SuiteStyle.leadPane); + if (icon != null) + button.setImage(icon.getBigIcon(theme)); + button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false)); + // button.setToolTipText(msg.lead()); + if (msg != null) { + Label lbl = new Label(parent, SWT.CENTER); + CmsUiUtils.style(lbl, SuiteStyle.leadPane); + String txt = LocaleUtils.lead(msg, l10nClassLoader); +// String txt = msg.lead(); + lbl.setText(txt); + lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false)); + } + CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer); + return button; + } + // public static String createAndConfigureEntity(Shell shell, Session referenceSession, String mainMixin, // String... additionnalProps) { // diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java index 5192f84..e1cf154 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java @@ -11,8 +11,8 @@ import org.argeo.cms.ui.viewers.Section; import org.argeo.eclipse.ui.Selected; import org.argeo.jcr.Jcr; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -40,6 +40,10 @@ public class TabbedArea extends Composite { private String bodyStyle; private Image closeIcon; + private StackLayout stackLayout; + + private boolean singleTab = false; + public TabbedArea(Composite parent, int style) { super(parent, style); CmsUiUtils.style(parent, bodyStyle); @@ -49,25 +53,19 @@ public class TabbedArea extends Composite { // TODO manage tabs at bottom or sides headers = new Composite(this, SWT.NONE); headers.setLayoutData(CmsUiUtils.fillWidth()); - // CmsUiUtils.style(headers, bodyStyle); body = new Composite(this, SWT.NONE); body.setLayoutData(CmsUiUtils.fillAll()); - body.setLayout(new FormLayout()); + // body.setLayout(new FormLayout()); + stackLayout = new StackLayout(); + body.setLayout(stackLayout); emptyState(); } protected void refreshTabHeaders() { - // TODO deal with initialisation better -// CmsUiUtils.style(body, bodyStyle); - -// int tabCount = sections.size() > 0 ?(sections.size()>1?sections.size()+1:1) : 1; int tabCount = sections.size() > 0 ? sections.size() : 1; for (Control tab : headers.getChildren()) tab.dispose(); -// GridLayout headersGridLayout = new GridLayout(tabCount, true); -// headersGridLayout.marginHeight=0; -// headers.setLayout(headersGridLayout); headers.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(tabCount, true))); if (sections.size() == 0) { @@ -85,7 +83,7 @@ public class TabbedArea extends Composite { boolean selected = section == currentSection; Composite sectionHeader = section.createHeader(headers); CmsUiUtils.style(sectionHeader, selected ? tabSelectedStyle : tabStyle); - int headerColumns = 2; + int headerColumns = singleTab ? 1 : 2; sectionHeader.setLayout(new GridLayout(headerColumns, false)); sectionHeader.setLayout(CmsUiUtils.noSpaceGridLayout(headerColumns)); Button title = new Button(sectionHeader, SWT.FLAT); @@ -94,24 +92,18 @@ public class TabbedArea extends Composite { title.addSelectionListener((Selected) (e) -> showTab(tabIndex(section.getNode()))); Node node = section.getNode(); title.setText(Jcr.getTitle(node)); - ToolBar toolBar = new ToolBar(sectionHeader, SWT.NONE); -// CmsUiUtils.style(toolBar, selected ? tabSelectedStyle : tabStyle); - ToolItem closeItem = new ToolItem(toolBar, SWT.FLAT); - if (closeIcon != null) - closeItem.setImage(closeIcon); - else - closeItem.setText("X"); - CmsUiUtils.style(closeItem, selected ? tabSelectedStyle : tabStyle); - closeItem.addSelectionListener((Selected) (e) -> closeTab(section)); + if (!singleTab) { + ToolBar toolBar = new ToolBar(sectionHeader, SWT.NONE); + ToolItem closeItem = new ToolItem(toolBar, SWT.FLAT); + if (closeIcon != null) + closeItem.setImage(closeIcon); + else + closeItem.setText("X"); + CmsUiUtils.style(closeItem, selected ? tabSelectedStyle : tabStyle); + closeItem.addSelectionListener((Selected) (e) -> closeTab(section)); + } } -// if(sections.size()>1) -// { -// ToolBar toolBar = new ToolBar(headers, SWT.NONE); -// CmsUiUtils.style(toolBar, tabStyle); -// ToolItem closeAllItem = new ToolItem(toolBar, SWT.FLAT); -// closeAllItem.setText("X"); -// } } public void view(CmsUiProvider uiProvider, Node context) { @@ -134,23 +126,20 @@ public class TabbedArea extends Composite { } currentUiProvider = uiProvider; section.setNode(context); - section.setLayoutData(CmsUiUtils.coverAll()); + // section.setLayoutData(CmsUiUtils.coverAll()); build(section, uiProvider, context); if (sections.size() == 0) sections.add(section); refreshTabHeaders(); + index = tabIndex(context); + showTab(index); layout(true, true); } public void open(CmsUiProvider uiProvider, Node context) { -// try { -// if (openingTimer > 0) -// Thread.sleep(openingTimer); -// } catch (InterruptedException e) { -// // silent -// } - - // int index = tabIndex(context); + if (singleTab) + throw new UnsupportedOperationException("Open is not supported in single tab mode."); + if (previousNode != null && Jcr.getIdentifier(previousNode).equals(Jcr.getIdentifier(context))) { // does nothing return; @@ -161,21 +150,18 @@ public class TabbedArea extends Composite { int currentIndex = sections.indexOf(currentSection); Section previousSection = new Section(body, SWT.NONE, context); build(previousSection, previousUiProvider, previousNode); - previousSection.setLayoutData(CmsUiUtils.coverAll()); -// sections.remove(currentSection); - sections.add(currentIndex + 1, previousSection); -// sections.add(currentSection); -// nextCurrentSection.moveAbove(null); -// if (previousNode != null) { -// view(previousUiProvider, previousNode); -// } + // previousSection.setLayoutData(CmsUiUtils.coverAll()); + int index = currentIndex + 1; + sections.add(index, previousSection); + showTab(index); refreshTabHeaders(); layout(true, true); } - + public void showTab(int index) { Section sectionToShow = sections.get(index); - sectionToShow.moveAbove(null); + // sectionToShow.moveAbove(null); + stackLayout.topControl = sectionToShow; refreshTabHeaders(); layout(true, true); } @@ -223,7 +209,7 @@ public class TabbedArea extends Composite { } protected Section getCurrentSection() { - return (Section) body.getChildren()[0]; + return (Section) stackLayout.topControl; } public void setTabStyle(String tabStyle) { @@ -241,4 +227,9 @@ public class TabbedArea extends Composite { public void setCloseIcon(Image closeIcon) { this.closeIcon = closeIcon; } + + public void setSingleTab(boolean singleTab) { + this.singleTab = singleTab; + } + } diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index d6c3dc1..34f4abe 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -28,6 +28,13 @@ 2.1.20-SNAPSHOT + + + org.argeo.suite.icons + org.argeo.suite.icons.default + ${version.argeo-suite-icons} + + org.argeo.suite diff --git a/lib/pom.xml b/lib/pom.xml index cf59082..56048e6 100644 --- a/lib/pom.xml +++ b/lib/pom.xml @@ -16,6 +16,7 @@ 2.1.27 2.1.13 2.1.101 + 2.1.0 /srv/rpmfactory/testing/argeo diff --git a/pom.xml b/pom.xml index 1944bdd..952753f 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 2.1.27 2.1.13 2.1.101 + 2.1.0 /srv/rpmfactory/testing/argeo-osgi-2/argeo diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java index b790358..814cfb3 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java @@ -72,6 +72,8 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke private final boolean flat; + private boolean showMainTitle = true; + private Integer maxMediaWidth = null; protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) { @@ -105,12 +107,15 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke Node node = section.getNode(); TextSection textSection = (TextSection) section; if (node.hasNode(DbkType.title.get())) { - if (section.getHeader() == null) - section.createHeader(); - Node titleNode = node.getNode(DbkType.title.get()); - DocBookSectionTitle title = newSectionTitle(textSection, titleNode); - title.setLayoutData(CmsUiUtils.fillWidth()); - updateContent(title); + boolean showTitle = getMainSection() == section ? showMainTitle : true; + if (showTitle) { + if (section.getHeader() == null) + section.createHeader(); + Node titleNode = node.getNode(DbkType.title.get()); + DocBookSectionTitle title = newSectionTitle(textSection, titleNode); + title.setLayoutData(CmsUiUtils.fillWidth()); + updateContent(title); + } } for (NodeIterator ni = node.getNodes(); ni.hasNext();) { @@ -937,6 +942,10 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke this.maxMediaWidth = maxMediaWidth; } + public void setShowMainTitle(boolean showMainTitle) { + this.showMainTitle = showMainTitle; + } + // FILE UPLOAD LISTENER private class FUL implements FileUploadListener { public void uploadProgress(FileUploadEvent event) {