package com.googlecode.goclipse.ui.wizards;
import java.util.WeakHashMap;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Path;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
public class NewSourceFileComposite extends Composite {
private Text sourceFolderName;
private Text sourceFilename;
public enum SourceFileType {
PACKAGE_FILE,
MAIN_DEFAULT,
MAIN_WITH_PARAMETERS,
MAIN_WEBSERVER,
TEST
}
private SourceFileType sourceFileType = SourceFileType.PACKAGE_FILE;
private WeakHashMap<DialogChangeListener, DialogChangeListener> dialogChangeListeners
= new WeakHashMap<DialogChangeListener, DialogChangeListener>();
/**
* Create the composite.
*
* @param parent
* @param style
*/
public NewSourceFileComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(3, false));
Label lblSourceFolder = new Label(this, SWT.NONE);
lblSourceFolder.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER,
false, false, 1, 1));
lblSourceFolder.setText("Source Folder:");
sourceFolderName = new Text(this, SWT.BORDER);
GridData gd_sourceFolderName = new GridData(SWT.LEFT, SWT.CENTER,
false, false, 1, 1);
gd_sourceFolderName.widthHint = 263;
sourceFolderName.setLayoutData(gd_sourceFolderName);
sourceFolderName.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
fireDialogChange();
}
});
Button browseButton = new Button(this, SWT.NONE);
browseButton.setText("Browse...");
browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleBrowse();
}
});
Label lblSourceFilename = new Label(this, SWT.NONE);
lblSourceFilename.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER,
false, false, 1, 1));
lblSourceFilename.setText("Source FIle:");
sourceFilename = new Text(this, SWT.BORDER);
GridData gd_sourceFilename = new GridData(SWT.LEFT, SWT.CENTER, false,
false, 1, 1);
gd_sourceFilename.widthHint = 263;
sourceFilename.setLayoutData(gd_sourceFilename);
sourceFilename.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
fireDialogChange();
}
});
new Label(this, SWT.NONE);
new Label(this, SWT.NONE);
Group grpSourceFileType = new Group(this, SWT.NONE);
grpSourceFileType.setText("Source File Type");
grpSourceFileType.setLayout(new GridLayout(1, false));
GridData gd_grpSourceFileType = new GridData(SWT.LEFT, SWT.CENTER,
false, false, 1, 1);
gd_grpSourceFileType.widthHint = 273;
grpSourceFileType.setLayoutData(gd_grpSourceFileType);
final Button btnPackageSourceFile = new Button(grpSourceFileType, SWT.RADIO);
btnPackageSourceFile.setSelection(true);
btnPackageSourceFile.setText("Package Source File");
btnPackageSourceFile.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
eval();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
eval();
}
public void eval() {
if (btnPackageSourceFile.getSelection()) {
sourceFileType = SourceFileType.MAIN_DEFAULT;
//Update the filename
sourceFilename.setText(getNewFileName(sourceFilename.getText(), false));
}
}
});
final Button btnCommandSourceFile = new Button(grpSourceFileType, SWT.RADIO);
GridData gd_btnCommandSourceFile = new GridData(SWT.LEFT, SWT.CENTER,
false, false, 1, 1);
gd_btnCommandSourceFile.widthHint = 258;
btnCommandSourceFile.setLayoutData(gd_btnCommandSourceFile);
btnCommandSourceFile.setText("Command Source File");
final CCombo combo = new CCombo(grpSourceFileType, SWT.BORDER);
combo.setItems(new String[] { "Empty Main Function", "Main Function with Parameters", "Simple Web Server" });
combo.select(0);
combo.setEnabled(false);
combo.setEditable(false);
GridData gd_combo = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
gd_combo.widthHint = 231;
combo.setLayoutData(gd_combo);
combo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) { eval();}
@Override
public void widgetDefaultSelected(SelectionEvent e) { eval();}
public void eval() {
switch (combo.getSelectionIndex()){
case 0:
sourceFileType = SourceFileType.MAIN_DEFAULT;
return;
case 1:
sourceFileType = SourceFileType.MAIN_WITH_PARAMETERS;
return;
case 2:
sourceFileType = SourceFileType.MAIN_WEBSERVER;
return;
}
}
});
btnCommandSourceFile.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
eval();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
eval();
}
public void eval() {
if (btnCommandSourceFile.getSelection()) {
combo.setEnabled(true);
switch (combo.getSelectionIndex()){
case 0:
sourceFileType = SourceFileType.MAIN_DEFAULT;
break;
case 1:
sourceFileType = SourceFileType.MAIN_WITH_PARAMETERS;
break;
case 2:
sourceFileType = SourceFileType.MAIN_WEBSERVER;
break;
}
//Update the filename
sourceFilename.setText(getNewFileName(sourceFilename.getText(), false));
} else {
combo.setEnabled(false);
}
}
});
final Button btnTestSourceFile = new Button(grpSourceFileType, SWT.RADIO);
btnTestSourceFile.setText("Test Source File");
new Label(this, SWT.NONE);
btnTestSourceFile.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
eval();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
eval();
}
public void eval() {
if (btnTestSourceFile.getSelection()) {
sourceFileType = SourceFileType.TEST;
//Update the filename
sourceFilename.setText(getNewFileName(sourceFilename.getText(), true));
}
}
});
}
/**
* Adds '_test' if it should be the filename of a test file,
* or removes '_test' when it shouldn't be a test file
* @param currentFileName The current name of the file
* @param testFile Whether it should be the name of a test file
* @return Returns the changed file name
*/
public String getNewFileName(String currentFileName, boolean testFile) {
if(testFile) {
if(!currentFileName.endsWith("_test.go")) {
return currentFileName.replace(".go", "_test.go");
}
} else {
if(currentFileName.endsWith("_test.go")) {
return currentFileName.replace("_test.go", ".go");
}
}
return currentFileName;
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
/**
* Uses the standard container selection dialog to choose the new value for
* the container field.
*/
private void handleBrowse() {
ContainerSelectionDialog dialog = new ContainerSelectionDialog(
getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
"Select new source file location");
if (dialog.open() == Window.OK) {
Object[] result = dialog.getResult();
if (result.length == 1) {
sourceFolderName.setText(((Path) result[0]).toString());
}
}
fireDialogChange();
}
/**
*
* @param listener
*/
public void addDialogChangedListener(DialogChangeListener listener) {
if (!dialogChangeListeners.keySet().contains(listener)) {
dialogChangeListeners.put(listener, listener);
}
}
/**
*
* @param listener
*/
public void removeDialogChangeListener(DialogChangeListener listener) {
dialogChangeListeners.remove(listener);
}
/**
*
*/
private void fireDialogChange() {
for (DialogChangeListener listener : dialogChangeListeners.keySet()) {
listener.dialogChanged();
}
}
/**
*
* @return {@link SourceFileType}
*/
public SourceFileType getSourceFileType() {
return sourceFileType;
}
/**
* @param args
*/
public static void main(String[] args) {
/*
* Before this is run, be sure to set up the launch configuration
* (Arguments->VM Arguments) for the correct SWT library path in order
* to run with the SWT dlls. The dlls are located in the SWT plugin jar.
* For example, on Windows the Eclipse SWT 3.1 plugin jar is:
* installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
*/
Display display = Display.getDefault();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setSize(new Point(600, 400));
new NewSourceFileComposite(shell, SWT.NONE);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
/**
* @return
*/
public Text getSourceFolderName() {
return sourceFolderName;
}
/**
* @param sourceFolderName
*/
public void setSourceFolderName(Text sourceFolderName) {
this.sourceFolderName = sourceFolderName;
}
/**
* @return
*/
public Text getSourceFilename() {
return sourceFilename;
}
/**
* @param sourceFilename
*/
public void setSourceFilename(Text sourceFilename) {
this.sourceFilename = sourceFilename;
}
}