blob: c27cae544de6ed12f0c76ce523df1c16a0d39263 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 EclipseSource 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:
* EclipseSource - initial API and implementation
* IBM Corporation - ongoing development
******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.dialogs;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.internal.p2.ui.actions.PropertyDialogAction;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.window.SameShellProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
/**
* Creates a details group for a list of IUs.
*/
public class IUDetailsGroup {
private static final String LINKACTION = "linkAction"; //$NON-NLS-1$
private GridLayout layout;
private Text detailsArea;
private GridData gd;
private Link propLink;
private ISelectionProvider selectionProvider;
private int widthHint;
private boolean scrollable;
private String lastText;
private Button retryButton = null;
private final ProvisioningOperationWizard wizard;
/**
*
*/
public IUDetailsGroup(Composite parent, ISelectionProvider selectionProvider, int widthHint, boolean scrollable, ProvisioningOperationWizard wizard) {
this.selectionProvider = selectionProvider;
this.widthHint = widthHint;
this.scrollable = scrollable;
this.wizard = wizard;
createGroupComposite(parent);
}
/**
* Creates the group composite that holds the details area
* @param parent The parent composite
*/
void createGroupComposite(Composite parent) {
Group detailsComposite = new Group(parent, SWT.NONE);
GC gc = new GC(parent);
gc.setFont(JFaceResources.getDialogFont());
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
detailsComposite.setText(ProvUIMessages.ProfileModificationWizardPage_DetailsLabel);
layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
detailsComposite.setLayout(layout);
gd = new GridData(SWT.FILL, SWT.FILL, true, false);
detailsComposite.setLayoutData(gd);
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.verticalIndent = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_SPACING);
gd.heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, ILayoutConstants.DEFAULT_DESCRIPTION_HEIGHT);
gd.minimumHeight = Dialog.convertHeightInCharsToPixels(fontMetrics, ILayoutConstants.MINIMUM_DESCRIPTION_HEIGHT);
gd.widthHint = widthHint;
if (scrollable)
detailsArea = new Text(detailsComposite, SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL);
else
detailsArea = new Text(detailsComposite, SWT.WRAP | SWT.READ_ONLY);
detailsArea.setLayoutData(gd);
gd = new GridData(SWT.END, SWT.BOTTOM, true, false);
gd.horizontalIndent = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.HORIZONTAL_MARGIN);
propLink = createLink(detailsComposite, new PropertyDialogAction(new SameShellProvider(parent.getShell()), selectionProvider), ProvUIMessages.AvailableIUsPage_GotoProperties);
propLink.setLayoutData(gd);
// set the initial state based on selection
propLink.setVisible(!selectionProvider.getSelection().isEmpty());
retryButton = new Button(detailsComposite, SWT.PUSH);
retryButton.setText("I'm feeling lucky...");
retryButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println("Let's retry the operation");
// TODO, Let's do something different here.
wizard.recomputePlanWithLuck(wizard.getContainer());
System.out.println("Completed... the operation");
}
});
}
/**
* Set the detail text
*/
public void setDetailText(String text) {
// If the string is the same but the user has scrolled, the text
// widget will reset the selection. This makes it look like the text
// has changed when it hasn't. For this reason, we check equality first.
if (lastText == null || !lastText.equals(text))
detailsArea.setText(text);
lastText = text;
}
/**
* Toggles the property link for the details area.
*/
public void enablePropertyLink(boolean enable) {
propLink.setVisible(enable);
}
private Link createLink(Composite parent, IAction action, String text) {
Link link = new Link(parent, SWT.PUSH);
link.setText(text);
link.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
IAction linkAction = getLinkAction(event.widget);
if (linkAction != null) {
linkAction.runWithEvent(event);
}
}
});
link.setToolTipText(action.getToolTipText());
link.setData(LINKACTION, action);
return link;
}
IAction getLinkAction(Widget widget) {
Object data = widget.getData(LINKACTION);
if (data == null || !(data instanceof IAction)) {
return null;
}
return (IAction) data;
}
}