blob: 84abe549ec13ff79f4e280ec4acf756a2170644e [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2016 CEA LIST
*
*
* 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:
* Patrick Tessier CEA LIST-implementation
*
*****************************************************************************/
package plugin2analyse;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* This class is to display a info like camembert, bar or histogramme
* <BR>
* <img src="camembert.png">
* <BR>
* <h3>How to use:</h3>
* <BR>
* <code>
* int[] pourcent = { 30, 20, 10, 40 };<BR>
* String[] labels = { "Added", "Modified", "Deleted", "Stable" };<BR>
* Device device = Display.getCurrent();<BR>
* org.eclipse.swt.graphics.Color[] colors = { device.getSystemColor(SWT.COLOR_GREEN), device.getSystemColor(SWT.COLOR_CYAN),<BR>
* device.getSystemColor(SWT.COLOR_RED), device.getSystemColor(SWT.COLOR_YELLOW) };<BR>
* SWTQualitativeInfo canva = new SWTQualitativeInfo(shell, SWT.NULL, pourcent, labels, colors, HISTOGRAMME);<BR>
* </code>
**/
public class SWTQualitativeInfo extends Canvas {
public static int DISK = 0;
public static int HISTOGRAMME = 1;
public static int BAR = 2;
public static int SPIDER = 3;
/**
*
* Constructor.
*
* @param parent
* the composite owner
* @param style
* SWT style
* @param pourcent
* list of pourcent
* @param labels
* list of label that represent pourcent
* @param colors
* list of color for each pourcent
* @param type
* type of diagram DISK, HISTOGRAMME, BAR
*/
public SWTQualitativeInfo(Composite parent, int style, int[] pourcent,
String[] labels, org.eclipse.swt.graphics.Color[] colors, int type) {
super(parent, style);
this.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
e.gc.fillRectangle(0, 0, 600, 300);
if(type == BAR) {
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
e.gc.fillRectangle(29, 29, 102, 202);
int x = 30;
int y = 30;
for(int i = 0; i < pourcent.length; i++) {
e.gc.setBackground(colors[i]);
e.gc.fillRectangle(x, y, 100, pourcent[i] * 2);
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
e.gc.setForeground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
e.gc.drawString(labels[i] + " " + pourcent[i] + "%", x + 110, y + 10);
y = y + pourcent[i] * 2;
}
} else if(type == DISK) {
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
//e.gc.fillOval(28, 28, 203, 203);
int startAngle = 0;
int arcAngle = 0;
int x = 30; // abcisse texte
int y = 240; // ordonnée texte
for(int i = 0; i < pourcent.length; i++) {
e.gc.setBackground(colors[i]);
arcAngle = (int)(pourcent[i] * 3.6);
e.gc.fillArc(30, 30, 200, 200, startAngle, arcAngle);
e.gc.fillRectangle(x, y, 10, 10);
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
e.gc.setForeground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
e.gc.drawString(labels[i] + " " + pourcent[i] + "%", x + 20, y - 2);
y = y + 20;
startAngle = startAngle + arcAngle;
}
} else if(type == SPIDER) {
Device device = Display.getCurrent();
// Cercle de centre (xDecalage+rayon, yDecalage+rayon)
//
int xDecalage = 100;
int yDecalage = 100;
int rayon = 150;
int xCentre = xDecalage + rayon;
int yCentre = yDecalage + rayon;
// Disque englobant
// e.gc.setBackground(device.getSystemColor(SWT.COLOR_CYAN));
// e.gc.fillOval(xDecalage, xDecalage, 2*rayon, 2*rayon);
// Point central
int rayonCentre = 2;
e.gc.setBackground(device.getSystemColor(SWT.COLOR_BLACK));
e.gc.fillOval(xCentre-rayonCentre, yCentre-rayonCentre, 2*rayonCentre, 2*rayonCentre);
// Cercle extérieur
// e.gc.drawArc(xDecalage, yDecalage, 2*rayon, 2*rayon, 0, 360);
// 5 Rayons
e.gc.setBackground(device.getSystemColor(SWT.COLOR_TRANSPARENT));
e.gc.drawLine(xCentre, yCentre, xCentre, yCentre-rayon);
e.gc.drawString("coverage", xCentre-30, yCentre-rayon-30);
int xVariation1 = (int) (rayon * 0.951); // sinus(72)
int yVariation1 = (int) (rayon * 0.309); // cosinus(72)
e.gc.drawLine(xCentre, yCentre, xCentre-xVariation1, yCentre-yVariation1);
e.gc.drawString("width", xCentre-xVariation1-40, yCentre-yVariation1-10);
e.gc.drawLine(xCentre, yCentre, xCentre+xVariation1, yCentre-yVariation1);
e.gc.drawString("context", xCentre+xVariation1+10, yCentre-yVariation1-10);
int xVariation2 = (int) (rayon * 0.588); // sinus(72/2)
int yVariation2 = (int) (rayon * 0.809); // cosinus(72/2)
e.gc.drawLine(xCentre, yCentre, xCentre-xVariation2, yCentre+yVariation2);
e.gc.drawString("depth", xCentre-xVariation2-20, yCentre+yVariation2+10);
e.gc.drawLine(xCentre, yCentre, xCentre+xVariation2, yCentre+yVariation2);
e.gc.drawString("step", xCentre+xVariation2-20, yCentre+yVariation2+10);
e.gc.setBackground(device.getSystemColor(SWT.COLOR_GREEN));
// Segments
draw5Segments(e, rayon / 4, xCentre, yCentre);
draw5Segments(e, rayon / 2, xCentre, yCentre);
draw5Segments(e, (rayon / 4) * 3, xCentre, yCentre);
draw5Segments(e, rayon, xCentre, yCentre);
draw5SegmentsBis(e, xCentre, yCentre, rayon,
50, 25,
90, 30,
20, 20,
56, 12,
24, 16);
} else {
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT));
e.gc.fillRectangle(35, 29, labels.length * 30, 200);
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
e.gc.fillRectangle(29, 29, 5, 2);
e.gc.fillRectangle(29, 77, 5, 2);
e.gc.fillRectangle(29, 127, 5, 2);
e.gc.fillRectangle(29, 177, 5, 2);
e.gc.fillRectangle(29, 227, 5, 2);
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
e.gc.setForeground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
e.gc.drawString("100%", 2, 19);
e.gc.drawString("75%", 2, 67);
e.gc.drawString("50%", 2, 117);
e.gc.drawString("25%", 2, 167);
e.gc.drawString("0%", 2, 217);
int x = 39;
int y = 30;
for(int i = 0; i < pourcent.length; i++) {
e.gc.setBackground(colors[i]);
e.gc.fillRectangle(x, (100 - pourcent[i]) * 2 + 29, 20, pourcent[i] * 2);
e.gc.fillRectangle(labels.length * 30 + 40, y + 10, 10, 10);
e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
e.gc.setForeground(e.gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
e.gc.drawString(labels[i] + " " + pourcent[i] + "%", labels.length * 30 + 50, y + 10);
y = y + 20;
x = x + 30;
}
}
}
});
}
public void draw5Segments(PaintEvent pe, int lg, int xCentre, int yCentre) {
int xVariation1 = (int) (lg * 0.951); // sinus(72)
int yVariation1 = (int) (lg * 0.309); // cosinus(72)
pe.gc.drawLine(xCentre, yCentre - lg, xCentre-xVariation1, yCentre-yVariation1);
pe.gc.drawLine(xCentre, yCentre - lg, xCentre+xVariation1, yCentre-yVariation1);
int xVariation2 = (int) (lg * 0.588); // sinus(72/2)
int yVariation2 = (int) (lg * 0.809); // cosinus(72/2)
pe.gc.drawLine(xCentre-xVariation1, yCentre-yVariation1, xCentre-xVariation2, yCentre+yVariation2);
pe.gc.drawLine(xCentre+xVariation1, yCentre-yVariation1, xCentre+xVariation2, yCentre+yVariation2);
pe.gc.drawLine(xCentre-xVariation2, yCentre+yVariation2, xCentre+xVariation2, yCentre+yVariation2);
}
public void draw5SegmentsBis(PaintEvent pe, int xCentre, int yCentre, int rayon,
int maxCoverage, int currentCoverage,
int maxWidth, int currentWidth,
int maxDepth, int currentDepth,
int maxStep, int currentStep,
int maxContext, int currentContext) {
int lgPoint = rayon * currentCoverage / maxCoverage;
int xP1 = xCentre;
int yP1 = yCentre - lgPoint;
lgPoint = rayon * currentWidth / maxWidth;
int xVariation = (int) (lgPoint * 0.951); // sinus(72)
int yVariation = (int) (lgPoint * 0.309); // cosinus(72)
int xP2 = xCentre-xVariation;
int yP2 = yCentre-yVariation;
lgPoint = rayon * currentDepth / maxDepth;
xVariation = (int) (lgPoint * 0.588); // sinus(72/2)
yVariation = (int) (lgPoint * 0.809); // cosinus(72/2)
int xP3 = xCentre-xVariation;
int yP3 = yCentre+yVariation;
lgPoint = rayon * currentStep / maxStep;
xVariation = (int) (lgPoint * 0.588); // sinus(72/2)
yVariation = (int) (lgPoint * 0.809); // cosinus(72/2)
int xP4 = xCentre+xVariation;
int yP4 = yCentre+yVariation;
lgPoint = rayon * currentContext / maxContext;
xVariation = (int) (lgPoint * 0.951); // sinus(72)
yVariation = (int) (lgPoint * 0.309); // cosinus(72)
int xP5 = xCentre+xVariation;
int yP5 = yCentre-yVariation;
Device device = Display.getCurrent();
pe.gc.setBackground(device.getSystemColor(SWT.COLOR_RED));
pe.gc.setForeground(device.getSystemColor(SWT.COLOR_RED));
pe.gc.setLineWidth(3);
pe.gc.drawLine(xP1, yP1, xP2, yP2);
pe.gc.drawLine(xP2, yP2, xP3, yP3);
pe.gc.drawLine(xP3, yP3, xP4, yP4);
pe.gc.drawLine(xP4, yP4, xP5, yP5);
pe.gc.drawLine(xP5, yP5, xP1, yP1);
}
public static SWTQualitativeInfo createSpider(Composite parent) {
int[] pourcent = { 30, 20, 10, 40 };
String[] labels = { "Added", "Modified", "Deleted", "Stable" };
Device device = Display.getCurrent();
org.eclipse.swt.graphics.Color[] colors = { device.getSystemColor(SWT.COLOR_GREEN),
device.getSystemColor(SWT.COLOR_CYAN),
device.getSystemColor(SWT.COLOR_RED),
device.getSystemColor(SWT.COLOR_YELLOW) };
// SWTQualitativeInfo canva = new SWTQualitativeInfo(shell, SWT.NULL, pourcent, labels, colors, DISK);
SWTQualitativeInfo canva = new SWTQualitativeInfo(parent, SWT.NULL,
pourcent, labels, colors, SPIDER);
return canva;
}
/**
* static main to execute the example
*
* @param a
*/
public static void main(String[] a) {
// Pour le lancer avec cliq droit : run as java application
final Display display = new Display();
// Pour le lancer depuis un code java
//Display.getDefault();
final Shell shell = new Shell(display);
int[] pourcent = { 30, 20, 10, 40 };
String[] labels = { "Added", "Modified", "Deleted", "Stable" };
Device device = Display.getCurrent();
org.eclipse.swt.graphics.Color[] colors = { device.getSystemColor(SWT.COLOR_GREEN),
device.getSystemColor(SWT.COLOR_CYAN),
device.getSystemColor(SWT.COLOR_RED),
device.getSystemColor(SWT.COLOR_YELLOW) };
@SuppressWarnings("unused")
// SWTQualitativeInfo canva = new SWTQualitativeInfo(shell, SWT.NULL, pourcent, labels, colors, DISK);
SWTQualitativeInfo canva = new SWTQualitativeInfo(shell, SWT.NULL, pourcent, labels, colors, SPIDER);
shell.setLayout(new FillLayout());
shell.pack();
shell.setSize(500, 500); // largeur et hauteur de la fenêtre
shell.setText("Repartition");
shell.open();
while(!shell.isDisposed()) {
if(!display.readAndDispatch())
display.sleep();
}
}
}