import java.awt.*;
import java.awt.event.*;
import java.math.*;
class CStream
{
private String mStream;
private String mSep;
private int mWordCount;
private String mWord[];
private void UpdateStream(String Stream)
{
int iIndex,iTemp,i;
mStream=Stream;
iIndex=0;
iTemp=0;
do
{
iIndex=mStream.indexOf(mSep,iIndex)+1;
iTemp++;
}while (iIndex!=0);
mWordCount=iTemp-1;
if(mWordCount>0)
{
mWord=new String[mWordCount];
iIndex=0;
for(i=0;i<mWordCount;i++)
{
iTemp=iIndex;
iIndex=mStream.indexOf(mSep,iTemp)+1;
mWord[i]=mStream.substring(iTemp,iIndex-1);
}
}
}
public CStream()
{
mSep=",";
UpdateStream("");
}
public CStream(String Stream)
{
mSep=",";
UpdateStream(Stream);
}
public CStream(String Stream,String Sep)
{
mSep=Sep;
UpdateStream(Stream);
}
public void SetStream(String Stream)
{
UpdateStream(Stream);
}
public void SetStream(String Stream,String Sep)
{
mSep=Sep;
UpdateStream(Stream);
}
public String GetStream()
{
return mStream;
}
public int WordCount()
{
return mWordCount;
}
public String GetWord(int Index)
{
if(Index<mWordCount)
{
return mWord[Index];
}
else
{
return null;
}
}
public void SetWord(int Index,String Word)
{
if(Index<mWordCount) mWord[Index]=Word;
mStream="";
for(int i=0;i<mWordCount;i++)
mStream=mStream+mWord[i]+mSep;
}
public String Format()
{
if(mWordCount<=0) return null;
CNumber CN=new CNumber();
String sOut="";
int iIndex=1;
for (int i=0;i<mWord[0].length();i++)
{
String sKey=mWord[0].substring(i,i+1);
if(sKey.compareTo("//")==0)
{
i++;
char Ch=mWord[0].charAt(i);
sKey="";
switch(Ch)
{
case 'n': //回车
sKey="/n";break;
case '//': //回车
sKey="//";break;
case 'c': //逗号
sKey=","; break;
default:
if(iIndex<mWordCount)
{
sKey=mWord[iIndex];
if(sKey.length()!=0)
{
switch(Ch)
{
case 's': //字符串
break;
case 'i': //整型
case 'l': //长整型
CN.SetExp(sKey);
sKey=Integer.toString((int)CN.GetValue());
break;
case 'f': //浮点型
case 'd': //双精度浮点型
CN.SetExp(sKey);
sKey=Double.toString(CN.GetValue());
break;
}
}
iIndex++;
}
}
}
sOut=sOut+sKey;
}
return sOut;
}
}
class CNumber
{
private String Expression;
private double Value;
private void SetExpression(String Exp)
{
int Operator;
String Ch;
Expression=Exp;
Value=0;
Operator=0;
for(int i=0;i<Expression.length();i++)
{
Ch=Expression.substring(i,i+1);
if(Ch.compareTo("+")==0){Operator=0;}
if(Ch.compareTo("-")==0){Operator=1;}
if(Ch.compareTo("*")==0){Operator=2;}
if(Ch.compareTo("/")==0){Operator=3;}
if(Ch.compareTo("%")==0){Operator=4;}
if((Ch.compareTo("E")==0)||(Ch.compareTo(".")==0)||(Ch.compareTo("0")>=0&&Ch.compareTo("9")<=0))
{
int k=i;
do
{
k++;
if(k>=Expression.length()) break;
Ch=Expression.substring(k,k+1);
} while((Ch.compareTo("E")==0)||(Ch.compareTo(".")==0)||(Ch.compareTo("0")>=0&&Ch.compareTo("9")<=0));
double dblTemp=Double.valueOf(Expression.substring(i,k)).doubleValue();
if(Operator==0) Value+=dblTemp;
if(Operator==1) Value-=dblTemp;
if(Operator==2) Value*=dblTemp;
if(Operator==3) Value/=dblTemp;
if(Operator==4) Value%=dblTemp;
i=k-1;
}
}
}
CNumber()
{
SetExpression("");
}
CNumber(String Exp)
{
SetExpression(Exp);
}
public void SetExp(String Exp)
{
SetExpression(Exp);
}
public String GetExp()
{
return Expression;
}
public double GetValue()
{
return Value;
}
}
class CPoint
{
public double x;
public double y;
CPoint()
{
x=0;
y=0;
}
CPoint(double dblx,double dbly)
{
x=dblx;
y=dbly;
}
}
class CMessage
{
public Font font;
public Color color;
public String message;
}
class CAxis
{
public boolean Visible;
public double Inc;
public Color color;
public double Rate;
public double Begin;
public boolean Label;
public CMessage Unit;
}
class CCurve
{
public boolean Visible;
public CPoint p[];
public int pnum;
public Color color;
public String CutLine;
//(二分查找算法)
public int GetIndexByDichotomy(double Value)
{
int TBegin,TCurrent,Tend;
double dd;
TBegin = 0;
Tend = pnum-1;
TCurrent = (int)Math.round((TBegin + Tend + 1) / 2-0.5);
dd = (p[1].x - p[0].x) / 2;
while((TCurrent!=TBegin)&&(TCurrent!=Tend))
{
if (Math.abs(Value-p[TCurrent].x)<=dd) return TCurrent;
if (Value<p[TCurrent].x) Tend = TCurrent;
if (Value>p[TCurrent].x) TBegin = TCurrent;
TCurrent = (int)Math.round((TBegin + Tend + 1) / 2-0.5);
}
if(Math.abs(Value - p[TBegin].x) < dd) return TBegin;
if(Math.abs(Value - p[Tend].x) < dd) return Tend;
return -1;
}
}
public class Curve extends java.applet.Applet
{
public double CURVE_INVAILD_YAXIS=-99999999;
public Image ImgBuffer;
public Graphics GC;
public Image ImgSave;
public Graphics GS;
public boolean bHasDrawed;
public int pTop,pLeft,pWidth,pHeight;
public double cFirst,cLast,cMax,cMin;
public int ChartType; //图表类型
public CMessage Title; //标题
public Color BackColor; //背景色
public Color PlotColor; //绘图区背景色
public CAxis AX,AY; //横轴和纵轴
public int cWidth,cHeight; //长宽
public CCurve C[]; //序列
public int CNum; //序列数
public boolean bCutLine; //图例
public Font CutLineFont; //图例字体
public boolean bZeroFlag; //包含零轴
public CMessage Expression;
public Color ExpColor;
public Point ExpRange;
public CStream XLabel; //X轴
public int ExpMessageNum; //辅助标签数
public CStream ExpMessage[]; //辅助标签
public Color ToColor(String Param)
{
int r=0,g=0,b=0;
CStream C=new CStream(Param,",");
if(C.WordCount()>=3)
{
r=Integer.valueOf(C.GetWord(0)).intValue();
g=Integer.valueOf(C.GetWord(1)).intValue();
b=Integer.valueOf(C.GetWord(2)).intValue();
}
return new Color(r,g,b);
}
public Point ToPoint(String Param)
{
int x=0,y=0;
CStream C=new CStream(Param,",");
if(C.WordCount()>=2)
{
x=Integer.valueOf(C.GetWord(0)).intValue();
y=Integer.valueOf(C.GetWord(1)).intValue();
}
return new Point(x,y);
}
public Rectangle ToRectangle(String Param)
{
int x=0,y=0,width=0,height=0;
CStream C=new CStream(Param,",");
if(C.WordCount()>=4)
{
x=Integer.valueOf(C.GetWord(0)).intValue();
y=Integer.valueOf(C.GetWord(1)).intValue();
width=Integer.valueOf(C.GetWord(2)).intValue();
height=Integer.valueOf(C.GetWord(3)).intValue();
}
return new Rectangle(x,y,width,height);
}
public Font ToFont(String Param)
{
String Name="宋体";
int iStyle=0,iSize=9;
CStream C=new CStream(Param,",");
if(C.WordCount()>=3)
{
Name=C.GetWord(0);
if(ToBoolean(C.GetWord(1))) iStyle=Font.BOLD;
iSize=Integer.valueOf(C.GetWord(2)).intValue();
}
return new Font(Name,iStyle,iSize);
}
public boolean ToBoolean(String sValue)
{
boolean b=false;
try
{
b=Integer.valueOf(sValue).intValue()==0?false:true;
}catch(Exception e){};
return b;
}
public boolean ToBoolean(int iValue)
{
return iValue==0?false:true;
}
public int ToInt(long lValue)
{
Long LTemp;
LTemp=new Long(lValue);
return LTemp.intValue();
}
public int ToInt(double dblValue)
{
Double dblTemp;
dblTemp=new Double(dblValue);
return dblTemp.intValue();
}
public int ToInt(String sValue)
{
return Integer.valueOf(sValue).intValue();
}
public double ToDouble(String sValue)
{
double dblTemp=0;
try
{
dblTemp=Double.valueOf(sValue).doubleValue();
}catch(Exception e){};
return dblTemp;
}
public int GetInt(double dblValue,int k)
{
double dblTemp1,dblTemp2;
double dblTemp=0;
int i;
dblTemp1 = Math.pow(10,k-1);
dblTemp2 = Math.pow(10,k);
i = 0;
if((dblValue!=0)&&(k>=1))
{
dblTemp = Math.abs(dblValue);
while((dblTemp<=dblTemp1)||(dblTemp>dblTemp2))
{
if(dblTemp <= dblTemp1)
{
dblTemp = dblTemp * 10;
i = i - 1;
}
else
{
dblTemp = dblTemp / 10;
i = i + 1;
}
}
}
dblTemp = (dblValue<0?-1:1) * dblTemp;
return i;
}
private String GetParam(String Name,String Fault)
{
String Param=null;
try{
Param=getParameter(Name);
}catch(Exception e){}
if(Param==null) Param=Fault;
return Param;
}
private int SetMax()
{
double d;
long z,i;
i = 0;
d = Math.abs(cMax);
while( d <= 10 || d > 100)
{
if(d <= 10)
{
d = d * 10;
i = i - 1;
}
else
{
d = d / 10;
i = i + 1;
}
}
if(d>50)
{
z = 10;
}
else if(d>20)
{
z=5;
}
else
{
z = 2;
}
cMax = cMax / Math.pow(10,i);
cMax = cMax / z;
cMax = -Math.round(-cMax-0.5);
cMax = cMax * z;
cMax = -Math.round(-cMax-0.5);
cMax = cMax / Math.pow(10,-i);
d = cMax / (z * Math.pow(10,i));
return ToInt(-Math.round(-d-0.5));
}
private int SetMaxMin()
{
int dd;
double vMax,vMin,d;
vMax=cMax;
vMin=cMin;
if(vMax<vMin)
{
d = vMax;
vMax = vMin;
vMin = d;
}
if(vMin > 0) vMin = 0;
if(vMax < 0) vMax = 0;
if((vMin == 0) && (vMax == 0)) vMax = 1;
if(vMax>0)
{
cMax = vMax;
SetMax();
vMax = cMax;
}
if(vMin<0)
{
cMax = -vMin;
SetMax();
vMin = -cMax;
}
cMax = vMax - vMin;
dd = SetMax();
d = cMax / dd;
cMax += vMin;
cMin = vMin;
dd = 0;
vMax = 0;
while(vMax < cMax)
{
vMax += d;
dd++;
}
vMin = 0;
while(vMin > cMin)
{
vMin -= d;
dd++;
}
cMax=vMax;
cMin=vMin;
return dd;
}
private void SetPlot()
{
pLeft=50;
pTop=50;
pWidth=cWidth-100;
pHeight=cHeight-100;
CStream CS=new CStream(GetParam("Plot","0,"));
if((CS.WordCount()>=5)&&(ToBoolean(CS.GetWord(0))))
{
pLeft=Integer.valueOf(CS.GetWord(1)).intValue();
pTop=Integer.valueOf(CS.GetWord(2)).intValue();
pWidth=Integer.valueOf(CS.GetWord(3)).intValue();
pHeight=Integer.valueOf(CS.GetWord(4)).intValue();
}
}
private boolean GetCurveData()
{
int i,j,k;
CStream CS=new CStream();
CNumber CN=new CNumber();
Expression=new CMessage();
Expression.message=GetParam("Expression",null);
Expression.font=ToFont(GetParam("ExpFont","宋体,0,12,"));
Expression.color=ToColor(GetParam("ExpFontColor","0,0,0,"));
ExpColor=ToColor(GetParam("ExpBackColor","0,0,0,"));
BackColor=ToColor(GetParam("BackColor","255,255,255,"));
PlotColor=ToColor(GetParam("PlotColor","255,255,255,"));
bCutLine=ToBoolean(GetParam("CutLine","0"));
CutLineFont=ToFont(GetParam("CutLineFont","宋体,0,12,"));
bZeroFlag=ToBoolean(GetParam("ZeroFlag","1"));
Title=new CMessage();
Title.color=ToColor(GetParam("TitleColor","0,0,0,"));
Title.font=ToFont(GetParam("TitleFont","宋体,0,12,"));
Title.message=GetParam("TitleMsg",null);
AX=new CAxis();
AX.Visible = ToBoolean(GetParam("VisibleXY","1"));
AX.color=ToColor(GetParam("ColorXY","0,0,0,"));
CN.SetExp(GetParam("IncX","1"));
AX.Inc =CN.GetValue();
CN.SetExp(GetParam("RateX","1"));
AX.Rate=CN.GetValue();
AX.Begin = ToDouble(GetParam("BeginX","0"));
AX.Label = ToBoolean(Integer.valueOf(GetParam("LabelX","1")).intValue());
AX.Unit = new CMessage();
AX.Unit.message = GetParam("UnitX",null);
AX.Unit.font = ToFont(GetParam("FontX","宋体,0,12,"));
AX.Unit.color = AX.color;
XLabel=new CStream(GetParam("XLabel",""));
i=0;
while(GetParam("ExpMessage"+Integer.toString(++i),null)!=null);
ExpMessageNum=i;
if(i>0) ExpMessage=new CStream[ExpMessageNum];
for(i=0;i<ExpMessageNum;i++)
{
ExpMessage[i]=new CStream(GetParam("ExpMessage"+Integer.toString(i),""));
}
AY=new CAxis();
AY.Visible = ToBoolean(GetParam("VisibleXY","1"));
AY.color=ToColor(GetParam("ColorXY","0,0,0,"));
CN.SetExp(GetParam("IncY","1"));
AY.Inc =CN.GetValue();
CN.SetExp(GetParam("RateY","1"));
AY.Rate=CN.GetValue();
AY.Begin = ToDouble(GetParam("BeginY","0"));
AY.Label = ToBoolean(GetParam("LabelY","1"));
AY.Unit = new CMessage();
AY.Unit.message = GetParam("UnitY",null);
AY.Unit.font = ToFont(GetParam("FontY","宋体,0,12,"));
AY.Unit.color = AY.color;
i=0;
while(GetParam("Visible"+Integer.toString(++i),null)!=null);
CNum=i;
if(i>0) C=new CCurve[CNum];
for(i=0;i<CNum;i++)
{
C[i]=new CCurve();
C[i].Visible=ToBoolean(GetParam("Visible"+Integer.toString(i),"0"));
C[i].color=ToColor(GetParam("lCol"+Long.toString(i),"0,0,0,"));
C[i].CutLine=GetParam("CutLine"+Long.toString(i),null);
CS.SetStream(GetParam("Data"+Integer.toString(i),null),";");
C[i].pnum=CS.WordCount();
if(C[i].pnum>0) C[i].p=new CPoint[C[i].pnum];
for(j=0;j<C[i].pnum;j++)
{
C[i].p[j]=new CPoint();
k=CS.GetWord(j).indexOf(",");
C[i].p[j].x=ToDouble(CS.GetWord(j).substring(0,k));
C[i].p[j].y=ToDouble(CS.GetWord(j).substring(k+1));
}
}
cFirst=ToDouble(GetParam("First","0"));
cLast=ToDouble(GetParam("Last","5"));
SetPlot();
return true;
}
private int xToClient(double x)
{
double dblx;
dblx = pWidth / (cLast - cFirst);
return ToInt(Math.round((x - cFirst) * dblx + pLeft));
}
private int yToClient(double y)
{
double dbly;
dbly = pHeight / (cMax - cMin);
return ToInt(Math.round((cMax-y) * dbly + pTop));
}
private double clientToX(int x)
{
double dblx;
dblx = (cLast - cFirst) / pWidth;
return (x-pLeft)*dblx+cFirst;
}
private double clientToY(int y)
{
double dbly;
dbly = (cMax - cMin) / pHeight;
return cMax-(y-pTop)*dbly;
}
public void DrawCurve()
{
boolean bMax=false,bMin=false,bInvaild;
double PlotHeight,PlotWidth;
double xPosition=0,yPosition=0;
int xPlotCount,yPlotCount;
int i,j;
double dblTemp;
String sTemp;
GC.setColor(BackColor);
GC.fillRect(0,0,cWidth,cHeight);
GC.setColor(PlotColor);
GC.fillRect(pLeft,pTop,pWidth,pHeight);
for(i=0;i<CNum;i++)
{
if(C[i].Visible)
for(j=0;j<C[i].pnum;j++)
{
if(C[i].p[j].y != CURVE_INVAILD_YAXIS)
{
if(bMax)
{
if(cMax < C[i].p[j].y) cMax = C[i].p[j].y;
}
else
{
bMax=true;
cMax=C[i].p[j].y;
}
if(bMin)
{
if(cMin > C[i].p[j].y) cMin = C[i].p[j].y;
}
else
{
bMin = true;
cMin = C[i].p[j].y;
}
}
}
}
yPlotCount=SetMaxMin();
PlotHeight=(cMax-cMin)/yPlotCount;
xPlotCount=ToInt((cLast-cFirst)/AX.Inc);
PlotWidth=AX.Inc;
GC.setColor(AX.color);
GC.drawRect(xToClient(cFirst),yToClient(cMax),xToClient(cLast)-xToClient(cFirst),yToClient(cMin)-yToClient(cMax));
if(AY.Visible)
{
GC.setColor(AY.color);
for(i=1;i<yPlotCount;i++)
{
GC.drawLine(xToClient(cFirst),yToClient(cMin+i*AY.Inc*PlotHeight),
xToClient(cLast),yToClient(cMin+i*AY.Inc*PlotHeight));
}
}
if(AY.Label)
{
GC.setFont(AY.Unit.font);
GC.setColor(AY.Unit.color);
for(i=0;i<=yPlotCount;i++)
{
if(Math.round(AY.Begin+PlotHeight*i)==AY.Begin+PlotHeight*i)
{
sTemp=Long.toString(Math.round(cMin+PlotHeight*i));
}
else
{
//整定有效数字位数为3
int iTemp=GetInt(cMin+PlotHeight*i,3);
long lTemp=Math.round((cMin+PlotHeight*i)*Math.pow(10,-iTemp));
sTemp=Double.toString(lTemp/Math.pow(10,-iTemp));
}
GC.drawString(sTemp,xToClient(cFirst)-GC.getFontMetrics(AY.Unit.font).stringWidth(sTemp),yToClient(cMin+i*PlotHeight)+ToInt(GC.getFontMetrics(AY.Unit.font).getHeight()*0.5));
}
sTemp=AY.Unit.message;
GC.drawString(sTemp,xToClient(cFirst)-GC.getFontMetrics(AY.Unit.font).stringWidth(sTemp),yToClient(cMin+(i-1)*PlotHeight)-ToInt(GC.getFontMetrics(AY.Unit.font).getHeight()*0.5));
}
if(AX.Visible)
{
GC.setColor(AX.color);
for(i=1;i<=xPlotCount;i++)
{
GC.drawLine(xToClient(cFirst+i*PlotWidth),yToClient(cMin),
xToClient(cFirst+i*PlotWidth),yToClient(cMax));
}
}
if(AX.Label && (AX.Inc>0) && (XLabel.WordCount()==0))
{
GC.setFont(AX.Unit.font);
GC.setColor(AX.Unit.color);
sTemp=null;
dblTemp=cFirst;
while(dblTemp<=cLast)
{
if(Math.round(AX.Begin+dblTemp*AX.Rate)==AX.Begin+dblTemp*AX.Rate)
{
sTemp=Long.toString(Math.round(AX.Begin+dblTemp*AX.Rate));
}
else
{
sTemp=Double.toString(AX.Begin+dblTemp*AX.Rate)+AX.Unit.message;
}
GC.drawString(sTemp,xToClient(dblTemp)-GC.getFontMetrics(AX.Unit.font).stringWidth(sTemp)/2,yToClient(cMin)+GC.getFontMetrics(AX.Unit.font).getHeight());
dblTemp+=AX.Inc;
}
GC.drawString("("+AX.Unit.message+")",xToClient(cLast)+GC.getFontMetrics(AX.Unit.font).stringWidth(sTemp)/2,yToClient(cMin)+GC.getFontMetrics(AX.Unit.font).getHeight());
}
else
{
GC.setFont(AX.Unit.font);
GC.setColor(AX.Unit.color);
for(i=0;i<XLabel.WordCount();i++)
{
GC.drawString(XLabel.GetWord(i),xToClient(i),yToClient(cMin)+GC.getFontMetrics(AX.Unit.font).getHeight());
}
}
//写标题头
if(Title.message!=null)
{
GC.setFont(Title.font);
GC.setColor(Title.color);
GC.drawString(Title.message,pLeft+(pWidth-GC.getFontMetrics(Title.font).stringWidth(Title.message))/2,yToClient(cMax)-1);
GC.setFont(new Font("宋体",0,11));
}
//写图例
if(bCutLine)
{
GC.setFont(CutLineFont);
for(i=0;i<CNum;i++)
{
GC.setColor(C[i].color);
GC.fillRect(xToClient(cLast)+5,yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8),20,5);
if(!C[i].Visible) GC.fillArc(xToClient(cLast)+30,yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8),5,5,0,360);
GC.drawString(C[i].CutLine,xToClient(cLast)+5,yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8)+2+GC.getFontMetrics(CutLineFont).getHeight());
}
}
//画曲线
for(j=0;j<CNum;j++)
{
if(C[j].Visible)
{
GC.setColor(C[j].color);
if(C[j].p[0].y == CURVE_INVAILD_YAXIS)
{
bInvaild = true;
}
else
{
xPosition = C[j].p[0].x;
yPosition = C[j].p[0].y;
bInvaild = false;
}
for(i=1;i< C[j].pnum;i++)
{
if(C[j].p[i].y == CURVE_INVAILD_YAXIS)
{
bInvaild = true;
}
else
{
if(bInvaild)
{
xPosition = C[j].p[i].x;
yPosition = C[j].p[i].y;
bInvaild = false;
}
else
{
GC.drawLine(xToClient(xPosition),yToClient(yPosition),
xToClient(C[j].p[i].x),yToClient(C[j].p[i].y));
//GC.drawLine(xToClient(xPosition),yToClient(yPosition)-1,
//xToClient(C[j].p[i].x),yToClient(C[j].p[i].y)-1);
xPosition=C[j].p[i].x;
yPosition=C[j].p[i].y;
}
}
}
//Ctrl.Circle (Datas(j, i).x, Datas(j, i).y), 0.15
}//endif
}//end for
}
public void init()
{
cWidth = Integer.valueOf(GetParam("Width","0")).intValue();
cHeight = Integer.valueOf(GetParam("Height","0")).intValue();
ImgBuffer=createImage(cWidth,cHeight);
GC=ImgBuffer.getGraphics();
ImgSave=createImage(cWidth,cHeight);
GS=ImgSave.getGraphics();
bHasDrawed=false;
if(!GetCurveData())
GC.drawString("Param Error!",5,5);
else
DrawCurve();
enableEvents(MouseEvent.MOUSE_MOVED);
}
public void paint(Graphics g)
{
g.drawImage(ImgBuffer,0,0,this);
//int i,j;
//Graphics2D g2 = (Graphics2D)g;
//g2.draw(TempQuad);
}
protected void processMouseMotionEvent( MouseEvent e )
{
boolean bRepaint=false;
boolean bDrawMsg=false;
CStream CS;
CNumber CN=new CNumber();
String sIn="",sOut="",ch,ch2;
if(Expression.message!=null)
{
int x=e.getX();
int y=e.getY();
if(bHasDrawed)
{
GC.drawImage(ImgSave,0,0,this);
bRepaint=true;
bHasDrawed=false;
}
if(x>=pLeft&&x<=pLeft+pWidth&&y>=pTop&&y<=pTop+pHeight)
{
double xClient=clientToX(x);
CS=new CStream(Expression.message);
for(int i=1;i<CS.WordCount();i++)
{
sIn=CS.GetWord(i);
sOut="";
for(int j=0;j<sIn.length();j++)
{
ch=sIn.substring(j,j+1);
if(ch.compareTo("X")==0||ch.compareTo("Y")==0||ch.compareTo("M")==0)
{
int k=j;
do
{
k++;
if(k>=sIn.length()) break;
ch2=sIn.substring(k,k+1);
} while(ch2.compareTo("0")>=0&&ch2.compareTo("9")<=0);
int cIndex=Integer.valueOf(sIn.substring(j+1,k)).intValue();
int pIndex=C[cIndex].GetIndexByDichotomy(xClient);
if(pIndex!=-1)
{
if(ch.compareTo("M")==0)
{
if(cIndex<ExpMessageNum&&cIndex>=0)
if(pIndex<ExpMessage[cIndex].WordCount()&&pIndex>=0)
{
sOut=sOut+ExpMessage[cIndex].GetWord(pIndex);
bDrawMsg=true;
}
}
if(ch.compareTo("X")==0)
{
sOut=sOut+C[cIndex].p[pIndex].x;
bDrawMsg=true;
}
if(ch.compareTo("Y")==0)
if(C[cIndex].p[pIndex].y!=CURVE_INVAILD_YAXIS)
{
sOut=sOut+C[cIndex].p[pIndex].y;
bDrawMsg=true;
}
}
j=k-1;
}
else
{
sOut=sOut+ch;
}
}
CS.SetWord(i,sOut);
}
if(bDrawMsg)
{
int iLeft=0,iTop=0,iWidth=0,iHeight=0;
CS=new CStream(CS.Format()+"/n","/n");
GS.drawImage(ImgBuffer,0,0,this);
for(int i=0;i<CS.WordCount();i++)
iWidth=Math.max(iWidth,GC.getFontMetrics(Expression.font).stringWidth(CS.GetWord(i)));
iHeight=CS.WordCount()*GC.getFontMetrics(Expression.font).getHeight();
iWidth+=5;
iHeight+=5;
if(x+iWidth+10>pWidth+pLeft)
iLeft=x-iWidth;
else
iLeft=x+10;
if(y+iHeight+10>pHeight+pTop)
{
iTop=y-iHeight;
}
else
{
iTop=y+10;
}
GC.setColor(ExpColor);
GC.fillRect(iLeft,iTop,iWidth,iHeight);
GC.setFont(Expression.font);
GC.setColor(Expression.color);
for(int i=0;i<CS.WordCount();i++)
GC.drawString(CS.GetWord(i),iLeft+2,iTop+(i+1)*GC.getFontMetrics(GC.getFont()).getHeight());
GC.drawLine(x,pTop,x,pTop+pHeight);
bHasDrawed=true;
bRepaint=true;
}
}
if(bRepaint) repaint();
}
}
public void update(Graphics g) //重载update降低闪烁
{
paint(g);
}
protected void processMouseEvent( MouseEvent e )
{
CStream CS=new CStream(e.paramString() + ",");
if(CS.GetWord(0).compareTo("MOUSE_EXITED")==0)
{
if(Expression.message!=null)
{
if(bHasDrawed)
{
GC.drawImage(ImgSave,0,0,this);
bHasDrawed=false;
repaint();
}
}
}
if(CS.GetWord(0).compareTo("MOUSE_CLICKED")==0)
{
for(int i=0;i<CNum;i++)
{
int iLeft=xToClient(cLast)+5;
int iRight=iLeft+20;
int iTop=yToClient(cMax)+i*(GC.getFontMetrics(CutLineFont).getHeight()+8);
int iBottom=iTop+5;
if(e.getX()>=iLeft&&e.getX()<=iRight&&e.getY()>=iTop&&e.getY()<=iBottom)
{
C[i].Visible=!C[i].Visible;
DrawCurve();
repaint();
break;
}
}
}
}
static public void main(String[] avgs)
{
}
}