Merge remote-tracking branch 'origin/master' into v2.x
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 11 Feb 2021 13:05:44 +0000 (14:05 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 11 Feb 2021 13:05:44 +0000 (14:05 +0100)
Conflicts:
lib/pom.xml
pom.xml

56 files changed:
core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java
core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java
core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java
core/org.argeo.suite.theme.default/build.properties
core/org.argeo.suite.theme.default/icons/types/16/add.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/close.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/dashboard.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/delete.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/document.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/documents.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/folder.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/inbox.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/location.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/logout.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/map.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/organisation.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/people.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/person.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/refresh.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/save.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/search.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/settings.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/tag.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/task.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/16/user.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/add.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/close.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/dashboard.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/delete.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/document.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/documents.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/folder.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/inbox.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/location.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/logout.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/map.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/organisation.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/people.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/person.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/save.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/search.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/settings.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/tag.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/task.png [deleted file]
core/org.argeo.suite.theme.default/icons/types/32/user.png [deleted file]
core/org.argeo.suite.ui/OSGI-INF/leadPane.xml
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java
dep/org.argeo.suite.dep.ui.rap/pom.xml
lib/pom.xml
pom.xml
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java

index 408a0bff2e828870357a972aff7fbce935504c92..1d9b6bc713b7e59dfce9f97915111520434448d9 100644 (file)
@@ -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
        //
index 947fbf84fb7ea92ed9578b24e5b3cd28680cc53a..9c3618d8d262c981449480d82af77be14209513f 100644 (file)
@@ -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<Term> currentValue = getValue();
@@ -176,8 +180,12 @@ public class MultiTermsPart extends AbstractTermsPart {
                List<String> curr = Jcr.getMultiple(getNode(), property);
                List<Term> 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;
index b6e997af2d1508380f02f047afd9526511c7959d..aaaaafacdade2144915884ec11f0524892784c24 100644 (file)
@@ -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);
index 9cb37cd6b84f7b2b1aa59e644886278629432c97..7f8c707171a6552521abd550c7f6bdf18a9d04f3 100644 (file)
@@ -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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
index 50fd404..0000000
Binary files a/core/org.argeo.suite.theme.default/icons/types/32/user.png and /dev/null differ
index 9d3f2dd467be9f8ea661962ac5b18de2243fa8ca..0775c5790f6044fdfefb49254e963f442381ecef 100644 (file)
@@ -1,5 +1,5 @@
 <?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 Lead Pane">
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Lead Pane">
    <implementation class="org.argeo.suite.ui.DefaultLeadPane"/>
    <service>
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
index 9c2ad475e6e5c219622c1cd38f73609f48ccf7da..d017ee7d7f5f0a33897bfe66085dd8b289aa1853 100644 (file)
@@ -27,6 +27,7 @@ public class DefaultEditionLayer implements SuiteLayer {
        private CmsUiProvider workArea;
        private List<String> 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<String, String> 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());
index 080bac2cfa121b92817a22a95aecabfb700c6641..84a5ebd394197d0c51658f3c91bc26fa42740567 100644 (file)
@@ -116,7 +116,7 @@ public class DefaultHeader implements CmsUiProvider, ManagedService {
                }
        }
 
-       public void destroy() {
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
 
        }
 
index 10d386cb54959176f8462228abd79c7f320c3f9d..b2ebcb297b1e6200d65d937eedb3f02d98023714 100644 (file)
@@ -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<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
        private List<String> defaultLayers;
-       private List<String> adminLayers;
+       private List<String> 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<String, Object> properties) {
+       public void init(BundleContext bundleContext, Map<String, Object> 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<String, String> properties) {
+
+       }
+
        public void addLayer(SuiteLayer layer, Map<String, Object> 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;
+//     }
 }
index 994ea8459c06e313f04dcef783c815b85d05feed..c0816627917e536d43832795eb8a4a9c24c9ab72 100644 (file)
@@ -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);
index 79edb6416e38ffd7644037b9bbae3b68fce58ea2..0cfee182596230c9875f0d87b84a49dc0ea966d5 100644 (file)
@@ -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) {
 //
index 5192f84559610871bcab7886a0ab80388e0b68eb..e1cf15451d4b35cf0662070e05166a798001cdb0 100644 (file)
@@ -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;
+       }
+
 }
index d6c3dc1cfe62763b7c229a6d2f1e23fdce4e40f6..34f4abef2029186347fb30a501a26a6f78b87337 100644 (file)
                        <version>2.1.20-SNAPSHOT</version>
                </dependency>
 
+               <!-- Argeo Suite Icons -->
+               <dependency>
+                       <groupId>org.argeo.suite.icons</groupId>
+                       <artifactId>org.argeo.suite.icons.default</artifactId>
+                       <version>${version.argeo-suite-icons}</version>
+               </dependency>
+
                <!-- Argeo Suite -->
                <dependency>
                        <groupId>org.argeo.suite</groupId>
index cf590829c39d5a1c93f4eac0a987304a75cf69a0..56048e6b09f773c748405be7c3e7ad8a7087aa96 100644 (file)
@@ -16,6 +16,7 @@
                <version.argeo-tp>2.1.27</version.argeo-tp>
                <version.argeo-tp-extras>2.1.13</version.argeo-tp-extras>
                <version.argeo-commons>2.1.101</version.argeo-commons>
+               <version.argeo-suite-icons>2.1.0</version.argeo-suite-icons>
 
                <argeo.rpm.stagingRepository>/srv/rpmfactory/testing/argeo</argeo.rpm.stagingRepository>
                <git.rw />
diff --git a/pom.xml b/pom.xml
index 1944bddb4f8c4d2795533d221b27a261ddecd9b0..952753f3e6f725747e47af8a217f28392e2ca119 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,7 @@
                <version.argeo-tp>2.1.27</version.argeo-tp>
                <version.argeo-tp-extras>2.1.13</version.argeo-tp-extras>
                <version.argeo-commons>2.1.101</version.argeo-commons>
+               <version.argeo-suite-icons>2.1.0</version.argeo-suite-icons>
 
                <argeo.rpm.stagingRepository>/srv/rpmfactory/testing/argeo-osgi-2/argeo</argeo.rpm.stagingRepository>
                <git.rw />
index b7903581f997a857e16511ecf7666b7c24e6539e..814cfb3415e129dcdc28164e27ad72f03d7f78ed 100644 (file)
@@ -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) {