int FarEditor::editorEvent(int event, void *param) { // ignore event if (event != EE_REDRAW || (event == EE_REDRAW && param == EEREDRAW_ALL && inRedraw)){ return 0; } enterHandler(); WindowSizeX = ei.WindowSizeX; WindowSizeY = ei.WindowSizeY; baseEditor->visibleTextEvent(ei.TopScreenLine, WindowSizeY); baseEditor->lineCountEvent(ei.TotalLines); if (param == EEREDRAW_CHANGE){ int ml = (prevLinePosition < ei.CurLine ? prevLinePosition : ei.CurLine)-1; if (ml < 0){ ml = 0; } if (blockTopPosition != -1 && ml > blockTopPosition){ ml = blockTopPosition; } baseEditor->modifyEvent(ml); }; prevLinePosition = ei.CurLine; blockTopPosition = -1; if (ei.BlockType != BTYPE_NONE){ blockTopPosition = ei.BlockStartLine; } // hack against tabs in FAR's editor EditorConvertPos ecp {}, ecp_cl {}; ecp.StringNumber = -1; ecp.SrcPos = ei.CurPos; info->EditorControl(ECTL_REALTOTAB, &ecp); delete cursorRegion; cursorRegion = nullptr; if (rdBackground == nullptr){ throw Exception(DString("HRD Background region 'def:Text' not found")); } for (int lno = ei.TopScreenLine; lno < ei.TopScreenLine + WindowSizeY; lno++){ if (lno >= ei.TotalLines){ break; } LineRegion *l1 = nullptr; if (drawSyntax || drawPairs){ l1 = baseEditor->getLineRegions(lno); } //clean line in far editor addFARColor(lno, -1, 0, color()); EditorGetString egs; egs.StringNumber = lno; info->EditorControl(ECTL_GETSTRING, &egs); int llen = egs.StringLength; // fills back if (lno == ei.CurLine && showHorizontalCross){ if (!TrueMod){ addFARColor(lno, 0, ei.LeftPos + ei.WindowSizeX, horzCrossColor); } else{ addFARColor(lno, 0, ei.LeftPos + ei.WindowSizeX, convert(nullptr)); } } else{ addFARColor(lno, 0, ei.LeftPos + ei.WindowSizeX, convert(nullptr)); } if (showVerticalCross && !TrueMod){ ecp_cl.StringNumber = lno; ecp_cl.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp_cl); vertCrossColor.concolor |= 0x10000; addFARColor(lno, ecp_cl.DestPos, ecp_cl.DestPos+1, vertCrossColor); }; bool vertCrossDone = false; if (drawSyntax){ for (; l1; l1 = l1->next){ if (l1->special){ continue; } if (l1->start == l1->end){ continue; } if (l1->start > ei.LeftPos+ei.WindowSizeX){ continue; } if (l1->end != -1 && l1->end < ei.LeftPos-ei.WindowSizeX){ continue; } if ((lno != ei.CurLine || !showHorizontalCross || crossZOrder == 0)){ color col = convert(l1->styled()); //TODO if (lno == ei.CurLine && showHorizontalCross){ if (!TrueMod){ if (foreDefault(col)){ col.concolor = (col.concolor&0xF0) + (horzCrossColor.concolor&0xF); } if (backDefault(col)){ col.concolor = (col.concolor&0xF) + (horzCrossColor.concolor&0xF0); } } }; if (!col.concolor){ continue; } // int lend = l1->end; if (lend == -1){ lend = fullBackground ? ei.LeftPos+ei.WindowSizeX : llen; } addFARColor(lno, l1->start, lend, col); if (lno == ei.CurLine && (l1->start <= ei.CurPos) && (ei.CurPos <= lend)){ delete cursorRegion; cursorRegion = new LineRegion(*l1); }; // column if (!TrueMod && showVerticalCross && crossZOrder == 0 && l1->start <= ecp_cl.DestPos && ecp_cl.DestPos < lend){ col = convert(l1->styled()); if (foreDefault(col)) col.concolor = (col.concolor&0xF0) + (vertCrossColor.concolor&0xF); if (backDefault(col)) col.concolor = (col.concolor&0xF) + (vertCrossColor.concolor&0xF0); ecp_cl.StringNumber = lno; ecp_cl.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp_cl); col.concolor|=0x10000; addFARColor(lno, ecp_cl.DestPos, ecp_cl.DestPos+1, col); vertCrossDone = true; }; }; }; }; if (!TrueMod && showVerticalCross && !vertCrossDone){ ecp_cl.StringNumber = lno; ecp_cl.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp_cl); vertCrossColor.concolor |= 0x10000; addFARColor(lno, ecp_cl.DestPos, ecp_cl.DestPos+1, vertCrossColor); }; }; /// pair brackets PairMatch *pm = nullptr; if (drawPairs){ pm = baseEditor->searchLocalPair(ei.CurLine, ei.CurPos); } if (pm != nullptr){ color col = convert(pm->start->styled()); // TODO if (!TrueMod && showHorizontalCross){ if (foreDefault(col)){ col.concolor = (col.concolor&0xF0) + (horzCrossColor.concolor&0xF); } if (backDefault(col)){ col.concolor = (col.concolor&0xF) + (horzCrossColor.concolor&0xF0); } }; // addFARColor(ei.CurLine, pm->start->start, pm->start->end, col); // TODO if (!TrueMod && showVerticalCross && !showHorizontalCross && pm->start->start <= ei.CurPos && ei.CurPos < pm->start->end){ col = convert(pm->start->styled()); if (foreDefault(col)){ col.concolor = (col.concolor&0xF0) + (vertCrossColor.concolor&0xF); } if (backDefault(col)){ col.concolor = (col.concolor&0xF) + (vertCrossColor.concolor&0xF0); } col.concolor|=0x10000; addFARColor(pm->sline, ei.CurPos, ei.CurPos+1, col); }; // if (pm->eline != -1){ col = convert(pm->end->styled()); // if (!TrueMod && showHorizontalCross && pm->eline == ei.CurLine){ if (foreDefault(col)){ col.concolor = (col.concolor&0xF0) + (horzCrossColor.concolor&0xF); } if (backDefault(col)){ col.concolor = (col.concolor&0xF) + (horzCrossColor.concolor&0xF0); } }; // addFARColor(pm->eline, pm->end->start, pm->end->end, col); ecp.StringNumber = pm->eline; ecp.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp); // if (!TrueMod && showVerticalCross && pm->end->start <= ecp.DestPos && ecp.DestPos < pm->end->end){ col = convert(pm->end->styled()); if (foreDefault(col)){ col.concolor = (col.concolor&0xF0) + (vertCrossColor.concolor&0xF); } if (backDefault(col)){ col.concolor = (col.concolor&0xF) + (vertCrossColor.concolor&0xF0); } col.concolor|=0x10000; addFARColor(pm->eline, ecp.DestPos, ecp.DestPos+1, col); }; // }; baseEditor->releasePairMatch(pm); }; if (param != EEREDRAW_ALL){ inRedraw = true; info->EditorControl(ECTL_REDRAW, nullptr); inRedraw = false; }; return true; }
int FarEditor::editorEvent(int event, void *param) { // ignore event if (event != EE_REDRAW || inRedraw) return 0; enterHandler(); if (farEncodingIndex != ei.TableNum - ei.AnsiMode){ static CharTableSet cts; farEncodingIndex = ei.TableNum - ei.AnsiMode; if (farEncodingIndex == -1) unicodeEncodingIndex = Encodings::getEncodingIndex("cp866"); else if (farEncodingIndex == -2) unicodeEncodingIndex = Encodings::getEncodingIndex("cp1251"); else{ info->CharTable(farEncodingIndex, (char*)&cts, sizeof(cts)); unicodeEncodingIndex = Encodings::getEncodingIndex(cts.TableName); }; if (unicodeEncodingIndex == -1) unicodeEncodingIndex = Encodings::getDefaultEncodingIndex(); // Here we have to invalidate full editor content baseEditor->modifyEvent(0); }; if (WindowSizeX != ei.WindowSizeX || WindowSizeY != ei.WindowSizeY){ WindowSizeX = ei.WindowSizeX; WindowSizeY = ei.WindowSizeY; }; baseEditor->visibleTextEvent(ei.TopScreenLine, WindowSizeY); baseEditor->lineCountEvent(ei.TotalLines); // Hack against FAR's bad EEREDRAW_CHANGE events if (param == EEREDRAW_CHANGE && ignoreChange == true){ param = EEREDRAW_ALL; ignoreChange = false; }; if (oldFAR || param == EEREDRAW_CHANGE){ int ml = (prevLinePosition < ei.CurLine ? prevLinePosition : ei.CurLine)-1; if (ml < 0) ml = 0; if (blockTopPosition != -1 && ml > blockTopPosition) ml = blockTopPosition; baseEditor->modifyEvent(ml); }; prevLinePosition = ei.CurLine; blockTopPosition = -1; if (ei.BlockType != BTYPE_NONE) blockTopPosition = ei.BlockStartLine; // hack against tabs in FAR's editor EditorConvertPos ecp, ecp_cl; ecp.StringNumber = -1; ecp.SrcPos = ei.CurPos; info->EditorControl(ECTL_REALTOTAB, &ecp); delete cursorRegion; cursorRegion = null; if (rdBackground == null) throw Exception(DString("HRD Background region 'def:Text' not found")); for(int lno = ei.TopScreenLine; lno < ei.TopScreenLine + WindowSizeY; lno++){ if (lno >= ei.TotalLines) break; LineRegion *l1 = null; if (drawSyntax || drawPairs){ l1 = baseEditor->getLineRegions(lno); } addFARColor(lno, -1, 0, 0); EditorGetString egs; egs.StringNumber = lno; info->EditorControl(ECTL_GETSTRING, &egs); int llen = egs.StringLength; const char *lptr = egs.StringText; // fills back if (lno == ei.CurLine && showHorizontalCross) addFARColor(lno, 0, ei.LeftPos + ei.WindowSizeX, horzCrossColor); else addFARColor(lno, 0, ei.LeftPos + ei.WindowSizeX, convert(null)); if (showVerticalCross){ ecp_cl.StringNumber = lno; ecp_cl.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp_cl); addFARColor(lno, ecp_cl.DestPos, ecp_cl.DestPos+1, vertCrossColor+0x10000); }; bool vertCrossDone = false; int syns = 0; int syne = 0; if (drawSyntax) for(; l1; l1 = l1->next){ if (l1->special) continue; if (l1->start == l1->end) continue; if (l1->start > ei.LeftPos+ei.WindowSizeX) continue; if (l1->end != -1 && l1->end < ei.LeftPos-ei.WindowSizeX) continue; if ((lno != ei.CurLine || !showHorizontalCross || crossZOrder == 0)){ int color = convert(l1->styled()); if (lno == ei.CurLine && showHorizontalCross){ if (foreDefault(color)) color = (color&0xF0) + (horzCrossColor&0xF); if (backDefault(color)) color = (color&0xF) + (horzCrossColor&0xF0); }; if (!color) continue; int lend = l1->end; if (lend == -1) lend = fullBackground ? ei.LeftPos+ei.WindowSizeX : llen; addFARColor(lno, l1->start, lend, color); if (lno == ei.CurLine && (l1->start <= ei.CurPos) && (ei.CurPos <= lend)){ delete cursorRegion; cursorRegion = new LineRegion(*l1); }; // column if (showVerticalCross && crossZOrder == 0 && l1->start <= ecp_cl.DestPos && ecp_cl.DestPos < lend) { color = convert(l1->styled()); if (foreDefault(color)) color = (color&0xF0) + (vertCrossColor&0xF); if (backDefault(color)) color = (color&0xF) + (vertCrossColor&0xF0); ecp_cl.StringNumber = lno; ecp_cl.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp_cl); addFARColor(lno, ecp_cl.DestPos, ecp_cl.DestPos+1, color+0x10000); vertCrossDone = true; }; }; }; if (showVerticalCross && !vertCrossDone){ ecp_cl.StringNumber = lno; ecp_cl.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp_cl); addFARColor(lno, ecp_cl.DestPos, ecp_cl.DestPos+1, vertCrossColor+0x10000); }; }; /// pair brackets PairMatch *pm = null; if (drawPairs){ pm = baseEditor->searchLocalPair(ei.CurLine, ei.CurPos); } if (pm != null){ int color = convert(pm->start->styled()); if (showHorizontalCross){ if (foreDefault(color)) color = (color&0xF0) + (horzCrossColor&0xF); if (backDefault(color)) color = (color&0xF) + (horzCrossColor&0xF0); }; addFARColor(ei.CurLine, pm->start->start, pm->start->end, color); if (showVerticalCross && !showHorizontalCross && pm->start->start <= ei.CurPos && ei.CurPos < pm->start->end){ color = convert(pm->start->styled()); if (foreDefault(color)) color = (color&0xF0) + (vertCrossColor&0xF); if (backDefault(color)) color = (color&0xF) + (vertCrossColor&0xF0); addFARColor(pm->sline, ei.CurPos, ei.CurPos+1, color+0x10000); }; if (pm->eline != -1){ color = convert(pm->end->styled()); if (showHorizontalCross && pm->eline == ei.CurLine){ if (foreDefault(color)) color = (color&0xF0) + (horzCrossColor&0xF); if (backDefault(color)) color = (color&0xF) + (horzCrossColor&0xF0); }; addFARColor(pm->eline, pm->end->start, pm->end->end, color); ecp.StringNumber = pm->eline; ecp.SrcPos = ecp.DestPos; info->EditorControl(ECTL_TABTOREAL, &ecp); if (showVerticalCross && pm->end->start <= ecp.DestPos && ecp.DestPos < pm->end->end) { color = convert(pm->end->styled()); if (foreDefault(color)) color = (color&0xF0) + (vertCrossColor&0xF); if (backDefault(color)) color = (color&0xF) + (vertCrossColor&0xF0); addFARColor(pm->eline, ecp.DestPos, ecp.DestPos+1, color+0x10000); }; }; baseEditor->releasePairMatch(pm); }; leaveHandler(); if (param != EEREDRAW_ALL){ inRedraw = true; info->EditorControl(ECTL_REDRAW, EEREDRAW_ALL); inRedraw = false; }; return true; }