blob: d1f31d688cd43ec3d6f3c3bd11c70d1b19e1d7d7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2009 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.dialogs;
import java.net.URI;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.p2.operations.RepositoryTracker;
import org.eclipse.equinox.p2.ui.ProvisioningUI;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.dnd.*;
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.*;
/**
* Class for showing a repository name and location
*
* @since 3.4
*
*/
public class RepositoryNameAndLocationDialog extends StatusDialog {
Button okButton;
Text url, nickname;
ProvisioningUI ui;
URI location;
String name;
public RepositoryNameAndLocationDialog(Shell parentShell, ProvisioningUI ui) {
super(parentShell);
this.ui = ui;
setTitle(ProvUIMessages.RepositoryNameAndLocationDialog_Title);
}
protected void createButtonsForButtonBar(Composite parent) {
okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
protected Control createDialogArea(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
initializeDialogUnits(comp);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginTop = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
nickname = createNameField(comp);
url = createLocationField(comp);
comp.setLayout(layout);
GridData data = new GridData();
comp.setLayoutData(data);
Dialog.applyDialogFont(comp);
return comp;
}
/**
* Return a RepositoryTracker appropriate for validating and adding the
* repository.
*
* @return the Repository Tracker
*/
protected RepositoryTracker getRepositoryTracker() {
return ui.getRepositoryTracker();
}
protected void okPressed() {
if (handleOk())
super.okPressed();
}
protected boolean handleOk() {
IStatus status = validateRepositoryURL(false);
location = getUserLocation();
name = nickname.getText().trim();
return status.isOK();
}
/**
* Get the repository location as currently typed in by the user. Return null if there
* is a problem with the URL.
*
* @return the URL currently typed in by the user.
*/
protected URI getUserLocation() {
return getRepositoryTracker().locationFromString(url.getText().trim());
}
/**
* Get the location of the repository that was entered by the user.
* Return <code>null</code> if no location was provided.
*
* @return the location of the repository that has been provided by the user.
*/
public URI getLocation() {
return location;
}
/**
* Get the name of the repository that was entered by the user.
* Return <code>null</code> if no name was provided.
*
* @return the name of the repository that has been provided by the user.
*/
public String getName() {
return name;
}
/**
* Validate the repository URL, returning a status that is appropriate
* for showing the user. The boolean indicates whether the repositories
* should be consulted for validating the URL. For example, it is not
* appropriate to contact the repositories on every keystroke.
*/
protected IStatus validateRepositoryURL(final boolean contactRepositories) {
if (url == null || url.isDisposed())
return Status.OK_STATUS;
final IStatus[] status = new IStatus[1];
status[0] = getRepositoryTracker().getInvalidLocationStatus(url.getText().trim());
final URI userLocation = getUserLocation();
if (url.getText().length() == 0)
status[0] = new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, RepositoryTracker.STATUS_INVALID_REPOSITORY_LOCATION, ProvUIMessages.RepositoryGroup_URLRequired, null);
else if (userLocation == null)
status[0] = new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, RepositoryTracker.STATUS_INVALID_REPOSITORY_LOCATION, ProvUIMessages.AddRepositoryDialog_InvalidURL, null);
else {
BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
public void run() {
status[0] = getRepositoryTracker().validateRepositoryLocation(ui.getSession(), userLocation, contactRepositories, null);
}
});
}
// At this point the subclasses may have decided to opt out of
// this dialog.
if (status[0].getSeverity() == IStatus.CANCEL) {
cancelPressed();
}
setOkEnablement(status[0].isOK());
updateStatus(status[0]);
return status[0];
}
protected void updateButtonsEnableState(IStatus status) {
setOkEnablement(!status.matches(IStatus.ERROR));
}
protected void setOkEnablement(boolean enable) {
if (okButton != null && !okButton.isDisposed())
okButton.setEnabled(enable);
}
protected String getInitialLocationText() {
return "http://"; //$NON-NLS-1$
}
protected String getInitialNameText() {
return ""; //$NON-NLS-1$
}
protected Text createNameField(Composite parent) {
// Name: []
Label nameLabel = new Label(parent, SWT.NONE);
nameLabel.setText(ProvUIMessages.AddRepositoryDialog_NameLabel);
nickname = new Text(parent, SWT.BORDER);
nickname.setText(getInitialNameText());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
nickname.setLayoutData(data);
return nickname;
}
protected Text createLocationField(Composite parent) {
// Location: []
Label urlLabel = new Label(parent, SWT.NONE);
urlLabel.setText(ProvUIMessages.AddRepositoryDialog_LocationLabel);
url = new Text(parent, SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
url.setLayoutData(data);
DropTarget target = new DropTarget(url, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK);
target.setTransfer(new Transfer[] {URLTransfer.getInstance(), FileTransfer.getInstance()});
target.addDropListener(new TextURLDropAdapter(url, true));
url.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateRepositoryURL(false);
}
});
url.setText(getInitialLocationText());
url.setSelection(0, url.getText().length());
return url;
}
protected ProvisioningUI getProvisioningUI() {
return ui;
}
}