// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.core.ui.editor.properties.controllers;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.fieldassist.DecoratedField;
import org.eclipse.jface.fieldassist.IControlCreator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.properties.tab.IDynamicProperty;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.core.ui.editor.cmd.ChangeActivateStatusElementCommand;
import org.talend.designer.core.ui.editor.cmd.PropertyChangeCommand;
import org.talend.designer.core.ui.editor.connections.Connection;
import org.talend.designer.core.ui.editor.nodes.Node;
/**
* yzhang class global comment. Detailled comment
*/
public class RadioController extends AbstractElementPropertySectionController {
/**
* yzhang RadioButtonController constructor comment.
*
* @param dp
*/
public RadioController(IDynamicProperty dp) {
super(dp);
}
private List<Command> createCommand(SelectionEvent event) {
Set<String> elementsName;
Control ctrl = (Control) event.getSource();
elementsName = hashCurControls.keySet();
List<Command> commands = new ArrayList<Command>();
for (String name : elementsName) {
Object o = hashCurControls.get(name);
if (o instanceof Control) {
ctrl = (Control) o;
if (ctrl == null) {
hashCurControls.remove(name);
return null;
}
if (ctrl.equals(event.getSource())) {
if (ctrl instanceof Button) {
// only for checkbox, other buttons must be checked
// before
if (!elem.getPropertyValue(name).equals(new Boolean(((Button) ctrl).getSelection()))) {
Command cmd = null;
Boolean value = new Boolean(((Button) ctrl).getSelection());
if (name.equals(EParameterName.ACTIVATE.getName())) {
if (elem instanceof Node) {
List<Node> nodeList = new ArrayList<Node>();
nodeList.add((Node) elem);
List<Connection> connList = new ArrayList<Connection>();
cmd = new ChangeActivateStatusElementCommand(value, nodeList, connList);
commands.add(cmd);
}
} else {
cmd = new PropertyChangeCommand(elem, name, value);
commands.add(cmd);
String groupName = elem.getElementParameter(name).getGroup();
if (groupName != null && elem.getElementParameter(groupName) != null) {
Command cmd2 = new PropertyChangeCommand(elem, groupName, name);
commands.add(cmd2);
}
}
return commands;
}
}
}
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#createControl(org.eclipse.swt.widgets.Composite,
* org.talend.core.model.process.IElementParameter, int, int, int, org.eclipse.swt.widgets.Control)
*/
@Override
public Control createControl(Composite subComposite, final IElementParameter param, int numInRow, int nbInRow, int top,
Control lastControl) {
Button buttonRadio = new Button(subComposite, SWT.RADIO);
buttonRadio.setText(param.getDisplayName());
buttonRadio.setBackground(subComposite.getBackground());
FormData data = new FormData();
data.top = new FormAttachment(0, top);
if (lastControl != null) {
data.left = new FormAttachment(lastControl, 0);
} else {
data.left = new FormAttachment((((numInRow - 1) * MAX_PERCENT) / nbInRow), 0);
}
buttonRadio.setLayoutData(data);
hashCurControls.put(param.getName(), buttonRadio);
buttonRadio.setEnabled(!param.isReadOnly());
buttonRadio.addSelectionListener(listenerSelection);
if (elem instanceof Node) {
buttonRadio.setToolTipText(VARIABLE_TOOLTIP + param.getVariableName());
}
Point initialSize = buttonRadio.computeSize(SWT.DEFAULT, SWT.DEFAULT);
dynamicProperty.setCurRowSize(initialSize.y + ITabbedPropertyConstants.VSPACE);
return buttonRadio;
}
SelectionListener listenerSelection = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
List<Command> cmds = createCommand(event);
if (cmds == null) {
return;
}
for (Command cmd : cmds) {
executeCommand(cmd);
}
}
};
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#estimateRowSize(org.eclipse.swt.widgets.Composite,
* org.talend.core.model.process.IElementParameter)
*/
@Override
public int estimateRowSize(Composite subComposite, final IElementParameter param) {
final DecoratedField dField = new DecoratedField(subComposite, SWT.BORDER, new IControlCreator() {
public Control createControl(Composite parent, int style) {
return getWidgetFactory().createButton(parent, param.getDisplayName(), SWT.RADIO);
}
});
Point initialSize = dField.getLayoutControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
dField.getLayoutControl().dispose();
return initialSize.y + ITabbedPropertyConstants.VSPACE;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#refresh(org.talend.core.model.process.IElementParameter,
* boolean)
*/
@Override
public void refresh(IElementParameter param, boolean check) {
Button radioButton = (Button) hashCurControls.get(param.getName());
Object value = param.getValue();
if (radioButton == null || radioButton.isDisposed()) {
return;
}
if (value instanceof String) {
radioButton.setSelection(Boolean.valueOf((String) value));
} else {
radioButton.setSelection((Boolean) value);
}
if (param.isContextMode()) {
radioButton.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW));
radioButton.setEnabled(false);
}
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt) {
}
}