void FarEditor::selectBlock() { EditorSelect es; int X1, X2, Y1, Y2; enterHandler(); PairMatch *pm = baseEditor->searchGlobalPair(ei.CurLine, ei.CurPos); if (pm == null){ leaveHandler(); return; } leaveHandler(); if (pm->eline == -1) return; X1 = pm->start->start; X2 = pm->end->end-1; Y1 = pm->sline; Y2 = pm->eline; if (!pm->topPosition){ X2 = pm->start->end-1; X1 = pm->end->start; Y2 = pm->sline; Y1 = pm->eline; }; es.BlockType = BTYPE_STREAM; es.BlockStartLine = Y1; es.BlockStartPos = X1; es.BlockHeight = Y2 - Y1 + 1; es.BlockWidth = X2 - X1 + 1; info->EditorControl(ECTL_SELECT, &es); baseEditor->releasePairMatch(pm); ignoreChange = true; }
void FarEditor::matchPair() { EditorSetPosition esp; enterHandler(); PairMatch *pm = baseEditor->searchGlobalPair(ei.CurLine, ei.CurPos); if (pm == null){ leaveHandler(); return; } leaveHandler(); if (pm->eline == -1) return; esp.CurTabPos = -1; esp.LeftPos = -1; esp.Overtype = -1; esp.TopScreenLine = -1; esp.CurLine = pm->eline; esp.CurPos = pm->end->end-1; if (!pm->topPosition) esp.CurPos = pm->end->start; if (esp.CurLine < ei.TopScreenLine || esp.CurLine > ei.TopScreenLine+ei.WindowSizeY){ esp.TopScreenLine = pm->eline - ei.WindowSizeY/2; if (esp.TopScreenLine < 0) esp.TopScreenLine = 0; }; info->EditorControl(ECTL_SETPOSITION, &esp); baseEditor->releasePairMatch(pm); ignoreChange = true; }
void FarEditor::listErrors(){ enterHandler(); baseEditor->validate(-1, false); leaveHandler(); showOutliner(errorOutliner); ignoreChange = true; }
void FarEditor::listFunctions(){ enterHandler(); baseEditor->validate(-1, false); leaveHandler(); showOutliner(structOutliner); ignoreChange = true; }
void Widget::leave() { leaveHandler(); }
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; }
void FarEditor::locateFunction(){ // extract word String &curLine = *getLine(ei.CurLine); int cpos = ei.CurPos; int sword = cpos; int eword = cpos; while (cpos < curLine.length() && (Character::isLetterOrDigit(curLine[cpos]) || curLine[cpos] != '_')) { while(Character::isLetterOrDigit(curLine[eword]) || curLine[eword] == '_') { if (eword == curLine.length()-1) break; eword++; } while(Character::isLetterOrDigit(curLine[sword]) || curLine[sword] == '_'){ if (sword == 0) break; sword--; } SString funcname(curLine, sword+1, eword-sword-1); CLR_INFO("FC", "Letter %s", funcname.getChars()); enterHandler(); baseEditor->validate(-1, false); leaveHandler(); ignoreChange = true; EditorSetPosition esp; OutlineItem *item_found = null; OutlineItem *item_last = null; int items_num = structOutliner->itemCount(); if (items_num == 0) break; //search through the outliner for (int idx = 0; idx < items_num; idx++){ OutlineItem *item = structOutliner->getItem(idx); if (item->token->indexOfIgnoreCase(DString(funcname)) != -1){ if (item->lno == ei.CurLine){ item_last = item; }else{ item_found = item; } } } if (!item_found) item_found = item_last; if (!item_found) break; esp.CurTabPos = esp.LeftPos = esp.Overtype = esp.TopScreenLine = -1; esp.CurLine = item_found->lno; esp.CurPos = item_found->pos; esp.TopScreenLine = esp.CurLine - ei.WindowSizeY/2; if (esp.TopScreenLine < 0) esp.TopScreenLine = 0; info->EditorControl(ECTL_SETPOSITION, &esp); info->EditorControl(ECTL_REDRAW, EEREDRAW_ALL); info->EditorControl(ECTL_GETINFO, &ei); return; }; const char *msg[2] = { GetMsg(mNothingFound), GetMsg(mGotcha) }; info->Message(info->ModuleNumber, 0, 0, msg, 2, 1); }