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;
/** 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);
}
@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
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()));
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);
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++) {
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
public final static String DEFAULT_THEME_ID_PROPERTY = "defaultThemeId";
public final static String DEFAULT_LAYER_PROPERTY = "defaultLayer";
private final static String LOGIN = "login";
+ private final static String HOME_STATE = "~";
private String publicBasePath = null;
if (!state.startsWith("/")) {
if (parent instanceof SuiteUi) {
SuiteUi ui = (SuiteUi) parent;
- if (LOGIN.equals(state) || state.equals("~")) {
+ if (LOGIN.equals(state) || state.equals(HOME_STATE)) {
String appTitle = "";
if (ui.getTitle() != null)
appTitle = ui.getTitle().lead();
return;
}
String currentLayerId = ui.getCurrentLayerId();
- if (state.equals(currentLayerId))
- return; // does nothing
- else {
- Map<String, Object> properties = new HashMap<>();
- properties.put(SuiteEvent.LAYER, state);
- ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties);
- }
+// if (state.equals(currentLayerId))
+// return; // does nothing
+// else {
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(SuiteEvent.LAYER, state);
+ properties.put(SuiteEvent.NODE_PATH, HOME_STATE);
+ ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties);
+// }
}
return;
}
SuiteUi suiteUi = (SuiteUi) parent;
Node node = stateToNode(suiteUi, state);
if (node == null) {
- suiteUi.getCmsView().navigateTo("~");
+ suiteUi.getCmsView().navigateTo(HOME_STATE);
} else {
suiteUi.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node));
suiteUi.getCmsView().sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node));
// ui.switchToLayer(layerId, ui.getUserDir());
SuiteLayer suiteLayer = findLayer(layerId);
Localized layerTitle = suiteLayer.getTitle();
- ui.getCmsView().runAs(() -> ui.switchToLayer(layerId, ui.getUserDir()));
+ // FIXME make sure we don't rebuild the work area twice
+ Composite workArea = ui.getCmsView().doAs(() -> ui.switchToLayer(layerId, ui.getUserDir()));
String title = null;
if (layerTitle != null)
title = layerTitle.lead();
- ui.getCmsView().stateChanged(layerId, appTitle + title);
+ Node nodeFromState = getNode(ui, event);
+ if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDir().getPath())) {
+ // default layer view is forced
+ ui.getCmsView().stateChanged(layerId, appTitle + title);
+ suiteLayer.view(null, workArea, nodeFromState);
+ } else {
+ Node layerCurrentContext = suiteLayer.getCurrentContext(workArea);
+ if (layerCurrentContext != null) {
+ // layer was already showing a context so we set the state to it
+ ui.getCmsView().stateChanged(nodeToState(layerCurrentContext),
+ appTitle + Jcr.getTitle(layerCurrentContext));
+ } else {
+ // no context was shown
+ ui.getCmsView().stateChanged(layerId, appTitle + title);
+ }
+ }
} else {
Node node = getNode(ui, event);
if (node != null) {
private Node getNode(SuiteUi ui, Event event) {
String nodePath = get(event, SuiteEvent.NODE_PATH);
+ if (nodePath != null && nodePath.equals(HOME_STATE))
+ return ui.getUserDir();
String workspaceName = get(event, SuiteEvent.WORKSPACE);
Session session = ui.getSession(workspaceName);
Node node;