package org.testng.eclipse.launch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.testng.eclipse.launch.TestNGLaunchConfigurationConstants.LaunchType;
import org.testng.eclipse.ui.util.Utils;
public abstract class TestngTestSelector {
public interface ButtonHandler {
void handleButton();
}
public abstract void initializeFrom(ILaunchConfiguration configuration);
private Button m_radioButton;
private Text m_text;
private ModifyListener m_textAdapter;
private TestNGMainTab m_callback;
private LaunchType m_launchType;
TestngTestSelector() {
}
TestngTestSelector(TestNGMainTab callback, ButtonHandler buttonHandler,
LaunchType testngType, Composite comp, String labelKey) {
init(callback, buttonHandler, comp, testngType, labelKey);
}
public void attachModificationListener() {
m_text.addModifyListener(m_textAdapter);
}
public void detachModificationListener() {
m_text.removeModifyListener(m_textAdapter);
}
public void enableRadio(boolean state) {
m_radioButton.setEnabled(state);
}
public void setTextEditable(boolean editable) {
m_text.setEditable(editable);
}
public void setRadioSelected(boolean selected) {
m_radioButton.setSelection(selected);
}
public void setText(String string) {
m_text.setText(string);
}
public String getText() {
return m_text.getText();
}
public LaunchType getTestngType() {
return m_launchType;
}
public Button getRadioButton() {
return m_radioButton;
}
public TestNGMainTab getCallback() {
return m_callback;
}
/**
* This method is final but non-private because it is called by the constructor
* but also available to callers who wish to use the no-arg constructor,
* construct their buttonHandler, and only then do this initializing.
* @param callback
* @param buttonHandler
* @param testngType
* @param comp
*/
final void init(TestNGMainTab callback, ButtonHandler buttonHandler,
Composite comp, LaunchType testngType, String labelKey) {
m_callback = callback;
m_launchType = testngType;
m_textAdapter = new TextAdapter(testngType);
SelectionAdapter radioAdapter = new RadioAdapter(testngType);
SelectionAdapter buttonAdapter = new ButtonAdapter(testngType,
buttonHandler);
Utils.Widgets wt = Utils.createWidgetTriple(comp, labelKey,
radioAdapter, buttonAdapter, m_textAdapter);
m_radioButton = wt.radio;
m_text = wt.text;
}
/////
// RadioAdapter
//
class RadioAdapter extends SelectionAdapter {
private LaunchType m_type;
public RadioAdapter(LaunchType type) {
m_type = type;
}
@Override
public void widgetSelected(SelectionEvent evt) {
if (((Button) evt.widget).getSelection()) {
m_callback.setType(m_type);
}
}
}
//
// RadioAdapter
/////
/////
// TextAdapter
//
class TextAdapter implements ModifyListener {
LaunchType m_type;
public TextAdapter(LaunchType type) {
m_type = type;
}
public void modifyText(ModifyEvent evt) {
m_callback.setType(m_type);
}
}
//
// TextAdapter
/////
/////
// ButtonAdapter
//
class ButtonAdapter extends SelectionAdapter {
private LaunchType m_type;
private ButtonHandler m_handler;
public ButtonAdapter(LaunchType type, ButtonHandler handler) {
m_type = type;
m_handler = handler;
}
@Override
public void widgetSelected(SelectionEvent evt) {
m_callback.setType(m_type);
try {
m_callback.setEnabledRadios(false);
m_handler.handleButton();
} finally {
m_callback.setEnabledRadios(true);
}
}
//
// ButtonAdapter
/////
};
}