blob: d885b5814564d1fd87938deaa216b5b0dcfa61c3 [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 java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.ILaunchMode;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.ILaunchGroup;
import org.eclipse.jface.resource.ImageDescriptor;
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.ui.ILaunchBarUIConstants;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class ModeSelector extends CSelector {
private static final String[] noModes = new String[] { "---" }; //$NON-NLS-1$
private final ILaunchBarManager manager = Activator.getService(ILaunchBarManager.class);
private Map<String, Image> modeButtonImages = new HashMap<>();
public ModeSelector(Composite parent, int style) {
super(parent, style);
setToolTipText(Messages.ModeSelector_0);
setContentProvider(new IStructuredContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
try {
ILaunchMode[] modes = manager.getLaunchModes();
if (modes.length > 0)
return modes;
} catch (CoreException e) {
Activator.log(e);
}
return noModes;
}
});
setLabelProvider(new LabelProvider() {
private Map<ImageDescriptor, Image> images = new HashMap<>();
@Override
public void dispose() {
super.dispose();
for (Image image : images.values()) {
image.dispose();
}
}
@Override
public Image getImage(Object element) {
if (element instanceof ILaunchMode) {
ILaunchMode mode = (ILaunchMode) element;
ILaunchGroup group = getLaunchGroup(mode);
if (group != null) {
ImageDescriptor imageDesc = group.getImageDescriptor();
if (imageDesc == null)
return null;
Image image = images.get(imageDesc);
if (image == null) {
image = imageDesc.createImage();
images.put(imageDesc, image);
}
return image;
}
}
return super.getImage(element);
}
@Override
public String getText(Object element) {
if (element instanceof ILaunchMode) {
ILaunchMode mode = (ILaunchMode) element;
ILaunchGroup group = getLaunchGroup(mode);
if (group != null) {
return group.getLabel().replace("&", ""); //$NON-NLS-1$ //$NON-NLS-2$
}
}
return super.getText(element);
}
});
setSorter((o1, o2) -> {
if (o1 instanceof ILaunchMode && o2 instanceof ILaunchMode) {
String mode1 = ((ILaunchMode) o1).getIdentifier();
String mode2 = ((ILaunchMode) o2).getIdentifier();
// run comes first, then debug, then the rest
if (mode1.equals("run")) { //$NON-NLS-1$
if (mode2.equals("run")) //$NON-NLS-1$
return 0;
else
return -1;
}
if (mode2.equals("run")) //$NON-NLS-1$
return 1;
if (mode1.equals("debug")) { //$NON-NLS-1$
if (mode2.equals("debug")) //$NON-NLS-1$
return 0;
else
return -1;
}
if (mode2.equals("debug")) //$NON-NLS-1$
return 1;
}
return 0;
});
}
@Override
public void dispose() {
super.dispose();
for (Image image : modeButtonImages.values()) {
image.dispose();
}
}
protected ILaunchGroup getDefaultLaunchGroup(String mode) {
String groupId;
if (mode.equals(ILaunchManager.DEBUG_MODE)) {
groupId = IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP;
} else if (mode.equals(ILaunchManager.PROFILE_MODE)) {
groupId = IDebugUIConstants.ID_PROFILE_LAUNCH_GROUP;
} else {
groupId = IDebugUIConstants.ID_RUN_LAUNCH_GROUP;
}
return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupId);
}
protected ILaunchGroup getLaunchGroup(String mode) throws CoreException {
ILaunchConfigurationType type = manager.getLaunchConfigurationType(manager.getActiveLaunchDescriptor(),
manager.getActiveLaunchTarget());
if (type == null)
return null;
return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(type, mode);
}
@Override
protected void fireSelectionChanged() {
Object selected = getSelection();
if (selected instanceof ILaunchMode) {
ILaunchMode mode = (ILaunchMode) selected;
try {
manager.setActiveLaunchMode(mode);
} catch (CoreException e) {
Activator.log(e);
} catch (Exception e) {
// manager can throw illegal state exception hopefully we never
// get it
Activator.log(e);
}
}
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return super.computeSize(150, hHint, changed);
}
@Override
public void setSelection(Object element) {
if (element == null)
element = noModes[0];
if (isDisposed())
return;
super.setSelection(element);
updateLaunchButton(findLaunchButton());
}
private ToolItem findLaunchButton() {
String commandId = ILaunchBarUIConstants.CMD_LAUNCH;
for (Control control : getParent().getChildren()) {
if (control instanceof ToolBar) {
for (ToolItem toolItem : ((ToolBar) control).getItems()) {
if (commandId.equals(toolItem.getData("command"))) { //$NON-NLS-1$
// found launch button
return toolItem;
}
}
}
}
Activator.log(new RuntimeException("Launch button is not found in toolbar")); //$NON-NLS-1$
return null;
}
private void updateLaunchButton(ToolItem toolItem) {
if (toolItem == null || isDisposed()) {
return;
}
Object selection = getSelection();
if (selection instanceof ILaunchMode) {
ILaunchMode mode = (ILaunchMode) selection;
toolItem.setToolTipText(NLS.bind(Messages.ModeSelector_ToolTip, mode.getLabel()));
ILaunchGroup group = getLaunchGroup(mode);
// we cannot use mode id as id, since external tool group and run group have same "run" id for the mode
// but different images
String id = group.getIdentifier();
Image image = modeButtonImages.get(id);
if (image == null) {
Image bgImage = Activator.getDefault().getImageRegistry().get(Activator.IMG_BUTTON_BACKGROUND);
Image modeImage = getLabelProvider().getImage(mode);
ImageDescriptor imageDesc = new LaunchBarButtonImageDescriptor(modeImage, bgImage);
image = imageDesc.createImage();
modeButtonImages.put(id, image);
}
toolItem.setImage(image);
}
}
public ILaunchGroup getLaunchGroup(ILaunchMode mode) {
ILaunchGroup group = null;
try {
group = getLaunchGroup(mode.getIdentifier());
} catch (CoreException e) {
Activator.log(e);
}
if (group == null) {
group = getDefaultLaunchGroup(mode.getIdentifier());
}
return group;
}
}