Improve CMS theming.
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / ui / AbstractCmsApp.java
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/AbstractCmsApp.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/AbstractCmsApp.java
new file mode 100644 (file)
index 0000000..9a1e41f
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.cms.ui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.eclipse.rap.rwt.RWT;
+
+public abstract class AbstractCmsApp implements CmsApp {
+       private Map<String, CmsTheme> themes = Collections.synchronizedSortedMap(new TreeMap<>());
+
+       private List<CmsAppListener> cmsAppListeners = new ArrayList<>();
+
+       @Override
+       public Set<String> getUiNames() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       protected abstract String getThemeId(String uiName);
+
+       @Override
+       public CmsTheme getTheme(String uiName) {
+               String themeId = getThemeId(uiName);
+               if (themeId == null)
+                       return null;
+               return themes.get(themeId);
+       }
+
+       protected boolean allThemesAvailable() {
+               boolean themeMissing = false;
+               uiNames: for (String uiName : getUiNames()) {
+                       String themeId = getThemeId(uiName);
+                       if (RWT.DEFAULT_THEME_ID.equals(themeId))
+                               continue uiNames;
+                       if (!themes.containsKey(themeId)) {
+                               themeMissing = true;
+                               break uiNames;
+                       }
+               }
+               return !themeMissing;
+       }
+
+       public void addTheme(CmsTheme theme, Map<String, String> properties) {
+               themes.put(theme.getThemeId(), theme);
+               if (allThemesAvailable())
+                       for (CmsAppListener listener : cmsAppListeners)
+                               listener.themingUpdated();
+       }
+
+       public void removeTheme(CmsTheme theme, Map<String, String> properties) {
+               themes.remove(theme.getThemeId());
+       }
+
+       @Override
+       public void addCmsAppListener(CmsAppListener listener) {
+               cmsAppListeners.add(listener);
+               if (allThemesAvailable())
+                       listener.themingUpdated();
+       }
+
+       @Override
+       public void removeCmsAppListener(CmsAppListener listener) {
+               cmsAppListeners.remove(listener);
+       }
+
+}