/*******************************************************************************
* Copyright (c) 2010 Sven Kiera
* 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
*******************************************************************************/
package org.phpsrc.eclipse.pti.tools.phpdepend.ui.views;
import java.util.ArrayList;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.UIJob;
import org.phpsrc.eclipse.pti.core.PHPToolCorePlugin;
import org.phpsrc.eclipse.pti.tools.phpdepend.PHPDependPlugin;
import org.phpsrc.eclipse.pti.tools.phpdepend.core.model.IMetricElement;
import org.phpsrc.eclipse.pti.tools.phpdepend.core.model.MetricResult;
import org.phpsrc.eclipse.pti.tools.phpdepend.core.model.MetricRunSession;
import org.phpsrc.eclipse.pti.tools.phpdepend.ui.views.metricrunner.MetricRunnerViewPart;
import org.phpsrc.eclipse.pti.ui.Logger;
import org.phpsrc.eclipse.pti.ui.images.OverlayImageIcon;
/**
* @deprecated Use {@link MetricRunnerViewPart}
*/
public class PHPDependSummaryView extends ViewPart {
public static final String VIEW_ID = "org.phpsrc.eclipse.pti.tools.phpdepend.ui.views.summary";
private static final String ELEMENT_DATA_KEY = "element";
protected Tree tree;
protected Table table;
protected ArrayList<MetricRunSession> summaries = new ArrayList<MetricRunSession>();
protected int showIndex = -1;
protected static final class ElementDecorator implements IMetricElement {
protected static final ImageRegistry imageRegistry = new ImageRegistry();
protected final IMetricElement element;
protected ElementDecorator(IMetricElement element) {
this.element = element;
}
public Image getImage() {
String key = element.getClass().getName();
if (element.hasErrors())
key += "#error";
else if (element.hasWarnings())
key += "#warning";
Image img = imageRegistry.get(key);
if (img == null) {
if (element.hasErrors())
img = new OverlayImageIcon(element.getImage(), PHPToolCorePlugin.getDefault().getImageRegistry()
.get(PHPToolCorePlugin.IMG_OVERLAY_ERROR), OverlayImageIcon.POS_BOTTOM_LEFT).getImage();
else if (element.hasWarnings())
img = new OverlayImageIcon(element.getImage(), PHPToolCorePlugin.getDefault().getImageRegistry()
.get(PHPToolCorePlugin.IMG_OVERLAY_WARNING), OverlayImageIcon.POS_BOTTOM_LEFT).getImage();
else
img = element.getImage();
imageRegistry.put(key, img);
}
return img;
}
public String getName() {
return element.getName();
}
public IMetricElement getParent() {
return element.getParent();
}
public IResource getResource() {
return element.getResource();
}
public MetricResult[] getResults() {
return element.getResults();
}
public IMetricElement[] getChildren() {
return element.getChildren();
}
public boolean hasErrors() {
return element.hasErrors();
}
public boolean hasWarnings() {
return element.hasWarnings();
}
public IMarker getFileMarker() {
return element.getFileMarker();
}
public int getLevel() {
return 0;
}
public org.phpsrc.eclipse.pti.tools.phpdepend.core.model.IMetricElement.Status getStatus() {
return null;
}
public boolean hasChildren() {
return false;
}
}
public void createPartControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
comp.setLayout(layout);
tree = new Tree(comp, SWT.VIRTUAL | SWT.BORDER | SWT.FULL_SELECTION);
tree.setHeaderVisible(false);
tree.setLinesVisible(false);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
tree.setLayoutData(data);
TreeColumn element = new TreeColumn(tree, SWT.LEFT);
element.setText("Element");
element.setWidth(400);
TreeColumn infos = new TreeColumn(tree, SWT.LEFT);
infos.setText("Metrics");
infos.setWidth(400);
// final Menu treeMenu = new Menu(tree);
// MenuItem item = new MenuItem(treeMenu, SWT.PUSH);
// item.setText("open resource");
tree.addListener(SWT.SetData, new Listener() {
public void handleEvent(Event event) {
TreeItem item = (TreeItem) event.item;
TreeItem parentItem = item.getParentItem();
IMetricElement element = null;
if (parentItem == null) {
element = summaries.get(showIndex);
} else {
IMetricElement parentElement = (IMetricElement) parentItem.getData(ELEMENT_DATA_KEY);
IMetricElement[] members = parentElement.getChildren();
element = members[parentItem.indexOf(item)];
}
ElementDecorator decorator = new ElementDecorator(element);
StringBuffer m = new StringBuffer();
for (MetricResult r : decorator.getResults()) {
if (m.length() > 0)
m.append(", ");
m.append(r.id + ": " + r.value);
}
item.setData(ELEMENT_DATA_KEY, decorator);
item.setText(new String[] { decorator.getName(), m.toString() });
item.setImage(decorator.getImage());
int length = decorator.getChildren().length;
item.setItemCount(length);
for (TreeColumn c : tree.getColumns()) {
c.pack();
}
}
});
tree.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
}
public void mouseDoubleClick(MouseEvent e) {
if (e.button == 1 && e.count == 2) {
Tree t = (Tree) e.widget;
TreeItem[] items = t.getSelection();
if (items.length > 0) {
IMetricElement element = (IMetricElement) items[0].getData(ELEMENT_DATA_KEY);
if (element != null) {
IMarker m = element.getFileMarker();
if (m != null) {
try {
IDE.openEditor(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), m);
} catch (PartInitException e1) {
Logger.logException(e1);
}
try {
m.delete();
} catch (CoreException e1) {
Logger.logException(e1);
}
}
}
}
}
}
});
tree.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
TreeItem select = (TreeItem) e.item;
table.removeAll();
IMetricElement element = (IMetricElement) select.getData(ELEMENT_DATA_KEY);
if (element != null) {
for (MetricResult result : element.getResults()) {
TableItem item = new TableItem(table, SWT.NULL);
String name = "";
Image img = null;
if (result.metric != null) {
name = result.metric.name;
if (result.hasError()) {
img = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_ERROR_TSK);
item.setForeground(new Color(item.getDisplay(), 255, 0, 0));
} else if (result.hasWarning()) {
img = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_WARN_TSK);
}
}
item.setText(new String[] { name, result.id, "" + result.value });
item.setImage(img);
}
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
table = new Table(comp, SWT.BORDER | SWT.V_SCROLL);
table.setHeaderVisible(true);
table.setLinesVisible(true);
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
data.grabExcessVerticalSpace = true;
data.minimumWidth = 320;
table.setLayoutData(data);
TableColumn names = new TableColumn(table, SWT.NONE);
names.setText("Name");
names.setWidth(200);
TableColumn ids = new TableColumn(table, SWT.NONE);
ids.setText("Id");
ids.setWidth(50);
TableColumn values = new TableColumn(table, SWT.NONE);
values.setText("Value");
values.setWidth(70);
createToolbar();
}
private void createToolbar() {
IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
Action history = new Action("History", Action.AS_DROP_DOWN_MENU) {
public void runWithEvent(Event e) {
IMenuCreator mc = getMenuCreator();
if (mc != null) {
ToolItem ti = (ToolItem) e.widget;
Menu m = mc.getMenu(ti.getParent());
if (m != null) {
Point point = ti.getParent().toDisplay(new Point(e.x, e.y + ti.getBounds().height));
m.setLocation(point.x, point.y);
m.setVisible(true);
}
}
}
};
history.setImageDescriptor(PHPDependPlugin.getDefault().getImageRegistry().getDescriptor(
PHPDependPlugin.IMG_PHP_DEPEND));
history.setMenuCreator(new IMenuCreator() {
private Menu listMenu;
public Menu getMenu(Menu parent) {
return null;
}
public Menu getMenu(Control parent) {
if (listMenu != null)
listMenu.dispose();
listMenu = new Menu(parent);
int length = summaries.size();
if (length == 0) {
MenuItem m = new MenuItem(listMenu, SWT.CHECK);
m.setText("Empty");
m.setEnabled(false);
} else {
for (int i = length - 1; i >= 0; i--) {
MetricRunSession s = summaries.get(i);
MenuItem m = new MenuItem(listMenu, SWT.CHECK);
m.setText(s.getGenerated().toString());
m.setSelection(i == showIndex);
m.setEnabled(i != showIndex);
m.setData("index", new Integer(i));
m.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
MenuItem item = (MenuItem) e.getSource();
Integer index = (Integer) item.getData("index");
showIndex = index.intValue();
tree.removeAll();
tree.setItemCount(1);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
new MenuItem(listMenu, SWT.SEPARATOR);
MenuItem m = new MenuItem(listMenu, SWT.PUSH);
m.setText("Clear History");
m.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
tree.removeAll();
table.removeAll();
showIndex = -1;
int size = summaries.size();
for (int i = size - 1; i >= 0; i--) {
summaries.remove(i);
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
return listMenu;
}
public void dispose() {
if (listMenu != null)
listMenu.dispose();
}
});
mgr.add(new ActionContributionItem(history));
}
public void setFocus() {
tree.setFocus();
}
public static void showSummary(final MetricRunSession summary) {
Assert.isNotNull(summary);
UIJob uijob = new UIJob("Update View") {
public IStatus runInUIThread(IProgressMonitor monitor) {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
PHPDependSummaryView view = (PHPDependSummaryView) page.findView(VIEW_ID);
if (view == null) {
try {
view = (PHPDependSummaryView) page.showView(VIEW_ID);
} catch (PartInitException e) {
e.printStackTrace();
}
} else {
page.bringToTop(view);
}
if (view != null) {
view.summaries.add(summary);
view.showIndex = view.summaries.size() - 1;
if (view.tree.getItemCount() > 0)
view.tree.removeAll();
view.tree.setItemCount(1);
}
}
}
return Status.OK_STATUS;
}
};
uijob.schedule();
}
}