package bndtools.views.repository;
import org.bndtools.utils.swt.FilterPanelPart;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import bndtools.Plugin;
/**
* An abstract base class for views that contain a textual filter field at the top, which can be hidden or revealed by
* toggling a button in the toolbar.
*/
public abstract class FilteredViewPart extends ViewPart {
private final FilterPanelPart filterPanel = new FilterPanelPart(Plugin.getDefault().getScheduler());
private Action filterAction;
private Composite stackPanel;
private StackLayout stack;
private Composite topPanel;
private Composite mainPanel;
/**
* Implements {@link ViewPart#createPartControl(Composite)}
*/
@Override
public final void createPartControl(Composite parent) {
// Create controls
stackPanel = new Composite(parent, SWT.NONE);
stack = new StackLayout();
stackPanel.setLayout(stack);
topPanel = new Composite(stackPanel, SWT.NONE);
// Filter panel
Control filterControl = filterPanel.createControl(topPanel);
// Main panel
mainPanel = new Composite(stackPanel, SWT.NONE);
createMainControl(mainPanel);
// Layout
stack.topControl = mainPanel;
GridLayout layout = new GridLayout(1, false);
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
topPanel.setLayout(layout);
mainPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
filterControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
// Toolbar
createActions();
fillToolBar(getViewSite().getActionBars().getToolBarManager());
}
private void createActions() {
filterAction = new FilterAction();
}
/**
* Fill the view toolbar. Subclasses may override but must call <code>super.fillToolBar</code>
*
* @param toolBar
* The toolbar manager supplied by the workbench
*/
protected void fillToolBar(IToolBarManager toolBar) {
toolBar.add(filterAction);
}
/**
* Create the main content of the view, below the filter bar.
*
* @param container
* The parent composite for the main content. Subclasses should set an appropriate layout on this
* composite.
*/
protected abstract void createMainControl(Composite container);
/**
* Called when the filter string is modified by the user. Subclasses should implement this method to apply the
* filter to the controls they create.
*
* @param filterString
* The new filter string, or an empty string ("") if there is no filter (e.g., because the user hid the
* filter bar).
*/
protected abstract void updatedFilter(String filterString);
/*
* The filter toggle button
*/
private class FilterAction extends Action {
public FilterAction() {
super("Filter", IAction.AS_CHECK_BOX);
setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/filter.gif"));
}
@Override
public void run() {
if (filterAction.isChecked()) {
stack.topControl = topPanel;
mainPanel.setParent(topPanel);
updatedFilter(filterPanel.getFilter());
} else {
stack.topControl = mainPanel;
mainPanel.setParent(stackPanel);
updatedFilter("");
}
stackPanel.layout(true, true);
setFocus();
}
}
@Override
public void setFocus() {
if (filterAction.isChecked()) {
filterPanel.setFocus();
} else {
doSetFocus();
}
}
/**
* Called when the view receives keyboard focus. Subclasses should implement to control
*/
protected void doSetFocus() {}
}