blob: 07f546092f2371b0d0af4e2dd54f27f6d972b428 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 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
* Andrew Overholt <overholt@redhat.com> - Fix for Bug 197970
* [prov] unset Profile name causes exception bringing up profile properties
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.admin.dialogs;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.ui.admin.*;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
/**
* A ProfileGroup is a reusable UI component that displays the
* properties of a profile. It can be used to create a new profile.
* . It can be used in different dialogs that manipulate
* or define profiles.
*
* @since 3.4
*
*/
public class ProfileGroup {
Text id;
Text location;
Text cache;
Text name;
Text description;
Text environments;
Text nl;
IProfile profile;
public ProfileGroup(final Composite parent, IProfile profile, ModifyListener listener) {
this.profile = profile;
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
composite.setLayout(layout);
GridData data = new GridData();
data.widthHint = 350;
composite.setLayoutData(data);
// Grid data for most text controls
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
Label label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_ID);
id = new Text(composite, SWT.BORDER);
id.setLayoutData(gd);
setEditable(id, profile == null, listener);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_InstallFolder);
location = new Text(composite, SWT.BORDER);
location.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
setEditable(location, profile == null, listener);
Button locationButton = new Button(composite, SWT.PUSH);
locationButton.setText(ProvAdminUIMessages.ProfileGroup_Browse);
locationButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
DirectoryDialog dialog = new DirectoryDialog(parent.getShell(), SWT.APPLICATION_MODAL);
dialog.setMessage(ProvAdminUIMessages.ProfileGroup_SelectProfileMessage);
String dir = dialog.open();
if (dir != null) {
location.setText(dir);
}
}
});
setEditable(locationButton, profile == null, listener);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_Cache);
cache = new Text(composite, SWT.BORDER);
cache.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
setEditable(cache, profile == null, listener);
locationButton = new Button(composite, SWT.PUSH);
locationButton.setText(ProvAdminUIMessages.ProfileGroup_Browse2);
locationButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
DirectoryDialog dialog = new DirectoryDialog(parent.getShell(), SWT.APPLICATION_MODAL);
dialog.setMessage(ProvAdminUIMessages.ProfileGroup_SelectBundlePoolCache);
String dir = dialog.open();
if (dir != null) {
cache.setText(dir);
}
}
});
setEditable(locationButton, profile == null, listener);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_Name);
name = new Text(composite, SWT.BORDER);
name.setLayoutData(gd);
setEditable(name, profile == null, listener);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_Description);
description = new Text(composite, SWT.BORDER);
description.setLayoutData(gd);
setEditable(description, profile == null, listener);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_Flavor);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_Environments);
environments = new Text(composite, SWT.BORDER);
environments.setLayoutData(gd);
setEditable(environments, profile == null, listener);
label = new Label(composite, SWT.NONE);
label.setText(ProvAdminUIMessages.ProfileGroup_NL);
nl = new Text(composite, SWT.BORDER);
nl.setLayoutData(gd);
setEditable(nl, profile == null, listener);
initializeFields();
}
private void initializeFields() {
if (profile == null) {
location.setText(ProfileFactory.getDefaultLocation());
environments.setText(ProfileFactory.getDefaultEnvironments());
nl.setText(ProfileFactory.getDefaultNL());
} else {
String value = profile.getProfileId();
// Should not happen, profiles must have an id, but just in case.
if (value == null)
value = ""; //$NON-NLS-1$
id.setText(value);
// The remaining values may be null
value = profile.getProperty(IProfile.PROP_INSTALL_FOLDER);
if (value != null) {
location.setText(value);
}
value = profile.getProperty(IProfile.PROP_CACHE);
if (value != null) {
cache.setText(value);
}
value = profile.getProperty(IProfile.PROP_NAME);
if (value != null) {
name.setText(value);
}
value = profile.getProperty(IProfile.PROP_DESCRIPTION);
if (value != null) {
description.setText(value);
}
value = profile.getProperty(IProfile.PROP_ENVIRONMENTS);
if (value != null) {
environments.setText(value);
}
value = profile.getProperty(IProfile.PROP_NL);
if (value != null) {
nl.setText(value);
}
}
}
public Map<String, String> getProfileProperties() {
if (profile == null) {
Map<String, String> profileProperties = new HashMap<String, String>();
String value = location.getText().trim();
if (value.length() > 0) {
profileProperties.put(IProfile.PROP_INSTALL_FOLDER, value);
}
value = cache.getText().trim();
if (value.length() > 0) {
profileProperties.put(IProfile.PROP_CACHE, value);
}
value = name.getText().trim();
if (value.length() > 0) {
profileProperties.put(IProfile.PROP_NAME, value);
}
value = description.getText().trim();
if (value.length() > 0) {
profileProperties.put(IProfile.PROP_DESCRIPTION, value);
}
value = environments.getText().trim();
if (value.length() > 0) {
profileProperties.put(IProfile.PROP_ENVIRONMENTS, value);
}
value = nl.getText().trim();
if (value.length() > 0) {
profileProperties.put(IProfile.PROP_NL, value);
}
return profileProperties;
}
return profile.getProperties();
}
public Composite getComposite() {
if (id == null) {
return null;
}
return id.getParent();
}
public IProfile getProfile() {
return profile;
}
public String getProfileId() {
if (profile != null) {
return profile.getProfileId();
}
return id.getText().trim();
}
/**
* Return a status indicating the validity of the profile info
*
* @return a status indicating the validity of the profile info
*/
public IStatus verify() {
if (id.getText().trim().length() == 0) {
return new Status(IStatus.ERROR, ProvAdminUIActivator.PLUGIN_ID, 0, ProvAdminUIMessages.ProfileGroup_ProfileIDRequired, null);
}
if (location.getText().trim().length() == 0) {
return new Status(IStatus.ERROR, ProvAdminUIActivator.PLUGIN_ID, 0, ProvAdminUIMessages.ProfileGroup_ProfileInstallFolderRequired, null);
}
// TODO what kind of validation do we perform for other properties?
return new Status(IStatus.OK, ProvAdminUIActivator.PLUGIN_ID, IStatus.OK, "", null); //$NON-NLS-1$
}
private void setEditable(Control control, boolean editable, ModifyListener listener) {
if (control instanceof Text) {
Text text = (Text) control;
text.setEditable(editable);
if (listener != null && editable)
text.addModifyListener(listener);
} else {
control.setEnabled(editable);
}
}
}