package org.argeo.cms.ui; import java.io.IOException; import java.io.InputStream; import java.util.Set; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; /** A CMS theme which can be applied to web apps as well as desktop apps. */ public interface CmsTheme { /** Unique ID of this theme. */ String getThemeId(); /** * Load a resource as an input stream, base don its relative path, or * null if not found */ InputStream getResourceAsStream(String resourceName) throws IOException; /** Relative paths to standard web CSS. */ Set getWebCssPaths(); /** Relative paths to RAP specific CSS. */ Set getRapCssPaths(); /** Relative paths to SWT specific CSS. */ Set getSwtCssPaths(); /** Relative paths to images such as icons. */ Set getImagesPaths(); /** Tags to be added to the header section of the HTML page. */ String getHtmlHeaders(); /** The image registered at this path, or null if not found. */ Image getImage(String path); /** The default icon size (typically the smallest). */ Integer getDefaultIconSize(); /** Loads one of the relative path provided by the other methods. */ InputStream loadPath(String path) throws IOException; /** * And icon with this file name (without the extension), with a best effort to * find the appropriate size, or null if not found. * * @param name An icon file name without path and extension. * @param preferredSize the preferred size, if null, * {@link #getDefaultIconSize()} will be tried. */ Image getIcon(String name, Integer preferredSize); static CmsTheme getCmsTheme(Composite parent) { CmsTheme theme = (CmsTheme) parent.getData(CmsTheme.class.getName()); if (theme == null) { // find parent shell Shell topShell = parent.getShell(); while (topShell.getParent() != null) topShell = (Shell) topShell.getParent(); theme = (CmsTheme) topShell.getData(CmsTheme.class.getName()); parent.setData(CmsTheme.class.getName(), theme); } return theme; } static void registerCmsTheme(Shell shell, CmsTheme theme) { // find parent shell Shell topShell = shell; while (topShell.getParent() != null) topShell = (Shell) topShell.getParent(); // check if already set if (topShell.getData(CmsTheme.class.getName()) != null) { CmsTheme registeredTheme = (CmsTheme) topShell.getData(CmsTheme.class.getName()); throw new IllegalArgumentException( "Theme " + registeredTheme.getThemeId() + " already registered in this shell"); } topShell.setData(CmsTheme.class.getName(), theme); } }