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

org.wicketstuff.gchart.ColumnDeclaration Maven / Gradle / Ivy

Go to download

Integrate Google Charts API (v45) with wicket. The API tries not to hide all details of the Google API, but makes use of the JSON lib of wicket to mix Java, JavaScript and JSON in a transparent way..

The newest version!
/* 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.wicketstuff.gchart;

import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import com.github.openjson.JSONObject;

/**
 * Abstraction of a data column defintion. The more exotic fields like pattern,
 * role and properties are handled by the setters.
 *
 * @author Dieter Tremel
 */
public class ColumnDeclaration implements Jsonable {

    private ColumnType type;
    private String id = null;
    private IModel labelModel = null;
    private String pattern = null;
    private ColumnRole role = null;
    private final Map properties = new HashMap<>(8);

    /**
     * Default constructor.
     *
     * @param type Datatype of column.
     */
    public ColumnDeclaration(ColumnType type) {
        this.type = type;
        this.labelModel = null;
    }

    /**
     * Default constructor.
     *
     * @param id Id of Column.
     * @param type Datatype of column.
     */
    public ColumnDeclaration(String id, ColumnType type) {
        this.id = id;
        this.type = type;
        this.labelModel = null;
    }

    /**
     * Constructor with label as String.
     *
     * @param type Datatype of column.
     * @param label Label for description of column.
     */
    public ColumnDeclaration(ColumnType type, String label) {
        this.type = type;
        this.labelModel = Model.of(label);
    }

    /**
     * Constructor with label.
     *
     * @param type Datatype of column.
     * @param labelModel Model of Label for description of column.
     */
    public ColumnDeclaration(ColumnType type, IModel labelModel) {
        this.type = type;
        this.labelModel = labelModel;
    }

    /**
     * Constructor with label.
     *
     * @param id Id of Column.
     * @param type Datatype of column.
     * @param labelModel Model of Label for description of column.
     */
    public ColumnDeclaration(String id, ColumnType type, IModel labelModel) {
        this.id = id;
        this.type = type;
        this.labelModel = labelModel;
    }

    /**
     * Constructor with role. Example:
     * 
{@code new ColumnDeclaration(ColumnType.STRING, ColumnRole.ANNOTATION);}
* * @param type Datatype of column. * @param role Role of column. */ public ColumnDeclaration(ColumnType type, ColumnRole role) { this.type = type; this.role = role; } /** * Constructor with role. Example: *
{@code new ColumnDeclaration(ColumnType.STRING, ColumnRole.ANNOTATION);}
* * @param id Id of Column. * @param type Datatype of column. * @param role Role of column. */ public ColumnDeclaration(String id, ColumnType type, ColumnRole role) { this.id = id; this.type = type; this.role = role; } /** * Build an instance from a JSON string for instance as seen in tutorials. * For users, that find coding in JSON easier than building nested * ChartOptions, this my be an additional offer. Implemented as * {@code fromJson(new JSONObject(json));}, see {@link #fromJSON(com.github.openjson.JSONObject) * }. * * @param json JSON string like * {@code {id: 'task', label: 'Employee Name', type: 'string'}} * @return New instance with data from the JSON String. */ public static ColumnDeclaration fromJSON(String json) { return fromJSON(new JSONObject(json)); } /** * Build instance from a JSONobject. * * @param jsonObj JSON object to build ColumnDeclaration from. If this * contains "properties" nested, it will try to fill them in the instance. * @return New instance with data from the JSONObject. */ public static ColumnDeclaration fromJSON(JSONObject jsonObj) { if (!jsonObj.has("type")) { throw new IllegalArgumentException("The JSON for a ColumnDeclaration must at least have a type definition"); } ColumnType type = ColumnType.valueOf(jsonObj.getString("type").toUpperCase()); ColumnDeclaration columnDeclaration = new ColumnDeclaration(type); if (jsonObj.has("label")) { columnDeclaration.setLabelModel(Model.of(jsonObj.getString("label"))); } if (jsonObj.has("pattern")) { columnDeclaration.setPattern(jsonObj.getString("pattern")); } if (jsonObj.has("role")) { columnDeclaration.setRole(ColumnRole.valueOf(jsonObj.getString("role"))); } if (jsonObj.has("properties")) { if (jsonObj.get("properties") instanceof JSONObject) { JSONObject props = (JSONObject) jsonObj.get("properties"); for (String name : JSONObject.getNames(props)) { columnDeclaration.getProperties().put(name, props.get(name)); } } } return columnDeclaration; } public ColumnType getType() { return type; } public void setType(ColumnType type) { this.type = type; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getLabel() { return labelModel.getObject(); } public IModel getLabelModel() { return labelModel; } public void setLabelModel(IModel labelModel) { this.labelModel = labelModel; } public ColumnRole getRole() { return role; } /** * Set role of column. See * Column * Roles. * * @param role Role of Column. */ public void setRole(ColumnRole role) { this.role = role; } public Map getProperties() { return properties; } public String getPattern() { return pattern; } /** * Just given for completeness, Google Charts does not use this value at the moment. * Use definition of options of axis ticks with value and format * or {@code hAxis.format} instead to format axis values. * * @param pattern Pattern for Column. */ public void setPattern(String pattern) { this.pattern = pattern; } @Override public JSONObject toJSON() { // {id: 'hours', label: 'Hours per Day', type: 'number'} JSONObject colDef = new JSONObject(); if (id != null) { colDef.put("id", getId()); } if (labelModel != null) { colDef.put("label", getLabel()); } if (pattern != null) { colDef.put("pattern", getPattern()); } if (role != null) { colDef.put("role", getRole().toJavaScript()); } if (properties != null && !properties.isEmpty()) { colDef.put("p", new JSONObject(properties)); } colDef.put("type", getType().toJavaScript()); return colDef; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy