<arguments>
</arguments>
</buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite Default Theme">
+ <implementation class="org.argeo.cms.ui.util.BundleCmsTheme"/>
+ <service>
+ <provide interface="org.argeo.cms.ui.CmsTheme"/>
+ </service>
+</scr:component>
+Service-Component:\
+OSGI-INF/cmsTheme.xml
+
+Import-Package:\
+org.argeo.cms.ui.util,\
+*
\ No newline at end of file
-bin.includes = META-INF/
+bin.includes = META-INF/,\
+ OSGI-INF/cmsTheme.xml
font: bold 14px sans-serif;
color: white;
background-color: #204a87;
+}
+
+Button.argeo-work-leadPane {
+ font: bold 14px sans-serif;
+ color: white;
+ background-color: white;
}
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite Web App">
- <implementation class="org.argeo.cms.web.CmsWebApp"/>
- <property name="contextName" type="String" value="argeo"/>
- <property name="argeo.cms.theme.bundle" type="String" value="org.argeo.suite.theme.default"/>
- <service>
- <provide interface="org.eclipse.rap.rwt.application.ApplicationConfiguration"/>
- </service>
- <reference bind="setCmsApp" cardinality="1..1" interface="org.argeo.cms.ui.CmsApp" name="CmsApp" policy="static" target="(contextName=argeo)"/>
-</scr:component>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite Web App">
+ <implementation class="org.argeo.cms.web.CmsWebApp"/>
+ <property name="contextName" type="String" value="argeo"/>
+ <reference bind="setCmsApp" cardinality="1..1" interface="org.argeo.cms.ui.CmsApp" name="CmsApp" policy="dynamic" target="(contextName=argeo)" unbind="unsetCmsApp"/>
+</scr:component>
-Service-Component: OSGI-INF/argeoSuiteWebApp.xml
+Service-Component: OSGI-INF/cmsWebApp.xml
Import-Package:\
org.argeo.cms.web,\
output.. = bin/
bin.includes = META-INF/,\
.,\
- OSGI-INF/argeoSuiteWebApp.xml
+ OSGI-INF/
source.. = src/
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Argeo Suite App">
- <implementation class="org.argeo.suite.ui.ArgeoSuiteApp"/>
- <property name="contextName" type="String" value="argeo"/>
- <service>
- <provide interface="org.argeo.cms.ui.CmsApp"/>
- </service>
- <reference bind="addUiProvider" cardinality="1..n" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="static" unbind="removeUiProvider"/>
-</scr:component>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite App">
+ <implementation class="org.argeo.suite.ui.ArgeoSuiteApp"/>
+ <property name="contextName" type="String" value="argeo"/>
+ <service>
+ <provide interface="org.argeo.cms.ui.CmsApp"/>
+ </service>
+ <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" unbind="removeUiProvider"/>
+ <reference bind="addTheme" cardinality="0..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
+</scr:component>
dashboard=dashboard
+people=contacts management
+documents=documents
defaultWorkAppTitle=Argeo Suite
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Default Lead Pane">
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" immediate="false" name="Default Lead Pane">
<implementation class="org.argeo.suite.ui.DefaultLeadPane"/>
<service>
<provide interface="org.argeo.cms.ui.CmsUiProvider"/>
<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" name="Default Work Header">
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" immediate="false" name="Default Work Header">
<implementation class="org.argeo.suite.ui.DefaultHeader"/>
<service>
<provide interface="org.argeo.cms.ui.CmsUiProvider"/>
Service-Component:\
-OSGI-INF/argeoSuiteApp.xml,\
+OSGI-INF/cmsApp.xml,\
OSGI-INF/workHeader.xml,\
OSGI-INF/leadPane.xml
output.. = bin/
bin.includes = META-INF/,\
.,\
- OSGI-INF/argeoSuiteApp.xml,\
- OSGI-INF/workHeader.xml,\
- OSGI-INF/leadPane.xml
+ OSGI-INF/
source.. = src/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.ui.CmsApp;
+import org.argeo.cms.ui.AbstractCmsApp;
+import org.argeo.cms.ui.CmsTheme;
import org.argeo.cms.ui.CmsUiProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.osgi.framework.Constants;
-public class ArgeoSuiteApp implements CmsApp {
+/** The Argeo Suite App. */
+public class ArgeoSuiteApp extends AbstractCmsApp {
private final static Log log = LogFactory.getLog(ArgeoSuiteApp.class);
+
public final static String PID_PREFIX = "argeo.work.";
public final static String HEADER_PID = PID_PREFIX + "header";
public final static String LEAD_PANE_PID = PID_PREFIX + "leadPane";
private final static String DEFAULT_UI_NAME = "work";
+ private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
private ArgeoSuiteUi argeoSuiteUi;
private Map<String, CmsUiProvider> uiProviders = new TreeMap<>();
+ public void init(Map<String, String> properties) {
+ if (log.isDebugEnabled())
+ log.info("Argeo Suite App started");
+ }
+
+ public void destroy(Map<String, String> properties) {
+ if (log.isDebugEnabled())
+ log.info("Argeo Suite App stopped");
+
+ }
+
@Override
public Set<String> getUiNames() {
HashSet<String> uiNames = new HashSet<>();
@Override
public void initUi(String uiName, Composite parent) {
if (DEFAULT_UI_NAME.equals(uiName)) {
+ CmsTheme theme = getTheme(uiName);
+ if (theme != null)
+ CmsTheme.registerCmsTheme(parent.getShell(), theme);
argeoSuiteUi = new ArgeoSuiteUi(parent, SWT.NONE);
refresh(uiName);
}
}
+ @Override
+ public String getThemeId(String uiName) {
+ // TODO make it configurable
+ return DEFAULT_THEME_ID;
+ }
+
public void refresh(String uiName) {
if (DEFAULT_UI_NAME.equals(uiName)) {
Node context = null;
log.error("No service pid found for " + uiProvider.getClass() + ", " + properties);
} else {
uiProviders.put(servicePid, uiProvider);
+ if (log.isDebugEnabled())
+ log.debug("Added UI provider " + servicePid + " to CMS app.");
}
}
--- /dev/null
+package org.argeo.suite.ui;
+
+import org.argeo.cms.ui.util.CmsIcon;
+
+/** Icon names used by Argeo Suite. */
+public enum ArgeoSuiteIcon implements CmsIcon {
+ add, save, search, delete, logout, dashboard,
+ // people
+ people, person, organisation,
+ // library
+ documents, document, folder,
+ // misc
+ task, tag;
+}
package org.argeo.suite.ui;
+import static org.argeo.suite.ui.ArgeoSuiteIcon.dashboard;
+
+import org.argeo.cms.ui.CmsTheme;
import org.argeo.cms.ui.util.CmsUiUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
private SashForm dynamicArea;
private Composite entryArea;
- private CTabFolder editorArea;
+ private Composite editorArea;
+ private CTabFolder editorTabFolder;
private Composite defaultBody;
+ private CmsTheme theme;
+
public ArgeoSuiteUi(Composite parent, int style) {
+ theme = CmsTheme.getCmsTheme(parent);
this.parent = parent;
parent.setLayout(CmsUiUtils.noSpaceGridLayout());
dynamicArea.setLayoutData(CmsUiUtils.fillAll());
if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
- editorArea = new CTabFolder(dynamicArea, SWT.NONE);
- entryArea = new Composite(dynamicArea, SWT.NONE);
+ editorArea = new Composite(dynamicArea, SWT.BORDER);
+ entryArea = new Composite(dynamicArea, SWT.BORDER);
} else {
entryArea = new Composite(dynamicArea, SWT.NONE);
- editorArea = new CTabFolder(dynamicArea, SWT.NONE);
+ editorArea = new Composite(dynamicArea, SWT.NONE);
}
int[] weights = new int[] { 2000, 8000 };
dynamicArea.setWeights(weights);
-
- Composite buttons = new Composite(editorArea, SWT.NONE);
- buttons.setLayout(new RowLayout(SWT.HORIZONTAL));
- Button delete = new Button(buttons, SWT.PUSH);
- delete.setText("Delete");
- editorArea.setTopRight(buttons);
-
- CTabItem defaultTab = new CTabItem(editorArea, SWT.NONE);
- defaultTab.setText("Home");
- defaultBody = new Composite(editorArea, SWT.NONE);
+ editorArea.setLayout(new GridLayout());
+
+ // TODO make it dynamic
+ RecentItems recentItems = new RecentItems();
+ recentItems.createUiPart(entryArea);
+
+ editorTabFolder = new CTabFolder(editorArea, SWT.NONE);
+ editorTabFolder.setLayoutData(CmsUiUtils.fillAll());
+ Composite buttons = new Composite(editorTabFolder, SWT.NONE);
+ RowLayout buttonsLayout = new RowLayout(SWT.HORIZONTAL);
+ buttonsLayout.pack = false;
+ buttons.setLayout(buttonsLayout);
+ Button delete = new Button(buttons, SWT.FLAT);
+ delete.setImage(ArgeoSuiteIcon.delete.getSmallIcon(theme));
+ // int size = ArgeoSuiteIcon.delete.getSmallIconSize();
+ // delete.setBounds(delete.getBounds().x,delete.getBounds().y,size,size);
+ // delete.setSize(size, size);
+ editorTabFolder.setTopRight(buttons);
+
+ CTabItem defaultTab = new CTabItem(editorTabFolder, SWT.NONE);
+ // defaultTab.setText("Home");
+ defaultTab.setImage(dashboard.getSmallIcon(theme));
+ defaultBody = new Composite(editorTabFolder, SWT.NONE);
defaultTab.setControl(defaultBody);
+ editorTabFolder.setSelection(defaultTab);
// editorArea.setSingle(true);
}
return entryArea;
}
- CTabFolder getEditorArea() {
- return editorArea;
+ CTabFolder getEditorTabFolder() {
+ return editorTabFolder;
}
Composite getDefaultBody() {
package org.argeo.suite.ui;
import java.util.Dictionary;
+import java.util.Map;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import org.argeo.cms.Localized;
+import org.argeo.cms.ui.CmsTheme;
import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsIcon;
import org.argeo.cms.ui.util.CmsUiUtils;
import org.eclipse.swt.SWT;
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.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedService;
+/** Side pane listing various perspectives. */
public class DefaultLeadPane implements CmsUiProvider, ManagedService {
+ private CmsTheme theme;
@Override
- public Control createUi(Composite parent, Node context) throws RepositoryException {
- parent.setLayout(new GridLayout());
+ public Control createUi(Composite parent, Node node) throws RepositoryException {
+ theme = CmsTheme.getCmsTheme(parent);
+ GridLayout layout = new GridLayout();
+ layout.verticalSpacing = 10;
+ layout.marginTop = 10;
+ layout.marginLeft = 10;
+ layout.marginRight = 10;
+ parent.setLayout(layout);
+
+ Button dashboardB = createButton(parent, WorkMsg.dashboard, ArgeoSuiteIcon.dashboard);
+ createButton(parent, WorkMsg.people, ArgeoSuiteIcon.people);
+ createButton(parent, WorkMsg.documents, ArgeoSuiteIcon.documents);
+ return dashboardB;
+ }
- Label dashboard = new Label(parent, SWT.NONE);
- CmsUiUtils.style(dashboard, WorkStyles.leadPane);
- dashboard.setText(WorkMsg.dashboard.lead());
- return dashboard;
+ protected Button createButton(Composite parent, Localized msg, CmsIcon icon) {
+ Button button = new Button(parent, SWT.FLAT);
+ CmsUiUtils.style(button, WorkStyles.leadPane);
+ button.setToolTipText(msg.lead());
+ button.setImage(icon.getBigIcon(theme));
+ return button;
}
@Override
}
+ public void init(Map<String, String> properties) {
+
+ }
}
--- /dev/null
+package org.argeo.suite.ui;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.ui.CmsTheme;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.connect.ui.widgets.DelayedText;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/** List recent items. */
+public class RecentItems implements CmsUiProvider {
+ int SEARCH_TEXT_DELAY = 800;
+ private CmsTheme theme;
+
+ @Override
+ public Control createUi(Composite parent, Node context) throws RepositoryException {
+ theme = CmsTheme.getCmsTheme(parent);
+ parent.setLayout(new GridLayout());
+
+ Composite top = new Composite(parent, SWT.NONE);
+ top.setLayoutData(CmsUiUtils.fillWidth());
+ top.setLayout(new GridLayout(2, false));
+
+ Label search = new Label(top, SWT.NONE);
+ search.setImage(ArgeoSuiteIcon.search.getSmallIcon(theme));
+ DelayedText delayedText = new DelayedText(top, SWT.SINGLE | SWT.BORDER, SEARCH_TEXT_DELAY);
+ delayedText.getText().setLayoutData(CmsUiUtils.fillWidth());
+
+ TableViewer viewer = new TableViewer(parent);
+ viewer.getTable().setLayoutData(CmsUiUtils.fillAll());
+ return delayedText.getText();
+ }
+
+}
/** Localized messages. */
public enum WorkMsg implements Localized {
- dashboard;
+ dashboard,people,documents;
}
argeo.osgi.start.5.suite=\
org.argeo.suite.cms,\
org.argeo.suite.ui,\
+org.argeo.suite.theme.default,\
org.argeo.suite.ui.rap
# Local