/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.wizard.project;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.jboss.tools.common.model.ui.attribute.XAttributeSupport;
import org.jboss.tools.common.model.ui.attribute.adapter.IModelPropertyEditorAdapter;
import org.jboss.tools.common.model.ui.attribute.editor.DirectoryFieldEditorEx;
import org.jboss.tools.jsf.JSFPreference;
import org.jboss.tools.jsf.web.JSFTemplate;
import org.jboss.tools.jsf.web.helpers.context.ImportProjectWizardContext;
import org.jboss.tools.jst.web.context.IImportWebProjectContext;
import org.jboss.tools.jst.web.context.ImportWebProjectContext;
import org.jboss.tools.jst.web.ui.wizards.appregister.AppRegisterComponent;
import org.jboss.tools.common.model.ui.util.ModelUtilities;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jboss.tools.common.meta.action.*;
import org.jboss.tools.common.meta.action.impl.XEntityDataImpl;
import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler;
import org.jboss.tools.common.meta.action.impl.handlers.HUtil;
public class ImportProjectFoldersPage extends WizardPage {
static String[] ATTRIBUTES = {
ImportProjectWizardContext.ATTR_CLASSES,
ImportProjectWizardContext.ATTR_LIB,
ImportProjectWizardContext.ATTR_ADD_LIB,
ImportProjectWizardContext.ATTR_VERSION,
ImportProjectWizardContext.ATTR_SERVLET_VERSION
};
private ImportWebProjectContext context;
private XAttributeSupport support;
private IModelPropertyEditorAdapter webrootLocationAdapter;
private IModelPropertyEditorAdapter srcLocationAdapter;
private IModelPropertyEditorAdapter classesLocationAdapter;
private IModelPropertyEditorAdapter libLocationAdapter;
private IModelPropertyEditorAdapter addLibAdapter;
private IModelPropertyEditorAdapter versionAdapter;
private IModelPropertyEditorAdapter servletVersionAdapter;
private PropertyChangeListener updateDataListener;
AppRegisterComponent appRegister = new AppRegisterComponent();
Composite supportControl;
protected ImportProjectFoldersPage(ImportWebProjectContext context) {
super("Import Project Folders");
this.context = context;
appRegister.setContext(context.getRegisterServerContext());
appRegister.setLayoutForSupport(getLayoutForSupport());
appRegister.setEnabling(false);
XEntityData entityData = XEntityDataImpl.create(
new String[][] {
{ImportProjectWizardContext.PAGE_FOLDERS, ""}, //$NON-NLS-1$
{"web root", "yes"}, //$NON-NLS-1$ //$NON-NLS-2$
{"src", ""}, //$NON-NLS-1$ //$NON-NLS-2$
{ATTRIBUTES[0], ""}, //$NON-NLS-1$
{ATTRIBUTES[1], ""}, //$NON-NLS-1$
{ATTRIBUTES[2], ""}, //$NON-NLS-1$
{ATTRIBUTES[3], ""}, //$NON-NLS-1$
{ATTRIBUTES[4], ""} //$NON-NLS-1$
}
);
appRegister.setDisableContextRoot(true);
XAttributeData[] ad = entityData.getAttributeData();
for (int i = 0; i < ad.length; i++) ad[i].setValue(""); //$NON-NLS-1$
if(context.getServletVersion() == null) {
context.setServletVersion(JSFPreference.DEFAULT_JSF_IMPORT_SERVLET_VERSION.getValue());
}
JSFTemplate t = new JSFTemplate();
String[] versions = t.getVersionList();
HUtil.hackAttributeConstraintList(new XEntityData[]{entityData}, 0, ATTRIBUTES[3], versions);
if(versions.length > 0) {
context.setTemplateVersion(versions[0]);
entityData.setValue(ATTRIBUTES[3], versions[0]);
}
support = new XAttributeSupport(ModelUtilities.getPreferenceModel().getRoot(), entityData);
support.setLayout(getLayoutForSupport());
webrootLocationAdapter = support.getPropertyEditorAdapterByName("web root"); //$NON-NLS-1$
srcLocationAdapter = support.getPropertyEditorAdapterByName("src"); //$NON-NLS-1$
classesLocationAdapter = support.getPropertyEditorAdapterByName(ImportProjectWizardContext.ATTR_CLASSES);
libLocationAdapter = support.getPropertyEditorAdapterByName(ImportProjectWizardContext.ATTR_LIB);
addLibAdapter = support.getPropertyEditorAdapterByName(ImportProjectWizardContext.ATTR_ADD_LIB);
versionAdapter = support.getPropertyEditorAdapterByName(ImportProjectWizardContext.ATTR_VERSION);
servletVersionAdapter = support.getPropertyEditorAdapterByName(ImportProjectWizardContext.ATTR_SERVLET_VERSION);
appRegister.init();
initListeners();
}
public void dispose() {
super.dispose();
if (support!=null) support.dispose();
support = null;
updateDataListener = null;
if (supportControl!=null && !supportControl.isDisposed()) supportControl.dispose();
supportControl = null;
if (appRegister!=null) appRegister.dispose();
appRegister = null;
webrootLocationAdapter = null;
srcLocationAdapter = null;
classesLocationAdapter = null;
libLocationAdapter = null;
addLibAdapter = null;
versionAdapter = null;
servletVersionAdapter = null;
}
private Layout getLayoutForSupport() {
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginHeight = 4;
gridLayout.marginWidth = 4;
gridLayout.horizontalSpacing = 10;
gridLayout.verticalSpacing = 10;
return gridLayout;
}
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite c = new Composite(parent, SWT.NONE);
c.setLayout(new GridLayout());
supportControl = support.createControl(c);
supportControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label label = new Label(c, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Control ch = appRegister.createControl(c);
ch.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
setControl(c);
validate();
}
public void setVisible(boolean visible) {
if (visible) {
lock = true;
webrootLocationAdapter.setValue(context.getWebRootPath());
srcLocationAdapter.setValue(context.getModules()[0].getAttributeValue("java src")); //$NON-NLS-1$
classesLocationAdapter.setValue(context.getClassesLocation());
libLocationAdapter.setValue(context.getLibLocation());
addLibAdapter.setValue("" + context.getAddLibraries()); //$NON-NLS-1$
versionAdapter.setValue(context.getTemplateVersion());
servletVersionAdapter.setValue(context.getServletVersion());
for (int i = 0; i < ATTRIBUTES.length; i++) {
FieldEditor f = support.getPropertyEditorByName(ATTRIBUTES[i]).getFieldEditor(getControl().getParent());
if(f instanceof DirectoryFieldEditorEx)
((DirectoryFieldEditorEx)f).setLastPath(context.getWebInfLocation());
}
appRegister.loadApplicationName();
lock = false;
}
validate();
super.setVisible(visible);
}
public void setDialogSize() {
Shell shell = getShell();
getShell().setSize(shell.getSize().x,shell.getSize().y);
}
boolean lock = false;
private void initListeners() {
updateDataListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if(!lock) {
updateContext();
setDependencies();
validateSrcLastPath();
validate();
}
}
};
support.addPropertyChangeListener(updateDataListener);
appRegister.addPropertyChangeListener(inputListener);
}
private void updateContext() {
context.getModules()[0].setAttributeValue("root", webrootLocationAdapter.getStringValue(false)); //$NON-NLS-1$
context.getModules()[0].setAttributeValue("java src", srcLocationAdapter.getStringValue(false)); //$NON-NLS-1$
context.setClassesLocation(classesLocationAdapter.getStringValue(false));
context.setLibLocation(libLocationAdapter.getStringValue(false));
context.setAddLibraries("true".equals(addLibAdapter.getStringValue(true))); //$NON-NLS-1$
context.setTemplateVersion(versionAdapter.getStringValue(true));
context.setServletVersion(servletVersionAdapter.getStringValue(true));
context.setBuildXmlLocation(""/*buildXmlLocationAdapter.getStringValue(false)*/); //$NON-NLS-1$
}
public void validate() {
setDependencies();
String message = appRegister.getErrorMessage();
if(message == null) {
if(context.getWebRootPath() == null || context.getWebRootPath().length() == 0) {
message = DefaultCreateHandler.getReguiredMessage(webrootLocationAdapter.getAttribute().getName());
}
}
setPageComplete(message == null);
setErrorMessage(message);
if(message == null && !context.isServletVersionConsistentToWebXML()) {
String warning = IImportWebProjectContext.SERVLET_VERSION_WARNING;
setMessage(warning, WARNING);
} else {
setMessage(null, 0);
}
validateSrcLastPath();
}
void validateSrcLastPath() {
String srcLocation = srcLocationAdapter.getStringValue(true);
if(srcLocation.length() == 0) {
String webRootLocation = webrootLocationAdapter.getStringValue(true);
DirectoryFieldEditorEx srcField = (DirectoryFieldEditorEx)support.getFieldEditorByName("src"); //$NON-NLS-1$
if(webRootLocation.length() > 0 && srcField != null) {
srcField.setLastPath(webRootLocation);
}
}
}
InputChangeListener inputListener = new InputChangeListener();
class InputChangeListener implements java.beans.PropertyChangeListener {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
validate();
if(!lock) {
String an = appRegister.getApplicationName();
if(an.length() > 0 && !an.equals(context.getProjectName())) {
context.setApplicationName(an);
}
}
}
}
protected void setDependencies() {
boolean b = "true".equals(addLibAdapter.getStringValue(true)); //$NON-NLS-1$
FieldEditor f = support.getFieldEditorByName("version"); //$NON-NLS-1$
f.setEnabled(b, supportControl);
}
}