package fr.opensagres.mongodb.ide.launching.internal.dialogs;
import java.io.IOException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.osgi.util.NLS;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.mongodb.tools.process.InvalidMongoHomeDirException;
import com.mongodb.tools.process.MongoDBTools;
import com.mongodb.tools.process.MongoProcessFiles;
import com.mongodb.tools.process.mongod.MongodTools;
import fr.opensagres.mongodb.ide.core.model.MongoRuntime;
import fr.opensagres.mongodb.ide.core.utils.StringUtils;
import fr.opensagres.mongodb.ide.launching.internal.Messages;
/**
* Dialog used to create and edit Mongo {@link MongoRuntime}.
*
*/
public class AddRuntimeDialog extends TitleAreaDialog {
private Text name;
private Text installDir;
private MongoRuntime runtime;
public AddRuntimeDialog(Shell parentShell) {
this(parentShell, null);
}
public AddRuntimeDialog(Shell parentShell, MongoRuntime runtime) {
super(parentShell);
this.runtime = runtime;
}
@Override
protected Control createDialogArea(Composite parent) {
String title = runtime == null ? Messages.AddRuntimeDialog_title
: Messages.EditRuntimeDialog_title;
getShell().setText(title);
setTitle(title);
setMessage(Messages.AddRuntimeDialog_desc);
Composite comp = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
comp.setLayout(layout);
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
// Installation directory field.
Label label = new Label(comp, SWT.NONE);
label.setText(Messages.AddRuntimeDialog_installDir);
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
installDir = new Text(comp, SWT.BORDER);
if (runtime != null) {
installDir.setText(runtime.getInstallDir());
}
data = new GridData(GridData.FILL_HORIZONTAL);
installDir.setLayoutData(data);
installDir.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
MongoProcessFiles files = validate();
if (files != null) {
if (StringUtils.isEmpty(name.getText())) {
try {
String version = MongodTools.getDBVersion(files
.getMongodFile());
if (version != null) {
name.setText(version);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
});
Button browse = new Button(comp, SWT.NONE);
browse.setText(Messages.browseButton);
browse.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent se) {
DirectoryDialog dialog = new DirectoryDialog(
AddRuntimeDialog.this.getShell());
dialog.setMessage(Messages.AddRuntimeDialog_selectInstallDir);
dialog.setFilterPath(installDir.getText());
String selectedDirectory = dialog.open();
if (selectedDirectory != null)
installDir.setText(selectedDirectory);
}
});
// Name field
label = new Label(comp, SWT.NONE);
label.setText(Messages.AddRuntimeDialog_runtimeName);
data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
name = new Text(comp, SWT.BORDER);
if (runtime != null) {
name.setText(runtime.getName());
}
data = new GridData(GridData.FILL_HORIZONTAL);
name.setLayoutData(data);
name.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
});
Dialog.applyDialogFont(comp);
return comp;
}
@Override
protected Control createContents(Composite parent) {
Control contents = super.createContents(parent);
validate();
return contents;
}
protected MongoProcessFiles validate() {
MongoProcessFiles files = validateInstallDir();
if (files == null) {
super.getButton(IDialogConstants.OK_ID).setEnabled(false);
return null;
}
// 2) validate name
if (StringUtils.isEmpty(name.getText())) {
super.getButton(IDialogConstants.OK_ID).setEnabled(false);
setErrorMessage(Messages.errorRuntimeNameRequired);
} else {
super.getButton(IDialogConstants.OK_ID).setEnabled(true);
setErrorMessage(null);
}
return files;
}
private MongoProcessFiles validateInstallDir() {
// 1) validate install dir
if (StringUtils.isEmpty(installDir.getText())) {
setErrorMessage(Messages.errorInstallDirRequired);
return null;
}
try {
return MongoDBTools.validateMongoHomeDir(installDir.getText());
} catch (InvalidMongoHomeDirException e) {
String errorMessage = null;
switch (e.getType()) {
case baseDirNotExists:
errorMessage = NLS.bind(
Messages.errorInstallDir_baseDirNotExists, e.getFile()
.getPath());
break;
case baseDirNotDir:
errorMessage = NLS.bind(Messages.errorInstallDir_baseDirNotDir,
e.getFile().getPath());
break;
case binDirNotExists:
errorMessage = NLS.bind(
Messages.errorInstallDir_binDirNotExists, e.getFile()
.getPath());
break;
case processFileNotExists:
errorMessage = NLS.bind(
Messages.errorInstallDir_processFileNotExists, e
.getFile().getPath());
break;
}
setErrorMessage(errorMessage);
return null;
}
}
@Override
protected void okPressed() {
if (runtime == null) {
try {
runtime = new MongoRuntime(name.getText(), installDir.getText());
} catch (InvalidMongoHomeDirException e) {
e.printStackTrace();
return;
}
} else {
runtime.setName(name.getText());
try {
runtime.setInstallDir(installDir.getText());
} catch (InvalidMongoHomeDirException e) {
e.printStackTrace();
}
}
super.okPressed();
}
public MongoRuntime getRuntime() {
return runtime;
}
}