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