unit UtslCodeEditor; { 编辑器相关的代码20220518整理, 20220520 分离调试器代码 } interface uses utslvcldesignerresource,cstructurelib,utslvclauxiliary,utslvclmemstruct,utslvclgdi,utslvclstdctl, tslvcl,UTslmemo,UTslSynMemo,utslvclsyntaxparser,utslvcldebuger; { 1. page标签 TPagees; TPageItem 2. TMemoPages ,TMemoPageItem 3. TEchoWnd 4. TFindResultWnd 5. FindStringWnd 查找框 5. TGotoLineWnd 跳转 } function gettslexe(); function move_popwnd_to_center2(wnd); function to_ansi_str(s); type TPageItem=class() //标签项 function Create(AOwner); begin FCaption := ""; FOwner := AOwner; end function Recycling();virtual; begin FBitmapA := nil; FBitmapB := nil; Tag := nil; end published property Caption read FCaption write SetCaption; //标题 property BitmapA read FBitmapA write SetBitmapA; //前面的图标 property BitmapB read FBitmapB write SetBitmapB; //后面的关闭图标 [weakref]tag; //绑定变量 Rect; //区域 protected function SetCaption(s); begin if s and ifstring(s)then begin FCaption := s; if FOwner then FOwner.ItemCaptionChenged(self); end end private function SetBitmapA(Bmp); begin if FBitmapA <> Bmp then begin FBitmapA := Bmp; if FOwner then FOwner.ItemBitmapAChenged(self); end end function SetBitmapB(Bmp); begin if FBitmapB <> Bmp then begin FBitmapB := Bmp; if FOwner then FOwner.ItemBitmapBChenged(self); end end FBitmapB; FBitmapA; FCaption; [weakref]FOwner; end type TPage=class(TCustomControl) //标签 function Create(AOwner) begin Inherited; ParentFont := false; FCloseBtn := false; FPageItems := new TMyarrayB(); FMultiLine := 1; FLineHeight := 16; //font.Height+6; FLines := 0; FItemIndex :=-1; FWill_Drag := true; font := array("height":24,"width":12,"escapement":0,"orientation":0,"weight":400,"italic":0,"underline":0,"strikeout":0, "charset":0,"outprecision":0,"clipprecision":0,"quality":1,"pitchandfamily":1,"facename":"Courier New","color":0); end function GetPageRect(); //获得标签区域 begin GetClientRect(); return FPageRect; end function PosInCurrentItemSection(xy); //点击部分 begin if not FCurrentITem then return 0; rc := FCurrentItem.Rect; if not rc then return 0; rc1 := rc; rc1[2]:= rc1[0]+20; if PointInrect(xy,rc1)then return 1; rc1 := rc; rc1[0]:= rc[2]-20; if PointInrect(xy,rc1)then return 3; if PointInRect(xy,rc)then return 2; end function DoControlAlign();override; begin CalcPageItemRect(); end function CreateApageItem();virtual; begin return new TPageItem(self); end function itemcaptionchenged(it); //标签等改变 begin if GetItemIndex(it)>= 0 then begin DoControlAlign(); InValidateRect(nil,false); end end function ItemBitmapAChenged(it); //保存改变 begin if GetItemIndex(it)>= 0 then InValidateRect(it.Rect,false); end function ItemBitmapBChenged(it); //关闭改变 begin if GetItemIndex(it)>= 0 then InValidateRect(it.Rect,false); end function FontChanged();override;//字体改变 begin FLineHeight := font.Height+6; DoControlAlign(); end function IncPaintLock(); begin BeginUpdate(); end function DecPaintLock(); begin EndUpdate(); end function DoEndUpDate();override; begin DoControlAlign(); inherited; end function GetClientRect();override; //获得新的区域 begin r := inherited; FPageRect := R; r[1]+= FLineHeight * FLines; //FLabelsheight; FPageRect[3]:= r[1]; return r; end function Paint();override; //绘制 begin if not FPageItems then return ; dc := Canvas; ps := PAINTSTRUCT().rcPaint; //dc.Pen.Color := rgb(180,180,100); dc.Pen.Color := rgb(250,250,250); dc.Pen.Width := 1; dc.font := font; for i := 0 to FPageItems.Length()-1 do begin it := FPageitems[i]; rc := it.Rect; if not rc then continue; if Intersectrect(it.Rect,ps)then begin if FItemIndex=i then //选中 begin bc:= 0xFa901E; end else begin bc := 0xe4eeee;//rgb(228,228,228);// end dc.brush.color := bc; dc.draw("roundrect",array(rc[0:1],rc[2:3],array(5,5))); ny := integer(rc[1]+(rc[3]-rc[1]-16)/2); if it.BitmapB then begin {rc1 := rc; rc1[0]:= rc[2]-20; rc1[2]-= 2; rc1[1]+= 4; rc1[3]-= 4; dc.Stretchdraw(rc1,it.BitmapB);} it.BitmapB.draw(dc,rc[2]-18,ny); end if it.BitmapA then begin it.BitmapA.draw(dc,rc[0]+2,ny); {rc1 := rc; rc1[2]:= rc1[0]+20; rc1[0]+= 2; rc1[2]-= 2; rc1[1]+= 2; rc1[3]-= 2; dc.Stretchdraw(rc1,it.BitmapA);} end rc[0]+= 20; dc.DrawText(to_ansi_str(it.caption),rc,DT_nOPREFIX .| DT_LEFT .| DT_SINGLELINE .| DT_VCENTER); end end if FCloseBtn and((FPageItems.Length()>0))then begin Closebmp(); rc := ClientRect; FBmpClose.Draw(dc,rc[2]-25,3,SRCAND); //rc := ClientRect; //rc := array(rc[2]-25,1,rc[2]-1,19); //dc.Stretchdraw(rc,FBmpClose); end end function SetSel(it); //选中 begin idx := GetItemIndex(it); if idx >= 0 and idx <> FItemIndex then begin ItemIndex := idx; end end function CloseAllItem(it); //关闭 begin FItemINdex :=-1; FCurrentITem := nil; saveit := nil; for i,v in FPageItems.Data do begin if v=it then begin saveit := it; continue; end end FPageItems.Splice(0,FPageItems.Length()); if saveit then begin FItemINdex := 0; FCurrentITem := it; FPageItems.push(it); end //InValidateRect(nil,false); DoControlAlign(); InValidateRect(nil,false); end function DeleteItemByIndex(idx);virtual;//删除序号 begin if idx >= 0 and idx= 0 and FItemIndex <> idx then begin if FItemIndex=0 then begin e._Tag := FPageitems[idx]; callDatafunction(fOnbmpbclick,o,e); idx := GetItemIndex(FCurrentItem); ItemIndex := idx; return ; end end if e.shiftdouble() then //处理新建 begin idx := GetItemIndexByPos(e.pos); if idx=-1 then begin callDatafunction(OnDblClick,o,e); end return ; end if e.button=mbLeft then begin cidx := posinitembmpb(e.pos); if cidx>=0 then begin e._Tag := FPageitems[cidx]; callDatafunction(fOnbmpbclick,o,e); idx := GetItemIndex(FCurrentItem); ItemIndex := idx; return ; end end idx := GetItemIndexByPos(e.pos); itemindex := idx; FCloseBtnClicked := false; if e.button=mbLeft and idx >= 0 then begin nxy := clienttowindow(e.xpos,e.ypos); if FCanDraged and FWill_Drag then begin IncPaintLock(); FWill_Drag := false; FIs_Draging := true; CreateImageList(); _wapi.ImageList_BeginDrag(FDRageimglist,0,12,12); FNot_DragLive := true; //_wapi.ImageList_DragEnter(self.Handle,nxy[0],nxy[1]); crect := GetPageRect(); ps := array(clienttoscreen(crect[0],crect[1]),clienttoscreen(crect[2],crect[3])); _wapi.clipcursor(ps); end end else begin rc := ClientRect; rc := array(rc[2]-25,1,rc[2]-1,19); if PointInRect(e.pos,rc)then begin FCloseBtnClicked := true; end end FCanDraged := true; return inherited; //if 3=PosInCurrentItemSection(e.pos) then FCurrentITem.Caption := datetimetostr(now()); end FCanDraged; //修正提示导致修改后提示导致drage 体验问题 function PostInCloseRect(ps); //是否点击关闭 begin rc := ClientRect; rc := array(rc[2]-25,1,rc[2]-1,19); return PointInRect(ps,rc); end function GetItemIndexByPos(xy); //根据位置获得点击的item begin for i := 0 to FPageItems.Length()-1 do begin if PointInrect(xy,FPageItems[I].Rect)then return i; end return -1; end function posinitembmpb(xy); //点击图标位置 begin for i := 0 to FPageItems.Length()-1 do begin it := FPageItems[I]; if not it.BitmapB then continue ; ri := it.Rect; ri[0] := ri[2]-18; ri[1]+=2; ri[3]-=2; ri[2]-=2; if PointInrect(xy,ri)then return i; end return -1; end Function GetItemIndex(it); //获得序号 begin for i := 0 to FPageItems.length()-1 do begin if it=FPageitems[i]then begin return i; end end return -1; end function Recycling();override; begin FPageItems.Splice(0,FPageItems.Length()); FOnSelChanged := nil; FOnSelchanging := nil; FCurrentItem := nil; FItemIndex :=-1; FOnCloseClick := nil; fOnbmpbclick := nil; inherited; end property CurrentItem read FCurrentItem; //当前的页面 property OnSelChanged read FOnSelChanged write FOnSelChanged; //选择已经改变 property OnSelChanging read FOnSelChanging write FOnSelChanging; //选择正在改变 property OnCloseClick read FOnCloseClick write FOnCloseClick; //关闭 property Onbmpbclick read FOnbmpbclick write fOnbmpbclick; property MultiLine read FMultiLine write SetMultiLine; property CloseBtn read FCloseBtn write SetCloseBtn; //是否有关闭按钮 property Lines read FLines; //多少行 property PageItems read FPageItems; //页面集合对象 property pageitemcount read getpageitemcount; //页面数量 property ItemIndex read FItemIndex write SetItemIndex; protected function CallSelChanged();virtual; begin if not OnSelChanged then return false; e := new tuieventbase(); callDatafunction(OnSelChanged,self(true),e); end function CallSelChanging();virtual; begin if not FOnSelchanging then return false; e := new tuieventbase(); CallDatafunction(FOnSelchanging,self(true),e); return e.skip; end function CalcPageItemRect(); //计算位置 begin FLines := 1; if not FPageitems then return ; li := 0; ft := font; if ft then cw := ft.Width; else cw := 10; r := class(TCustomControl).ClientRect; x := 0; xct := 0; for i := 0 to FPageitems.Length()-1 do begin it := FPageitems[i]; itwidth := length(it.Caption) * cw+50; if xct>0 and(r[2]-(FCloseBtn?20:0)) FCloseBtn then begin FCloseBtn := nv; DoControlAlign(); end end function getpageitemcount(); begin return FPageItems.length(); end function SetItemIndex(idx); begin if idx >= 0 and idx FItemIndex then begin if CallSelChanging()then return; FItemIndex := idx; FCurrentItem := FPageItems[idx]; InValidateRect(nil,false); CallSelChanged(); end end FMultiLine; FLineHeight; FLines; FOnSelChanged; FOnCloseClick; FOnSelchanging; function SetMultiLine(); begin end end type TEditerAuxiliary=class(TPage) //辅助窗口 function Create(AOwner); begin inherited; Caption := "message:"; Ftimer := new TTimer(self); Ftimer.Interval := 200; Ftimer.Ontimer := thisfunction(BdownTimeOut); Ftimer.Enabled := false; //FEchoItem := CreateApageItem(); //FFileFindeItem := CreateApageItem(); OnSelChanged := thisfunction(OnSelChangedCall); CloseBtn := true; onnotification := function(o,e)begin ms := e.message; if ifarray(ms) and ms[0] ="font" then begin font := ms[1]; InValidateRect(nil,false); end end end function WMNCLBUTTONDOWN(o,e):WM_NCLBUTTONDOWN;override; begin FIgnoreSize := true; Ftimer.Enabled := true; end function BdownTimeOut(o,e); //定时器处理 begin if(_wapi.GetAsyncKeyState(VK_LBUTTON).& 0xFF00)>0 then begin end else begin FIgnoreSize := false; o.Enabled := false; p := Parent; if p then p.DoControlAlign(); end end function DoControlAlign();override; begin if FIgnoreSize then begin end inherited; rc := ClientRect; //单独处理linux的情况 {$ifdef linux} rc[0]+= 2; rc[2]-= 2; rc[3]-= 2; {$endif} if CurrentItem then wnd := CurrentItem.Tag; if wnd then wnd.SetBoundsRect(Rc); end function ShowPopUp();//弹出 begin if not WSpOPUp then begin WSpOPUp := true; Parent.DoControlAlign(); end if not Visible then Visible := true; end function MouseDown(o,e);override;//点击处理 begin if e.shiftdouble()and e.button()=mbLeft then begin WSpOPUp := not WSpOPUp; Parent.DoControlAlign(); if not WSpOPUp then begin _wapi.SetWindowPos(self.Handle,0,0,0,0,0,SWP_NOMOVE .| SWP_NOSIZE .| SWP_NOREDRAW .| SWP_NOSENDCHANGING); end end else if GetItemIndexByPos(e.pos)>= 0 then begin inherited; end else if PostInCloseRect(e.pos)then begin //echo "------------\r\n"; inherited; end else begin if WSpOPUp then _send_(WM_SYSCOMMAND,0xF012,0); end end function Recycling();override; begin Ftimer := nil; FEchoWnd := nil; FFileFindWnd := nil; FOnCloseClick := nil; inherited; end function ShowByTag(tg); //显示 begin its := Pageitems; for i := 0 to its.Length()-1 do begin if its[i].tag=tg then begin ItemIndex := i; //visible := true; return; end end end function OnSelChangedCall(o,e); begin if not CurrentItem then Caption := "--"; rc := ClientRect; its := PageItems; for i := 0 to its.Length()-1 do begin it := its[i]; if CurrentItem=it then begin it.tag.SetboundsRect(rc); it.tag.Visible := true; caption := it.Tag.Caption; end else it.tag.Visible := false; end end function AddWnd(wnd); //加入窗口 begin if wnd is class(TWincontrol)then begin its := PageItems; for i := 0 to its.Length()-1 do begin it := its[i]; if it.tag=wnd then return; end IncPaintLock(); it := CreateApAgeItem(); it.Caption := wnd.Caption; it.tag := wnd; wnd.visible := 0; wnd.Parent := self; PageItems.Push(it); if PageItems.Length()=1 then begin itemIndex := 0; end DecPaintLock(); end end FEchoWnd; FFileFindWnd; [weakref]FOnCloseClick; private Ftimer; FIgnoreSize; end type TExecuteEditer=class(TCustomControl) //执行编辑器 Protected Type TExecuteMemoComp=class(TSynCompletion) //自动完成对象 function Create(AOwner); begin inherited; IgnoreCase := false; end function PrepareCompletion(c);override; //获得数据 begin //通过SetCompData 设置数据 if Not Memo then return; d := array(); for i,v in array("FULL_CURRENT_PATH","CURRENT_DIRECTORY","SEARCH_PATH","TSL_EXE") do begin d[i,"caption"]:= v; d[i,"value"]:= v; d[i,"lvalue"]:= lowercase(v); cl := length(v); d[i,"clen"]:= cl; d[i,"vlen"]:= cl; end SetCompData(d); end end type TListBoxb=class(TListbox)//选择下拉 function Create(AOwner); begin inherited; end function CheckListItem(it);override; begin return ifobj(it); end function GetItemText(i);override;//获得标签 begin it := GetItem(i); if it then return it.FCaption; return ""; end function InsureItemVisible(idx); //移动当前的格子 begin return ;// rc := GetIdxRect(idx); c := ClientRect; if rc[1]c[3]then begin SetYpos(1+GetYPos()+(rc[3]-c[3]+1)/GetYScrollDelta()); end end end type TComboBoxb=class(TCombobox) function Create(AOwner); begin INherited; end function CreateAlist();override; begin return new TListBoxb(self); end end type TCobItem=class function Create(d); begin FCaption := ""; FExe := ""; if not ifarray(d)then return; FCaption := d["caption"]; FExe := d["exe"]; end FCaption; FExe; end public function showexeediter(); begin FMemo.ExecuteCommand(FMemo.ecGotoXY,array(1,1)); FMemO.SetFocus(); show(); end function Create(AOwner); begin inherited; WSsYSMenu := true; WsDlgModalFrame := true; WsSizeBox := true; WSpOPUp := true; FItems := new TMyArrayB(); caption := "编辑 Execute....."; SetBoundsRect(array(50,50,930,201)); FMemo := new TSynMemoNorm(self); FMemo.OnKeyPress := function(o,e) begin if 13=e.charcode then begin if o.Completion and o.Completion.Visible then return ; e.skip := true; //doSaveCurrentName(); end end {FMemo.OnKeyDown := function(o,e) begin case e.charcode of VK_DOWN: begin e.skip := true; FChooser.ItemIndex += 1; end VK_UP: begin e.skip := true; FChooser.ItemIndex -= 1; end end; end} FMemo.Border := true; FMemo.parent := self; FChooser := new TComboBoxb(self); //new TEditList(self); FChooser.ReadOnly := false; FChooser.parent := self; FOkBtn := new TBtn(self); FCancelBtn := new TBtn(self); FEgnorBtn := new TBtn(self); cp := new TExecuteMemoComp(self); FMemo.Completion := cp; cp.PrepareCompletion(); OnClose := function(o,e) begin e.skip := true; o.visible := false; end FOkBtn.Caption := "保存/添加"; FCancelBtn.Caption := "删除当前"; FEgnorBtn.caption := "取消"; FOkBtn.parent := self; FCancelBtn.parent := self; FEgnorBtn.parent := self; FMemo.parent := self; FChooser.OnSelChanged := thisfunction(OnChooserChanged); FCancelBtn.OnClick := thisfunction(DeleteCurrent); FOkBtn.OnClick := thisfunction(doSaveCurrentName); FEGnorBtn.OnClick := thisfunction(OnIgnore); end function Recycling();override; begin inherited; FMemo := nil; FChooser := nil; FCancelBtn := nil; FOkBtn := nil; FEgnorBtn := nil; Fonsaveclk := nil; end function DeleteCurrent(); begin if length(FChooser.Items)<2 then return ; FChooser.DeleteItem(FChooser.ItemIndex); end function DoControlAlign();override; begin if FMemo and FChooser and FCancelBtn and FOkBtn and FEgnorBtn then begin r := clientRect; r1 := r; r1[3]-= 30; FMemo.SetBoundsRect(r1); tp := r1[3]+2; wd := 200; x := 50; FChooser.SetBoundsRect(array(x,tp,x+200,tp+26)); x += 200; FCancelBtn.SetBoundsRect(array(x+20,tp,x+20+100,tp+26)); x += 120; FOkBtn.SetBoundsRect(array(x+20,tp,x+100,tp+26)); x += 120; FEgnorBtn.SetBoundsRect(array(x+20,tp,x+100,tp+26)); x += 120; end end function OnIgnore(); begin idx := FChooser.ItemIndex; if idx >= 0 then begin it := FChooser.GetItem(idx); FChooser.Editer.Text := it.FCaption; FMemo.Text := it.FExe; end Visible := false; end function GetCurrentExuteparams(f); begin return ParserCommandLine(GetCurrentExuteString(f)); end function getcurrentcommandline(); begin idx := FChooser.ItemIndex; if not(idx >= 0)then return ""; s := FChooser.GetItem(idx).fexe; if not ifstring(s)then return ""; return s; end function GetCurrentExuteString(f); //获得当前的执行字符串 begin if not ifstring(f)then return ""; if not fileexists("",f)then return ""; idx := FChooser.ItemIndex; if not(idx >= 0)then return ""; s := FChooser.GetItem(idx).fexe; if not ifstring(s)then return ""; s := replacetext(s,"$(FULL_CURRENT_PATH)",f); dir := ""; sp := ioFileseparator(); for i := length(f)downto 1 do begin if f[i]=sp then begin dir := f[1:i-1]; break; end end s := replacetext(s,"$(CURRENT_DIRECTORY)",dir); s := replacetext(s,"$(SEARCH_PATH)",owner.getlibpathstr()); s := replacetext(s,"$(TSL_EXE)",gettslexe()); len := length(s); return s; end function doSaveCurrentName(); begin Visible := false; s := FChooser.Editer.Text; its := FChooser.Items; len := Length(its); for i,v in its do begin if v.FCaption=s then begin v.FExe := FMemo.Text; return callDatafunction( Fonsaveclk,self,self); end end if cannotadd then return ; FChooser.InsertItem(new TCobItem(array("caption":s,"exe":FMemo.Text)),0); FChooser.ItemIndex := 0; callDatafunction( Fonsaveclk,self,self); end function OnChooserChanged(o,e); begin idx := o.ItemIndex; if idx >= 0 then begin it := O.GetItem(idx); FMemo.Text := it.fexe; end else FMemo.Text := ""; FMemo.ClearUndo(); end function GetData(); //获得数据 begin r := array(); its := FChooser.Items; if not(its)then return r; r["itemindex"]:= FChooser.ItemIndex; for i,v in its do begin r["items"][i]:= array("caption":v.FCaption,"exe":v.FExe); end return r; end function SetData(d); //设置数据 begin if ifarray(d)then begin SetItems(d["items"]); FChooser.ItemIndex := d["itemindex"]; end end property Items read FItems Write SetItems; property onsaveclk read Fonsaveclk write Fonsaveclk; property cannotadd read FCannotadd write FCannotadd; private FCannotadd; Fonsaveclk; FMemo; FChooser; FCancelBtn; FOkBtn; FItems; FEgnorBtn; private function GetItemIndex(); begin return FChooser.Items; end function SetItems(its); //设置信息 begin vs := array(); for i,v in its do begin if ifarray(v)and ifstring(v["caption"])and ifstring(v["exe"])then begin vi := new TCobItem(v); vs[length(vs)]:= vi; end end FChooser.Items := vs; end end type TFTSLScriptMemo = class(TFTSLScriptcustomMemo) function create(AOwner); begin inherited; font := array("width":12,"height":24); {global g_editer_font_size; if g_editer_font_size and ifarray(g_editer_font_size) then begin ft := array("width":g_editer_font_size["width"]+1,"height":g_editer_font_size["height"]+2); font := ft; end } end function SetFocus();override; begin global g_script_can_set_not_focus; if g_script_can_set_not_focus then return ; if HandleAllocated() then _wapi.SetFocus(self.Handle); end end type TPageEditerItem=class(TPageItem) FPageOrderId; //序号有调用者使用 FEditer; //编辑器 FSynType; FInitCompletion; FDebuger; fisnewfile; function create(AOwner);override; begin inherited; FSynType := ""; FEnCode := "ANSI"; FGetInfoText := ""; FLastVersion := ""; FEditer := new TFTSLScriptMemo(AOwner); FEditer.Align := FEditer.alClient; FEditer.Visible := false; FEditer._Tag := self; Fscripttype := 0; end function Recycling();override; begin FDebuger := nil; inherited; FEditer.Recycling(); FEditer := nil; end function markline(l,f); //标记被调用 begin if FDebuger then begin if f then begin FDebuger.addbreak(self,l); end else begin FDebuger.removebreak(self,l); end end end function ScriptPathIs(v); begin return filenameIsTheSame(v,FScriptPath); end published property scripttype read Fscripttype write setFscripttype; property ScriptPath read FScriptPath write SetScriptPath; //文件名 property scriptname read fscriptname; property OrigScriptPath read FOrgScriptPath; property TslSynText read FTslSynText write FTslSynText; property LastText read FLastVersion; //最新的版本 property EnCode read FEnCode; RepreComple; FISstm; Fscripttype; ///////////////////设计器相关////////////////////////////////////// public function replacemfunc(fn,txt); begin d := getmfunctioninfo(); for i,v in d do begin if v["name"] = fn then begin rs := PosToRowCol(FTslParser2.Script,array(v["startpos"]-1,v["endpos"])); p := rs[0]; if ifarray(p)then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,p); FEditer.ExecuteCommand(FEditer.ecSelGotoXY,rs[1]); FEditer.ExecuteCommand(FEditer.ecString,txt); end return 1; end end end function Addfiled(fld); //添加成员变量 begin if not FTslParser then return 0; if not(fld and ifstring(fld))then return; nfld := lowercase(fld); nt := str2array(nfld,":"); nfld := nt[0]; nfldt := nt[1]; d := GetClassInfo(); if not(d and ifarray(d))then return 0; for i,v in d["filed"] do begin if v["name"]=nfld then return 1; end crec := GetCreateFunctionRec(d); if crec then begin p := crec[0]; if ifarray(p)then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,p); FEditer.ExecuteCommand(FEditer.ecString,fld+";\r\n "); end end end function getuses(); begin if not FTslParser then return 0; d := GetClassInfo(); if not(d and ifarray(d))then return 0; return d["uses"]["info"]; end function adduses(libs);//添加uses begin if not FTslParser then return 0; if not(libs and ifarray(libs))then return; d := GetClassInfo(); if not(d and ifarray(d))then return 0; usd := d["uses"]; if usd then //存在uses begin adu := lowercase(libs) minus (usd["info"]) ; if adu then begin adus := array2str(adu,","); if adus then begin usd["beg"]+=5; adus +=","; rec := GetInfoRowCol2(usd); p := rec[0]; if ifarray(p) then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,rec[0]); FEditer.ExecuteCommand(FEditer.ecString,adus); end end end end { else begin adus := array2str(lowercase(libs),","); ups := d["inheritedendpos"]; if adus and ups>0 then begin ups +=1; adus+=";"; //添加uses end end } end function GetCreateFunctionRec(d); //获得插入函数为位置 begin fi := d["funcsinfo"]; for i,v in fi do begin if v["name"]="create" then begin return GetInfoRowCol(v); end end return 0; end function Delfiled(fld,nn); //删除成员变量 begin if not FTslParser then return 0; if not(fld and ifstring(fld))then return; if not ifstring(nn)then nn := ""; nfld := lowercase(fld); d := GetClassInfo(); if not(d and ifarray(d))then return 0; for i,v in d["filed"] do begin if v["name"]=nfld then begin frec := GetInfoRowCol2(v); if ifarray(frec[0])and ifarray(frec[1])then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,frec[0]); FEditer.ExecuteCommand(FEditer.ecSelGotoXY,frec[1]); FEditer.SelText := nn?(nn+";"):""; end wek := v["dstatic"]; if wek then begin frec := GetInfoRowCol2(wek); if ifarray(frec[0])and ifarray(frec[1])then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,frec[0]); FEditer.ExecuteCommand(FEditer.ecSelGotoXY,frec[1]); FEditer.SelText := nn?(nn+";"):""; end end wek := v["weakref"]; if wek then begin frec := GetInfoRowCol2(wek); if ifarray(frec[0])and ifarray(frec[1])then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,frec[0]); FEditer.ExecuteCommand(FEditer.ecSelGotoXY,frec[1]); FEditer.SelText := nn?(nn+";"):""; end end end end end function GoToFunction(fn); begin if not(ifstring(fn))then return false; nfld := lowercase(fn); d := GetClassInfo(); if not ifarray(d)then return 0; for i,v in d["funcsinfo"] do begin if v["name"]=nfld then begin crec := GetInfoRowCol(v); if ifarray(crec)and ifarray(crec[0])then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,crec[0]); end return true; end end end function AddFunction(fn,finfo); //添加函数 begin if not FTslParser then return 0; if not(ifstring(fn)and fn and ifstring(finfo))then return 0; nfld := lowercase(fn); d := GetClassInfo(); if not ifarray(d)then return 0; for i,v in d["funcsinfo"] do begin if v["name"]=nfld then begin crec := GetInfoRowCol(v); if ifarray(crec)and ifarray(crec[0])then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,crec[0]); end return true; end end crec := GetCreateFunctionRec(d); if crec then begin p := crec[1]; if ifarray(p)then begin FEditer.ExecuteCommand(FEditer.ecGotoXY,p); FEditer.ExecuteCommand(FEditer.ecString,"\r\n"+finfo+"\r\n "); end end return true; end function GetLastLoadTime(); //最新时间 begin return FLastFileTime; end function ReGetLastLoadTime(); //重新获得时间 begin fi := FileList("",FScriptPath); FLastFileTime := fi[0,"Time"]; return FLastFileTime; end function PrePareSave(); //准备保存 begin if not FEditer.ChangedFlag then begin if RepreComple then itemPareCompletion(); return false; end if FEditer.ReadOnly then begin if RepreComple then itemPareCompletion(); return false; end t := FEditer.Text; if FLastVersion=t then begin FEditer.ChangedFlag := false; if RepreComple then itemPareCompletion(); return false; end FLastVersion := t; itemPareCompletion(); //FEditer.PrePareCompletion(t); //准备自动完成 FEditer.ChangedFlag := false; return true; end function itemPareCompletion(); begin t := caption; cp := FEditer.Completion; if cp then cp.PrePareCompletion(t); RepreComple := false; end function ToUnicode_big(); begin if FEnCode="UCS2-big" then return; if FEnCode = "None" then return ; FEnCode := "UCS2-big"; FEditer.ChangedFlag := true; FLastVersion := ""; end function ToUniocode_little(); begin if FEnCode="UCS2-little" then return; if FEnCode = "None" then return ; FEnCode := "UCS2-little"; FEditer.ChangedFlag := true; FLastVersion := ""; end function ToUTF8(); begin if FEnCode="UTF8" then return; if FEnCode = "None" then return ; FEnCode := "UTF8"; FEditer.ChangedFlag := true; FLastVersion := ""; return; end function ToUTF8BOM(); begin if FEnCode="UTF8 BOM" then return; if FEnCode = "None" then return ; FEditer.ChangedFlag := true; FEnCode := "UTF8 BOM"; FLastversion := ""; end function ToANSI(); begin if FEnCode="ANSI" then return; if FEnCode = "None" then return ; FEditer.ChangedFlag := true; FEnCode := "ANSI"; FLastversion := ""; end function currentcodeisnone(); begin if FEnCode="UTF8" then begin FEnCode := "None"; end end function CurrentCodeIsUtf8(); begin if FEnCode="ANSI" or FEnCode="None" then begin s := FEditer.Text; try s := UTF8toansi(s); FEditer.Text := s; FEnCode := "UTF8"; except end end end function CurrentCodeIsAnsi(); begin if FEnCode="UTF8" then begin FEnCode := "ANSI"; end end function SetLoadScript(s); //保存文件 begin if not ifstring(s)then return; strcode := 0; FEnCode := "None"; if(length(s)>= 2)and ord(s[1])=0xFE and ord(s[2])=0xFF then //ucs2-big begin strcode := 2; FEnCode := "UCS2-big"; //要转换 if length(s)=2 then s := ""; else begin s1 := ""; setlength(s1,length(s)-2); for i := 3 to length(s)-1 step 2 do begin s1[i-2]:= s[i+1]; s1[i-1]:= s[i]; end s := unicodetomultibyte(s1,936); end end else if(length(s)>= 2)and ord(s[1])=0xFF and ord(s[2])=0xFE then //ucs2-little begin strcode := 4; FEnCode := "UCS2-little"; if length(s)=2 then s := ""; else begin s := unicodetomultibyte(s[3:],936); end end else if(length(s)>= 3)and ord(s[1])=0xEF and ord(s[2])=0xBB and ord(s[3])=0xBF then begin FEnCode := "UTF8 BOM"; if length(s)=3 then s := ""; else s := utf8toansi(s[4:]); strcode := 1; end if(0=strcode)then begin if IsTextUTF8(s)=1 then begin FEnCode := "UTF8"; strcode := 1; s := utf8toansi(s); end else begin if isTextGBK(s)=1 then begin FEnCode := "ANSI"; end end end FLastVersion := s; FEditer.Text := s; FEditer.ExecuteCommand(FEditer.ecGotoXY,array(1,1)); FEditer.ClearUndo(); if FEnCode = "None" then FEditer.ReadOnly := true; FEditer.ChangedFlag := false; if not FTslSynText then return; if not(s)then return; if not FTslParser then FTslParser := new ttslscripparser(); #! end //FTslParser := nil; end function GetClassInfo(); //获得信息 begin if not FTslParser then return array(); txt := FEditer.Text; if txt <> FGetInfoText then begin FGetInfoText := txt; FTslParser.Script := txt; FGetInfoChace := FTslParser.GetClassInfo(1); end return FGetInfoChace; end function getmfunctioninfo(); begin if not ftslparser2 then ftslparser2 := new ttslscripparser(); ftslparser2.Script :=FEditer.Text; return ftslparser2.gettslfunctions(); end private fscriptname; ftslparser2; FEnCode; FLastFileTime; FTslSynText; function GetInfoRowCol(v); //获得行列 begin rs := PosToRowCol(FGetInfoText,array(v["startpos"]-1,v["endpos"])); return rs; end function GetInfoRowCol2(v); //获得行列结尾 begin rs := PosToRowCol(FGetInfoText,array(v["beg"]-1,v["end"])); return rs; end function PosToRowCol(s,ps); //位置换算 begin r := array(); idx := 0; pi := ps[idx]; ri := ci := 1; for i := 1 to length(s) do begin vi := s[i]; if vi="\n" then begin ri++; ci := 1; end else ci++; if i=pi then begin r[idx]:= array(ri,ci); idx++; pi := ps[idx]; end end return r; end FTslParser; // FGetInfoChace; //class 信息 FGetInfoText; //文本 FLastVersion; //脚本 FScriptPath; //路径 FOrgScriptPath; //原始路径 function setFscripttype(v); begin if (v=0 or v=1) and v<>Fscripttype then begin Fscripttype := v; FLastVersion := FEditer.Text; end end function SetScriptPath(v); begin sp := ioFileseparator(); ddex := -1; fscriptname:=""; if ifstring(v)then begin for i := length(v) downto 1 do begin if v[i]=sp then begin Caption := v[(i+1):]; if ddex>i then begin fscriptname := v[(i+1):(ddex)]; end else begin fscriptname := v[(i+1):]; end break; end if ddex=-1 and v[i]="." then begin ddex := i-1; if lowercase(v[i:])in array(".tsl",".tsf")then FTslSynText := true; end end FScriptPath := v; FOrgScriptPath := v; FEditer.Caption := v; end end end type TPageEditer=class(TPage) //多页编辑 function Create(AOwner);override; begin inherited; end function MouseUp(o,e);override; begin inherited; if e.button()=mbRight then begin return CallDatafunction(FPageItemOnRClick,self,e); end end function CallSelChanged();override; begin it := Currentitem; if it then begin it.FEditer.SetBoundsRect(getediterrect()); it.FEditer.Visible := true; it.FEditer.SetFocus(); end inherited; end function CallSelChanging();override; begin inherited; it := CurrentItem; if it and it.FEditer then it.FEditer.Visible := false; end function Recycling();override; begin inherited; FCliper := nil; FMenu := nil; FPageItemOnRClick := nil; end function DoMouseWheel(o,e);override; begin IF ssCtrl in e.shiftstate then begin fw := font.Width; hw := font.height; if e.delta<0 then begin if fw>6 then begin if fw=18 then begin fw :=17; hw :=34; end finfo := array("width":fw-1,"height":hw-2); end end else begin if fw<24 then begin if fw=16 then begin fw := 17; hw := 34; end finfo := array("width":fw+1,"height":hw+2); end end if finfo then begin font := finfo; callMessgeFunction(onscrollfont,o,finfo); InValidateRect(nil,false); end return; end end [weakref] onscrollfont; function DoControlAlign();override; begin inherited; it := CurrentItem; if it then begin it.FEditer.SetBoundsRect(getediterrect(trc)); end end property PageItemOnRClick read FPageItemOnRClick write FPageItemOnRClick; private function getediterrect(); begin rc := ClientRect; return rc; end [weakref]FPageItemOnRClick; end type TTslChmHelp=class() function SearchWord(s); begin if not s then return; if fapi then return fapi.open_chm((FTSLinterpPath+FChmName),s); end function ShowTslLangChm(); begin if fapi then return fapi.open_chm((FTSLinterpPath+FChmName)); end function showeditorchm(); begin if fapi then return fapi.open_chm((FTSLinterpPath+FeditorChmName)); end function Create(p); begin fapi := p; FChmName := "help"$ioFileseparator()$"LANGUAGEGUIDE.CHM"; FeditorChmName := "help"$ioFileseparator()$"EDITORGUIDE.CHM"; FTSLinterpPath := TS_ModulePath(); end property ChmName read FChmName write FChmName; private [weakref]fapi; FTSLinterpPath; FHanle; FChmName; FeditorChmName; end type TEditer=class(TCustomcontrol) //包括工具栏,状态栏,输出,查找 function Create(AOwner);override; begin inherited; if not Fhightercolor then Fhightercolor := new thighlitcolor(self); FOpenHistory := new TMyarrayb(); FFistShows := array(); FSynHCS := New TMyArrayA(); //构造部件 FLastDispathTime := 0; FTslexe := gettslexe() ;//SysExecName(); FTabChar := " "; FTabWidth := 4; FCurrentItemCode := array(); FGoBackA := new TMyarrayB(); FGoBackB := new TMyarrayB(); //FToolbar := new TToolBar(self); //工具栏 ftoolbara := new TToolBar(self); //工具栏 ftoolbarb := new TToolBar(self); //工具栏 FStatus := new TStatusBar(self); //状态栏 fcoolbar := new tcoolbar(self); fcoolbar.ParentFont := false; ftoolbara.Align := alNone; ftoolbarb.Align := alNone; //ftoolbara.Width := 430; //ftoolbarb.Width := 250; fcoolbar.autosize := true; FInfoShowWnd := new TEditerAuxiliary(self); FPageEditer := new TPageEditer(self); FPageEditer.onscrollfont := function(o,ft)begin fh := ft["height"]; if fh>34 then return ; global g_editer_font_size := ft; self.Notification(self,array("font",ft)); FinCodemap.FTree.font := ft; FinCodemap.FTree.ItemHeight := fh+6; if fh<20 then begin isz := array(24,24); end else if fh>=20 and fh<24 then begin isz := array(28,28); end else if fh>=24 and fh<28 then begin isz := array(32,32); end else if fh>=28 and fh<31 then begin isz := array(36,36); end else begin isz := array(40,40); end FImages.imgsize := isz; fcoolbar.font := ft; end //FPageEditer.CloseBtn := true; FPageEditer.Onbmpbclick := function(o,e) begin it := e._Tag; if not it then return ; if it.fisnewfile then //单独处理新建关闭 begin if MessageboxA("新建文件还未保存!关闭将删除","提示",1,self)= IDOK then begin f := it.OrigScriptPath; DeletePageItem(it); if fileexists("",f) then filedelete("",f); end end else begin if JudgeItemState(it)then return; if it.FEditer.ChangedFlag then begin mr := MessageboxA(format("是否保存:%s",it.OrigScriptPath),"提示",3,self); if mr=IDYES then begin SavePageItem(it); end else if mr=IDCANCEL then begin return; end end DeletePageItem(it); end o.CallSelChanged(); end FPageEditer.OnCloseClick := function(o,e) begin it := GetCurrentItem(); if not it then return ; if JudgeItemState(it)then return; if it.FEditer.ChangedFlag then begin mr := MessageboxA(format("是否保存:%s",it.OrigScriptPath),"提示",3,self); if mr=IDYES then begin SavePageItem(it); end else if mr=IDCANCEL then begin return; end end DeletePageItem(it); end; FFindWnd := new TFindWnd(self); //查找 FFindWnd.ParentFont := false; FFindWnd.font := array("height":20,"width":10); FGotoLineWnd := new TGoToLineWnd(self); //共同 FListPages := new TListPages(self); //tab 跳转页面 FEchoWnd := new TEditerEchoWnd(self); FEchoWnd.font := array("height":22,"width":11,"escapement":0,"orientation":0,"weight":400,"italic":0,"underline":0,"strikeout":0, "charset":0,"outprecision":0,"clipprecision":0,"quality":1,"pitchandfamily":1,"facename":"Courier New","color":0); FTslDebug := new TTslDebug(self); FFindListWnd := new TFindListWnd(self); FFileopen := new TOpenFileADlg(self); FFileSave := new TSavefileADlg(self); FFileopen.WndOwner := self; FFileSave.WndOwner := self; //初始部件 ////////////////////////////////////// FEchoWnd.Border := true; FEchoWnd.WsSysMenu := false; FEchoWnd.WsSizeBox := false; FEchoWnd.Caption := "echo..."; FFindListWnd.Caption := "find...."; FFindListWnd.OnDblClick := thisfunction(FindListChoosed); FGotoLineWnd.Visible := false; ///////////////////////// FFindWnd.Visible := false; FFileSave.Filter := array("any":"*.*","tsl文件":"*.tsl;*.tsf"); FFileSave.Caption := "另存为"; FFileopen.Filter := array("any":"*.*","tsl文件":"*.tsl;*.tsf"); FPageEditer.OnSelChanged := thisfunction(PageItemSelChanged); //////// FListPages.Visible := false; //////////////////////////// FPageMenu := new TPopUpMenu(self); for i,v in array("关闭","关闭其他标签","关闭左侧所有","关闭右侧所有","复制文件名","复制文件全名","重新加载","打开目录","另存为") do begin mi := new TMenu(self); mi.Caption := v; mi.Parent := FPageMenu; mi.OnClick := thisfunction(PageMenuClick); end FExecuteEditer := new TExecuteEditer(self); FExecuteEditer.visible := false; //////////// FPageEditer.PageItemOnRClick := thisfunction(PageItemOnRClick); FImages := new TControlImageList(self); //FImages.Width := 24; //FImages.Height := 24; FImages.imgsize := array(24,24); imgs := GetEditIcons(); id := 0; FToolbtns := array(); dbgbtns := array(); for i,v in imgs do begin bt := new TToolButton(self); FToolbtns[i]:= bt; if v=0 then begin //bt.stylesep := true; continue; end else begin bmp := new TBitmap(); bmp.Readvcon(HexFormatStrToTsl(v)); FImages.addbmp(bmp); bt.OnClick := thisfunction(ToolClick); bt.Caption := i; bt.imageid := id; id++; end if i in array("添加/删除断点F5","暂停","继续","进入","跳出","单步","下一行(F8)","终止","刷新符号表","刷新当前符号")then begin dbgbtns[i]:= bt; bt.Parent := ftoolbarb; end else begin BT.parent := ftoolbara;//FToolbar; end end FImages.DrawBmpFirst := true; Fdbgbtns := dbgbtns; FTslDebug.addbtns(dbgbtns); //FToolbar.ImageList := FImages; ftoolbara.autosize := true; ftoolbara.ParentFont := true; ftoolbarb.autosize := true; ftoolbarb.ParentFont := true; ftoolbara.ImageList := FImages; ftoolbarb.ImageList := FImages; ftoolbara.Parent := fcoolbar; ftoolbarb.Parent := fcoolbar; FInfoShowWnd.Visible := false; //FInfoShowWnd.WsSysMenu := true; FInfoShowWnd.WSsizebox := true; FInfoShowWnd.height := 200; //FInfoShowWnd.OnSize := thisfunction(DoControlAlign); FInfoShowWnd.OnCloseClick := function(o,e) begin o.visible := false; e.skip := true; DoControlAlign(); end ///////////////////// FStatus.Items := array(("text":"","width":0.85),("text":"","width":0.16)); ///////////////////////////////////////// //FInfoShowWnd.Caption := "信息:"; ////构造节点//////////////////////////////////////////////////// //FToolBar.Parent := self; FinCodemap := new tfincodemap(self); FinCodemap.WsSizeBox := true; fcoolbar.arrange := "0,1"; FStatus.Parent := self; FInfoShowWnd.Parent := self; FinCodemap.Parent := self; fcoolbar.Parent := self; FPageEditer.Parent := self; FGotoLineWnd.Parent := self; FFindWnd.parent := self; FFileopen.parent := self; FFileSave.parent := self; FListPages.parent := self; FExecuteEditer.parent := self; //FEchoWnd FInfoShowWnd.AddWnd(FEchoWnd); FInfoShowWnd.AddWnd(FFindListWnd); FInfoShowWnd.AddWnd(FTslDebug); FTempPageItem := new TPageEditerItem(FPageEditer); ///////////// FSynClasses["txt"]:= array(class(TSynHighLighter),class(TSynCompletion),";txt;"); FSynClasses["tsl"]:= array(class(TTslSynHighLighter),class(TTslCompletion),";tsl;tsf;pas;stm;"); FSynClasses["json"]:= array(class(TJsonSynHighLighter),class(TSynCompletion),";json;"); FSynClasses["js"]:= array(class(TJsSynHighLighter),class(tjssyncompletion),";js;"); FSynClasses["css"]:= array(class(TcssSynHighLighter),class(tcsssyncompletion),";css;"); FSynClasses["xml"]:= array(class(TxmlSynHighLighter),class(tcsssyncompletion),";xml;"); FSynClasses["html"]:= array(class(ThtmlSynHighLighter),class(tcsssyncompletion),";html;"); FSynClasses["ini"]:= array(class(TINISynHigLighter),class(TSynCompletion),";ini;"); FSynClasses["bat"]:= array(class(TBatSynHigLighter),class(TSynCompletion),";bat;cmd;"); FSynClasses["tfm"]:= array(class(ttfmhighlighter),class(TSynCompletion),";tfm;"); FSynClasses["None"]:= array(nil,nil,""); FTslChmHelp := new TTslChmHelp(_wapi); FCodeFormatInfo := array("wordct":80,"charct":200,"syn":true,"sel":false,"arraytype":0,"matchfirst":1,"matchidx":1,"case":false); FPageEditer.OnDblClick := function(o,e) begin CreateAFile(); end ffuncfind := new t_function_finder(self); FShortCutshower := new t_shortcut_keys_view(self); end function PopUpAuxiliary(); begin FInfoShowWnd.ShowPopUp(); end function ClearPageItemMark(it); begin if not it then it := GetCurrentItem(); if not it then return; ed := it.FEditer; ls := ed.Lines; canval := false; for i := 0 to ls.length()-1 do begin li := ls[i]; if li.FMarked then begin li.FMarked := false; canval := true; end end if canval then ed.InValidateRect(nil,false); end function GetAllPageItems(); begin return FPageEditer.PageItems; end function SaveFileByName(n); begin for i,v in FPageEditer.PageItems.Data do begin if v.ScriptPathIs(n)then begin return SavePageItem(v); end end end function GetAllPagesInfo(); begin r := array(); its := FPageEditer.PageItems; for i := 0 to its.Length()-1 do begin it := its[i]; r["pages"][i]["filename"]:= it.OrigScriptPath; edt := it.FEditer; r["pages"][i]["r"]:= edt.TopLine; //edt.CaretY; ls := edt.Lines; f2s := array(); for j := 0 to ls.Length()-1 do begin if ls[j].FMarked then f2s[j]:= true; end r["pages"][i]["f2"]:= f2s; r["pages"][i]["isnewfile"]:= it.fisnewfile; end it := GetCurrentItem(); if it then begin r["currentpage"]:= array(it.OrigScriptPath,it.FEditer.TopLine); end //FPageEditer.DoControlAlign(); return r; end function CloseScriptByFileName(n); begin for i,v in FPageEditer.PageItems.Data do begin if v.ScriptPathIs(n)then begin return DeletePageItem(v); end end end function getpageitemcount(); //获得页面数量 begin return FPageEditer.pageitemcount; end function CloseAllPageItems(it); begin its := FPageEditer.PageItems; tits := its.Data; FPageEditer.CloseAllItem(it); for i,v in tits do begin if v=it then begin cit := it; continue; end v.Recycling(); end if cit then cit.FEditer.ReCreateCaret(); end function SaveAllPageItems(); //保存所有 begin its := FPageEditer.PageItems; for i,v in its.Data do begin JudgeItemState(v); end its := FPageEditer.PageItems; for i := 0 to its.Length()-1 do begin SavePageItem(its[i]); end end function WMUSER(o,e):WM_USER;override; begin inherited; if e.wparam=101 and e.lparam=102 then begin self.Enabled := true; end end function EndFind(); begin FIsFinding := false; _send_(WM_USER,101,102,1); end function DoFind(d,o); begin if FIsFinding then return; o.SetStatusText("查找....."); o.SaveCurrentEditer(); self.Enabled := false; FIsFinding := true; if {not(d["c_reg"])}true then begin if(d["section"]="查找")and(d["btn"]="计数")then begin ct := "noshow"; //FindAllInCurrent(d,o,nil,ct); Find_All(d,o,nil,ct); o.SetStatusText(format("查找到 %d处",ct)); return EndFind(); end else if(d["section"]="查找")and(d["btn"]="全部查找")then begin FFindListWnd.Clean(); ShowFindWnd(); //FindAllInCurrent(d,o,nil,ct); Find_All(d,o,nil,ct); o.SetStatusText(format("查找到 %d处",ct)); return EndFind(); end else if(d["section"]in array("查找","替换"))and(d["btn"]="查找")then begin find_one(d,o); //FindInCurrent(d,o); return EndFind(); end else if(d["section"]in array("替换"))and(d["btn"]="替换")then begin if d["replace"]<> d["target"]then begin //FindInCurrent(d,o,nil,1); find_one(d,o,nil,1); end return EndFind(); end else if(d["section"]in array("替换"))and(d["btn"]="全部替换")then begin if d["replace"]<> d["target"]then begin FFindListWnd.Clean(); ShowFindWnd(); //ReplaceAllInCurrent(d,o,nil,idx); replace_allincurrent(d,o,nil,idx); o.SetStatusText(format("替换 %d处",idx)); end return EndFind(); end else if(d["section"]in array("文件查找"))and(d["btn"]="全部替换")then begin if messageboxa("即将在目录中替换内容!!","提示",mb_YesNo,self.Handle)<> IDYES then return EndFind(); FFindListWnd.Clean(); ShowFindWnd(); //FindInFiles(d,o,true,ct); Find_InFiles(d,o,true,ct); o.SetStatusText(format("总共替换 %d处",ct)); return EndFind(); end else if(d["section"]in array("文件查找"))and(d["btn"]="查找")then begin FFindListWnd.Clean(); ShowFindWnd(); //FindInFiles(d,o,false,ct); Find_InFiles(d,o,false,ct); o.SetStatusText(format("总共查找 %d处",ct)); return EndFind(); end end o.SetStatusText("功能开发中...."); EndFind(); end function setdbugruncall(drc); begin FTslDebug.runbtncall := drc; end function DebugPageItem(it,h); begin if not it then return; showdbugwnd(); FTslDebug.Debuglocal(it); end function Debugremote(it); begin showdbugwnd(); FTslDebug.Debugremote(it); end function DbgNextLine(); begin FTslDebug.DbgNextLine(); //FDebuger end function ExecutePageItem(it,h); begin if not it then return; ShowEchoWnd(); if FEchoWnd.Exeing()then return FEchoWnd.Endexe(); s := FExecuteEditer.GetCurrentExuteString(it.Scriptpath); FEchoWnd.Exec("",s,h); end compile_config; fpg_config_infos; function buildpageitem(it); begin if not ifarray(fpg_config_infos) then fpg_config_infos := array(); if not it then return; ShowEchoWnd(); if FEchoWnd.Exeing()then return FEchoWnd.Endexe(); r := array(); f := it.ScriptPath; pginf := fpg_config_infos[f]; if not pginf then begin if 1=parseregexpr("\\.tsf$",f,"i",m,mp,ml) then begin r["build"] := "--buildlib"; {$ifdef linux} hz := ".so" ; {$else} hz := ".dll"; {$endif} end else begin r["build"] := "--buildexe"; {$ifdef linux} hz := ".out" ; {$else} hz := ".exe"; {$endif} end r["buildfile"] := f; r["resourcepat"] := "*.ini,*.tfm"; ot := TS_ModulePath()+ it.scriptname+hz; ds := getlibpathstr(); r["libpath"] := ds; if ot then r["output"] := ot; r["dependsdir"] := replacetext(ds,";",","); end else begin r := pginf; end nr := build_with_data(nil,r); if nr then fpg_config_infos[f] := nr; end function get_local_pos(x,y); begin o := self; x := 0; y := 0; while o and not(o.WSpOPUp) do begin o := o.Parent; end if o then begin x := o.left+100; y := o.top+20; end end function build_with_data(dir,data); begin if not compile_config then begin compile_config := new t_compile_config(self); compile_config.visible := false; compile_config.parent := self; fcompier :=1; end compile_config.base_dir := dir; compile_config.set_config(data); get_local_pos(x,y); compile_config.left := x; compile_config.top := y; if compile_config.ShowModal() then begin ndata := compile_config.get_config(); ShowEchoWnd(); if FEchoWnd.Exeing()then return FEchoWnd.Endexe(); FEchoWnd.build(dir,ndata); return ndata; end return false ; end function SavePageItem(it,f); begin if not it then return -1; if f or it.PrePareSave()then begin it.FEditer.ChangedFlag := false; s := it.LastText; case it.EnCode of "UTF8": begin s := AnsiToutf8(it.LastText); end "UTF8 BOM": begin //0xEF, 0xBB, 0xBF s := " "; s[1]:= 0xEF; s[2]:= 0xBB; s[3]:= 0xBF; s += AnsiToutf8(it.LastText); //ECHO "SAVE UTFB-BOM\r\n"; end "UCS2-little": begin s := " "; s[1]:= 0xFF; s[2]:= 0xFE; s += multibytetounicode(it.LastText,936); end "UCS2-big": begin s2 := " "; s2[1]:= 0xFF; s2[2]:= 0xFE; s2 += multibytetounicode(it.LastText,936); s := ""; setlength(s,length(s2)); for i := 1 to length(s2)-1 step 2 do begin s[i]:= s2[i+1]; s[i+1]:= s2[i]; end end end; fp := it.OrigScriptPath; if it.FISstm then begin try v := eval(&s); //s := tostm(v); r := exportfile(ftstream(),"",fp,v); it.ReGetLastLoadTime(); dopageitemsaved(it); return r; except end end if it.scripttype=1 then begin s := replacetext(s,"\r\n","\n"); end r := ReWriteString(fp,s); it.ReGetLastLoadTime(); dopageitemsaved(it); return r; end return 1; end function dopageitemsaved(it);virtual; begin end function ShowFindWnd(); begin FInfoShowWnd.ShowByTag(FFindListWnd); ShowLogWnd(true); end function showdbugwnd(); begin FInfoShowWnd.ShowByTag(FTslDebug); ShowLogWnd(true); end function ShowEchoWnd(); begin FInfoShowWnd.ShowByTag(FEchoWnd); ShowLogWnd(true); end function SwitchLogWnd(); begin FInfoShowWnd.Visible := not(FInfoShowWnd.Visible); DoControlAlign(); end function SetFindHistroy(d); begin FFindWnd.SetHistory(d); end function GetFindHistory(); begin return FFindWnd.GetHistory(); end function getdbugtoolbtns(); begin return Fdbgbtns; end function gettoolbar(); begin return fcoolbar;//FToolbar; end function gettoolbarimglist(); begin return ftoolbara.ImageList; end function gettoolbarbtn(idxs); begin if ifarray(idxs) then begin r := array(); ri := 0; for i,v in idxs do begin bi := ftoolbara.getbtnbyindex(v); if bi then r[ri++] := bi; end return r; end return array(ftoolbara.getbtnbyindex(1),ftoolbara.getbtnbyindex(2)); end function ShowLogWnd(flg); begin n :=(ifnil(flg)or flg)?true:false; if n=FInfoShowWnd.Visible then return; FInfoShowWnd.Visible := n; DoControlAlign(); end function JudgeItemState(it); //状态处理 begin lt := it.GetLastLoadTime(); nlt := it.ReGetLastLoadTime(); if not lt then return; if (nlt <> lt) then //文件改变了 begin FPageEditer.FCanDraged := false; FPageEditer.MouseDrageLeave(); //此处不知为什么会报错 if not nlt then //已经删除 begin if Messageboxa("文件已经被删除,依然保存请按确定","提示",1,self)=IDOK then begin CreateDirWithFileName(it.OrigScriptPath); //新建 SavePageItem(it,true); end else begin DeletepageItem(it); //删除 return true; end end else //被其他程序修改 begin if (it.FEditer.ChangedFlag = false) and fcloseflag then begin return ; end if Messageboxa(format("%s\r\n被其他程序修改是否重新加载",it.ScriptPath),"提示",mb_YesNo,self)=IDYES then begin LoadFromFile(it,true); end else begin it.FEditer.ChangedFlag := true; end end end end function PageItemTextChanged(o,flg); begin its := FPageEditer.Pageitems; cit := GetCurrentItem(); for i := 0 to its.Length()-1 do begin it := Its[i]; if it.FEditer=o then begin if cit=it then begin if it.fisnewfile then cp := (flg?"*":"")+" new "; else cp :=(flg?"*":"")+it.OrigScriptPath; Caption := to_ansi_str(cp); end callDatafunction(OnPageEditerChanged,it,flg); it.BitmapA := flg?GetNeedSaveBmp():GetNneedSaveBmp(); return; end end end function DeletePageItem(it); begin idx := FPageEditer.GetItemIndex(it); if idx >= 0 then begin //f := it.OrigScriptPath; FPageEditer.DeleteItemByIndex(idx); it.Recycling(); it := GetCurrentItem(); if it then it.FEditer.ReCreateCaret(); //if it.fisnewfile then filedelete("",f); end end function PageItemSelChanged(o,e);virtual; begin it := GetCurrentItem(); if not it then return Caption := "editer..."; //if JudgeItemState(it) then return ; FCurrentItemCode[length(FCurrentItemCode)]:= it; if it.fisnewfile then begin cp :=(it.FEditer.ChangedFlag?"*":"")+" new "; end else begin cp :=(it.FEditer.ChangedFlag?"*":"")+it.OrigScriptPath; end Caption := to_ansi_str(cp); CallDatafunction(FOnPageItemSelChanged,self(true),it); cp := it.FEditer.Completion; if cp and it.FInitCompletion then begin it.FInitCompletion := false; cp.PrePareCompletion(it.Caption); end EditerCaretChanged(it.FEditer,nil); if FinCodemap then FinCodemap.ontimerdo(); end function docloseapageitem(it); begin if it.fisnewfile then //单独处理新建关闭 begin f := it.OrigScriptPath; DeletePageItem(it); if fileexists("",f) then filedelete("",f); return ; end if JudgeItemState(it)then return; if it.FEditer.ChangedFlag then begin mr := MessageboxA(format("是否保存:%s",it.OrigScriptPath),"提示",3,self); if mr=IDYES then begin if SavePageItem(it)=0 then begin it.FEditer.ChangedFlag := true; return 0; end end else if mr=IDCANCEL then begin return; end end DeletePageItem(it); end function PageMenuClick(o,e); begin it := GetCurrentItem(); if not it then return; case o.Caption of "关闭": begin docloseapageitem(it); end "关闭左侧所有": begin its := GetAllPageItems(); itss := array(); for i := 0 to its.Length()-1 do begin iti := its[i]; if iti=it then break ; itss[i] := iti; end fcloseflag := true; try for i,iti in itss do begin docloseapageitem(iti); end finally fcloseflag := false; end; if itss then FPageEditer.CallSelChanged(); end "关闭右侧所有": begin dodel := 0; its := GetAllPageItems(); itss := array(); for i := 0 to its.Length()-1 do begin itss[i] := its[i]; end fcloseflag := true; try for i,iti in itss do begin if dodel then docloseapageitem(iti); if iti=it then begin dodel := 1; end ; end finally fcloseflag := false; end; if dodel then FPageEditer.CallSelChanged(); end "关闭其他标签": begin Cit := it; its := GetAllPageItems(); fcloseflag := true; try for i := 0 to its.Length()-1 do begin it := its[i]; if it.FEditer.ChangedFlag then begin r := MessageBoxA("存在未保存的文件,是否保存!","提示",3,self); if r=IDYES then begin SaveAllPageItems(); break; end else if r=IDCANCEL then begin return; end else begin end break; end end CloseAllPageItems(Cit); finally fcloseflag := false; end; end "另存为": begin if JudgeItemState(it)then return; //FFileopen.OverwritePrompt := true; if FFileSave.OpenDlg()then begin fn := FFileSave.FileName; dfn := it.ScriptPath; CreateDirWithFileName(fn); //echo format('FileCopy("","%s","","%s",false)',dfn,fn); ret := FileCopy("",dfn,"",fn,false); if ret then begin it.ScriptPath := fn; if SavePageItem(it)=0 then begin it.FEditer.ChangedFlag := true; end if it.fisnewfile then begin FileDelete("",dfn); it.fisnewfile := false; end end end //FFileopen.OverwritePrompt := false; end "重新加载": begin LoadFromFile(it,true); end "复制文件全名": begin if not FCliper then FCliper := new TClipBoard(self); FCliper.text := it.OrigScriptPath; end "复制文件名": begin if not FCliper then FCliper := new TClipBoard(self); FCliper.text := it.Caption; end "打开目录": begin p := it.ScriptPath; if FileExists("",p)then begin {for i := length(p)downto 3 do begin if p[i]="\\" then begin p := p[1:i]; break; end end} //_wapi.WinExec('cmd.exe /C start "" "'+p,1); _wapi.openresourcemanager(p); end end "采用cmd执行": begin //ExecutePageItemWithCmd(it); end end end function PageItemOnRClick(o,e); begin if FPageEditer.GetItemIndexByPos(e.pos)>= 0 then o.PopUpMenu := FPageMenu; else o.PoPupMenu := nil; end function PageEditerMenuClick(o,e); begin cp := o.Caption; if ("转unix(LF)"=cp) then begin it := GetCurrentItem(); it.scripttype := 1; SavePageItem(it,1); //it.FEditer.ChangedFlag := true; return ; end else if ("转windows(CR LF)"=cp) then begin it := GetCurrentItem(); it.scripttype := 0; SavePageItem(it,1); return ; end else if ("另存为"=cp) then begin return PageMenuClick(o,e); end else if pos("复制",cp)=1 then begin it := GetCurrentItem(); if it then begin ed := it.FEditer; if ed then begin ed.ExecuteCommand(ed.ecCopy); end //it.FEditer.ReadOnly := not(o.Checked); end return; end else if pos("粘贴",cp)=1 then begin it := GetCurrentItem(); if it then begin ed := it.FEditer; if ed then begin ed.ExecuteCommand(ed.ecPaste); end //it.FEditer.ReadOnly := not(o.Checked); end return; end else if pos("剪切",cp)=1 then begin it := GetCurrentItem(); if it then begin ed := it.FEditer; if ed then begin ed.ExecuteCommand(ed.ecCut); end //it.FEditer.ReadOnly := not(o.Checked); end return; end else if pos("定位",cp)=1 then begin InitShowWndPos(FGotoLineWnd,"g",200,200); FGotoLineWnd.ShowGoto(); return; end else if pos("查看",cp)=1 then begin cs := o.Caption; if length(cs)<6 then return; s :=(o.Caption)[6:]; GetCurrentEditer().Tryjump(s); return; end else if pos("只读",cp)=1 then begin it := GetCurrentItem(); if it then begin it.FEditer.ReadOnly := not(o.Checked); end return; end else if pos("执行",cp)=1 then begin it := GetCurrentItem(); ExecutePageItem(it); return; end else if pos("停止",cp)=1 then begin if FEchoWnd.Exeing()then FEchoWnd.EndExe(); return; end else if cp = "转换为大写" then begin upperorlowercase(1); end else if cp = "转换为小写" then begin upperorlowercase(0); end else if cp = "删除尾空白" then begin seltrimright(); end end function PageEditerOnRClick(o,e); begin o.popupMenu := nil; if not FPageEditerMenu then begin FPageEditerMenu := new TPopUpMenu(self); FPageEditerMenus := array(); for i,v in array("查看","复制(C)","粘贴(V)","剪切(X)","定位(G)","只读","转换为大写","转换为小写","删除尾空白","文档格式","执行(F9)","停止执行","另存为") do begin it := new TMenu(self); it.Caption := v; it.parent := FPageEditerMenu; if "文档格式"=v then begin for j,vj in array("转unix(LF)","转windows(CR LF)") do begin subit := new TMenu(self); FPageEditerMenus[vj]:= subit; subit.Caption := vj ; subit.Parent := it; subit.OnClick := thisfunction(PageEditerMenuClick); end FPageEditerMenus[v] := it; continue; end FPageEditerMenus[v]:= it; it.OnClick := thisfunction(PageEditerMenuClick); end end iflx := GetCurrentItem().scripttype = 1; FPageEditerMenus["转unix(LF)"].Enabled := not iflx; FPageEditerMenus["转windows(CR LF)"].Enabled := iflx; rd := FPageEditerMenus["只读"]; if rd then begin zd := GetCurrentItem().FEditer.Readonly; rd.Checked := zd; for ii,vv in array("转换为大写","转换为小写","删除尾空白","粘贴(V)","剪切(X)","文档格式") do begin it := FPageEditerMenus[vv]; if it then it.Enabled := not zd; end end rd := FPageEditerMenus["查看"]; if rd then begin //mtic; it := GetCurrentEditer(); s := it.CanJump(); if s then begin rd.Caption := "查看:"+s; rd.Enabled := true; end else begin rd.Caption := "查看"; rd.Enabled := false; end end ex := FEchoWnd.Exeing()?true:false; rd := FPageEditerMenus["执行(F9)"]; if rd then rd.Enabled := not ex; rd := FPageEditerMenus["停止执行"]; if rd then rd.Enabled := ex; rd := FPageEditerMenus["执行"]; if rd then begin end o.popupMenu := FPageEditerMenu; //MessageBoxA("MESSAGErclick","tis",0); end function createparams(p);override; begin inherited; P.ExStyle := P.ExStyle .| WS_EX_ACCEPTFILES; end function WMDROPFILES(o,e):WM_DROPFILES; begin opends := _wapi.get_drage_file_names(e.wparam); for i,v in opends do begin arr := FileList("",v); if not(pos("D",arr[0,"Attr"]))then OpenAndGotoFileByName(v); end end function GetOpendPageItemByFileName(n); begin its := FPageEditer.PageItems; for i := 0 to its.Length()-1 do begin it := its[i]; if it.ScriptPathIs(n)then return it; end end function EditerCaretChanged(o,e); //caret 位置改变 begin if GetCurrentEditer()=o then begin FStatus.setitemtext(format("col:%d | %s",o.CaretX,o.PageItem.EnCode),1); if FinCodemap and FinCodemap.Visible then FinCodemap.caretchanged(o.CaretY); end end function OpenScriptByFileName(n); begin if not ifstring(n)then return false; it := GetOpendPageItemByFileName(n); if it then return it; fl := FileList("",n); if not(length(fl)=1)then return false; nn := fl[0,"FileName"]; if(POS("D",fl[0,"Attr"]))then return false; it := new TPageEditerItem(FPageEditer); oit := GetCurrentEditer(); if oit then begin it.FEditer.font := oit.font;//font; end it.FDebuger := FTslDebug; it.FEditer.OnCaretChanged := thisfunction(EditerCaretChanged); it.FEditer.Parent := FPageEditer; it.FEditer.TabChar := FTabChar; it.FEditer.PageItem := it; it.FEditer.hgcolor := Fhightercolor; tf := FTslCacheDir+"newfile"+ioFileseparator()+"new"; if pos(tf,n)=1 then it.fisnewfile := true; it.FEditer.QuckKeys := Thisfunction(EditerQuckKeys); it.FEditer.OnTextSetFocus := function(o,e) begin //echo "\r\n",o.PageItem.Scriptpath; JudgeItemState(o.PageItem); end FPageEditer.PageItems.push(it); nn1 := n; nn1[(length(n)-length(nn)+1):]:= nn; //echo nn1,"==",n,"\r\n"; it.ScriptPath := nn1; it.BitmapA := GetNneedSaveBmp(); it.BitmapB := Closebmp(); LoadFromFile(it,true); for i,v in FReadDirs do begin if not ifstring(v)then continue; if pos(v,n)=1 then begin it.FEditer.ReadOnly := true; break; end end //DoControlAlign(); if it then begin SetHistoryFiles(n); it.FEditer.OnRclick := thisfunction(PageEditerOnRClick); it.FEditer.OnTextChanged := thisfunction(PageITEMtextChanged); end return it; end function GetHistoryFiles(); begin return FOpenHistory.Data; end function SetHistoryFiles(v); begin if ifarray(v)then begin for i,vi in v do begin SetHistoryFiles(vi); end return; end if ifstring(v)and v then begin fcadd := true; for i,vi in FOpenHistory.Data do begin if filenameIsTheSame(v,vi)then begin //fcadd := false; FOpenHistory.Splice(i,1); //删除原来的记录 break; end end if fcadd then begin FOpenHistory.push(v); if FOpenHistory.Length()>30 then FOpenHistory.shift(); end end end function ShowHistoryWnd(); begin if not FHistoryWnd then begin FHistoryWnd := new TMouseMoveList(self); FHistoryWnd.Visible := false; FHistoryWnd.WSpOPUp := true; FHistoryWnd.Parent := self; FHistoryWnd.Caption := "打开历史...."; FHistoryWnd.WSsysMenu := true; FHistoryWnd.WsSizeBox := true; FHistoryWnd.Width := 400; FHistoryWnd.Height := 600; {FHistoryClearMenuPop := new TPopUpMenu(self); FHistoryClearMenu := new TMenu(self); FHistoryClearMenu.Caption := "清空历史记录"; FHistoryClearMenu.Parent := FHistoryClearMenuPop; FHistoryWnd.PopUpMenu := FHistoryClearMenu; FHistoryClearMenu.OnClick := function(o,e)begin FHistoryWnd.SetData(array()); FOpenHistory.Splices(0,FOpenHistory.Length()); end } FHistoryWnd.OnClose := function(o,e) begin o.EndModal(); o.Visible := false; e.skip := true; end FHistoryWnd.OnClick := function(o,e) begin idx := o.getCurrentSelection(); if idx >= 0 then begin n := o.GetItem(idx); o.EndModal(); O.Visible := false; OpenAndGotoFileByName(n); end end end if FOpenHistory.Length()>0 then begin d := FOpenHistory.Data; FHistoryWnd.SetData(d); InitShowWndPos(FHistoryWnd,"history",100,100); FHistoryWnd.ShowModal(); end end function OpenAndGoLineByName(n,L); begin it := OpenScriptByFileName(n); if it then begin if l>0 then begin ed := it.FEditer; ed.ExecuteCommand(ed.ecGoToXY,array(L,1)); end end return it; end function OpenAndGotoFileByName(n,L); begin bit := GetCurrentItem(); if bit then begin if not((ifnil(L)or(L=bit.FEditer.CaretY))and(filenameIsTheSame(n,bit.ScriptPath)))then begin bit := array("file":bit.OrigScriptPath,"line":bit.FEditer.CaretY); if FRebackFlag then FGoBackB.Push(bit); else FGoBackA.Push(bit); end end it := OpenAndGoLineByName(n,L); if it then FPageEditer.SetSel(it); return it; end function CommetCurrentSel(); //注释选择 begin it := GetCurrentEditer(); if it then begin if it.ReadOnly then return; bg := it.BlockBegin; ed := it.BlockEnd; if bg and ed and ed[0]<> bg[0]then begin it.ExecuteCommand(it.ecTab,"//"); end else begin it.ExecuteCommand(it.ecLineStart); it.ExecuteCommand(it.ecString,"//"); end end end function UnCommentCurrentSel(); //取消注释 begin it := GetCurrentEditer(); if it then begin if it.ReadOnly then return; bg := it.BlockBegin; ed := it.BlockEnd; if bg and ed and bg[0]<> ed[0]then begin it.ExecuteCommand(it.ecShifttab,array("//")); end else begin s := it.LineText; if pos("//",s)=1 then begin it.ExecuteCommand(it.ecLineStart); it.ExecuteCommand(it.ecSelLineEnd); if length(s)>= 3 then it.ExecuteCommand(it.ecString,s[3:]); else it.ExecuteCommand(it.ecString,""); end end end end function UnDoCurrentEditer(); begin it := GetCurrentEditer(); if it then begin if it.ReadOnly then return; self.Enabled := false; it.ExecuteCommand(it.ecUndo); self.Enabled := true; if it.ChangedFlag then begin cit := GetCurrentItem(); if it.Text=cit.LastText then // begin it.ChangedFlag := false; end end end end function ToolClick(o,e); // begin case o.caption of "打开文件": begin OpenAFile(); //FPages.OpenAFile(); end "新建": begin CreateAFile(); //FPages.CreateAFile(); end "保存全部": begin return SaveAllPageItems(); end "保存": begin it := GetCurrentItem(); if SavePageItem(it)=0 then begin it.FEditer.ChangedFlag := true; end end "取消注释": begin UnCommentCurrentSel(); end "注释": begin CommetCurrentSel(); end "快捷键说明": begin if not FShortCutshower.Parent then FShortCutshower.Parent := self; InitShowWndPos(FShortCutshower,"surcut",500,150,true); FShortCutshower.Show(); end "撤销": begin UnDoCurrentEditer(); end "反撤销": begin it := GetCurrentEditer(); if it then begin if it.ReadOnly then return; self.Enabled := false; it.ExecuteCommand(it.ecRedo); self.Enabled := true; end end "tsl语法检查": begin it := GetCurrentEditer(); if it then begin if not CheckTslCode(it.Text,err)then begin Messageboxa(err,"提示",0,self); end else messageboxa("符合tsl语法","提示",0,self); end end "tsl代码格式化": begin it := GetCurrentEditer(); if it then begin if 1 <> MessageboxA("将格式化代码!!","提示",1,self.Handle)then return; if it.ReadOnly then return; //sel := FCodeFormatInfo["sel"]; syn := FCodeFormatInfo["syn"]; arraytype := FCodeFormatInfo["arraytype"]; cftype :=(FCodeFormatInfo["cmt"]=1); arraytype :=(arraytype in array(0,1,3))?arraytype:1; sel := true; sel2 := false; if sel then begin s := it.SelText; if s then sel2 := true; end if not s then begin s := it.Text; end if not s then return; if syn then begin if not CheckTslCode(s,err)then begin return Messageboxa(err,"提示-tsl语法错误",0,self); end end try Enabled := false; fs := UNIT(UTslCodeFormat).FormatTsl(s,FTabWidth,wordct,charct,arraytype,cftype); if fs <> s then begin if sel and sel2 then begin it.SelText := fs; end else begin it.Text := fs; it.ExecuteCommand(it.ecGotoXY,array(1,1)); end end finally Enabled := true; end; end end "查找": begin center_popup_wnd(FFindWnd,true); FFindWnd.Show(); end "前进": begin GoToReBack(); end "后退": begin GoToBack(); end "代码地图(alt+m)": begin if FinCodemap and not(FinCodemap.Visible) then begin FinCodemap.doshow(true); end end end end function GetCurrentItem(); begin return FPageEditer.CurrentItem; end function GetCurrentEditer(); begin it := GetCurrentItem(); if it then return it.FEditer; end function DoControlAlign();override; // 对齐 begin if not(FPageEditer and FPageEditer.parent=self) then return; rr := ClientRect; r := rr; codemapin := false; if FinCodemap and not(FinCodemap.WSpOPUp)and FinCodemap.Visible and FinCodemap.Parent=self then begin codemapin := min(FinCodemap.Width,integer(r[2] * 0.5)); //FinCodemap.SetBoundsRect(r); end if fcoolbar.Parent = self then begin htoolbar := true; end if htoolbar then begin fcoolbar.DoControlAlign(); r[3]:= r[0]+fcoolbar.Height; r[0]+=codemapin+2; fcoolbar.SetBoundsRect(r); end r := rr; r[1]:= r[3]-FStatus.Height; FStatus.SetBoundsRect(r); rr := rr; if htoolbar then begin rr[1]:= fcoolbar.Height+1; end rr[3]:= rr[3]-FStatus.Height-1; if FInfoShowWnd.Visible and not(FInfoShowWnd.WSpOPUp)then begin r := rr; r[1]:= r[3]-min(FInfoShowWnd.Height,integer(r[3] * 0.8)); //0.6 靠扩大到 0.8 rr[3]:= r[1]-1; FInfoShowWnd.SetBoundsRect(r); end if codemapin then begin r := rr; r[1] := 1; r[2] := codemapin; rr[0] := codemapin+2; FinCodemap.SetBoundsRect(r); end FPageEditer.SetBoundsRect(rr); end function CreateAFile(); //构造文件 begin if FTslCacheDir then begin idx := 0; while true do begin idx++; fn := FTslCacheDir+"newfile"+ioFileseparator()+"new"+inttostr(idx)+".tsl"; if fileexists("",fn) then continue; r := ReWriteString(fn,""); if r=1 then begin it := OpenAndGotoFileByName(fn); it.fisnewfile := true; end return ; end end FFileopen.Caption := "新建文件--输入文件名点击打开"; FFileopen.Multiselected := false; it := GetCurrentItem(); if it then begin s := it.ScriptPath; sp := ioFileseparator(); for i := length(s)downto 2 do begin if s[i]=sp then begin FFileopen.initialDir := s[1:i-1]; break; end end end if FFileopen.Opendlg()then begin exen := FFileopen.FileName; if FileExists("",exen)then begin r := true; end else r := ReWriteString(exen,""); //exportfile(ftstream(),"",exen,"//createBytsl"); if r=1 then OpenAndGotoFileByName(exen); end end function OpenAFile(); //打开文件 begin FFileopen.Caption := "打开文件"; FFileopen.Multiselected := true; it := GetCurrentItem(); if it then begin if not it.fisnewfile then begin s := it.ScriptPath; sp := ioFileseparator(); for i := length(s)downto 3 do begin if s[i]=sp then begin FFileopen.initialDir := s[1:i-1]; break; end end end end if FFileopen.Opendlg()then begin rs := FFileopen.getResults(); //echo tostn(rs); lenrs := length(rs); for i,v in rs do begin if lenrs=1 and not(FileList("",v))then begin if MessageboxA("文件不存在,点击确定新建.点击取消退出","提示",1)=IDOK then begin ReWriteString(v,""); end end OpenAndGotoFileByName(v,1); end end end function GoToBack(); begin FRebackFlag := true; it := FGoBackA.Pop(); if it then OpenAndGotoFileByName(it["file"],it["line"]); FRebackFlag := false; end function GoToReBack(); begin it := FGoBackB.Pop(); if it then OpenAndGotoFileByName(it["file"],it["line"]); end function seltrimright(); begin ed := GetCurrentEditer(); IF not ed then return; //ed.Lines.SetValueByIndex b := ed.BlockBegin; e1 := ed.BlockEnd; try if b and e1 then begin ed.IncPaintLock(); for i := b[0] to e1[0] do begin s1 := ed.Lines.GetValueByIndex(i-1).FStr; s := trimright(s1); if s1=s then continue; ed.Lines.SetValueByIndex(i-1,s); end ed.ExecuteCommand(ed.ecGoToXY,b); ed.ExecuteCommand(ed.ecSelGotoXY,e1); ed.DecPaintLock(); end else begin s1 := ed.LineText; s := trimright(s1); if s1<>s then ed.LineText :=s; end except end; end function upperorlowercase(f); begin ed := GetCurrentEditer(); if ed.ReadOnly then return ; IF not ed then return; s := ed.SelText; if s then begin b := ed.BlockBegin; e1 := ed.BlockEnd; ed.SelText := f?uppercase(s):lowercase(s); ed.ExecuteCommand(ed.ecGoToXY,b); ed.ExecuteCommand(ed.ecSelGotoXY,e1); end end function EditerQuckKeys(o,e);virtual; //快捷键 begin if e.Result = 0 then begin case e.charcode of VK_F9: begin if ssctrl in e.ShiftState()then begin ShowExeEditer(); e.skip := true; return true; end ExecutePageItem(GetCurrentItem()); e.skip := true; return true; end end; end if e.Result=0 and(ssAlt in e.shiftstate)then begin case e.charcode of VK_F5: //大写 begin upperorlowercase(1); e.skip := true; return true; end ord("M"): begin if FinCodemap then begin FinCodemap.doshow(1); end e.skip := true; return true; end end end if ssCtrl in e.ShiftState then begin if e.Result=0 then //down begin case e.CharCode of 220,191: begin if e.CharCode=220 then UnCommentCurrentSel(); else CommetCurrentSel(); e.skip := true; return true; end VK_F5: //小写 begin upperorlowercase(0); return true; end ord("D"): begin ed := GetCurrentEditer(); if not ed then return; if ed.ReadOnly then return; //xy := ed.CaretY; ed.ExecuteCommand(ed.ecLineEnd,nil); S := ed.LineText; ed.ExecuteCommand(ed.ecString,"\r\n"+s); return; end ord("J"): begin InitShowWndPos(ffuncfind,"ff",200,150); ffuncfind.show_finder(); return true; end ord("R"): begin center_popup_wnd(FFindWnd,true);//InitShowWndPos(FFindWnd,"fr",200,150); FFindWnd.oPENreplace(); FFindWnd.Show(); return true; end ord("E"): begin ed := GetCurrentEditer(); IF not ed then return; s := ed.CaretWords(); if s then ed.Tryjump(s); return true; end ord("F"): begin center_popup_wnd(FFindWnd,true);//InitShowWndPos(FFindWnd,"fr",200,150); FFindWnd.OpenFind(); FFindWnd.Show(); return true; end ord("G"): begin InitShowWndPos(FGotoLineWnd,"g",200,200); FGotoLineWnd.ShowGoto(); return true; end {ord("O"): begin OpenAfile(); return true; end ord("N"): begin CreateAfile(); return true; end} ord("Z"): begin UnDoCurrentEditer(); return true; end ord("S"): begin it := GetCurrentItem(); if 0=SavePageItem(it)then begin it.FEditer.ChangedFlag := true; end if FinCodemap then FinCodemap.ontimerdo(); return true; end end end else //up begin case e.CharCode of VK_TAB: begin TabChecking(ssShift in e.ShiftState); return true; end VK_F3: begin d := FFindWnd.GetINfo(); d["section"]:= "查找"; d["btn"]:= "查找"; d["c_revers"]:= 1; DoFind(d,FFindWnd); return true; end end end end if e.Result=1 then begin case e.CharCode of 17: begin if e.Result then begin TabCheckChanged(); end end VK_F7: begin SwitchLogWnd(); return true; end VK_F8: begin DbgNextLine(); return true; end VK_F3: begin d := FFindWnd.GetINfo(); d["section"]:= "查找"; d["btn"]:= "查找"; d["c_revers"]:= 0; DoFind(d,FFindWnd); return true; end VK_F1: begin it := GetCurrentItem(); if it.FSynType="tsl" then begin ed := it.FEditer; IF not ed then return; s := ed.CaretWords(); if s then FTslChmHelp.SearchWord(s); end return true; end end; end end function ShowTslLangChm(); begin FTslChmHelp.ShowTslLangChm(); end function showeditorchm(); begin FTslChmHelp.showeditorchm(); end function InitShowWndPos(wnd,n,ix,iy,flg); //计算初始位置 begin if flg or (not FFistShows[n])then begin FFistShows[n]:= true; return move_popwnd_to_center2(wnd); xy := Clienttoscreen(ix,iy); wnd.left := xy[0]; wnd.top := xy[1]; end end function SetPageItemSyn(it,n); begin if not it then return; if not ifstring(n)then return; if it.FSynType=n then return; hc := GetFreeSynObjectByName(n); if hc then begin cp := hc[1]; it.FEditer.IncPaintLock(); it.FEditer.HighLighter := hc[0]; it.FEditer.Completion := hc[1]; it.FEditer.DecPaintLock(); cp.OnJumpChoosed := function(cmp,d); begin f := d["file"]; nf :=(f?(cmp.GetFileFullPath(f)):GetCurrentItem().OrigScriptPath); OpenAndGotoFileByName(nf,d["line"]); end cit := GetCurrentItem(); if cit=it then begin it.FInitCompletion := false; cp.PrePareCompletion(it.Caption); end else begin it.FInitCompletion := true; end it.FSynType := n; end else begin it.FEditer.IncPaintLock(); it.FEditer.HighLighter := nil; it.FEditer.Completion := nil; it.FEditer.DecPaintLock(); it.FSynType := n; end end function Recycling();override; begin inherited; FSynHCS := nil; FCurrentItemCode := array(); FPageEditer := nil; fcoolbar := nil; ftoolbara := nil; ftoolbarb := nil; FToolbar := nil; FStatus := nil; FInfoShowWnd := nil; FPageMenu := nil; FPageEditerMenu := nil; FPageEditerMenus := array(); FOnPageEditerChanged := nil; fOnPageItemSelChanged := nil; FListPages := nil; FinCodemap := nil; FEchoWnd := nil; FFindListWnd := nil; FTempPageItem := nil; FExecuteEditer := nil; FTslDebug := nil; end function GetSynTypeNames(); begin return FSynClasses.IndexNames(); end function SetCodeFormatInfo(d); begin if ifarray(d)then begin FCodeFormatInfo := d; settslsyninfo(); end else return FCodeFormatInfo; end function getexecuteparams(f); //获得当前的执行参数 begin return FExecuteEditer.GetCurrentExuteparams(f); end function ShowExeEditer(flg); begin if ifnil(flg)or flg then begin InitShowWndPos(FExecuteEditer,"exe",200,200); FExecuteEditer.showexeediter(); end else begin FExecuteEditer.Visible := false; end end function getlibpathstr(); begin dirs := ""; fio := ioFileseparator(); for i,v in FTslSearchDir do begin if ifstring(v)then begin if v[length(v)]=fio then begin dirs += v; end else begin dirs += v; dirs += fio; end end dirs += ";"; end return dirs; end function echoAppendString(s); begin FEchoWnd.AppendString(s); end published //property 位置 FHistoryDir; property hltcolor read gethclor write sethclor; function showhltcolor(); begin if not fhltediter then begin fhltediter := new t_editor_color_mgr(self); fhltediter.ParentFont := false; fhltediter.Parent := self; fhltediter.colorinfo := fhltediterdata; end move_popwnd_to_center2(fhltediter); if fhltediter.ShowModal() then begin Fhightercolor.colors := fhltediter.colorinfo; end end property OnPageEditerChanged read FOnPageEditerChanged write FOnPageEditerChanged; property OnPageItemSelChanged read FOnPageItemSelChanged write FOnPageItemSelChanged; property TslSearchDir read FTslSearchDir write SetTslSearchDir; property TslCacheDir read FTslCacheDir write SetTslCacheDir; property TabWidth read FTabWidth write SetTabWidth; property TabChar read FTabChar; property Tslexe read FTslExe write FTslExe; property ReadOnlyDirs read FReadDirs write FReadDirs; function getpage(); begin return FPageEditer; end function getcodemap(); begin return FinCodemap.ftree; end protected class function Sinit();override; begin inherited; if not FSynClasses then FSynClasses := new TMyArrayA(); end class function GetSynTypeByFileType(ft); begin if not string(ft)then return "txt"; nft := lowercase(ft); for i,v in FSynClasses.IndexNames() do begin dv := FSynClasses[v]; dvf := dv[2]; if ifstring(dvf)then begin if pos(";"+nft+";",dvf)then begin return v; end end end return "None"; end class function RegSynType(n,h,c,files); begin if ifstring(n)and(h is class(TSynhighLighter))and(c is TSynCompletion)then begin FSynClasses[n]:= array(h,c,files); end end class function UnRegSynType(n,h,c); begin if ifstring(n)then begin FSynClasses.DeleteIndex(n); end end { r["section"] := CurrentITem.Caption; r["target"]:= FEdit_target.Editer.Text; r["replace"]:= FEdit_repace.Editer.Text; r["filetype"] := FEdit_type.Editer.Text; r["dir"] := FEdit_dir.Editer.Text; r["c_revers"]:=FCheck_revers.Checked; r["c_cycle"]:= FCheck_cycle.Checked; r["c_wrap"] := FCheck_wrap.Checked; r["c_case"] := FCheck_case.Checked; r["c_reg"] := FCheck_reg.Checked; r["c_dir"] := FCheck_subdir.Checked; } function replace_allincurrent(data,fo,it,idx); begin //data["c_revers"]:= 0; //data["c_cycle"]:= 0; if not it then it := GetCurrentItem(); if not it then return; ed := it.FEditer; if not ed then return; if ed.ReadOnly then return ;//不能替换 TryDispatch(); if not FIsFinding then return rt; fs := data["target"]; finder := finder_set_info(data,ed.Text); idx := 0; rsult := finder.replace_all(r); if rsult then begin idx := length(rsult); ed.ExecuteCommand(ed.ecSelectAll); ed.SelText := r; lastidx := -1; for i,v in rsult do begin if i=0 then FFindListWnd.AppendItem(array("caption":format("replace:%s in file:%s",fs,it.OrigScriptPath),"file":it.OrigScriptPath,"line":1)); rdx := v[1,0]; if rdx=lastidx then continue; lastidx := rdx; if not ifstring(v[3]) then continue; scap := format(" %d:(第%d行) ",i,rdx)+limitstringlength(v[3]); FFindListWnd.AppendItem(array("caption":scap,"file":it.OrigScriptPath,"line":rdx)); end end end function Find_InFiles(d,o,rep,ct); begin fs := GetFilesFormSearchInfo(d); ct := 0; for i,v in fs do begin TryDispatch(); if not FIsFinding then break; o.SetStatusText("查找文件:"+i); it := GetOpendPageItemByFileName(i); if not it then begin FTempPageItem.ScriptPath := i; LoadFromFile(FTempPageItem,false); it := FTempPageItem; end if rep then begin //ReplaceAllInCurrent(d,o,it,idx); replace_allincurrent(d,o,it,idx); SavePageItem(it); end else begin //FindAllInCurrent(d,o,it,idx); Find_All(d,o,it,idx); end ct += idx; end end function finder_set_info(data,txt); begin finder := static new t_gbk_text_finder(); finder.set_text(txt); finder.set_find_str(data["target"]); finder.iscase := data["c_case"]; finder.iswrap := data["c_wrap"]; finder.isReg := data["c_reg"]; finder.isprev := data["c_revers"]; finder.iscycle := data["c_cycle"]; finder.ismline := data["c_mline"]; finder.set_replace_str(data["replace"]); return finder; end function find_one(data,fo,it,rep); begin if not it then it := GetCurrentItem(); if not it then return -2; ed := it.FEditer; if not ed then return -2; cy := ed.CaretY; cx := ed.CaretX; fs := data["target"]; if not(fs and ifstring(fs))then begin fo.SetStatusText("查找内容为空!"); return -2; end finder := finder_set_info(data,ed.Text); finder.set_rc(array(cy,cx)); reslt := finder.find_one(); if reslt then begin if data["c_revers"] then begin p1 := reslt[0,4]; p2 := reslt[0,3]; end else begin p1 := reslt[0,3]; p2 := reslt[0,4]; end ed.ExecuteCommand(ed.ecGotoXY,p1); ed.ExecuteCommand(ed.ecSelGotoXY,p2); fo.SetStatusText(format("位置: %d %d",p1[0],p1[1])); if rep then begin rs := finder.format_rep_Str(reslt); ed.SelText := rs; end return 0; end else begin fo.SetStatusText("没找到"); return -2; end end function FindListChoosed(o,e); begin it := o.GetItem(o.GetCurrentSelection()); if ifarray(it)then begin f := it["file"]; l := it["line"]; if ifstring(f)and l >= 0 then begin OpenAndGotoFileByName(f,l); end end end function TryDispatch(); begin t := now(); if(t-FLastDispathTime)>0.25e-5 then begin FLastDispathTime := t; GetAndDispatchMessageA(); end end function Find_All(data,fo,it,rt); begin if rt = "noshow" then begin fnoshow := true; end TryDispatch(); if not FIsFinding then return rt; rt := 0; if not it then it := GetCurrentItem(); if not it then return; ed := it.FEditer; if not ed then return; finder := finder_set_info(data,ed.Text); rsult := finder.find_all(); fs := data["target"]; lastidx := -1; if rsult then begin rt := length(rsult); iits := 0; for i,v in rsult do begin if i=0 and (not fnoshow) then FFindListWnd.AppendItem(array("caption":format("find:%s in file:%s",fs,it.OrigScriptPath),"file":it.OrigScriptPath,"line":1)); if not fnoshow then begin rdx := v[1,0]; if rdx=lastidx then continue; lastidx := rdx; if not ifstring(v[3]) then continue; scap := format(" %d:(第%d行) ",i,rdx)+limitstringlength(v[3]); FFindListWnd.AppendItem(array("caption":scap,"file":it.OrigScriptPath,"line":rdx)); iits++; if iits>80 then begin iits := 0; TryDispatch(); end end end end else begin fo.SetStatusText("找到 0 处"); end end function TabCheckChanged(); begin if not FListPages.Visible then return; FListPages.Visible := false; n := FListPages.GetSelFileName; OpenAndGotoFileByName(n); end function TabChecking(f); begin its := FPageEditer.PageItems; if not(its.Length()>1)then return FCurrentItemCode := array(); if FListPages.Visible then begin FListPages.IncIndex((f>0)?1:(-1)); end else begin //初始化 //bit := GetCurrentItem(); for i := 0 to its.Length()-1 do begin it := its[i]; it.FPageOrderId := 0; end idx := 1; for i := length(FCurrentItemCode)-1 downto 0 do begin it := FCurrentItemCode[i]; if it.FPageOrderId<1 then it.FPageOrderId := idx++; end sr := array(); for i := 0 to its.Length()-1 do begin it := its[i]; sv := it.OrigScriptPath; if it.FEditer.ChangedFlag then sv := "*"+sv; sr[i,0]:= sv; sr[i,1]:= it.FPageOrderId; sr[i,2]:= it; if it.FPageOrderId=0 then begin it.FPageOrderId := idx++; end end sit := sselect[0]from sr order by[1]asc end; FCurrentItemCode := sselect[2]from sr order by[1]desc end; FListPages.SetData(sit); //FListPages.IncIndex(-1); FListPages.SetCurrentSelection(1); xy := ClientToScreen(100,100); FListPages.Top := xy[1]; FListPages.Left := xy[0]; //FListPages.SetBoundsRect(array(xy[0],xy[1],xy[0]+600,xy[1]+600)); //FListPages.Visible := true; FListPages.Show(SW_SHOWNOACTIVATE); //bit.FEditer.SetFocus(); end end public function GetFreeSynObjectByName(n); begin if not ifstring(n)then return; lns := FSynHCS[n]; if not lns then begin lns := new TMyARRayB(); FSynHCS[n]:= lns; end for i := 0 to lns.length()-1 do begin vi := lns[i]; if not(vi[0].Memo)then return vi; end hc := CreateASynObject(n,self); if hc then begin if n="tsl" then begin set_tsl_compinfo(hc[1]); end lns.Push(hc); return hc; end end public static Fhightercolor; FExecuteEditer; private function settslsyninfo(); begin lns := FSynHCS["tsl"]; if lns then begin for i := 0 to lns.length()-1 do begin vi := lns[i]; cp := vi[1]; set_tsl_compinfo(vi[1]); end end end function set_tsl_compinfo(cp); begin cp.minmatch := FCodeFormatInfo["matchidx"]; cp.IgnoreCase := not FCodeFormatInfo["case"]; cp.matchfirst := FCodeFormatInfo["matchfirst"]; end function sethclor(cs); begin Fhightercolor.colors := cs; fhltediterdata := cs; end function gethclor(); begin if fhltediter then return fhltediter.colorinfo; end class function CreateASynObject(n,ow); begin c := FSynClasses[n]; //if not c then c := FSynClasses["txt"]; if c then begin if ifobj(c[0])and ifobj(c[1])then begin h := CreateObject(c[0],ow);//Fhightercolor; //if n="tsl" then // begin h.hightercolor := Fhightercolor; //end return array(h,CreateObject(c[1],ow)); end end end Fdbgbtns; fhltediterdata; static FSynClasses; fhltediter; FCodeFormatInfo; FTslChmHelp; FFistShows; FSynHCS; FLastDispathTime; FIsFinding; [weakref]FOnPageEditerChanged; [weakref]fOnPageItemSelChanged; FPageEditerMenu; FPageEditerMenus; FReadDirs; FCurrentItemCode; FGoBackA; // := new TMyarrayB(); FGoBackB; // := new TMyarrayB(); FRebackFlag; FPageEditer; fcoolbar; ftoolbara; ftoolbarb; FToolbar; FStatus; FInfoShowWnd; FinCodemap; FListPages; FFindWnd; ffuncfind; FShortCutshower; FFindListWnd; FEchoWnd; FGotoLineWnd; FFileopen; FFileSave; FPageMenu; FImages; //图标 FNeedSaveBmp; FNotNeedSaveBmp; FBmpClose; FTabWidth; FTabChar; FTslexe; FTslSearchDir; FTslCacheDir; FTempPageItem; FOpenHistory; FHistoryWnd; FTslDebug; fcloseflag; private function GetFilesFormSearchInfo(d); begin r := array(); dir := d["dir"]; if not dir then return r; ft := d["filetype"]; if ft then begin ft := str2array(ft,";"); end if not ft then ft := array("*"); for i,v in str2array(dir,";") do //多目录查找 begin tv := trim(v); if tv then FindFiles(tv,ft,d["c_dir"],r); end return r; end function FindFiles(dir,ft,sub,ret); begin TryDispatch(); dir_ := dir; sp := ioFileseparator(); if not(dir_[length(dir_)]=sp)then dir_ += sp; if sub then begin dirs := FileList("",dir_+"*"); for i,v in dirs do begin TryDispatch(); if not FIsFinding then return; fn := v["FileName"]; if(pos("D",v["Attr"]))and not(fn in array(".",".."))then begin FindFiles(dir_+fn,ft,sub,ret); end end end for i,v in ft do begin vi := trim(v); if not vi then continue; fs := FileList("",dir_+vi); for j,vj in fs do begin if(POS("D",vj["Attr"]))then continue; ret[dir_+vj["FileName"]]:= true; end end end function SetTslCacheDir(d); begin if FTslCacheDir=d then return; if ifstring(d)then begin FTslCacheDir := d; class(TTSLCompletion).SetCacheDir(d); end end function SetTslSearchDir(d); begin if FTslSearchDir=d then return; if ifarray(d)then begin FTslSearchDir := d; class(TTSLCompletion).SetFindDirs(d); its := GetAllPageItems(); for i := 0 to its.Length()-1 do begin it := its[i]; it.RepreComple := true; end end end function SetTabWidth(n); begin if not(n >= 0)then return; nn := integer(n); if nn >= 0 and nn <> FTabWidth then begin FTabWidth := nn; if nn=0 then FTabChar := "\t"; else begin FTabChar := ""; for i := 1 to nn do begin FTabChar += " "; end end its := FPageEditer.PageITems; for i := 0 to its.Length()-1 do its[i].FEditer.TabChar := FTabChar; end end function getdirfromfile(p); begin r := ""; if not ifstring(p)then return r; sp := ioFileseparator(); for i := length(p)downto 1 do begin if p[i]=sp then return p[1:i]; end return r; end function LoadFromFile(it,ifinit); begin p := it.ScriptPath; sz := filesize("",p); if readFile(rwRaw(),"",p,0,sz,s)then begin it.ReGetLastLoadTime(); if lowercase(p[length(p)-3:length(p)])=".stm" then begin try if s then begin v := stm(s); s := tostn(v); end it.FEditer.ReadOnly := true; it.FISstm := true; except end end edt := it.FEditer; tl := edt.TopLine; cxy := edt.CaretXY; {$ifdef linux} it.scripttype := 1; {$else} it.scripttype := 0; {$endif} if pos("\r\n",s) then begin it.scripttype := 0; end else if pos("\n",s) then begin it.scripttype := 1; end if it.scripttype<>0 and length(p)>3 and (lowercase(p[length(p)-3:length(p)]) in array(".tsl",".tsf")) then begin it.scripttype := 0; end it.SetLoadScript(s); if ifinit then begin InitScriptHighLighter(it); edt.TopLine := tl; edt.ExecuteCommand(edt.ecGotoXY,cxy); end end else begin //MessageBoxA(s,"提示",0,self); it.ReGetLastLoadTime(); it.SetLoadScript(s); it.FEditer.ReadOnly := true; //设置为自读 end end function InitScriptHighLighter(it); begin p := it.ScriptPath; for i := length(p)downto 3 do begin if p[i]="." then begin synt := GetSynTypeByFileType(p[i+1:]); return SetPageItemSyn(it,synt); end end end function GetNNeedSaveBmp(); begin if not FNOTneedSaveBmp then begin s := "0502000000060400000074797065000203000000696D670006040000006461746 100021701000089504E470D0A1A0A0000000D4948445200000010000000100806 0000001FF3FF61000000017352474200AECE1CE90000000467414D410000B18F0 BFC6105000000097048597300000EC300000EC301C76FA864000000AC49444154 384FB593CB0AC3201045FBFFFFE626820B71138C22E242B30B06A63874420C464 C4B2F5C84791C1DD117FC2804E49C41290552CAAE9765C1A6B310B0AE2B30C69A 4D571B63B0915401CADA530194BA18E3273208F0DEE3CE041042C0BEEF981B023 8E7406B7D008A69940A1042C0E055DBB6414A0938E77DC013FF07304D13067B9A E7F91E40899EA9CE5ADB06D083B9335D6413F06484DB138CBA028C7EA6B3CBBB3 800DF0BE00DCA62BB159A123E940000000049454E44AE42608200"; FNOTneedSaveBmp := new TBitmap(); FNOTneedSaveBmp.ReadVcon(HexFormatStrToTsl(s)); end return FNOTneedSaveBmp; end function Closebmp(); begin if not FBmpClose then begin FBmpClose := new TBitmap(); s := "0502000000060400000074797065000203000000696D670006040000006461746 10002D800000089504E470D0A1A0A0000000D4948445200000010000000100806 0000001FF3FF61000000017352474200AECE1CE90000000467414D410000B18F0 BFC6105000000097048597300000EC300000EC301C76FA8640000006D49444154 384FB592510A80300C43BDFFA5FADFEFDEA712212368A762E783B05192C0CAB66 CB2AEC0DDD3CC5E095E320A2AE39DC8A520220EA9B99A93B200A8B99A91F2091A A8C21099EE8041700E43E49F028671EA5D3D64FD126152E36C4EA63B78121905E DAFFC956641E60E1806A0968D1586A10000000049454E44AE42608200"; FBmpClose.ReadVcon(HexformatStrToTsl(s)); end return FBmpClose; end function GetNeedSaveBmp(); begin if not FNeedSaveBmp then begin s := "0502000000060400000074797065000203000000696D670006040000006461746 100022D01000089504E470D0A1A0A0000000D4948445200000010000000100806 0000001FF3FF61000000017352474200AECE1CE90000000467414D410000B18F0 BFC6105000000097048597300000EC300000EC301C76FA864000000C249444154 384F63F84F21001BF0E6D39FFF31BD8FFF07B43CC48BEB97BE046B420660038E5 CFBFA5F34FA3A564DE8B879C52BB0461840310044E303200340EA769DFF0C1521 D280B9BBDEFD6F59F90A6E8063D5FDFF1FBFFE05CB1165C0D42D6FFE572D7A093 700843BD740BC8262C0F2831FC082E8E0D1EB5FFFF75EFCF2DFA8E00E7E0348C1 B4314037E73658101F289EFB1CB70130097C18A6AE6BED6BEC06C0120C2E0C0B4 8AC0690E2059C2E2016A318406C6642C6BB2F7C4118403EF8FF1F00E2B93E0A61 AE40CC0000000049454E44AE42608200";//GetSaveFileBitmapInfo(); FNeedSaveBmp := new TBitmap(); FNeedSaveBmp.ReadVcon(HexFormatStrToTsl(s)); end return FNeedSaveBmp; end end implementation function move_popwnd_to_center2(wnd); begin ////////////////////窗口居中处理///////////////////////////////// ////////////////////wnd待居中的窗口///////////////////////////////// ////////////////////pwnd父窗口///////////////////////////////// pd := wnd.Parent; if pd then begin while not(pd.wspopup) do begin npd := pd.parent; if npd then pd := npd; else break; end r := pd.ClientRect; xy := pd.clienttoscreen(r[0],r[1]); end else begin xy := array(0,0); r := wnd._wapi.GetScreenRect(); end wnd.Left := max(0,xy[0]+(r[2]-r[0]-wnd.width)/2) ; wnd.top := max(0,xy[1]+(r[3]-r[1]-wnd.Height)/2); end type TEditList=class(TComboBox) function Create(AOwner);override; begin inherited; width := 280; Height := 26; dropdowncount := 30; FMaxCoder := 20; ReadONly := false; Editer.OnKeyDown := function(o,e) begin case e.charcode of VK_UP: begin ItemIndex -= 1; e.skip := true; end VK_DOWN: begin ItemIndex += 1; e.skip := true; end 13: begin Calldatafunction(OnEnterUp,self(true),e); e.skip := true; end VK_ESCAPE: begin oer := o.owner.owner; if oer then oer.Visible := false; end ord("A"): begin if ssCtrl in e.Shiftstate()then begin e.skip := true; o.SetSel(0,length(o.text)); end end end; end end function Recycling();override; begin inherited; FOnEnterUp := nil; end function Pushitem(s); begin if not(ifstring(s) and s) then return; its := Items; idx := -1; for i,v in its do begin if v=s then begin idx := i; break; end end if idx=0 then return ; if idx>0 then begin DeleteItem(idx); end insertItem(s,0); if (idx<0) and getItemCount()>FMaxCoder then begin deleteItem(FMaxCoder); end ItemIndex := 0; end property OnEnterUp read FOnEnterUp write FOnEnterUp; property MaxCoder read FMaxCoder write FMaxCoder; private FMaxCoder; [weakref]FOnEnterUp; end type TEditerEchoWnd=class(TSynMemoNorm) // function Create(AOwner);override; begin inherited; autogutterwidth := true; FDoLockTime := 0; FIsLocked := false; height := 250; ReadOnly := true; WsSizeBox := true; WsSysMenu := true; OnClose := function(o,e) begin o.visible := false; e.skip := true; end m := new TPopUpMenu(self); m1 := new TMenu(self); m1.Caption := "清空"; m1.parent := m; {m2 := new TMenu(self); m2.Caption := "选中字符高亮"; m2.Checked := false; m2.OnClick := function(o,e)begin o.Checked := not(o.Checked); self.HighLighter := (o.Checked) ?F_Highlighter :false; end m2.Parent := m;} PopUpMenu := m; m1.OnClick := function(o,e) begin ClearAll(); AppendString("ctrl+z 停止;ctrl+c 复制选择\r\n"); end; fmcp := new TMenu(self); fmcp.Caption := "复制"; fmcp.parent := m; fmcp.OnClick := function(o,e) begin self.ExecuteCommand(self.ecCopy); end; OnPopupMenu := function(o,e); begin if fmcp then fmcp.Enabled := SelAvail; end FProcess := new tcustomprocess(self); FProcess.OnEcho := thisfunction(TEchoToString); FProcess.onended := thisfunction(onprocend); FProcess.onstarted := thisfunction(onprocstart); AppendString("ctrl+z 停止 ; ctrl+c 复制选择\r\n"); F_Highlighter := new tcustomsynhighlighter(self); hg := F_Highlighter; hg.ExecuteCommand("strings",array()); hg.ExecuteCommand("keywords",array("ctrl+z","ctrl+c","echo","执行结束","开始执行")); hg.ExecuteCommand("blockannotes",array()); hg.ExecuteCommand("rowannotes",array()); //hg.ExecuteCommand("regs",array("^(V|v)\\d":0x00ff00)); hg.ExecuteCommand("syms",array(":",";")); hg.ExecuteCommand("pairs",array(("开始执行","执行结束"))); self.HighLighter := hg; end function onprocstart(o,e); begin AppendString("开始执行 "); end function onprocend(o,e); begin AppendString(format("\r\n执行结束:endcode:%d\r\n",o.ErrInfo)); end function TEchoToString(o,s); begin AppendString(s); return true; end function build(dir,d); begin {$ifdef linux} exe := TS_ModulePath()+"TSL" ; {$else} exe := TS_ModulePath()+"tsl.exe" ; {$endif} if fileexists("",exe) then begin AppendString("build:\r\n"); cmd := "tsl "+format_build_params(d); FProcess.StartupDirectory := dir; FProcess.execstr := true; self.HighLighter := nil; AppendString(format('%s %s\r\n',exe,cmd)); r := FProcess.CreateProcess(exe,cmd); h := r; if r=0 then AppendString("编译失败!"); self.HighLighter := F_Highlighter; return r; end //AppendString(format('%s %s\r\n',exe,cmd)); end function Exec(exe,cmd,h); begin self.HighLighter := nil; AppendString(format('%s %s\r\n',exe,cmd)); FProcess.StartupDirectory := ""; FProcess.execstr := false; r := FProcess.CreateProcess(exe,cmd); h := r; if r=0 then AppendString("执行失败!"); self.HighLighter := F_Highlighter; return r; end function Exeing(); begin return FProcess.Handle; end function EndExe(); begin if FProcess.Handle then begin r := 1; SysTerminate(r,FProcess.Handle); end end function KeyDown(o,e);override; begin if ssCtrl in e.shiftstate then begin case e.charcode of ord("Z"): begin EndExe(); return; end ord("C"): begin ExecuteCommand(ecCopy); return; end end end inherited; end function AppendString(s); begin if not(ifstring(s)and s)then return; ct := Lines.Length(); if ct>0 then begin ExecuteCommand(ecGoToXY,array(ct,1)); ExecuteCommand(ecLineEnd); ExecuteCommand(ecString,s); end end FExeHandle; FProcess; FIsLocked; FDoLockTime; F_Highlighter; private [weakref]fmcp; function format_build_params(d); begin r := d["build"]+"="+format('"%s" ',d["buildfile"]); lbp := d["libpath"]; if lbp and ifstring(lbp) then begin r+='-libpath "'+lbp +'" '; end else r+="-libpath ."+ioFileseparator()+" "; r += f_b_a_param(d,"exports"); r += f_b_a_param(d,"dependsdir"); r += f_b_a_param(d,"depends"); r += f_b_a_param(d,"excludes"); r += f_b_a_param(d,"pkg"); r += f_b_a_param(d,"resourcedir"); r += f_b_a_param(d,"resourcepat"); r += f_b_a_param(d,"extresource"); r += f_b_a_param(d,"buildico"); r += f_b_a_param(d,"output"); if d["strong"] then r+= " -strong"; if d["buildgui"] then r+= " -buildgui"; {$ifdef linux} {$else} if fileexists("",(d["buildfile"]+".manifest")) then begin r +=format(' --manifest="%s" ',d["buildfile"]+".manifest"); end {$endif} if d["nspace"] then begin r+=format("--setpkg2ns=%s ",d["nspace"]); end return r; end function f_b_a_param(d,n); begin dn := d[n]; if not ifstring(dn) then return ""; v :=trim( dn); r :=""; if v then begin if v[length(v)]="\\" then v+=","; r :=format( "--%s=",n)+format('"%s" ',v); end return r; end public end type tfincodemap = class(tcustomcontrol) function create(AOwner); begin inherited; Visible := false; FTempNodes := array(); Width := 300; Ftimer := new TTimer(self); Ftimer.Interval := 200; Ftimer.Ontimer := thisfunction(BdownTimeOut); Ftimer.Enabled := false; FList := new TCombobox(self); flist.Width := 180; ar := array("Class","Function","Statements","If","Else","SubCase","Goto","Try","Empty_Begin_End","NeedSql","Unit","property","Member"); flist.Multisel := true; FList.AppendItems(ar); flist.ItemIndex := 0->(length(ar)-1); FList.Parent := self; initbtn(); FTree := new TTreeView(self); FTree.ParentFont := false; FTree.font := array("width":11,"height":22); ftree.ItemHeight := 28; FTree.OnSelChanged := thisfunction(SynNodeSelected); FTree.Parent := self; FTree.onsyskeydown := function(o,e)begin if e.char="M" then doshow(false); end ftree.OnKeyDown := function(o,e)begin if e.charcode=13 then begin et := geteditor(); if et then et.SetFocus(); end end end function caretchanged(y); begin if y>=fcaretya and y0 then begin edt.ExecuteCommand(edt.ecGoToXY,array(line,1)); end end function hasFocus();override; begin return true; end function ontimerdo(o,e); begin { 代码块快类型 #define Block_TypeClass 1 #define Block_Function 2 #define Block_Statements 4 #define Block_If 8 #define Block_Else 16 #define Block_SubCase 32 #define Block_Goto_Label 64 #define Block_Empty_Begin_End 128 #define Block_Try 256 #define Block_NeedSql 512 #define Block_UnitStruct 1024 } // 处理逻辑 //定时器中重算节点,如果发生改变,并定位节点到当前行位置 //行位置变化,=== 定位到节点 //节点选中定位到 编辑器 //if Parent then o.Enabled := false; if not Visible then return ; if not FTree then return ; edt := geteditor(); nd := FTree.RootNode; if not edt then return nd.RecyclingChildren(); y := edt.CaretY; s := edt.Text; if FString = s then //文本没变 begin if flistv=getblocktypes() then //类型没变 begin return ; end end else FString := s; flistv := getblocktypes(); if s then r := unit(utssvr_api_c).get_tsl_tokenizeex(s,flistv);// tsl_tokenizeex_2_(s,flistv); else r := array(); fcaretya := -1; fcaretyb := -1; fisloading := true; nd.RecyclingChildren(); FTempNodes := array(); ScriptDelBlocks(r["blcks"],str2array(s,"\r\n"),nd,0); GoToTheNode(y); fisloading := false; end function WMNCLBUTTONDOWN(o,e):WM_NCLBUTTONDOWN;override; begin FIgnoreSize := true; Ftimer.Enabled := true; end function BdownTimeOut(o,e); //定时器处理 begin if(_wapi.GetAsyncKeyState(VK_LBUTTON).& 0xFF00)>0 then begin end else begin FIgnoreSize := false; Ftimer.Enabled := false; p := Parent; if p then p.DoControlAlign(); end end private function GoToTheNode(line); begin nd := FTempNodes[0]; for i,v in FTempNodes do begin if v._tag <= line then begin nd := v; fcaretya := v._tag; end else if v._tag >= Line then begin FTree.SetSel(nd); fcaretyb := v._tag; return ; //break; end end if nd and nd._Tag<=line then begin FTree.SetSel(nd); fcaretyb := line; end end function ScriptDelBlocks(blcks,strs,Node,ct); begin if not blcks then return; for i,v in blcks do begin if v["mtype"]<> 1 then begin cnd := FTree.CreateTreeNode(); cnd.Caption := trim(strs[v["mbeg"]-1]); cnd._tag := v["mbeg"]; FTempNodes[length(FTempNodes)]:= cnd; cnd.parent := node; end if not cnd then cnd := node; ScriptDelBlocks(v["msub"],strs,cnd,ct+1); end end function getblocktypes(); begin r := 0; for i,v in FList.itemindex do begin r += 2^v; end return r; end function initbtn(); begin fcbtn := new TBtn(self); fcbtn.OnClick := function(o,e) begin doshow(0); end fcbtn.Caption := ""; fcbtn.top := 3; fcbtn.Width := 20; fcbtn.Height := 20; fcbtn.Parent := self; s := "0502000000060400000074797065000203000000696D670006040000006461746 10002C401000089504E470D0A1A0A0000000D4948445200000014000000140806 0000008D891D0D000000017352474200AECE1CE90000000467414D410000B18F0 BFC6105000000097048597300000EC300000EC301C76FA8640000015949444154 384F9D9431CA83401085F7625E21E015BC8156D639809D95AD36C142248568ED0 93C8277B0B0D99F4F32B2EB8EE1270F1EAC3B6FBE85901963156DDB66C771B455 55D93CCF6D1CC7873973478D8CA600B82C8B4D92C44651F4D564C85EE501BBAE5 39BBF991E5727709E67B5E13FA6577400D775F502455178DF9AAF19180770DF77 9BA6A917444DD3780DAEA921170A03961986C10B636968DB36A87187B4076199B 22C830296C6F7FB7DDE7146DA431896C9B24C2D6201F0BFC3C87DE06A58E6F178 A845B18010672D2386659800AD289EA6E983B3C759CB886119C6492BE2BEEF4F9 080B9D3B218966136B5E2EBF50A00F20035372B8665B4DFA5AEEBDB467988CCB5 06CBB035DC65F07C3E6F1BC4F22059B98301EB183DB686DBE006EF7CCDC8E6399 7C32F9B46EC6E1C6F7DFDB271DC4D833C20626BB8CBE2CE6464C3B80A8088ADC1 A0339B8C1313803973478D4C286BFF00D135DFBA6F19E4A90000000049454E44A E42608200"; bmp := new TBitmap(); bmp.ReadVcon(HexformatStrToTsl(s)); fcbtn.BKBitmap := bmp; ffbtn := new TBtn(self); ffbtn.OnClick := function(o,e) begin //doshow(1); ontimerdo(); end ffbtn.Caption := ""; ffbtn.top := 3; ffbtn.Width := 20; ffbtn.Height := 20; ffbtn.Parent := self; s := "0502000000060400000074797065000203000000696D670006040000006461746 100029C01000089504E470D0A1A0A0000000D4948445200000014000000140806 0000008D891D0D000000017352474200AECE1CE90000000467414D410000B18F0 BFC6105000000097048597300000EC300000EC301C76FA8640000013149444154 384FBD940D8D834010464F10064000064000180001200004A0000318000128C00 0063030CD9B63B62D85CB5ED3F42513C8EEEC373F3BF0231FE67B82EBBA4ADBB6 92A6A90441A0C67B5DD732CFF3EEF5CAA960DFF72A1086A15455255DD7A9F11EC 7B1EE956529DBB6ED27EE3C099215360C83DAD9012020C1C8F8E8A382E338BAD2 78FAB02C8B8AE679BEAFFCA2824551489224AE5764E90355E0FFD85357323D222 23DC2D117FC49C87082599669D3C9EEAA7767344DA3591A4E9045B2FC2F9CF98E 209742D9BE585B6C360D2768BDF0BD6184B88C63654E102136F9027CB091C1984 51375826059F2BDFAC098E14FAB18747812044AB1A8D334EDAB7758638FE00CF4 B1452F8240FA163D8A221578FCEBB07735FCA782C02D7288C653920D3E6B7F0DF EA5E0BB7C5850E4063EDA83420076B5E10000000049454E44AE42608200"; bmp := new TBitmap(); bmp.ReadVcon(HexformatStrToTsl(s)); ffbtn.BKBitmap := bmp; end function geteditor(); begin if not owner then return 0; it := Owner.GetCurrentItem(); edit := it.FEditer; if not edit then return 0; m := edit.HighLighter ; if not(m is class(TTslSynHighLighter)) then begin return 0; end return edit; end fissetnode; fisloading; ffbtn; FTempNodes; //节点 fcbtn; FList; flistv; Ftimer; Ftimer2; FString; fcaretya; //开始位置记录 fcaretyb; //截止位置记录 public FTree; end type TListPages=class(TListBox) function Create(AOwner);override; begin inherited; Visible := false; WsPopUp := true; end // function PaintIdx(idx,rc_,cvs);override; // begin // {** // @explan(说明)绘制项 %% // @param(item)(TCustomListItem) 项 %% // @param(rc)(array) 绘制区域%% // @param(cvs)(tcanvas) 画布 %% // **} // inherited; // if idx=getCurrentSelection()then // begin // rc := rc_; // rc[2:3]-= 1; // cvs.pen.Color := rgb(30,144,255); // cvs.draw("Polyline",array(rc[0:1],(rc[2],rc[1]),(rc[2],rc[3]),(rc[0],rc[3]),rc[0:1])); // end // end function MouseUp(o,e);override; begin inherited; visible := false; end function SetData(d);override; begin if not ifarray(d)then return; height := ItemHeight * (1+min(15,length(d))); x := 10; for i,v in d do begin x := max(x,length(v)); end width := font.Width * (x+3); inherited; end function InsureItemVisible(idx); //移动当前的格子 begin return ;// //return InsureIdxInClient(idx); rc := GetIdxRect(idx); c := ClientRect; if rc[1]c[3]then begin SetYpos(1+GetYPos()+(rc[3]-c[3]+1)/GetYScrollDelta()); end end function GetSelFileName(); begin r := GetItem(getCurrentSelection()); if r and pos("*",r)then begin return r[2:]; end return r; end function IncIndex(f); begin if ifnil(f)then f :=-1; idx := getCurrentSelection(); ct := ItemCount; nidx := (idx-f+ct) mod ct; SetCurrentSelection(nidx); //InsureItemVisible(nidx); end end type TFindListWnd=class(TListBox) //查找的地方 function Create(AOwner); begin inherited; font := array("width":11,"height":22); ParentFont := false; onnotification := function(o,e)begin ms := e.message; if ifarray(ms) and ms[0] ="font" then begin font := ms[1]; end end end function CheckListItem(s);override; begin return ifarray(s); end function GetItemText(i);override; begin it := GetItem(i); if it then r := it["caption"]; if not ifstring(r)then return ""; return r; end end type TFindWnd=class(TPage) type TFindBtn=class(TBtn) function Create(AOwner); begin inherited; left := 425; width := 160; height := 25; end end type TFindCheck=class(TCheckBtn) function Create(AOwner); begin inherited; left := 25; width := 160; height := 25; end end function CreateWndInfo(btn,sec); //触发 begin r := GetInfo(); if sec then r["section"]:= sec; r["btn"]:= btn; end function Create(AOwner);override; begin inherited; OnClose := function(o,e) begin Parent.EndFind(); o.visible := false; e.Skip := true; end WsDlgModalFrame := true; Visible := false; WsPopUp := true; WsCaption := true; WSsYSMenu := true; //WsSizeBox := true; caption := "查找"; SetBoundsRect(array(300,300,920,680)); IncPaintLock(); for i,v in array("查找","替换","文件查找") do begin it := CreateApageItem(); it.Caption := v; PageItems.Push(it); end DecPaintLock(); lg := 30; FEdit_Target := new TEditList(self); FEdit_repace := new TEditList(self); FEdit_Type := new TEditList(self); FEdit_dir := new TEditList(self); FDirChooser := new TFolderChooseADlg(self); FEdit_dir_btn := new TBtn(self); flabels := array(); for i,v in array("查找目标:"," 替换为:","文件类型:"," 目录:") do begin lb := new TLabel(self); lb.TextAlign := AL9_CENTERRIGHT; lb.caption := v; lb.Top :=(i+1) * lg; lb.Height := 25; lb.Left := 20; lb.Width := 120; lb.Parent := self; //lb.border := true; flabels[i]:= lb; end FEdit_Target.left := 140; FEdit_Target.top := lg; FEdit_target.parent := self; FEdit_target.Editer.OnKeyPress := thisfunction(EditerEnter); FEdit_repace.left := 140; FEdit_repace.top := lg+lg; FEdit_repace.parent := self; FEdit_type.left := 140; FEdit_type.top := lg+lg+lg; FEdit_type.Editer.Text := "*.tsf;*.tsl;"; FEdit_type.parent := self; FEdit_dir.left := 140; FEdit_dir.Width := FEdit_dir.Width-20; FEdit_dir_btn.Caption := ".."; FEdit_dir_btn.top := lg+lg+lg+lg; FEdit_dir_btn.Width := 18; FEdit_dir_btn.left := 140+FEdit_dir.Width+2; FEdit_dir_btn.height := 24; FEdit_dir.top := lg+lg+lg+lg; FEdit_dir.parent := self; FEdit_dir_btn.OnClick := function(o,e) begin if FDirChooser.OpenDlg()then begin FEdit_dir.Editer.text := FDirChooser.Folder; end end FBtn_Find := new TFindBtn(self); FBtn_replace := new TFindBtn(self); FBtn_Count := new TFindBtn(self); // 计数 FBtn_Count_a := new TFindBtn(self); // 计数 FBtn_replaceall := new TFindBtn(self); FBtn_Find.caption := "查找"; FBtn_replace.caption := "替换"; FBtn_Count_a.Caption := "计数"; FBtn_Count.caption := "全部查找"; FBtn_replaceall.caption := "全部替换"; FBtn_Find.top := lg; FBtn_Find.parent := self; FBtn_replace.top := lg+lg; FBtn_Count_a.top := lg+lg; FBtn_replace.parent := self; FBtn_Count_a.parent := self; FBtn_replaceall.top := lg+lg+lg; FBtn_replaceall.parent := self; FBtn_Find.OnClick := thisfunction(FindBtnClick); FBtn_replace.OnClick := thisfunction(FindBtnClick); FBtn_Count_a.OnClick := thisfunction(FindBtnClick); FBtn_Count.OnClick := thisfunction(FindBtnClick); FBtn_replaceall.OnClick := thisfunction(FindBtnClick); FBtn_Count.top := lg+lg+lg+lg; FBtn_Count.parent := self; FDirChooser.parent := self; FCheck_revers := new TFindCheck(self); FCheck_wrap := new TFindCheck(self); FCheck_case := new TFindCheck(self); FCheck_cycle := new TFindCheck(self); FCheck_reg := new TFindCheck(self); FCheck_subdir := new TFindCheck(self); FCheck_gt := new TFindCheck(self); FCheck_subdir.checked := true; FCheck_subdir.Left := 425; FCheck_subdir.top := lg+lg+lg+lg; FCheck_subdir.Caption := "包含子目录"; FCheck_revers.caption := "反向查找"; FCheck_revers.top := lg * 5; FCheck_revers.parent := self; FCheck_wrap.caption := "全词匹配"; FCheck_wrap.top := lg * 6; FCheck_wrap.parent := self; FEdit_dir_btn.parent := self; FCheck_case.caption := "忽略大小写"; FCheck_case.Checked := true; FCheck_case.top := lg * 7; FCheck_case.parent := self; FCheck_cycle.caption := "循环查找"; FCheck_cycle.Checked := true; FCheck_cycle.top := lg * 8; FCheck_cycle.parent := self; FCheck_reg.caption := "正则匹配"; FCheck_reg.Enabled := true; FCheck_reg.top := lg * 9; FCheck_reg.parent := self; FCheck_gt.Visible := true; FCheck_gt.caption := "多行"; FCheck_gt.Checked := true; FCheck_gt.top := lg * 9; FCheck_gt.Left := FCheck_reg.width+FCheck_reg.Left+10; //FCheck_gt.parent := self; FCheck_subdir.parent := self; FStatus := new TStatusBar(self); //FStatus.Align := alNone; FStatus.Items := array(("text":"","width":700)); FStatus.Parent := self; OnSelChanged := thisfunction(DoSelChanged); ItemIndex := 0; //SetStatusText("查找"); end function FindBtnClick(o,e); begin r := GetInfo(); r["btn"]:= o.Caption; Owner.DoFind(r,self); end function EditErEnter(o,e); begin if e.CharCode=13 then begin e.skip := true; r := GetInfo(); r["btn"]:= "查找"; OWner.DoFind(r,self); end end function GetInfo(); begin r := array(); r["section"]:= CurrentITem.Caption; s := FEdit_target.Editer.Text; r["target"]:= s; r["c_mline"] := FCheck_gt.Checked; s := FEdit_repace.Editer.Text; r["replace"]:= s; r["filetype"]:= FEdit_type.Editer.Text; r["dir"]:= FEdit_dir.Editer.Text; r["c_revers"]:= FCheck_revers.Checked; r["c_cycle"]:= FCheck_cycle.Checked; r["c_wrap"]:= FCheck_wrap.Checked; r["c_case"]:= FCheck_case.Checked; r["c_reg"]:= FCheck_reg.Checked; r["c_dir"]:= FCheck_subdir.Checked; return r; end function SetStatusText(s); begin if ifstring(s)then FStatus.SetItemText(s,0); end function OpenFind(); begin ItemIndex := 0; end function OpenReplace(); begin ItemIndex := 1; end function Show(f);override; begin it := Owner.GetCurrentEditer(); if it then begin s1 := it.SelText; if s1 and not(pos("\n",s1))then //length(s1)<20 and 取消长度限制 begin s := s1; end else s := it.CaretWords(); SetFindText(s); FEdit_target.Editer.SetFocus(); end inherited; end Function SetFindText(s); //设置查找的字符串 begin if s then FEdit_target.Editer.Text := s; else s := FEdit_target.Editer.Text; FEdit_target.Editer.SetSel(0,length(s)); end function SaveCurrentEditer(); //保存一下数据 begin for i,v in array(FEdit_target,FEdit_dir,FEdit_type,FEdit_repace) do begin v.PushItem(v.Editer.Text); end //if e then e.PushItem(e.Editer.Text); end function DoSelChanged(o,e); begin if CurrentItem then Caption := CurrentItem.Caption; case Caption of "查找": begin for i := 1 to 3 do flabels[i].Visible := false; FEdit_dir.visible := false; FEdit_dir_btn.visible := false; FEdit_type.visible := false; FEdit_repace.visible := false; FBtn_Count_a.visible := true; FBtn_replace.visible := false; FBtn_count.Visible := true; FBtn_Replaceall.Visible := false; FCheck_subdir.visible := false; FCheck_Revers.visible := true; FCheck_cycle.Visible := true; end "替换": begin flabels[1].Visible := true; for i := 2 to 3 do flabels[i].Visible := false; FBtn_Count_a.visible := false; FEdit_dir.visible := false; FEdit_dir_btn.visible := false; FEdit_type.visible := false; FEdit_repace.visible := true; FBtn_replace.visible := true; FBtn_count.Visible := false; FBtn_Replaceall.Visible := true; FCheck_subdir.visible := false; FCheck_Revers.visible := false; FCheck_cycle.Visible := true; end "文件查找": begin for i := 1 to 3 do flabels[i].Visible := true; FBtn_Count_a.visible := false; FEdit_dir.visible := true; FEdit_dir_btn.Visible := true; FEdit_type.visible := true; FEdit_repace.visible := true; FBtn_replace.visible := false; FBtn_count.Visible := false; FBtn_Replaceall.Visible := true; FCheck_subdir.visible := true; FCheck_Revers.visible := false; FCheck_cycle.Visible := false; end end end function DoControlAlign();override; begin inherited; if not FStatus then return; rc := ClientRect; rc[1]:= rc[3]-30; FStatus.SetBoundsRect(rc); end function recycling();override; begin inherited; FStatus := nil; end function GetHistory(); begin r := array(); r["finds"]:= FEdit_Target.Items; r["repalces"]:= FEdit_repace.Items; r["dirs"]:= FEdit_dir.items; r["findfiletyps"] := FEdit_Type.items; return r; end function SetHistory(d); begin if not ifarray(d)then return; fds := d["finds"]; if ifarray(fds)then begin FEdit_Target.Items := fds; end rps := d["repalces"]; if ifarray(rps)then begin FEdit_repace.Items := rps; end dirs := d["dirs"]; if ifarray(dirs)then begin FEdit_dir.items := dirs; end dirs := d["findfiletyps"]; if ifarray(dirs)then begin FEdit_Type.items := dirs; end end private weakref FStatus; FDirChooser; //查找 FEdit_Target; FEdit_repace; FEdit_type; FEdit_dir; FEdit_dir_btn; FBtn_Find; FBtn_replace; FBtn_Count_a; FBtn_Replaceall; FBtn_Count; // 计数 flabels; FCheck_revers; FCheck_wrap; FCheck_case; FCheck_cycle; FCheck_reg; FCheck_subdir; FCheck_gt; autoref end type TGoToLineWnd=class(TVCForm) //跳转 function Create(AOwner);override; begin inherited; ParentFont := false; font := array("width":10,"height":20); wssizebox := false; minmaxbox := false; WsDlgModalFrame := true; width := 300; height := 110; caption := "转到.."; FLabel := new TLabel(self); FLabel.TextAlign := AL9_CENTER;//tAlignStyle9 FLabel.SetBoundsRect(array(3,10,70,35)); FEdit := new TEdit(self); FEdit.SetBoundsRect(array(75,10,200,35)); FBtn := new TBtn(self); FBtn.SetBoundsRect(array(210,10,280,35)); FLabel.Caption := "跳到行:"; FBtn.Caption := " 确定 "; FLabel.parent := self; FEdit.parent := self; FEdit.OnKeyPress := function(o,e) begin if e.CharCode=13 then begin e.skip := true; GotoTextInteger(); end end OnClose := function(o,e) begin o.visible := false; e.skip := true; end FBtn.parent := self; FBtn.OnClick := function(o,e) begin GotoTextInteger(); end childsizing := array("layout":1,"leftrightspacing":5,"topbottomspacing":10,"verticalspacing":5,"controlsperline":3); autosize := true; end function DoControlAlign();override; begin end function ShowGoto(); begin show(); FEdit.SetFocus(); FEdit.ExecuteCommand("ecselall"); end private function GotoTextInteger(); begin id := FEdit.Text; id := StrToIntDef(id,0); if id>0 then begin it := Owner.GetCurrentItem(); Visible := false; Owner.OpenAndGotoFileByName(it.ScriptPath,id); it := Owner.GetCurrentEditer(); if not it then return; it.SetFocus(); end end FEdit; FBtn; end function filenameIsTheSame(p1,p2); begin if not(ifstring(p1)and ifstring(p2))then return 0; if p1=p2 then return 1; {$ifdef linux} {$else} return lowercase(p1)=lowercase(p2); {$endif} end type TMouseMoveList=class(TListBox) function Create(AOwner);override; begin inherited; FCurrentIndex :=-1; end function MouseMove(o,e);override; begin inherited; idx := GetIdxByYpos(e.ypos); if FCurrentIndex <> idx then begin FCurrentIndex := idx; InValidateRect(nil,false); end end function getItemText(i);override; begin r := inherited; return "["$ i $"]" $ to_ansi_str(r); end function PaintIdx(idx,rc_,cvs);virtual; begin {** @explan(说明)绘制项 %% @param(item)(TCustomListItem) 项 %% @param(rc)(array) 绘制区域%% @param(cvs)(tcanvas) 画布 %% **} inherited; if idx=FCurrentIndex then begin rc := rc_; rc[2:3]-= 1; cvs.pen.Color := rgb(30,144,255); cvs.draw("Polyline",array(rc[0:1],(rc[2],rc[1]),(rc[2],rc[3]),(rc[0],rc[3]),rc[0:1])); end end private FCurrentIndex; end function GetEditIcons(); begin r := array(); r["打开文件"]:= getopenfilebmpinfo(); r["保存全部"]:= getsaveallbitmapinfo(); r["保存"]:= GetSaveFileBitmapInfo(); r["取消注释"]:= getedituncommetbmpinfo(); r["注释"]:= geteditcommetbmpinfo(); r["tsl代码格式化"]:= gettslcodeformatbitmapinfo(); r["撤销"]:= getredobitmapinfo(); r["反撤销"]:= getunredobitmapinfo(); r["tsl语法检查"]:=gettslsyntaxcheckbitmapinfo(); r["查找"]:=getfindbitmapinfo(); r["后退"]:= getbackwardbitmapinfo(); r["前进"]:= getforwardbitmapinfo(); r["快捷键说明"]:= getquickkeybitmapinfo(); r["代码地图(alt+m)"]:= gettslcodemapbitmapinfo(); r["分隔符"] := 0; return r union dbugicos(); end function dbugicos(); begin r := array(); r["添加/删除断点F5"]:= getdbugaddbreakbmpinfo(); r["暂停"]:= getdbugsuspendbmpinfo(); r["继续"]:= getdbugcontinuebmpinfo(); r["进入"]:= getdbugsetpinbmpinfo(); r["跳出"]:= getdbugstepoutbmpinfo(); //r["单步"] := getdbugmcronextbmpinfo(); r["下一行(F8)"]:= getdbugnextbmpinfo(); r["终止"]:= getdbugstopbmpinfo(); r["刷新符号表"]:= getdbugfreshsymsbmpinfo(); r["刷新当前符号"]:=getdbugfreshsymbmpinfo(); return r; end function to_ansi_str(s); begin if IsTextUTF8(s)=1 then return UTF8toansi(s); return s; end function ReWriteString(fn,d); begin if not ifstring(d)then return 0; als := ""; len := length(d); sp := ioFileseparator(); if FileExists(als,fn) and (filesize(als,fn)>len)then begin lfn := FileList(als,fn); //修正文件名变小写的问题 if lfn then begin nfn := lfn[0,"FileName"]; if nfn then begin for i := length(fn) downto 1 do begin if fn[i]=sp then begin fn := fn[1:i]+nfn; break; end end end end FileDelete(als,fn); end else begin CreateDirWithFileName(fn); end spos := 0; return writefile(rwraw(),als,fn,spos,len,d); end function gettslexe(); begin return static gettslexefullpath(); end function limitstringlength(s); begin len := length(s); n := 150; if len>n then begin if bytetype(s,n)=1 then begin return trim(s[1:(n-1)])+"..."; end else begin return trim(s[1:n])+"..."; end end return trim(s); end end.