[rkward/releases/0.6.4] packages/rkwarddev: updated export plugin

m.eik michalke meik.michalke at uni-duesseldorf.de
Sat Dec 5 18:26:00 UTC 2015


Git commit 4c4262917a36132bd9ca0d9beaeb94e9fb1b14da by m.eik michalke.
Committed on 05/12/2015 at 18:04.
Pushed by meikm into branch 'releases/0.6.4'.

updated export plugin

  - added some of the new features to the generated code
  - fixed some layout and comma issues

M  +58   -19   packages/rkwarddev/demo/skeleton_dialog.R
M  +2    -2    packages/rkwarddev/inst/rkward/RKWardPluginSkeleton.pluginmap
M  +130  -118  packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.js
M  +11   -3    packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.rkh
M  +17   -6    packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.xml

http://commits.kde.org/rkward/4c4262917a36132bd9ca0d9beaeb94e9fb1b14da

diff --git a/packages/rkwarddev/demo/skeleton_dialog.R b/packages/rkwarddev/demo/skeleton_dialog.R
index c40ebad..57257a5 100644
--- a/packages/rkwarddev/demo/skeleton_dialog.R
+++ b/packages/rkwarddev/demo/skeleton_dialog.R
@@ -1,8 +1,8 @@
 ## create dialog to build a plugin skeleton
 require(rkwarddev)
-rkwarddev.required("0.07-4")
+rkwarddev.required("0.08-1")
 
