/******************************************************************************* * Copyright (c) 2005 RadRails.org and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.radrails.server.internal.ui.wizards.pages; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ListDialog; import org.radrails.rails.ui.wizards.NewProjectBasedResourceWizard; import org.radrails.server.core.IServerConstants; import org.radrails.server.core.ServerManager; import org.radrails.server.internal.ui.wizards.NewServerWizard; import org.rubypeople.rdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; import org.rubypeople.rdt.internal.ui.viewsupport.DecoratingRubyLabelProvider; /** * Main page for the NewMongrelServerWizard. * * @author mbaumbach * */ public class WizardNewServerPage extends WizardPage { private Text projectNameText; private Text serverNameText; private Text portText; private Combo serverTypeCombo; private ModifyListener nameModifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { boolean valid = validatePage(); setPageComplete(valid); } }; /** * Constructor. * * @param pageName */ public WizardNewServerPage(String pageName) { super(pageName); } /** * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite control = new Composite(parent, SWT.NULL); control.setLayout(new GridLayout()); createInputControls(control); setControl(control); setPageComplete(validatePage()); } /** * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean) */ public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { if (projectNameText.getText().equals("")) { projectNameText.setFocus(); } else if (serverNameText.getText().equals("")) { serverNameText.setFocus(); } else { portText.setFocus(); } } } /** * Helper method to create the input controls. * * @param parent */ private void createInputControls(Composite parent) { Composite control = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 3; control.setLayout(layout); control.setLayoutData(new GridData(GridData.FILL_BOTH)); // Create the label for the project name input field Label projectLabel = new Label(control, SWT.LEFT); projectLabel.setText("Project:"); // Create the project name input field projectNameText = new Text(control, SWT.BORDER); projectNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); NewServerWizard wizard = (NewServerWizard) getWizard(); projectNameText.setText(wizard.getSelectedProjectName()); projectNameText.addModifyListener(nameModifyListener); // Create the browse for project button Button projectSelectButton = new Button(control, SWT.PUSH); projectSelectButton.setText("Browse..."); projectSelectButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleProjectSelectButtonPressed(); } }); // Create the label for the server type combo box Label serverTypeLabel = new Label(control, SWT.LEFT); serverTypeLabel.setText("Type:"); // Create the server type combo field serverTypeCombo = new Combo(control, SWT.DROP_DOWN); serverTypeCombo.add(IServerConstants.TYPE_WEBRICK); serverTypeCombo.add(IServerConstants.TYPE_MONGREL); serverTypeCombo.add(IServerConstants.TYPE_LIGHTTPD); serverTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); serverTypeCombo.setText(IServerConstants.TYPE_WEBRICK); serverTypeCombo.addModifyListener(nameModifyListener); // Blank new Label(control, SWT.NULL); // Create the label for the server name input field Label serverNameLabel = new Label(control, SWT.LEFT); serverNameLabel.setText("Name:"); // Create the server name input field serverNameText = new Text(control, SWT.BORDER); serverNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); serverNameText.setText(wizard.getSelectedProjectName() + "Server"); serverNameText.addModifyListener(nameModifyListener); // Blank new Label(control, SWT.NULL); // Create the label for the port number input field Label portNumberLabel = new Label(control, SWT.LEFT); portNumberLabel.setText("Port:"); // Create the port number input field portText = new Text(control, SWT.BORDER); portText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); portText.setText(String.valueOf(ServerManager.getInstance() .getNextAvailablePort())); portText.addModifyListener(nameModifyListener); } /** * Opens a list dialog populated with all the Rails projects in the * workspace. The name of the selected project is placed in the text field * when the dialog is closed. */ protected void handleProjectSelectButtonPressed() { // Create the dialog ListDialog dialog = new ListDialog(getShell()); dialog.setContentProvider(new IStructuredContentProvider() { public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // Do nothing } public void dispose() { // Do nothing } public Object[] getElements(Object inputElement) { return ((IWorkspaceRoot) inputElement).getProjects(); } }); dialog.setLabelProvider(new DecoratingRubyLabelProvider(new AppearanceAwareLabelProvider())); // Get the current project and select it IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot(); NewProjectBasedResourceWizard wizard = (NewProjectBasedResourceWizard) getWizard(); dialog.setInitialSelections(new IProject[] { wizard .getProjectForName(getProjectName()) }); // Set up the rest of the dialog dialog.setInput(wsroot); dialog.setMessage("Choose a project:"); dialog.setTitle("Project Selection"); dialog.create(); dialog.open(); // Get the result and put it in the text field Object[] result = dialog.getResult(); if (result != null) { IProject project = ((IProject) result[0]); projectNameText.setText(project.getName()); } } /** * @return the project name from the input field */ public String getProjectName() { return projectNameText.getText(); } /** * @return the server name from the input field */ public String getServerName() { return serverNameText.getText(); } /** * @return the port number from the input field */ public String getPort() { return portText.getText(); } /** * @return the server type from the combo box */ public String getServerType() { return serverTypeCombo.getText(); } /** * Validates a page * * @return true if page is valid */ private boolean validatePage() { setMessage(null); setErrorMessage(null); IWorkspace workspace = ResourcesPlugin.getWorkspace(); if (getProjectName().equals("")) { setErrorMessage("Project name empty"); return false; } if (!workspace.validateName(getProjectName(), IResource.PROJECT).isOK()) { setErrorMessage("Invalid project name"); return false; } if (!ResourcesPlugin.getWorkspace().getRoot().getProject( getProjectName()).exists()) { setErrorMessage("Project does not exist"); return false; } if (getServerName().equals("")) { setErrorMessage("Server name empty"); return false; } if (portText.getText().equals("")) { setErrorMessage("Port number empty"); return false; } if (ServerManager.getInstance().portInUse(getPort())) { setMessage("Port number already in use", WARNING); } if (ServerManager.getInstance().projectHasServer(getProjectName(), getServerType())) { setMessage("Project already has a " + getServerType() + " server", WARNING); } return true; } }