📄 spreadwi.cpp
字号:
AccRange * ar;
if(!isColMark || !m_range || !m_range[0]){
InfoBox("No columns selected!");
return false;
}
Undo.DataObject(Disp, w, this, 0L, 0L);
Undo.String(0L, &m_range, UNDO_CONTINUE);
if(!(ar = new AccRange(m_range))) return false;
ar->BoundRec(&rc);
if(!(cs = (lfPOINT*)malloc((rc.right-rc.left+2)*sizeof(lfPOINT)))) {
delete ar; return false;
}
if(!(ar->GetFirst(&c0, &r0))) {
free(cs); delete ar; return false;
}
ar->NextCol(&c1); cn = c1; nc = 0;
do {
for(c0 = c1 = c2 = cn; ar->NextCol(&c2); ) {
if(c2 > c1+1 || c2 < c0) break;
c1 = c2;
}
dc = c1-c0+1; cn = c2;
cs[nc].fx = c0; cs[nc].fy = c1; nc++;
}while(c2!=c1);
SortFpArray(nc, cs); nc--;
do {
c0 = (int)cs[nc].fx; c1 = (int)cs[nc].fy; dc = c1-c0+1;
if(AddCols(cCols + dc)) for(i = 0; i < cRows; i++) {
for(j = cCols-1; j >= c0+dc; j--) {
if(etRows && etRows[i] && etRows[i][j] && etRows[i][j-dc]) {
switch(etRows[i][j-dc]->type) {
default:
etRows[i][j]->SetText(etRows[i][j-dc]->text);
break;
case ET_VALUE:
etRows[i][j]->SetText(etRows[i][j-dc]->text);
etRows[i][j]->Value = etRows[i][j-dc]->Value;
etRows[i][j]->type = ET_VALUE;
break;
case ET_FORMULA:
MoveFormula(this, etRows[i][j-dc]->text, TmpTxt, dc, 0, -1, c0);
etRows[i][j]->SetText(TmpTxt); etRows[i][j]->type = ET_FORMULA;
break;
}
etRows[i][j-dc]->SetText("");
}
}
}
MoveFormula(this, m_range, TmpTxt, dc, 0, -1, c0);
strcpy(m_range, TmpTxt); nc--;
for(i = 0; i < c0; i++) for(j = 0; j < c0; j++) {
if(etRows && etRows[i] && etRows[i][j] && etRows[i][j]->type == ET_FORMULA) {
MoveFormula(this, etRows[i][j]->text, TmpTxt, dc, 0, -1, c0);
etRows[i][j]->SetText(TmpTxt); etRows[i][j]->type = ET_FORMULA;
}
}
}while(nc >= 0);
delete ar;
Disp->Command(CMD_SETSCROLL, 0L, w); Disp->Command(CMD_MRK_DIRTY, 0L, w);
return true;
}
bool
SpreadData::DeleteRows()
{
int i, j, r0, c0, r1, r2, rn, dr, nr;
AccRange * ar;
RECT rc;
lfPOINT *rs;
if(!isRowMark || !m_range || !m_range[0]){
InfoBox("No rows selected!");
return false;
}
Undo.DataObject(Disp, w, this, 0L, 0L);
Undo.String(0L, &m_range, UNDO_CONTINUE);
if(!(ar = new AccRange(m_range))) return false;
ar->BoundRec(&rc);
if(!(rs = (lfPOINT*)malloc((rc.bottom-rc.top+2)*sizeof(lfPOINT)))) {
delete ar; return false;
}
if(!(ar->GetFirst(&c0, &r0))) {
free(rs); delete ar; return false;
}
ar->NextRow(&r1); rn = r1; nr = 0;
do {
for(r0 = r1 = r2 = rn;ar->NextRow(&r2); ) {
if(r2 > r1+1 || r2 < r0) break;
r1 = r2;
}
dr = r1-r0+1; rn = r2;
rs[nr].fx = r0; rs[nr].fy = r1; nr++;
}while(r2!=r1);
SortFpArray(nr, rs); nr--;
do {
r0 = (int)rs[nr].fx; r1 = (int)rs[nr].fy; dr = r1-r0+1;
for(i = r0+dr; i < cRows; i++) {
for(j = 0; j < cCols; j++) {
if(etRows && etRows[i-dr] && etRows[i-dr][j] && etRows[i] && etRows[i][j]) {
switch(etRows[i][j]->type) {
default:
etRows[i-dr][j]->SetText(etRows[i][j]->text);
break;
case ET_VALUE:
etRows[i-dr][j]->SetText(etRows[i][j]->text);
etRows[i-dr][j]->Value = etRows[i][j]->Value;
etRows[i-dr][j]->type = ET_VALUE;
break;
case ET_FORMULA:
MoveFormula(this, etRows[i][j]->text, TmpTxt, 0, -dr, r0, -1);
etRows[i-dr][j]->SetText(TmpTxt); etRows[i-dr][j]->type = ET_FORMULA;
break;
}
}
}
}
for(i = cRows-1; i >= cRows-dr; i--) {
if(etRows[i]){
for(j = 0; j < cCols; j++) if(etRows[i][j]) delete(etRows[i][j]);
free(etRows[i]);
}
}
cRows -= dr;
MoveFormula(this, m_range, TmpTxt, 0, -dr, r0+1, -1);
strcpy(m_range, TmpTxt); nr--;
for(i = 0; i < r0; i++) for(j = 0; j < cCols; j++) {
if(etRows && etRows[i] && etRows[i][j] && etRows[i][j]->type == ET_FORMULA) {
MoveFormula(this, etRows[i][j]->text, TmpTxt, 0, -dr, r0, -1);
etRows[i][j]->SetText(TmpTxt); etRows[i][j]->type = ET_FORMULA;
}
}
}while(nr >= 0);
delete ar;
if(w) {
Disp->Command(CMD_SETSCROLL, 0L, w); Disp->Command(CMD_MRK_DIRTY, 0L, w);
}
return true;
}
bool
SpreadData::InsertRows()
{
int i, j, r0, c0, r1, r2, rn, dr, nr;
AccRange * ar;
RECT rc;
lfPOINT *rs;
if(!isRowMark || !m_range || !m_range[0]){
InfoBox("No rows selected!");
return false;
}
Undo.DataObject(Disp, w, this, 0L, 0L);
Undo.String(0L, &m_range, UNDO_CONTINUE);
if(!(ar = new AccRange(m_range))) return false;
ar->BoundRec(&rc);
if(!(rs = (lfPOINT*)malloc((rc.bottom-rc.top+2)*sizeof(lfPOINT)))) {
delete ar; return false;
}
if(!(ar->GetFirst(&c0, &r0))) {
free(rs); delete ar; return false;
}
ar->NextRow(&r1); rn = r1; nr = 0;
do {
for(r0 = r1 = r2 = rn;ar->NextRow(&r2); ) {
if(r2 > r1+1 || r2 < r0) break;
r1 = r2;
}
dr = r1-r0+1; rn = r2;
rs[nr].fx = r0; rs[nr].fy = r1; nr++;
}while(r2!=r1);
SortFpArray(nr, rs); nr--;
do {
r0 = (int)rs[nr].fx; r1 = (int)rs[nr].fy; dr = r1-r0+1;
if(AddRows(cRows + dr)) for(i = cRows-1; i >= r0+dr; i--) {
for(j = 0; j < cCols; j++) {
if(etRows && etRows[i-dr] && etRows[i-dr][j] && etRows[i] && etRows[i][j]) {
switch(etRows[i-dr][j]->type) {
default:
etRows[i][j]->SetText(etRows[i-dr][j]->text);
break;
case ET_VALUE:
etRows[i][j]->SetText(etRows[i-dr][j]->text);
etRows[i][j]->Value = etRows[i-dr][j]->Value;
etRows[i][j]->type = ET_VALUE;
break;
case ET_FORMULA:
MoveFormula(this, etRows[i-dr][j]->text, TmpTxt, 0, dr, r0, -1);
etRows[i][j]->SetText(TmpTxt); etRows[i][j]->type = ET_FORMULA;
break;
}
etRows[i-dr][j]->SetText("");
}
}
}
MoveFormula(this, m_range, TmpTxt, 0, dr, r0, -1);
strcpy(m_range, TmpTxt); nr--;
for(i = 0; i < r0; i++) for(j = 0; j < cCols; j++) {
if(etRows && etRows[i] && etRows[i][j] && etRows[i][j]->type == ET_FORMULA) {
MoveFormula(this, etRows[i][j]->text, TmpTxt, 0, dr, r0, -1);
etRows[i][j]->SetText(TmpTxt); etRows[i][j]->type = ET_FORMULA;
}
}
}while(nr >= 0);
delete ar;
if(w) {
sprintf(TmpTxt, "%d00", cRows);
w->oGetTextExtent(TmpTxt, 0, &i, &j);
if(i > FirstWidth) FirstWidth = i;
Disp->Command(CMD_SETSCROLL, 0L, w); Disp->Command(CMD_MRK_DIRTY, 0L, w);
}
return true;
}
voidSpreadData::DoPlot(anyOutput *o){ RECT rc; int i, j, r, c; AccRange *ar; if(!w || !Disp) return; w->Erase(0x00e8e8e8L); w->ActualSize(&rc); w->SetTextSpec(&ssText); et_racc = 0L;
r_disp = (rc.bottom-rc.top)/CellHeight; c_disp = (rc.right-rc.left)/CellWidth+1; Disp->ShowGrid(CellWidth, CellHeight, FirstWidth, &currpos); rc.top = w->MenuHeight; rc.bottom = rc.top + CellHeight; for(i = 0; i <= (cRows - Disp->ssOrg.y) && i <= r_disp; i++) { rc.left = FirstWidth; rc.right = rc.left + CellWidth; rc.top += CellHeight; rc.bottom += CellHeight; for(j = 0; j <= (cCols - Disp->ssOrg.x) && j <= c_disp; j++) { r = i + Disp->ssOrg.y; c = j + Disp->ssOrg.x; if(r < cRows && r >= 0 && c < cCols && c >=0 && etRows[r][c]){ etRows[r][c]->SetRec(&rc); etRows[r][c]->Update(2, 0L, 0L);
etRows[r][c]->Redraw(w, false);
} rc.left += CellWidth; rc.right += CellWidth; }
} if(bUpdate) {
for(i = 0; i <= (cRows - Disp->ssOrg.y) && i <= r_disp; i++) {
for(j = 0; j <= (cCols - Disp->ssOrg.x) && j <= c_disp; j++) {
r = i + Disp->ssOrg.y; c = j + Disp->ssOrg.x;
if(r < cRows && r >= 0 && c < cCols && c >=0 && etRows[r][c]){
etRows[r][c]->Redraw(w, false);
}
}
}
}
if(CurrText && CurrText->row >= Disp->ssOrg.y && CurrText->row < (Disp->ssOrg.y + r_disp)
&& CurrText->col >= Disp->ssOrg.x && CurrText->col < (Disp->ssOrg.x +c_disp))
CurrText->Update(1, w, 0L);
bUpdate = false;
if(m_range && (ar = new AccRange(m_range)) && ar->GetFirst(&c, &r)) { for( ; ar->GetNext(&c, &r); ) { if(r >= Disp->ssOrg.y && r < (r_disp + Disp->ssOrg.y) && c >= Disp->ssOrg.x
&& r < cRows && c < cCols && c < (c_disp + Disp->ssOrg.x) && etRows[r] && etRows[r][c]) etRows[r][c]->Mark(w, etRows[r][c] != CurrText ? 2 : 3); } delete (ar); }
if(c_range) InitCopy(0, 0L, w); //move animated rectangle w->ActualSize(&rc); rc.bottom += CellHeight; w->UpdateRect(&rc, false); if(err_msg && (!last_err || strcmp(err_msg,last_err))) {
ErrorBox(last_err = err_msg);
}}boolSpreadData::DelRange(){ AccRange *ar; int r, c;
RECT rec; if(m_range && (ar = new AccRange(m_range)) && ar->GetFirst(&c, &r)) {
ar->BoundRec(&rec); Undo.DataObject(Disp, w, this, &rec, 0L);
while(ar->GetNext(&c, &r)) { if(r >= 0 && r < cRows && c >= 0 && c < cCols){ if(etRows[r][c] && etRows[r][c]->text) etRows[r][c]->SetText(""); } } delete (ar); HideTextCursor(); }
HideMark(false); if(CurrText) CurrText->Update(1, w, 0L);
bCopyCut = false;
return true;}boolSpreadData::PasteRange(int cmd, char *txt){ AccRange *cr; int i, r, c; RECT mrk_range; if(new_mark && m_range && (cr = new AccRange(m_range)) && cr->GetFirst(&c, &r)) { cr->BoundRec(&mrk_range); for(i = 0 ; cr->GetNext(&c, &r); i++) if(c >= 0 && c < cCols && r >= 0 && r < cRows){ currpos.x = c; currpos.y = r; switch(cmd){ case CMD_PASTE_TSV: ReadTSV(0L, (unsigned char*)txt, FF_TSV); break; case CMD_PASTE_SSV: ReadTSV(0L, (unsigned char*)txt, FF_SSV); break;
case CMD_PASTE_XML: ReadXML(0L, (unsigned char*)txt, FF_XML, i ? UNDO_CONTINUE : 0L); break; case CMD_PASTE_CSV: ReadData(0L, (unsigned char*)txt, FF_CSV); break; } if((mrk_range.right - mrk_range.left) == (cp_src_rec.right - cp_src_rec.left) && (mrk_range.bottom - mrk_range.top) == (cp_src_rec.bottom - cp_src_rec.top)) break; if((mrk_range.right - mrk_range.left) == 1 && (cp_src_rec.right - cp_src_rec.left) > 1) break; if((mrk_range.bottom - mrk_range.top) == 1 && (cp_src_rec.bottom - cp_src_rec.top) > 1) break; } delete cr; return true; } else switch(cmd){ case CMD_PASTE_TSV: return ReadTSV(0L, (unsigned char*)txt, FF_TSV); case CMD_PASTE_SSV:
return ReadTSV(0L, (unsigned char*)txt, FF_SSV);
case CMD_PASTE_XML: return ReadXML(0L, (unsigned char*)txt, FF_XML, 0L); case CMD_PASTE_CSV: return ReadData(0L, (unsigned char*)txt, FF_CSV); } return bCopyCut = false;}boolSpreadData::InitCopy(int cmd, void *tmpl, anyOutput *o){ int r, c; AccRange *ar; RECT rc_band; bool bRet = false; if(cmd) { bCopyCut = (cmd == CMD_CUT); if(rcCopy.right > cCols) rcCopy.right = cCols; if(rcCopy.bottom > cRows) rcCopy.bottom = cRows;
new_mark = false; if(m_range && m_range[0]) { if(c_range) free(c_range); c_range = strdup(m_range); if(c_range && (ar = new AccRange(c_range))) { ar->BoundRec(&rcCopy); delete ar; bRet = true;; } }
else if (CurrText) {
if(CurrText->hasMark()) return CurrText->Command(CMD_COPY, o, 0L);
else {
if(m_range) free(m_range); m_range=0L;
sprintf(TmpTxt, "%s%d:%s%d", Int2ColLabel(currpos.x, false), currpos.y+1,
Int2ColLabel(currpos.x, false), currpos.y+1);
m_range = strdup(TmpTxt); DoPlot(o);
return InitCopy(cmd, tmpl, o);
}
} } if(bRet || !cmd) { //calculate animated mark if(rcCopy.right < Disp->ssOrg.x || rcCopy.bottom < Disp->ssOrg.y) { HideCopyMark(); return bRet; } c = rcCopy.left >= Disp->ssOrg.x ? rcCopy.left : Disp->ssOrg.x; r = rcCopy.top >= Disp->ssOrg.y ? rcCopy.top : Disp->ssOrg.y;
while(!etRows[r] && r) r--; while(!etRows[r][c] && c) c--; if(etRows[r][c]){ rc_band.left = etRows[r][c]->GetX()-1; rc_band.top = etRows[r][c]->GetY()-1; } else return bRet; c = rcCopy.right < (Disp->ssOrg.x + c_disp) ? rcCopy.right : Disp->ssOrg.x + c_disp; r = rcCopy.bottom < (Disp->ssOrg.y + r_disp)? rcCopy.bottom : Disp->ssOrg.y + r_disp;
if(r >= cRows) r = cRows-1; if(c >= cCols) c = cRows -1; if(etRows[r][c]){ rc_band.right = etRows[r][c]->GetX()+CellWidth; rc_band.bottom = etRows[r][c]->GetY()+CellHeight;
if(rc_band.left >= rc_band.right) rc_band.right = rc_band.left + CellWidth;
if(rc_band.top >= rc_band.bottom) rc_band.bottom = rc_band.top + CellHeight; ShowCopyMark(o, &rc_band, 1); } } return bRet;}
bool
SpreadData::SavePos()
{
bool bRet = false;
if(pos_info.currpos.x != currpos.x || pos_info.currpos.y != pos_info.currpos.y
|| CurrText != pos_info.CurrText) {
Undo.Point(Disp, &currpos, w, UNDO_CONTINUE);
Undo.VoidPtr(Disp, (void**)&CurrText, 0L, 0L, UNDO_CONTINUE);
}
if(pos_info.ssOrg.x != Disp->ssOrg.x || pos_info.ssOrg.y != Disp->ssOrg.y) {
Swap(pos_info.ssOrg.x, Disp->ssOrg.x ); Swap(pos_info.ssOrg.y, Disp->ssOrg.y );
Undo.Point(Disp, &Disp->ssOrg, w, UNDO_CONTINUE);
Swap(pos_info.ssOrg.x, Disp->ssOrg.x ); Swap(pos_info.ssOrg.y, Disp->ssOrg.y );
}
pos_info.currpos.x = currpos.x; pos_info.currpos.y = currpos.y;
pos_info.ssOrg.x = Disp->ssOrg.x; pos_info.ssOrg.y = Disp->ssOrg.y;
pos_info.CurrText = CurrText;
return bRet;
}boolSpreadData::Command(int cmd, void *tmpl, anyOutput *o){ int i; static int move_cr = CMD_CURRDOWN; MouseEvent *mev; POINT p, cp; if(!o) o = w; switch(cmd) { case CMD_MOUSE_EVENT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -