597 lines
19 KiB
C++
597 lines
19 KiB
C++
|
/* e_redraw.cpp
|
||
|
*
|
||
|
* Copyright (c) 1994-1996, Marko Macek
|
||
|
*
|
||
|
* You may distribute under the terms of either the GNU General Public
|
||
|
* License or the Artistic License, as specified in the README file.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "fte.h"
|
||
|
|
||
|
int EBuffer::GetMap(int Row, int *StateLen, hsState **StateMap) {
|
||
|
hlState State = 0;
|
||
|
|
||
|
Rehilit(Row);
|
||
|
|
||
|
*StateLen = LineChars(Row);
|
||
|
if (Row > 0) State = RLine(Row - 1)->StateE;
|
||
|
if (*StateLen > 0) {
|
||
|
PELine L = RLine(Row);
|
||
|
int ECol;
|
||
|
|
||
|
*StateMap = (hsState *) malloc(*StateLen);
|
||
|
if (*StateMap == 0) return 0;
|
||
|
|
||
|
#ifdef CONFIG_SYNTAX_HILIT
|
||
|
if (BFI(this, BFI_HilitOn) == 1 && HilitProc != 0)
|
||
|
HilitProc(this, Row, 0, 0, *StateLen, L, State, *StateMap, &ECol);
|
||
|
else
|
||
|
#endif
|
||
|
Hilit_Plain(this, Row, 0, 0, *StateLen, L, State, *StateMap, &ECol);
|
||
|
// if (L->StateE != State) {
|
||
|
// L->StateE = State;
|
||
|
// }
|
||
|
} else {
|
||
|
*StateLen = 1;
|
||
|
*StateMap = (hsState *) malloc(1);
|
||
|
if (*StateMap == 0) return 0;
|
||
|
(*StateMap)[0] = (hsState) (State & 0xFF);
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void EBuffer::FullRedraw() { // redraw all views
|
||
|
EView *V = View;
|
||
|
EEditPort *W;
|
||
|
|
||
|
while (V) {
|
||
|
W = GetViewVPort(V);
|
||
|
Draw(W->TP.Row, W->TP.Row + W->Rows);
|
||
|
V = V->Next;
|
||
|
if (V == View)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EBuffer::Hilit(int FromRow) {
|
||
|
if (FromRow != -1) {
|
||
|
if (StartHilit == -1)
|
||
|
StartHilit = FromRow;
|
||
|
else if (FromRow < StartHilit)
|
||
|
StartHilit = FromRow;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EBuffer::Rehilit(int ToRow) {
|
||
|
hlState State;
|
||
|
int HilitX;
|
||
|
PELine L;
|
||
|
int ECol;
|
||
|
|
||
|
if (StartHilit == -1) // all ok
|
||
|
return ;
|
||
|
|
||
|
if (BFI(this, BFI_MultiLineHilit) == 0) // everything handled in redisplay
|
||
|
return;
|
||
|
|
||
|
if (ToRow <= StartHilit) // will be handled in redisplay
|
||
|
return;
|
||
|
|
||
|
if (ToRow >= RCount)
|
||
|
ToRow = RCount;
|
||
|
|
||
|
HilitX = 1;
|
||
|
while ((StartHilit < RCount) && ((StartHilit < ToRow) || HilitX)) {
|
||
|
L = RLine(StartHilit);
|
||
|
|
||
|
HilitX = 0;
|
||
|
if (StartHilit > 0)
|
||
|
State = RLine(StartHilit - 1)->StateE;
|
||
|
else
|
||
|
State = 0;
|
||
|
|
||
|
if (BFI(this, BFI_HilitOn) == 1 && HilitProc != 0) {
|
||
|
HilitProc(this, StartHilit, 0, 0, 0, L, State, 0, &ECol);
|
||
|
} else {
|
||
|
Hilit_Plain(this, StartHilit, 0, 0, 0, L, State, 0, &ECol);
|
||
|
}
|
||
|
if (L->StateE != State) {
|
||
|
HilitX = 1;
|
||
|
L->StateE = State;
|
||
|
}
|
||
|
Draw(StartHilit, StartHilit); // ?
|
||
|
if (StartHilit > EndHilit)
|
||
|
EndHilit = StartHilit;
|
||
|
if (HilitX == 0) // jump over (can we always do this ?)
|
||
|
if (StartHilit < EndHilit) {
|
||
|
StartHilit = EndHilit;
|
||
|
}
|
||
|
StartHilit++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EBuffer::Draw(int Row0, int RowE) {
|
||
|
// printf("r0 = %d, re = %d\n", Row0, RowE);
|
||
|
// printf("m = %d, max = %d, rts = %d\n", MinRedraw, MaxRedraw, RedrawToEos);
|
||
|
if (Row0 == -1) Row0 = 0;
|
||
|
if ((Row0 < MinRedraw) || (MinRedraw == -1)) {
|
||
|
MinRedraw = Row0;
|
||
|
if (MaxRedraw == -1) MaxRedraw = MinRedraw;
|
||
|
}
|
||
|
if (RowE == -1) {
|
||
|
RedrawToEos = 1;
|
||
|
MaxRedraw = MinRedraw;
|
||
|
} else if (((RowE > MaxRedraw) || (MaxRedraw == -1)) && (RowE != -1))
|
||
|
MaxRedraw = RowE;
|
||
|
// printf("m = %d, max = %d, rts = %d\n", MinRedraw, MaxRedraw, RedrawToEos);
|
||
|
}
|
||
|
|
||
|
void EBuffer::DrawLine(TDrawBuffer B, int VRow, int C, int W, int &HilitX) {
|
||
|
hlState State;
|
||
|
int StartPos, EndPos;
|
||
|
|
||
|
HilitX = 0;
|
||
|
MoveChar(B, 0, W, ' ', hcPlain_Background, W);
|
||
|
// if ((VRow == VCount - 1) && !BFI(this, BFI_ForceNewLine)) {
|
||
|
// if (BFI(this, BFI_ShowMarkers))
|
||
|
// MoveChar(B, 0, W, EOF_MARKER, hcPlain_Markers, W);
|
||
|
// }
|
||
|
if (VRow < VCount) {
|
||
|
int Row = VToR(VRow);
|
||
|
PELine L = RLine(Row);
|
||
|
int ECol = 0;
|
||
|
|
||
|
if (Row > 0) State = RLine(Row - 1)->StateE;
|
||
|
else State = 0;
|
||
|
#ifdef CONFIG_SYNTAX_HILIT
|
||
|
if (BFI(this, BFI_HilitOn) == 1 && HilitProc != 0)
|
||
|
HilitProc(this, Row, B, C, W, L, State, 0, &ECol);
|
||
|
else
|
||
|
#endif
|
||
|
Hilit_Plain(this, Row, B, C, W, L, State, 0, &ECol);
|
||
|
if (L->StateE != State) {
|
||
|
HilitX = 1;
|
||
|
L->StateE = State;
|
||
|
}
|
||
|
if (BFI(this, BFI_ShowMarkers)) {
|
||
|
MoveChar(B, ECol - C, W, ConGetDrawChar((Row == RCount - 1) ? DCH_EOF : DCH_EOL), hcPlain_Markers, 1);
|
||
|
ECol += 1;
|
||
|
}
|
||
|
if (Row < RCount) {
|
||
|
int f;
|
||
|
int Folded = 0;
|
||
|
static char fold[20];
|
||
|
int l;
|
||
|
|
||
|
f = FindFold(Row);
|
||
|
if (f != -1) {
|
||
|
if (FF[f].open == 1) {
|
||
|
l = sprintf(fold, "[%d]", FF[f].level);
|
||
|
MoveStr(B, ECol - C + 1, W, fold, hcPlain_Folds, 10);
|
||
|
ECol += l;
|
||
|
} else {
|
||
|
if (VRow < VCount - 1) {
|
||
|
Folded = Vis(VRow + 1) - Vis(VRow) + 1;
|
||
|
} else if (VRow < VCount) {
|
||
|
Folded = RCount - (VRow + Vis(VRow));
|
||
|
}
|
||
|
l = sprintf(fold, "(%d:%d)", FF[f].level, Folded);
|
||
|
MoveStr(B, ECol - C + 1, W, fold, hcPlain_Folds, 10);
|
||
|
ECol += l;
|
||
|
MoveAttr(B, 0, W, hcPlain_Folds, W);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (BB.Row != -1 && BE.Row != -1 && Row >= BB.Row && Row <= BE.Row) {
|
||
|
switch(BlockMode) {
|
||
|
case bmLine:
|
||
|
StartPos = 0;
|
||
|
if (Row == BE.Row) EndPos = 0;
|
||
|
else EndPos = W;
|
||
|
break;
|
||
|
case bmColumn:
|
||
|
StartPos = BB.Col - C;
|
||
|
if (Row == BE.Row) EndPos = BB.Col - C;
|
||
|
else EndPos = BE.Col - C;
|
||
|
break;
|
||
|
case bmStream:
|
||
|
if (Row == BB.Row && Row == BE.Row) {
|
||
|
StartPos = BB.Col - C;
|
||
|
EndPos = BE.Col - C;
|
||
|
} else if (Row == BB.Row) {
|
||
|
StartPos = BB.Col - C;
|
||
|
EndPos = W;
|
||
|
} else if (Row == BE.Row) {
|
||
|
StartPos = 0;
|
||
|
EndPos = BE.Col - C;
|
||
|
} else {
|
||
|
StartPos = 0;
|
||
|
EndPos = W;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
StartPos = EndPos = 0;
|
||
|
break;
|
||
|
}
|
||
|
if (BFI(this, BFI_SeeThruSel))
|
||
|
MoveBgAttr(B, StartPos, W, hcPlain_Selected, EndPos - StartPos);
|
||
|
else
|
||
|
MoveAttr(B, StartPos, W, hcPlain_Selected, EndPos - StartPos);
|
||
|
}
|
||
|
if (Match.Row != -1 && Match.Col != -1) {
|
||
|
if (Row == Match.Row) {
|
||
|
if (BFI(this, BFI_SeeThruSel))
|
||
|
MoveBgAttr(B, Match.Col - C, W, hcPlain_Found, MatchLen);
|
||
|
else
|
||
|
MoveAttr(B, Match.Col - C, W, hcPlain_Found, MatchLen);
|
||
|
}
|
||
|
}
|
||
|
} else if (VRow == VCount) {
|
||
|
if (BFI(this, BFI_ShowMarkers))
|
||
|
MoveChar(B, 0, W, ConGetDrawChar(DCH_END), hcPlain_Markers, W);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EBuffer::Redraw() {
|
||
|
int HilitX;
|
||
|
EView *V;
|
||
|
EEditPort *W;
|
||
|
int Row;
|
||
|
TDrawBuffer B;
|
||
|
char s[256];
|
||
|
ChColor SColor;
|
||
|
int RowA, RowZ;
|
||
|
|
||
|
{
|
||
|
int W1, H1;
|
||
|
if (!(View && View->MView))
|
||
|
return;
|
||
|
View->MView->ConQuerySize(&W1, &H1);
|
||
|
|
||
|
if (H1 < 1 || W1 < 1) return;
|
||
|
}
|
||
|
// printf("Redraw\n");
|
||
|
if (CP.Row >= VCount) CP.Row = VCount - 1;
|
||
|
if (CP.Row < 0) CP.Row = 0;
|
||
|
|
||
|
CheckBlock();
|
||
|
V = View; /* check some window data */
|
||
|
if (!V) {
|
||
|
MinRedraw = MaxRedraw = -1;
|
||
|
RedrawToEos = 0;
|
||
|
return;
|
||
|
}
|
||
|
if (View == 0 || View->MView == 0 || View->MView->Win == 0)
|
||
|
return ;
|
||
|
|
||
|
for ( ; V; V = V->NextView) {
|
||
|
// printf("Checking\x7\n");
|
||
|
if (V->Model != this)
|
||
|
assert(1 == 0);
|
||
|
|
||
|
W = GetViewVPort(V);
|
||
|
|
||
|
if (W->Rows < 1 || W->Cols < 1)
|
||
|
continue;
|
||
|
|
||
|
if (V == View) {
|
||
|
int scrollJumpX = Min(ScrollJumpX, W->Cols / 2);
|
||
|
int scrollJumpY = Min(ScrollJumpY, W->Rows / 2);
|
||
|
int scrollBorderX = Min(ScrollBorderX, W->Cols / 2);
|
||
|
int scrollBorderY = Min(ScrollBorderY, W->Rows / 2);
|
||
|
|
||
|
W->CP = CP;
|
||
|
TP = W->TP;
|
||
|
|
||
|
if (W->ReCenter) {
|
||
|
W->TP.Row = CP.Row - W->Rows / 2;
|
||
|
W->TP.Col = CP.Col - W->Cols + 8;
|
||
|
W->ReCenter = 0;
|
||
|
}
|
||
|
|
||
|
if (W->TP.Row + scrollBorderY > CP.Row) W->TP.Row = CP.Row - scrollJumpY + 1 - scrollBorderY;
|
||
|
if (W->TP.Row + W->Rows - scrollBorderY <= CP.Row) W->TP.Row = CP.Row - W->Rows + 1 + scrollJumpY - 1 + scrollBorderY;
|
||
|
if (!WeirdScroll)
|
||
|
if (W->TP.Row + W->Rows >= VCount) W->TP.Row = VCount - W->Rows;
|
||
|
if (W->TP.Row < 0) W->TP.Row = 0;
|
||
|
|
||
|
if (W->TP.Col + scrollBorderX > CP.Col) W->TP.Col = CP.Col - scrollJumpX - scrollBorderX;
|
||
|
if (W->TP.Col + W->Cols - scrollBorderX <= CP.Col) W->TP.Col = CP.Col - W->Cols + scrollJumpX + scrollBorderX;
|
||
|
if (W->TP.Col < 0) W->TP.Col = 0;
|
||
|
|
||
|
if (W->OldTP.Row != -1 && W->OldTP.Col != -1 && RedrawToEos == 0) {
|
||
|
|
||
|
if ((W->OldTP.Row != W->TP.Row) || (W->OldTP.Col != W->TP.Col)) {
|
||
|
int A, B;
|
||
|
int DeltaX, DeltaY;
|
||
|
int Rows = W->Rows;
|
||
|
int Delta1 = 0, Delta2 = 0;
|
||
|
|
||
|
DeltaY = W->TP.Row - W->OldTP.Row ;
|
||
|
DeltaX = W->TP.Col - W->OldTP.Col;
|
||
|
|
||
|
if ((DeltaX == 0) && (-Rows < DeltaY) && (DeltaY < Rows)) {
|
||
|
if (DeltaY < 0) {
|
||
|
W->ScrollY(DeltaY);
|
||
|
A = W->TP.Row;
|
||
|
B = W->TP.Row - DeltaY;
|
||
|
} else {
|
||
|
W->ScrollY(DeltaY);
|
||
|
A = W->TP.Row + Rows - DeltaY;
|
||
|
B = W->TP.Row + Rows;
|
||
|
}
|
||
|
} else {
|
||
|
A = W->TP.Row;
|
||
|
B = W->TP.Row + W->Rows;
|
||
|
}
|
||
|
if (A >= VCount) {
|
||
|
Delta1 = A - VCount + 1;
|
||
|
A = VCount - 1;
|
||
|
}
|
||
|
if (B >= VCount) {
|
||
|
Delta2 = B - VCount + 1;
|
||
|
B = VCount - 1;
|
||
|
}
|
||
|
if (A < 0) A = 0;
|
||
|
if (B < 0) B = 0;
|
||
|
Draw(VToR(A) + Delta1, VToR(B) + Delta2);
|
||
|
}
|
||
|
} else {
|
||
|
int A = W->TP.Row;
|
||
|
int B = A + W->Rows;
|
||
|
int Delta = 0;
|
||
|
|
||
|
if (B > VCount) {
|
||
|
Delta += B - VCount;
|
||
|
B = VCount;
|
||
|
}
|
||
|
int LastV = VToR(VCount - 1);
|
||
|
int B1 = (B == VCount) ? RCount : VToR(B);
|
||
|
|
||
|
if (B1 >= LastV) {
|
||
|
Delta += B1 - LastV;
|
||
|
B1 = LastV;
|
||
|
}
|
||
|
if (B1 < 0) B1 = 0;
|
||
|
Draw(VToR(A), B1 + Delta);
|
||
|
}
|
||
|
|
||
|
W->OldTP = W->TP;
|
||
|
TP = W->TP;
|
||
|
}
|
||
|
if (W->CP.Row >= VCount) W->CP.Row = VCount - 1;
|
||
|
if (W->CP.Row < 0) W->CP.Row = 0;
|
||
|
if (W->TP.Row > W->CP.Row) W->TP.Row = W->CP.Row;
|
||
|
if (W->TP.Row < 0) W->TP.Row = 0;
|
||
|
|
||
|
if (V->MView->IsActive()) // hack
|
||
|
SColor = hcStatus_Active;
|
||
|
else
|
||
|
SColor = hcStatus_Normal;
|
||
|
MoveChar(B, 0, W->Cols, ' ', SColor, W->Cols);
|
||
|
|
||
|
if (V->MView->Win->GetViewContext() == V->MView) {
|
||
|
V->MView->Win->SetSbVPos(W->TP.Row, W->Rows, VCount + (WeirdScroll ? W->Rows - 1 : 0));
|
||
|
V->MView->Win->SetSbHPos(W->TP.Col, W->Cols, 1024 + (WeirdScroll ? W->Cols - 1 : 0));
|
||
|
}
|
||
|
|
||
|
if (V->CurMsg == 0) {
|
||
|
{
|
||
|
int CurLine = W->CP.Row;
|
||
|
int ActLine = VToR(W->CP.Row);
|
||
|
int CurColumn = W->CP.Col;
|
||
|
int CurPos = CharOffset(RLine(ActLine), CurColumn);
|
||
|
int NumLines = RCount;
|
||
|
int NumChars = RLine(ActLine)->Count;
|
||
|
// int NumColumns = ScreenPos(Line(CurLine), NumChars);
|
||
|
char *fName = FileName;
|
||
|
unsigned char CurCh = 0xFF;
|
||
|
int lf = strlen(fName);
|
||
|
char CCharStr[20] = "";
|
||
|
|
||
|
if (lf > 34) fName += lf - 34;
|
||
|
|
||
|
if (CurPos < NumChars) {
|
||
|
CurCh = VLine(CurLine)->Chars[CurPos];
|
||
|
sprintf(CCharStr, "%3u,%02X", CurCh, CurCh);
|
||
|
} else {
|
||
|
if (CurPos > NumChars) strcpy(CCharStr, " ");
|
||
|
else if (CurLine < NumLines - 1) strcpy(CCharStr, " EOL");
|
||
|
else strcpy(CCharStr, " EOF");
|
||
|
}
|
||
|
|
||
|
sprintf(s, "%04d:%02d %c%c%c%c%c %.6s %c"
|
||
|
#ifdef DOS
|
||
|
" %lu "
|
||
|
#endif
|
||
|
,
|
||
|
// CurLine + 1,
|
||
|
ActLine + 1,
|
||
|
CurColumn + 1,
|
||
|
// CurPos + 1,
|
||
|
(BFI(this, BFI_Insert)) ? 'I' : ' ',
|
||
|
(BFI(this, BFI_AutoIndent)) ? 'A' : ' ',
|
||
|
// (BFI(this, BFI_ExpandTabs))?'T':' ',
|
||
|
(BFI(this, BFI_MatchCase)) ? 'C' : ' ',
|
||
|
AutoExtend ?
|
||
|
(
|
||
|
(BlockMode == bmStream) ? 's' :
|
||
|
(BlockMode == bmLine) ? 'l' : 'c'
|
||
|
) :
|
||
|
((BlockMode == bmStream) ? 'S' :
|
||
|
(BlockMode == bmLine) ? 'L': 'C'
|
||
|
),
|
||
|
#ifdef CONFIG_WORDWRAP
|
||
|
(BFI(this, BFI_WordWrap) == 3) ? 't' :
|
||
|
(BFI(this, BFI_WordWrap) == 2) ? 'W' :
|
||
|
(BFI(this, BFI_WordWrap) == 1) ? 'w' :
|
||
|
' ',
|
||
|
#endif
|
||
|
// (BFI(this, BFI_Undo))?'U':' ',
|
||
|
// (BFI(this, BFI_Trim))?'E':' ',
|
||
|
// (Flags.KeepBackups)?'B':' ',
|
||
|
Mode->fName,
|
||
|
(Modified != 0)?'*':(BFI(this, BFI_ReadOnly))?'%':' '
|
||
|
#ifdef DOS
|
||
|
,coreleft()
|
||
|
#endif
|
||
|
);
|
||
|
|
||
|
int l = strlen(s);
|
||
|
int fw = W->Cols - l;
|
||
|
int fl = strlen(FileName);
|
||
|
char num[10];
|
||
|
|
||
|
MoveStr(B, 0, W->Cols, s, SColor, W->Cols);
|
||
|
sprintf(num, " %s %d", CCharStr, ModelNo);
|
||
|
MoveStr(B, W->Cols - strlen(num), W->Cols, num, SColor, W->Cols);
|
||
|
|
||
|
fw -= strlen(num);
|
||
|
|
||
|
if (fl > fw) {
|
||
|
MoveStr(B, l, W->Cols, FileName + fl - fw, SColor, W->Cols);
|
||
|
} else {
|
||
|
MoveStr(B, l, W->Cols, FileName, SColor, W->Cols);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
MoveStr(B, 0, W->Cols, V->CurMsg, SColor, W->Cols);
|
||
|
}
|
||
|
if (V->MView->Win->GetStatusContext() == V->MView) {
|
||
|
V->MView->ConPutBox(0, W->Rows, W->Cols, 1, B);
|
||
|
if (V->MView->IsActive()) {
|
||
|
V->MView->ConShowCursor();
|
||
|
V->MView->ConSetCursorPos(W->CP.Col - W->TP.Col, W->CP.Row - W->TP.Row);
|
||
|
if (BFI(this, BFI_Insert)) {
|
||
|
V->MView->ConSetCursorSize(CursorInsSize[0], CursorInsSize[1]);
|
||
|
} else {
|
||
|
V->MView->ConSetCursorSize(CursorOverSize[0], CursorOverSize[1]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rehilit(VToR(CP.Row));
|
||
|
|
||
|
if (BFI(this, BFI_AutoHilitParen) == 1) {
|
||
|
if (Match.Row == -1 && Match.Col == -1)
|
||
|
HilitMatchBracket();
|
||
|
}
|
||
|
|
||
|
// if ((Window == WW) && (MinRedraw == -1))
|
||
|
// MaxRedraw = MinRedraw = VToR(CP.Row);
|
||
|
|
||
|
//printf("\n\nMinRedraw = %d, MaxRedraw = %d", MinRedraw, MaxRedraw);
|
||
|
if (MinRedraw == -1)
|
||
|
return;
|
||
|
|
||
|
// printf("Will redraw: %d to %d, to eos = %d\n", MinRedraw, MaxRedraw, RedrawToEos);
|
||
|
if (MinRedraw >= VCount) MinRedraw = VCount - 1;
|
||
|
if (MinRedraw < 0) MinRedraw = 0;
|
||
|
// puts("xxx\x7");
|
||
|
// printf("%d\n", MinRedraw);
|
||
|
Row = RowA = RToVN(MinRedraw);
|
||
|
// puts("xxx\x7");
|
||
|
RowZ = MaxRedraw;
|
||
|
if (MaxRedraw != -1) {
|
||
|
int Delta = 0;
|
||
|
|
||
|
if (MaxRedraw >= RCount) {
|
||
|
Delta = MaxRedraw - RCount + 1;
|
||
|
MaxRedraw = RCount - 1;
|
||
|
}
|
||
|
if (MaxRedraw < 0) MaxRedraw = 0;
|
||
|
// printf("%d\n", MaxRedraw);
|
||
|
RowZ = RToVN(MaxRedraw) + Delta;
|
||
|
}
|
||
|
// puts("xxx\x7");
|
||
|
//printf("\nRowA = %d, RowZ = %d", RowA, RowZ);
|
||
|
|
||
|
V = View;
|
||
|
while (V) {
|
||
|
if (V->Model != this)
|
||
|
assert(1 == 0);
|
||
|
|
||
|
W = GetViewVPort(V);
|
||
|
|
||
|
for (int R = W->TP.Row; R < W->TP.Row + W->Rows; R++) {
|
||
|
Row = R;
|
||
|
if ((Row >= RowA) &&
|
||
|
(RedrawToEos || Row <= RowZ))
|
||
|
{
|
||
|
DrawLine(B, Row, W->TP.Col, W->Cols, HilitX);
|
||
|
W->DrawLine(Row, B);
|
||
|
if (HilitX && Row == RowZ)
|
||
|
RowZ++;
|
||
|
}
|
||
|
}
|
||
|
V = V->NextView;
|
||
|
}
|
||
|
MinRedraw = MaxRedraw = -1;
|
||
|
RedrawToEos = 0;
|
||
|
}
|
||
|
|
||
|
int EBuffer::GetHilitWord(int len, char *str, ChColor &clr, int IgnCase) {
|
||
|
char *p;
|
||
|
|
||
|
if (Mode == 0 || Mode->fColorize == 0)
|
||
|
return 0;
|
||
|
|
||
|
if (len >= CK_MAXLEN)
|
||
|
return 0;
|
||
|
|
||
|
#ifdef CONFIG_WORD_HILIT
|
||
|
{
|
||
|
char s[CK_MAXLEN + 1];
|
||
|
s[CK_MAXLEN] = 0;
|
||
|
memcpy(s, str, len);
|
||
|
s[len] = 0;
|
||
|
if (HilitFindWord(s)) {
|
||
|
clr = hcPlain_HilitWord;
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
if (len < 1) return 0;
|
||
|
p = Mode->fColorize->Keywords.key[len];
|
||
|
if (IgnCase) {
|
||
|
while (p && *p) {
|
||
|
if (strnicmp(p, str, len) == 0) {
|
||
|
clr = p[len];
|
||
|
return 1;
|
||
|
}
|
||
|
p += len + 1;
|
||
|
}
|
||
|
} else {
|
||
|
while (p && *p) {
|
||
|
if (memcmp(p, str, len) == 0) {
|
||
|
clr = p[len];
|
||
|
return 1;
|
||
|
}
|
||
|
p += len + 1;
|
||
|
}
|
||
|
}
|
||
|
if (0 && len < 128) { // disabled
|
||
|
char s[128];
|
||
|
|
||
|
memcpy(s, str, len);
|
||
|
s[len] = 0;
|
||
|
if (TagDefined(s)) {
|
||
|
//clr = 0x0A;
|
||
|
clr = Mode->fColorize->Colors[CLR_HexNumber];
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
EEditPort *EBuffer::GetViewVPort(EView *V) {
|
||
|
return (EEditPort *)V->Port;
|
||
|
}
|
||
|
|
||
|
EEditPort *EBuffer::GetVPort() {
|
||
|
return (EEditPort *)View->Port;
|
||
|
}
|