blob: 66a51a26aa979f635ea013f7aa3dc1939e0de1e1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2018 QNX Software Systems 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:
* Doug Schaefer
*******************************************************************************/
package org.eclipse.launchbar.ui.controls.internal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.launchbar.core.ILaunchBarManager;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.core.target.ILaunchTargetListener;
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
import org.eclipse.launchbar.core.target.TargetStatus;
import org.eclipse.launchbar.core.target.TargetStatus.Code;
import org.eclipse.launchbar.ui.target.ILaunchTargetUIManager;
import org.eclipse.launchbar.ui.target.NewLaunchTargetWizardAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
public class TargetSelector extends CSelector implements ILaunchTargetListener {
private final ILaunchBarManager manager = Activator.getService(ILaunchBarManager.class);
private final ILaunchTargetUIManager targetUIManager = Activator.getService(ILaunchTargetUIManager.class);
private final ILaunchTargetManager targetManager = Activator.getService(ILaunchTargetManager.class);
private static final ILaunchTarget[] noTargets = new ILaunchTarget[] { ILaunchTarget.NULL_TARGET };
public TargetSelector(Composite parent, int style) {
super(parent, style);
targetManager.addListener(this);
setContentProvider(new IStructuredContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
try {
return manager.getLaunchTargets(manager.getActiveLaunchDescriptor());
} catch (CoreException e) {
Activator.log(e);
return noTargets;
}
}
});
setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof ILaunchTarget) {
ILaunchTarget target = (ILaunchTarget) element;
ILabelProvider provider = targetUIManager.getLabelProvider(target);
return provider != null ? provider.getText(target) : target.getId();
}
return super.getText(element);
}
@Override
public Image getImage(Object element) {
if (element == ILaunchTarget.NULL_TARGET) {
return null;
}
if (element instanceof ILaunchTarget) {
ILaunchTarget target = (ILaunchTarget) element;
ILabelProvider provider = targetUIManager.getLabelProvider(target);
if (provider != null) {
final Image baseImage = provider.getImage(target);
final TargetStatus status = targetManager.getStatus(target);
if (status.getCode() == Code.OK) {
return baseImage;
} else {
String compId = String.format("%s.%s.%s", target.getTypeId(), target.getId(), //$NON-NLS-1$
status.getCode());
Image image = Activator.getDefault().getImageRegistry().get(compId);
if (image == null && baseImage != null) {
ImageDescriptor desc = new CompositeImageDescriptor() {
@Override
protected Point getSize() {
Rectangle bounds = baseImage.getBounds();
return new Point(bounds.width, bounds.height);
}
@Override
protected void drawCompositeImage(int width, int height) {
Image overlay = PlatformUI.getWorkbench().getSharedImages()
.getImage(status.getCode() == Code.ERROR
? ISharedImages.IMG_DEC_FIELD_ERROR
: ISharedImages.IMG_DEC_FIELD_WARNING);
drawImage(baseImage.getImageData(), 0, 0);
int y = baseImage.getBounds().height - overlay.getBounds().height;
drawImage(overlay.getImageData(), 0, y);
}
};
image = desc.createImage();
Activator.getDefault().getImageRegistry().put(compId, image);
}
return image;
}
}
}
return super.getImage(element);
}
});
setSorter((o1, o2) -> {
// Sort by name
String s1 = String.valueOf(o1);
String s2 = String.valueOf(o2);
return s1.compareTo(s2);
});
}
@Override
public boolean isEditable(Object element) {
return true;
}
@Override
public void handleEdit(Object element) {
targetUIManager.editLaunchTarget((ILaunchTarget) getSelection());
}
@Override
public boolean hasActionArea() {
return true;
}
@Override
public void createActionArea(final Composite parent) {
final Composite createButton = new Composite(parent, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).applyTo(createButton);
GridLayoutFactory.fillDefaults().margins(7, 7).applyTo(createButton);
createButton.setBackground(getBackground());
final Label createLabel = new Label(createButton, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false).applyTo(createLabel);
createLabel.setBackground(getBackground());
createLabel.setText(Messages.TargetSelector_CreateNewTarget);
MouseListener mouseListener = new MouseAdapter() {
@Override
public void mouseUp(org.eclipse.swt.events.MouseEvent event) {
new NewLaunchTargetWizardAction().run();
}
};
createButton.addMouseListener(mouseListener);
createLabel.addMouseListener(mouseListener);
MouseTrackListener mouseTrackListener = new MouseTrackAdapter() {
@Override
public void mouseEnter(MouseEvent e) {
Color highlightColor = getHighlightColor();
createButton.setBackground(highlightColor);
createLabel.setBackground(highlightColor);
}
@Override
public void mouseExit(MouseEvent e) {
Color backgroundColor = getBackground();
createButton.setBackground(backgroundColor);
createLabel.setBackground(backgroundColor);
}
};
createButton.addMouseTrackListener(mouseTrackListener);
createLabel.addMouseTrackListener(mouseTrackListener);
}
@Override
protected void fireSelectionChanged() {
Object selection = getSelection();
if (selection instanceof ILaunchTarget) {
ILaunchTarget target = (ILaunchTarget) selection;
try {
manager.setActiveLaunchTarget(target);
} catch (CoreException e) {
Activator.log(e);
}
}
}
public void setToolTipText(ILaunchTarget target) {
String text = Messages.TargetSelector_ToolTipPrefix + ": " + targetManager.getStatus(target).getMessage(); //$NON-NLS-1$
setToolTipText(text);
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return super.computeSize(200, hHint, changed);
}
@Override
public void setSelection(Object element) {
if (isDisposed())
return;
if (element == null) {
element = noTargets[0];
} else if (element instanceof ILaunchTarget) {
setToolTipText((ILaunchTarget) element);
}
super.setSelection(element);
}
@Override
public void dispose() {
super.dispose();
targetManager.removeListener(this);
}
@Override
public void update(Object element) {
super.update(element);
if (element != null && element instanceof ILaunchTarget) {
setToolTipText((ILaunchTarget) element);
} else {
setToolTipText(Messages.TargetSelector_ToolTipPrefix);
}
}
@Override
public void launchTargetStatusChanged(ILaunchTarget target) {
try {
if (target.equals(manager.getActiveLaunchTarget())) {
refresh();
}
} catch (CoreException e) {
Activator.log(e);
}
}
}