-local({
+rk.local({
 # define where the plugin should write its files
 output.dir <- tempdir()
 # overwrite an existing plugin in output.dir?
@@ -23,7 +23,7 @@ about.info <- rk.XML.about(
   about=list(desc="GUI interface to create RKWard plugin skeletons",
     # the version number should be in line with rkwarddev
     # to reflect when the script code was changed
-    version="0.07-4", url="http://rkward.kde.org")
+    version="0.08-1", url="http://rkward.kde.org")
   )
 dependencies.info <- rk.XML.dependencies(dependencies=list(rkward.min="0.6.0"))
 
@@ -105,6 +105,7 @@ aboutContact <- rk.XML.frame(
         optcolAuthorCre <- rk.XML.optioncolumn(connect=authorCre, modifier="state", id.name="optcolAuthorCre"),
         optcolAuthorCtb <- rk.XML.optioncolumn(connect=authorCtb, modifier="state", id.name="optcolAuthorCtb")
       ),
+      min_rows=1,
       logic=rk.XML.logic(
         rk.XML.connect(governor=authorCre, client=authorMail, set="required")
       ),
@@ -130,6 +131,8 @@ createOptionsFrame <- rk.XML.frame(
           help="If this is checked, a wizard section will be included in the skeleton."),
         addTests <- rk.XML.cbox("Include plugin tests", chk=TRUE, id.name="addTests",
           help="If this is checked, plugin tests will be included in the skeleton."),
+        showPlugin <- rk.XML.cbox("Show the plugin", chk=FALSE, id.name="showPlugin",
+          help="If this is checked, the generated plugin will be shown (opened) for you to see what it looks like."),
         rk.XML.stretch()),
       rk.XML.col(
         editPlugin <- rk.XML.cbox("Open files for editing", chk=TRUE, id.name="editPlugin",
@@ -137,15 +140,33 @@ createOptionsFrame <- rk.XML.frame(
         addToConfig <- rk.XML.cbox("Add plugin to RKWard configuration", chk=TRUE, id.name="addToConfig",
           help="If this is checkend, the generated plugin will automatically be registered in RKWard's configuration.
             If you store it in a temporary directory and remove it before the next start of RKWard, the entry will removed again as well."),
-        showPlugin <- rk.XML.cbox("Show the plugin", chk=FALSE, id.name="showPlugin",
-          help="If this is checked, the generated plugin will be shown (opened) for you to see what it looks like."),
         guessGetters <- rk.XML.cbox("Guess getter functions (RKWard >= 0.6.0)", chk=FALSE, id.name="guessGetters",
           help="If this is checked, rkwarddev tries to select the optimal getter functions to get data from the dialog into the R code. The plugin then requires RKWard >= 0.6.0."),
+        emptyElse <- rk.XML.cbox("Keep empty 'else {}'",
+          id.name="emptyElse",
+          help="Some consider it an enhancement for code readability if every \"if\" condition has an \"else\" clause, even if it is empty.
+            If you check this option, the generated JS code will keep these empty \"else\" clauses."
+        ),
         rk.XML.stretch())
     ),
     rk.XML.frame(
-      rk.XML.row(menuHier <- rk.XML.dropdown("Place in top menu",
-        options=list(
+      rk.XML.row(
+        codeIndent <- rk.XML.dropdown("Code indentation",
+          options=list(
+            "Tabs"=c(val="\\t", chk=TRUE),
+            "Single space"=c(val=" "),
+            "Two spaces"=c(val="  "),
+            "Four spaces"=c(val="    ")
+          ),
+          id.name="codeIndent",
+          help="Define how the generated code should be indented (by tabs or space characters)."
+        )
+      )
+    ),
+    rk.XML.frame(
+      rk.XML.row(
+        menuHier <- rk.XML.dropdown("Place in top menu",
+          options=list(
             "Test (created if needed)"=c(val="test", chk=TRUE),
             "File"=c(val="file"),
             "Edit"=c(val="edit"),
@@ -159,12 +180,13 @@ createOptionsFrame <- rk.XML.frame(
             "Windows"=c(val="windows"),
             "Settings"=c(val="settings"),
             "Help"=c(val="help")
+          ),
+          id.name="menuHier",
+          help="Specify where the plugin should appear in RKWard's top menus."
         ),
-        id.name="menuHier",
-        help="Specify where the plugin should appear in RKWard's top menus."
-      ),
-      menuName <- rk.XML.input("Name in menu (plugin name if empty)", id.name="menuName",
-        help="You can set the exact entry name of your main component in the menu here. If left empty, the plugin name will be used as default.")
+        menuName <- rk.XML.input("Name in menu (plugin name if empty)", id.name="menuName",
+          help="You can set the exact entry name of your main component in the menu here. If left empty, the plugin name will be used as default."
+        )
       )
     ),
     id.name="createOptionsFrame"
@@ -288,7 +310,7 @@ js.opt.about.about <- rk.JS.options("optAbout",
     } else {},
     keep.ite=TRUE
   ),
-  funct="list", option="about", collapse=",\\n\\t")
+  funct="list", option="about", collapse=",\\n\\t", opt.sep=",\\n\\t")
 # dependencies section
 js.frm.dependencyFrame <- rk.JS.vars(dependencyFrame, modifiers="checked") # see to it frame is checked
 js.opt.about.dep <- rk.JS.options("optDependencies",
@@ -363,8 +385,8 @@ js.opt.skeleton <- rk.JS.options("optSkeleton",
   collapse="")
 
 JS.prepare <- rk.paste.JS(
-  rk.JS.vars(outDir, overwrite, guessGetters),
-  echo("rkwarddev.required(\"0.07-4\")"),
+  rk.JS.vars(outDir, overwrite, guessGetters, codeIndent, emptyElse),
+  echo("rkwarddev.required(\"0.08-1\")"),
   echo("\n\n# define where the plugin should write its files\noutput.dir <- "),
   js(
     if(outDir){
@@ -383,8 +405,19 @@ JS.prepare <- rk.paste.JS(
       echo("TRUE")
     } else {
       echo("FALSE")
+    },
+    echo("\n# define the indentation character for the generated code\nrk.set.indent(by=\"", codeIndent,"\")",
+      "\n# should empty \"else\" clauses be kept in the JavaScript code?\nrk.set.empty.e("),
+    if(emptyElse){
+      echo("TRUE)")
+    } else {
+      echo("FALSE)")
     }
   ),
+  echo(
+    "\n# make your plugin translatable by setting this to TRUE",
+    "\nupdate.translations <- FALSE"
+  ),
   echo("\n\n"),
   level=2)
   
@@ -397,14 +430,14 @@ JS.calculate <- rk.paste.JS(
   echo("aboutPlugin <- rk.XML.about("),
     js(
       if(pluginName){
-        echo("\n\tname=\"", pluginName, "\"")
+        echo("\n\tname=\"", pluginName, "\",\n")
       } else {}
     ),
     # author section
     rk.JS.optionset(optionsetAuthors, vars=TRUE, guess.getter=TRUE),
     ite(id(optcolAuthorGivenName, " != \"\""),
       rk.paste.JS(
-        echo("\tauthor=c(\n\t\t\t"),
+        echo("\tauthor=c(\n\t\t"),
         rk.JS.optionset(optionsetAuthors,
           js.optionsetAuthors.role <- rk.JS.options("optAuthorRole",
             .ite=js(
@@ -435,9 +468,9 @@ JS.calculate <- rk.paste.JS(
             level=3
           ),
           echo(")"),
-          collapse=",\\n\\t\\t\\t"
+          collapse=",\\n\\t\\t"
         ),
-        echo("\n\t\t),\n")
+        echo("\n\t)")
       )
     ),
     echo(js.opt.about.about),
@@ -533,6 +566,12 @@ JS.calculate <- rk.paste.JS(
   echo("\n\t#components=list(),"),
   echo(js.opt.skeleton),
   echo("\n)\n\n"),
+  echo(
+    "\t# you can make your plugin translatable, see top of script",
+    "\n\tif(isTRUE(update.translations)){",
+    "\n\t\trk.updatePluginMessages(file.path(output.dir,\"", pluginName, "\",\"inst\",\"rkward\",\"", pluginName, ".pluginmap\"))",
+    "\n\t} else {}\n\n"
+  ),
   level=2)
 
 ############
diff --git a/packages/rkwarddev/inst/rkward/RKWardPluginSkeleton.pluginmap b/packages/rkwarddev/inst/rkward/RKWardPluginSkeleton.pluginmap
index 09cc3ca..fc8c569 100644
--- a/packages/rkwarddev/inst/rkward/RKWardPluginSkeleton.pluginmap
+++ b/packages/rkwarddev/inst/rkward/RKWardPluginSkeleton.pluginmap
@@ -18,8 +18,8 @@
     name="RKWard Plugin Skeleton"
     shortinfo="GUI interface to create RKWard plugin skeletons"
     longinfo="GUI interface to create RKWard plugin skeletons"
-    version="0.07-4"
-    releasedate="2015-11-24"
+    version="0.08-1"
+    releasedate="2015-12-05"
     url="http://rkward.kde.org"
     license="GPL (>= 3)"
   >
diff --git a/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.js b/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.js
index 366c556..5408c14 100644
--- a/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.js
+++ b/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.js
@@ -12,7 +12,9 @@ function preprocess(){
   var outDir = getValue("outDir");
   var overwrite = getValue("overwrite");
   var guessGetters = getValue("guessGetters");
-  echo("rkwarddev.required(\"0.07-4\")");
+  var codeIndent = getValue("codeIndent");
+  var emptyElse = getValue("emptyElse");
+  echo("rkwarddev.required(\"0.08-1\")");
   echo("\n\n# define where the plugin should write its files\noutput.dir <- ");
   if(outDir) {
     echo("\"" + outDir + "\"");  
@@ -31,6 +33,13 @@ function preprocess(){
   } else {
     echo("FALSE");  
   }
+  echo("\n# define the indentation character for the generated code\nrk.set.indent(by=\"" + codeIndent + "\")" + "\n# should empty \"else\" clauses be kept in the JavaScript code?\nrk.set.empty.e(");
+  if(emptyElse) {
+    echo("TRUE)");  
+  } else {
+    echo("FALSE)");  
+  }
+  echo("\n# make your plugin translatable by setting this to TRUE" + "\nupdate.translations <- FALSE");
   echo("\n\n");
 }
 
@@ -53,6 +62,7 @@ function calculate(){
   var ocolOptcolAuthorCre = getList("optionsetAuthors.optcolAuthorCre");
   var ocolOptcolAuthorCtb = getList("optionsetAuthors.optcolAuthorCtb");
   var outDir = getString("outDir");
+  var codeIndent = getString("codeIndent");
   var menuHier = getString("menuHier");
   var menuName = getString("menuName");
   var RKMin = getString("RKMin");
@@ -75,77 +85,78 @@ function calculate(){
   var overwrite = getBoolean("overwrite.state");
   var addWizard = getBoolean("addWizard.state");
   var addTests = getBoolean("addTests.state");
+  var showPlugin = getBoolean("showPlugin.state");
   var editPlugin = getBoolean("editPlugin.state");
   var addToConfig = getBoolean("addToConfig.state");
-  var showPlugin = getBoolean("showPlugin.state");
   var guessGetters = getBoolean("guessGetters.state");
+  var emptyElse = getBoolean("emptyElse.state");
   var dependencyFrameChecked = getBoolean("dependencyFrame.checked");
   var helpTextChecked = getBoolean("helpText.checked");
 
   // the R code to be evaluated
   // define the array arrOptAbout for values of R option "about"
   var arrOptAbout = new Array();
-    if(pluginDescription) {
-      arrOptAbout.push("desc=\"" + pluginDescription + "\""  );
-    } else {
-      arrOptAbout.push();
-    }
-    if(pluginVersion) {
-      arrOptAbout.push("version=\"" + pluginVersion + "\""  );
-    } else {
-      arrOptAbout.push();
-    }
-    if(pluginDate) {
-      arrOptAbout.push("date=\"" + pluginDate + "\""  );
-    } else {
-      arrOptAbout.push();
-    }
-    if(pluginHomepage) {
-      arrOptAbout.push("url=\"" + pluginHomepage + "\""  );
-    } else {
-      arrOptAbout.push();
-    }
-    if(pluginLicense) {
-      arrOptAbout.push("license=\"" + pluginLicense + "\""  );
-    } else {
-      arrOptAbout.push();
-    }
-    if(pluginCategory) {
-      arrOptAbout.push("category=\"" + pluginCategory + "\""  );
-    } else {
-      arrOptAbout.push();
-    }
+  if(pluginDescription) {
+    arrOptAbout.push("desc=\"" + pluginDescription + "\""  );
+  } else {
+    arrOptAbout.push();
+  }
+  if(pluginVersion) {
+    arrOptAbout.push("version=\"" + pluginVersion + "\""  );
+  } else {
+    arrOptAbout.push();
+  }
+  if(pluginDate) {
+    arrOptAbout.push("date=\"" + pluginDate + "\""  );
+  } else {
+    arrOptAbout.push();
+  }
+  if(pluginHomepage) {
+    arrOptAbout.push("url=\"" + pluginHomepage + "\""  );
+  } else {
+    arrOptAbout.push();
+  }
+  if(pluginLicense) {
+    arrOptAbout.push("license=\"" + pluginLicense + "\""  );
+  } else {
+    arrOptAbout.push();
+  }
+  if(pluginCategory) {
+    arrOptAbout.push("category=\"" + pluginCategory + "\""  );
+  } else {
+    arrOptAbout.push();
+  }
   // clean array arrOptAbout from empty strings
   arrOptAbout = arrOptAbout.filter(String);
   // set the actual variable optAbout with all values for R option "about"
   if(arrOptAbout.length > 0) {
-    var optAbout = ", about=list(" + arrOptAbout.join(", ") + ")";
+    var optAbout = ",\n\tabout=list(" + arrOptAbout.join(", ") + ")";
   } else {
     var optAbout = "";
   }
 
   // define the array arrOptDependencies for values of R option "dependencies"
   var arrOptDependencies = new Array();
-    if(dependencyFrameChecked && RKMin) {
-      arrOptDependencies.push("rkward.min=\"" + RKMin + "\""  );
-    } else {
-      arrOptDependencies.push();
-    }
-    if(dependencyFrameChecked && RKMax) {
-      arrOptDependencies.push("rkward.max=\"" + RKMax + "\""  );
-    } else {
-      arrOptDependencies.push();
-    }
-    if(dependencyFrameChecked && RMin) {
-      arrOptDependencies.push("R.min=\"" + RMin + "\""  );
-    } else {
-      arrOptDependencies.push();
-    }
-    if(dependencyFrameChecked && RMax) {
-      arrOptDependencies.push("R.max=\"" + RMax + "\""  );
-    } else {
-      arrOptDependencies.push();
-    }
+  if(dependencyFrameChecked && RKMin) {
+    arrOptDependencies.push("rkward.min=\"" + RKMin + "\""  );
+  } else {
+    arrOptDependencies.push();
+  }
+  if(dependencyFrameChecked && RKMax) {
+    arrOptDependencies.push("rkward.max=\"" + RKMax + "\""  );
+  } else {
+    arrOptDependencies.push();
+  }
+  if(dependencyFrameChecked && RMin) {
+    arrOptDependencies.push("R.min=\"" + RMin + "\""  );
+  } else {
+    arrOptDependencies.push();
+  }
+  if(dependencyFrameChecked && RMax) {
+    arrOptDependencies.push("R.max=\"" + RMax + "\""  );
+  } else {
+    arrOptDependencies.push();
+  }
   // clean array arrOptDependencies from empty strings
   arrOptDependencies = arrOptDependencies.filter(String);
   // set the actual variable optDependencies with all values for R option "dependencies"
@@ -157,16 +168,16 @@ function calculate(){
 
   // define the array arrOptPluginmap for values of R option "pluginmap"
   var arrOptPluginmap = new Array();
-    if(menuName) {
-      arrOptPluginmap.push("name=\"" + menuName + "\""  );
-    } else {
-      arrOptPluginmap.push("name=\"" + pluginName + "\""  );
-    }
-    if(menuHier) {
-      arrOptPluginmap.push("hierarchy=\"" + menuHier + "\""  );
-    } else {
-      arrOptPluginmap.push();
-    }
+  if(menuName) {
+    arrOptPluginmap.push("name=\"" + menuName + "\""  );
+  } else {
+    arrOptPluginmap.push("name=\"" + pluginName + "\""  );
+  }
+  if(menuHier) {
+    arrOptPluginmap.push("hierarchy=\"" + menuHier + "\""  );
+  } else {
+    arrOptPluginmap.push();
+  }
   // clean array arrOptPluginmap from empty strings
   arrOptPluginmap = arrOptPluginmap.filter(String);
   // set the actual variable optPluginmap with all values for R option "pluginmap"
@@ -178,36 +189,36 @@ function calculate(){
 
   // define the array arrOptSkeleton for values of R option ""
   var arrOptSkeleton = new Array();
-    if(addWizard) {
-      arrOptSkeleton.push("\n\tprovides=c(\"logic\", \"dialog\", \"wizard\")"  );
-    } else {
-      arrOptSkeleton.push("\n\t#provides=c(\"logic\", \"dialog\")"  );
-    }
-    if(optPluginmap) {
-      arrOptSkeleton.push("\n\t" + optPluginmap  );
-    } else {
-      arrOptSkeleton.push("\n\t#pluginmap=list(name=\"\", hierarchy=\"\", require=\"\")"  );
-    }
-    if(addTests) {
-      arrOptSkeleton.push("\n\ttests=TRUE"  );
-    } else {
-      arrOptSkeleton.push("\n\ttests=FALSE"  );
-    }
-    if(editPlugin) {
-      arrOptSkeleton.push("\n\tedit=TRUE"  );
-    } else {
-      arrOptSkeleton.push("\n\tedit=FALSE"  );
-    }
-    if(addToConfig) {
-      arrOptSkeleton.push("\n\tload=TRUE"  );
-    } else {
-      arrOptSkeleton.push("\n\tload=FALSE"  );
-    }
-    if(showPlugin) {
-      arrOptSkeleton.push("\n\tshow=TRUE"  );
-    } else {
-      arrOptSkeleton.push("\n\tshow=FALSE"  );
-    }
+  if(addWizard) {
+    arrOptSkeleton.push("\n\tprovides=c(\"logic\", \"dialog\", \"wizard\")"  );
+  } else {
+    arrOptSkeleton.push("\n\t#provides=c(\"logic\", \"dialog\")"  );
+  }
+  if(optPluginmap) {
+    arrOptSkeleton.push("\n\t" + optPluginmap  );
+  } else {
+    arrOptSkeleton.push("\n\t#pluginmap=list(name=\"\", hierarchy=\"\", require=\"\")"  );
+  }
+  if(addTests) {
+    arrOptSkeleton.push("\n\ttests=TRUE"  );
+  } else {
+    arrOptSkeleton.push("\n\ttests=FALSE"  );
+  }
+  if(editPlugin) {
+    arrOptSkeleton.push("\n\tedit=TRUE"  );
+  } else {
+    arrOptSkeleton.push("\n\tedit=FALSE"  );
+  }
+  if(addToConfig) {
+    arrOptSkeleton.push("\n\tload=TRUE"  );
+  } else {
+    arrOptSkeleton.push("\n\tload=FALSE"  );
+  }
+  if(showPlugin) {
+    arrOptSkeleton.push("\n\tshow=TRUE"  );
+  } else {
+    arrOptSkeleton.push("\n\tshow=FALSE"  );
+  }
   // clean array arrOptSkeleton from empty strings
   arrOptSkeleton = arrOptSkeleton.filter(String);
   // set the actual variable optSkeleton with all values for R option ""
@@ -219,7 +230,7 @@ function calculate(){
 
   echo("aboutPlugin <- rk.XML.about(");
   if(pluginName) {
-    echo("\n\tname=\"" + pluginName + "\"");  
+    echo("\n\tname=\"" + pluginName + "\",\n");  
   } else {}
   var ocolOptcolAuthorGivenName = getList("optionsetAuthors.optcolAuthorGivenName");
   var ocolOptcolAuthorFamiliyName = getList("optionsetAuthors.optcolAuthorFamiliyName");
@@ -228,32 +239,32 @@ function calculate(){
   var ocolOptcolAuthorCre = getList("optionsetAuthors.optcolAuthorCre");
   var ocolOptcolAuthorCtb = getList("optionsetAuthors.optcolAuthorCtb");
   if(ocolOptcolAuthorGivenName != "") {
-    echo("\tauthor=c(\n\t\t\t");
+    echo("\tauthor=c(\n\t\t");
   for (var i = 0; i < ocolOptcolAuthorGivenName.length; ++i){
     // define the array arrOptAuthorRole for values of R option "role"
     var arrOptAuthorRole = new Array();
-        if(ocolOptcolAuthorAut[i] == 1) {
-            arrOptAuthorRole.push("\"aut\""  );
-        } else {
-            arrOptAuthorRole.push();
-        }
-        if(ocolOptcolAuthorCre[i] == 1) {
-            arrOptAuthorRole.push("\"cre\""  );
-        } else {
-            arrOptAuthorRole.push();
-        }
-        if(ocolOptcolAuthorCtb[i] == 1) {
-            arrOptAuthorRole.push("\"ctb\""  );
-        } else {
-            arrOptAuthorRole.push();
-        }
+    if(ocolOptcolAuthorAut[i] == 1) {
+      arrOptAuthorRole.push("\"aut\""  );
+    } else {
+      arrOptAuthorRole.push();
+    }
+    if(ocolOptcolAuthorCre[i] == 1) {
+      arrOptAuthorRole.push("\"cre\""  );
+    } else {
+      arrOptAuthorRole.push();
+    }
+    if(ocolOptcolAuthorCtb[i] == 1) {
+      arrOptAuthorRole.push("\"ctb\""  );
+    } else {
+      arrOptAuthorRole.push();
+    }
     // clean array arrOptAuthorRole from empty strings
     arrOptAuthorRole = arrOptAuthorRole.filter(String);
     // set the actual variable optAuthorRole with all values for R option "role"
     if(arrOptAuthorRole.length > 0) {
-        var optAuthorRole = ", role=c(" + arrOptAuthorRole.join(", ") + ")";
+      var optAuthorRole = ", role=c(" + arrOptAuthorRole.join(", ") + ")";
     } else {
-        var optAuthorRole = "";
+      var optAuthorRole = "";
     }
 
     echo("person(");
@@ -269,10 +280,10 @@ function calculate(){
     } else {}
     echo(")");
     if(i + 1 < ocolOptcolAuthorGivenName.length) {
-      echo(",\n\t\t\t");
+      echo(",\n\t\t");
     }
   }
-  echo("\n\t\t),\n");
+  echo("\n\t)");
   } else {}
   echo(optAbout);
   echo("\n)\n\n");
@@ -287,9 +298,9 @@ function calculate(){
     if(ocolOptcolPckgName!= "") {
       echo("\n\tpackage=list(\n\t\t");
       for (var i = 0; i < ocolOptcolPckgName.length; ++i){
-                        echo("c(");
-                        echo("name=\"" + ocolOptcolPckgName[i] + "\"");
-                        if(ocolOptcolPckgMin[i]) {
+        echo("c(");
+        echo("name=\"" + ocolOptcolPckgName[i] + "\"");
+        if(ocolOptcolPckgMin[i]) {
           echo(", min=\"" + ocolOptcolPckgMin[i] + "\"");  
         } else {}
         if(ocolOptcolPckgMax[i]) {
@@ -298,7 +309,7 @@ function calculate(){
         if(ocolOptcolPckgRepo[i]) {
           echo(", repository=\"" + ocolOptcolPckgRepo[i] + "\"");  
         } else {}
-                        echo(")");
+        echo(")");
         if(i + 1 < ocolOptcolPckgName.length) {
           echo(",\n\t\t");
         }
@@ -339,6 +350,7 @@ function calculate(){
   echo("\n\t#components=list(),");
   echo(optSkeleton);
   echo("\n)\n\n");
+  echo("\t# you can make your plugin translatable, see top of script" + "\n\tif(isTRUE(update.translations)){" + "\n\t\trk.updatePluginMessages(file.path(output.dir,\"" + pluginName + "\",\"inst\",\"rkward\",\"" + pluginName + ".pluginmap\"))" + "\n\t} else {}\n\n");
 }
 
 function printout(){
diff --git a/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.rkh b/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.rkh
index 2eb3a83..87514e1 100644
--- a/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.rkh
+++ b/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.rkh
@@ -77,6 +77,9 @@
     <setting id="addTests">
       If this is checked, plugin tests will be included in the skeleton.
     </setting>
+    <setting id="showPlugin">
+      If this is checked, the generated plugin will be shown (opened) for you to see what it looks like.
+    </setting>
     <setting id="editPlugin">
       If this is checked, all generated files will be opened for editing instantly.
     </setting>
@@ -84,12 +87,17 @@
       If this is checkend, the generated plugin will automatically be registered in RKWard's configuration.
               If you store it in a temporary directory and remove it before the next start of RKWard, the entry will removed again as well.
     </setting>
-    <setting id="showPlugin">
-      If this is checked, the generated plugin will be shown (opened) for you to see what it looks like.
-    </setting>
     <setting id="guessGetters">
       If this is checked, rkwarddev tries to select the optimal getter functions to get data from the dialog into the R code. The plugin then requires RKWard >= 0.6.0.
     </setting>
+    <setting id="emptyElse">
+      Some consider it an enhancement for code readability if every "if" condition has an "else" clause, even if it is empty.
+              If you check this option, the generated JS code will keep these empty "else" clauses.
+    </setting>
+    <caption id="frm_rICTSTFICT" />
+    <setting id="codeIndent">
+      Define how the generated code should be indented (by tabs or space characters).
+    </setting>
     <caption id="frm_rHPTFEVWRD" />
     <setting id="menuHier">
       Specify where the plugin should appear in RKWard's top menus.
diff --git a/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.xml b/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.xml
index f2ae6aa..28884e2 100644
--- a/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.xml
+++ b/packages/rkwarddev/inst/rkward/plugins/CreateRKWardpluginskeleton.xml
@@ -34,8 +34,8 @@
             </row>
           </frame>
           <frame label="Plugin author" id="aboutContact">
-            <row id="row_oACMPPPCFG">
-              <optionset id="optionsetAuthors">
+            <row id="row_oA1CMPPPCF">
+              <optionset id="optionsetAuthors" min_rows="1">
                 <logic>
                   <connect governor="authorCre.state" client="authorMail.required" />
                 </logic>
@@ -82,21 +82,32 @@
             <row id="row_bDTEMPDIRD">
               <browser label="Directory to save to (empty for $TEMPDIR)" type="dir" id="outDir" required="false" />
             </row>
-            <row id="row_cOWATIOWAT">
-              <column id="clm_chckbOWATI">
+            <row id="row_cOWATIPSOW">
+              <column id="clm_chcOWATIPS">
                 <checkbox id="overwrite" label="Overwrite existing files" value="true" />
                 <checkbox id="addWizard" label="Add wizard section" value="true" />
                 <checkbox id="addTests" label="Include plugin tests" value="true" checked="true" />
+                <checkbox id="showPlugin" label="Show the plugin" value="true" />
                 <stretch />
               </column>
-              <column id="clm_cPOTCARKWP">
+              <column id="clm_cPOTCARKWG">
                 <checkbox id="editPlugin" label="Open files for editing" value="true" checked="true" />
                 <checkbox id="addToConfig" label="Add plugin to RKWard configuration" value="true" checked="true" />
-                <checkbox id="showPlugin" label="Show the plugin" value="true" />
                 <checkbox id="guessGetters" label="Guess getter functions (RKWard >= 0.6.0)" value="true" />
+                <checkbox id="emptyElse" label="Keep empty 'else {}'" value="true" />
                 <stretch />
               </column>
             </row>
+            <frame id="frm_rICTSTFICT">
+              <row id="row_drpdICTSTF">
+                <dropdown id="codeIndent" label="Code indentation">
+                  <option label="Tabs" value="\t" checked="true" />
+                  <option label="Single space" value=" " />
+                  <option label="Two spaces" value="  " />
+                  <option label="Four spaces" value="    " />
+                </dropdown>
+              </row>
+            </frame>
             <frame id="frm_rHPTFEVWRD">
               <row id="row_dHPTFEVWRD">
                 <dropdown id="menuHier" label="Place in top menu">



More information about the rkward-tracker mailing list