blob: 6731547923ba7f933f2c5b0dcfe7e214f4e80b48 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation, University of Manchester 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:
* Kentarou FUKUDA - initial API and implementation
* Eleni Michailidou - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.examples.simplevisualizer.ui.internal;
import java.io.File;
import java.util.List;
import org.eclipse.actf.examples.simplevisualizer.SimpleVisualizerPlugin;
import org.eclipse.actf.examples.simplevisualizer.vicramtest.Complexity;
import org.eclipse.actf.examples.simplevisualizer.vicramtest.Visualization;
import org.eclipse.actf.mediator.Mediator;
import org.eclipse.actf.model.ui.IModelService;
import org.eclipse.actf.model.ui.ModelServiceImageCreator;
import org.eclipse.actf.model.ui.ModelServiceSizeInfo;
import org.eclipse.actf.model.ui.editor.browser.IWebBrowserACTF;
import org.eclipse.actf.model.ui.editor.browser.IWebBrowserStyleInfo;
import org.eclipse.actf.model.ui.util.ModelServiceUtils;
import org.eclipse.actf.visualization.IVisualizationConst;
import org.eclipse.actf.visualization.eval.EvaluationResultImpl;
import org.eclipse.actf.visualization.ui.IPositionSize;
import org.eclipse.actf.visualization.ui.IVisualizationView;
import org.eclipse.actf.visualization.ui.VisualizationCanvas;
import org.eclipse.actf.visualization.util.ImageOverlayUtil;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
public class ComplexityVisualizationController implements IVisualizationConst {
private static final EvaluationResultImpl dummyResult = new EvaluationResultImpl();
private Shell shell;
private IVisualizationView vizView;
private VisualizationCanvas vizCanvas;
private AlphaValueToolbar alphaBar;
private Action overlayAction;
private Mediator mediator = Mediator.getInstance();
private boolean isInVisualize;
private EvaluationResultImpl evalResult;
private String screenshotFile, reportFile;
public ComplexityVisualizationController(IVisualizationView vizView,
Composite parent) {
this.vizView = vizView;
this.shell = parent.getShell();
initComposite(parent);
prepareActions();
isInVisualize = false;
try {
File dumpImgFile = SimpleVisualizerPlugin.getDefault()
.createTempFile(PREFIX_SCREENSHOT, SUFFIX_BMP);
screenshotFile = dumpImgFile.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
try {
File htmlFile = SimpleVisualizerPlugin.getDefault().createTempFile(
PREFIX_REPORT, SUFFIX_HTML);
reportFile = htmlFile.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
}
private void prepareActions() {
overlayAction = new Action("Complexity Visualization",
SimpleVisualizerPlugin.imageDescriptorFromPlugin(
SimpleVisualizerPlugin.PLUGIN_ID,
"/icons/action16/overlay16.gif")) {
public void run() {
doVisualize();
}
};
IActionBars bars = vizView.getViewSite().getActionBars();
// IMenuManager menuManager = bars.getMenuManager();
IToolBarManager toolbarManager = bars.getToolBarManager();
toolbarManager.add(overlayAction);
toolbarManager
.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void initComposite(Composite parent) {
GridData gridData;
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
gridLayout.marginHeight = gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
parent.setLayout(gridLayout);
alphaBar = new AlphaValueToolbar(parent, SWT.BORDER);
Composite compositeLowVisionHalf2 = new Composite(parent, SWT.NONE);
gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.verticalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
compositeLowVisionHalf2.setLayoutData(gridData);
gridLayout = new GridLayout();
gridLayout.numColumns = 1;
gridLayout.marginHeight = gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
compositeLowVisionHalf2.setLayout(gridLayout);
// Canvas to show the image.
this.vizCanvas = new VisualizationCanvas(compositeLowVisionHalf2);
gridData = new GridData();
gridData.horizontalSpan = 1;
gridData.horizontalAlignment = GridData.FILL;
gridData.verticalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
this.vizCanvas.setLayoutData(gridData);
}
public void doVisualize() {
if (isInVisualize) {
return;
}
isInVisualize = true;
shell.setCursor(new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT));
// remove results
mediator.setReport(vizView, dummyResult);
evalResult = new EvaluationResultImpl();
vizCanvas.clear();
shell.getDisplay().update();
vizView.setStatusMessage("Capturing screenshot.");
// obtain active Model Service (browser, etc.)
IModelService modelService = ModelServiceUtils.getActiveModelService();
if (modelService == null) {
return;
}
// generate screenshot and read it as Image
ModelServiceImageCreator imgCreator = new ModelServiceImageCreator(
modelService);
imgCreator.getScreenImageAsBMP(screenshotFile, true);
Image baseImage = new Image(shell.getDisplay(), screenshotFile);
vizView.setStatusMessage("Processing overlay.");
// prepare overlay image data (rainbow)
Rectangle size = baseImage.getBounds();
int[][] overlayPixels = new int[size.height][size.width];
int xMax = size.width;
int yMax = size.height;
for (int y = 0; y < yMax; y++) {
for (int x = 0; x < xMax; x++) {
overlayPixels[y][x] = 0xC0C0C0;
}
}
// EM - Call Visualization Code
//
// overlaypixels = Visualization.findElements(overlaypixels);
overlayPixels = Visualization.findElements(overlayPixels, size, true);
ImageOverlayUtil.overlay(baseImage, overlayPixels, alphaBar.getAlpha());
// set image to canvas
vizCanvas.showImage(baseImage.getImageData(), modelService);
if (modelService instanceof IWebBrowserACTF) {
IWebBrowserACTF browser = (IWebBrowserACTF) modelService;
vizView.setStatusMessage("Getting styleInfo from Live DOM.");
IWebBrowserStyleInfo style = browser.getStyleInfo();
ModelServiceSizeInfo sizeInfo = style.getSizeInfo(true);
StringBuffer tmpSB = new StringBuffer(4096);
// EM - Call calculate method
tmpSB.append(Complexity.calculate());
tmpSB.append(Visualization.gridDescription);
// tmpSB.append(Complexity.getTotalWords());
// tmpSB.append("Web page size: [" + sizeInfo.toString() + "]"
// + FileUtils.LINE_SEP + FileUtils.LINE_SEP);
// set styleInfo as a summary report
evalResult.setSummaryReportText(tmpSB.toString());
// set summary of the page as a report
evalResult.setSummaryReportUrl(reportFile);
}
Mediator.getInstance().setReport(vizView, evalResult);
vizView.setStatusMessage("Visualization is over.");
shell.setCursor(null);
isInVisualize = false;
}
public void setHighlightPositions(List<IPositionSize> infoPositionSizeList) {
vizCanvas.highlight(infoPositionSizeList);
}
public void setCurrentModelService(IModelService modelService) {
vizCanvas.setCurrentModelService(modelService);
}
}