org.jboss.tools.common.model.ui.attribute.editor.DefaultButtonControl.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.common.model.ui.attribute.editor.DefaultButtonControl.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.common.model.ui.attribute.editor;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Layout;

import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.widgets.DefaultSettings;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;

public class DefaultButtonControl implements IButtonControl {

    private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private Composite composite;
    private IWidgetSettings settings;
    private ArrayList<String> actions = new ArrayList<String>();
    private HashMap<String, ButtonWrapper> buttons = new HashMap<String, ButtonWrapper>();
    private Layout layout;

    public void setLayout(Layout layout) {
        this.layout = layout;
    }

    public void setWidgetSettings(IWidgetSettings settings) {
        this.settings = settings;
    }

    public void addButton(String action, String label) {
        actions.add(action);
        buttons.put(action, new ButtonWrapper(action, label));
        if (this.composite != null) {
            // add button to composite
            createButton(composite, (ButtonWrapper) buttons.get(action));
            refresh();
        }
    }

    public void removeButton(String action) {
        actions.remove(action);
        buttons.remove(action);
        if (this.composite != null) {
            // remove button from composite
            ((ButtonWrapper) buttons.get(action)).dispose();
            refresh();
        }
    }

    public void clear() {
        // dispose buttons
        Iterator i = actions.iterator();
        while (i.hasNext()) {
            ButtonWrapper buttonWrapper = ((ButtonWrapper) buttons.get(i.next()));
            buttonWrapper.dispose();
        }
        refresh();
        // clear HashSet
        actions.clear();
        buttons.clear();
    }

    public Control createControl(Composite parent) {
        if (composite == null) {
            composite = new Composite(parent, SWT.NONE);

            composite.setBackgroundMode(SWT.INHERIT_DEFAULT);
            //         composite.setBackground(parent.getBackground());

            if (layout == null)
                layout = createDefaultLayout();
            composite.setLayout(layout);

            if (buttons.size() > 0) {
                // add all buttons
                Iterator i = actions.iterator();
                while (i.hasNext()) {
                    Object object = i.next();
                    ButtonWrapper buttonWrapper = (ButtonWrapper) buttons.get(object);
                    if (buttonWrapper != null) {
                        createButton(composite, buttonWrapper);
                    } else {
                        if (ModelUIPlugin.getDefault().isDebugging()) {
                            ModelUIPlugin.getPluginLog().logInfo("No button for action: " + object); //$NON-NLS-1$
                        }
                    }
                }
            } else {
                // set composite width equals button width + margins
                int margins = 0;
                if (layout instanceof GridLayout) {
                    margins += ((GridLayout) layout).marginWidth * 2;
                }
                GridData gd = new GridData();
                gd.widthHint = margins + convertHorizontalDLUsToPixels(composite, IDialogConstants.BUTTON_WIDTH);
                composite.setLayoutData(gd);
            }
        }
        return composite;
    }

    protected Layout createDefaultLayout() {
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.horizontalSpacing = 5;
        layout.verticalSpacing = 5;
        return layout;
    }

    protected Control createButton(Composite parent, ButtonWrapper buttonWrapper) {
        int style = getSettings().getStyle("Button.Style"); //$NON-NLS-1$
        if (style == SWT.DEFAULT)
            style = SWT.PUSH;
        Control buttonControl = buttonWrapper.createControl(parent, style);
        // widget settings
        Color bg = getSettings().getColor("Button.Background"); //$NON-NLS-1$
        Color fg = getSettings().getColor("Button.Foreground"); //$NON-NLS-1$
        Font font = getSettings().getFont("Button.Font"); //$NON-NLS-1$
        buttonControl.setBackground(bg);
        buttonControl.setForeground(fg);
        buttonControl.setFont(font);
        // layout data
        GridData gd = new GridData();
        gd.widthHint = convertHorizontalDLUsToPixels(buttonControl, IDialogConstants.BUTTON_WIDTH);
        buttonControl.setLayoutData(gd);
        //
        return buttonControl;
    }

