blob: c5dd9767bdadec7cb0aa25ba3b83b83424994f1e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SAP AG, Walldorf.
* 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.platform.discovery.ui.internal.view.result.impl;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.platform.discovery.core.api.ISearchContext;
import org.eclipse.platform.discovery.ui.api.IGenericViewCustomization;
import org.eclipse.platform.discovery.ui.api.ISearchConsoleCustomization;
import org.eclipse.platform.discovery.ui.api.ISearchResultCustomUiCreator;
import org.eclipse.platform.discovery.ui.api.impl.ILabeledSelection;
import org.eclipse.platform.discovery.ui.internal.selector.ICustomResultUiContributorDescription;
import org.eclipse.platform.discovery.ui.internal.view.SearchConsoleView;
import org.eclipse.platform.discovery.ui.internal.view.result.impl.TabbedSessionDisplayer.UI;
import org.eclipse.platform.discovery.ui.internal.view.result.impl.TabbedSessionDisplayer.UIFactory;
import org.eclipse.platform.discovery.ui.internal.xp.ICustomResultUiXpParser;
import org.eclipse.platform.discovery.ui.internal.xp.impl.CustomResultUiXpParser;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
public class ContributedUIFactory implements UIFactory<ISearchContext>
{
private final ICustomResultUiXpParser customResultXpParser;
private final ISelectionChangedListener resultSelChangedListener;
private final SearchConsoleView sv;
public ContributedUIFactory(final SearchConsoleView sv)
{
this.sv = sv;
customResultXpParser = newCustomResultXpParser();
resultSelChangedListener = new ISelectionChangedListener()
{
@Override
public void selectionChanged(SelectionChangedEvent event) {
sv.setResultSelection((ILabeledSelection)event.getSelection());
}
};
}
protected ICustomResultUiXpParser newCustomResultXpParser() {
return new CustomResultUiXpParser(Platform.getExtensionRegistry());
}
@Override
public UI create(final ISearchContext sc, Composite parent) {
return new ContributedUI(sc, parent);
}
@Override
public FormToolkit getFormTookit() {
return sv.getFormToolkit();
}
private class ContributedUI implements UI
{
private final String restoreDataKey = ContributedUI.class.getCanonicalName() + ".restore"; //$NON-NLS-1$
final ISearchResultCustomUiCreator srcuc;
final ISearchContext sc;
final Composite parent;
public ContributedUI(ISearchContext sc, Composite parent) {
srcuc = getUiCreator(sc.searchProviderId());
this.sc = sc;
this.parent = parent;
}
@Override
public void createControls() {
srcuc.createSearchUi(parent, sc,
sv.getFormToolkit(),
sv.viewActions(),
relevantViewCustomizations(sv.viewCustomizations(), sc.searchProviderId()));
srcuc.registerResultSelectionChangedListener(resultSelChangedListener);
}
@Override
public void restoreControlsState() {
srcuc.restore(sc.data().get(restoreDataKey));
}
@Override
public void saveControlsState() {
sc.data().put(restoreDataKey, srcuc.restoreData());
}
@Override
public Composite parent() {
return parent;
}
@Override
public void dispose() {
srcuc.dispose();
parent.dispose();
}
@Override
public String title() {
return sc.title();
}
}
private Set<ISearchConsoleCustomization> relevantViewCustomizations(final Set<IGenericViewCustomization> allCustomizations, final String searchProviderId)
{
final Set<ISearchConsoleCustomization> result = new HashSet<ISearchConsoleCustomization>();
for(IGenericViewCustomization viewC : allCustomizations)
{
if(((ISearchConsoleCustomization)viewC).acceptSearchProvider(searchProviderId))
{
result.add((ISearchConsoleCustomization)viewC);
}
}
return result;
}
private ICustomResultUiContributorDescription getUiCreatorContributor(final String searchProviderId)
{
final Set<ICustomResultUiContributorDescription> contributors = new HashSet<ICustomResultUiContributorDescription>();
for (ICustomResultUiContributorDescription descr : customResultXpParser.readContributions())
{
if (descr.getSearchProviderId().equals(searchProviderId))
{
contributors.add(descr);
}
}
if (contributors.size() > 1)
{
throw new IllegalStateException("More than one result contribution for search provider " + searchProviderId); //$NON-NLS-1$
}
if (contributors.size() == 1)
{
return contributors.iterator().next();
}
return null;
}
private ISearchResultCustomUiCreator getUiCreator(final String searchProviderId)
{
final ICustomResultUiContributorDescription uiContributor = getUiCreatorContributor(searchProviderId);
if (uiContributor != null)
{
return uiContributor.createUiCreator();
}
return fallbackUiCreator(searchProviderId);
}
public ISearchResultCustomUiCreator fallbackUiCreator(final String searchProviderId)
{
return new GenericResultUiCreator(searchProviderId, sv.getEnvironment());
}
}