You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by gh...@apache.org on 2014/02/03 09:49:09 UTC

svn commit: r1563801 - in /roller/trunk/app/src/main: java/org/apache/roller/weblogger/ui/struts2/editor/ resources/ webapp/roller-ui/styles/

Author: ghuber
Date: Mon Feb  3 08:49:08 2014
New Revision: 1563801

URL: http://svn.apache.org/r1563801
Log:
Make sure we get a default style sheet when switching themes.

Modified:
    roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java
    roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java
    roller/trunk/app/src/main/resources/ApplicationResources.properties
    roller/trunk/app/src/main/webapp/roller-ui/styles/roller.css

Modified: roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java
URL: http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java?rev=1563801&r1=1563800&r2=1563801&view=diff
==============================================================================
--- roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java (original)
+++ roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java Mon Feb  3 08:49:08 2014
@@ -44,166 +44,169 @@ import org.apache.roller.weblogger.util.
  */
 public class StylesheetEdit extends UIAction {
 
-	private static final long serialVersionUID = 4657591015852311907L;
+    private static final long serialVersionUID = 4657591015852311907L;
 
-	private static Log log = LogFactory.getLog(StylesheetEdit.class);
+    private static Log log = LogFactory.getLog(StylesheetEdit.class);
     private static final String MOBILE_THEME_TYPE = "mobile";
     private static final String STANDARD_THEME_TYPE = "standard";
 
-	// the template we are working on
-	private WeblogTemplate template = null;
+    // the template we are working on
+    private WeblogTemplate template = null;
 
-	// the contents of the stylesheet override
-	private String contentsStandard = null;
-	private String contentsMobile = null;
-
-	// Do we have a custom stylesheet already for a custom theme
-	private boolean customStylesheet = false;
-
-	public StylesheetEdit() {
-		this.actionName = "stylesheetEdit";
-		this.desiredMenu = "editor";
-		this.pageTitle = "stylesheetEdit.title";
-	}
-
-	@Override
-	public List<String> requiredWeblogPermissionActions() {
-		return Collections.singletonList(WeblogPermission.ADMIN);
-	}
-
-	@Override
-	public void myPrepare() {
-
-		ThemeTemplate stylesheet = null;
-		try {
-			stylesheet = getActionWeblog().getTheme().getStylesheet();
-		} catch (WebloggerException ex) {
-			log.error("Error looking up stylesheet on weblog - "
-					+ getActionWeblog().getHandle(), ex);
-		}
-
-		if (stylesheet != null) {
-			log.debug("custom stylesheet path is - " + stylesheet.getLink());
-			try {
-				setTemplate(WebloggerFactory.getWeblogger().getWeblogManager()
-						.getPageByLink(getActionWeblog(), stylesheet.getLink()));
-
-				if (getTemplate() == null) {
-					log.debug("custom stylesheet not found, creating it");
-
-					// template doesn't exist yet, so create it
-					WeblogTemplate stylesheetTmpl = new WeblogTemplate();
-					stylesheetTmpl.setWebsite(getActionWeblog());
-					stylesheetTmpl.setAction(ThemeTemplate.ACTION_CUSTOM);
-					stylesheetTmpl.setName(stylesheet.getName());
-					stylesheetTmpl.setDescription(stylesheet.getDescription());
-					stylesheetTmpl.setLink(stylesheet.getLink());
-					stylesheetTmpl.setContents(stylesheet.getContents());
-					stylesheetTmpl.setHidden(false);
-					stylesheetTmpl.setNavbar(false);
-					stylesheetTmpl.setLastModified(new Date());
-					stylesheetTmpl.setTemplateLanguage(stylesheet
-							.getTemplateLanguage());
-
-					// create template codes for available template code Types
-					WeblogThemeTemplateCode standardTemplateCode = new WeblogThemeTemplateCode(
-							stylesheetTmpl.getId(), STANDARD_THEME_TYPE);
-					standardTemplateCode.setTemplate(stylesheetTmpl
-							.getContents());
-					standardTemplateCode.setTemplateLanguage(stylesheetTmpl
-							.getTemplateLanguage());
-
-					WeblogThemeTemplateCode mobileTemplateCode = new WeblogThemeTemplateCode(
-							stylesheetTmpl.getId(), MOBILE_THEME_TYPE);
-					mobileTemplateCode
-							.setTemplate(stylesheetTmpl.getContents());
-					mobileTemplateCode.setTemplateLanguage(stylesheetTmpl
-							.getTemplateLanguage());
-
-					WebloggerFactory.getWeblogger().getWeblogManager()
-							.saveTemplateCode(standardTemplateCode);
-					WebloggerFactory.getWeblogger().getWeblogManager()
-							.saveTemplateCode(mobileTemplateCode);
-
-					WebloggerFactory.getWeblogger().getWeblogManager()
-							.savePage(stylesheetTmpl);
-					WebloggerFactory.getWeblogger().flush();
-
-					setTemplate(stylesheetTmpl);
-				}
-
-				// See if we have a custom style sheet from a custom theme.
-				if (!WeblogTheme.CUSTOM.equals(getActionWeblog()
-						.getEditorTheme())
-						&& getActionWeblog().getTheme().getStylesheet() != null) {
-
-					ThemeTemplate override = WebloggerFactory
-							.getWeblogger()
-							.getWeblogManager()
-							.getPageByLink(
-									getActionWeblog(),
-									getActionWeblog().getTheme()
-											.getStylesheet().getLink());
-
-					if (override != null) {
-						customStylesheet = true;
-					}
-				}
-
-			} catch (WebloggerException ex) {
-				log.error(
-						"Error finding/adding stylesheet tempalate from weblog - "
-								+ getActionWeblog().getHandle(), ex);
-			}
-		}
-	}
-
-	/**
-	 * Show stylesheet edit page.
-	 */
-	public String execute() {
-
-		if (getTemplate() == null) {
-			return ERROR;
-		}
-
-		try {
-
-			if (getTemplate().getTemplateCode(STANDARD_THEME_TYPE) != null) {
-				setContentsStandard(getTemplate().getTemplateCode(STANDARD_THEME_TYPE)
-						.getTemplate());
-			} else {
-				setContentsStandard(getTemplate().getContents());
-			}
-			if (getTemplate().getTemplateCode(MOBILE_THEME_TYPE) != null) {
-				setContentsMobile(getTemplate().getTemplateCode(MOBILE_THEME_TYPE)
-						.getTemplate());
-			}
+    // the contents of the stylesheet override
+    private String contentsStandard = null;
+    private String contentsMobile = null;
+
+    // Do we have a custom stylesheet already for a custom theme
+    private boolean customStylesheet = false;
+
+    public StylesheetEdit() {
+        this.actionName = "stylesheetEdit";
+        this.desiredMenu = "editor";
+        this.pageTitle = "stylesheetEdit.title";
+    }
+
+    @Override
+    public List<String> requiredWeblogPermissionActions() {
+        return Collections.singletonList(WeblogPermission.ADMIN);
+    }
+
+    @Override
+    public void myPrepare() {
+
+        ThemeTemplate stylesheet = null;
+        try {
+            stylesheet = getActionWeblog().getTheme().getStylesheet();
+        } catch (WebloggerException ex) {
+            log.error("Error looking up stylesheet on weblog - "
+                    + getActionWeblog().getHandle(), ex);
+        }
+
+        if (stylesheet != null) {
+            log.debug("custom stylesheet path is - " + stylesheet.getLink());
+            try {
+                setTemplate(WebloggerFactory.getWeblogger().getWeblogManager()
+                        .getPageByLink(getActionWeblog(), stylesheet.getLink()));
+
+                if (getTemplate() == null) {
+                    log.debug("custom stylesheet not found, creating it");
+
+                    // template doesn't exist yet, so create it
+                    WeblogTemplate stylesheetTmpl = new WeblogTemplate();
+                    stylesheetTmpl.setWebsite(getActionWeblog());
+                    stylesheetTmpl.setAction(ThemeTemplate.ACTION_CUSTOM);
+                    stylesheetTmpl.setName(stylesheet.getName());
+                    stylesheetTmpl.setDescription(stylesheet.getDescription());
+                    stylesheetTmpl.setLink(stylesheet.getLink());
+                    stylesheetTmpl.setContents(stylesheet.getContents());
+                    stylesheetTmpl.setHidden(false);
+                    stylesheetTmpl.setNavbar(false);
+                    stylesheetTmpl.setLastModified(new Date());
+                    stylesheetTmpl.setTemplateLanguage(stylesheet
+                            .getTemplateLanguage());
+
+                    // create template codes for available template code Types
+                    WeblogThemeTemplateCode standardTemplateCode = new WeblogThemeTemplateCode(
+                            stylesheetTmpl.getId(), STANDARD_THEME_TYPE);
+                    standardTemplateCode.setTemplate(stylesheetTmpl
+                            .getContents());
+                    standardTemplateCode.setTemplateLanguage(stylesheetTmpl
+                            .getTemplateLanguage());
+
+                    WeblogThemeTemplateCode mobileTemplateCode = new WeblogThemeTemplateCode(
+                            stylesheetTmpl.getId(), MOBILE_THEME_TYPE);
+                    mobileTemplateCode
+                            .setTemplate(stylesheetTmpl.getContents());
+                    mobileTemplateCode.setTemplateLanguage(stylesheetTmpl
+                            .getTemplateLanguage());
+
+                    WebloggerFactory.getWeblogger().getWeblogManager()
+                            .saveTemplateCode(standardTemplateCode);
+                    WebloggerFactory.getWeblogger().getWeblogManager()
+                            .saveTemplateCode(mobileTemplateCode);
+
+                    WebloggerFactory.getWeblogger().getWeblogManager()
+                            .savePage(stylesheetTmpl);
+                    WebloggerFactory.getWeblogger().flush();
+
+                    setTemplate(stylesheetTmpl);
+
+                    // success message
+                    addMessage("stylesheetEdit.create.success");
+                }
+
+                // See if we have a custom style sheet from a custom theme.
+                if (!WeblogTheme.CUSTOM.equals(getActionWeblog()
+                        .getEditorTheme())
+                        && getActionWeblog().getTheme().getStylesheet() != null) {
+
+                    ThemeTemplate override = WebloggerFactory
+                            .getWeblogger()
+                            .getWeblogManager()
+                            .getPageByLink(
+                                    getActionWeblog(),
+                                    getActionWeblog().getTheme()
+                                            .getStylesheet().getLink());
+
+                    if (override != null) {
+                        customStylesheet = true;
+                    }
+                }
+
+            } catch (WebloggerException ex) {
+                log.error(
+                        "Error finding/adding stylesheet tempalate from weblog - "
+                                + getActionWeblog().getHandle(), ex);
+            }
+        }
+    }
+
+    /**
+     * Show stylesheet edit page.
+     */
+    public String execute() {
+
+        if (getTemplate() == null) {
+            return ERROR;
+        }
+
+        try {
 
-			if (log.isDebugEnabled()) {
+            if (getTemplate().getTemplateCode(STANDARD_THEME_TYPE) != null) {
+                setContentsStandard(getTemplate().getTemplateCode(
+                        STANDARD_THEME_TYPE).getTemplate());
+            } else {
+                setContentsStandard(getTemplate().getContents());
+            }
+            if (getTemplate().getTemplateCode(MOBILE_THEME_TYPE) != null) {
+                setContentsMobile(getTemplate().getTemplateCode(
+                        MOBILE_THEME_TYPE).getTemplate());
+            }
+
+            if (log.isDebugEnabled()) {
                 log.debug("Standard: " + getContentsStandard() + " Mobile: "
                         + getContentsMobile());
             }
 
-		} catch (WebloggerException e) {
-			log.error("Error loading Weblog template codes for stylesheet", e);
-		}
-
-		return INPUT;
-	}
-
-	/**
-	 * Save an existing stylesheet.
-	 */
-	public String save() {
-
-		if (getTemplate() == null) {
-			// TODO: i18n
-			addError("Unable to locate stylesheet template");
-			return ERROR;
-		}
+        } catch (WebloggerException e) {
+            log.error("Error loading Weblog template codes for stylesheet", e);
+        }
+
+        return INPUT;
+    }
+
+    /**
+     * Save an existing stylesheet.
+     */
+    public String save() {
+
+        if (getTemplate() == null) {
+            // TODO: i18n
+            addError("Unable to locate stylesheet template");
+            return ERROR;
+        }
 
-		if (!hasActionErrors()) {
+        if (!hasActionErrors()) {
             try {
 
                 WeblogTemplate stylesheet = getTemplate();
@@ -262,28 +265,28 @@ public class StylesheetEdit extends UIAc
             }
         }
 
-		return INPUT;
-	}
+        return INPUT;
+    }
 
-	/**
-	 * Revert the stylesheet to its original state.
-	 */
-	public String revert() {
-
-		if (getTemplate() == null) {
-			// TODO: i18n
-			addError("Unable to locate stylesheet template");
-			return ERROR;
-		}
-
-		// make sure we are still using a shared theme so that reverting is
-		// possible
-		if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
-			// TODO: i18n
-			addError("stylesheetEdit.error.customTheme");
-		}
+    /**
+     * Revert the stylesheet to its original state.
+     */
+    public String revert() {
+
+        if (getTemplate() == null) {
+            // TODO: i18n
+            addError("Unable to locate stylesheet template");
+            return ERROR;
+        }
 
-		if (!hasActionErrors()) {
+        // make sure we are still using a shared theme so that reverting is
+        // possible
+        if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
+            // TODO: i18n
+            addError("stylesheetEdit.error.customTheme");
+        }
+
+        if (!hasActionErrors()) {
             try {
 
                 WeblogTemplate stylesheet = getTemplate();
@@ -338,28 +341,28 @@ public class StylesheetEdit extends UIAc
             }
         }
 
-		return execute();
-	}
+        return execute();
+    }
+
+    /**
+     * set theme to default stylesheet, ie delete it.
+     */
+    public String delete() {
+
+        if (getTemplate() == null) {
+            log.error("Unable to locate stylesheet template");
+            addError("error.recordnotfound");
+            return ERROR;
+        }
 
-	/**
-	 * set theme to default stylesheet, ie delete it.
-	 */
-	public String delete() {
-
-		if (getTemplate() == null) {
-			log.error("Unable to locate stylesheet template");
-			addError("error.recordnotfound");
-			return ERROR;
-		}
-
-		// make sure we are still using a shared theme so that deleting is
-		// possible
-		if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
-			log.error("Unable to delete stylesheet");
-			addError("stylesheetEdit.error.customTheme");
-		}
+        // make sure we are still using a shared theme so that deleting is
+        // possible
+        if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
+            log.error("Unable to delete stylesheet");
+            addError("stylesheetEdit.error.customTheme");
+        }
 
-		if (!hasActionErrors()) {
+        if (!hasActionErrors()) {
             try {
 
                 WeblogTemplate stylesheet = getTemplate();
@@ -397,92 +400,92 @@ public class StylesheetEdit extends UIAc
             }
         }
 
-		return "delete";
+        return "delete";
 
-	}
+    }
 
-	/**
-	 * Checks if is custom theme.
-	 * 
-	 * @return true, if is custom theme
-	 */
-	public boolean isCustomTheme() {
-		return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
-	}
-
-	/**
-	 * Gets the template.
-	 * 
-	 * @return the template
-	 */
-	public WeblogTemplate getTemplate() {
-		return template;
-	}
-
-	/**
-	 * Sets the template.
-	 * 
-	 * @param template
-	 *            the new template
-	 */
-	public void setTemplate(WeblogTemplate template) {
-		this.template = template;
-	}
-
-	/**
-	 * Gets the contents standard.
-	 * 
-	 * @return the contents standard
-	 */
-	public String getContentsStandard() {
-		return this.contentsStandard;
-	}
-
-	/**
-	 * Sets the contents standard.
-	 * 
-	 * @param contents
-	 *            the new contents standard
-	 */
-	public void setContentsStandard(String contents) {
-		this.contentsStandard = contents;
-	}
-
-	/**
-	 * Gets the contents mobile.
-	 * 
-	 * @return the contents mobile
-	 */
-	public String getContentsMobile() {
-		return this.contentsMobile;
-	}
-
-	/**
-	 * Sets the contents mobile.
-	 * 
-	 * @param contents
-	 *            the new contents mobile
-	 */
-	public void setContentsMobile(String contents) {
-		this.contentsMobile = contents;
-	}
-
-	/**
-	 * Checks if is custom stylesheet.
-	 * 
-	 * @return true, if checks if is custom stylesheet
-	 */
-	public boolean isCustomStylesheet() {
-		return customStylesheet;
-	}
-
-	/**
-	 * Sets the custom stylesheet.
-	 * 
-	 * @param customStylesheet
-	 *            the custom stylesheet
-	 */
-	public void setCustomStylesheet(boolean customStylesheet) {
-		this.customStylesheet = customStylesheet;
-	}
+    /**
+     * Checks if is custom theme.
+     * 
+     * @return true, if is custom theme
+     */
+    public boolean isCustomTheme() {
+        return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
+    }
+
+    /**
+     * Gets the template.
+     * 
+     * @return the template
+     */
+    public WeblogTemplate getTemplate() {
+        return template;
+    }
+
+    /**
+     * Sets the template.
+     * 
+     * @param template
+     *            the new template
+     */
+    public void setTemplate(WeblogTemplate template) {
+        this.template = template;
+    }
+
+    /**
+     * Gets the contents standard.
+     * 
+     * @return the contents standard
+     */
+    public String getContentsStandard() {
+        return this.contentsStandard;
+    }
+
+    /**
+     * Sets the contents standard.
+     * 
+     * @param contents
+     *            the new contents standard
+     */
+    public void setContentsStandard(String contents) {
+        this.contentsStandard = contents;
+    }
+
+    /**
+     * Gets the contents mobile.
+     * 
+     * @return the contents mobile
+     */
+    public String getContentsMobile() {
+        return this.contentsMobile;
+    }
+
+    /**
+     * Sets the contents mobile.
+     * 
+     * @param contents
+     *            the new contents mobile
+     */
+    public void setContentsMobile(String contents) {
+        this.contentsMobile = contents;
+    }
+
+    /**
+     * Checks if is custom stylesheet.
+     * 
+     * @return true, if checks if is custom stylesheet
+     */
+    public boolean isCustomStylesheet() {
+        return customStylesheet;
+    }
+
+    /**
+     * Sets the custom stylesheet.
+     * 
+     * @param customStylesheet
+     *            the custom stylesheet
+     */
+    public void setCustomStylesheet(boolean customStylesheet) {
+        this.customStylesheet = customStylesheet;
+    }
 }

