blob: e6ea06b7f60ebdcabdf95f61369ae8e926a822bc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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
*
*******************************************************************************/
package org.eclipse.jst.jsp.ui.tests;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.jsp.core.taglib.ITaglibIndexDelta;
import org.eclipse.jst.jsp.core.taglib.ITaglibIndexListener;
import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
import org.eclipse.jst.jsp.core.taglib.TaglibIndexDelta;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.wst.sse.core.utils.StringUtils;
public class TaglibIndexDeltaTraceView extends ViewPart {
static final String MEM_LISTENING = "IS_LISTENING";
boolean isListening = false;
/**
* Resumes listening to TaglibIndexDeltas
*/
private class ResumeAction extends Action {
public ResumeAction() {
super();
setText("Resume");
setImageDescriptor(JSPUITestsPlugin.getDefault().getImageRegistry().getDescriptor(JSPUITestImages.IMG_ELCL_RESUME));
setDisabledImageDescriptor(JSPUITestsPlugin.getDefault().getImageRegistry().getDescriptor(JSPUITestImages.IMG_DLCL_RESUME));
}
public void run() {
super.run();
TaglibIndex.addTaglibIndexListener(fInternalListener);
isListening = true;
fSuspendAction.setEnabled(true);
setEnabled(false);
}
}
/**
* Stops listening to TaglibIndexDeltas
*/
private class SuspendAction extends Action {
public SuspendAction() {
setText("Suspend");
setImageDescriptor(JSPUITestsPlugin.getDefault().getImageRegistry().getDescriptor(JSPUITestImages.IMG_ELCL_SUSPEND));
setDisabledImageDescriptor(JSPUITestsPlugin.getDefault().getImageRegistry().getDescriptor(JSPUITestImages.IMG_DLCL_SUSPEND));
}
public void run() {
super.run();
TaglibIndex.removeTaglibIndexListener(fInternalListener);
isListening = false;
setEnabled(false);
fResumeAction.setEnabled(true);
}
}
/**
* Empties deltas from viewer
*/
private class ClearAction extends Action {
public ClearAction() {
setText("Clear");
setImageDescriptor(JSPUITestsPlugin.getDefault().getImageRegistry().getDescriptor(JSPUITestImages.IMG_ELCL_REMOVE_ALL));
setDisabledImageDescriptor(JSPUITestsPlugin.getDefault().getImageRegistry().getDescriptor(JSPUITestImages.IMG_DLCL_REMOVE_ALL));
}
public void run() {
super.run();
fInput.clear();
fViewer.refresh();
setEnabled(false);
}
}
class TaglibIndexListener implements ITaglibIndexListener {
public void indexChanged(final ITaglibIndexDelta delta) {
getControl().getDisplay().syncExec(new Runnable() {
public void run() {
fInput.add(delta);
fViewer.refresh();
fViewer.setSelection(new StructuredSelection(delta));
fClearAction.setEnabled(true);
}
});
}
}
ITaglibIndexListener fInternalListener = null;
List fInput = new ArrayList();
TableViewer fViewer = null;
ResumeAction fResumeAction;
SuspendAction fSuspendAction;
IAction fClearAction;
public TaglibIndexDeltaTraceView() {
super();
fInternalListener = new TaglibIndexListener();
}
void showSelectionDetail(final Composite composite) {
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
if (!selection.isEmpty()) {
final TaglibIndexDelta selectedDelta = (TaglibIndexDelta) selection.getFirstElement();
final ITableLabelProvider tableLabelProvider = ((ITableLabelProvider) fViewer.getLabelProvider());
String columnText = tableLabelProvider.getColumnText(selectedDelta, 1);
columnText = columnText + ":" + tableLabelProvider.getColumnText(selectedDelta, 2);
new Dialog(composite.getShell()) {
public void create() {
setShellStyle(getShellStyle() | SWT.RESIZE);
super.create();
}
protected Control createDialogArea(final Composite parent) {
final Composite inner = new Composite(parent, SWT.NONE);
inner.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Sash sash = new Sash(inner, SWT.HORIZONTAL);
final TreeViewer treeViewer = new TreeViewer(inner);
treeViewer.setContentProvider(new ITreeContentProvider() {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public Object getParent(Object element) {
return selectedDelta;
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof TaglibIndexDelta) {
TaglibIndexDelta taglibIndexDelta = ((TaglibIndexDelta) parentElement);
if (taglibIndexDelta.getTrigger() != null) {
List combined = new ArrayList();
combined.add(taglibIndexDelta.getTrigger());
combined.addAll(Arrays.asList(taglibIndexDelta.getAffectedChildren()));
return combined.toArray();
}
return taglibIndexDelta.getAffectedChildren();
}
return new Object[0];
}
});
treeViewer.setLabelProvider(new LabelProvider() {
public String getText(Object element) {
if (element instanceof ITaglibIndexDelta) {
ITaglibIndexDelta taglibIndexDelta = ((ITaglibIndexDelta) element);
if (taglibIndexDelta.getTaglibRecord() != null)
return taglibIndexDelta.toString();
String text = tableLabelProvider.getColumnText(selectedDelta, 1);
text = text + ":" + tableLabelProvider.getColumnText(selectedDelta, 2);
return text;
}
return StringUtils.firstLineOf(super.getText(element));
}
});
treeViewer.setInput(selectedDelta);
final Text text = new Text(inner, SWT.MULTI);
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection2 = (IStructuredSelection) treeViewer.getSelection();
if (!selection2.isEmpty())
text.setText("" + (selection2).getFirstElement());
else
text.setText("");
}
});
final FormLayout form = new FormLayout();
inner.setLayout(form);
FormData firstData = new FormData();
firstData.top = new FormAttachment(0, 0);
firstData.bottom = new FormAttachment(sash, 2);
firstData.left = new FormAttachment(0, 0);
firstData.right = new FormAttachment(100, 0);
treeViewer.getControl().setLayoutData(firstData);
FormData secondData = new FormData();
secondData.top = new FormAttachment(sash, 2);
secondData.left = new FormAttachment(0, 0);
secondData.right = new FormAttachment(100, 0);
secondData.bottom = new FormAttachment(100, 0);
text.setLayoutData(secondData);
final FormData sashData = new FormData();
sashData.top = new FormAttachment(60, 0);
sashData.left = new FormAttachment(0, 0);
sashData.right = new FormAttachment(100, 0);
sash.setLayoutData(sashData);
sash.addListener(SWT.Selection, new org.eclipse.swt.widgets.Listener() {
public void handleEvent(Event e) {
sashData.top = new FormAttachment(0, e.y);
inner.layout();
}
});
return sash;
}
}.open();
}
}
public void createPartControl(final Composite parent) {
fViewer = new TableViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
fViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
showSelectionDetail(parent);
}
});
fViewer.setContentProvider(new ArrayContentProvider());
fViewer.setLabelProvider(new ITableLabelProvider() {
public void removeListener(ILabelProviderListener listener) {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void dispose() {
}
public void addListener(ILabelProviderListener listener) {
}
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0 : {
return Long.toString(((TaglibIndexDelta) element).getTime());
}
case 1 : {
String kind = null;
switch (((ITaglibIndexDelta) element).getKind()) {
case ITaglibIndexDelta.ADDED :
kind = "added";
break;
case ITaglibIndexDelta.REMOVED :
kind = "removed";
break;
case ITaglibIndexDelta.CHANGED :
kind = "changed";
break;
}
return kind;
}
case 2 :
return ((ITaglibIndexDelta) element).getProject().getName();
case 3 :
return ((TaglibIndexDelta) element).getTrigger().toString();
}
return "";
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
});
String[] columnProperties = new String[]{"time", "Kind", "Project", "Trigger"};
TableLayout tlayout = new TableLayout();
CellEditor[] cellEditors = new CellEditor[columnProperties.length];
int columnWidths[] = new int[]{Display.getCurrent().getBounds().width / 14, Display.getCurrent().getBounds().width / 7, Display.getCurrent().getBounds().width / 7, Display.getCurrent().getBounds().width / 14, Display.getCurrent().getBounds().width / 7};
for (int i = 0; i < columnProperties.length; i++) {
tlayout.addColumnData(new ColumnWeightData(1));
TableColumn tc = new TableColumn(fViewer.getTable(), SWT.NONE);
tc.setText(columnProperties[i]);
tc.setResizable(true);
tc.setWidth(columnWidths[i]);
}
fViewer.setCellEditors(cellEditors);
fViewer.setColumnProperties(columnProperties);
fViewer.getTable().setHeaderVisible(true);
fViewer.getTable().setLinesVisible(true);
fViewer.setColumnProperties(columnProperties);
MenuManager contextMenuManager = new MenuManager();
contextMenuManager.setRemoveAllWhenShown(false);
contextMenuManager.add(new Action() {
public void run() {
super.run();
showSelectionDetail(parent);
}
public String getText() {
return "Details...";
}
public boolean isEnabled() {
return !fViewer.getSelection().isEmpty();
}
});
Menu contextMenu = contextMenuManager.createContextMenu(fViewer.getControl());
getControl().setMenu(contextMenu);
fViewer.setInput(fInput);
}
public void dispose() {
super.dispose();
TaglibIndex.removeTaglibIndexListener(fInternalListener);
}
Control getControl() {
return fViewer.getControl();
}
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
boolean shouldListen = memento != null && Boolean.valueOf(memento.getString(MEM_LISTENING)).booleanValue();
if (shouldListen) {
TaglibIndex.addTaglibIndexListener(fInternalListener);
isListening = true;
}
fResumeAction = new ResumeAction();
fSuspendAction = new SuspendAction();
fClearAction = new ClearAction();
fSuspendAction.setEnabled(isListening);
fResumeAction.setEnabled(!isListening);
IToolBarManager mgr = site.getActionBars().getToolBarManager();
mgr.add(fResumeAction);
mgr.add(fSuspendAction);
mgr.add(fClearAction);
}
public void saveState(IMemento memento) {
super.saveState(memento);
memento.putString(MEM_LISTENING, Boolean.toString(isListening));
}
public void setFocus() {
fViewer.getControl().setFocus();
}
}