/** * Copyright (C) 2005 - 2012 Eric Van Dewoestine * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.eclim.installer.step; import java.awt.Component; import java.io.File; import java.util.Properties; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.SystemUtils; import org.apache.tools.ant.taskdefs.condition.Os; import org.formic.Installer; import org.formic.wizard.form.GuiForm; import org.formic.wizard.form.Validator; import org.formic.wizard.form.gui.component.FileChooser; import org.formic.wizard.form.validator.ValidatorBuilder; import org.formic.wizard.step.AbstractGuiStep; import net.miginfocom.swing.MigLayout; /** * Step for specifying location of eclipse installation. * * @author Eric Van Dewoestine */ public class EclipseStep extends AbstractGuiStep { private static final String[] WINDOWS_ECLIPSES = { "C:/eclipse", "C:/Program Files/eclipse", "C:/Program Files (x86)/eclipse", }; private static final String[] UNIX_ECLIPSES = { "/opt/eclipse", "/usr/lib/eclipse", "/usr/local/eclipse", "/usr/share/eclipse", SystemUtils.USER_HOME + "/eclipse", "/Applications/eclipse", }; private FileChooser eclipseHomeChooser; /** * Constructs the welcome step. */ public EclipseStep(String name, Properties properties) { super(name, properties); } /** * {@inheritDoc} * @see org.formic.wizard.step.GuiStep#init() */ public Component init() { final JPanel panel = new JPanel(new MigLayout("wrap 2, fillx", "[growprio 0] [fill]")); GuiForm form = createForm(); String home = fieldName("home"); eclipseHomeChooser = new FileChooser(JFileChooser.DIRECTORIES_ONLY); panel.add(form.createMessagePanel(), "span"); panel.add(new JLabel(Installer.getString(home))); panel.add(eclipseHomeChooser); form.bind(home, eclipseHomeChooser.getTextField(), new ValidatorBuilder() .required() .isDirectory() .validator(new EclipseHomeValidator()) .validator()); String eclipseHomeDefault = getDefaultEclipseHome(); eclipseHomeChooser.getTextField().setText(eclipseHomeDefault); return panel; } /** * {@inheritDoc} * @see org.formic.wizard.WizardStep#displayed() */ public void displayed() { eclipseHomeChooser.getTextField().requestFocus(); } /** * {@inheritDoc} * @see org.formic.wizard.WizardStep#proceed() */ public boolean proceed() { boolean proceed = super.proceed(); String home = (String)Installer.getContext().getValue("eclipse.home"); home = FilenameUtils.normalizeNoEndSeparator(home).replace('\\', '/'); Installer.getContext().setValue("eclipse.home", home); return proceed; } /** * Gets the default value to use for the eclipse home if any. * * @return The default value or null if none could be determined. */ private String getDefaultEclipseHome() { String home = Installer.getEnvironmentVariable("ECLIPSE_HOME"); if(home == null || home.trim().length() == 0){ if(Os.isFamily(Os.FAMILY_WINDOWS)){ for (int ii = 0; ii < WINDOWS_ECLIPSES.length; ii++){ if(new File(WINDOWS_ECLIPSES[ii]).exists()){ home = WINDOWS_ECLIPSES[ii]; break; } } }else{ for (int ii = 0; ii < UNIX_ECLIPSES.length; ii++){ if(new File(UNIX_ECLIPSES[ii]).exists()){ home = UNIX_ECLIPSES[ii]; break; } } } } return home; } private class EclipseHomeValidator implements Validator { public boolean isValid(Object value) { String folder = (String)value; if(folder != null && folder.trim().length() > 0){ File plugins = new File(FilenameUtils.concat(folder, "plugins")); if (plugins.exists() && plugins.isDirectory()){ return EclipseUtils.findEclipseLauncherJar(folder) != null; } } return false; } public String getErrorMessage() { return getName() + ".home.invalid"; } } }