blob: 861ca9e99c2b034aa0798fac7746f05cd90923f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.ui.internal.wizard.newproject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.scout.commons.StringUtility;
import org.eclipse.scout.sdk.operation.project.NewBsiCaseGroupStep1Operation;
import org.eclipse.scout.sdk.operation.project.NewScoutProjectStep2Operation;
import org.eclipse.scout.sdk.operation.template.TemplateVariableSet;
import org.eclipse.scout.sdk.typecache.IScoutWorkingCopyManager;
import org.eclipse.scout.sdk.ui.ScoutSdkUi;
import org.eclipse.scout.sdk.ui.fields.StyledTextField;
import org.eclipse.scout.sdk.ui.fields.bundletree.CheckableTree;
import org.eclipse.scout.sdk.ui.fields.bundletree.ICheckStateListener;
import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNode;
import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNodeFilter;
import org.eclipse.scout.sdk.ui.fields.bundletree.NodeFilters;
import org.eclipse.scout.sdk.ui.fields.bundletree.TreeNode;
import org.eclipse.scout.sdk.ui.fields.bundletree.TreeUtility;
import org.eclipse.scout.sdk.ui.internal.wizard.AbstractWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
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;
/**
* <h3>ScoutProjectNewWizardPage</h3> ...
*
* @author Andreas Hoegger
* @since 1.0.8 06.03.2010
*/
public class ScoutProjectNewWizardPage extends AbstractWizardPage {
static final int TYPE_BUNDLE_SWING = 100;
static final int TYPE_BUNDLE_SWT = 101;
static final int TYPE_BUNDLE_CLIENT = 102;
static final int TYPE_BUNDLE_SHARED = 103;
static final int TYPE_BUNDLE_SERVER = 104;
private String m_projectName;
private String m_postFix;
private boolean m_createUiSwing;
private boolean m_createUiSwt;
private boolean m_createClient;
private boolean m_createShared;
private boolean m_createServer;
private String m_projectAlias;
private StyledTextField m_projectNameField;
private StyledTextField m_postFixField;
private CheckableTree m_bundleTree;
private ITreeNode m_invisibleRootNode;
private StyledTextField m_projectAliasNameField;
public ScoutProjectNewWizardPage() {
super(ScoutProjectNewWizardPage.class.getName());
setTitle("Create a Scout Project");
setDescription("Create a Scout project in the workspace.\nEnter the name and choose the desired tiers.");
}
@Override
protected void createContent(Composite parent) {
m_projectNameField = getFieldToolkit().createStyledTextField(parent, "Project Name");
m_projectNameField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
try {
setStateChanging(true);
m_projectName = m_projectNameField.getText();
updateBundleNames();
}
finally {
setStateChanging(false);
}
}
});
m_postFixField = getFieldToolkit().createStyledTextField(parent, "Project Postfix");
m_postFixField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
try {
setStateChanging(true);
m_postFix = m_postFixField.getText();
updateBundleNames();
}
finally {
setStateChanging(false);
}
}
});
m_invisibleRootNode = buildBundleTree();
m_bundleTree = new CheckableTree(parent, m_invisibleRootNode);
m_bundleTree.setChecked(TreeUtility.findNodes(m_invisibleRootNode, new P_InitialCheckNodesFilter()));
m_bundleTree.addCheckSelectionListener(new ICheckStateListener() {
@Override
public void fireNodeCheckStateChanged(ITreeNode node, boolean checkState) {
switch (node.getType()) {
case TYPE_BUNDLE_CLIENT:
m_createClient = checkState;
((ScoutProjectTemplateWizardPage) getWizard().getPage(ScoutProjectTemplateWizardPage.class.getName())).refreshList();
break;
case TYPE_BUNDLE_SHARED:
m_createShared = checkState;
break;
case TYPE_BUNDLE_SERVER:
m_createServer = checkState;
break;
case TYPE_BUNDLE_SWING:
m_createUiSwing = checkState;
break;
case TYPE_BUNDLE_SWT:
m_createUiSwt = checkState;
break;
}
pingStateChanging();
}
});
Control aliasGroup = createAliasGroup(parent);
m_projectNameField.setFocus();
// layout
parent.setLayout(new GridLayout(1, true));
m_projectNameField.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
m_postFixField.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
m_bundleTree.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
aliasGroup.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
}
private ITreeNode buildBundleTree() {
ITreeNode rootNode = new TreeNode(CheckableTree.TYPE_ROOT, "root");
rootNode.setVisible(false);
TreeUtility.createNode(rootNode, TYPE_BUNDLE_SWING, "ui.swing", ScoutSdkUi.getImageDescriptor(ScoutSdkUi.SwingBundle), TYPE_BUNDLE_SWING);
TreeUtility.createNode(rootNode, TYPE_BUNDLE_SWT, "ui.swt", ScoutSdkUi.getImageDescriptor(ScoutSdkUi.SwtBundle), TYPE_BUNDLE_SWT);
TreeUtility.createNode(rootNode, TYPE_BUNDLE_CLIENT, "client", ScoutSdkUi.getImageDescriptor(ScoutSdkUi.ClientBundle), TYPE_BUNDLE_CLIENT);
TreeUtility.createNode(rootNode, TYPE_BUNDLE_SHARED, "shared", ScoutSdkUi.getImageDescriptor(ScoutSdkUi.SharedBundle), TYPE_BUNDLE_SHARED);
TreeUtility.createNode(rootNode, TYPE_BUNDLE_SERVER, "server", ScoutSdkUi.getImageDescriptor(ScoutSdkUi.ServerBundle), TYPE_BUNDLE_SERVER);
return rootNode;
}
private void updateBundleNames() {
String postfix = "";
String pf = getPostFix();
if (!StringUtility.isNullOrEmpty(pf)) {
postfix = "." + pf;
}
TreeUtility.findNode(m_invisibleRootNode, NodeFilters.getByType(TYPE_BUNDLE_CLIENT)).setText(getProjectName() + ".client" + postfix);
TreeUtility.findNode(m_invisibleRootNode, NodeFilters.getByType(TYPE_BUNDLE_SHARED)).setText(getProjectName() + ".shared" + postfix);
TreeUtility.findNode(m_invisibleRootNode, NodeFilters.getByType(TYPE_BUNDLE_SERVER)).setText(getProjectName() + ".server" + postfix);
TreeUtility.findNode(m_invisibleRootNode, NodeFilters.getByType(TYPE_BUNDLE_SWING)).setText(getProjectName() + ".ui.swing" + postfix);
TreeUtility.findNode(m_invisibleRootNode, NodeFilters.getByType(TYPE_BUNDLE_SWT)).setText(getProjectName() + ".ui.swt" + postfix);
m_bundleTree.getTreeViewer().refresh();
String alias = "";
int dotIndex = getProjectName().lastIndexOf('.');
if (dotIndex > 0 && dotIndex < getProjectName().length() - 1) {
alias = getProjectName().substring(dotIndex + 1);
}
if (pf != null && pf.length() > 1) {
alias = alias + Character.toUpperCase(pf.charAt(0)) + pf.substring(1);
}
// setProjectAlias(alias);
m_projectAliasNameField.setText(alias);
}
private Control createAliasGroup(Composite parent) {
Group group = new Group(parent, SWT.SHADOW_IN);
group.setText("Project Alias");
Label label = new Label(group, SWT.NONE);
label.setText("The project alias is used for the servlet name and launcher names.");
m_projectAliasNameField = getFieldToolkit().createStyledTextField(group, "Project Alias");
m_projectAliasNameField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
m_projectAlias = m_projectAliasNameField.getText();
pingStateChanging();
}
});
// layout
group.setLayout(new GridLayout(1, true));
label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
m_projectAliasNameField.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
return group;
}
public void performFinish(IProgressMonitor monitor, IScoutWorkingCopyManager workingCopyManager) throws IllegalArgumentException, CoreException {
TemplateVariableSet variables = TemplateVariableSet.createNew(getProjectName(), getPostFix(), getProjectAlias());
NewBsiCaseGroupStep1Operation op1 = new NewBsiCaseGroupStep1Operation(variables);
op1.setCreateUiSwing(isCreateUiSwing());
op1.setCreateUiSwt(isCreateUiSwt());
op1.setCreateClient(isCreateClient());
op1.setCreateShared(isCreateShared());
op1.setCreateServer(isCreateServer());
op1.setProjectName(getProjectName());
op1.setProjectNamePostfix(getPostFix());
op1.setProjectAlias(getProjectAlias());
op1.validate();
op1.run(monitor, workingCopyManager);
NewScoutProjectStep2Operation op2 = new NewScoutProjectStep2Operation(op1, variables);
op2.validate();
op2.run(monitor, workingCopyManager);
}
@Override
protected void validatePage(MultiStatus multiStatus) {
multiStatus.add(getStatusProjectName());
multiStatus.add(getStatusProjectAlias());
multiStatus.add(getStatusUiBundles());
multiStatus.add(getStatusClientBundle());
}
protected IStatus getStatusProjectName() {
if (StringUtility.isNullOrEmpty(getProjectName())) {
return new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "Project name is not set.");
}
return Status.OK_STATUS;
}
protected IStatus getStatusProjectAlias() {
if (StringUtility.isNullOrEmpty(getProjectAlias())) {
return new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "Project alias is not set.");
}
return Status.OK_STATUS;
}
protected IStatus getStatusUiBundles() {
if (!m_createClient) {
if (isCreateUiSwing()) {
return new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "A swing bundle without a client boundle can not be created.");
}
if (isCreateUiSwt()) {
return new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "A swt bundle without a client boundle can not be created.");
}
}
return Status.OK_STATUS;
}
protected IStatus getStatusClientBundle() {
if (isCreateClient()) {
if (!isCreateShared()) {
return new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "A client bundle without a shared bundle can not be created.");
}
}
return Status.OK_STATUS;
}
/**
* @return the projectName
*/
public String getProjectName() {
return m_projectName;
}
/**
* @param projectName
* the projectName to set
*/
public void setProjectName(String projectName) {
m_projectName = projectName;
}
/**
* @return the postFix
*/
public String getPostFix() {
return m_postFix;
}
/**
* @param postFix
* the postFix to set
*/
public void setPostFix(String postFix) {
m_postFix = postFix;
}
/**
* @param projectAlias
* the projectAlias to set
*/
public void setProjectAlias(String projectAlias) {
m_projectAlias = projectAlias;
}
/**
* @return the projectAlias
*/
public String getProjectAlias() {
return m_projectAlias;
}
/**
* @return the createUiSwing
*/
public boolean isCreateUiSwing() {
return m_createUiSwing;
}
/**
* @param createUiSwing
* the createUiSwing to set
*/
public void setCreateUiSwing(boolean createUiSwing) {
m_createUiSwing = createUiSwing;
}
/**
* @return the createUiSwt
*/
public boolean isCreateUiSwt() {
return m_createUiSwt;
}
/**
* @param createUiSwt
* the createUiSwt to set
*/
public void setCreateUiSwt(boolean createUiSwt) {
m_createUiSwt = createUiSwt;
}
/**
* @return the createClient
*/
public boolean isCreateClient() {
return m_createClient;
}
/**
* @param createClient
* the createClient to set
*/
public void setCreateClient(boolean createClient) {
m_createClient = createClient;
}
/**
* @return the createShared
*/
public boolean isCreateShared() {
return m_createShared;
}
/**
* @param createShared
* the createShared to set
*/
public void setCreateShared(boolean createShared) {
m_createShared = createShared;
}
/**
* @return the createServer
*/
public boolean isCreateServer() {
return m_createServer;
}
/**
* @param createServer
* the createServer to set
*/
public void setCreateServer(boolean createServer) {
m_createServer = createServer;
}
private class P_InitialCheckNodesFilter implements ITreeNodeFilter {
@Override
public boolean accept(ITreeNode node) {
switch (node.getType()) {
case TYPE_BUNDLE_CLIENT:
m_createClient = true;
return true;
case TYPE_BUNDLE_SHARED:
m_createShared = true;
return true;
case TYPE_BUNDLE_SERVER:
m_createServer = true;
return true;
case TYPE_BUNDLE_SWING:
m_createUiSwing = true;
return true;
case TYPE_BUNDLE_SWT:
m_createUiSwt = true;
return true;
}
return false;
}
} // end class P_InitialCheckNodesFilter
}