void SheetView::redraw(bool full){ if(full){ clear(); } int i,j; move(0,0); addstr(" "); attron(A_REVERSE); for(i=0;i<COLS/8-1;i++){ string label=centreString(columnLabel(i+scroll.column),8); mvaddstr(0,columnToX(i+scroll.column),label.data()); } for(i=0;i<LINES-2;i++){ string label=centreString(to_string(i+1+scroll.row),8); mvaddstr(rowToY(i+scroll.row),0,label.data()); } attroff(A_REVERSE); for(i=0;i<COLS/8-1;i++){ for(j=0;j<LINES-2;j++){ if(CellAddress(j+scroll.row,i+scroll.column)==cursor)continue; redrawCell(CellAddress(j+scroll.row,i+scroll.column),false); } } redrawCell(cursor,true); }
void SheetView::setCursorPosition(CellAddress addr){ sheet.ensureSheetSize(addr.column+1,addr.row+1); bool didscroll=false; if(addr.column>=scroll.column+COLS/8-1){ scroll.column=addr.column-(COLS/8-1)+1; didscroll=true; } if(addr.row>=scroll.row+LINES-2){ scroll.row=addr.row-(LINES-2)+1; didscroll=true; } if(addr.column<scroll.column){ scroll.column=addr.column; didscroll=true; } if(addr.row<scroll.row){ scroll.row=addr.row; didscroll=true; } if(didscroll){ cursor=addr; redraw(); } else { CellAddress oldcursor=cursor; cursor=addr; redrawCell(oldcursor,false); //redraw left&right too, since the cell value might have leaked there if((int)oldcursor.column-(int)scroll.column<COLS/8-2){ //right redrawCell(CellAddress(oldcursor.row,oldcursor.column+1)); } if((int)oldcursor.column-(int)scroll.column>0){ //left redrawCell(CellAddress(oldcursor.row,oldcursor.column-1)); } displayStatusString(""); redrawCell(cursor,true); } }
Spreadsheet::CellAddress Spreadsheet::stringToAddress(const char * strAddress) { static const boost::regex e("\\${0,1}([A-Z]{1,2})\\${0,1}([0-9]{1,5})"); boost::cmatch cm; Q_ASSERT(strAddress != 0); if (boost::regex_match(strAddress, cm, e)) { const boost::sub_match<const char *> colstr = cm[1]; const boost::sub_match<const char *> rowstr = cm[2]; return CellAddress(Spreadsheet::decodeRow(rowstr.str()), Spreadsheet::decodeColumn(colstr.str())); } else throw Base::Exception("Invalid cell specifier."); }