Index: /trunk/grails-app/controllers/AssetDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/AssetDetailedController.groovy	(revision 285)
+++ /trunk/grails-app/controllers/AssetDetailedController.groovy	(revision 286)
@@ -218,5 +218,9 @@
                 }
             }
+
             assetInstance.properties = params
+
+            assetInstance.setAssetSubItemsFromCheckBoxList(params.assetSubItems)
+
             if(!assetInstance.hasErrors() && assetInstance.save(flush: true)) {
                 flash.message = "Asset ${params.id} updated"
Index: /trunk/grails-app/domain/Asset.groovy
===================================================================
--- /trunk/grails-app/domain/Asset.groovy	(revision 285)
+++ /trunk/grails-app/domain/Asset.groovy	(revision 286)
@@ -23,4 +23,16 @@
         "${this.name}"
     }
+
+    //  This additional setter is used to convert the checkBoxList string
+    //  of ids selected to the corresponding domain objects.
+    public void setAssetSubItemsFromCheckBoxList(ids) {
+        def idList = []
+        ids.each() {
+            if(it.isInteger())
+                idList << it.toInteger()
+        }
+        this.assetSubItems = idList.collect { AssetSubItem.get( it ) }
+    }
+
 }
 
Index: /trunk/grails-app/taglib/AssetTreeTagLib.groovy
===================================================================
--- /trunk/grails-app/taglib/AssetTreeTagLib.groovy	(revision 285)
+++ /trunk/grails-app/taglib/AssetTreeTagLib.groovy	(revision 286)
@@ -1,3 +1,6 @@
-
+/**
+* Asset Tree tags.
+* Specific to gnumims hence the namespace.
+*/
 class AssetTreeTagLib {
     static namespace = 'gnumims'
Index: /trunk/grails-app/taglib/CustomTagLib.groovy
===================================================================
--- /trunk/grails-app/taglib/CustomTagLib.groovy	(revision 286)
+++ /trunk/grails-app/taglib/CustomTagLib.groovy	(revision 286)
@@ -0,0 +1,70 @@
+
+/**
+* General use custom tags.
+* Some are taken from http://www.grails.org/Contribute+a+Tag#checkBoxList
+*/
+class CustomTagLib {
+    static namespace = 'custom'
+
+    def resources = { attrs ->
+        ///@todo: should include our javascript and do setup here.
+    }
+
+    /**
+    * Checkbox list that can be used as a more user-friendly alternative to a multiselect list box.
+     * Usage:
+     * To map the selected ids to corresponding domain objects,
+     * an additional set method is required in the containing domain class:
+     *       //  This additional setter is used to convert the checkBoxList string
+     *       //  of ids selected to the corresponding domain objects.
+     *       public void setAssetSubItemsFromCheckBoxList(ids) {
+     *           def idList = []
+     *           ids.each() {
+     *               if(it.isInteger())
+     *                   idList << it.toInteger()
+     *           }
+     *           this.assetSubItems = idList.collect { AssetSubItem.get( it ) }
+     *       }
+     * Then a line in the controller:
+     *      assetInstance.setAssetSubItemsFromCheckBoxList(params.assetSubItems)
+     */
+    def checkBoxList = {attrs, body ->
+
+        def from = attrs.from
+        def value = attrs.value
+        def cname = attrs.name
+        def isChecked, ht, wd, style, html
+
+        // sets the style to override height and/or width if either of them
+        // is specified, else the default from the CSS is taken
+        style = "style='"
+        if(attrs.height)
+            style += "height:${attrs.height};"
+        if(attrs.width)
+            style += "width:${attrs.width};"
+        if(style.length() == "style='".length())
+            style = ""
+        else
+            style += "'" // closing single quote
+
+        html = "<ul class='CheckBoxList' " + style + ">"
+
+        out << html
+
+        from.each { obj ->
+
+            // if we wanted to select the checkbox using a click anywhere on the label (also hover effect)
+            // but grails does not recognize index suffix in the name as an array:
+            // cname = "${attrs.name}[${idx++}]"
+            // and put this inside the li: <label for='$cname'>...</label>
+
+            isChecked = (value?.contains(obj."${attrs.optionKey}"))? true: false
+
+            out << "<li>" << checkBox(name:cname, value:obj."${attrs.optionKey}", checked: isChecked) << " ${obj.id} - ${obj.name}" << "</li>"
+        }
+
+        out << "</ul>"
+
+    } // checkBoxList
+
+} // end class
Index: /trunk/grails-app/views/assetDetailed/edit.gsp
===================================================================
--- /trunk/grails-app/views/assetDetailed/edit.gsp	(revision 285)
+++ /trunk/grails-app/views/assetDetailed/edit.gsp	(revision 286)
@@ -85,9 +85,8 @@
                                 </td>
                                 <td valign="top" class="value ${hasErrors(bean:assetInstance,field:'assetSubItems','errors')}">
-                                    
-                                    <g:select name="assetSubItems"
-                                                    from="${AssetSubItem.list()}"
-                                                    size="5" multiple="yes" optionKey="id"
-                                                    value="${assetInstance?.assetSubItems}" />
+                                    <custom:checkBoxList name="assetSubItems"
+                                                                    from="${AssetSubItem.list()}"
+                                                                    value="${assetInstance?.assetSubItems.collect{it.id}}"
+                                                                    optionKey="id"/>
 
                                 </td>
Index: /trunk/web-app/css/main.css
===================================================================
--- /trunk/web-app/css/main.css	(revision 285)
+++ /trunk/web-app/css/main.css	(revision 286)
@@ -581,2 +581,18 @@
     margin: 2px;
 }
+
+/* CheckBoxList Tag Lib */
+
+.CheckBoxList {
+    height: 300px;
+    overflow: auto;
+    overflow-x: hidden;
+    width: 400px;
+    border: 1px solid #ccc;
+    list-style-type: none;
+    margin: 0;
+    padding: 0px;
+}
+.CheckBoxList li {
+    padding: 5px;
+}