Modified: roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java
URL: http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java?rev=1563801&r1=1563800&r2=1563801&view=diff
==============================================================================
--- roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java (original)
+++ roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java Mon Feb  3 08:49:08 2014
@@ -20,10 +20,12 @@ package org.apache.roller.weblogger.ui.s
 
 import java.util.Collections;
 import java.util.List;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.WebloggerException;
+import org.apache.roller.weblogger.business.WeblogManager;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.business.themes.SharedTheme;
 import org.apache.roller.weblogger.business.themes.ThemeManager;
@@ -42,99 +44,101 @@ import org.apache.roller.weblogger.util.
  */
 public class ThemeEdit extends UIAction {
 
-	private static Log log = LogFactory.getLog(Templates.class);
+    private static final long serialVersionUID = 4644653507344432426L;
 
-	// list of available themes
-	private List themes = Collections.EMPTY_LIST;
+    private static Log log = LogFactory.getLog(Templates.class);
 
-	// type of theme desired, either 'shared' or 'custom'
-	private String themeType = null;
+    // list of available themes
+    private List<Theme> themes = Collections.emptyList();
 
-	// the chosen shared theme id
-	private String themeId = null;
-
-	// import the selected theme to the action weblog
-	private boolean importTheme = false;
-
-	// the chosen import theme id
-	private String importThemeId = null;
-
-	// Do we have a custom stylesheet already
-	private boolean customStylesheet = false;
-
-	public ThemeEdit() {
-		this.actionName = "themeEdit";
-		this.desiredMenu = "editor";
-		this.pageTitle = "themeEditor.title";
-	}
-
-	public List<String> requiredWeblogPermissionActions() {
-		return Collections.singletonList(WeblogPermission.ADMIN);
-	}
-
-	public void myPrepare() {
-
-		ThemeManager themeMgr = WebloggerFactory.getWeblogger()
-				.getThemeManager();
-		setThemes(themeMgr.getEnabledThemesList());
-	}
-
-	public String execute() {
-
-		// set theme to current value
-		if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
-			setThemeId(null);
-		} else {
-			setThemeId(getActionWeblog().getTheme().getId());
-			setImportThemeId(getActionWeblog().getTheme().getId());
-		}
-
-		// See if we have a custom style sheet from a custom theme.
-		try {
-			if (!WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())
-					&& getActionWeblog().getTheme().getStylesheet() != null) {
-
-				ThemeTemplate override = WebloggerFactory
-						.getWeblogger()
-						.getWeblogManager()
-						.getPageByLink(
-								getActionWeblog(),
-								getActionWeblog().getTheme().getStylesheet()
-										.getLink());
-				if (override != null) {
-					customStylesheet = true;
-				}
-			}
-		} catch (WebloggerException ex) {
-			log.error("Error looking up stylesheet on weblog - "
-					+ getActionWeblog().getHandle(), ex);
-		}
-
-		if (!WebloggerRuntimeConfig
-				.getBooleanProperty("themes.customtheme.allowed")) {
-			return "input-sharedonly";
-		} else {
-			return INPUT;
-		}
-	}
-
-	/**
-	 * Save new theme configuration.
-	 */
-	public String save() {
-
-		Weblog weblog = getActionWeblog();
-
-		// we are dealing with a custom theme scenario
-		if (WeblogTheme.CUSTOM.equals(getThemeType())) {
-
-			// only continue if custom themes are allowed
-			if (WebloggerRuntimeConfig
-					.getBooleanProperty("themes.customtheme.allowed")) {
-
-				// do theme import if necessary
-				SharedTheme t = null;
-				if (isImportTheme() && !StringUtils.isEmpty(getImportThemeId())) {
+    // type of theme desired, either 'shared' or 'custom'
+    private String themeType = null;
+
+    // the chosen shared theme id
+    private String themeId = null;
+
+    // import the selected theme to the action weblog
+    private boolean importTheme = false;
+
+    // the chosen import theme id
+    private String importThemeId = null;
+
+    // Do we have a custom stylesheet already
+    private boolean customStylesheet = false;
+
+    public ThemeEdit() {
+        this.actionName = "themeEdit";
+        this.desiredMenu = "editor";
+        this.pageTitle = "themeEditor.title";
+    }
+
+    public List<String> requiredWeblogPermissionActions() {
+        return Collections.singletonList(WeblogPermission.ADMIN);
+    }
+
+    public void myPrepare() {
+
+        ThemeManager themeMgr = WebloggerFactory.getWeblogger()
+                .getThemeManager();
+        setThemes(themeMgr.getEnabledThemesList());
+    }
+
+    public String execute() {
+
+        // set theme to current value
+        if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
+            setThemeId(null);
+        } else {
+            setThemeId(getActionWeblog().getTheme().getId());
+            setImportThemeId(getActionWeblog().getTheme().getId());
+        }
+
+        // See if we have a custom style sheet from a custom theme.
+        try {
+            if (!WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())
+                    && getActionWeblog().getTheme().getStylesheet() != null) {
+
+                ThemeTemplate override = WebloggerFactory
+                        .getWeblogger()
+                        .getWeblogManager()
+                        .getPageByLink(
+                                getActionWeblog(),
+                                getActionWeblog().getTheme().getStylesheet()
+                                        .getLink());
+                if (override != null) {
+                    customStylesheet = true;
+                }
+            }
+        } catch (WebloggerException ex) {
+            log.error("Error looking up stylesheet on weblog - "
+                    + getActionWeblog().getHandle(), ex);
+        }
+
+        if (!WebloggerRuntimeConfig
+                .getBooleanProperty("themes.customtheme.allowed")) {
+            return "input-sharedonly";
+        } else {
+            return INPUT;
+        }
+    }
+
+    /**
+     * Save new theme configuration.
+     */
+    public String save() {
+
+        Weblog weblog = getActionWeblog();
+
+        // we are dealing with a custom theme scenario
+        if (WeblogTheme.CUSTOM.equals(getThemeType())) {
+
+            // only continue if custom themes are allowed
+            if (WebloggerRuntimeConfig
+                    .getBooleanProperty("themes.customtheme.allowed")) {
+
+                // do theme import if necessary
+                SharedTheme t = null;
+                if (isImportTheme() && !StringUtils.isEmpty(getImportThemeId())) {
                     try {
                         ThemeManager themeMgr = WebloggerFactory.getWeblogger()
                                 .getThemeManager();
@@ -148,7 +152,7 @@ public class ThemeEdit extends UIAction 
                     }
                 }
 
-				if (!hasActionErrors()) {
+                if (!hasActionErrors()) {
                     try {
                         weblog.setEditorTheme(WeblogTheme.CUSTOM);
                         log.debug("Saving custom theme for weblog "
@@ -181,41 +185,64 @@ public class ThemeEdit extends UIAction 
                         addError("Error setting theme");
                     }
                 }
-			} else {
-				// TODO: i18n
-				addError("Sorry, custom themes are not allowed");
-			}
-
-			// we are dealing with a shared theme scenario
-		} else if ("shared".equals(getThemeType())) {
-
-			// make sure theme is valid and enabled
-			Theme newTheme = null;
-			if (getThemeId() == null) {
-				// TODO: i18n
-				addError("No theme specified");
-
-			} else {
-				try {
-					ThemeManager themeMgr = WebloggerFactory.getWeblogger()
-							.getThemeManager();
-					newTheme = themeMgr.getTheme(getThemeId());
-
-					if (!newTheme.isEnabled()) {
-						// TODO: i18n
-						addError("Theme not enabled");
-					}
-
-				} catch (Exception ex) {
-					log.warn(ex);
-					// TODO: i18n
-					addError("Theme not found");
-				}
-			}
+            } else {
+                // TODO: i18n
+                addError("Sorry, custom themes are not allowed");
+            }
+
+            // we are dealing with a shared theme scenario
+        } else if ("shared".equals(getThemeType())) {
+
+            // make sure theme is valid and enabled
+            Theme newTheme = null;
+            if (getThemeId() == null) {
+                // TODO: i18n
+                addError("No theme specified");
+
+            } else {
+                try {
+                    ThemeManager themeMgr = WebloggerFactory.getWeblogger()
+                            .getThemeManager();
+                    newTheme = themeMgr.getTheme(getThemeId());
+
+                    if (!newTheme.isEnabled()) {
+                        // TODO: i18n
+                        addError("Theme not enabled");
+                    }
+
+                } catch (Exception ex) {
+                    log.warn(ex);
+                    // TODO: i18n
+                    addError("Theme not found");
+                }
+            }
 
-			if (!hasActionErrors()) {
+            if (!hasActionErrors()) {
                 try {
+
+                    String originalTheme = weblog.getEditorTheme();
+
+                    WeblogManager mgr = WebloggerFactory.getWeblogger()
+                            .getWeblogManager();
+
+                    // Remove old style sheet
+                    if (!originalTheme.equals(getThemeId())
+                            && getActionWeblog().getTheme().getStylesheet() != null) {
+
+                        WeblogTemplate stylesheet = mgr.getPageByLink(
+                                getActionWeblog(), getActionWeblog().getTheme()
+                                        .getStylesheet().getLink());
+
+                        if (stylesheet != null) {
+                            // Remove template and page codes
+                            mgr.removePage(stylesheet);
+                            // Reset
+                            weblog.setCustomStylesheetPath(null);
+                        }
+                    }
+
                     weblog.setEditorTheme(getThemeId());
+
                     log.debug("Saving theme " + getThemeId() + " for weblog "
                             + weblog.getHandle());
 
@@ -228,9 +255,10 @@ public class ThemeEdit extends UIAction 
                     // change
                     CacheManager.invalidate(weblog);
 
-                    // TODO: i18n
-                    addMessage("Successfully set theme to - "
-                            + newTheme.getName());
+                    // Theme set to..
+                    if (!originalTheme.equals(getThemeId())) {
+                        addMessage("themeEditor.settheme", newTheme.getName());
+                    }
 
                 } catch (WebloggerException re) {
                     log.error("Error saving weblog - "
@@ -239,91 +267,91 @@ public class ThemeEdit extends UIAction 
                 }
             }
 
-			// unknown theme scenario, error
-		} else {
-			// invalid theme type
-			// TODO: i18n
-			addError("no valid theme type submitted");
-		}
-
-		return execute();
-	}
-
-	public boolean isCustomTheme() {
-		return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
-	}
-
-	// has this weblog had a custom theme before?
-	public boolean isFirstCustomization() {
-		try {
-			return (WebloggerFactory
-					.getWeblogger()
-					.getWeblogManager()
-					.getPageByAction(getActionWeblog(),
-							WeblogTemplate.ACTION_WEBLOG) == null);
-		} catch (WebloggerException ex) {
-			log.error("Error looking up weblog template", ex);
-		}
-		return false;
-	}
-
-	public List getThemes() {
-		return themes;
-	}
-
-	public void setThemes(List themes) {
-		this.themes = themes;
-	}
-
-	public String getThemeType() {
-		return themeType;
-	}
-
-	public void setThemeType(String themeType) {
-		this.themeType = themeType;
-	}
-
-	public String getThemeId() {
-		return themeId;
-	}
-
-	public void setThemeId(String theme) {
-		this.themeId = theme;
-	}
-
-	public boolean isImportTheme() {
-		return importTheme;
-	}
-
-	public void setImportTheme(boolean importTheme) {
-		this.importTheme = importTheme;
-	}
-
-	public String getImportThemeId() {
-		return importThemeId;
-	}
-
-	public void setImportThemeId(String importThemeId) {
-		this.importThemeId = importThemeId;
-	}
-
-	/**
-	 * Checks if we have a custom stylesheet.
-	 * 
-	 * @return true, if checks if is custom stylesheet
-	 */
-	public boolean isCustomStylesheet() {
-		return customStylesheet;
-	}
-
-	/**
-	 * Sets the custom stylesheet.
-	 * 
-	 * @param customStylesheet
-	 *            the custom stylesheet
-	 */
-	public void setCustomStylesheet(boolean customStylesheet) {
-		this.customStylesheet = customStylesheet;
-	}
+            // unknown theme scenario, error
+        } else {
+            // invalid theme type
+            // TODO: i18n
+            addError("no valid theme type submitted");
+        }
+
+        return execute();
+    }
+
+    public boolean isCustomTheme() {
+        return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
+    }
+
+    // has this weblog had a custom theme before?
+    public boolean isFirstCustomization() {
+        try {
+            return (WebloggerFactory
+                    .getWeblogger()
+                    .getWeblogManager()
+                    .getPageByAction(getActionWeblog(),
+                            WeblogTemplate.ACTION_WEBLOG) == null);
+        } catch (WebloggerException ex) {
+            log.error("Error looking up weblog template", ex);
+        }
+        return false;
+    }
+
+    public List<Theme> getThemes() {
+        return themes;
+    }
+
+    public void setThemes(List<Theme> themes) {
+        this.themes = themes;
+    }
+
+    public String getThemeType() {
+        return themeType;
+    }
+
+    public void setThemeType(String themeType) {
+        this.themeType = themeType;
+    }
+
+    public String getThemeId() {
+        return themeId;
+    }
+
+    public void setThemeId(String theme) {
+        this.themeId = theme;
+    }
+
+    public boolean isImportTheme() {
+        return importTheme;
+    }
+
+    public void setImportTheme(boolean importTheme) {
+        this.importTheme = importTheme;
+    }
+
+    public String getImportThemeId() {
+        return importThemeId;
+    }
+
+    public void setImportThemeId(String importThemeId) {
+        this.importThemeId = importThemeId;
+    }
+
+    /**
+     * Checks if we have a custom stylesheet.
+     * 
+     * @return true, if checks if is custom stylesheet
+     */
+    public boolean isCustomStylesheet() {
+        return customStylesheet;
+    }
+
+    /**
+     * Sets the custom stylesheet.
+     * 
+     * @param customStylesheet
+     *            the custom stylesheet
+     */
+    public void setCustomStylesheet(boolean customStylesheet) {
+        this.customStylesheet = customStylesheet;
+    }
 
 }

Modified: roller/trunk/app/src/main/resources/ApplicationResources.properties
URL: http://svn.apache.org/viewvc/roller/trunk/app/src/main/resources/ApplicationResources.properties?rev=1563801&r1=1563800&r2=1563801&view=diff
==============================================================================
--- roller/trunk/app/src/main/resources/ApplicationResources.properties (original)
+++ roller/trunk/app/src/main/resources/ApplicationResources.properties Mon Feb  3 08:49:08 2014
@@ -1266,7 +1266,7 @@ pagesForm.subtitle=Manage templates that
 pagesForm.tip=You can edit the templates that define the layout, colors and \
 fonts of your weblog. You can also create new templates to define entirely \
 new pages. This is for advanced users only, if you''re not comfortable \
-with HTML, you might want to leave your templates alone.
+with HTML, you might want to leave your templates alone.  Please <b>backup</b> your templates!
 
 pageForm.advancedSettings=Advanced Settings
 pagesForm.name=Name
@@ -1631,7 +1631,7 @@ stylesheetEdit.title=Stylesheet
 stylesheetEdit.subtitle=Edit weblog custom stylesheet
 stylesheetEdit.tip=This form allows you to edit the stylesheet for your theme.
 stylesheetEdit.revertTip=If you run into any problems you don''t know how to \
-fix you can start over at any time by clicking the restore button.
+fix you can start over at any time by clicking the restore button.  Please <b>backup</b> your stylesheet!
 stylesheetEdit.revertTip1=<font color="red">If you have not customized your stylesheet here, \
 please use the <em>Shared Theme</em> default by clicking the delete stylesheet button. \
 This will ensure you are using the latest version and any changes will be picked up.</font> 
@@ -1645,11 +1645,12 @@ Unfortunately, the theme you''re using d
 stylesheet for you to edit. You can customize your theme or contact \
 your system administrator to see about enabling this feature.
 
+stylesheetEdit.create.success=Custom stylesheet created successfully.
 stylesheetEdit.save.success=Stylesheet updated successfully.
 stylesheetEdit.revert.success=Stylesheet reverted successfully.
 stylesheetEdit.default.success=Stylesheet deleted successfully.  Your theme is now using the Shared Theme default.
 stylesheetEdit.default.noStylesheetOverride=Note: clicking the stylesheet tab will \
-recreate your custom override stylesheet again from the theme default!
+recreate your custom override stylesheet again from the theme default.
 
 stylesheetEdit.error.customTheme=Cannot revert stylesheet on custom themes.
 stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet?
@@ -1767,6 +1768,7 @@ Please select the theme you would like t
 
 themeEditor.save=Update Theme
 
+themeEditor.settheme=Successfully set theme to - {0}
 
 # ---------------------------------------------------------------------- Uploads
 

Modified: roller/trunk/app/src/main/webapp/roller-ui/styles/roller.css
URL: http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/roller-ui/styles/roller.css?rev=1563801&r1=1563800&r2=1563801&view=diff
==============================================================================
--- roller/trunk/app/src/main/webapp/roller-ui/styles/roller.css (original)
+++ roller/trunk/app/src/main/webapp/roller-ui/styles/roller.css Mon Feb  3 08:49:08 2014
@@ -482,11 +482,7 @@ Error and status message styles
     border: 1px solid #f0c000;
 }
 div.notification {
-    width: 80%;
-    margin-left: auto;
-    margin-right: auto;
-    padding: 25px;
-    font-size: larger;
+    padding: 10px;
     background-color: #ffffce;
     border: 1px solid #f0c000;
 }