    protected void refresh() {
        Collection collection;
        Iterator i;
        if ((composite == null) || (composite.isDisposed()))
            return;
        // setRedraw(false) 
        collection = buttons.values();
        i = collection.iterator();
        while (i.hasNext()) {
            ButtonWrapper buttonWrapper = (ButtonWrapper) i.next();
            buttonWrapper.getControl().setRedraw(Boolean.FALSE.booleanValue());
        }
        composite.setRedraw(Boolean.FALSE.booleanValue());
        // layout();      
        composite.layout(Boolean.TRUE.booleanValue());
        // setRedraw(true) 
        collection = buttons.values();
        i = collection.iterator();
        while (i.hasNext()) {
            ButtonWrapper buttonWrapper = (ButtonWrapper) i.next();
            buttonWrapper.getControl().setRedraw(Boolean.TRUE.booleanValue());
        }
        composite.setRedraw(Boolean.TRUE.booleanValue());
    }

    public Control getControl() {
        return composite;
    }

    public void setEnabled(String action, boolean enabled) {
        ((ButtonWrapper) buttons.get(action)).setEnabled(enabled);
    }

    public void dispose() {
        // remove all buttons
        clear();
        // dispose component
        composite.dispose();
        composite = null;
        // clear listeners
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        pcs.addPropertyChangeListener(listener);
    }

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

    protected void firePropertyChange(PropertyChangeEvent event) {
        pcs.firePropertyChange(event);
    }

    protected void doButtonPressed(Button control, String action) {
        if (ModelUIPlugin.getDefault().isDebugging()) {
            ModelUIPlugin.getPluginLog().logInfo("Button pressed: " + action); //$NON-NLS-1$
        }
        firePropertyChange(new PropertyChangeEvent(control, action, null, Boolean.TRUE));
    }

    class ButtonWrapper {
        private String buttonAction;
        private String buttonLabel;
        private Button buttonControl;
        private boolean enabled = Boolean.TRUE.booleanValue(); // by default

        private ButtonWrapper() {
        }

        public ButtonWrapper(String buttonAction, String buttonLabel) {
            this.buttonAction = buttonAction;
            this.buttonLabel = buttonLabel;
        }

        public Control createControl(Composite parent, int style) {
            if (buttonControl == null) {
                buttonControl = new Button(parent, style);
                buttonControl.setText(buttonLabel);
                buttonControl.setEnabled(enabled);
                buttonControl.addSelectionListener(new SelectionListener() {
                    public void widgetSelected(SelectionEvent e) {
                        doButtonPressed(buttonControl, buttonAction);
                    }

                    public void widgetDefaultSelected(SelectionEvent e) {
                    }
                });
            }
            return buttonControl;
        }

        public Control getControl() {
            return buttonControl;
        }

        public void dispose() {
            buttonControl.dispose();
            buttonControl = null;
            buttonAction = null;
            buttonLabel = null;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
            if (buttonControl != null)
                buttonControl.setEnabled(enabled);
        }
    }

    protected int convertHorizontalDLUsToPixels(Control control, int dlus) {
        GC gc = new GC(control);
        gc.setFont(control.getFont());
        int averageWidth = gc.getFontMetrics().getAverageCharWidth();
        gc.dispose();

        double horizontalDialogUnitSize = averageWidth * 0.25;

        return (int) Math.round(dlus * horizontalDialogUnitSize);
    }

    protected int convertVerticalDLUsToPixels(Control control, int dlus) {
        GC gc = new GC(control);
        gc.setFont(control.getFont());
        int height = gc.getFontMetrics().getHeight();
        gc.dispose();

        double verticalDialogUnitSize = height * 0.125;

        return (int) Math.round(dlus * verticalDialogUnitSize);
    }

    public IWidgetSettings getSettings() {
        if (settings == null)
            settings = DefaultSettings.getDefault();
        return settings;
    }

    public void setSettings(IWidgetSettings settings) {
        this.settings = settings;
    }

}