File indexing completed on 2024-04-06 12:11:53
0001 #include <sstream>
0002 #include "Fireworks/TableWidget/interface/FWTableManagerBase.h"
0003 #include "Fireworks/TableWidget/interface/FWTableWidget.h"
0004 #include "Fireworks/TableWidget/interface/FWCheckedTextTableCellRenderer.h"
0005
0006 class FWCheckedTextTableCellRenderer;
0007
0008 class FWTestTableManager : public FWTableManagerBase {
0009 public:
0010 FWTestTableManager(const std::vector<std::string>& iColumns,
0011 const std::vector<std::string>& iData );
0012 virtual int numberOfRows() const ;
0013 virtual int numberOfColumns() const ;
0014 virtual int unsortedRowNumber(int iSortedRowNumber) const;
0015 virtual void implSort(int col, bool sortOrder) ;
0016 virtual std::vector<std::string> getTitles() const;
0017 virtual FWTableCellRendererBase* cellRenderer(int iRow, int iCol) const;
0018
0019 void selectRow(int);
0020
0021 void rowClicked(Int_t row, Int_t btn, Int_t keyMod);
0022
0023
0024 void checkBoxClicked();
0025
0026 virtual bool hasRowHeaders() const ;
0027 virtual FWTableCellRendererBase* rowHeader(int iRow) const ;
0028
0029 private:
0030 std::vector<std::string> m_columns;
0031 std::vector<std::string> m_content;
0032 std::vector<unsigned int> m_sortOrder;
0033 std::vector<bool> m_rowChecked;
0034
0035 FWTextTableCellRenderer* m_renderer;
0036 FWCheckedTextTableCellRenderer* m_rowHeaderRenderer;
0037
0038 int m_selectedRow;
0039 mutable int m_lastRequestedRow;
0040 };
0041
0042
0043
0044
0045 FWTestTableManager::FWTestTableManager(const std::vector<std::string>& iColumns,
0046 const std::vector<std::string>& iData):
0047 m_columns(iColumns),
0048 m_content(iData),
0049 m_rowChecked(m_content.size(),false),
0050 m_renderer( new FWTextTableCellRenderer),
0051 m_rowHeaderRenderer( new FWCheckedTextTableCellRenderer),
0052 m_selectedRow(-1),
0053 m_lastRequestedRow(-1)
0054 {
0055 assert(0== m_content.size()%m_columns.size());
0056 unsigned int nRows = numberOfRows();
0057 m_sortOrder.reserve(nRows);
0058 for(unsigned int i = 0; i < nRows;++i){
0059 m_sortOrder.push_back(i);
0060 }
0061 m_rowHeaderRenderer->Connect("checkBoxClicked()","FWTestTableManager",this,"checkBoxClicked()");
0062 }
0063
0064 int
0065 FWTestTableManager::numberOfRows() const
0066 {
0067 return m_content.size()/m_columns.size();
0068 }
0069
0070 int
0071 FWTestTableManager::numberOfColumns() const
0072 {
0073 return m_columns.size();
0074 }
0075
0076 void
0077 FWTestTableManager::implSort(int col, bool sortOrder)
0078 {
0079 if(col >-1 && col < m_columns.size()) {
0080 std::vector<std::pair<std::string,unsigned int> > toSort;
0081 int nRows = numberOfRows();
0082 toSort.reserve(nRows);
0083
0084 for(int row=0; row< nRows; ++row) {
0085 toSort.push_back( std::make_pair<std::string, unsigned int>(m_content[col+row*numberOfColumns()],row));
0086 }
0087 if(sortOrder){
0088 std::sort(toSort.begin(),toSort.end(),std::greater<std::pair<std::string,unsigned int> >());
0089 } else {
0090 std::sort(toSort.begin(),toSort.end(),std::less<std::pair<std::string,unsigned int> >());
0091 }
0092 std::vector<unsigned int>::iterator itSort = m_sortOrder.begin();
0093 for(std::vector<std::pair<std::string,unsigned int> >::iterator it = toSort.begin(), itEnd=toSort.end();
0094 it != itEnd;
0095 ++it,++itSort) {
0096 *itSort = it->second;
0097 }
0098 }
0099 }
0100
0101 int
0102 FWTestTableManager::unsortedRowNumber(int iSortedRowNumber) const
0103 {
0104 return m_sortOrder[iSortedRowNumber];
0105 }
0106
0107 std::vector<std::string>
0108 FWTestTableManager::getTitles() const
0109 {
0110 return std::vector<std::string>(m_columns.begin(),m_columns.end());
0111 }
0112
0113 FWTableCellRendererBase*
0114 FWTestTableManager::cellRenderer(int iRow, int iCol) const
0115 {
0116 int rowBeforeSort = m_sortOrder[iRow];
0117 m_renderer->setData( *(m_content.begin()+rowBeforeSort*m_columns.size()+iCol),
0118 rowBeforeSort==m_selectedRow);
0119 return m_renderer;
0120 }
0121
0122 void
0123 FWTestTableManager::selectRow(int iRow)
0124 {
0125 if(iRow != m_selectedRow) {
0126 m_selectedRow = iRow;
0127 visualPropertiesChanged();
0128 }
0129 }
0130
0131 void
0132 FWTestTableManager::rowClicked(Int_t row, Int_t btn, Int_t keyMod)
0133 {
0134 if(btn==kButton1) {
0135 if(row==m_selectedRow) {
0136 if(keyMod & kKeyShiftMask) {
0137 selectRow(-1);
0138 }
0139 } else {
0140 selectRow(row);
0141 }
0142 }
0143 }
0144
0145 bool
0146 FWTestTableManager::hasRowHeaders() const
0147 {
0148 return true;
0149
0150 }
0151 FWTableCellRendererBase*
0152 FWTestTableManager::rowHeader(int iRow) const
0153 {
0154 int rowBeforeSort = m_sortOrder[iRow];
0155 m_lastRequestedRow=rowBeforeSort;
0156
0157 std::ostringstream s;
0158 s<<rowBeforeSort;
0159 m_rowHeaderRenderer->setData(s.str(),rowBeforeSort==m_selectedRow);
0160 m_rowHeaderRenderer->setChecked(m_rowChecked[rowBeforeSort]);
0161 return m_rowHeaderRenderer;
0162 }
0163
0164 void
0165 FWTestTableManager::checkBoxClicked()
0166 {
0167 if(-1 != m_lastRequestedRow) {
0168 m_rowChecked[m_lastRequestedRow] = ! m_rowChecked[m_lastRequestedRow];
0169 visualPropertiesChanged();
0170 }
0171 }
0172
0173
0174 void tableWidgetTest()
0175 {
0176 int width=440;
0177 int height=400;
0178
0179 TGMainFrame *fMain = new TGMainFrame(gClient->GetRoot(),width,height);
0180
0181 TGCompositeFrame *tFrame = new TGCompositeFrame(fMain, width, height);
0182 TGLayoutHints *tFrameHints = new TGLayoutHints(kLHintsTop|kLHintsLeft|kLHintsExpandX|kLHintsExpandY);
0183 fMain->AddFrame(tFrame,tFrameHints);
0184
0185 std::vector<std::string> columns;
0186 columns.push_back("one long title");
0187 columns.push_back("two");
0188 columns.push_back("another long one");
0189 columns.push_back("four");
0190 std::vector<std::string> data;
0191 for(int iRow =1; iRow < 1000; ++iRow) {
0192 for(int iCol =1; iCol < 5;++iCol) {
0193 std::stringstream s;
0194 s<<iRow<<" "<<iCol;
0195 data.push_back(s.str());
0196 }
0197 }
0198
0199 FWTestTableManager* tableM = new FWTestTableManager(columns,data);
0200 FWTableWidget* table = new FWTableWidget(tableM, tFrame);
0201 table->Connect("rowClicked(Int_t,Int_t,Int_t)","FWTestTableManager",tableM,"rowClicked(Int_t,Int_t,Int_t)");
0202 table->sort(0,true);
0203 tFrame->AddFrame(table,tFrameHints);
0204
0205 fMain->SetWindowName("Header Test");
0206 fMain->MapSubwindows();
0207 fMain->Layout();
0208 fMain->MapWindow();
0209
0210 }