org.fusesource.ide.foundation.ui.form.FormSupport.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.ide.foundation.ui.form.FormSupport.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/

package org.fusesource.ide.foundation.ui.form;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IMessageManager;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.fusesource.ide.foundation.ui.util.ICanValidate;

public abstract class FormSupport implements PropertyChangeListener {
    private ICanValidate validator;

    /**
     * Font metrics to use for determining pixel sizes.
     */
    private FontMetrics fontMetrics;
    private FormToolkit toolkit;
    private IMessageManager messageManager;
    private ScrolledForm form;
    private DataBindingContext dataBindingContext = new DataBindingContext();
    private Set<String> mandatoryPropertyNames = new HashSet<String>();
    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    public FormSupport() {
    }

    public FormSupport(ICanValidate validator) {
        this.validator = validator;
    }

    public abstract void setFocus();

    public void dispose() {
        if (toolkit != null) {
            toolkit.dispose();
            toolkit = null;
        }
    }

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        propertyChangeSupport.firePropertyChange(e);
    }

    protected void firePropertyChange(String name, Object oldValue, Object newValue) {
        propertyChangeSupport.firePropertyChange(name, oldValue, newValue);
    }

    public DataBindingContext getDataBindingContext() {
        return dataBindingContext;
    }

    public IMessageManager getMessageManager() {
        return messageManager;
    }

    public ScrolledForm getForm() {
        return form;
    }

    public FormToolkit getToolkit() {
        return toolkit;
    }

    protected void addMandatoryPropertyNames(String... names) {
        for (String n : names) {
            mandatoryPropertyNames.add(n);
        }
    }

    protected void initializeFontMetrics(Control control) {
        // Compute and store a font metric
        GC gc = new GC(control);
        gc.setFont(JFaceResources.getDialogFont());
        fontMetrics = gc.getFontMetrics();
        gc.dispose();
    }

    public Control getControl() {
        return form.getContent();
    }

    public void createForm(Composite parent) {
        initializeFontMetrics(parent);

        toolkit = new FormToolkit(parent.getDisplay());
        form = toolkit.createScrolledForm(parent);
        messageManager = form.getMessageManager();

        Form formChild = form.getForm();
        String header = getFormHeader();
        if (header != null) {
            formChild.setText(header);
        }
        toolkit.decorateFormHeading(formChild);
        form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        //form.getBody().setLayout(new GridLayout(1, false));
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        form.getBody().setLayout(layout);
    }

    protected String getFormHeader() {
        return null;
    }

    public Composite createSectionComposite(String text, GridData gridData) {
        int sectionStyle = Section.DESCRIPTION | Section.TITLE_BAR;
        if (text != null) {
            sectionStyle |= Section.TWISTIE | Section.EXPANDED;
        }
        Section section = toolkit.createSection(form.getBody(), sectionStyle);
        if (text != null) {
            section.setText(text);
        }
        section.setLayoutData(gridData);
        Composite inner = toolkit.createComposite(section);
        section.setClient(inner);
        inner.setLayoutData(gridData);
        return inner;
    }

    protected Label createLabel(Composite inner, String text) {
        return toolkit.createLabel(inner, text);
    }

    protected Label createLabel(Composite inner, String text, int flags) {
        return toolkit.createLabel(inner, text, flags);
    }

    protected Text createText(Composite inner) {
        return createText(inner, SWT.NONE | SWT.BORDER);
    }

    protected Text createText(Composite inner, int flags) {
        Text answer = toolkit.createText(inner, "", flags);
        GridData gdata = new GridData(GridData.FILL_HORIZONTAL);
        answer.setLayoutData(gdata);
        answer.addKeyListener(new KeyListener() {

            @Override
            public void keyReleased(KeyEvent e) {
                validate();
            }

            @Override
            public void keyPressed(KeyEvent e) {
                validate();
            }
        });
        return answer;
    }

    protected Text createTextArea(Composite inner) {
        return createTextArea(inner, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
    }

    protected Text createTextArea(Composite inner, int flags) {
        Text answer = toolkit.createText(inner, "", flags);
        GridData gdata = new GridData(SWT.FILL, SWT.FILL, true, true);
        answer.setLayoutData(gdata);
        answer.addKeyListener(new KeyListener() {

            @Override
            public void keyReleased(KeyEvent e) {
                validate();
            }

            @Override
            public void keyPressed(KeyEvent e) {
                validate();
            }
        });
        return answer;
    }

    protected Text createBeanPropertyPasswordField(Composite parent, Object bean, String propertyName,
            String labelText, String tooltip) {
        return createBeanPropertyTextField(parent, bean, propertyName, labelText, tooltip,
                SWT.NONE | SWT.BORDER | SWT.PASSWORD);
    }

    protected Text createBeanPropertyTextField(Composite parent, Object bean, String propertyName, String labelText,
            String tooltip) {
        return createBeanPropertyTextField(parent, bean, propertyName, labelText, tooltip, SWT.NONE | SWT.BORDER);
    }

    protected Text createBeanPropertyTextField(Composite parent, Object bean, String propertyName, String labelText,
            String tooltip, int flags) {
        createLabel(parent, labelText);
        Text text = createText(parent, flags);
        text.setToolTipText(tooltip);
        ISWTObservableValue textValue = Forms.observe(text);
        Forms.bindBeanProperty(getDataBindingContext(), getMessageManager(), bean, propertyName,
                isMandatory(bean, propertyName), labelText, textValue, text);
        return text;
    }

    protected ComboViewer createBeanPropertyCombo(Composite parent, Object bean, String propertyName,
            String labelText, String tooltip, int flags) {
        createLabel(parent, labelText);
        ComboViewer combo = new ComboViewer(parent, flags);
        combo.setContentProvider(ArrayContentProvider.getInstance());

        IViewerObservableValue comboValue = ViewersObservables.observeSingleSelection(combo);
        Control control = combo.getControl();
        GridData gdata = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gdata.widthHint = 400;
        control.setLayoutData(gdata);

        IValidator validator = null;
        if (isMandatory(bean, propertyName)) {
            if (control instanceof Combo) {
                validator = new MandatoryComboValidator(labelText, (Combo) control);
            } else {
                validator = new MandatoryValidator(labelText);
            }
        }

        Forms.bindBeanProperty(getDataBindingContext(), getMessageManager(), bean, propertyName, validator,
                comboValue, control);

        toolkit.adapt(control, true, true);
        return combo;
    }

    protected ListViewer createBeanPropertyList(Composite parent, Object bean, String propertyName,
            String labelText, String tooltip, int flags) {
        createLabel(parent, labelText);
        ListViewer combo = new ListViewer(parent, flags);
        combo.setContentProvider(ArrayContentProvider.getInstance());

        IViewerObservableValue comboValue = ViewersObservables.observeSingleSelection(combo);
        Control control = combo.getControl();
        GridData gdata = new GridData(GridData.FILL_BOTH);
        control.setLayoutData(gdata);

        Forms.bindBeanProperty(getDataBindingContext(), getMessageManager(), bean, propertyName,
                isMandatory(bean, propertyName), labelText, comboValue, control);

        toolkit.adapt(control, true, true);
        combo.refresh();
        return combo;
    }

    public boolean isValid() {
        return Forms.isValid(getDataBindingContext());
    }

    protected boolean isMandatory(Object bean, String propertyName) {
        return mandatoryPropertyNames.contains(propertyName);
    }

    protected void validate() {
        if (validator != null) {
            validator.validate();
        }
    }

    protected void setButtonLayoutData(Button button) {
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
        data.widthHint = Math.max(widthHint, minSize.x);
        button.setLayoutData(data);
    }

    protected int convertHorizontalDLUsToPixels(int dlus) {
        // test for failure to initialize for backward compatibility
        if (fontMetrics == null) {
            return 0;
        }
        return Dialog.convertHorizontalDLUsToPixels(fontMetrics, dlus);
    }

    public Control createDialogArea(Composite parent) {
        createForm(parent);

        createTextFields(parent);

        return parent;
    }

    protected abstract void createTextFields(Composite parent);

    public abstract void okPressed();

}