blob: 219ac80fcf3abf195ec3e35ebab9dd0092607672 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation 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/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.examples.filesystem.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
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.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.examples.filesystem.Policy;
/**
* This class provides the main page of the file system repository configuration wizard.
* It allows the user to select a location on disk. Once the page is finished, the
* location can be accessed using the <code>getLocation()</code> method.
*/
public class FileSystemMainPage extends WizardPage {
private static final int COMBO_HISTORY_LENGTH = 5;
String location;
Combo locationCombo;
/*
* WizardPage constructor comment.
* @param pageName the name of the page
* @param title the title of the page
* @param description the description of the page
* @param titleImage the image for the page
*/
public FileSystemMainPage(String pageName, String title, String description, ImageDescriptor titleImage) {
super(pageName, title, titleImage);
setDescription(description);
setTitle(title);
}
/*
* Creates a new checkbox instance and sets the default layout data.
*
* @param group the composite in which to create the checkbox
* @param label the string to set into the checkbox
* @return the new checkbox
*/
protected Button createCheckBox(Composite group, String label) {
Button button = new Button(group, SWT.CHECK | SWT.LEFT);
button.setText(label);
GridData data = new GridData();
data.horizontalSpan = 2;
button.setLayoutData(data);
return button;
}
/*
* Utility method that creates a combo box
*
* @param parent the parent for the new label
* @return the new widget
*/
protected Combo createCombo(Composite parent) {
Combo combo = new Combo(parent, SWT.READ_ONLY);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
combo.setLayoutData(data);
return combo;
}
/*
* Creates composite control and sets the default layout data.
*
* @param parent the parent of the new composite
* @param numColumns the number of columns for the new composite
* @return the newly-created coposite
*/
protected Composite createComposite(Composite parent, int numColumns) {
Composite composite = new Composite(parent, SWT.NULL);
// GridLayout
GridLayout layout = new GridLayout();
layout.numColumns = numColumns;
composite.setLayout(layout);
// GridData
GridData data = new GridData();
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
composite.setLayoutData(data);
return composite;
}
/*
* Utility method that creates a label instance
* and sets the default layout data.
*
* @param parent the parent for the new label
* @param text the text for the new label
* @return the new label
*/
protected Label createLabel(Composite parent, String text) {
Label label = new Label(parent, SWT.LEFT);
label.setText(text);
GridData data = new GridData();
data.horizontalSpan = 1;
data.horizontalAlignment = GridData.FILL;
label.setLayoutData(data);
return label;
}
/*
* Create a text field specific for this application
*
* @param parent the parent of the new text field
* @return the new text field
*/
protected Text createTextField(Composite parent) {
Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.verticalAlignment = GridData.CENTER;
data.grabExcessVerticalSpace = false;
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
text.setLayoutData(data);
return text;
}
/*
* Adds an entry to a history, while taking care of duplicate history items
* and excessively long histories. The assumption is made that all histories
* should be of length <code>ConfigurationWizardMainPage.COMBO_HISTORY_LENGTH</code>.
*
* @param history the current history
* @param newEntry the entry to add to the history
* @return the history with the new entry appended
*/
protected String[] addToHistory(String[] history, String newEntry) {
ArrayList l = new ArrayList(Arrays.asList(history));
addToHistory(l, newEntry);
String[] r = new String[l.size()];
l.toArray(r);
return r;
}
/*
* Adds an entry to a history, while taking care of duplicate history items
* and excessively long histories. The assumption is made that all histories
* should be of length <code>ConfigurationWizardMainPage.COMBO_HISTORY_LENGTH</code>.
*
* @param history the current history
* @param newEntry the entry to add to the history
*/
protected void addToHistory(List history, String newEntry) {
history.remove(newEntry);
history.add(0,newEntry);
// since only one new item was added, we can be over the limit
// by at most one item
if (history.size() > COMBO_HISTORY_LENGTH)
history.remove(COMBO_HISTORY_LENGTH);
}
/*
* Utility method to create an editable combo box
*
* @param parent the parent of the combo box
* @return the created combo
*/
protected Combo createEditableCombo(Composite parent) {
Combo combo = new Combo(parent, SWT.NULL);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
combo.setLayoutData(data);
return combo;
}
// Dialog store id constants
private static final String STORE_LOCATION =
"ExamplesFSWizardMainPage.STORE_LOCATION";//$NON-NLS-1$
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout();
layout.numColumns = 2;
composite.setLayout(layout);
setControl(composite);
Label label = new Label(composite, SWT.NULL);
label.setText(Policy.bind("FileSystemMainPage.location")); //$NON-NLS-1$
label.setLayoutData(new GridData());
locationCombo = createEditableCombo(composite);
locationCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
locationCombo.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event e) {
location = ((Combo)e.widget).getText();
FileSystemMainPage.this.validateFields();
}
});
locationCombo.setFocus();
new Label(composite, SWT.NULL);
Button browse = new Button(composite, SWT.NULL);
browse.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
browse.setText(Policy.bind("FileSystemMainPage.browseDir")); //$NON-NLS-1$
browse.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
DirectoryDialog d = new DirectoryDialog(getShell());
String directory = d.open();
if(directory!=null) {
locationCombo.setText(directory);
}
}
});
initializeValues();
validateFields();
}
public String getLocation() {
return location;
}
public boolean finish(IProgressMonitor monitor) {
saveWidgetValues();
return true;
}
/**
* Initializes states of the controls.
*/
private void initializeValues() {
IDialogSettings settings = getDialogSettings();
if (settings != null) {
String[] locations = settings.getArray(STORE_LOCATION);
if (locations != null) {
for (int i = 0; i < locations.length; i++) {
locationCombo.add(locations[i]);
}
locationCombo.select(0);
}
}
}
/**
* Saves the widget values
*/
private void saveWidgetValues() {
// Update history
IDialogSettings settings = getDialogSettings();
if (settings != null) {
String[] locations = settings.getArray(STORE_LOCATION);
if (locations == null) locations = new String[0];
locations = addToHistory(locations, locationCombo.getText());
settings.put(STORE_LOCATION, locations);
}
}
/*
* Validates the contents of the editable fields and set page completion
* and error messages appropriately.
*/
private void validateFields() {
String location = locationCombo.getText();
if (location.length() == 0) {
setErrorMessage(null);
setPageComplete(false);
return;
} else {
File file = new File(location);
if(!file.exists() || !file.isDirectory()) {
setErrorMessage(Policy.bind("FileSystemMainPage.notValidLocation")); //$NON-NLS-1$
setPageComplete(false);
return;
}
}
setErrorMessage(null);
setPageComplete(true);
}
}