Author: gmazza
Date: Mon Jul 14 20:22:00 2014
New Revision: 1610513

URL: http://svn.apache.org/r1610513
Log:
ROL-2038 only dual themes have two tabs for mobile and standard, all others 
just standard.

Modified:
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadata.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadataParser.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/WeblogCustomTheme.java
    roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/Theme.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogWrapper.java
    
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/TemplateEditBean.java
    
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
    roller/trunk/app/src/main/resources/sql/createdb.vm
    roller/trunk/app/src/main/resources/sql/droptables.sql
    roller/trunk/app/src/main/resources/sql/macros.vm
    roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp
    roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp
    roller/trunk/app/src/main/webapp/themes/basicmobile/theme.xml

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
 Mon Jul 14 20:22:00 2014
@@ -205,10 +205,12 @@ public class SharedThemeFromDir extends 
                     themeMetadata.getPreviewImage(), previewFile);
         }
 
-        // avaialble types in the Roller
+        // available types with Roller
         List<String> availableTypesList = new ArrayList<String>();
         availableTypesList.add("standard");
-        availableTypesList.add("mobile");
+        if (themeMetadata.getDualTheme()) {
+            availableTypesList.add("mobile");
+        }
 
         // load stylesheet if possible
         if (themeMetadata.getStylesheet() != null) {
@@ -225,8 +227,8 @@ public class SharedThemeFromDir extends 
             if (standardTemplateCode == null && mobileTemplateCode == null) {
                 throw new ThemeInitializationException(
                         "Error in getting template codes for template");
-            } else if (mobileTemplateCode == null) {
-                // cloning the standard template code if no mobile is present
+            } else if (mobileTemplateCode == null && 
themeMetadata.getDualTheme()) {
+                // clone the standard template code if no mobile is present
                 mobileTemplateCode = new ThemeMetadataTemplateCode();
                 mobileTemplateCode.setContentsFile(standardTemplateCode
                         .getContentsFile());
@@ -330,7 +332,7 @@ public class SharedThemeFromDir extends 
             if (standardTemplateCode == null && mobileTemplateCode == null) {
                 throw new ThemeInitializationException(
                         "Error in getting template codes for template");
-            } else if (mobileTemplateCode == null) {
+            } else if (mobileTemplateCode == null && 
themeMetadata.getDualTheme()) {
                 // cloning the standard template code if no mobile is present
                 mobileTemplateCode = new ThemeMetadataTemplateCode();
                 mobileTemplateCode.setContentsFile(standardTemplateCode

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
 Mon Jul 14 20:22:00 2014
@@ -58,7 +58,7 @@ import org.apache.roller.weblogger.util.
  * Base implementation of a ThemeManager.
  * 
  * This particular implementation reads theme data off the filesystem and
- * assumes that those themes are not changable at runtime.
+ * assumes that those themes are not changeable at runtime.
  */
 @com.google.inject.Singleton
 public class ThemeManagerImpl implements ThemeManager {

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadata.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadata.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadata.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadata.java
 Mon Jul 14 20:22:00 2014
@@ -31,6 +31,7 @@ public class ThemeMetadata {
     private String description = null;
     private String author = null;
     private String previewImage = null;
+    private Boolean dualTheme = false;
     private ThemeMetadataTemplate stylesheet = null;
     private Set<ThemeMetadataTemplate> templates = new 
HashSet<ThemeMetadataTemplate>();
     private Set<String> resources = new HashSet<String>();
@@ -110,4 +111,11 @@ public class ThemeMetadata {
         this.stylesheet = stylesheet;
     }
 
+    public Boolean getDualTheme() {
+        return dualTheme;
+    }
+
+    public void setDualTheme(Boolean dualTheme) {
+        this.dualTheme = dualTheme;
+    }
 }

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadataParser.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadataParser.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadataParser.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeMetadataParser.java
 Mon Jul 14 20:22:00 2014
@@ -60,6 +60,9 @@ public class ThemeMetadataParser {
         theme.setDescription(root.getChildText("description"));
         theme.setAuthor(root.getChildText("author"));
 
+        // dual-theme (standard & mobile) or one-theme-fits-all?
+        
theme.setDualTheme("true".equalsIgnoreCase(root.getChildText("dualTheme")));
+
         // if either id or name is null then throw a parsing exception
         if(StringUtils.isEmpty(theme.getId()) || 
StringUtils.isEmpty(theme.getName())) {
             throw new ThemeParsingException("'id' and 'name' are required 
theme elements");

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/WeblogCustomTheme.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/WeblogCustomTheme.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/WeblogCustomTheme.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/business/themes/WeblogCustomTheme.java
 Mon Jul 14 20:22:00 2014
@@ -72,7 +72,7 @@ public class WeblogCustomTheme extends W
     /**
      * Get the collection of all templates associated with this Theme.
      */
-    public List getTemplates() throws WebloggerException {
+    public List<? extends ThemeTemplate> getTemplates() throws 
WebloggerException {
         return 
WebloggerFactory.getWeblogger().getWeblogManager().getPages(this.weblog);
     }
     

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/Theme.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/Theme.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/Theme.java 
(original)
+++ roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/Theme.java 
Mon Jul 14 20:22:00 2014
@@ -62,7 +62,7 @@ public interface Theme {
     /**
      * Get the list of all templates associated with this Theme.
      */
-    List<ThemeTemplate> getTemplates() throws WebloggerException;
+    List<? extends ThemeTemplate> getTemplates() throws WebloggerException;
     
     
     /**

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogWrapper.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogWrapper.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogWrapper.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogWrapper.java
 Mon Jul 14 20:22:00 2014
@@ -80,7 +80,7 @@ public final class WeblogWrapper {
     
     
     public List<ThemeTemplateWrapper> getPages() throws WebloggerException {
-        List<ThemeTemplate> unwrapped = this.pojo.getTheme().getTemplates();
+        List<? extends ThemeTemplate> unwrapped = 
this.pojo.getTheme().getTemplates();
         List<ThemeTemplateWrapper> wrapped = new 
ArrayList<ThemeTemplateWrapper>(unwrapped.size());
 
         int i = 0;

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=1610513&r1=1610512&r2=1610513&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 Jul 14 20:22:00 2014
@@ -112,26 +112,25 @@ public class StylesheetEdit extends UIAc
                             .getContents());
                     standardTemplateCode.setTemplateLanguage(stylesheetTmpl
                             .getTemplateLanguage());
-
-                    TemplateCode tCode = stylesheet
-                            .getTemplateCode(MOBILE_THEME_TYPE);
-
-                    WeblogThemeTemplateCode mobileTemplateCode = new 
WeblogThemeTemplateCode(
-                            stylesheetTmpl.getId(), MOBILE_THEME_TYPE);
-                    mobileTemplateCode.setTemplate(tCode.getTemplate());
-                    mobileTemplateCode.setTemplateLanguage(tCode
-                            .getTemplateLanguage());
-
                     WebloggerFactory.getWeblogger().getWeblogManager()
                             .saveTemplateCode(standardTemplateCode);
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveTemplateCode(mobileTemplateCode);
+
+                    TemplateCode tCode = 
stylesheet.getTemplateCode(MOBILE_THEME_TYPE);
+                    if (tCode != null) {
+                        WeblogThemeTemplateCode mobileTemplateCode = new 
WeblogThemeTemplateCode(
+                                stylesheetTmpl.getId(), MOBILE_THEME_TYPE);
+                        mobileTemplateCode.setTemplate(tCode.getTemplate());
+                        mobileTemplateCode.setTemplateLanguage(tCode
+                                .getTemplateLanguage());
+                        WebloggerFactory.getWeblogger().getWeblogManager()
+                                .saveTemplateCode(mobileTemplateCode);
+                    }
 
                     WebloggerFactory.getWeblogger().getWeblogManager()
                             .savePage(stylesheetTmpl);
+                    setTemplate(stylesheetTmpl);
                     WebloggerFactory.getWeblogger().flush();
 
-                    setTemplate(stylesheetTmpl);
 
                     // success message
                     addMessage("stylesheetEdit.create.success");
@@ -234,11 +233,6 @@ public class StylesheetEdit extends UIAc
                     WeblogThemeTemplateCode tc = stylesheet
                             .getTemplateCode(MOBILE_THEME_TYPE);
                     tc.setTemplate(getContentsMobile());
-                } else {
-                    WeblogThemeTemplateCode tc = new WeblogThemeTemplateCode(
-                            stylesheet.getId(), MOBILE_THEME_TYPE);
-                    // empty, we've got no default mobile template
-                    tc.setTemplate("");
                     WebloggerFactory.getWeblogger().getWeblogManager()
                             .saveTemplateCode(tc);
                 }

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEditBean.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEditBean.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEditBean.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEditBean.java
 Mon Jul 14 20:22:00 2014
@@ -167,11 +167,6 @@ public class TemplateEditBean {
         if (dataHolder.getTemplateCode("mobile") != null) {
             WeblogThemeTemplateCode tc = dataHolder.getTemplateCode("mobile");
             tc.setTemplate(contentsMobile);
-        } else {
-            WeblogThemeTemplateCode tc = new 
WeblogThemeTemplateCode(dataHolder.getId(), "mobile");
-            // empty, we've got no default mobile template
-            tc.setTemplate("");
-            
WebloggerFactory.getWeblogger().getWeblogManager().saveTemplateCode(tc);
         }
 
         // the rest of the template properties can only be modified when

Modified: 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
 (original)
+++ 
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
 Mon Jul 14 20:22:00 2014
@@ -175,19 +175,19 @@ public class Templates extends UIAction 
                 // Create weblog template codes for available types.
                 WeblogThemeTemplateCode standardTemplCode = new 
WeblogThemeTemplateCode(
                         newTemplate.getId(), "standard");
-                WeblogThemeTemplateCode mobileTemplCode = new 
WeblogThemeTemplateCode(
-                        newTemplate.getId(), "mobile");
-
                 standardTemplCode.setTemplate(newTemplate.getContents());
                 standardTemplCode.setTemplateLanguage("velocity");
+                WebloggerFactory.getWeblogger().getWeblogManager()
+                        .saveTemplateCode(standardTemplCode);
 
+                /* TBI -- need a way for user to specify dual or single 
template
+                WeblogThemeTemplateCode mobileTemplCode = new 
WeblogThemeTemplateCode(
+                        newTemplate.getId(), "mobile");
                 mobileTemplCode.setTemplate(newTemplate.getContents());
                 mobileTemplCode.setTemplateLanguage("velocity");
-
-                WebloggerFactory.getWeblogger().getWeblogManager()
-                        .saveTemplateCode(standardTemplCode);
                 WebloggerFactory.getWeblogger().getWeblogManager()
                         .saveTemplateCode(mobileTemplCode);
+                */
 
                 // if this person happened to create a Weblog template from
                 // scratch then make sure and set the defaultPageId. What does

Modified: roller/trunk/app/src/main/resources/sql/createdb.vm
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/resources/sql/createdb.vm?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/resources/sql/createdb.vm (original)
+++ roller/trunk/app/src/main/resources/sql/createdb.vm Mon Jul 14 20:22:00 2014
@@ -531,13 +531,6 @@ alter table autoping add constraint ap_w
 alter table autoping add constraint ap_pingtargetid_fk
     foreign key (pingtargetid) references pingtarget(id) $!db.ADDL_FK_PARAMS ;
 
-
--- THE FOLLOWING CONSTRAINTS CAN NOT BE SUPPORTED FOR IMPORTING new-user.xml
--- alter table website add constraint website_defaultpageid_fk foreign key ( 
defaultpageid ) references webpage ( id );
--- alter table website add constraint website_weblogdayid_fk foreign key ( 
weblogdayid ) references webpage ( id );
--- alter table webpage add constraint webpage_websiteid_fk foreign key ( 
websiteid ) references website( id );
-
-
 -- oauth indexes
 
 create index oc_username_idx  on roller_oauthconsumer( username$!db.INDEXSIZE 
);

Modified: roller/trunk/app/src/main/resources/sql/droptables.sql
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/resources/sql/droptables.sql?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/resources/sql/droptables.sql (original)
+++ roller/trunk/app/src/main/resources/sql/droptables.sql Mon Jul 14 20:22:00 
2014
@@ -50,7 +50,6 @@ drop table entryattribute;
 drop table weblogentry;
 drop table weblogcategory;
 drop table webpage;
-drop table roller_weblogtheme;
 drop table roller_templatecode;
 
 -- core platform tables

Modified: roller/trunk/app/src/main/resources/sql/macros.vm
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/resources/sql/macros.vm?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/resources/sql/macros.vm (original)
+++ roller/trunk/app/src/main/resources/sql/macros.vm Mon Jul 14 20:22:00 2014
@@ -82,6 +82,20 @@ Define non-null column with default valu
 #end
 #end
 
+#**
+Rename a table.
+For Derby, will not work if there is a view or foreign key that references the 
table.
+MySQL requires sp_rename command; unsure if works.
+**#
+#macro(renameTable $oldTableName $newTableName)
+#if ($db.DBTYPE == 'POSTGRESQL' || $db.DBTYPE == 'HSQLDB')
+alter table $oldTableName rename to $newTableName;
+#elseif ($db.DBTYPE == 'MYSQL')
+sp_rename '$oldTableName', '$newTableName';
+#else
+rename table $oldTableName TO $newTableName;
+#end
+#end
 
 #**
 Macro to account for lack of comparable long varchar in MySQL

Modified: 
roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp 
(original)
+++ roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp Mon 
Jul 14 20:22:00 2014
@@ -66,15 +66,19 @@
     <div id="template-code-tabs">
     <ul>
         <li class="selected"><a href="#tabStandard"><em>Standard</em></a></li>
-        <li><a href="#tabMobile"><em>Mobile</em></a></li>
-    </ul>            
+        <s:if test="contentsMobile != null">
+            <li><a href="#tabMobile"><em>Mobile</em></a></li>
+        </s:if>
+    </ul>
     <div>
         <div id="tabStandard">
             <s:textarea name="contentsStandard" cols="80" rows="30" 
cssStyle="width:100%" />
         </div>
-        <div id="tabMobile">
-            <s:textarea name="contentsMobile" cols="80" rows="30" 
cssStyle="width:100%" />
-        </div>
+        <s:if test="contentsMobile != null">
+            <div id="tabMobile">
+                <s:textarea name="contentsMobile" cols="80" rows="30" 
cssStyle="width:100%" />
+            </div>
+        </s:if>
     </div>
     </div>
     

Modified: roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp 
(original)
+++ roller/trunk/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp Mon 
Jul 14 20:22:00 2014
@@ -101,16 +101,19 @@
     <div id="template-code-tabs">
     <ul>
         <li class="selected"><a href="#tabStandard"><em>Standard</em></a></li>
-        <li><a href="#tabMobile"><em>Mobile</em></a></li>
-    </ul>            
+        <s:if test="bean.contentsMobile != null">
+            <li><a href="#tabMobile"><em>Mobile</em></a></li>
+        </s:if>
+    </ul>
     <div>
         <div id="tabStandard">
             <s:textarea name="bean.contentsStandard" cols="80" rows="30" 
cssStyle="width:100%" />
-
-        </div>
-        <div id="tabMobile">
-            <s:textarea name="bean.contentsMobile" cols="80" rows="30" 
cssStyle="width:100%" />
         </div>
+        <s:if test="bean.contentsMobile != null">
+            <div id="tabMobile">
+                <s:textarea name="bean.contentsMobile" cols="80" rows="30" 
cssStyle="width:100%" />
+            </div>
+        </s:if>
     </div>
     </div>
 

Modified: roller/trunk/app/src/main/webapp/themes/basicmobile/theme.xml
URL: 
http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/themes/basicmobile/theme.xml?rev=1610513&r1=1610512&r2=1610513&view=diff
==============================================================================
--- roller/trunk/app/src/main/webapp/themes/basicmobile/theme.xml (original)
+++ roller/trunk/app/src/main/webapp/themes/basicmobile/theme.xml Mon Jul 14 
20:22:00 2014
@@ -5,7 +5,9 @@
     <name>Basic Mobile</name>
     <description>Offers wide margins for blogging programming language source 
code and a separate button for mobile viewing.</description>
     <author>Roller Weblogger</author>
-    <multiLayout>true</multiLayout>
+    <!-- dualTheme: Maintain separate mobile & standard templates and 
stylesheets, default false,
+         not needed with responsive themes or where multi-device support is 
not a concern. -->
+    <dualTheme>true</dualTheme>
     
     <!-- theme preview image -->
     <preview-image path="basic-preview.png" />


Reply via email to