/*******************************************************************************
* Copyright (c) 2012 VMWare, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMWare, Inc. - initial API and implementation
*******************************************************************************/
package org.grails.ide.eclipse.ui.internal.properties;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
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 org.grails.ide.eclipse.core.GrailsCoreActivator;
import org.grails.ide.eclipse.core.internal.model.DefaultGrailsInstall;
import org.grails.ide.eclipse.core.model.IGrailsInstall;
import org.springframework.util.StringUtils;
import org.grails.ide.eclipse.ui.GrailsUiActivator;
/**
* @author Christian Dupuis
* @author Kris De Volder
*/
public class GrailsInstallDialog extends TitleAreaDialog {
private Text homeText;
private Text nameText;
private Text versionText;
private String home;
private String name;
private IGrailsInstall install;
private InstalledGrailsInstallBlock prefPage;
public GrailsInstallDialog(Shell parentShell, IGrailsInstall install, InstalledGrailsInstallBlock parent) {
super(parentShell);
this.prefPage = parent;
this.install = install;
this.name = install.getName();
this.home = install.getHome();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite parentComposite = (Composite) super.createDialogArea(parent);
Composite composite = new Composite(parentComposite, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginHeight = 10;
layout.marginWidth = 10;
layout.numColumns = 2;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label name = new Label(composite, SWT.WRAP);
name.setText("Name:");
// name.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
nameText = new Text(composite, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
if (install.getName() != null) {
nameText.setText(install.getName());
}
nameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
GrailsInstallDialog.this.name = nameText.getText();
validate(false);
}
});
Label version = new Label(composite, SWT.WRAP);
version.setText("Version:");
// version.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
versionText = new Text(composite, SWT.BORDER);
versionText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
versionText.setEnabled(false);
if (install.getVersionString() != null && !"<unknown>".equals(install.getVersionString())) {
versionText.setText(install.getVersionString());
}
Label directory = new Label(composite, SWT.WRAP);
directory.setText("Grails home:");
// directory.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
homeText = new Text(composite, SWT.BORDER);
homeText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
homeText.setEnabled(false);
if (install.getHome() != null) {
homeText.setText(install.getHome());
}
homeText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate(true);
}
});
new Label(composite, SWT.WRAP);
Button browseButton = new Button(composite, SWT.PUSH);
browseButton.setText("Browse...");
browseButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getShell());
dialog.setMessage("Select Grails installation directory");
dialog.setText("Grails installation directory");
String result = dialog.open();
if (StringUtils.hasText(result)) {
homeText.setText(result);
home = result;
validate(true);
if (!StringUtils.hasText(nameText.getText()) && StringUtils.hasText(versionText.getText())) {
nameText.setText(prefPage.generateName("Grails " + versionText.getText(), install));
}
}
}
});
Dialog.applyDialogFont(composite);
setTitle("Configure Grails Installation");
setTitleImage(GrailsUiActivator.getImageDescriptor("icons/full/wizban/grails_wizban.png").createImage());
return composite;
}
protected void validate(boolean validateHome) {
clearError();
if (homeText.getText() == null || homeText.getText().equals("")) {
setError("Select a Grails home directory");
return;
}
else if (validateHome) {
File rooHome = new File(homeText.getText());
if (!rooHome.exists()) {
setError("Specified directory does not exist");
return;
}
else if (!rooHome.isDirectory()) {
setError("Specified path does not point to a directory");
return;
}
else {
if (!(new File(rooHome, "lib").exists())) {
setError("Specified directory does not appear to be a Grails installation");
return;
}
if (!(new File(rooHome, "dist").exists())) {
setError("Specified directory does not appear to be a Grails installation");
return;
}
}
File buildProperties = new File(rooHome, "build.properties");
if (buildProperties.exists()) {
Properties props = new Properties();
try {
props.load(new FileInputStream(buildProperties));
if (props.getProperty("grails.version") != null) {
versionText.setText(props.getProperty("grails.version"));
}
else {
setError("Can't read version from build.properties");
return;
}
}
catch (FileNotFoundException e) {
GrailsCoreActivator.log("Can't read version from build.properties", e);
setError("Specified directory does not appear to be a Grails installation");
return;
}
catch (IOException e) {
GrailsCoreActivator.log("Can't read version from build.properties", e);
setError("Specified directory does not appear to be a Grails installation");
return;
}
}
else {
setError("Specified directory does not appear to be a Grails installation");
return;
}
}
if (nameText.getText() == null || nameText.getText().equals("")) {
setError("A unique name is required");
}
else {
if (prefPage.isDuplicateName(nameText.getText(), install)) {
setError("Name is not unique");
}
}
}
private void setError(String message) {
getButton(OK).setEnabled(false);
setErrorMessage(message);
}
private void clearError() {
getButton(OK).setEnabled(true);
setErrorMessage(null);
}
public IGrailsInstall getResult() {
return new DefaultGrailsInstall(home, name, install.isDefault());
}
}