blob: cadeb5c55a94e88cb95ae925ce79984ec40e4bd7 [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.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
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.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.launchbar.core.ILaunchBarManager;
import org.eclipse.launchbar.core.ILaunchDescriptor;
import org.eclipse.launchbar.ui.DefaultDescriptorLabelProvider;
import org.eclipse.launchbar.ui.ILaunchBarUIManager;
import org.eclipse.launchbar.ui.NewLaunchConfigWizard;
import org.eclipse.launchbar.ui.NewLaunchConfigWizardDialog;
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.widgets.Composite;
import org.eclipse.swt.widgets.Label;
public class ConfigSelector extends CSelector {
private ILaunchBarManager manager = Activator.getService(ILaunchBarManager.class);
private ILaunchBarUIManager uiManager = Activator.getService(ILaunchBarUIManager.class);
private DefaultDescriptorLabelProvider defaultProvider;
private static final String[] noConfigs = new String[] { Messages.ConfigSelector_0 };
public ConfigSelector(Composite parent, int style) {
super(parent, style);
setData(LaunchBarWidgetIds.ID, LaunchBarWidgetIds.CONFIG_SELECTOR);
setToolTipText(Messages.ConfigSelector_1);
defaultProvider = new DefaultDescriptorLabelProvider();
setContentProvider(new IStructuredContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
try {
ILaunchDescriptor[] descs = manager.getLaunchDescriptors();
if (descs.length == 0)
return noConfigs;
return descs;
} catch (CoreException e) {
return noConfigs;
}
}
});
setLabelProvider(new LabelProvider() {
@Override
public Image getImage(Object element) {
if (element instanceof ILaunchDescriptor) {
try {
ILaunchDescriptor configDesc = (ILaunchDescriptor) element;
ILabelProvider labelProvider = uiManager.getLabelProvider(configDesc);
if (labelProvider != null) {
Image img = labelProvider.getImage(element);
if (img != null)
return img;
}
} catch (CoreException e) {
Activator.log(e);
}
}
return defaultProvider.getImage(element);
}
@Override
public String getText(Object element) {
if (element instanceof String) {
return (String) element;
} else if (element instanceof ILaunchDescriptor) {
try {
ILaunchDescriptor configDesc = (ILaunchDescriptor) element;
ILabelProvider labelProvider = uiManager.getLabelProvider(configDesc);
if (labelProvider != null) {
String text = labelProvider.getText(element);
if (text != null)
return text;
}
} catch (CoreException e) {
Activator.log(e);
}
}
return defaultProvider.getText(element);
}
});
// no sorter for top, data is sorted by provider in historical order
setHistorySortComparator(null);
// alphabetic sorter
setSorter((ILaunchDescriptor o1, ILaunchDescriptor o2) -> o1.getName().compareTo(o2.getName()));
}
@Override
protected void initializeListViewer(LaunchBarListViewer listViewer) {
listViewer.setHistorySupported(true);
listViewer.setHistoryPreferenceName(Activator.PREF_LAUNCH_HISTORY_SIZE);
super.initializeListViewer(listViewer);
}
@Override
protected void fireSelectionChanged() {
Object selected = getSelection();
if (selected instanceof ILaunchDescriptor) {
ILaunchDescriptor configDesc = (ILaunchDescriptor) selected;
try {
manager.setActiveLaunchDescriptor(configDesc);
} catch (CoreException e) {
Activator.log(e);
}
}
}
@Override
public boolean isEditable(Object element) {
return element instanceof ILaunchDescriptor;
}
@Override
public void handleEdit(Object element) {
uiManager.openConfigurationEditor((ILaunchDescriptor) element);
}
@Override
public boolean hasActionArea() {
return true;
}
@Override
public void createActionArea(Composite parent) {
final Composite createButton = new Composite(parent, SWT.BORDER);
createButton.setData(LaunchBarWidgetIds.ID, LaunchBarWidgetIds.NEW);
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.ConfigSelector_2);
MouseListener mouseListener = new MouseAdapter() {
@Override
public void mouseUp(org.eclipse.swt.events.MouseEvent e) {
final NewLaunchConfigWizard wizard = new NewLaunchConfigWizard();
WizardDialog dialog = new NewLaunchConfigWizardDialog(getShell(), wizard);
if (dialog.open() == Window.OK) {
new Job(Messages.ConfigSelector_3) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
wizard.getWorkingCopy().doSave();
return Status.OK_STATUS;
} catch (CoreException e) {
return e.getStatus();
}
}
}.schedule();
}
}
};
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
public Point computeSize(int wHint, int hHint, boolean changed) {
return super.computeSize(250, hHint, changed);
}
@Override
public void setSelection(Object element) {
if (element == null)
element = noConfigs[0];
super.setSelection(element);
}
}