filters
tablehandler.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "tablehandler.h"
00021
00022 #include <wv2/word97_generated.h>
00023
00024 #include <kdebug.h>
00025 #include <KoRect.h>
00026 #include <qtl.h>
00027
00028 KWordTableHandler::KWordTableHandler()
00029 {
00030 tableEnd();
00031 }
00032
00033
00034 void KWordTableHandler::tableStart( KWord::Table* table )
00035 {
00036 Q_ASSERT( table );
00037 Q_ASSERT( !table->name.isEmpty() );
00038 m_currentTable = table;
00039 qHeapSort( table->m_cellEdges );
00040 #if 0
00041 for (unsigned int i = 0; i < table->m_cellEdges.size(); i++)
00042 kdDebug(30513) << table->m_cellEdges[i] << endl;
00043 #endif
00044 m_row = -1;
00045 m_currentY = 0;
00046 }
00047
00048 void KWordTableHandler::tableEnd()
00049 {
00050 m_currentTable = 0L;
00051 m_row = -2;
00052 m_column = -2;
00053
00054 }
00055
00056 void KWordTableHandler::tableRowStart( wvWare::SharedPtr<const wvWare::Word97::TAP> tap )
00057 {
00058 if ( m_row == -2 )
00059 {
00060 kdWarning(30513) << "tableRowStart: tableStart not called previously!" << endl;
00061 return;
00062 }
00063 Q_ASSERT( m_currentTable );
00064 Q_ASSERT( !m_currentTable->name.isEmpty() );
00065 m_row++;
00066 m_column = -1;
00067 m_tap = tap;
00068 kdDebug(30513) << "tableRowStart row=" << m_row << endl;
00069 }
00070
00071 void KWordTableHandler::tableRowEnd()
00072 {
00073 kdDebug(30513) << "tableRowEnd" << endl;
00074 m_currentY += rowHeight();
00075 }
00076
00077 void KWordTableHandler::tableCellStart()
00078 {
00079 Q_ASSERT( m_tap );
00080 if ( !m_tap )
00081 return;
00082 m_column++;
00083 int nbCells = m_tap->itcMac;
00084 Q_ASSERT( m_column < nbCells );
00085 if ( m_column >= nbCells )
00086 return;
00087
00088
00089 const wvWare::Word97::TC& tc = m_tap->rgtc[ m_column ];
00090
00091 int left = m_tap->rgdxaCenter[ m_column ];
00092 int right = m_tap->rgdxaCenter[ m_column+1 ];
00093
00094
00095
00096 #if 0
00097 int colSize = 1;
00098 if ( tc.fFirstMerged )
00099 {
00100
00101
00102 int i = m_column + 1;
00103 while ( i < nbCells && m_tap->rgtc[ i ].fMerged && !m_tap->rgtc[i].fFirstMerged ) {
00104 ++colSize;
00105 ++i;
00106 }
00107 }
00108 #endif
00109 int rowSpan = 1;
00110 if ( tc.fVertRestart )
00111 {
00112
00113
00114
00115 QValueList<KWord::Row>::Iterator it = m_currentTable->rows.at( m_row + 1 );
00116 for( ; it != m_currentTable->rows.end(); ++it ) {
00117
00118 KWord::TAPptr tapBelow = (*it).tap;
00119 const wvWare::Word97::TC* tcBelow = 0L;
00120 for ( int c = 0; !tcBelow && c < tapBelow->itcMac ; ++c )
00121 {
00122 if ( QABS( tapBelow->rgdxaCenter[ c ] - left ) <= 3
00123 && QABS( tapBelow->rgdxaCenter[ c + 1 ] - right ) <= 3 ) {
00124 tcBelow = &tapBelow->rgtc[ c ];
00125
00126 }
00127 }
00128 if ( tcBelow && tcBelow->fVertMerge && !tcBelow->fVertRestart )
00129 ++rowSpan;
00130 else
00131 break;
00132 }
00133
00134 }
00135
00136
00137 if ( tc.fVertMerge && !tc.fVertRestart )
00138 return;
00139
00140
00141 int leftCellNumber = m_currentTable->columnNumber( left );
00142 int rightCellNumber = m_currentTable->columnNumber( right );
00143
00144
00145
00146
00147
00148 if ( m_column == nbCells - 1 ) {
00149 rightCellNumber = m_currentTable->m_cellEdges.size() - 1;
00150 right = m_currentTable->m_cellEdges[ rightCellNumber ];
00151 }
00152
00153 Q_ASSERT( rightCellNumber >= leftCellNumber );
00154 int colSpan = rightCellNumber - leftCellNumber;
00155
00156 KoRect cellRect( left / 20.0,
00157 m_currentY,
00158 ( right - left ) / 20.0,
00159 rowHeight() );
00160
00161 kdDebug(30513) << " tableCellStart row=" << m_row << " WordColumn=" << m_column << " colSpan=" << colSpan << " (from " << leftCellNumber << " to " << rightCellNumber << " for KWord) rowSpan=" << rowSpan << " cellRect=" << cellRect << endl;
00162
00163
00164
00165
00166
00167
00168
00169 const wvWare::Word97::BRC& brcTop = tc.brcTop;
00170 const wvWare::Word97::BRC& brcBottom = tc.brcBottom;
00171 const wvWare::Word97::BRC& brcLeft =
00172 ( tc.brcLeft.ico == 255 && tc.brcLeft.dptLineWidth == 255 && m_column > 0 ) ?
00173 m_tap->rgtc[ m_column - 1 ].brcRight
00174 : tc.brcLeft;
00175 const wvWare::Word97::BRC& brcRight =
00176 ( tc.brcRight.ico == 255 && tc.brcRight.dptLineWidth == 255 && m_column < nbCells - 1 ) ?
00177 m_tap->rgtc[ m_column + 1 ].brcLeft
00178 : tc.brcRight;
00179
00180 emit sigTableCellStart( m_row, leftCellNumber, rowSpan, colSpan, cellRect, m_currentTable->name, brcTop, brcBottom, brcLeft, brcRight, m_tap->rgshd[ m_column ] );
00181 }
00182
00183 void KWordTableHandler::tableCellEnd()
00184 {
00185 kdDebug(30513) << " tableCellEnd" << endl;
00186 emit sigTableCellEnd();
00187 }
00188
00189
00190
00191 void KWord::Table::cacheCellEdge(int cellEdge)
00192 {
00193 uint size = m_cellEdges.size();
00194
00195 for (unsigned int i = 0; i < size; i++)
00196 {
00197 if (m_cellEdges[i] == cellEdge) {
00198 kdDebug(30513) << k_funcinfo << cellEdge << " -> found" << endl;
00199 return;
00200 }
00201 }
00202
00203
00204 m_cellEdges.resize(size + 1, QGArray::SpeedOptim);
00205 m_cellEdges[size] = cellEdge;
00206 kdDebug(30513) << k_funcinfo << cellEdge << " -> added. Size=" << size+1 << endl;
00207 }
00208
00209
00210
00211 int KWord::Table::columnNumber(int cellEdge) const
00212 {
00213 for (unsigned int i = 0; i < m_cellEdges.size(); i++)
00214 {
00215 if (m_cellEdges[i] == cellEdge)
00216 return i;
00217 }
00218
00219 kdWarning(30513) << "Column not found for cellEdge x=" << cellEdge << " - BUG." << endl;
00220 return 0;
00221 }
00222
00223 double KWordTableHandler::rowHeight() const
00224 {
00225 return QMAX( m_tap->dyaRowHeight / 20.0, 20);
00226 }
00227
00228 #include "tablehandler.moc"
|