com.google.gerrit.client.admin.ValueEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gerrit.client.admin.ValueEditor.java

Source

// Copyright (C) 2011 The Android Open Source Project
//
// 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.gerrit.client.admin;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.editor.client.EditorError;
import com.google.gwt.editor.client.HasEditorErrors;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.LeafValueEditor;
import com.google.gwt.editor.ui.client.adapters.ValueBoxEditor;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiChild;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Focusable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.ValueBoxBase;
import com.google.gwt.user.client.ui.Widget;

import java.text.ParseException;
import java.util.List;

public class ValueEditor<T> extends Composite
        implements HasEditorErrors<T>, IsEditor<ValueBoxEditor<T>>, LeafValueEditor<T>, Focusable {
    interface Binder extends UiBinder<Widget, ValueEditor<?>> {
    }

    static final Binder uiBinder = GWT.create(Binder.class);

    @UiField
    SimplePanel textPanel;
    private Label textLabel;
    private StartEditHandlers startHandlers;

    @UiField
    Image editIcon;

    @UiField
    SimplePanel editPanel;

    @UiField
    DivElement errorLabel;

    private ValueBoxBase<T> editChild;
    private ValueBoxEditor<T> editProxy;
    private boolean ignoreEditorValue;
    private T value;

    public ValueEditor() {
        startHandlers = new StartEditHandlers();
        initWidget(uiBinder.createAndBindUi(this));
        editPanel.setVisible(false);
        editIcon.addClickHandler(startHandlers);
    }

    public void edit() {
        textPanel.removeFromParent();
        textPanel = null;
        textLabel = null;

        editIcon.removeFromParent();
        editIcon = null;
        startHandlers = null;

        editPanel.setVisible(true);
    }

    public ValueBoxEditor<T> asEditor() {
        if (editProxy == null) {
            editProxy = new EditorProxy();
        }
        return editProxy;
    }

    @Override
    public T getValue() {
        return ignoreEditorValue ? value : asEditor().getValue();
    }

    @Override
    public void setValue(T value) {
        this.value = value;
        asEditor().setValue(value);
    }

    void setIgnoreEditorValue(boolean off) {
        ignoreEditorValue = off;
    }

    public void setEditTitle(String title) {
        editIcon.setTitle(title);
    }

    @UiChild(limit = 1, tagname = "display")
    public void setDisplay(Label widget) {
        textLabel = widget;
        textPanel.add(textLabel);

        textLabel.addClickHandler(startHandlers);
        textLabel.addDoubleClickHandler(startHandlers);
    }

    @UiChild(limit = 1, tagname = "editor")
    public void setEditor(ValueBoxBase<T> widget) {
        editChild = widget;
        editPanel.add(editChild);
        editProxy = null;
    }

    public void setEnabled(boolean enabled) {
        editIcon.setVisible(enabled);
        startHandlers.enabled = enabled;
    }

    public void showErrors(List<EditorError> errors) {
        StringBuilder buf = new StringBuilder();
        for (EditorError error : errors) {
            if (error.getEditor().equals(editProxy)) {
                buf.append("\n");
                if (error.getUserData() instanceof ParseException) {
                    buf.append(((ParseException) error.getUserData()).getMessage());
                } else {
                    buf.append(error.getMessage());
                }
            }
        }

        if (0 < buf.length()) {
            errorLabel.setInnerText(buf.substring(1));
            errorLabel.getStyle().setDisplay(Display.BLOCK);
        } else {
            errorLabel.setInnerText("");
            errorLabel.getStyle().setDisplay(Display.NONE);
        }
    }

    @Override
    public void setAccessKey(char key) {
        editChild.setAccessKey(key);
    }

    @Override
    public void setFocus(boolean focused) {
        editChild.setFocus(focused);
        if (focused) {
            editChild.setCursorPos(editChild.getText().length());
        }
    }

    @Override
    public int getTabIndex() {
        return editChild.getTabIndex();
    }

    @Override
    public void setTabIndex(int index) {
        editChild.setTabIndex(index);
    }

    private class StartEditHandlers implements ClickHandler, DoubleClickHandler {
        boolean enabled;

        @Override
        public void onClick(ClickEvent event) {
            if (enabled && event.getNativeButton() == NativeEvent.BUTTON_LEFT) {
                edit();
            }
        }

        @Override
        public void onDoubleClick(DoubleClickEvent event) {
            if (enabled && event.getNativeButton() == NativeEvent.BUTTON_LEFT) {
                edit();
            }
        }
    }

    private class EditorProxy extends ValueBoxEditor<T> {
        EditorProxy() {
            super(editChild);
        }

        @Override
        public void setValue(T value) {
            super.setValue(value);
            if (textLabel == null) {
                setDisplay(new Label());
            }
            textLabel.setText(editChild.getText());
        }
    }
}