package com.github.sdbg.integration.jdt.gwt.build.ui;
import com.github.sdbg.integration.jdt.gwt.build.GWTSDMProperties;
import com.github.sdbg.integration.jdt.gwt.build.GWTSDMProperties.HotCodeReplacePolicy;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
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.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
public class GWTSDMPropertyPage extends PropertyPage implements IWorkbenchPropertyPage {
private Button recompileEnabledCheck;
private Text codeServerHostText;
private Text codeServerPortText;
private Text moduleNamesText;
private Button[] hotCodeReplacePolicyRadio;
public GWTSDMPropertyPage() {
}
@Override
public String getErrorMessage() {
if (recompileEnabledCheck.getSelection()) {
if (codeServerHostText.getText().trim().length() == 0) {
return "Code Server Host cannot be empty";
} else if (codeServerPortText.getText().trim().length() == 0) {
return "Code Server Port cannot be empty";
} else if (moduleNamesText.getText().trim().length() == 0) {
return "At least one GWT Module should be specified";
} else {
try {
int port = Integer.parseInt(codeServerPortText.getText().trim());
if (port < 0) {
return "Code Server Port cannot be less than 0";
} else if (port > 65535) {
return "Code Server Port cannot be greater than less than 65535";
}
} catch (Exception e) {
return "Invalid Code Server Port number: " + e.getMessage();
}
}
}
return null;
}
@Override
public boolean isValid() {
return getErrorMessage() == null;
}
@Override
public boolean performOk() {
applyChanges();
return super.performOk();
}
@Override
protected Control createContents(Composite parent) {
try {
Composite contents = new Composite(parent, SWT.NONE);
contents.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).create());
GWTSDMProperties properties = getProperties();
recompileEnabledCheck = new Button(contents, SWT.CHECK);
recompileEnabledCheck.setText("Enable automatic GWT SDM recompilation during project build");
recompileEnabledCheck.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create());
recompileEnabledCheck.setSelection(properties.isRecompileEnabled());
recompileEnabledCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
updateControls();
validate();
}
});
Group codeServerGroup = new Group(contents, SWT.NONE);
codeServerGroup.setText("Code Server");
codeServerGroup.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create());
codeServerGroup.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).grab(
true,
false).create());
Label label = new Label(codeServerGroup, SWT.NONE);
label.setLayoutData(new GridData());
label.setText("Host: ");
codeServerHostText = new Text(codeServerGroup, SWT.BORDER);
codeServerHostText.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(
true,
false).create());
codeServerHostText.setText(properties.getCodeServerHost());
codeServerHostText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
validate();
}
});
label = new Label(codeServerGroup, SWT.NONE);
label.setLayoutData(new GridData());
label.setText("Port: ");
codeServerPortText = new Text(codeServerGroup, SWT.BORDER);
codeServerPortText.setLayoutData(GridDataFactory.swtDefaults().hint(60, SWT.DEFAULT).create());
codeServerPortText.setText(Integer.toString(properties.getCodeServerPort()));
codeServerPortText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
validate();
}
});
Group gwtModulesGroup = new Group(contents, SWT.NONE);
gwtModulesGroup.setText("GWT Modules");
gwtModulesGroup.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).create());
gwtModulesGroup.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).grab(
true,
false).create());
moduleNamesText = new Text(gwtModulesGroup, SWT.BORDER);
moduleNamesText.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(
true,
false).create());
moduleNamesText.setText(properties.getModuleNames());
moduleNamesText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
validate();
}
});
label = new Label(gwtModulesGroup, SWT.WRAP);
label.setLayoutData(GridDataFactory.swtDefaults().align(SWT.RIGHT, SWT.TOP).create());
label.setText("(a comma-separated list of module names)");
Group hotCodeReplacePolicyGroup = new Group(contents, SWT.NONE);
hotCodeReplacePolicyGroup.setText("Hot Code Replace Policy");
hotCodeReplacePolicyGroup.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).create());
hotCodeReplacePolicyGroup.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).grab(
true,
false).create());
hotCodeReplacePolicyRadio = new Button[HotCodeReplacePolicy.values().length];
int count = 0;
for (HotCodeReplacePolicy policy : HotCodeReplacePolicy.values()) {
Button radio = new Button(hotCodeReplacePolicyGroup, SWT.RADIO);
radio.setText(policy.getDescription());
radio.setData(HotCodeReplacePolicy.class.getName(), policy);
radio.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create());
radio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
validate();
}
});
hotCodeReplacePolicyRadio[count++] = radio;
}
for (Button radio : hotCodeReplacePolicyRadio) {
if (radio.getData(HotCodeReplacePolicy.class.getName()) == properties.getHotCodeReplacePolicy()) {
radio.setSelection(true);
}
}
label = new Label(hotCodeReplacePolicyGroup, SWT.WRAP);
label.setLayoutData(GridDataFactory.swtDefaults().hint(700, SWT.DEFAULT).create());
label.setText("\nNote:"
+ "\n- For Hot Code Replace to work, you need an active SDBG debug session"
+ "\n- Chrome Live Edit will likely crash your browser with anything but the smallest GWT project");
updateControls();
validate();
return contents;
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
@Override
protected void performApply() {
applyChanges();
super.performApply();
}
@Override
protected void performDefaults() {
recompileEnabledCheck.setSelection(GWTSDMProperties.DEFVALUE_RECOMPILE_ENABLED);
codeServerHostText.setText(GWTSDMProperties.DEFVALUE_CODE_SERVER_HOST);
codeServerPortText.setText(Integer.toString(GWTSDMProperties.DEFVALUE_CODE_SERVER_PORT));
moduleNamesText.setText(GWTSDMProperties.DEFVALUE_MODULE_NAMES);
for (Button radio : hotCodeReplacePolicyRadio) {
if (radio.getData(HotCodeReplacePolicy.class.getName()) == GWTSDMProperties.DEFVALUE_HOT_CODE_REPLACE_POLICY) {
radio.setSelection(true);
}
}
updateControls();
super.performDefaults();
}
private void applyChanges() {
try {
GWTSDMProperties properties = getProperties();
properties.setRecompileEnabled(recompileEnabledCheck.getSelection());
properties.setCodeServerHost(codeServerHostText.getText().trim());
properties.setCodeServerPort(Integer.parseInt(codeServerPortText.getText().trim()));
properties.setModuleNames(moduleNamesText.getText().trim());
for (Button radio : hotCodeReplacePolicyRadio) {
if (radio.getSelection()) {
properties.setHotCodeReplacePolicy((HotCodeReplacePolicy) radio.getData(HotCodeReplacePolicy.class.getName()));
}
}
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
private GWTSDMProperties getProperties() {
return new GWTSDMProperties((IProject) getElement());
}
private void updateControls() {
boolean enabled = recompileEnabledCheck.getSelection();
codeServerHostText.setEnabled(enabled);
codeServerPortText.setEnabled(enabled);
moduleNamesText.setEnabled(enabled);
for (Button radio : hotCodeReplacePolicyRadio) {
radio.setEnabled(enabled);
}
}
private void validate() {
setErrorMessage(getErrorMessage());
setValid(isValid());
//updateApplyButton();
}
}