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;
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;
}
+ protected void setControlLayoutData(Control control) {
+ control.setLayoutData(CmsUiUtils.fillAll());
+ }
+
+ protected void setContainerLayoutData(Composite composite) {
+ composite.setLayoutData(CmsUiUtils.fillAll());
+ }
+
//
// STYLING
//
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;
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;
/** {@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);
@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();
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;
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);
bin.includes = META-INF/,\
- icons/,\
OSGI-INF/
<?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"/>
private CmsUiProvider workArea;
private List<String> weights = new ArrayList<>();
private boolean startMaximized = false;
+ private boolean singleTab = false;
private Localized title = null;
@Override
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) {
}
}
- public void destroy() {
+ public void destroy(BundleContext bundleContext, Map<String, String> properties) {
}
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());
}
}
- public void destroy() {
+ public void destroy(BundleContext bundleContext, Map<String, String> properties) {
}
package org.argeo.suite.ui;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
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;
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 {
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 {
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;
}
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.");
}
}
+ 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);
}
}
- 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;
+// }
}
/** 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);
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;
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) {
//
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;
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);
// 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) {
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);
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) {
}
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;
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);
}
}
protected Section getCurrentSection() {
- return (Section) body.getChildren()[0];
+ return (Section) stackLayout.topControl;
}
public void setTabStyle(String tabStyle) {
public void setCloseIcon(Image closeIcon) {
this.closeIcon = closeIcon;
}
+
+ public void setSingleTab(boolean singleTab) {
+ this.singleTab = singleTab;
+ }
+
}
<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>
<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 />
<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 />
private final boolean flat;
+ private boolean showMainTitle = true;
+
private Integer maxMediaWidth = null;
protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) {
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();) {
this.maxMediaWidth = maxMediaWidth;
}
+ public void setShowMainTitle(boolean showMainTitle) {
+ this.showMainTitle = showMainTitle;
+ }
+
// FILE UPLOAD LISTENER
private class FUL implements FileUploadListener {
public void uploadProgress(FileUploadEvent event) {