/*******************************************************************************
* 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.PropertyChangeListener;
import org.jboss.tools.common.model.ui.IAttributeErrorProvider;
import org.jboss.tools.common.model.ui.IValueChangeListener;
import org.jboss.tools.common.model.ui.IValueProvider;
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.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.actions.IActionProvider;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.ui.widgets.xpl.SelectableFormLabel;
public class HyperlinkStringButtonFieldEditor extends StringButtonFieldEditor implements IFieldEditor, IPropertyChangeListener, PropertyChangeListener, IPropertyFieldEditor {
protected PropertyEditorDialog editorDialog;
protected IPropertyEditor propertyEditor;
protected IValueProvider valueProvider;
protected IValueChangeListener valueChangeListener;
protected Composite composite;
private Label label;
private IActionProvider actionProvider;
private IAction labelAction;
public HyperlinkStringButtonFieldEditor() {}
public HyperlinkStringButtonFieldEditor(IWidgetSettings settings) {
super(settings);
}
protected Label getHyperlinkLabelControl() {
return label;
}
public Label getHyperlinkLabelControl(Composite parent) {
if (label == null) { // cannot comment this! for details see label.addDisposeListener
int style;
Color bg;
Color fg;
Font font;
if (this.labelAction!=null) {
// hyperlink style
style = getSettings().getStyle("Hyperlink.Style"); //$NON-NLS-1$
if (style==SWT.DEFAULT) style = SWT.NONE;
bg = parent.getBackground();
///getSettings().getColor("Hyperlink.Background");
fg = getSettings().getColor("Hyperlink.Foreground"); //$NON-NLS-1$
font = getSettings().getFont("Hyperlink.Font"); //$NON-NLS-1$
label = new SelectableFormLabel(parent, style);
((SelectableFormLabel)label).addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
labelAction.run();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
} else {
// label
style = getSettings().getStyle("Label.Style"); //$NON-NLS-1$
bg = parent.getBackground();
///getSettings().getColor("Label.Background");
fg = getSettings().getColor("Label.Foreground"); //$NON-NLS-1$
font = getSettings().getFont("Label.Font"); //$NON-NLS-1$
label = new Label(parent, style);
}
label.setFont(font);
/// label.setBackground(bg);
label.setForeground(fg);
label.setEnabled(isEnabled());
String text = getLabelText();
if (text != null)
label.setText(text);
label.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
label = null;
}
});
} else {
checkParent(label, parent);
}
return label;
}
public void setPropertyEditor(IPropertyEditor propertyEditor) {
this.propertyEditor = propertyEditor;
valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class);
valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class);
setPropertyChangeListener(this);
valueProvider.addValueChangeListener(this);
actionProvider = (IActionProvider)propertyEditor.getAdapter(IActionProvider.class);
if (actionProvider!=null) {
labelAction = actionProvider.getAction("LABEL_ACTION"); //$NON-NLS-1$
}
setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class));
}
protected String changePressed() {
editorDialog = new PropertyEditorDialog(ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), propertyEditor);
int i = editorDialog.open();
return (i != PropertyEditorDialog.OK) ? null : valueProvider.getStringValue(false);
}
protected void doFillIntoGrid(Composite parent, int numColumns) {
getLabelComposite(parent);
Control control = getTextChangeControl(parent);
control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
protected Composite getTextChangeControl(Composite parent)
{
//if (composite == null)
createTextChangeControl(parent);
return composite;
}
protected Control createTextChangeControl(Composite parent) {
GridData gd;
Control control;
composite = new Composite(parent, SWT.NONE);
composite.setBackgroundMode(SWT.INHERIT_DEFAULT);
/// composite.setBackground(parent.getBackground());
GridLayout gridLayout = new GridLayout(3, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
composite.setLayout(gridLayout);
Control textControl = createTextControl(composite);
gd = new GridData(GridData.FILL_HORIZONTAL);
textControl.setLayoutData(gd);
control = new Label(composite, SWT.NONE);
/// control.setBackground(parent.getBackground());
gd = new GridData();
gd.widthHint = 5;
control.setLayoutData(gd);
control = getChangeControl(composite);
gd = new GridData();
gd.widthHint = convertHorizontalDLUsToPixels(control, IDialogConstants.BUTTON_WIDTH);
gd.heightHint = textControl.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
control.setLayoutData(gd);
return composite;
}
// IPropertyChangeListener
public void propertyChange(PropertyChangeEvent event) {
if (valueChangeListener!=null) {
if (ExtendedFieldEditor.VALUE.equals(event.getProperty())) {
setPropertyChangeListener(null);
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
java.beans.PropertyChangeEvent e = new java.beans.PropertyChangeEvent(this, IPropertyEditor.VALUE, oldValue, newValue);
valueChangeListener.valueChange(e);
setPropertyChangeListener(this);
}
}
}
public void propertyChange(java.beans.PropertyChangeEvent evt) {
if (IPropertyEditor.VALUE.equals(evt.getPropertyName())) {
Object v = evt.getNewValue();
valueProvider.removeValueChangeListener(this);
this.setStringValue((v == null) ? "" : v.toString()); //$NON-NLS-1$
valueProvider.addValueChangeListener(this);
}
}
public int getNumberOfControls() {
return 2;
}
public void setEnabled(boolean enabled, Composite parent) {
Control controls[] = getControls(parent);
for (int i = 0; i < controls.length; i++) {
if (controls[i] instanceof Composite) {
Control compositeChildren[] = ((Composite)controls[i]).getChildren();
for (int j = 0; j < compositeChildren.length; compositeChildren[j++].setEnabled(enabled));
}
controls[i].setEnabled(enabled);
}
if ((label != null) && (!label.isDisposed())) {
label.setEnabled(enabled);
}
}
// IFieldEditor
public Control[] getControls(Composite parent)
{
return new Control[] {getHyperlinkLabelControl(parent), getTextChangeControl(parent)};
/*
Control mainPanelChildren[] = getTextChangeControl(parent).getChildren();
Control result[] = new Control[mainPanelChildren.length + 1];
result[0] = getLabelComposite(parent);
System.arraycopy(mainPanelChildren, 0, result, 1, mainPanelChildren.length);
return result;
*/
}
}