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

Java tutorial

Introduction

Here is the source code for org.jboss.tools.common.model.ui.attribute.editor.ActionButtonControl.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.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
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.jboss.tools.common.model.ui.actions.IActionProvider;
import org.jboss.tools.common.model.ui.widgets.DefaultSettings;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;

public class ActionButtonControl implements IPropertyFieldEditor {

    private Composite composite;
    private ArrayList<ButtonWrapper> buttons;
    private IPropertyEditor propertyEditor;
    private IActionProvider actionProvider;
    private IWidgetSettings settings = DefaultSettings.getDefault();

    public void setPropertyEditor(IPropertyEditor propertyEditor) {
        this.propertyEditor = propertyEditor;
        initialize();
    }

    public Control getControl() {
        return composite;
    }

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

            composite.setBackgroundMode(SWT.INHERIT_DEFAULT);

            GridLayout layout = new GridLayout();
            layout.horizontalSpacing = 5;
            layout.verticalSpacing = 5;
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            composite.setLayout(layout);

            for (int i = 0; i < buttons.size(); ++i) {
                createButton(composite, (ButtonWrapper) buttons.get(i));
            }
        }
        return composite;
    }

    private Control createButton(Composite parent, ButtonWrapper buttonWrapper) {
        int style = getSettings().getStyle("Button.Style"); //$NON-NLS-1$
        if (style == SWT.DEFAULT)
            style = SWT.NONE;
        if (style == 0)
            style = SWT.PUSH;
        Control buttonControl = buttonWrapper.createControl(parent, style);
        // widget settings
        Color fg = getSettings().getColor("Button.Foreground"); //$NON-NLS-1$
        Font font = getSettings().getFont("Button.Font"); //$NON-NLS-1$

        buttonControl.setForeground(fg);
        buttonControl.setFont(font);
        // layout data
        GridData gd = new GridData();
        gd.widthHint = convertHorizontalDLUsToPixels(buttonControl, IDialogConstants.BUTTON_WIDTH);
        buttonControl.setLayoutData(gd);
        return buttonControl;
    }

    private void initialize() {
        if (propertyEditor != null) {
            actionProvider = (IActionProvider) propertyEditor.getAdapter(IActionProvider.class);
            if (actionProvider == null)
                return;
            List actions = Arrays.asList(actionProvider.getActions());
            Iterator i = actions.iterator();
            ButtonWrapper buttonWrapper;
            buttons = new ArrayList<ButtonWrapper>();
            while (i.hasNext()) {
                buttonWrapper = new ButtonWrapper((IAction) i.next());
                buttons.add(buttonWrapper);
            }
        }
    }

    class ButtonWrapper implements IPropertyChangeListener {
        private IAction buttonAction;
        private Button buttonControl;
        private boolean enabled = Boolean.FALSE.booleanValue(); // by default

        private ButtonWrapper() {
        }

        public ButtonWrapper(IAction buttonAction) {
            this.buttonAction = buttonAction;
            this.enabled = buttonAction.isEnabled();
            buttonAction.addPropertyChangeListener(this);
        }

        public Control createControl(Composite parent, int style) {
            if (buttonControl == null) {
                buttonControl = new Button(parent, style);
                buttonControl.setText(buttonAction.getText() != null ? buttonAction.getText() : "%text%"); //$NON-NLS-1$
                buttonControl.setEnabled(enabled);
                buttonControl.addSelectionListener(new SelectionListener() {
                    public void widgetSelected(SelectionEvent e) {
                        buttonAction.run();
                    }

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

        public Control getControl() {
            return buttonControl;
        }

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

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

        public void propertyChange(PropertyChangeEvent event) {
            if (IAction.ENABLED.equals(event.getProperty())) {
                this.enabled = ((Boolean) event.getNewValue()).booleanValue();
                if (buttonControl != null && !buttonControl.isDisposed()) {
                    buttonControl.setEnabled(this.enabled);
                }
            }
        }
    }

    public IWidgetSettings getSettings() {
        return settings;
    }

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

    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 void setEnabled(boolean enabled) {
        IAction[] actions = actionProvider.getActions();
        if (actions != null && actions.length > 0) {
            for (int i = 0; i < actions.length; ++i)
                actions[i].setEnabled(enabled);
        }
    }

}