package com.sysdeo.eclipse.tomcat;
/*
* (c) Copyright Sysdeo SA 2001, 2002.
* All Rights Reserved.
*/
import java.io.File;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.DirectoryFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import com.sysdeo.eclipse.tomcat.editors.TomcatDirectoryFieldEditor;
import com.sysdeo.eclipse.tomcat.editors.TomcatFileFieldEditor;
public class TomcatPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, TomcatPluginResources {
private BooleanFieldEditor securityEditor;
static final private int FIELD_WIDTH = 50;
private RadioGroupFieldEditor version;
private DirectoryFieldEditor home;
private TomcatDirectoryFieldEditor contextsDir;
private TomcatFileFieldEditor configFile;
private RadioGroupFieldEditor configMode;
private ModifyListener fModifyListener;
private String selectedVersion;
private String oldVersion;
public TomcatPreferencePage() {
super();
setPreferenceStore(TomcatLauncherPlugin.getDefault().getPreferenceStore());
}
/*
* @see PreferencePage#createContents(Composite)
*/
protected Control createContents(Composite parent) {
final Composite composite = parent;
// final Composite composite = new Composite(parent, SWT.NONE);
// composite.setLayout(new GridLayout(2, false));
oldVersion = TomcatLauncherPlugin.getDefault().getTomcatVersion();
version = new RadioGroupFieldEditor(TomcatLauncherPlugin.TOMCAT_PREF_VERSION_KEY,
PREF_PAGE_CHOOSEVERSION_LABEL, 1, new String[][] {
{ PREF_PAGE_VERSION3_LABEL, TomcatLauncherPlugin.TOMCAT_VERSION3 },
{ PREF_PAGE_VERSION4_LABEL, TomcatLauncherPlugin.TOMCAT_VERSION4 },
{ PREF_PAGE_VERSION4_1_LABEL, TomcatLauncherPlugin.TOMCAT_VERSION41 },
{ PREF_PAGE_VERSION5_LABEL, TomcatLauncherPlugin.TOMCAT_VERSION5 },
{ PREF_PAGE_VERSION6_LABEL, TomcatLauncherPlugin.TOMCAT_VERSION6 },
{ PREF_PAGE_VERSION7_LABEL, TomcatLauncherPlugin.TOMCAT_VERSION7 } }, composite, true);
Group homeGroup = new Group(composite, SWT.NONE);
home = new DirectoryFieldEditor(TomcatLauncherPlugin.TOMCAT_PREF_HOME_KEY, PREF_PAGE_HOME_LABEL, homeGroup);
new Label(composite, SWT.NULL); //blank
Group modeGroup = new Group(composite, SWT.NONE);
modeGroup.setLayout(new GridLayout(1, false));
Composite configGroup = new Composite(modeGroup, SWT.NULL);
// getPreferenceStore().setDefault(TomcatLauncherPlugin.TOMCAT_PREF_CONFMODE_KEY, TomcatLauncherPlugin.CONTEXTFILES_MODE);
configMode = new RadioGroupFieldEditor(TomcatLauncherPlugin.TOMCAT_PREF_CONFMODE_KEY,
PREF_PAGE_CHOOSECONFMODE_LABEL, 1, new String[][] {
{ PREF_PAGE_SERVERXML_LABEL, TomcatLauncherPlugin.SERVERXML_MODE },
{ PREF_PAGE_CONTEXTFILES_LABEL, TomcatLauncherPlugin.CONTEXTFILES_MODE }, }, configGroup, false);
new Label(composite, SWT.NULL); //blank
final Composite configLocationGroup = new Composite(modeGroup, SWT.NULL);
configFile = new TomcatFileFieldEditor(TomcatLauncherPlugin.TOMCAT_PREF_CONFIGFILE_KEY,
PREF_PAGE_CONFIGFILE_LABEL, configLocationGroup);
contextsDir = new TomcatDirectoryFieldEditor(TomcatLauncherPlugin.TOMCAT_PREF_CONTEXTSDIR_KEY,
PREF_PAGE_CONTEXTSDIR_LABEL, configLocationGroup);
home.setPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.VALUE)) {
computeConfigFile();
computeContextsDir();
}
}
});
new Label(composite, SWT.NULL); //blank
initLayoutAndData(homeGroup, 3);
initLayoutAndData(modeGroup, 1);
initLayoutAndData(configLocationGroup, 3);
this.initField(version);
version.setPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.VALUE)) {
String value = (String) event.getNewValue();
versionChanged(composite, value);
}
}
});
this.initField(home);
this.initField(configMode);
modeChanged(configLocationGroup, getPreferenceStore().getString(TomcatLauncherPlugin.TOMCAT_PREF_CONFMODE_KEY));
configMode.setPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.VALUE)) {
String value = (String) event.getNewValue();
modeChanged(configLocationGroup, value);
}
}
});
this.initField(configFile);
if (configFile.getStringValue().length() == 0) {
computeConfigFile();
}
this.initField(contextsDir);
if (contextsDir.getStringValue().length() == 0) {
computeContextsDir();
}
return parent;
}
/*
* @see IWorkbenchPreferencePage#init(IWorkbench)
*/
public void init(IWorkbench workbench) {
}
public boolean performOk() {
version.store();
home.store();
configFile.store();
configMode.store();
contextsDir.store();
TomcatLauncherPlugin.getDefault().initTomcatClasspathVariable();
TomcatLauncherPlugin.getDefault().savePluginPreferences();
if (!oldVersion.equals(TomcatLauncherPlugin.getDefault().getTomcatVersion())) {
this.updateTomcatProjectsBuildPath();
}
return true;
}
private void updateTomcatProjectsBuildPath() {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject[] projects = root.getProjects();
try {
for (int i = 0; i < projects.length; i++) {
if (projects[i].hasNature(TomcatLauncherPlugin.NATURE_ID)) {
TomcatProject.create(projects[i]).addTomcatJarToProjectClasspath();
}
}
} catch (CoreException e) {
// ignore update if there is an exception
}
}
private void initField(FieldEditor field) {
field.setPreferenceStore(getPreferenceStore());
field.setPreferencePage(this);
field.load();
}
private void computeConfigFile() {
configFile.setStringValue(home.getStringValue() + File.separator + "conf" + File.separator + "server.xml");
}
private void computeContextsDir() {
if (selectedVersion == null) {
selectedVersion = TomcatLauncherPlugin.getDefault().getPreferenceStore()
.getString(TomcatLauncherPlugin.TOMCAT_PREF_VERSION_KEY);
}
if (selectedVersion.equals(TomcatLauncherPlugin.TOMCAT_VERSION3)
|| selectedVersion.equals(TomcatLauncherPlugin.TOMCAT_VERSION4)
|| selectedVersion.equals(TomcatLauncherPlugin.TOMCAT_VERSION41)) {
contextsDir.setStringValue(home.getStringValue() + File.separator + "webapps");
} else {
String contextDirName = home.getStringValue() + File.separator + "conf" + File.separator + "Catalina"
+ File.separator + "localhost";
checkOrCreateDefaultContextDir();
contextsDir.setStringValue(contextDirName);
}
}
/**
* Since Tomcat 6, conf/Catalina/host does not exist after installation
*/
private void checkOrCreateDefaultContextDir() {
String confDirName = home.getStringValue() + File.separator + "conf";
File confDir = new File(confDirName);
if (confDir.exists()) {
String catalinaDirName = confDirName + File.separator + "Catalina";
File catalinaDir = new File(catalinaDirName);
catalinaDir.mkdir();
if (catalinaDir.exists()) {
String localhostDirName = catalinaDirName + File.separator + "localhost";
File localhostDir = new File(localhostDirName);
localhostDir.mkdir();
}
}
}
private void modeChanged(final Composite configLocationGroup, String value) {
if (value.equals(TomcatLauncherPlugin.SERVERXML_MODE)) {
contextsDir.setEnabled(false, configLocationGroup);
configFile.setEnabled(true, configLocationGroup);
} else {
contextsDir.setEnabled(true, configLocationGroup);
configFile.setEnabled(false, configLocationGroup);
}
// Refresh error message
configFile.valueChanged();
contextsDir.valueChanged();
}
private void versionChanged(final Composite composite, String value) {
selectedVersion = value;
computeContextsDir();
}
private void initLayoutAndData(Composite aGroup, int spanH, int spanV, int numColumns) {
GridLayout gl = new GridLayout(numColumns, false);
aGroup.setLayout(gl);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = spanH;
gd.verticalSpan = spanV;
aGroup.setLayoutData(gd);
}
private void initLayoutAndData(Composite aGroup, int numColumns) {
GridLayout gl = new GridLayout(numColumns, false);
aGroup.setLayout(gl);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
gd.widthHint = 400;
aGroup.setLayoutData(gd);
}
}