簡易にグラフのメモリーを描くクラス

xucker2005-04-27

簡易にグラフのメモリーを描くSWTのクラスを作ってみました。
以外と面倒でした。

■TestGraph.java
/*
* Created on 2003/05/24
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package test;



import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import org.jpn.xucker.rcp.ui.SimpleGraphMemoryPainter;

/**
* @author ak
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class TestGraph extends Canvas implements PaintListener{

public static void main(String args) {
Display display=new Display();
Shell shell=new Shell(display);
shell.setText("title");
shell.setBounds(0,0,458,458+26);

TestGraph canvas=new TestGraph(shell);
canvas.addPaintListener(canvas);

canvas.setBounds(shell.getClientArea());

shell.open();

while(!shell.isDisposed()){
if (!display.readAndDispatch ()){
display.sleep ();
}
}
display.dispose();
}

public TestGraph(Composite composite){
super(composite,0);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
*/
public void paintControl(PaintEvent e) {
SimpleGraphMemoryPainter painter=new SimpleGraphMemoryPainter();
painter.setMainLabel(new String{"","100","200","300","400"});

painter.setGraphPlus(true);
painter.draw(e.gc,50,this.getClientArea().height-50,this.getClientArea().width-50);
painter.setGridPlus(true);
painter.draw(e.gc,50,this.getClientArea().height-50,this.getClientArea().width-50);

painter.setGridPlus(false);
painter.setGraphPlus(false);
painter.draw(e.gc,this.getClientArea().width-50,50,this.getClientArea().width-50);

painter.setGridPlus(true);
painter.draw(e.gc,this.getClientArea().width-50,50,this.getClientArea().width-50);


//TOP LEFT
painter.setGridPlus(false);
painter.setGraphPlus(true);
painter.setVerticalGraph(true);
painter.draw(e.gc,50,50,this.getClientArea().height-50);


//BOTTOM LEFT
painter.setGraphPlus(false);
painter.setVerticalGraph(true);
painter.draw(e.gc,this.getClientArea().width-50,this.getClientArea().height-50,this.getClientArea().height-50);


// TOP LEFT
painter.setGraphPlus(true);
painter.setVerticalGraph(true);
painter.setGridPlus(true);
painter.draw(e.gc,50,50,this.getClientArea().height-50);


//BOTTOM LEFT
painter.setGraphPlus(false);
painter.setVerticalGraph(true);
painter.setGridPlus(true);
painter.draw(e.gc,this.getClientArea().width-50,this.getClientArea().height-50,this.getClientArea().height-50);

}
}
■SimpleGraphMemory.java
/*
* Created on 2005/04/26
* Author aki@www.xucker.jpn.org
* License Apache2.0 or Common Public License
*/
package org.jpn.xucker.rcp.ui;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;

/**
*
*
*/
public class SimpleGraphMemoryPainter {
private boolean vGraph;
private boolean graphPlus;
private int mainGridPixel=8;
private int subGridPixel=4;
private int subSubGridPixel=2;
private boolean gridPlus;
public boolean isDrawLine() {
return drawLine;
}
public void setDrawLine(boolean drawLine) {
this.drawLine = drawLine;
}
public boolean isGraphPlus() {
return graphPlus;
}
public void setGraphPlus(boolean graphPlus) {
this.graphPlus = graphPlus;
}
public boolean isGridPlus() {
return gridPlus;
}
public void setGridPlus(boolean gridPlus) {
this.gridPlus = gridPlus;
}

public Color getLineColor() {
return lineColor;
}
public void setLineColor(Color lineColor) {
this.lineColor = lineColor;
}
public int getMainGridPixel() {
return mainGridPixel;
}
public void setMainGridPixel(int mainGridPixel) {
this.mainGridPixel = mainGridPixel;
}
public String getMainLabel() {
return mainLabel;
}
public void setMainLabel(String
mainLabel) {
this.mainLabel = mainLabel;
}
public int getMarginGrid() {
return marginGrid;
}
public void setMarginGrid(int marginGrid) {
this.marginGrid = marginGrid;
}
public int getPerMain() {
return perMain;
}
public void setPerMain(int perMain) {
this.perMain = perMain;
}
public int getSplitSub() {
return splitSub;
}
public void setSplitSub(int splitSub) {
this.splitSub = splitSub;
}
public int getSplitSubSub() {
return splitSubSub;
}
public void setSplitSubSub(int splitSubSub) {
this.splitSubSub = splitSubSub;
}
public int getSubGridPixel() {
return subGridPixel;
}
public void setSubGridPixel(int subGridPixel) {
this.subGridPixel = subGridPixel;
}
public int getSubSubGridPixel() {
return subSubGridPixel;
}
public void setSubSubGridPixel(int subSubGridPixel) {
this.subSubGridPixel = subSubGridPixel;
}
public Color getTextColor() {
return textColor;
}
public void setTextColor(Color textColor) {
this.textColor = textColor;
}
public boolean isVerticalGraph() {
return vGraph;
}
public void setVerticalGraph(boolean graph) {
vGraph = graph;
}
private String mainLabel[];
private boolean drawLine;

private Color lineColor=new Color(null,0,0,0);
private Color textColor=new Color(null,0,0,0);
private int perMain=100;
private int splitSub=2;
private int splitSubSub=5;
private int marginGrid=2;



public void draw(GC gc,int drawX,int drawY,int length){
if(vGraph){
drawVerticalGraph(gc,drawX,drawY,length);
}else{
drawHorizontalGraph(gc,drawX,drawY,length);
}
}

public void drawVerticalGraph(GC gc,int drawX,int drawY,int length){
//draw Line;
gc.setForeground(lineColor);

if(graphPlus){
gc.drawLine(drawX,drawY,drawX,drawY+length);

}else{
gc.drawLine(drawX,drawY,drawX,drawY-length);

}


int duration=1;
if(!gridPlus){
duration=-1;
}

int current=drawY;
if(graphPlus){
int index=0;
while(currentdrawY-length){
//Draw Main memory
gc.drawLine(drawX,current,drawX+duration*mainGridPixel,current);
int subPer=perMain/splitSub;
int subSubPer=subPer/splitSubSub;
//Draw Sub memory
for(int i=0;idrawX-length){
//Draw Main memory
gc.drawLine(current,drawY,current,drawY+duration*mainGridPixel);
int subPer=perMain/splitSub;
int subSubPer=subPer/splitSubSub;
//Draw Sub memory
for(int i=0;i0){
Point extent=gc.stringExtent(label);
int half_height=extent.y/2;

if(gridPlus){
gc.drawString(label,x+mainGridPixel+marginGrid,y-half_height);
}else{
gc.drawString(label,x-mainGridPixel-marginGrid-extent.x,y-half_height);
}
}
}

private void drawLabelHorizontal(GC gc,int x,int y,String label){
if(label.length()>0){
Point extent=gc.stringExtent(label);
int half_width=extent.x/2;

if(gridPlus){
gc.drawString(label,x-half_width,y+mainGridPixel+marginGrid);
}else{
gc.drawString(label,x-half_width,y-mainGridPixel-marginGrid-extent.y);
}
}
}

/**
* @param index
* @return
*/
private String labelAt(int index) {
if(mainLabel!=null){
if(index