/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.meta.ui.search;
import java.text.MessageFormat;
import org.jboss.tools.common.meta.ui.Messages;
import org.jboss.tools.common.meta.ui.MetaUIPlugin;
import org.jboss.tools.common.model.ui.navigator.NavigatorLabelProvider;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.viewers.*;
import org.eclipse.search.ui.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.IPageSite;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
import org.jboss.tools.common.model.util.FindObjectHelper;
public class MetaSearchResultPage implements ISearchResultPage, ISearchResultListener {
ISearchResultViewPart part;
MetaSearchResult search;
Object uiState;
String id;
IPageSite site;
TreeViewer viewer;
public Object getUIState() {
return uiState;
}
public void setInput(ISearchResult search, Object uiState) {
this.search = (MetaSearchResult)search;
if(search == null) return;
search.removeListener(this);
search.addListener(this);
this.uiState = uiState;
if (viewer != null) {
SafeRunner.run(new ISafeRunnable() {
public void run() throws Exception {
viewer.refresh();
}
public void handleException(Throwable exception) {
MetaUIPlugin.getDefault().logError(exception);
}
});
}
}
public void setViewPart(ISearchResultViewPart part) {
this.part = part;
}
public void restoreState(IMemento memento) {
}
public void saveState(IMemento memento) {
}
public void setID(String id) {
this.id = id;
}
public String getID() {
return id;
}
public String getLabel() {
if(search != null) {
ISearchQuery query = search.getQuery();
if(query instanceof MetaSearchQuery) {
MetaSearchQuery q = (MetaSearchQuery)query;
return MessageFormat.format(Messages.MetaSearchResultPage_TextToFindNMatches, q.getTextToFind(),
search.getObjects().size());
}
}
return Messages.MetaSearchResultPage_Label;
}
public IPageSite getSite() {
return site;
}
public void init(IPageSite site) throws PartInitException {
this.site = site;
}
public void createControl(Composite parent) {
viewer = new TreeViewer(parent);
viewer.setUseHashlookup(false);
viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
viewer.setContentProvider(new ContentProvider());
viewer.setLabelProvider(new MetaLabelProvider());
viewer.setInput(new Object());
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
ISelection s = event.getSelection();
if(s.isEmpty() || !(s instanceof StructuredSelection)) return;
StructuredSelection ss = (StructuredSelection)s;
XModelObject o = (XModelObject)ss.getFirstElement();
FindObjectHelper.findModelObject(o, FindObjectHelper.EVERY_WHERE);
}
}
);
}
public void dispose() {
if(viewer != null) {
if(viewer.getControl() != null && !viewer.getControl().isDisposed()) viewer.getControl().dispose();
site = null;
search.removeListener(this);
search = null;
viewer = null;
}
}
public Control getControl() {
return viewer == null ? null : viewer.getControl();
}
public void setActionBars(IActionBars actionBars) {
}
public void setFocus() {
}
class ContentProvider implements ITreeContentProvider {
public Object[] getElements(Object inputElement) {
if(search == null) return new Object[0];
return search.getObjects().toArray(new Object[0]);
}
public void dispose() {}
public void inputChanged(final Viewer viewer, Object oldInput, final Object newInput) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if(viewer == null || newInput == null) return;
SafeRunner.run(new ISafeRunnable() {
public void run() throws Exception {
viewer.refresh();
}
public void handleException(Throwable exception) {
MetaUIPlugin.getDefault().logError(exception);
}});
}
});
}
public Object[] getChildren(Object parentElement) {
return new Object[0];
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return false;
}
}
long timeStamp = -1;
public void searchResultChanged(SearchResultEvent e) {
if(search == null) return;
if(timeStamp == search.getTimeStamp()) return;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if(viewer == null || timeStamp == search.getTimeStamp()) return;
viewer.refresh();
timeStamp = search.getTimeStamp();
part.updateLabel();
}
});
}
class MetaLabelProvider extends NavigatorLabelProvider {
public String getText(Object element) {
if(element instanceof XModelObject) {
XModelObject o = (XModelObject)element;
XModelObject f = o;
while(f != null && f.getFileType() == XModelObject.NONE) f = f.getParent();
String file = f == null ? "" : FileAnyImpl.toFileName(f); //$NON-NLS-1$
String entity = o.getModelEntity().getName();
if("MetaEntity".equals(entity)) { //$NON-NLS-1$
return super.getText(element) + " - " + file; //$NON-NLS-1$
} else if("MetaAttribute".equals(entity)) { //$NON-NLS-1$
XModelObject p = o.getParent().getParent();
return MessageFormat.format(Messages.MetaSearchResultPage_MetaAttributeLabel,
super.getText(element), p.getPresentationString(), file);
} else {
return super.getText(element) + " - " + file; //$NON-NLS-1$
}
}
return super.getText(element);
}
}
}