package bndtools.views.repository;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistable;
import org.osgi.resource.Requirement;
public class AdvancedSearchDialog extends TitleAreaDialog implements IPersistable {
private final Map<String,SearchPanel> panelMap = new LinkedHashMap<String,SearchPanel>();
private TabFolder tabFolder;
private int activeTabIndex = 0;
private Requirement requirement = null;
public AdvancedSearchDialog(Shell parentShell) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
panelMap.put("Package", new PackageSearchPanel());
panelMap.put("Service", new ServiceSearchPanel());
panelMap.put("Other", new ArbitraryNamespaceSearchPanel());
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle("Advanced Search");
setMessage("Perform a search for resource capabilities in the Repositories. Select the\ncapability namespace using the tab bar.");
Composite area = (Composite) super.createDialogArea(parent);
tabFolder = new TabFolder(area, SWT.TOP);
tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
PropertyChangeListener changeListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateFromPanel();
}
};
final List<Image> images = new LinkedList<Image>();
for (Entry<String,SearchPanel> panelEntry : panelMap.entrySet()) {
String title = panelEntry.getKey();
SearchPanel panel = panelEntry.getValue();
Composite container = new Composite(tabFolder, SWT.NONE);
container.setLayout(new GridLayout(1, false));
Control control = panel.createControl(container);
GridData controlLayoutData = new GridData(SWT.FILL, SWT.CENTER, true, true);
controlLayoutData.widthHint = 200;
control.setLayoutData(controlLayoutData);
TabItem item = new TabItem(tabFolder, SWT.NONE);
item.setText(title);
item.setControl(container);
item.setData(panel);
Image image = panel.createImage(tabFolder.getDisplay());
if (image != null) {
images.add(image);
item.setImage(image);
}
panel.addPropertyChangeListener(changeListener);
}
tabFolder.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
for (Image image : images) {
if (!image.isDisposed())
image.dispose();
}
}
});
tabFolder.setSelection(activeTabIndex);
SearchPanel currentPanel = (SearchPanel) tabFolder.getItem(activeTabIndex).getData();
currentPanel.setFocus();
requirement = currentPanel.getRequirement();
tabFolder.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
activeTabIndex = tabFolder.getSelectionIndex();
updateFromPanel();
getSelectedPanel().setFocus();
}
});
return area;
}
private SearchPanel getSelectedPanel() {
int index = tabFolder.getSelectionIndex();
TabItem item = tabFolder.getItem(index);
return (SearchPanel) item.getData();
}
private void updateFromPanel() {
SearchPanel panel = getSelectedPanel();
setErrorMessage(panel.getError());
requirement = panel.getRequirement();
getButton(OK).setEnabled(requirement != null);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
Button okButton = getButton(OK);
okButton.setText("Search");
okButton.setEnabled(requirement != null);
}
public Requirement getRequirement() {
return requirement;
}
@Override
public void saveState(IMemento memento) {
memento.putInteger("tabIndex", activeTabIndex);
for (Entry<String,SearchPanel> panelEntry : panelMap.entrySet()) {
IMemento childMemento = memento.createChild("tab", panelEntry.getKey());
SearchPanel panel = panelEntry.getValue();
panel.saveState(childMemento);
}
}
public void restoreState(IMemento memento) {
activeTabIndex = memento.getInteger("tabIndex");
IMemento[] children = memento.getChildren("tab");
for (IMemento childMemento : children) {
String key = childMemento.getID();
SearchPanel panel = panelMap.get(key);
if (panel != null)
panel.restoreState(childMemento);
}
}
}