Source Code (Use browser search to find items of interest.)
Class Index
kspread'AIPlot (./koffice/kspread/qtai_plot.h:82)
class AIPlot : public AIBase
{
Q_OBJECT
public:
// Main Methods
AIPlot(QWidget *parent,const char *name=0,int b=512,int t=1);
~AIPlot();
void init();
// Set Methods
void setData(int trace,int qn,double *xp,double *yp);
void setRanges(double xmn,double xmx,double ymn,double ymx);
void setXRange(double xmn,double xmx);
void setYRange(double ymn,double ymx);
void setPlotColor(int bar,int r,int g,int b);
void setPlotColor(int bar,QColor c);
void setPlotType(int type);
void setGraphType(int type);
void setEnabled(int graph,bool on);
void setDoubleBuffer(bool on);
void setXName(QString xName);
void setYName(QString yName);
void setXUnit(QString xUnit);
void setYUnit(QString yUnit);
void resetCalced();
virtual void setXAxisDisplay(int type);
// Get Settings
double getXmin();
double getYmin();
double getXmax();
double getYmax();
int getPlotType(void);
int getGraphType(void);
bool isEnabled(int graph);
double *xtrace[8];
double *ytrace[8];
int bufsize;
int traces;
int qn[8];
double xmin,xmax;
double ymin,ymax;
// Zoom Stuff
double azx1,azy1,azx2,azy2; // actual zoom factor, for zoom rect
double zoomx1[8],zoomy1[8],zoomx2[8],zoomy2[8]; // Zoom Factor in %
int zoomed_in;
bool zooming;
// Cursors
AICursor p_curs[8];
QColor c_curs[8];
private slots:
void setZoomMode();
void setZoomOut();
void setPanMode();
void setCursMode();
protected:
virtual void drawIt( QPainter *p);
virtual void mousePressEvent( QMouseEvent *e );
virtual void mouseReleaseEvent( QMouseEvent *e );
virtual void mouseMoveEvent( QMouseEvent *e );
virtual QSizePolicy sizePolicy() const;
virtual void drawGrid( QPainter *p );
virtual void drawScale( QPainter *p,int direction,int w,int h);
virtual void drawLabel( QPainter *p,int direction,int w,int rw,int h,int rh);
bool calced[8];
int x_axis_display_type;
private:
void paintEvent( QPaintEvent *p );
void resizeEvent(QResizeEvent *e);
QPixmap *bg_buf;
QPointArray *qa[8]; // Main Array
QPrinter *printer; // Printer
QPopupMenu *adhoc; // Main Popup
QColor color[8];
int pcnt[8];
QCursor *cs_standard;
QCursor *cs_pan;
bool trace_enabled[8];
AICursor calcTraceCoords(double x,double y);
double rzoomx1,rzoomy1,rzoomx2,rzoomy2; // Zoom Factor in %
double panx1,pany1,panx2,pany2;
bool panning;
bool dbuffer;
int plottype;
int graphtype;
int ctrlmode;
int used_curs;
QString xName;
QString yName;
QString xUnit;
QString yUnit;
bool reshade;
};
/*******************************************************************/
/********* End Draw Window Definition *****************************/
/*******************************************************************/
kspread'AIPlot::AIPlot() (./koffice/kspread/qtai_plot.cpp:60)
AIPlot::AIPlot(QWidget *parent,const char *name,int b,int t)
: AIBase( parent, name)
{
bufsize=b;
traces=t;
init();
}
kspread'AIPlot::~AIPlot() (./koffice/kspread/qtai_plot.cpp:68)
AIPlot::~AIPlot()
{
int i;
delete printer;
delete adhoc;
for (i=0;i<traces;i++) {
delete xtrace[i];
delete ytrace[i];
delete qa[i];
}
}
kspread'AIPlot::init() (./koffice/kspread/qtai_plot.cpp:82)
void AIPlot::init()
{
int i;
// Get buffers
// memset(xtrace,0,bufsize*sizeof(double));
for (i=0;i<8;i++) {
xtrace[i]=NULL;
ytrace[i]=NULL;
qa[i]=NULL;
qn[i]=0;
}
for (i=0;i<traces;i++) {
trace_enabled[i]=TRUE;
pcnt[i]=0;
qa[i] = new QPointArray(bufsize);
qn[i] = 0;
xtrace[i]= new double[bufsize];
ytrace[i]=new double[bufsize];
// Set data to the new traces, otherwise the program will crash !!!
memset(xtrace[i],0,bufsize*sizeof(double));
memset(ytrace[i],0,bufsize*sizeof(double));
color[i].setRgb( 0, 164, 0 );
calced[i]=FALSE;
}
// Setup defaults
printer = new QPrinter;
bg_buf=NULL;
plottype=AI_PLOT_TREND;
graphtype=AI_PLOT_LINE;
ctrlmode=AI_CTRL_CURS;
dbuffer=FALSE;
zoomed_in=0,zooming=FALSE;
zoomx1[0]=0.0f,zoomy1[0]=0.0f,zoomx2[0]=100.0f,zoomy2[0]=100.0f;
for (i=0;i<2;i++)
p_curs[i].set(0.0,0.0);
used_curs=0;
c_curs[0].setRgb(127,255,255);
c_curs[1].setRgb(255,127,255);
#ifdef MYCURS
QBitmap scb( scb_width, scb_height, scb_bits, TRUE );
QBitmap scm( scm_width, scm_height, scm_bits, TRUE );
cs_standard = new QCursor(scb,scm); // create bitmap cursor
cs_pan = new QCursor(sizeAllCursor);
setCursor(*cs_standard);
#endif
adhoc=new QPopupMenu();
adhoc->insertItem( tr("Zoom Mode"),this, SLOT(setZoomMode()));
adhoc->insertItem( tr("Pan Mode"),this, SLOT(setPanMode()));
adhoc->insertItem( tr("Cursor Mode"),this, SLOT(setCursMode()));
adhoc->insertSeparator();
adhoc->insertItem( tr("Zoom Out"),this, SLOT(setZoomOut()));
xName="";
yName="";
xUnit="";
yUnit="";
reshade=TRUE;
x_axis_display_type=X_AXIS_NUMBER;
xmax=1;
ymax=1;
xmin=0;
ymin=-1;
}
kspread'AIPlot::sizePolicy() (./koffice/kspread/qtai_plot.cpp:166)
QSizePolicy AIPlot::sizePolicy() const
{
return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
}
kspread'AIPlot::drawScale() (./koffice/kspread/qtai_plot.cpp:171)
void AIPlot::drawScale( QPainter *p,int direction,int w,int h)
{
int x,y;
int maxx=4,maxy=4;
int zx1,zx2,zy1,zy2;
int pos;
//p->fillRect(0,0,w,h,c_bg);
p->setPen(c_grid);
if (direction & HORIZONTAL) {
zx1=(int)(zoomx1[zoomed_in]*(double)w/100.0f);
zx2=(int)((zoomx2[zoomed_in]-zoomx1[zoomed_in])*(double)w/100.0f);
p->setWindow(zx1,0,zx2,h);
// Draw horizontal scale
for (x=0;x<=maxx;x++) {
pos = (int)(x*w/maxx);
if (pos>=zx1 && pos<=zx1+zx2) {
p->drawLine(pos,(int)0,
pos,(int)h/2);
}
}
}
else if (direction & VERTICAL) {
zy1=(int)(zoomy1[zoomed_in]*(double)h/100.0f);
zy2=(int)((zoomy2[zoomed_in]-zoomy1[zoomed_in])*(double)h/100.0f);
p->setWindow(0,zy1,w,zy2);
// Draw vertical scale
for (y=0;y<=maxy;y++) {
pos=(int)(y*h/maxy);
if (pos>=zy1 && pos<=zy1+zy2) {
p->drawLine((int)w/2,pos,(int)w,pos);
}
}
}
}
kspread'AIPlot::drawLabel() (./koffice/kspread/qtai_plot.cpp:215)
void AIPlot::drawLabel( QPainter *p,int direction,int w,int rw,int h,int rh)
{
int x,y;
// Number of Scale Divisors
int maxx=4,maxy=4;
int tpos;
QString str="";
QFont font("Helvetica",10);
QFontMetrics fm(font);
double rzb,rze;
double lw,lh;
static double lzx1,lzy1,lzx2,lzy2;
time_t tt=0;
struct tm *ts=NULL;
lzx1=zoomx1[zoomed_in],lzy1=zoomy1[zoomed_in];
lzx2=zoomx2[zoomed_in],lzy2=zoomy2[zoomed_in];
//p->fillRect(0,0,w,h,c_bg);
p->setPen(c_grid);
// Calculate begin and end of zoom area to the real world
if (direction & HORIZONTAL) {
rzb=(double)lzx1*((double)xmax-(double)xmin)/
(double)100.0f + (double)xmin;
rze=(double)lzx2*((double)xmax-(double)xmin)/
(double)100.0f + (double)xmin;
} else if (direction & VERTICAL) {
rzb=(double)(100.0f-lzy1)*((double)ymax-(double)ymin)/
(double)100.0f + (double)ymin;
rze=(double)(100.0f-lzy2)*((double)ymax-(double)ymin)/
(double)100.0f + (double)ymin;
}
p->setFont(font);
if (direction & HORIZONTAL) {
for (x=0;x<=maxx;x++) {
double zahl=(double)(xmin+(xmax-xmin)*(double)x/(double)maxx);
if ((x_axis_display_type & X_AXIS_NUMBER)==X_AXIS_NUMBER) {
str.sprintf("%.2f",(double)zahl);
} else if ((x_axis_display_type & X_AXIS_DATE)==X_AXIS_DATE) {
if ((x_axis_display_type & X_AXIS_UK)==X_AXIS_UK) {
} else {
tt=(time_t)zahl;
if (tt<=0)
return;
ts = localtime(&tt);
if (ts==NULL)
return;
str.sprintf("%02d:%02d:%02d\0",
ts->tm_hour,ts->tm_min,ts->tm_sec);
}
}
lw=rw*100.0f/(lzx2-lzx1);
tpos=(int)(x*lw/maxx-lzx1*lw/100.0f-fm.width(str)/2+(w-rw)/2);
if (!(tpos<0 || tpos+fm.width(str)>w))
p->drawText(tpos,0+fm.height(),str);
}
}
else if (direction & VERTICAL) {
for (y=0;y<=maxy;y++) {
double zahl=(double)(ymax+(ymin-ymax)*(double)y/(double)maxy);
str.sprintf("%.2f",zahl);
lh=rh*100.0f/(lzy2-lzy1);
tpos=(int)(y*lh/maxy-lzy1*lh/100.0f+fm.height()/2+(h-rh)/2);
if (!(tpos-fm.height()<0 || tpos+fm.height()>h))
p->drawText(w-fm.width(str),tpos,str);
}
}
}
kspread'AIPlot::drawGrid() (./koffice/kspread/qtai_plot.cpp:303)
void AIPlot::drawGrid( QPainter *p )
{
int x,y,i;
// Number of Scale Divisors
int maxx=8,maxy=8;
int w;
int h;
w=width();
h=height();
kspread'AIPlot::drawIt() (./koffice/kspread/qtai_plot.cpp:368)
void AIPlot::drawIt( QPainter *p )
{
QString name="";
int fact=10;
QColor c;
int w;
int h;
int fh;
int fw;
w=width()*fact;
h=height()*fact;
QFont font("Helvetica",10);
QFontMetrics fm(font);
QString str;
int i,j,x,y,cur,zero;
int rx=0,ry=0,rw=w,rh=h;
double w100=(double)w/100.0f;
double h100=(double)h/100.0f;
double dx10=w100/10;
double rx10=(xmax-xmin)/10;
static double ozoomx1=0,ozoomy1=0,ozoomx2=0,ozoomy2=0;
static double lzx1,lzy1,lzx2,lzy2;
lzx1=zoomx1[zoomed_in],lzy1=zoomy1[zoomed_in];
lzx2=zoomx2[zoomed_in],lzy2=zoomy2[zoomed_in];
time_t tt=0;
struct tm *ts=NULL;
int max_y=0, min_y=0;
//p->fillRect(0,0,w,h,c_bg);
p->setViewport(50,30,width()-80,height()-80);
p->setClipRect(50,30,width()-80,height()-80);
drawGrid(p);
if (zoomed_in>0) {
p->setWindow((int)(zoomx1[zoomed_in]*w100),
(int)(zoomy1[zoomed_in]*h100),
(int)((zoomx2[zoomed_in]-zoomx1[zoomed_in])*(double)w100),
(int)((zoomy2[zoomed_in]-zoomy1[zoomed_in])*(double)h100));
max_y=(int)(zoomy1[zoomed_in]*h100);
min_y=(int)((zoomy2[zoomed_in]-zoomy1[zoomed_in])*(double)h100);
} else {
p->setWindow(0,0,w,h); // defines coordinate system
max_y=0;
min_y=h;
}
switch (graphtype) {
case AI_PLOT_LINE:
// Set the initial min_y and max_y values
min_y=(int)(h-(ytrace[0][0]-ymin)/(ymax-ymin)*h);
max_y=(int)(h-(ytrace[0][0]-ymin)/(ymax-ymin)*h);
for (i=0;i<traces;i++) {
if (isEnabled(i)) {
// Set Pen with Line width, not usefull
// consumes too much CPU time
// QPen pen=QPen(color[i],2);
// p->setPen( pen );
// Set to line width 1
p->setPen( color[i] );
if (qa[i]!=NULL && qn[i]>0) {
if (xtrace[i]!=NULL && ytrace[i]!=NULL) {
// Check if this is already calculated :
if (!calced[i]) {
pcnt[i]=0;
// Parts of New Formula 1999/03/12
// Formula factors and summands to reduce calc. in loop
double fx; // factor x
double sx; // summand x
double fy; // factor y
double sy; // summand y
double *sytrace;
fx=1/(xmax-xmin)*w;
sx=-xmin/(xmax-xmin)*w;
fy=-1/(ymax-ymin)*h;
sy=h+ymin/(ymax-ymin)*h;
// Single y trace to reduce indication in loop
sytrace=(double*)(ytrace[i]);
for (j=0;j<qn[i];j++) {
// Original Formula disabled 1999/03/12
// x=(int)((xtrace[i][j]-xmin)/(xmax-xmin)*w);
// y=(int)(h-(ytrace[i][j]-ymin)/(ymax-ymin)*h);
// New Formula 1999/03/12
x=(int)(sx+fx*xtrace[i][j]);
y=(int)(sy+fy*sytrace[j]);
if (y>max_y) max_y=y;
if (y<min_y) min_y=y;
if (!(xtrace[i][j]<(xmin-rx10) || xtrace[i][j]>(xmax+rx10))) {
qa[i]->setPoint(pcnt[i]++,x,y);
}
}
for (cur=0;cur<2;cur++) {
// BAD PERFORMANCE due to large pow and
// sqrt calcs in calcTraceCoords
// DISABLED 1999-10-27
// p_curs[cur]=calcTraceCoords(p_curs[cur].x(),p_curs[cur].y());
// New Function SetTraceCoords
// by former trace setting
// p_curs[cur]=
}
calced[i]=TRUE;
}
p->drawPolyline(*qa[i],0,pcnt[i]);
}
}
}
}
break;
case AI_PLOT_BAR:
for (i=0;i<traces;i++) {
if (isEnabled(i)) {
p->setPen( color[i] );
pcnt[i]=0;
if (qa[i]!=NULL && qn[i]>0) {
if (xtrace[i]!=NULL && ytrace[i]!=NULL) {
for (j=0;j<qn[i];j++) {
x=(int)((xtrace[i][j]-xmin)/(xmax-xmin)*w);
y=(int)(h-(ytrace[i][j]-ymin)/(ymax-ymin)*h);
zero=(int)(h-(-ymin)/(ymax-ymin)*h);
p->drawLine(x,zero,x,y);
}
}
}
}
}
break;
}
p->setClipRect(0,0,width(),height());
if (zooming || zoomed_in>0) {
p->setPen(c_comm);
switch(plottype) {
case AI_PLOT_POLAR:
#ifdef RADAR_PANEL // Ha Ha
p->drawEllipse((int)(azx1*w100),
(int)(azy1*h100),
(int)((azx2-azx1)*w100),
(int)((azy2-azy1)*h100));
break;
#endif
default:
p->drawRect((int)(azx1*w100),
(int)(azy1*h100),
(int)((azx2-azx1)*w100),
(int)((azy2-azy1)*h100));
break;
}
}
p->setViewport(0,0,width(),height());
p->setWindow(0,0,width(),height());
p->setWindow(0,0,20*fact,(height()-80)*fact);
p->setViewport(30,30,20,height()-80);
drawScale(p,VERTICAL,20*fact,(height()-80)*fact);
p->setWindow(0,0,30,height()-30);
p->setViewport(0,0,30,height()-30);
drawLabel(p,VERTICAL,30,30,height()-30,height()-80);
// add the y-label
p->setPen(c_grid);
if (yName.length()>0 && yUnit.length()>0) {
name.sprintf("%s [%s]",yName.latin1(),yUnit.latin1());
} else if (yName.length()>0) {
name = yName;
} else if (yUnit.length()>0) {
name.sprintf("[%s]",yUnit.latin1());
}
p->drawText(5,0+fm.height(),name);
p->setWindow(0,0,(width()-80)*fact,(20*fact));
p->setViewport(50,height()-50,width()-80,20);
drawScale(p,HORIZONTAL,(width()-80)*fact,20*fact);
p->setWindow(0,0,(width()-30),30);
p->setViewport(30,height()-30,width()-30,30);
drawLabel(p,HORIZONTAL,width()-30,width()-80,30,30);
// add the x-label
p->setPen(c_grid);
if (xName.length()>0 && xUnit.length()>0) {
name.sprintf("%s [%s]",xName.latin1(),xUnit.latin1());
} else if (xName.length()>0) {
name = xName;
} else if (xUnit.length()>0) {
name.sprintf("[%s]",xUnit.latin1());
}
p->drawText(width()-50-fm.width(name)-15,25,name);
// Paint the global Information State
p->setViewport(50,30,width()-80,height()-80);
p->setWindow(0,0,width()-80,height()-80);
p->setPen(c_comm);
p->setFont(font);
switch(ctrlmode){
case AI_CTRL_ZOOM:
str=tr("Zoom Mode");
break;
case AI_CTRL_PAN:
str=tr("Pan Mode");
break;
case AI_CTRL_CURS:
str=tr("Cursor Mode");
break;
}
p->drawText(5,-fm.height()/2,str);
for (i=0;i<2;i++) {
if (p_curs[i].trace()>=0 && p_curs[i].index()>=0){
if ((x_axis_display_type & X_AXIS_NUMBER)==X_AXIS_NUMBER) {
str.sprintf("%.2f %s, %.2f %s",
(double)xtrace[p_curs[i].trace()][p_curs[i].index()],
xUnit.latin1(),
(double)ytrace[p_curs[i].trace()][p_curs[i].index()],
yUnit.latin1());
} else if ((x_axis_display_type & X_AXIS_DATE)==X_AXIS_DATE) {
if ((x_axis_display_type & X_AXIS_UK)==X_AXIS_UK) {
} else {
tt=(time_t)xtrace[p_curs[i].trace()][p_curs[i].index()];
if (tt<=0)
return;
ts = localtime(&tt);
if (ts==NULL)
return;
str.sprintf("%02d:%02d:%02d %s, %.2f %s",
ts->tm_hour,ts->tm_min,ts->tm_sec,
xUnit.latin1(),
(double)ytrace[p_curs[i].trace()][p_curs[i].index()],
yUnit.latin1());
}
}
p->setPen(c_curs[i]); // Original Cursor Color
fh=fm.height();
fw=fm.width(str);
//p->drawRect(100,-i*(fh/2+5),fw,fh-1);
p->drawRect(90,10-fh-(fh+5)/2-i*((fh+10)/2),fw+20,fh-2);
p->setPen( color[p_curs[i].trace()]);
// HORIZONTAL
// p->drawText((int)100+i*100,-fm.height()/2,str);
// VERTICAL
p->drawText((int)100,5-(fh+3)/2-i*((fh+3)/2+5),str);
}
}
/* SHOWS THE ZOOM WINDOW SIZE IN GRAPH
if(zoomed_in>0) {
sprintf(str,"Zoom Area %d (%.1f%%, %.1f%%, %.1f%%, %.1f%%)",
zoomed_in,
zoomx1[zoomed_in],zoomy1[zoomed_in],
zoomx2[zoomed_in],zoomy2[zoomed_in]);
p->drawText(width()-80-(fm.width(str)-5),20,str);
}
*/
// ############### Draw Cursor #################
w=width();
h=height();
double fx=w/(lzx2-lzx1);
double fy=h/(lzy2-lzy1);
p->setViewport(50,30,width()-80,height()-80);
p->setWindow(0,0,w,h);
for (i=0;i<2;i++) {
double px=p_curs[i].x()-lzx1;
double py=p_curs[i].y()-lzy1;
p->setPen(c_curs[i]);
p->drawLine((int)(px*fx-5),(int)(py*fy),
(int)(px*fx+5),(int)(py*fy));
p->drawLine((int)(px*fx),(int)(py*fy-5),
(int)(px*fx),(int)(py*fy+5));
}
}
//
// Called when the widget needs to be updated.
//
kspread'AIPlot::paintEvent() (./koffice/kspread/qtai_plot.cpp:699)
void AIPlot::paintEvent( QPaintEvent * )
{
//return;
QPoint qp(0,0);
QPainter paint;
QPainter tmp; // for double buffering
// Seems to be O.K., but dangerous in case of stack overflows
//QPixmap pix(width(),height());
int n;
static int bw=-1,bh=-1; // BG Buffer
QPainter bg_p;
QColor shade_c;
int w=width();
int h=height();
kspread'AIPlot::setDoubleBuffer() (./koffice/kspread/qtai_plot.cpp:785)
void AIPlot::setDoubleBuffer(bool on)
{
dbuffer=on;
}
kspread'AIPlot::resetCalced() (./koffice/kspread/qtai_plot.cpp:790)
void AIPlot::resetCalced()
{
int i;
for (i=0;i<traces;i++) {
calced[i]=FALSE;
}
}
kspread'AIPlot::setData() (./koffice/kspread/qtai_plot.cpp:799)
void AIPlot::setData(int trace,int qn,double *xp,double *yp)
{
int i;
if (trace>traces-1) // Not enough traces prepared
return;
calced[trace]=FALSE;
if (!zooming) {
this->qn[trace]=qn;
memcpy((char*)this->xtrace[trace],(char*)xp,qn*sizeof(double));
memcpy((char*)this->ytrace[trace],(char*)yp,qn*sizeof(double));
}
// Hide Cursor, maybe we should use a p_curs..->hide()
for (i=0;i<2;i++)
p_curs[i].set(p_curs[i].x(),p_curs[i].y());
}
kspread'AIPlot::setXName() (./koffice/kspread/qtai_plot.cpp:819)
void AIPlot::setXName(QString xName)
{
this->xName=xName;
}
kspread'AIPlot::setYName() (./koffice/kspread/qtai_plot.cpp:824)
void AIPlot::setYName(QString yName)
{
this->yName=yName;
}
kspread'AIPlot::setXUnit() (./koffice/kspread/qtai_plot.cpp:829)
void AIPlot::setXUnit(QString xUnit)
{
this->xUnit=xUnit;
}
kspread'AIPlot::setYUnit() (./koffice/kspread/qtai_plot.cpp:834)
void AIPlot::setYUnit(QString yUnit)
{
this->yUnit=yUnit;
}
kspread'AIPlot::setRanges() (./koffice/kspread/qtai_plot.cpp:839)
void AIPlot::setRanges(double xmn,double xmx,double ymn,double ymx)
{
setXRange(xmn,xmx);
setYRange(ymn,ymx);
}
kspread'AIPlot::setXRange() (./koffice/kspread/qtai_plot.cpp:845)
void AIPlot::setXRange(double xmn,double xmx)
{
xmin=xmn;
xmax=xmx;
}
kspread'AIPlot::setYRange() (./koffice/kspread/qtai_plot.cpp:851)
void AIPlot::setYRange(double ymn,double ymx)
{
ymin=ymn;
ymax=ymx;
}
kspread'AIPlot::getXmax() (./koffice/kspread/qtai_plot.cpp:857)
double AIPlot::getXmax()
{
return xmax;
}
kspread'AIPlot::getYmax() (./koffice/kspread/qtai_plot.cpp:862)
double AIPlot::getYmax()
{
return ymax;
}
kspread'AIPlot::getXmin() (./koffice/kspread/qtai_plot.cpp:867)
double AIPlot::getXmin()
{
return xmin;
}
kspread'AIPlot::getYmin() (./koffice/kspread/qtai_plot.cpp:872)
double AIPlot::getYmin()
{
return ymin;
}
kspread'AIPlot::calcTraceCoords() (./koffice/kspread/qtai_plot.cpp:877)
AICursor AIPlot::calcTraceCoords(double x,double y)
{
AICursor curs(x,y);
double realx,realy;
double dist,adist;
double cursx,cursy;
int i,t,min_dy=-1,min_dx=-1;
// Transform x,y to realx,realy
realx=(x*(xmax-xmin)/100)+xmin;
realy=((100-y)*(ymax-ymin)/100)+ymin;
// Compare Traces
dist=-1;
for (t=0;t<traces;t++) {
for (i=0;i<qn[0];i++) {
adist=sqrt( pow((xtrace[t][i]-realx)/(xmax-xmin),2)
+ pow((ytrace[t][i]-realy)/(ymax-ymin),2));
if (dist==-1) {
dist=adist;
} else if (adist<dist) {
dist=adist;
min_dx=i;
min_dy=t;
}
}
}
if (min_dx!=-1 && min_dy!=-1) {
// Get the cursx,cursy values and retransform
cursx=(xtrace[min_dy][min_dx]-xmin)*100/(xmax-xmin);
cursy=100-(ytrace[min_dy][min_dx]-ymin)*100/(ymax-ymin);
// Set the cursx,cursy values
curs.set(cursx,cursy,min_dy,min_dx);
}
return curs;
}
// AIPlot Mouse Event Methods
kspread'AIPlot::mousePressEvent() (./koffice/kspread/qtai_plot.cpp:922)
void AIPlot::mousePressEvent( QMouseEvent *e )
{
double rcursx,rcursy;
if (ctrlmode==AI_CTRL_ZOOM &&
zoomed_in<7 && e->button()==LeftButton) {
rzoomx1=zoomx1[zoomed_in]+(zoomx2[zoomed_in]-zoomx1[zoomed_in])
*(double)(e->x()-50)/(width()-80);
rzoomy1=zoomy1[zoomed_in]+(zoomy2[zoomed_in]-zoomy1[zoomed_in])
*(double)(e->y()-30)/(height()-80);
zooming=TRUE;
}
if (ctrlmode==AI_CTRL_PAN &&
zoomed_in>0 && e->button()==LeftButton) {
panx1=100.0f*(double)(e->x()-50)/(width()-80);
pany1=100.0f*(double)(e->y()-30)/(height()-80);
panning=TRUE;
//setCursor(*cs_pan);
}
if (ctrlmode==AI_CTRL_CURS &&
e->button()==LeftButton) {
rcursx=zoomx1[zoomed_in]+(zoomx2[zoomed_in]-zoomx1[zoomed_in])
*(double)(e->x()-50)/(width()-80);
rcursy=zoomy1[zoomed_in]+(zoomy2[zoomed_in]-zoomy1[zoomed_in])
*(double)(e->y()-30)/(height()-80);
// Compare Cursors
{
double dist,adist;
int i,min_dy=-1,min_dx=-1;
// Transform x,y to realx,realy
//realx=(rcursx*(xmax-xmin)/100)+xmin;
//realy=((100-rcursy)*(ymax-ymin)/100)+ymin;
dist=-1;
used_curs=0;
for (i=0;i<2;i++) {
adist=sqrt( pow(p_curs[i].x()-rcursx,2)
+ pow(p_curs[i].y()-rcursy,2));
if (dist==-1) {
dist=adist;
} else if (adist<dist) {
dist=adist;
used_curs=i;
}
}
}
p_curs[used_curs].set(rcursx,rcursy);
//p_curs[0]=calcTraceCoords(rcursx,rcursy);
repaint(FALSE);
}
if (e->button()==RightButton) {
QPoint p(e->x(),e->y());
adhoc->popup(mapToGlobal(p));
}
}
kspread'AIPlot::mouseMoveEvent() (./koffice/kspread/qtai_plot.cpp:988)
void AIPlot::mouseMoveEvent( QMouseEvent *e )
{
QPainter paint;
double panx,pany;
double rcursx,rcursy;
if (ctrlmode==AI_CTRL_ZOOM && zooming) {
rzoomx2=zoomx1[zoomed_in]+(zoomx2[zoomed_in]-zoomx1[zoomed_in])
*(double)(e->x()-50)/(width()-80);
rzoomy2=zoomy1[zoomed_in]+(zoomy2[zoomed_in]-zoomy1[zoomed_in])
*(double)(e->y()-30)/(height()-80);
if (e->state() & ControlButton) {
if ((rzoomx2-rzoomx1)>(rzoomy2-rzoomy1)) {
rzoomy2=rzoomy1+(rzoomx2-rzoomx1);
} else {
rzoomx2=rzoomx1+(rzoomy2-rzoomy1);
}
}
if (rzoomx1>rzoomx2)
{azx1=rzoomx2;azx2=rzoomx1;}
else
{azx1=rzoomx1;azx2=rzoomx2;}
if (rzoomy1>rzoomy2)
{azy1=rzoomy2;azy2=rzoomy1;}
else
{azy1=rzoomy1;azy2=rzoomy2;}
if (azx1<zoomx1[zoomed_in])azx1=zoomx1[zoomed_in];
if (azx2>zoomx2[zoomed_in])azx2=zoomx2[zoomed_in];
if (azy1<zoomy1[zoomed_in])azy1=zoomy1[zoomed_in];
if (azy2>zoomy2[zoomed_in])azy2=zoomy2[zoomed_in];
repaint(FALSE);
}
if (ctrlmode==AI_CTRL_CURS) {
rcursx=zoomx1[zoomed_in]+(zoomx2[zoomed_in]-zoomx1[zoomed_in])
*(double)(e->x()-50)/(width()-80);
rcursy=zoomy1[zoomed_in]+(zoomy2[zoomed_in]-zoomy1[zoomed_in])
*(double)(e->y()-30)/(height()-80);
p_curs[used_curs].set(rcursx,rcursy);
// OLD DISABLED // RE-ENABLED 1999-10-27
p_curs[used_curs]=calcTraceCoords(rcursx,rcursy);
repaint(FALSE);
}
if (ctrlmode==AI_CTRL_PAN && zoomed_in>0 && panning) {
double ozx1=zoomx1[zoomed_in],ozy1=zoomy1[zoomed_in];
double ozx2=zoomx2[zoomed_in],ozy2=zoomy2[zoomed_in];
panx2=100.0f*(double)(e->x()-50)/(width()-80);
pany2=100.0f*(double)(e->y()-30)/(height()-80);
panx=((double)((double)panx2-(double)panx1)
*((double)zoomx2[zoomed_in]-(double)zoomx1[zoomed_in])/100.0f);
pany=((double)((double)pany2-(double)pany1)
*((double)zoomy2[zoomed_in]-(double)zoomy1[zoomed_in])/100.0f);
zoomx1[zoomed_in]-=panx;
zoomx2[zoomed_in]-=panx;
zoomy1[zoomed_in]-=pany;
zoomy2[zoomed_in]-=pany;
if (zoomx1[zoomed_in]<0) {
zoomx1[zoomed_in]=0;
zoomx2[zoomed_in]=ozx2-ozx1;
}
if (zoomx2[zoomed_in]>100.0f) {
zoomx2[zoomed_in]=100.0f;
zoomx1[zoomed_in]=100.0f-(ozx2-ozx1);
}
if (zoomy1[zoomed_in]<0) {
zoomy1[zoomed_in]=0;
zoomy2[zoomed_in]=ozy2-ozy1;
}
if (zoomy2[zoomed_in]>100.0f) {
zoomy2[zoomed_in]=100.0f;
zoomy1[zoomed_in]=100.0f-(ozy2-ozy1);
}
panx1=panx2;
pany1=pany2;
azx1=zoomx1[zoomed_in];
azx2=zoomx2[zoomed_in];
azy1=zoomy1[zoomed_in];
azy2=zoomy2[zoomed_in];
repaint(FALSE);
}
}
kspread'AIPlot::mouseReleaseEvent() (./koffice/kspread/qtai_plot.cpp:1089)
void AIPlot::mouseReleaseEvent( QMouseEvent *e )
{
double rcursx,rcursy;
if (ctrlmode==AI_CTRL_ZOOM &&
zoomed_in<7 && e->button()==LeftButton) {
rzoomx2=zoomx1[zoomed_in]+(zoomx2[zoomed_in]-zoomx1[zoomed_in])
*(double)(e->x()-50)/(width()-80);
rzoomy2=zoomy1[zoomed_in]+(zoomy2[zoomed_in]-zoomy1[zoomed_in])
*(double)(e->y()-30)/(height()-80);
if (e->state() & ControlButton) {
if ((rzoomx2-rzoomx1)>(rzoomy2-rzoomy1)) {
rzoomy2=rzoomy1+(rzoomx2-rzoomx1);
} else {
rzoomx2=rzoomx1+(rzoomy2-rzoomy1);
}
}
zoomed_in++;
if (rzoomx1>rzoomx2)
{zoomx1[zoomed_in]=rzoomx2;zoomx2[zoomed_in]=rzoomx1;}
else
{zoomx1[zoomed_in]=rzoomx1;zoomx2[zoomed_in]=rzoomx2;}
if (rzoomy1>rzoomy2)
{zoomy1[zoomed_in]=rzoomy2;zoomy2[zoomed_in]=rzoomy1;}
else
{zoomy1[zoomed_in]=rzoomy1;zoomy2[zoomed_in]=rzoomy2;}
if (zoomx1[zoomed_in]<zoomx1[zoomed_in-1])
zoomx1[zoomed_in]=zoomx1[zoomed_in-1];
if (zoomx2[zoomed_in]>zoomx2[zoomed_in-1])
zoomx2[zoomed_in]=zoomx2[zoomed_in-1];
if (zoomy1[zoomed_in]<zoomy1[zoomed_in-1])
zoomy1[zoomed_in]=zoomy1[zoomed_in-1];
if (zoomy2[zoomed_in]>zoomy2[zoomed_in-1])
zoomy2[zoomed_in]=zoomy2[zoomed_in-1];
if (fabs(zoomx1[zoomed_in]-zoomx2[zoomed_in])<1.0
|| fabs(zoomy1[zoomed_in]-zoomy2[zoomed_in])<1.0)
zoomed_in--;
if (zoomed_in<=0)
zoomed_in=0;
// Zoom in
zooming=FALSE;
repaint(FALSE);
}
if (ctrlmode==AI_CTRL_CURS &&
e->button()==LeftButton) {
rcursx=zoomx1[zoomed_in]+(zoomx2[zoomed_in]-zoomx1[zoomed_in])
*(double)(e->x()-50)/(width()-80);
rcursy=zoomy1[zoomed_in]+(zoomy2[zoomed_in]-zoomy1[zoomed_in])
*(double)(e->y()-30)/(height()-80);
//p_curs[0].set(rcursx,rcursy);
p_curs[used_curs]=calcTraceCoords(rcursx,rcursy);
repaint(FALSE);
}
if (ctrlmode==AI_CTRL_PAN &&
e->button()==LeftButton) {
panning=FALSE;
//setCursor(*cs_standard);
repaint(FALSE);
}
}
kspread'AIPlot::setPlotColor() (./koffice/kspread/qtai_plot.cpp:1160)
void AIPlot::setPlotColor(int bar,int r,int g,int b)
{
color[bar].setRgb(r,g,b);
}
kspread'AIPlot::setPlotColor() (./koffice/kspread/qtai_plot.cpp:1165)
void AIPlot::setPlotColor(int bar,QColor c)
{
color[bar].setRgb(c.red(),c.green(),c.blue());
}
kspread'AIPlot::setPlotType() (./koffice/kspread/qtai_plot.cpp:1170)
void AIPlot::setPlotType(int type)
{
plottype=type;
}
kspread'AIPlot::getPlotType() (./koffice/kspread/qtai_plot.cpp:1175)
int AIPlot::getPlotType(void)
{
return plottype;
}
kspread'AIPlot::setGraphType() (./koffice/kspread/qtai_plot.cpp:1180)
void AIPlot::setGraphType(int type)
{
graphtype=type;
}
kspread'AIPlot::getGraphType() (./koffice/kspread/qtai_plot.cpp:1185)
int AIPlot::getGraphType(void)
{
return graphtype;
}
kspread'AIPlot::setZoomMode() (./koffice/kspread/qtai_plot.cpp:1190)
void AIPlot::setZoomMode()
{
ctrlmode=AI_CTRL_ZOOM;
repaint(FALSE);
}
kspread'AIPlot::setZoomOut() (./koffice/kspread/qtai_plot.cpp:1196)
void AIPlot::setZoomOut()
{
zoomed_in--;
if (zoomed_in<=0)
zoomed_in=0;
azx1=zoomx1[zoomed_in];
azy1=zoomy1[zoomed_in];
azx2=zoomx2[zoomed_in];
azy2=zoomy2[zoomed_in];
zooming=FALSE;
repaint(FALSE);
}
kspread'AIPlot::setPanMode() (./koffice/kspread/qtai_plot.cpp:1210)
void AIPlot::setPanMode()
{
ctrlmode=AI_CTRL_PAN;
repaint(FALSE);
}
kspread'AIPlot::setCursMode() (./koffice/kspread/qtai_plot.cpp:1216)
void AIPlot::setCursMode()
{
ctrlmode=AI_CTRL_CURS;
repaint(FALSE);
}
kspread'AIPlot::setEnabled() (./koffice/kspread/qtai_plot.cpp:1222)
void AIPlot::setEnabled(int graph,bool on)
{
trace_enabled[graph]=on;
}
kspread'AIPlot::isEnabled() (./koffice/kspread/qtai_plot.cpp:1227)
bool AIPlot::isEnabled(int graph)
{
return trace_enabled[graph];
}
kspread'AIPlot::resizeEvent() (./koffice/kspread/qtai_plot.cpp:1232)
void AIPlot::resizeEvent(QResizeEvent *e)
{
int i;
reshade=TRUE;
for (i=0;i<8;i++) {
calced[i]=FALSE;
}
resize(e->size().width(),e->size().height());
}
kspread'AIPlot::setXAxisDisplay() (./koffice/kspread/qtai_plot.cpp:1242)
void AIPlot::setXAxisDisplay(int type)
{
x_axis_display_type=type;
}
// AICursor Class and Functions