00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00028
00029 #define YASAGUI_STATISTICS_INCLUDE
00030
00031
00033 #include <qtable.h>
00034 #include <qvbox.h>
00035 #include <qlabel.h>
00036 #include <yasagui/yasagui.h>
00037 #include <qstringlist.h>
00038 #include <qfont.h>
00039 #include <qfontmetrics.h>
00040 #include "datatypes.h"
00041 #include "environment.h"
00042 #include "project.h"
00043 #include "statistichandler.h"
00044
00045
00047 class YLogAction;
00048 class YStatistics;
00049
00050
00052 class YStatisticTableItem : public QTableItem
00053 {public: YStatisticTableItem(QTable *table, const QString &text=YStatisticBaseEntry::GetUnknownString() ) :
00054 QTableItem(table, QTableItem::Never, text )
00055 {}
00056 virtual int alignment() const { return AlignVCenter | AlignRight; }
00057 };
00058
00060 class YStatisticLogFileTableItem : public YStatisticTableItem
00061 { const YStatisticBaseEntry &statisticentry;
00062 public: YStatisticLogFileTableItem(QTable *table, const YStatisticBaseEntry &sbe) :
00063 YStatisticTableItem(table, sbe.GetVisibleString() ),
00064 statisticentry(sbe)
00065 {}
00066 virtual QString key() const { return statisticentry.GetKey(); }
00067 };
00068
00069
00071 #define MIN_COLUMN_WIDTH 85
00072 #define COLUMN_WIDTH_OFFSET 5 // offset added after calculating max width
00073 #define ROW_HEIGHT_OFFSET 7 // offset added after calculating max width
00074 #define MIN_HORIZONTAL_HEADER_WIDTH 85
00075 #define STATISTICTABLE_XOFFSET 4 // used to add width of lines in header
00076 #define STATISTICTABLE_YOFFSET 4
00077
00080 class YStatisticTable : public QTable
00081 { Q_OBJECT
00082 YStatisticHandler *statistichandler;
00083 int horizontalheaderwidth;
00084 int columnwidth;
00085 bool drawinglocked;
00086 bool sortdirection;
00087 protected:
00088 public: YStatisticTable(int r, int c, QWidget *parent, YStatisticHandler *handler) :
00089 QTable(r, c, parent),
00090 statistichandler(handler),
00091 horizontalheaderwidth(0),
00092 columnwidth(0),
00093 drawinglocked(false),
00094 sortdirection(true)
00095 {
00096 connect( verticalHeader(), SIGNAL( clicked(int) ), this, SLOT( rowClicked(int) ) );
00097 setSorting(true);
00098 }
00099 YStatisticHandler* GetStatisticHandler() const { return statistichandler; }
00100 virtual void drawContents(QPainter * p, int cx, int cy, int cw, int ch )
00101 {
00102 if ( ! drawinglocked )
00103 QTable::drawContents(p,cx,cy,cw,ch);
00104 }
00105 virtual void sortColumn ( int col, bool ascending = TRUE, bool wholeRows = FALSE )
00106 {
00107 QTable::sortColumn(col, ascending, true);
00108 clearSelection( true );
00109 Q_UNUSED(wholeRows);
00110 }
00111 virtual void swapRows( int row1, int row2 )
00112 {
00113 QTable::swapRows(row1, row2);
00114 QString str=verticalHeader()->label(row1);
00115 int w=verticalHeader()->sectionSize(row1);
00116 verticalHeader()->setLabel(row1, verticalHeader()->label(row2) );
00117 verticalHeader()->resizeSection(row1, verticalHeader()->sectionSize(row2) );
00118 verticalHeader()->setLabel(row2, str );
00119 verticalHeader()->resizeSection(row2, w);
00120 }
00121 virtual void swapColumns( int col1, int col2 )
00122 {
00123 QTable::swapColumns(col1, col2);
00124 QString str=horizontalHeader()->label(col1);
00125 int w=horizontalHeader()->sectionSize(col1);
00126 horizontalHeader()->setLabel(col1, horizontalHeader()->label(col2) );
00127 horizontalHeader()->resizeSection(col1, horizontalHeader()->sectionSize(col2) );
00128 horizontalHeader()->setLabel(col2, str );
00129 horizontalHeader()->resizeSection(col2, w);
00130 }
00131 void SetVerticalNames(const QStringList &list)
00132 {
00133 for ( unsigned int i=0 ; i<list.count(); i++ )
00134 verticalHeader()->setLabel(i, list[i] );
00135 }
00136 void SetHorizontalNames(const QStringList &list)
00137 {
00138 for ( unsigned int i=0 ; i<list.count(); i++ )
00139 horizontalHeader()->setLabel(i, list[i] );
00140 }
00142 void EnlargeTable()
00143 {
00144 int i,j,k;
00145 QFont font;
00146 QFontMetrics fontmetrics(font);
00147 font.setBold(true);
00148 QFontMetrics fontmetricsbold(font);
00149
00150
00151 columnwidth=MIN_COLUMN_WIDTH;
00152 for ( i=0; i<numCols(); i++)
00153 {
00154 k=STATISTICTABLE_XOFFSET + fontmetricsbold.width( horizontalHeader()->label(i) );
00155 if ( k > columnwidth )
00156 columnwidth=k;
00157 for ( j=0; j<numRows(); j++)
00158 {
00159 k=fontmetrics.width( text(j,i) );
00160 if ( k > columnwidth )
00161 columnwidth=k;
00162 }
00163 }
00164 columnwidth+=COLUMN_WIDTH_OFFSET;
00165 for ( i=0; i<numCols(); i++)
00166 {
00167 horizontalHeader()->resizeSection( i, columnwidth );
00168 }
00169
00170
00171
00172
00173
00174
00175 for ( horizontalheaderwidth=MIN_HORIZONTAL_HEADER_WIDTH, i=0; i<numRows(); i++)
00176 {
00177 k=fontmetricsbold.width( verticalHeader()->label(i) );
00178 if ( horizontalheaderwidth < k )
00179 horizontalheaderwidth=k;
00180 }
00181 setLeftMargin(horizontalheaderwidth);
00182
00183 j=horizontalHeader()->height()+STATISTICTABLE_YOFFSET;
00184 for ( i=0; i<numRows(); i++)
00185 {
00186 j += rowHeight(i);
00187
00188 }
00189 setMinimumHeight(j);
00190 setMaximumHeight(j);
00191
00192
00193
00194 j=0;
00195 for ( i=0; i<numCols(); i++)
00196 {
00197
00198 j += columnWidth(i);
00199 }
00200 setMinimumWidth( j+STATISTICTABLE_XOFFSET );
00201 resize( width(), height() );
00202 }
00203 int GetMaxVerticalHeaderWidth() const { return horizontalheaderwidth; }
00204 int GetMaxColumnWidth() const { return columnwidth; }
00205 void SetVerticalHeaderWidth(int w)
00206 {
00207 if ( w )
00208 setLeftMargin(w);
00209 setMinimumWidth( width() + (w-horizontalheaderwidth+w) );
00210 resize( width(), height() );
00211 }
00212 void SetColumnWidth(int w)
00213 {
00214 for ( int i=0; i<numCols(); i++)
00215 {
00216 horizontalHeader()->resizeSection(i,w);
00217 }
00218 setMinimumWidth( width() + (w-columnwidth)*numCols() );
00219 resize( width(), height() );
00220 }
00221 public slots:
00222 virtual void rowClicked ( int row )
00223 {
00224 QTableItem *item1,*item2;
00225 QString str1, str2;
00226
00227 bool repeat=true;
00228 if ( numCols() >1 )
00229 {
00230 drawinglocked=true;
00231 horizontalHeader()->setUpdatesEnabled( FALSE );
00232 while (repeat)
00233 {
00234 repeat=false;
00235 for ( int i=0; i<numCols()-1; i++)
00236 {
00237 item1=item( row, i );
00238 str1=str2=QString::null;
00239 if ( item1 )
00240 str1=item1->key();
00241 item2=item( row, i+1 );
00242 if ( item2 )
00243 str2=item2->key();
00244
00245 if ( sortdirection&&(str1>str2) || (!sortdirection&&(str1<str2)) )
00246 {
00247 swapColumns(i, i+1);
00248 repeat=true;
00249 break;
00250 }
00251 }
00252 };
00253 drawinglocked=false;
00254 horizontalHeader()->setUpdatesEnabled(TRUE);
00255 }
00256
00257
00258 for ( int i=0; i<numCols(); i++ )
00259 {
00260 for ( int j=0; j<numRows(); j++ )
00261 {
00262 updateCell( j,i );
00263 }
00264 }
00265 clearSelection( true );
00266 horizontalHeader()->update();
00267 sortdirection=!sortdirection;
00268 }
00269
00270
00271
00272 };
00273
00274
00278 class YStatistics
00279 { QVBox *vbox;
00280 QLabel *label;
00281 YStatisticTable *table;
00282 public: YStatistics() : vbox(0), label(0), table(0)
00283 {}
00284 virtual ~YStatistics() { }
00285 YStatisticTable * GetTable() const { return table; }
00286 QLabel * GetLabel() const { return label; }
00287 QWidget * GetMainWidget() { return vbox; }
00288 virtual int InitInstance(YStatisticHandler *handler, QWidget *p);
00289 void FillTable();
00291 virtual void PostCreate() { table->EnlargeTable(); }
00293 virtual unsigned int GetMaxEntries() const=0;
00295 virtual unsigned int GetMaxProperties() const=0;
00297 virtual QStringList GetPropertyNames() const=0;
00299 virtual QStringList GetEntryNames() const=0;
00301 virtual QString GetTableTitle() const=0;
00303 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number) =0;
00304 };
00305
00306
00309 class YEnvironmentStatistics : public YStatistics
00310 {protected:
00311 YEnvironmentLogFileSet &environmentlogfile;
00312 public: YEnvironmentStatistics(YEnvironmentLogFileSet &e) : environmentlogfile(e) { }
00314 virtual QString GetTableTitle() const
00315 {
00316 QString str=MSGP_SR_TITLE_ENVIRONMENT;
00317 return str .arg( environmentlogfile.GetParent()->GetSet()->GetParent()->GetName() )
00318 .arg( environmentlogfile.GetParent()->GetName() )
00319 .arg( GetSubTitleType() );
00320 }
00322 virtual QString GetSubTitleType() const=0;
00323 };
00324
00325
00337 class YTaskEnvironmentStatistics : public YEnvironmentStatistics
00338 {public: YTaskEnvironmentStatistics(YEnvironmentLogFileSet &e) : YEnvironmentStatistics(e) { }
00340 virtual QStringList GetPropertyNames() const { return YTaskLogFileStatistics::CreatePropertyNames();}
00342 virtual unsigned int GetMaxProperties() const { return YTaskLogFileStatistics::GetMaxProperties(); }
00344 virtual unsigned int GetMaxEntries() const { return environmentlogfile.GetTaskSet().GetCount(); }
00346 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_TASK; }
00348 virtual QStringList GetEntryNames() const
00349 { QStringList list;
00350 for ( unsigned int i=0; i<GetMaxEntries() ; i++ )
00351 list.append( environmentlogfile.GetTaskSet().At(i)->GetName() );
00352 return list;
00353 }
00355 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number) { return &((YLogFileTask*)(environmentlogfile.GetTaskSet().At(number)))->GetStatistics(); }
00356 };
00357
00358
00368 class YMutexEnvironmentStatistics : public YEnvironmentStatistics
00369 {public: YMutexEnvironmentStatistics(YEnvironmentLogFileSet &e) : YEnvironmentStatistics(e) { }
00371 virtual QStringList GetPropertyNames() const { return YMutexLogFileStatistics::CreatePropertyNames();}
00373 virtual unsigned int GetMaxProperties() const { return YMutexLogFileStatistics::GetMaxProperties(); }
00375 virtual unsigned int GetMaxEntries() const { return environmentlogfile.GetMutexSet().GetCount(); }
00377 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_MUTEX; }
00379 virtual QStringList GetEntryNames() const
00380 { QStringList list;
00381 for ( unsigned int i=0; i<GetMaxEntries(); i++ )
00382 list.append( environmentlogfile.GetMutexSet().At(i)->GetName() );
00383 return list;
00384 }
00386 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number) { return &((YLogFileMutex*)(environmentlogfile.GetMutexSet().At(number)))->GetStatistics(); }
00387 };
00388
00389
00399 class YCPUEnvironmentStatistics : public YEnvironmentStatistics
00400 { public: YCPUEnvironmentStatistics(YEnvironmentLogFileSet &e) : YEnvironmentStatistics(e) { }
00402 virtual QStringList GetPropertyNames() const { return YCPULogFileStatistics::CreatePropertyNames();}
00404 virtual unsigned int GetMaxProperties() const { return YCPULogFileStatistics::GetMaxProperties(); }
00406 virtual unsigned int GetMaxEntries() const { return environmentlogfile.GetCount(); }
00408 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_CPU; }
00410 virtual QStringList GetEntryNames() const
00411 { QStringList list;
00412 for ( unsigned int i=0; i<GetMaxEntries(); i++ )
00413 list.append( environmentlogfile.At(i)->GetName() );
00414 return list;
00415 }
00417 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number) { return &((YCPULogFile*)(environmentlogfile.At(number)))->GetStatistics(); }
00418 };
00419
00420
00428 class YSummaryEnvironmentStatistics : public YEnvironmentStatistics
00429 {public: YSummaryEnvironmentStatistics(YEnvironmentLogFileSet &e) : YEnvironmentStatistics(e) { }
00431 virtual QStringList GetPropertyNames() const { return YEnvironmentLogFileStatistics::CreatePropertyNames();}
00433 virtual unsigned int GetMaxProperties() const { return YEnvironmentLogFileStatistics::GetMaxProperties(); }
00435 virtual unsigned int GetMaxEntries() const { return 1; }
00437 virtual QStringList GetEntryNames() const { return QStringList( ((YEnvironment*)environmentlogfile.GetParent())->GetName() ); }
00439 virtual QString GetTableTitle() const
00440 { QString str=MSGP_SR_TITLE_SUMMARY;
00441 return str.arg( ((YEnvironment*)environmentlogfile.GetParent())->GetProject()->GetName() );
00442 }
00444 virtual QString GetSubTitleName() const { return QString("Global"); }
00446 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_ENVIRONMENT; }
00448 virtual YLogFileStatistics* GetEntryLogFileStatistics(int)
00449 {
00450 return &environmentlogfile.GetStatistics();
00451 }
00452 };
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00470 class YProjectStatistics : public YStatistics
00471 { protected:
00472 YProjectLogFile& projectlogfile;
00473 public: YProjectStatistics(YProjectLogFile &lfs) : projectlogfile(lfs) { }
00475 virtual QString GetTableTitle() const
00476 {
00477 QString str=MSGP_SR_TITLE_PROJECT;
00478 return str .arg( GetSubTitleType() )
00479 .arg( GetSubTitleName() )
00480 .arg( projectlogfile.GetProject()->GetName() );
00481 }
00483 virtual QString GetSubTitleName() const =0;
00485 virtual QString GetSubTitleType() const =0;
00487 virtual unsigned int GetMaxEntries() const { return projectlogfile.GetMaxEntries(); }
00489 virtual QStringList GetEntryNames() const { return projectlogfile.GetEnvironmentNames();}
00490 };
00491
00492
00502 class YTaskProjectStatistics : public YProjectStatistics
00503 { int taskid;
00504 QString taskname;
00505 public: YTaskProjectStatistics(const QString &tname, int id, YProjectLogFile &p) :
00506 YProjectStatistics(p), taskid(id), taskname(tname) { }
00508 virtual QStringList GetPropertyNames() const { return YTaskLogFileStatistics::CreatePropertyNames();}
00510 virtual unsigned int GetMaxProperties() const { return YTaskLogFileStatistics::GetMaxProperties(); }
00512 virtual QString GetSubTitleName() const { return taskname; }
00514 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_TASK; }
00515 int GetTaskID() const { return taskid; }
00517 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number)
00518 {
00519 YLogFileTaskSet &taskset=((YEnvironment*)projectlogfile.GetProject()->GetEnvironmentSet().At(number) )
00520 ->GetEnvironmentLogFileSet().GetTaskSet();
00521 for (unsigned int i=0; i<taskset.GetCount(); i++)
00522 {
00523 if ( ((YLogFileTask*)taskset.At(i))->GetId() == taskid )
00524 {
00525 return &((YLogFileTask*)taskset.At(i))->GetStatistics();
00526 }
00527 }
00528 return 0;
00529 }
00530 };
00531
00532
00540 class YMutexProjectStatistics : public YProjectStatistics
00541 { int mutexid;
00542 QString mutexname;
00543 public: YMutexProjectStatistics(const QString &mname, int id, YProjectLogFile &p) : YProjectStatistics(p),
00544 mutexid(id), mutexname(mname) { }
00546 virtual QStringList GetPropertyNames() const { return YMutexLogFileStatistics::CreatePropertyNames();}
00548 virtual unsigned int GetMaxProperties() const { return YMutexLogFileStatistics::GetMaxProperties(); }
00550 virtual QString GetSubTitleName() const { return mutexname; }
00552 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_MUTEX; }
00553 int GetMutexID() const { return mutexid; }
00555 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number)
00556 {
00557 YLogFileMutexSet &mutexset=((YEnvironment*)projectlogfile.GetProject()->GetEnvironmentSet().At(number) )
00558 ->GetEnvironmentLogFileSet().GetMutexSet();
00559 for (unsigned int i=0; i<mutexset.GetCount(); i++)
00560 {
00561 if ( ((YLogFileMutex*)mutexset.At(i))->GetId() == mutexid )
00562 {
00563 return &((YLogFileMutex*)mutexset.At(i))->GetStatistics();
00564 }
00565 }
00566 return 0;
00567 }
00568 };
00569
00570
00580 class YCPUProjectStatistics : public YProjectStatistics
00581 { int cpu;
00582 public: YCPUProjectStatistics(int c, YProjectLogFile &p) : YProjectStatistics(p), cpu (c) { }
00584 virtual QStringList GetPropertyNames() const { return YCPULogFileStatistics::CreatePropertyNames();}
00586 virtual unsigned int GetMaxProperties() const { return YCPULogFileStatistics::GetMaxProperties(); }
00588 virtual QString GetSubTitleName() const { return QString::number(cpu); }
00590 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_CPU; }
00591 unsigned int GetCPU() const { return cpu; }
00593 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number)
00594 {
00595 YEnvironmentLogFileSet &envlogfile=((YEnvironment*)projectlogfile.GetProject()->GetEnvironmentSet().At(number) )->GetEnvironmentLogFileSet();
00596
00597
00598 for (unsigned int i=0 ; i<envlogfile.GetCount() ; i++)
00599 {
00600 if ( ((YCPULogFile*)envlogfile.At(i))->GetCPU() == cpu )
00601 {
00602 return &((YCPULogFile*)envlogfile.At(i))->GetStatistics();
00603 }
00604 }
00605 return 0;
00606 }
00607 };
00608
00609
00617 class YSummaryProjectStatistics : public YProjectStatistics
00618 {public: YSummaryProjectStatistics(YProjectLogFile &p) : YProjectStatistics(p) { }
00620 virtual QStringList GetPropertyNames() const { return YEnvironmentLogFileStatistics::CreatePropertyNames();}
00622 virtual unsigned int GetMaxProperties() const { return YEnvironmentLogFileStatistics::GetMaxProperties(); }
00624 virtual QString GetTableTitle() const
00625 { QString str=MSGP_SR_TITLE_SUMMARY;
00626 return str.arg( projectlogfile.GetProject()->GetName() );
00627 }
00629 virtual QString GetSubTitleName() const { return QString("Global"); }
00631 virtual QString GetSubTitleType() const { return MSGP_TI_SUBTITLE_ENVIRONMENT; }
00633 virtual YLogFileStatistics* GetEntryLogFileStatistics(int number)
00634 {
00635 if ( number < (int)projectlogfile.GetProject()->GetEnvironmentSet().GetCount() )
00636 return & ((YEnvironment*)projectlogfile.GetProject()->GetEnvironmentSet().At(number) )->GetEnvironmentLogFileSet().GetStatistics();
00637 return 0;
00638 }
00639 };
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00653 #endif // ifndef YASAGUI_STATISTICS_INCLUDE