blob: 15f43c29a0e548097e08b688fea442b6384b2f60 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Alexander Kurtakov <akurtako@redhat.com> - bug 415649
*******************************************************************************/
package org.eclipse.pde.internal.ui.commands;
import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.eclipse.core.commands.Category;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.jface.action.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import org.eclipse.pde.internal.core.util.PatternConstructor;
import org.eclipse.pde.internal.ui.PDEPluginImages;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandImageService;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.*;
public class CommandList {
protected class CommandTreeLabelProvider extends LabelProvider {
private HashMap<Object, Image> fImgMap = new HashMap<>();
private Image fDefaultImage;
@Override
public String getText(Object element) {
if (element instanceof Category)
return CommandList.getText(element);
else if (element instanceof Command)
return CommandList.getText(element);
return null;
}
@Override
public Image getImage(Object element) {
Image img = fImgMap.get(element);
if (img != null)
return img;
if (element instanceof Category)
img = PDEPluginImages.DESC_COMGROUP_OBJ.createImage();
else if (element instanceof Command) {
ImageDescriptor desc = fComImgServ.getImageDescriptor(((Command) element).getId());
if (desc == null) {
if (fDefaultImage == null)
fDefaultImage = PDEPluginImages.DESC_BUILD_VAR_OBJ.createImage();
return fDefaultImage;
}
img = desc.createImage();
}
if (img != null)
fImgMap.put(element, img);
return img;
}
@Override
public void dispose() {
for (Iterator<Object> i = fImgMap.keySet().iterator(); i.hasNext();)
fImgMap.get(i.next()).dispose();
if (fDefaultImage != null)
fDefaultImage.dispose();
super.dispose();
}
}
protected class CommandTreeComparator extends ViewerComparator {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
return getText(e1).compareTo(getText(e2));
}
}
protected class WildcardFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
String filterText = fFilterText.getText();
if (filterText.length() == 0)
return true;
String wMatch = '*' + filterText + '*';
Pattern pattern = null;
try {
pattern = PatternConstructor.createPattern(wMatch, false);
} catch (PatternSyntaxException e) {
return false;
}
if (element instanceof Category) {
ITreeContentProvider prov = (ITreeContentProvider) fTreeViewer.getContentProvider();
Command[] commands = (Command[]) prov.getChildren(element);
for (int i = 0; i < commands.length; i++) {
String text = getText(commands[i]);
if (pattern.matcher(text.subSequence(0, text.length())).matches())
return true;
}
return false;
}
String text = getText(element);
return pattern.matcher(text.subSequence(0, text.length())).matches();
}
}
protected static String getText(Object obj) {
if (obj instanceof Command) {
Command com = (Command) obj;
try {
return com.getName();
} catch (NotDefinedException e) {
return com.getId();
}
} else if (obj instanceof Category) {
Category cat = (Category) obj;
try {
return cat.getName();
} catch (NotDefinedException e) {
return cat.getId();
}
}
return new String();
}
private class CollapseAction extends Action {
public CollapseAction() {
super(PDEUIMessages.CommandList_collapseAll0, IAction.AS_PUSH_BUTTON);
setImageDescriptor(PDEPluginImages.DESC_COLLAPSE_ALL);
setToolTipText(PDEUIMessages.CommandList_collapseAll0);
}
}
private CommandComposerPart fCCP;
private FormToolkit fToolkit;
private Text fFilterText;
private TreeViewer fTreeViewer;
private CommandTreeContentProvider fContentProvider;
private ICommandImageService fComImgServ;
public CommandList(CommandComposerPart cv, Composite parent) {
fCCP = cv;
fToolkit = cv.getToolkit();
createTree(parent);
fComImgServ = (ICommandImageService) PlatformUI.getWorkbench().getAdapter(ICommandImageService.class);
}
private void createTree(Composite parent) {
Composite c = fCCP.createComposite(parent, GridData.FILL_BOTH, 1, true, 5);
Section section = fToolkit.createSection(c, ExpandableComposite.TITLE_BAR);
section.setText(PDEUIMessages.CommandList_groupName);
section.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite comp = fCCP.createComposite(section);
ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
ToolBar toolbar = toolBarManager.createControl(section);
final Cursor handCursor = Display.getCurrent().getSystemCursor(SWT.CURSOR_HAND);
toolbar.setCursor(handCursor);
toolBarManager.add(new CollapseAction() {
@Override
public void run() {
fTreeViewer.collapseAll();
}
});
fToolkit.adapt(toolbar, true, true);
toolbar.setBackground(null);
section.setTextClient(toolbar);
toolBarManager.update(true);
createFilterText(comp);
Tree tree = fToolkit.createTree(comp, SWT.V_SCROLL | SWT.H_SCROLL);
tree.setLayout(new GridLayout());
GridData gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = 200;
tree.setLayoutData(gd);
fTreeViewer = new TreeViewer(tree);
fContentProvider = new CommandTreeContentProvider(fCCP.getCommandService());
fTreeViewer.setContentProvider(fContentProvider);
fTreeViewer.setLabelProvider(new CommandTreeLabelProvider());
fTreeViewer.setComparator(new CommandTreeComparator());
fTreeViewer.addFilter(new WildcardFilter());
fTreeViewer.setInput(new Object());
fTreeViewer.addSelectionChangedListener(fCCP);
section.setClient(comp);
}
protected void addTreeSelectionListener(ISelectionChangedListener listener) {
if (listener != null)
fTreeViewer.addSelectionChangedListener(listener);
}
private void createFilterText(Composite parent) {
Composite c = fCCP.createComposite(parent, GridData.FILL_HORIZONTAL, 3, false, 0);
fFilterText = fToolkit.createText(c, "", SWT.BORDER); //$NON-NLS-1$
fFilterText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fFilterText.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.ARROW_DOWN)
fTreeViewer.getControl().setFocus();
}
});
final ImageHyperlink clearButton = fToolkit.createImageHyperlink(c, SWT.NONE);
final Image hoverImg = PDEPluginImages.DESC_CLEAR.createImage();
clearButton.setImage(hoverImg);
clearButton.setToolTipText(PDEUIMessages.CommandList_clearTooltip);
clearButton.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
hoverImg.dispose();
}
});
clearButton.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
fFilterText.setText(""); //$NON-NLS-1$
}
});
clearButton.setVisible(false);
fFilterText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
fTreeViewer.refresh();
clearButton.setVisible(fFilterText.getText().length() > 0);
}
});
}
public void setFocus() {
fFilterText.setFocus();
}
protected void setSelection(Object object) {
if (fTreeViewer != null && object != null)
fTreeViewer.setSelection(new StructuredSelection(object));
}
public ISelection getSelection() {
return fTreeViewer.getSelection();
}
}