📄 feditor.class
字号:
PUBLIC Name AS StringPUBLIC Path AS StringPUBLIC Editor AS GambasEditorPUBLIC Scan AS CollectionPRIVATE $bModify AS Boolean'PRIVATE $cLine AS NEW CollectionPRIVATE $bToolbar AS BooleanPRIVATE $iLastLine AS IntegerPRIVATE $hSymbol AS CSymbolInfoPRIVATE $bCheckSignature AS BooleanPRIVATE $iPosSignature AS IntegerPRIVATE $bCompletion AS BooleanPRIVATE $bCleanOnSave AS BooleanSTATIC PRIVATE $hVirtualSymbol AS NEW CSymbolInfoSTATIC PRIVATE $bPublic AS BooleanSTATIC PRIVATE $bStatic AS BooleanSTATIC PRIVATE $sName AS StringSTATIC PRIVATE $cType AS NEW CollectionPRIVATE $iStartLine AS IntegerPRIVATE $iEndLine AS IntegerPUBLIC CONST NBR_COLOR AS Integer = 15PRIVATE CONST TYPE_SYMBOL AS Integer = 0PRIVATE CONST TYPE_FUNCTION AS Integer = 1PRIVATE CONST TYPE_ARRAY AS Integer = 2'PRIVATE $iSymbolType AS IntegerPRIVATE $bLastStatic AS BooleanPUBLIC frmCompletion AS FCompletionPUBLIC frmSignature AS FSignatureSTATIC PUBLIC SUB _init() $cType["Boolean"] = "b" $cType["Byte"] = "c" $cType["Short"] = "h" $cType["Integer"] = "i" $cType["Float"] = "f" $cType["Date"] = "d" $cType["String"] = "s" $cType["Variant"] = "v" $cType["Object"] = "o"ENDPUBLIC SUB _new(sPath AS String) Path = sPath Name = File.BaseName(Path) frmCompletion = NEW FCompletion(ME) frmCompletion.Hide frmSignature = NEW FSignature(ME) frmSignature.Hide ReadConfig Refresh Editor = edtEditor ME.Icon = Picture["img/16/" &/ File.ext(sPath) & ".png"] 'sPos = Project.Config.ReadString("/Window" &/ Name &/ "X", "") 'IF sPos THEN ' cPos.FromString(sPos, ",") ' ME.Move(cPos[0], cPos[1], cPos[2], cPos[3]) 'ELSE Project.InitMove(ME) 'ENDIF SetReadOnly 'btnSave.Enabled = NOT Project.ReadOnly 'mnuSave.Enabled = NOT Project.ReadOnly Reload edtEditor.SetFocus DrawTitle UpdateMenuENDPUBLIC SUB Refresh() edtEditor.TabLength = Project.TabSizeENDPUBLIC SUB ReadConfig() DIM iInd AS Integer DIM iColor AS Integer DIM hTheme AS Integer[] $bToolBar = Settings["/Editor/Toolbar", TRUE] Form_Resize edtEditor.Frozen = TRUE edtEditor.Font = Font[Settings["/Editor/Font", Project.DEFAULT_FONT]] hTheme = FOption.DefaultTheme FOR iInd = 0 TO NBR_COLOR - 1 iColor = Val(Settings["/Editor/Color[" & CStr(iInd) & "]", "-1"]) IF iColor = -1 THEN iColor = hTheme[iInd] edtEditor.Colors[iInd] = iColor NEXT edtEditor.ShowProc = Settings["/Editor/ShowProc", TRUE] edtEditor.ShowCurrent = Settings["/Editor/ShowCurrent", TRUE] edtEditor.UseRelief = Settings["/Editor/UseRelief", TRUE] edtEditor.ShowChange = Settings["/Editor/ShowChange", TRUE] 'edtEditor.Refresh edtEditor.Frozen = FALSE $bCompletion = Settings["/ShowCompletion", TRUE] $bCleanOnSave = Settings["/Editor/CleanOnSave", FALSE]ENDPUBLIC FUNCTION Save(OPTIONAL bReset AS Boolean) AS Boolean DIM iLig AS Integer DIM iProc AS Integer DIM iFull AS Integer DIM sLig AS String DIM iPosProc AS Integer DIM sData AS String DIM iLine AS Integer DIM iCol AS Integer DIM bChange AS Boolean DIM iCount AS Integer DIM iVoidLine AS Integer IF Project.ReadOnly THEN RETURN IF NOT $bModify THEN IF bReset THEN edtEditor.Reset RETURN ENDIF Save.Begin(Path) IF $bCleanOnSave THEN iProc = -1 iLine = edtEditor.Line iCol = edtEditor.Column iCount = edtEditor.Lines.Count FOR iLig = 0 TO iCount IF iLig < iCount THEN sLig = RTrim(edtEditor.Lines[iLig]) ELSE sLig = "SUB gambas()" ENDIF IF NOT LTrim(sLig) THEN INC iVoidLine CONTINUE ENDIF IF IsProc(sLig) THEN IF iProc >= 0 THEN' IF iFull < 2 THEN' bChange = TRUE' sData = Left(sData, iPosProc)' IF iLine > iProc THEN' IF iLine < iLig THEN' iLine = iProc - 1' ELSE' iLine = iLine - (iLig - iProc + 1)' ENDIF' ENDIF' ENDIF ENDIF iProc = iLig iFull = 0 iPosProc = Len(sData) ELSE INC iFull ENDIF IF iLig < iCount THEN sData = sData & String(iVoidLine, "\n") & sLig & "\n" iVoidLine = 0 ENDIF NEXT 'IF Len(sData) <> Len(edtEditor.Text) THEN File.Save(Path, sData) IF bChange THEN edtEditor.Frozen = TRUE edtEditor.Text = sData bReset = TRUE TRY edtEditor.Line = iLine IF NOT ERROR THEN TRY edtEditor.Column = iCol ENDIF edtEditor.Frozen = FALSE ENDIF ELSE File.Save(Path, edtEditor.Text) ENDIF $bModify = FALSE DrawTitle IF bReset THEN edtEditor.Reset Save.End()CATCH RETURN Save.Error()ENDPRIVATE SUB DrawTitle() DIM sTitle AS String sTitle = File.Name(Path) & " " & CStr(edtEditor.Line + 1) & ":" & CStr(edtEditor.Column + 1) IF $bModify THEN sTitle = sTitle & " [" & ("modified") & "]" ME.Title = sTitle '& " - " & Project.NameENDPUBLIC SUB Modify(OPTIONAL bReset AS Boolean) IF Project.ReadOnly THEN RETURN IF $bModify <> bReset THEN RETURN $bModify = NOT bReset DrawTitleENDPUBLIC FUNCTION IsModified() AS Boolean RETURN $bModifyENDPUBLIC SUB Form_Resize() HideCompletion HideSignature panToolbar.Visible = $bToolbar panToolBar.W = ME.ClientW IF $bToolbar THEN btnForm.Visible = Project.ExistForm(File.BaseName(Name)) 'panToolbar.Resize(ME.ClientW, btnGoto.Y + btnGoto.H) 'panToolbar.W = ME.ClientW edtEditor.Move(0, panToolBar.H, ME.ClientW, ME.ClientH - panToolbar.H) ELSE edtEditor.Move(0, 0, ME.ClientW, ME.ClientH) ENDIF 'lblCursor.Move(0, ME.ClientH - lblCursor.Height)ENDPUBLIC SUB edtEditor_Change() ModifyENDPUBLIC SUB edtEditor_Cursor() IF edtEditor.Line <> $iLastLine THEN $iLastLine = edtEditor.Line HideCompletion HideSignature IF IsModified() THEN Scan = NULL ELSE IF $bCheckSignature OR frmSignature.Visible THEN $bCheckSignature = FALSE CheckSignature ENDIF DrawTitle 'TRY PRINT Editor.Analyze(Editor.Lines[Editor.Line]).Join(",")ENDPUBLIC SUB Form_Activate() Project.Activate(ME) 'edtEditor.SetFocusENDPUBLIC SUB Form_Deactivate() HideCompletion HideSignatureENDPUBLIC SUB Goto(iLine AS Integer, OPTIONAL iColumn AS Integer = -1) DEC iLine IF iColumn < 0 THEN iColumn = edtEditor.Column edtEditor.Goto(iLine, iColumn) SavePositionENDPUBLIC SUB GotoCenter(iLine AS Integer, OPTIONAL iColumn AS Integer = -1) ME.Goto(iLine, iColumn) edtEditor.EnsureVisibleENDPUBLIC SUB edtEditor_Menu() DIM hMenu AS Menu DIM iInd AS Integer mnuForm.Visible = Project.ExistForm(File.BaseName(Name)) CreateMenu mnuEditor.PopupENDPRIVATE SUB CreateMenu() DIM iInd AS Integer DIM sLine AS String DIM sName AS String DIM hMenu AS Menu DIM cFunc AS NEW String[] DIM sParent AS String DIM sNewParent AS String DIM hParent AS Menu DIM sFullName AS String DIM sDesc AS String DIM iPos AS Integer DIM hSymbol AS CSymbolInfo DIM iLine AS Integer DIM cSymbol AS Collection 'DIM hPoint AS Picture 'IF $hMenuGo THEN $hMenuGo.Delete '$hMenuGo = NEW Menu(mnuEditor) '$hMenuGo.Caption = "&Go to" INC Application.Busy mnuGoto.Children.Clear cSymbol = CComponent.GetClassSymbols(Name) FOR EACH hSymbol IN cSymbol IF LCase(hSymbol.Kind) <> "m" THEN CONTINUE IF hSymbol.LineNumber = 0 THEN CONTINUE cFunc.Add(hSymbol.Name) NEXT cFunc.Sort(gb.Text) hParent = mnuGoto 'hPoint = Picture["img/16/point.png"] FOR EACH sName IN cFunc hSymbol = cSymbol[sName] sFullName = sName iPos = Instr(sName, "_") IF iPos THEN sNewParent = Left$(sName, iPos - 1) sName = Mid$(sName, iPos + 1) IF Len(sNewParent) = 0 THEN sNewParent = "(Special)" sName = "_" & sName ENDIF ELSE sNewParent = "" ENDIF IF UCase(sNewParent) <> UCase(sParent) THEN IF sNewParent THEN hParent = NEW Menu(mnuGoto) hParent.Text = sNewParent ELSE hParent = mnuGoto ENDIF sParent = sNewParent ENDIF hMenu = NEW Menu(hParent) AS "mnuGoto" hMenu.Text = sName hMenu.Tag = hSymbol.LineNumber - 1 'IF NOT hSymbol.NotPublic THEN hMenu.Picture = hPoint NEXT mnuGoto.Visible = cFunc.count > 0 mnuSepGoto.Visible = cFunc.count > 0 UpdateMenu DEC Application.BusyENDPRIVATE SUB UpdateMenu() DIM bVisible AS Boolean mnuWatch.Visible = Project.Running AND Len(Trim(edtEditor.Selection.Text)) > 0 btnWatch.Visible = Project.Running 'mnuUntil.Visible = mnuWatch.Visible bVisible = NOT edtEditor.ReadOnly mnuUndo.Visible = bVisible mnuRedo.Visible = bVisible mnuSepUndo.Visible = bVisible mnuCut.Visible = bVisible mnuPaste.Visible = bVisible mnuComment.Visible = bVisible mnuUncomment.Visible = bVisible mnuSepComment.Visible = bVisible mnuReload.Visible = bVisible btnUndo.Visible = bVisible btnRedo.Visible = bVisible btnCut.Visible = bVisible btnPaste.Visible = bVisible btnComment.Visible = bVisible btnUncomment.Visible = bVisible btnIndent.Visible = bVisible btnUnIndent.Visible = bVisible btnReload.Visible = bVisible btnSave.Visible = bVisibleENDPUBLIC SUB mnuGoto_Click() DIM iLine AS Integer iLine = LAST.Tag edtEditor.Column = 0 edtEditor.Line = iLine - 10 edtEditor.Line = iLine + 10 edtEditor.Line = iLineENDPUBLIC SUB GotoEvent(sName AS String, sEvent AS String, OPTIONAL sSign AS String) DIM iLine AS Integer DIM iPos AS Integer DIM iLast AS Integer DIM sProc AS String iLast = -1 sProc = UCase(sName & "_" & sEvent) FOR iLine = 0 TO edtEditor.Lines.Count - 1 IF IsProc(edtEditor.Lines[iLine]) THEN IF UCase($sName) = sProc THEN ME.GotoCenter(iLine + 2) RETURN ENDIF 'IF iLast < 0 THEN ' iPos = Instr($sName, "_") ' IF iPos THEN ' IF UCase(Left$($sName, iPos - 1)) = UCase(sName) THEN ' iLast = iLine ' ENDIF ' ENDIF 'ENDIF ENDIF NEXT IF iLast >= 0 THEN ME.GotoCenter(iLast + 2) RETURN ENDIF edtEditor.Line = iLine - 1 edtEditor.Column = Len(edtEditor.Lines[edtEditor.Line]) IF edtEditor.Column THEN edtEditor.Insert("\n") edtEditor.Insert("\nPUBLIC SUB " & sName & "_" & sEvent & "(" & sSign & ")\n\n \n\nEND\n") ME.GotoCenter(iLine + 3, 3)END'PUBLIC SUB Form_KeyPress(Ascii AS String, Code AS Integer, State AS Integer)'' 'IF State AND Mouse.Control THEN' '' ' IF Code = Asc("S") THEN Save' '' 'ENDIF'' IF Asc(Ascii) = 13 THEN'' PRINT "Return !"' PRINT'' ENDIF''ENDPUBLIC SUB mnuSave_Click() SaveENDPUBLIC SUB edtEditor_KeyPress() DIM sLine AS String DIM iLine AS Integer DIM iInd AS Integer DIM iPos AS Integer DIM bStop AS Boolean IF NOT edtEditor.ReadOnly THEN iLine = edtEditor.Line IF frmCompletion.Visible THEN bStop = frmCompletion.ManageKey() ENDIF IF frmSignature.Visible THEN bStop = bStop OR frmSignature.ManageKey() 'IF Key.Text THEN CheckSignature(Key.Text) ENDIF IF bStop THEN STOP EVENT RETURN ENDIF ENDIF IF Key.Code = Key.F8 THEN IF Key.Shift THEN Project.Forward ELSE IF Key.Alt THEN Project.ReturnFrom ELSE Project.Step ENDIF STOP EVENT RETURN ELSE IF Key.Code = Key.F2 THEN IF Key.Shift THEN LastPosition ELSE IF Key.Normal THEN FindDefinition ENDIF STOP EVENT ELSE IF Key.Code = Key.Pause THEN IF Key.Alt THEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -