⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spreadwi.cpp

📁 Linux/windows 环境下跨平台开发程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -