Introduce fixed entry area.
[gpl/argeo-suite.git] / core / org.argeo.suite.ui / src / org / argeo / suite / ui / DefaultEditionLayer.java
index 68081b4e646d944b9066c855f98cdc941b48f2ff..7004ad01b1ef04e6a9926bf4e7d1aa521bf5fc52 100644 (file)
@@ -11,6 +11,7 @@ import org.argeo.cms.Localized;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.jcr.JcrException;
 import org.argeo.suite.ui.widgets.TabbedArea;
 import org.argeo.util.LangUtils;
 import org.eclipse.swt.SWT;
@@ -24,21 +25,33 @@ import org.osgi.framework.wiring.BundleWiring;
 /** An app layer based on an entry area and an editor area. */
 public class DefaultEditionLayer implements SuiteLayer {
        private CmsUiProvider entryArea;
+       private CmsUiProvider defaultView;
        private CmsUiProvider workArea;
        private List<String> weights = new ArrayList<>();
        private boolean startMaximized = false;
+       private boolean fixedEntryArea = false;
        private boolean singleTab = false;
        private Localized title = null;
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
+               // TODO Factorize more, or split into more specialised classes?
                if (entryArea != null) {
-                       SashFormEditionArea sashFormEditionArea = new SashFormEditionArea(parent, parent.getStyle());
-                       entryArea.createUi(sashFormEditionArea.getEntryArea(), context);
-                       if (this.workArea != null) {
-                               this.workArea.createUi(sashFormEditionArea.getEditorArea(), context);
+                       if (fixedEntryArea) {
+                               FixedEditionArea editionArea = new FixedEditionArea(parent, parent.getStyle());
+                               entryArea.createUi(editionArea.getEntryArea(), context);
+                               if (this.defaultView != null) {
+                                       editionArea.getTabbedArea().view(defaultView, context);
+                               }
+                               return editionArea;
+                       } else {
+                               SashFormEditionArea editionArea = new SashFormEditionArea(parent, parent.getStyle());
+                               entryArea.createUi(editionArea.getEntryArea(), context);
+                               if (this.defaultView != null) {
+                                       editionArea.getTabbedArea().view(defaultView, context);
+                               }
+                               return editionArea;
                        }
-                       return sashFormEditionArea;
                } else {
                        if (this.workArea != null) {
                                Composite area = new Composite(parent, SWT.NONE);
@@ -52,15 +65,51 @@ public class DefaultEditionLayer implements SuiteLayer {
        }
 
        @Override
-       public void view(CmsUiProvider uiProvider, Composite workArea, Node context) {
-               TabbedArea tabbedArea;
+       public void view(CmsUiProvider uiProvider, Composite workAreaC, Node context) {
+               if (workArea != null) {
+                       try {
+                               CmsUiUtils.clear(workAreaC);
+                               workArea.createUi(workAreaC, context);
+                               workAreaC.requestLayout();
+                               return;
+                       } catch (RepositoryException e) {
+                               throw new JcrException("Cannot rebuild work area", e);
+                       }
+               }
+               
+               // tabbed area
+               TabbedArea tabbedArea = findTabbedArea(workAreaC);
+               if (tabbedArea == null)
+                       throw new IllegalArgumentException("Unsupported work area " + workAreaC.getClass().getName());
+               if (uiProvider == null) {
+                       // reset
+                       tabbedArea.closeAllTabs();
+                       if (this.defaultView != null) {
+                               tabbedArea.view(defaultView, context);
+                       }
+               } else {
+                       tabbedArea.view(uiProvider, context);
+               }
+       }
+
+       @Override
+       public Node getCurrentContext(Composite workArea) {
+               TabbedArea tabbedArea = findTabbedArea(workArea);
+               if (tabbedArea == null)
+                       return null;
+               return tabbedArea.getCurrentContext();
+       }
+
+       private TabbedArea findTabbedArea(Composite workArea) {
+               TabbedArea tabbedArea = null;
                if (workArea instanceof SashFormEditionArea) {
                        tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
+               } else if (workArea instanceof FixedEditionArea) {
+                       tabbedArea = ((FixedEditionArea) workArea).getTabbedArea();
                } else if (workArea instanceof TabbedArea) {
                        tabbedArea = (TabbedArea) workArea;
-               } else
-                       throw new IllegalArgumentException("Unsupported work area " + workArea.getClass().getName());
-               tabbedArea.view(uiProvider, context);
+               }
+               return tabbedArea;
        }
 
        @Override
@@ -78,6 +127,12 @@ 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()));
+               fixedEntryArea = properties.containsKey(Property.fixedEntryArea.name())
+                               && "true".equals(properties.get(Property.fixedEntryArea.name()));
+               if (fixedEntryArea && weights.size() != 0) {
+                       throw new IllegalArgumentException("Property " + Property.weights.name() + " should not be set if property "
+                                       + Property.fixedEntryArea.name() + " is set.");
+               }
                singleTab = properties.containsKey(Property.singleTab.name())
                                && "true".equals(properties.get(Property.singleTab.name()));
 
@@ -116,6 +171,10 @@ public class DefaultEditionLayer implements SuiteLayer {
                this.workArea = workArea;
        }
 
+       public void setDefaultView(CmsUiProvider defaultView) {
+               this.defaultView = defaultView;
+       }
+
        TabbedArea createTabbedArea(Composite parent, CmsTheme theme) {
                TabbedArea tabbedArea = new TabbedArea(parent, SWT.NONE);
                tabbedArea.setSingleTab(singleTab);
@@ -127,26 +186,26 @@ public class DefaultEditionLayer implements SuiteLayer {
                return tabbedArea;
        }
 
-       /** A work area based on an entry area and and a tabbed area. */
+//     /** A work area based on an entry area and and a tabbed area. */
        class SashFormEditionArea extends SashForm {
                private static final long serialVersionUID = 2219125778722702618L;
-               private CmsTheme theme;
-               private Composite entryArea;
-               private Composite editorArea;
                private TabbedArea tabbedArea;
+               private Composite entryC;
 
                SashFormEditionArea(Composite parent, int style) {
                        super(parent, SWT.HORIZONTAL);
-                       theme = CmsTheme.getCmsTheme(parent);
+                       CmsTheme theme = CmsTheme.getCmsTheme(parent);
 
+                       Composite editorC;
                        if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                               editorArea = new Composite(this, SWT.BORDER);
-                               entryArea = new Composite(this, SWT.BORDER);
+                               editorC = new Composite(this, SWT.BORDER);
+                               entryC = new Composite(this, SWT.BORDER);
                        } else {
-                               entryArea = new Composite(this, SWT.NONE);
-                               editorArea = new Composite(this, SWT.NONE);
+                               entryC = new Composite(this, SWT.NONE);
+                               editorC = new Composite(this, SWT.NONE);
                        }
 
+                       // sash form specific
                        if (weights.size() != 0) {
                                int[] actualWeight = new int[weights.size()];
                                for (int i = 0; i < weights.size(); i++) {
@@ -158,30 +217,69 @@ public class DefaultEditionLayer implements SuiteLayer {
                                setWeights(actualWeights);
                        }
                        if (startMaximized)
-                               setMaximizedControl(editorArea);
-                       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);
-                       }
+                               setMaximizedControl(editorC);
+
+                       GridLayout editorAreaLayout = CmsUiUtils.noSpaceGridLayout();
+//                     editorAreaLayout.verticalSpacing = 0;
+//                     editorAreaLayout.marginBottom = 0;
+//                     editorAreaLayout.marginHeight = 0;
+//                     editorAreaLayout.marginLeft = 0;
+//                     editorAreaLayout.marginRight = 0;
+                       editorC.setLayout(editorAreaLayout);
 
+                       tabbedArea = createTabbedArea(editorC, theme);
+               }
+
+               TabbedArea getTabbedArea() {
+                       return tabbedArea;
                }
 
                Composite getEntryArea() {
-                       return entryArea;
+                       return entryC;
+               }
+
+       }
+
+       class FixedEditionArea extends Composite {
+               private static final long serialVersionUID = -5525672639277322465L;
+               private TabbedArea tabbedArea;
+               private Composite entryC;
+
+               public FixedEditionArea(Composite parent, int style) {
+                       super(parent, style);
+                       CmsTheme theme = CmsTheme.getCmsTheme(parent);
+
+                       setLayout(CmsUiUtils.noSpaceGridLayout(2));
+
+                       Composite editorC;
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               editorC = new Composite(this, SWT.NONE);
+                               entryC = new Composite(this, SWT.NONE);
+                       } else {
+                               entryC = new Composite(this, SWT.NONE);
+                               editorC = new Composite(this, SWT.NONE);
+                       }
+                       entryC.setLayoutData(CmsUiUtils.fillHeight());
+
+                       GridLayout editorAreaLayout = CmsUiUtils.noSpaceGridLayout();
+//                     editorAreaLayout.verticalSpacing = 0;
+//                     editorAreaLayout.marginBottom = 0;
+//                     editorAreaLayout.marginHeight = 0;
+//                     editorAreaLayout.marginLeft = 0;
+//                     editorAreaLayout.marginRight = 0;
+                       editorC.setLayout(editorAreaLayout);
+                       editorC.setLayoutData(CmsUiUtils.fillAll());
+
+                       tabbedArea = createTabbedArea(editorC, theme);
                }
 
                TabbedArea getTabbedArea() {
                        return tabbedArea;
                }
 
-               Composite getEditorArea() {
-                       return editorArea;
+               Composite getEntryArea() {
+                       return entryC;
                }
-
        }
+
 }
\ No newline at end of file