com.google.api.explorer.client.parameter.schema.ArraySchemaEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.google.api.explorer.client.parameter.schema.ArraySchemaEditor.java

Source

/*
 * Copyright (C) 2011 Google Inc.
 *
 * 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 com.google.api.explorer.client.parameter.schema;

import com.google.api.explorer.client.base.ApiService;
import com.google.api.explorer.client.base.Schema;
import com.google.api.explorer.client.parameter.schema.SchemaForm.SchemaEditor;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONException;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.Widget;

import java.util.List;

/**
 * {@link SchemaEditor} for array values. The elements of the array will each
 * have their own editors which provide the string value of this editor.
 *
 * @author jasonhall@google.com (Jason Hall)
 */
class ArraySchemaEditor extends Composite implements SchemaEditor {

    private static ArraySchemaEditorUiBinder uiBinder = GWT.create(ArraySchemaEditorUiBinder.class);

    interface ArraySchemaEditorUiBinder extends UiBinder<Widget, ArraySchemaEditor> {
    }

    private final SchemaForm schemaForm;
    private final Schema items;
    private final List<SchemaEditor> editors = Lists.newArrayList();
    private final ApiService service;

    @UiField
    HTMLPanel panel;
    @UiField
    Image newItem;
    @UiField
    PopupPanel addTooltip;

    ArraySchemaEditor(ApiService service, SchemaForm schemaForm, Schema items) {
        initWidget(uiBinder.createAndBindUi(this));
        this.schemaForm = schemaForm;
        this.items = items;
        this.service = service;

        // Initialize the popup panels.
        addTooltip.show();
        addTooltip.hide();
    }

    @UiHandler("newItem")
    void newItem(ClickEvent event) {
        addItem();
    }

    @UiHandler("newItem")
    void discloseAddTooltip(MouseOverEvent event) {
        EditorHelper.discloseLowerRight(addTooltip, newItem);
    }

    @UiHandler("newItem")
    void hideAddTooltip(MouseOutEvent event) {
        addTooltip.hide();
    }

    @Override
    public Widget render(Schema ignored) {
        return this;
    }

    private void addItem() {
        // Get the correct editor to show for the type of array element.
        final SchemaEditor editor = schemaForm.getSchemaEditorForSchema(service, items,
                /* This is an array element, so descendants should not be nullable. */ false);

        // Render the widget and make an ArrayElement widget out of it
        final ArrayElement el = new ArrayElement(editor, items);
        editors.add(el);

        el.registerRemoveClickedHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                // When the element is removed in the UI, remove it from the list of
                // editors we care about.
                panel.remove(el);
                editors.remove(editor);
            }
        });
        panel.add(el);
    }

    @Override
    public JSONValue getJSONValue() {
        JSONArray arr = new JSONArray();
        for (int i = 0; i < editors.size(); i++) {
            arr.set(i, editors.get(i).getJSONValue());
        }
        return arr;
    }

    @Override
    public void setJSONValue(JSONValue value) {
        JSONArray arr = value.isArray();
        if (arr != null) {
            for (int i = 0; i < arr.size(); i++) {
                // We may have to create additional editors
                if (i >= editors.size()) {
                    addItem();
                }

                SchemaEditor editor = editors.get(i);
                editor.setJSONValue(arr.get(i));
            }
        } else {
            throw new JSONException("Not a valid JSON array: " + value.toString());
        }
    }

    @Override
    public void prettyPrint(StringBuilder resultSoFar, int indentation) {
        resultSoFar.append("\n").append(Strings.repeat(INDENTATION, indentation)).append("[");
        boolean first = true;
        for (SchemaEditor editor : editors) {
            if (!first) {
                resultSoFar.append(",");
            }
            first = false;
            editor.prettyPrint(resultSoFar, indentation + 1);
        }
        resultSoFar.append("\n").append(Strings.repeat(INDENTATION, indentation)).append("]");
    }

    @Override
    public boolean isComposite() {
        return true;
    }
}