blob: c33c880c09dcfa01cdde1719e0bd297e9f2758d7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2020 EclipseSource and others.
*
* This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License 2.0 which accompanies this distribution, and is
* available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* EclipseSource - initial API and implementation
* IBM Corporation - ongoing development
******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.dialogs;
import org.eclipse.core.text.StringMatcher;
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.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
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 StyledText detailsArea;
private GridData gd;
private Link propLink;
private ISelectionProvider selectionProvider;
private int widthHint;
private boolean scrollable;
private String lastText;
/**
*
*/
public IUDetailsGroup(Composite parent, ISelectionProvider selectionProvider, int widthHint, boolean scrollable) {
this.selectionProvider = selectionProvider;
this.widthHint = widthHint;
this.scrollable = scrollable;
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, true);
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 StyledText(detailsComposite, SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL);
else
detailsArea = new StyledText(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());
}
/**
* 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;
}
/**
* Set the pattern to highlight in the detail text
*/
public void setDetailHighlight(String pattern) {
detailsArea.setStyleRanges(new StyleRange[0]);
if (pattern != null && !pattern.isEmpty()) {
StringMatcher matcher = new StringMatcher(pattern, true, false);
int i = 0;
StringMatcher.Position match = null;
do {
match = matcher.find(lastText, i, lastText.length());
if (match != null) {
i = match.getEnd();
detailsArea.setStyleRange(new StyleRange(match.getStart(), match.getEnd() - match.getStart(), null, null, SWT.BOLD));
}
} while (match != null);
}
}
/**
* 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, 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;
}
}