/******************************************************************************* * Copyright (c) 2012-2013 RelationWare, Benno Luthiger * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * RelationWare, Benno Luthiger ******************************************************************************/ package org.ripla.web.internal.services; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.ripla.services.ISkinService; import org.ripla.util.PreferencesHelper; import org.ripla.web.Constants; import org.ripla.web.services.ISkin; /** * Singleton instance to register the skins provided by skin bundles. The * provided skins are injected through the service consumer * <code>SkinComponent</code>. * * @author Luthiger * @see SkinComponent */ public enum SkinRegistry { INSTANCE; private final transient Collection<ISkinService> skins = Collections .synchronizedList(new ArrayList<ISkinService>()); private transient ISkinService activeSkin = null; private transient PreferencesHelper preferences; private transient String dftSkinID = Constants.DFT_SKIN_ID; public void setPreferences(final PreferencesHelper inPreferences) { preferences = inPreferences; } /** * Registering a new skin. Called by the component's bind method. * * @param inSkin * {@link ISkinService} */ public void registerSkin(final ISkinService inSkin) { skins.add(inSkin); } /** * Unregistering a skin. Called by the component's unbind method. * * @param inSkin * {@link ISkinService} */ public void unregisterSkin(final ISkinService inSkin) { skins.remove(inSkin); } /** * Returns the active skin (according to the settings in the application * preferences). * * @return {@link ISkin} the active skin, may be <code>null</code>, if no * skins are registered */ public ISkin getActiveSkin() { return (ISkin) getActiveSkinService().createSkin(); } /** * Returns the active skin service, i.e. the service in operation that can * create skin instances (according to the settings in the application * preferences). * * @return */ public ISkinService getActiveSkinService() { if (activeSkin == null) { final String lSkinID = preferences.getActiveSkinID(); if (lSkinID == null) { return calculateSkin(dftSkinID); } activeSkin = calculateSkin(lSkinID); } return activeSkin; } private ISkinService calculateSkin(final String inSkinID) { for (final ISkinService lSkin : skins) { if (lSkin.getSkinID().equals(inSkinID)) { return lSkin; } } return skins.iterator().next(); } /** * Notify the registry about the new skin selection. * * @param inSkinID * String the new skin's id */ public void changeSkin(final String inSkinID) { preferences.set(PreferencesHelper.KEY_SKIN, inSkinID); activeSkin = calculateSkin(inSkinID); } public void flushSkinPref() { preferences.set(PreferencesHelper.KEY_SKIN, getActiveSkinService() .getSkinID()); } /** * Sets the application's default skin. * * @param inDftSkinID * String the default skin's ID */ public void setDefaultSkin(final String inDftSkinID) { dftSkinID = inDftSkinID; } public boolean isInitialized() { return preferences != null; } }