All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zkoss.bind.xel.zel.TreeModelELResolver Maven / Gradle / Ivy

There is a newer version: 10.0.0-jakarta
Show newest version
/* TreeModelELResolver.java

	Purpose:
		
	Description:
		
	History:
		Jan 12, 2012 3:18:34 PM, Created by henrichen

Copyright (C) 2012 Potix Corporation. All Rights Reserved.
*/

package org.zkoss.bind.xel.zel;

import java.beans.FeatureDescriptor;
import java.lang.reflect.Array;
import java.util.Iterator;

import org.zkoss.lang.Classes;
import org.zkoss.zel.ELContext;
import org.zkoss.zel.ELException;
import org.zkoss.zel.ELResolver;
import org.zkoss.zel.PropertyNotFoundException;
import org.zkoss.zel.PropertyNotWritableException;
import org.zkoss.zul.TreeModel;

/**
 * ELResolver for {@link TreeModel}.
 * @author dennis
 * @since 6.0.0
 */
public class TreeModelELResolver extends ELResolver {
	
	private static final Class INTEGER_ARRAY = new int[0].getClass();
	
    
    public Object getValue(ELContext context, Object base, Object property)
            throws NullPointerException, PropertyNotFoundException, ELException {
        if (context == null) {
            throw new NullPointerException();
        }

        if (base instanceof TreeModel) {
        	TreeModel treemodel = (TreeModel) base;
            int[] path = coerce(property);
            if (path==null) {
                return null;
            }
            context.setPropertyResolved(true);
            return treemodel.getChild(path);
        }

        return null;
    }

    
    public Class getType(ELContext context, Object base, Object property)
            throws NullPointerException, PropertyNotFoundException, ELException {
        if (context == null) {
            throw new NullPointerException();
        }

        if (base instanceof TreeModel) {
        	int[] path = coerce(property);
            if (path == null) return null;
            context.setPropertyResolved(true);
            return Object.class;
        }

        return null;
    }

    
    public void setValue(ELContext context, Object base, Object property,
            Object value) throws NullPointerException,
            PropertyNotFoundException, PropertyNotWritableException,
            ELException {
        if (context == null) {
            throw new NullPointerException();
        }
    }

    
    public boolean isReadOnly(ELContext context, Object base, Object property)
            throws NullPointerException, PropertyNotFoundException, ELException {
    	return true;
    }

    
    public Iterator getFeatureDescriptors(ELContext context, Object base) {
//        if (base instanceof TreeModel) {
//            FeatureDescriptor[] descs = new FeatureDescriptor[1];
//            descs[0] = new FeatureDescriptor();
//            descs[0].setDisplayName("["+0+"]");
//            descs[0].setExpert(false);
//            descs[0].setHidden(false);
//            descs[0].setName("0");
//            descs[0].setPreferred(true);
//            descs[0].setValue(RESOLVABLE_AT_DESIGN_TIME, Boolean.FALSE);
//            descs[0].setValue(TYPE, _pathClass.getClass());
//            return Arrays.asList(descs).iterator();
//        }
        return null;
    }

    
    public Class getCommonPropertyType(ELContext context, Object base) {
        if (base instanceof TreeModel) { // implies base != null
            return INTEGER_ARRAY.getClass();
        }
        return null;
    }

    private static final int[] coerce(Object property) {
    	
    	if (INTEGER_ARRAY.isInstance(property)) {//quick casting for int[]
            return (int[])property;
        }
    	
    	final Class clz = property.getClass(); 
    	if(clz.isArray()){
    		int s  = Array.getLength(property);
    		int[] path = new int[s];
    		for(int i=0;i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy