ItEr29S06CUAsignacionGrupoRecursosAPlanificacionItEr28S06: [Refactoring] Open all criterions when being rendered for the first time

This commit is contained in:
Diego Pino Garcia 2009-10-06 20:14:54 +02:00 committed by Javier Moran Rua
parent d0a2047cb6
commit c193fd4e46
3 changed files with 90 additions and 46 deletions

View file

@ -30,6 +30,7 @@ import org.navalplanner.business.resources.entities.CriterionType;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.web.common.components.WorkerSearch;
import org.springframework.beans.factory.annotation.Autowired;
import org.zkoss.lang.Objects;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
@ -46,7 +47,10 @@ import org.zkoss.zul.SimpleTreeNode;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Tree;
import org.zkoss.zul.TreeModel;
import org.zkoss.zul.Treecell;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.TreeitemRenderer;
import org.zkoss.zul.Treerow;
/**
* Controller for searching for {@link Worker}
@ -67,6 +71,8 @@ public class WorkerSearchController extends GenericForwardComposer {
private Listbox listBoxWorkers;
CriterionRenderer criterionRenderer = new CriterionRenderer();
public WorkerSearchController() {
}
@ -96,16 +102,11 @@ public class WorkerSearchController extends GenericForwardComposer {
});
}
// Feed criterionsTree with criterions
if (criterionsTree.getModel() == null) {
criterionsTree.setModel(getCriterions());
}
// Set renderer for listboxWorkers
if (listBoxWorkers.getItemRenderer() == null) {
listBoxWorkers.setItemRenderer(getListitemRenderer());
}
// Initialize components
criterionsTree.setTreeitemRenderer(criterionRenderer);
listBoxWorkers.setItemRenderer(getListitemRenderer());
// Show all workers
refreshListBoxWorkers(workerSearchModel.getAllWorkers());
}
@ -315,4 +316,49 @@ public class WorkerSearchController extends GenericForwardComposer {
item.appendChild(listName);
}
}
public CriterionRenderer getCriterionRenderer() {
return criterionRenderer;
}
/**
* Render for criterionsTree
*
* I had to implement a renderer for the Tree, for settin open to tree for
* each treeitem while being rendered.
*
* I tried to do this by iterating through the list of items after setting
* model in doAfterCompose, but I got a ConcurrentModificationException. It
* seems that at that point some other component was using the list of item,
* so it was not possible to modify it. There's not other point where to
* initialize components but doAfterCompose.
*
* Finally, I tried this solution and it works
*
* @author Diego Pino Garcia <dpino@igalia.com>
*
*/
private class CriterionRenderer implements TreeitemRenderer {
/**
* Copied verbatim from org.zkoss.zul.Tree;
*/
@Override
public void render(Treeitem ti, Object node) throws Exception {
Treecell tc = new Treecell(Objects.toString(node));
Treerow tr = null;
ti.setValue(node);
if (ti.getTreerow() == null) {
tr = new Treerow();
tr.setParent(ti);
ti.setOpen(true); // Expand node
} else {
tr = ti.getTreerow();
tr.getChildren().clear();
}
tc.setParent(tr);
}
}
}

View file

@ -145,12 +145,12 @@
</listhead>
</listbox>
<workerSearch />
<hbox>
<button label="${i18n:_('Accept')}" onClick="allocationController.accept()" />
<button label="${i18n:_('Apply')}" id="applyButton"/>
<button label="${i18n:_('Cancel')}" onClick="allocationController.cancel()" />
<button label="${i18n:_('Search resources...')}"
onClick="allocationController.showSearchResources()" />
<button label="${i18n:_('Advance allocation')}" onClick="allocationController.advanceAllocation();"/>
</hbox>
</window>

View file

@ -18,43 +18,41 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<window self="@{define(content)}" id="workerSearch"
apply="org.navalplanner.web.resources.search.WorkerSearchController"
title="${i18n:_('Search worker')}" closable="true" visible="false">
<vbox apply="org.navalplanner.web.resources.search.WorkerSearchController">
<hbox style="margin-top: 3px">
<vbox style="margin-right: 5px">
<!-- Name -->
<label value="${i18n:_('Name/ID')}" />
<textbox id="txtName"
onChanging="controller.searchWorkers(event)" />
<hbox>
<vbox>
<!-- Name -->
<label value="${i18n:_('Name/ID')}" />
<textbox id="txtName"
onChanging="controller.searchWorkers(event)" />
<!-- Criterions -->
<label value="${i18n:_('Criterions')}" />
<tree id="criterionsTree" width="280px"
model="@{controller.criterions}" multiple="true">
<treecols>
<treecol label="Name" />
</treecols>
</tree>
</vbox>
<!--Matchings -->
<listbox id="listBoxWorkers" width="200px" mold="paging"
pageSize="10" rows="10" multiple="true"
itemRenderer="@{controller.listitemRenderer}">
<listhead>
<listheader label="${i18n:_('Name')}" sort="auto" />
<listheader label="${i18n:_('NIF')}" sort="auto" />
</listhead>
</listbox>
</vbox>
<vbox>
<!--Matchings -->
<listbox id="listBoxWorkers" width="200px" mold="paging"
pageSize="10" rows="10" multiple="true"
itemRenderer="@{controller.listitemRenderer}">
<listhead>
<listheader label="${i18n:_('Name')}" sort="auto" />
<listheader label="${i18n:_('NIF')}" sort="auto" />
</listhead>
</listbox>
</vbox>
</hbox>
<hbox>
<button style="margin-top: 5px" label="${i18n:_('Accept')}"
onClick="controller.onAccept(event)" />
<vbox>
<!-- Criterions -->
<label value="${i18n:_('Criterions')}" />
<tree id="criterionsTree" width="280px"
model="@{controller.criterions}"
multiple="true">
<treecols>
<treecol label="Name" />
</treecols>
</tree>
</vbox>
</hbox>
</window>
<hbox>
<button label="${i18n:_('Accept')}"
onClick="controller.onAccept(event)" />
</hbox>
</vbox>