/*******************************************************************************
* 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);
}
}
}