00001 #ifndef MediaTable_TableDataSourceCombinedViews_h
00002 #define MediaTable_TableDataSourceCombinedViews_h
00003
00004 #include "TableDataSource.h"
00005 #include "TableDataView.h"
00006
00007 namespace Impala {
00008 namespace Application {
00009 namespace MediaTable {
00010
00011 class TableDataSourceCombinedViews : public TableDataSource, public TableDataViewListener
00012 {
00013 public:
00014
00015 TableDataSourceCombinedViews() : TableDataSource()
00016 {
00017 Init();
00018 }
00019
00020 ~TableDataSourceCombinedViews()
00021 {
00022 }
00023
00024 std::vector<TableColumn*> GetColumns(bool StaticColumns=true, bool ExtraColumns=false)
00025 {
00026
00027 std::vector<TableColumn*> columns;
00028 std::set<std::string> columnNames;
00029
00030 for (std::vector<TableDataView*>::iterator it=mTableDataViews.begin(); it != mTableDataViews.end(); ++it)
00031 {
00032 std::vector<TableColumn*> viewColumns = (*it)->GetColumns(StaticColumns, ExtraColumns);
00033 for (std::vector<TableColumn*>::iterator iter=viewColumns.begin(); iter!=viewColumns.end(); ++iter)
00034 {
00035 if(columnNames.insert((*iter)->GetName()).second)
00036 columns.push_back(*iter);
00037 }
00038 }
00039 return columns;
00040 }
00041
00042 TableColumn* GetColumn(std::string column) {
00043 return mColumns[column]->GetColumn(column);
00044 }
00045
00046 int GetTotalRows() {
00047
00048 std::vector<TableDataView*>::iterator mTableDataViewsIterator;
00049
00050 uint rows = -1;
00051 for(mTableDataViewsIterator = mTableDataViews.begin();
00052 mTableDataViewsIterator != mTableDataViews.end(); ++mTableDataViewsIterator) {
00053 if(rows = -1) rows = (*mTableDataViewsIterator)->GetTotalRows();
00054 if(rows != (*mTableDataViewsIterator)->GetTotalRows()) rows = 0;
00055 }
00056
00057 if(rows == -1) rows = 0;
00058 return rows;
00059 }
00060
00061
00062 String GetTextDataByID(String column, int row)
00063 {
00064 return mColumns[column]->GetSortedTextData(column, row);
00065 }
00066
00067 int GetIntDataByID(String column, int row)
00068 {
00069 return mColumns[column]->GetSortedIntData(column, row);
00070 }
00071
00072 double GetDoubleDataByID(String column, int row)
00073 {
00074 return mColumns[column]->GetSortedDoubleData(column, row);
00075 }
00076
00077 double GetNormalizedDataByID(String column, int row)
00078 {
00079 return mColumns[column]->GetSortedNormalizedData(column, row);
00080 }
00081
00082 Array2dVec3UInt8* GetImageDataByID(String column, int row)
00083 {
00084 return mColumns[column]->GetSortedImageData(column, row);
00085 }
00086
00087 Array2dVec3UInt8* GetVideoDataByID(String column, int row)
00088 {
00089 if(column == "")
00090 return 0;
00091 return mColumns[column]->GetSortedVideoData(column, row);
00092 }
00093
00094 unsigned long long GetQuidByID(String column, int row) {
00095 return mColumns[column]->GetSortedQuid(column, row);
00096 }
00097
00098 bool AddTableDataView(TableDataView* view, std::string column = "") {
00099 if (column == "") {
00100 if(mColumn == "") {
00101 ILOG_WARN("No column provided in AddTableDataView.")
00102 return false;
00103 }
00104 column = mColumn;
00105 }
00106
00107 view->SetSortColumn(column);
00108 if(mTableDataViews.size() > 0) {
00109 if(GetTotalRows() == 0) {
00110 ILOG_WARN("Existing TableDataView has 0 rows.")
00111 return false;
00112 }
00113 if(GetTotalRows() != view->GetTotalRows()) {
00114 ILOG_WARN("GetTotalRows() does not match with existing TableDataView ("
00115 << GetTotalRows() << " != " << view->GetTotalRows() << ").");
00116 return false;
00117 }
00118 for(int i=0; i < GetTotalRows(); i++) {
00119
00120
00121 }
00122 } else {
00123 mColumn = column;
00124 }
00125
00126 mTableDataViews.push_back(view);
00127 view->AddTableDataViewListener(this);
00128
00129 std::vector<TableColumn*> columns = view->GetColumns(true, true);
00130 for(std::vector<TableColumn*>::iterator columnIterator = columns.begin();
00131 columnIterator != columns.end(); ++columnIterator)
00132 mColumns.insert(make_pair((*columnIterator)->GetName(), view));
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 return true;
00145 }
00146
00147 private:
00148
00149 void Init()
00150 {
00151 }
00152
00153 void UpdateRowsEvent()
00154 {
00155
00156 DoUpdateRowsEvent();
00157 }
00158 void UpdateNumberOfRowsEvent()
00159 {
00160
00161 DoUpdateNumberOfRowsEvent();
00162 }
00163
00164 std::vector<TableDataView*> mTableDataViews;
00165 std::map<std::string, TableDataView*> mColumns;
00166 std::string mColumn;
00167
00168 ILOG_VAR_DEC;
00169 };
00170
00171 ILOG_VAR_INIT(TableDataSourceCombinedViews, Application.MediaTable);
00172
00173 }
00174 }
00175 }
00176
00177 #endif // TableDataSourceCombinedViews_h