| /******************************************************************************* |
| * 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(); |
| } |
| } |