* May 18th, 2005: Starting to develop AMXX-Edit v2 as a kind of open source
This commit is contained in:
parent
3642cedd2b
commit
dd6abc5487
38
editor/editor2/AMXX_Edit_v2.cfg
Executable file
38
editor/editor2/AMXX_Edit_v2.cfg
Executable file
@ -0,0 +1,38 @@
|
|||||||
|
-$A8
|
||||||
|
-$B-
|
||||||
|
-$C+
|
||||||
|
-$D+
|
||||||
|
-$E-
|
||||||
|
-$F-
|
||||||
|
-$G+
|
||||||
|
-$H+
|
||||||
|
-$I+
|
||||||
|
-$J-
|
||||||
|
-$K-
|
||||||
|
-$L+
|
||||||
|
-$M-
|
||||||
|
-$N+
|
||||||
|
-$O+
|
||||||
|
-$P+
|
||||||
|
-$Q-
|
||||||
|
-$R-
|
||||||
|
-$S-
|
||||||
|
-$T-
|
||||||
|
-$U-
|
||||||
|
-$V+
|
||||||
|
-$W-
|
||||||
|
-$X+
|
||||||
|
-$YD
|
||||||
|
-$Z1
|
||||||
|
-cg
|
||||||
|
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
|
||||||
|
-H+
|
||||||
|
-W+
|
||||||
|
-M
|
||||||
|
-$M16384,1048576
|
||||||
|
-K$00400000
|
||||||
|
-LE"c:\programme\borland\delphi7\Projects\Bpl"
|
||||||
|
-LN"c:\programme\borland\delphi7\Projects\Bpl"
|
||||||
|
-w-UNSAFE_TYPE
|
||||||
|
-w-UNSAFE_CODE
|
||||||
|
-w-UNSAFE_CAST
|
136
editor/editor2/AMXX_Edit_v2.dof
Executable file
136
editor/editor2/AMXX_Edit_v2.dof
Executable file
@ -0,0 +1,136 @@
|
|||||||
|
[FileVersion]
|
||||||
|
Version=7.0
|
||||||
|
[Compiler]
|
||||||
|
A=8
|
||||||
|
B=0
|
||||||
|
C=1
|
||||||
|
D=1
|
||||||
|
E=0
|
||||||
|
F=0
|
||||||
|
G=1
|
||||||
|
H=1
|
||||||
|
I=1
|
||||||
|
J=0
|
||||||
|
K=0
|
||||||
|
L=1
|
||||||
|
M=0
|
||||||
|
N=1
|
||||||
|
O=1
|
||||||
|
P=1
|
||||||
|
Q=0
|
||||||
|
R=0
|
||||||
|
S=0
|
||||||
|
T=0
|
||||||
|
U=0
|
||||||
|
V=1
|
||||||
|
W=0
|
||||||
|
X=1
|
||||||
|
Y=1
|
||||||
|
Z=1
|
||||||
|
ShowHints=1
|
||||||
|
ShowWarnings=1
|
||||||
|
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
|
||||||
|
NamespacePrefix=
|
||||||
|
SymbolDeprecated=1
|
||||||
|
SymbolLibrary=1
|
||||||
|
SymbolPlatform=1
|
||||||
|
UnitLibrary=1
|
||||||
|
UnitPlatform=1
|
||||||
|
UnitDeprecated=1
|
||||||
|
HResultCompat=1
|
||||||
|
HidingMember=1
|
||||||
|
HiddenVirtual=1
|
||||||
|
Garbage=1
|
||||||
|
BoundsError=1
|
||||||
|
ZeroNilCompat=1
|
||||||
|
StringConstTruncated=1
|
||||||
|
ForLoopVarVarPar=1
|
||||||
|
TypedConstVarPar=1
|
||||||
|
AsgToTypedConst=1
|
||||||
|
CaseLabelRange=1
|
||||||
|
ForVariable=1
|
||||||
|
ConstructingAbstract=1
|
||||||
|
ComparisonFalse=1
|
||||||
|
ComparisonTrue=1
|
||||||
|
ComparingSignedUnsigned=1
|
||||||
|
CombiningSignedUnsigned=1
|
||||||
|
UnsupportedConstruct=1
|
||||||
|
FileOpen=1
|
||||||
|
FileOpenUnitSrc=1
|
||||||
|
BadGlobalSymbol=1
|
||||||
|
DuplicateConstructorDestructor=1
|
||||||
|
InvalidDirective=1
|
||||||
|
PackageNoLink=1
|
||||||
|
PackageThreadVar=1
|
||||||
|
ImplicitImport=1
|
||||||
|
HPPEMITIgnored=1
|
||||||
|
NoRetVal=1
|
||||||
|
UseBeforeDef=1
|
||||||
|
ForLoopVarUndef=1
|
||||||
|
UnitNameMismatch=1
|
||||||
|
NoCFGFileFound=1
|
||||||
|
MessageDirective=1
|
||||||
|
ImplicitVariants=1
|
||||||
|
UnicodeToLocale=1
|
||||||
|
LocaleToUnicode=1
|
||||||
|
ImagebaseMultiple=1
|
||||||
|
SuspiciousTypecast=1
|
||||||
|
PrivatePropAccessor=1
|
||||||
|
UnsafeType=0
|
||||||
|
UnsafeCode=0
|
||||||
|
UnsafeCast=0
|
||||||
|
[Linker]
|
||||||
|
MapFile=0
|
||||||
|
OutputObjs=0
|
||||||
|
ConsoleApp=1
|
||||||
|
DebugInfo=0
|
||||||
|
RemoteSymbols=0
|
||||||
|
MinStackSize=16384
|
||||||
|
MaxStackSize=1048576
|
||||||
|
ImageBase=4194304
|
||||||
|
ExeDescription=
|
||||||
|
[Directories]
|
||||||
|
OutputDir=
|
||||||
|
UnitOutputDir=
|
||||||
|
PackageDLLOutputDir=
|
||||||
|
PackageDCPOutputDir=
|
||||||
|
SearchPath=
|
||||||
|
Packages=vcl;rtl;vclx;vclie;xmlrtl;inetdbbde;inet;inetdbxpress;VclSmp;dbrtl;dbexpress;vcldb;dsnap;dbxcds;inetdb;bdertl;vcldbx;adortl;teeui;teedb;tee;ibxpress;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOffice2k;JvStdCtrlsD7R;JvAppFrmD7R;JvCoreD7R;JvBandsD7R;JvBDED7R;JvDBD7R;JvDlgsD7R;JvCmpD7R;JvCryptD7R;JvCtrlsD7R;JvCustomD7R;JvDockingD7R;JvDotNetCtrlsD7R;JvEDID7R;qrpt;JvGlobusD7R;JvHMID7R;JvInspectorD7R;JvInterpreterD7R;JvJansD7R;JvManagedThreadsD7R;JvMMD7R;JvNetD7R;JvPageCompsD7R;JvPluginD7R;JvPrintPreviewD7R;JvSystemD7R;JvTimeFrameworkD7R;JvUIBD7R;JvValidatorsD7R;JvWizardD7R;JvXPCtrlsD7R;Indy70;FlatStyle_D5;CrossKylix;DJcl;DelphiX_for7
|
||||||
|
Conditionals=
|
||||||
|
DebugSourceDirs=
|
||||||
|
UsePackages=0
|
||||||
|
[Parameters]
|
||||||
|
RunParams=
|
||||||
|
HostApplication=
|
||||||
|
Launcher=
|
||||||
|
UseLauncher=0
|
||||||
|
DebugCWD=
|
||||||
|
[Language]
|
||||||
|
ActiveLang=
|
||||||
|
ProjectLang=
|
||||||
|
RootDir=
|
||||||
|
[Version Info]
|
||||||
|
IncludeVerInfo=0
|
||||||
|
AutoIncBuild=0
|
||||||
|
MajorVer=1
|
||||||
|
MinorVer=0
|
||||||
|
Release=0
|
||||||
|
Build=0
|
||||||
|
Debug=0
|
||||||
|
PreRelease=0
|
||||||
|
Special=0
|
||||||
|
Private=0
|
||||||
|
DLL=0
|
||||||
|
Locale=1031
|
||||||
|
CodePage=1252
|
||||||
|
[Version Info Keys]
|
||||||
|
CompanyName=AMX Mod X
|
||||||
|
FileDescription=
|
||||||
|
FileVersion=1.0.0.0
|
||||||
|
InternalName=
|
||||||
|
LegalCopyright=
|
||||||
|
LegalTrademarks=
|
||||||
|
OriginalFilename=
|
||||||
|
ProductName=
|
||||||
|
ProductVersion=1.0.0.0
|
||||||
|
Comments=
|
72
editor/editor2/AMXX_Edit_v2.dpr
Executable file
72
editor/editor2/AMXX_Edit_v2.dpr
Executable file
@ -0,0 +1,72 @@
|
|||||||
|
program AMXX_Edit_v2;
|
||||||
|
|
||||||
|
{
|
||||||
|
AMXX-Edit v2
|
||||||
|
|
||||||
|
Editor for AMX Mod X scripts, coded by Basic-Master
|
||||||
|
© by AMX Mod X Development Team
|
||||||
|
|
||||||
|
This application uses the following components:
|
||||||
|
|
||||||
|
DelphiSci: delphisci.sourceforge.net (based on Scintilla library: scintilla.sourceforge.net)
|
||||||
|
FlatStyle by Maik Porkert (found on www.torry.net)
|
||||||
|
GlyFX Icons: www.glyfx.com (using GlyFX Icon Pack of Delphi 2005 PE)
|
||||||
|
Modified CorelButton (see CorelButton.pas, original by ConquerWare)
|
||||||
|
Indy 9 Socket Components: www.indyproject.org
|
||||||
|
|
||||||
|
AMXX-Edit v2 is published under GNU General Public License and comes
|
||||||
|
with ABSOLUTELY NO WARRANTY (see GPL.txt for more information)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uses
|
||||||
|
Forms,
|
||||||
|
Windows,
|
||||||
|
Classes,
|
||||||
|
SysUtils,
|
||||||
|
UnitfrmMain in 'UnitfrmMain.pas' {frmMain},
|
||||||
|
UnitfrmOptions in 'UnitfrmOptions.pas' {frmSettings},
|
||||||
|
UnitfrmDebug in 'UnitfrmDebug.pas' {frmDebug},
|
||||||
|
UnitFunc in 'UnitFunc.pas',
|
||||||
|
UnitfrmAbout in 'UnitfrmAbout.pas' {frmAbout},
|
||||||
|
UnitfrmGoToLine in 'UnitfrmGoToLine.pas' {frmGoToLine},
|
||||||
|
UnitfrmSaveDialog in 'UnitfrmSaveDialog.pas' {frmSaveDialog},
|
||||||
|
UnitTextAnalyze in 'UnitTextAnalyze.pas',
|
||||||
|
UnitfrmMenuMaker in 'UnitfrmMenuMaker.pas' {frmMenuMaker},
|
||||||
|
UnitAddMenu in 'UnitAddMenu.pas',
|
||||||
|
UnitfrmSelectMenu in 'UnitfrmSelectMenu.pas' {frmSelectMenu},
|
||||||
|
UnitHowToMakePlayerMenu in 'UnitHowToMakePlayerMenu.pas' {frmHowToMakePlayerMenu},
|
||||||
|
UnitfrmSockets in 'UnitfrmSockets.pas' {frmSocketTerminal},
|
||||||
|
UnitReadThread in 'UnitReadThread.pas',
|
||||||
|
UnitfrmLoopGenerator in 'UnitfrmLoopGenerator.pas' {frmLoopGenerator};
|
||||||
|
|
||||||
|
{$R *.res}
|
||||||
|
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
if (FindWindow('TfrmMain', 'AMXX-Edit v2') <> 0) then begin // Don't allow 2 starts...
|
||||||
|
for i := 1 to ParamCount do begin
|
||||||
|
if FileExists(ParamStr(i)) then
|
||||||
|
SendOpen(ParamStr(i)); // ... and send open message to the other app
|
||||||
|
end;
|
||||||
|
ShowWindow(FindWindow('TfrmMain', 'AMXX-Edit v2'), SW_SHOW);
|
||||||
|
SetForegroundWindow(FindWindow('TfrmMain', 'AMXX-Edit v2'));
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
Application.Initialize;
|
||||||
|
Application.Title := 'AMXX-Edit v2';
|
||||||
|
Application.CreateForm(TfrmMain, frmMain);
|
||||||
|
Application.CreateForm(TfrmSettings, frmSettings);
|
||||||
|
Application.CreateForm(TfrmDebug, frmDebug);
|
||||||
|
Application.CreateForm(TfrmAbout, frmAbout);
|
||||||
|
Application.CreateForm(TfrmGoToLine, frmGoToLine);
|
||||||
|
Application.CreateForm(TfrmSaveDialog, frmSaveDialog);
|
||||||
|
Application.CreateForm(TfrmMenuMaker, frmMenuMaker);
|
||||||
|
Application.CreateForm(TfrmSelectMenu, frmSelectMenu);
|
||||||
|
Application.CreateForm(TfrmHowToMakePlayerMenu, frmHowToMakePlayerMenu);
|
||||||
|
Application.CreateForm(TfrmSocketTerminal, frmSocketTerminal);
|
||||||
|
Application.CreateForm(TfrmLoopGenerator, frmLoopGenerator);
|
||||||
|
Load;
|
||||||
|
Apply;
|
||||||
|
Application.Run;
|
||||||
|
end.
|
436
editor/editor2/UnitAddMenu.pas
Executable file
436
editor/editor2/UnitAddMenu.pas
Executable file
@ -0,0 +1,436 @@
|
|||||||
|
unit UnitAddMenu;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses SysUtils, Classes, Graphics, Dialogs, Windows;
|
||||||
|
|
||||||
|
function AddMenu: Boolean;
|
||||||
|
function AddPlayerMenu: Boolean;
|
||||||
|
function GetFirst(eStart: String; eSearchMain: Boolean): Integer;
|
||||||
|
function GetLast(eStart: String; eSearchMain: Boolean): Integer;
|
||||||
|
function AddIfDoesntExist(eInclude: String): Boolean;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmMenuMaker, UnitfrmMain, UnitTextAnalyze, UnitFunc;
|
||||||
|
|
||||||
|
{ Normal Menu }
|
||||||
|
|
||||||
|
function AddMenu: Boolean;
|
||||||
|
var eColoredMenu, DefinedKeys: String;
|
||||||
|
i: integer;
|
||||||
|
eStr: TStringList;
|
||||||
|
begin
|
||||||
|
Result := GetFirst('public Show' + frmMenuMaker.txtMenuName.Text, True) = -1;
|
||||||
|
if not Result then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
eStr := TStringList.Create;
|
||||||
|
{ Transform text }
|
||||||
|
eColoredMenu := frmMenuMaker.GetColoredMenu;
|
||||||
|
if frmMenuMaker.chkAppendOnlyMenuText.Checked then begin
|
||||||
|
frmMain.sciEditor.Lines.Add('// Created menu: ' + eColoredMenu);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
{ Add functions }
|
||||||
|
eStr.Add(Format('public Show%s(id) {', [frmMenuMaker.txtMenuName.Text]));
|
||||||
|
eStr.Add(' show_menu(id, Keys' + frmMenuMaker.txtMenuName.Text + ', "' + eColoredMenu + '", -1, "' + frmMenuMaker.txtMenuName.Text + '")');
|
||||||
|
if frmMenuMaker.chkAddComment.Checked then
|
||||||
|
eStr[eStr.Count -1] := eStr[eStr.Count -1] + ' // Display menu';
|
||||||
|
eStr.Add('}');
|
||||||
|
eStr.Add('');
|
||||||
|
eStr.Add('public Pressed' + frmMenuMaker.txtMenuName.Text + '(id, key) {');
|
||||||
|
if frmMenuMaker.chkAddComment.Checked then begin
|
||||||
|
eStr.Add(' /* Menu:');
|
||||||
|
for i := 0 to frmMenuMaker.rtfEditor.Lines.Count -1 do
|
||||||
|
eStr.Add(' * ' + frmMenuMaker.rtfEditor.Lines[i]);
|
||||||
|
eStr.Add(' */');
|
||||||
|
eStr.Add('');
|
||||||
|
end;
|
||||||
|
eStr.Add(' switch (key) {');
|
||||||
|
DefinedKeys := '';
|
||||||
|
for i := 1 to Length(frmMenuMaker.txtKeys.Text) do begin
|
||||||
|
if frmMenuMaker.txtKeys.Text[i] = '0' then begin
|
||||||
|
DefinedKeys := DefinedKeys + '|(1<<9)';
|
||||||
|
if frmMenuMaker.chkAddComment.Checked then
|
||||||
|
eStr.Add(' case 9: { // 0')
|
||||||
|
else
|
||||||
|
eStr.Add(' case 9: {');
|
||||||
|
eStr.Add(' ');
|
||||||
|
eStr.Add(' }');
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
DefinedKeys := DefinedKeys + '|(1<<' + IntToStr(StrToInt(frmMenuMaker.txtKeys.Text[i]) -1) + ')';
|
||||||
|
if frmMenuMaker.chkAddComment.Checked then
|
||||||
|
eStr.Add(' case ' + IntToStr(StrToInt(frmMenuMaker.txtKeys.Text[i]) -1) + ': { // ' + frmMenuMaker.txtKeys.Text[i])
|
||||||
|
else
|
||||||
|
eStr.Add(' case ' + IntToStr(StrToInt(frmMenuMaker.txtKeys.Text[i]) -1) + ': {');
|
||||||
|
eStr.Add(' ');
|
||||||
|
eStr.Add(' }');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Delete(DefinedKeys, 1, 1);
|
||||||
|
if frmMenuMaker.chkAddComment.Checked then
|
||||||
|
DefinedKeys := DefinedKeys + ' // Keys: ' + frmMenuMaker.txtKeys.Text;
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add('}');
|
||||||
|
// Insert
|
||||||
|
AddIfDoesntExist('amxmodx');
|
||||||
|
i := GetFirst('#define', True) +2;
|
||||||
|
if i = 1 then
|
||||||
|
i := GetFirst('#include', True) +2;
|
||||||
|
if i = 1 then
|
||||||
|
i := 0;
|
||||||
|
|
||||||
|
frmMain.sciEditor.Lines.Insert(i, Format('#define Keys%s %s', [frmMenuMaker.txtMenuName.Text, DefinedKeys]));
|
||||||
|
frmMain.sciEditor.Lines.Text := frmMain.sciEditor.Lines.Text + #13 + eStr.Text;
|
||||||
|
if frmMenuMaker.chkRegisterMenuCommand.Checked then begin
|
||||||
|
i := GetFirst('register_plugin', True) +2;
|
||||||
|
if i = 1 then
|
||||||
|
i := GetFirst('public plugin_init()', True) +2;
|
||||||
|
if i = 1 then begin
|
||||||
|
eStr.Clear;
|
||||||
|
eStr.Add('public plugin_init() {');
|
||||||
|
eStr.Add(' register_menucmd(register_menuid("' + frmMenuMaker.txtMenuName.Text + '"), Keys' + frmMenuMaker.txtMenuName.Text + ', "Pressed' + frmMenuMaker.txtMenuName.Text + '")');
|
||||||
|
eStr.Add('}');
|
||||||
|
frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +2, '');
|
||||||
|
frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +3, eStr.Text);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
frmMain.sciEditor.Lines.Insert(i, ' register_menucmd(register_menuid("' + frmMenuMaker.txtMenuName.Text + '"), Keys' + frmMenuMaker.txtMenuName.Text + ', "Pressed' + frmMenuMaker.txtMenuName.Text + '")');
|
||||||
|
end;
|
||||||
|
frmMain.SetModified;
|
||||||
|
eStr.Free;
|
||||||
|
UpdateList(frmMain.sciEditor.Lines.Text);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Player Menu }
|
||||||
|
|
||||||
|
function AddPlayerMenu: Boolean;
|
||||||
|
function PrepareItem(eItem: String; eDisabled: Boolean): String; // Remove colors etc.
|
||||||
|
begin
|
||||||
|
eItem := StringReplace(eItem, '\w', '', [rfReplaceAll, rfIgnoreCase]);
|
||||||
|
eItem := StringReplace(eItem, '\y', '', [rfReplaceAll, rfIgnoreCase]);
|
||||||
|
eItem := StringReplace(eItem, '\r', '', [rfReplaceAll, rfIgnoreCase]);
|
||||||
|
eItem := StringReplace(eItem, '\d', '', [rfReplaceAll, rfIgnoreCase]);
|
||||||
|
eItem := StringReplace(eItem, '%n', '%i', [rfIgnoreCase]);
|
||||||
|
eItem := StringReplace(eItem, '%v', '%s', [rfIgnoreCase]);
|
||||||
|
if eDisabled then
|
||||||
|
eItem := '\d' + eItem
|
||||||
|
else
|
||||||
|
eItem := '\w' + eItem;
|
||||||
|
Result := eItem + '^n';
|
||||||
|
end;
|
||||||
|
|
||||||
|
var i: integer;
|
||||||
|
eStr: TStringList;
|
||||||
|
ePlayersFrom, ePlayersTo: Integer; // Players
|
||||||
|
ePlayerFormat: String;
|
||||||
|
eNext, eExit: Integer; // Next and Back/Exit
|
||||||
|
eNextText, eBackText, eExitText: String;
|
||||||
|
eCurLineIndex: Integer; // Current ..
|
||||||
|
eCurLine: String; // .. line
|
||||||
|
DefinedKeys: String; // Action Keys
|
||||||
|
begin
|
||||||
|
Result := GetFirst('public Show' + frmMenuMaker.txtMenu.Text, True) = -1;
|
||||||
|
if not Result then begin
|
||||||
|
MessageBox(frmMenuMaker.Handle, 'Menu already exists. Please choose another name.', 'Warning', MB_ICONWARNING);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
|
Kick player
|
||||||
|
|
||||||
|
$players(1,8,%n. %v)
|
||||||
|
$next(9,9. Next)
|
||||||
|
|
||||||
|
$exitorback(0, 0. Exit, 0. Back)
|
||||||
|
}
|
||||||
|
|
||||||
|
eCurLine := frmMenuMaker.rtfEditor.Lines[0];
|
||||||
|
eCurLineIndex := 0;
|
||||||
|
eNext := -1;
|
||||||
|
eExit := -1;
|
||||||
|
eStr := TStringList.Create;
|
||||||
|
// Prepare Values
|
||||||
|
try
|
||||||
|
{ Players }
|
||||||
|
eCurLineIndex := GetFirst('$players', False);
|
||||||
|
eCurLine := frmMenuMaker.rtfEditor.Lines[eCurLineIndex];
|
||||||
|
ePlayersFrom := StrToInt(Between(LowerCase(Trim(eCurLine)), '$players(', ','));
|
||||||
|
ePlayersTo := StrToInt(Between(Trim(LowerCase(eCurLine)), ',', ','));
|
||||||
|
while CountChars(eCurLine, ',') > 1 do
|
||||||
|
Delete(eCurLine, 1, 1);
|
||||||
|
ePlayerFormat := Between(LowerCase(eCurLine), ',', ')');
|
||||||
|
{ Next }
|
||||||
|
if GetFirst('$next', False) <> -1 then begin
|
||||||
|
eCurLineIndex := GetFirst('$next', False);
|
||||||
|
eCurLine := frmMenuMaker.rtfEditor.Lines[eCurLineIndex];
|
||||||
|
eNext := StrToInt(Trim(Between(eCurLine, '(', ',')));
|
||||||
|
eNextText := Between(eCurLine, ',', ')');
|
||||||
|
end;
|
||||||
|
{ Exit or Back }
|
||||||
|
if GetFirst('$exitorback', False) <> -1 then begin
|
||||||
|
eCurLineIndex := GetFirst('$exitorback', False);
|
||||||
|
eCurLine := frmMenuMaker.rtfEditor.Lines[eCurLineIndex];
|
||||||
|
eExit := StrToInt(Trim(Between(eCurLine, '(', ',')));
|
||||||
|
eExitText := Between(eCurLine, ',', ',');
|
||||||
|
while CountChars(eCurLine, ',') > 1 do
|
||||||
|
Delete(eCurLine, 1, 1);
|
||||||
|
eBackText := Between(eCurLine, ',', ')');
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
MessageBox(frmMenuMaker.Handle, PChar(Format('Syntax error at line %s: ' + #13 + '%s', [IntToStr(eCurLineIndex +1), frmMenuMaker.rtfEditor.Lines[eCurLineIndex]])), 'Error', MB_ICONERROR);
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
// Check Keys
|
||||||
|
{ Players }
|
||||||
|
if (ePlayersFrom < 0) or (ePlayersFrom > ePlayersTo) then begin
|
||||||
|
MessageBox(frmMenuMaker.Handle, 'Invalid start key (players)', 'Warning', MB_ICONWARNING);
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if (ePlayersTo < 0) or (ePlayersTo > 9) then begin
|
||||||
|
MessageBox(frmMenuMaker.Handle, 'Invalid stop key (players)', 'Warning', MB_ICONWARNING);
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
{ Next, Exit and Custom keys}
|
||||||
|
eCurLine := '';
|
||||||
|
for i := ePlayersFrom to ePlayersTo do
|
||||||
|
eCurLine := eCurLine + IntToStr(i);
|
||||||
|
|
||||||
|
if Pos(IntToStr(eNext), eCurLine) > 0 then begin
|
||||||
|
MessageBox(frmMenuMaker.Handle, PChar(Format('"Next" key already in use (%s). Delete it or choose another one and try again.', [IntToStr(eNext)])), 'Warning', MB_ICONWARNING);
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if Pos(IntToStr(eExit), eCurLine) > 0 then begin
|
||||||
|
MessageBox(frmMenuMaker.Handle, PChar(Format('"Exit" key already in use (%s). Delete it or choose another one and try again.', [IntToStr(eExit)])), 'Warning', MB_ICONWARNING);
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
eCurLine := eCurLine + IntToStr(eNext);
|
||||||
|
eCurLine := eCurLine + IntToStr(eExit);
|
||||||
|
// Insert Code
|
||||||
|
try
|
||||||
|
{ Includes }
|
||||||
|
AddIfDoesntExist('amxmodx');
|
||||||
|
AddIfDoesntExist('amxmisc');
|
||||||
|
{ Define Keys }
|
||||||
|
DefinedKeys := '';
|
||||||
|
if Length(eCurLine) <> 0 then begin
|
||||||
|
for i := 1 to Length(eCurLine) do begin
|
||||||
|
if eCurLine[i] = '0' then
|
||||||
|
DefinedKeys := DefinedKeys + '|(1<<9)'
|
||||||
|
else begin
|
||||||
|
eCurLine[i] := IntToStr(StrToInt(eCurLine[i]) -1)[1];
|
||||||
|
DefinedKeys := DefinedKeys + '|(1<<' + eCurLine[i] + ')';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Delete(DefinedKeys, 1, 1);
|
||||||
|
end;
|
||||||
|
i := GetLast('#define', True) +2;
|
||||||
|
if i = 1 then
|
||||||
|
i := GetLast('#include', True) +2;
|
||||||
|
if i = 1 then
|
||||||
|
i := 0;
|
||||||
|
frmMain.sciEditor.Lines.Insert(i, Format('#define Keys%s %s', [frmMenuMaker.txtMenu.Text, DefinedKeys]));
|
||||||
|
frmMain.sciEditor.Lines.Insert(i +1, 'new MenuPos' + frmMenuMaker.txtMenu.Text);
|
||||||
|
frmMain.sciEditor.Lines.Insert(i +2, 'new MenuPlayers' + frmMenuMAker.txtMenu.Text + '[32]');
|
||||||
|
{ Register }
|
||||||
|
i := GetFirst('register_plugin', True) +2;
|
||||||
|
if i = 1 then
|
||||||
|
i := GetFirst('public plugin_init()', True) +2;
|
||||||
|
if i = 1 then begin
|
||||||
|
eStr.Clear;
|
||||||
|
eStr.Add('public plugin_init() {');
|
||||||
|
eStr.Add(' register_menucmd(register_menuid("' + frmMenuMaker.txtMenu.Text + '"), Keys' + frmMenuMaker.txtMenu.Text + ', "Pressed' + frmMenuMaker.txtMenu.Text + '")');
|
||||||
|
eStr.Add('}');
|
||||||
|
frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +2, '');
|
||||||
|
frmMain.sciEditor.Lines.Insert(GetFirst('#define', True) +3, eStr.Text);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
frmMain.sciEditor.Lines.Insert(i, ' register_menucmd(register_menuid("' + frmMenuMaker.txtMenu.Text + '"), Keys' + frmMenuMaker.txtMenu.Text + ', "Pressed' + frmMenuMaker.txtMenu.Text + '")');
|
||||||
|
{ Show Menu Functions (thx to xeroblood for code example) }
|
||||||
|
eStr.Clear;
|
||||||
|
eStr.Add('public Show' + frmMenuMaker.txtMenu.Text + '(id) {');
|
||||||
|
eStr.Add(' ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, MenuPos' + frmMenuMaker.txtMenu.Text + ' = 0)');
|
||||||
|
eStr.Add(' return PLUGIN_HANDLED');
|
||||||
|
eStr.Add('}');
|
||||||
|
eStr.Add('');
|
||||||
|
eStr.Add('public ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, position) {');
|
||||||
|
if frmMenuMaker.chkComments.Checked then
|
||||||
|
eStr.Add(' // Menu stuff //');
|
||||||
|
eStr.Add(' if (position < 0) { return 0; }');
|
||||||
|
eStr.Add(' ');
|
||||||
|
eStr.Add(' new i, k');
|
||||||
|
eStr.Add(' new MenuBody[255]');
|
||||||
|
eStr.Add(' new CurrentKey = ' + IntToStr(ePlayersFrom -1));
|
||||||
|
eStr.Add(' new Start = position * ' + IntToStr(ePlayersTo - ePlayersFrom));
|
||||||
|
eStr.Add(' new Num');
|
||||||
|
eStr.Add(' new UserName[32]');
|
||||||
|
eStr.Add(' ');
|
||||||
|
eStr.Add(' get_players(MenuPlayers' + frmMenuMaker.txtMenu.Text + ', Num)');
|
||||||
|
eStr.Add(' if (Start >= Num) { Start = position = MenuPos' + frmMenuMaker.txtMenu.Text + ' = 0; }');
|
||||||
|
eCurLine := frmMenuMaker.GetColoredMenu;
|
||||||
|
eCurLine := Copy(eCurLine, 1, Pos('$players', eCurLine) -3);
|
||||||
|
Insert('\R%d/%d^n\w', eCurLine, Pos('^n', eCurLine));
|
||||||
|
eStr.Add(' new Len = format(MenuBody, 255, "' + eCurLine + '", position+1, (Num / ' + IntToStr(ePlayersTo - ePlayersFrom) + ' + ((Num % ' + IntToStr(ePlayersTo - ePlayersFrom) + ') ? 1 : 0 )) )');
|
||||||
|
eStr.Add(' new End = Start + ' + IntToStr(ePlayersTo - ePlayersFrom));
|
||||||
|
if eExit = 0 then
|
||||||
|
eStr.Add(' new Keys = (1<<9)')
|
||||||
|
else
|
||||||
|
eStr.Add(' new Keys = (1<<' + IntToStr(eExit -1) + ')');
|
||||||
|
eStr.Add(' if (End > Num) { End = Num; }');
|
||||||
|
eStr.Add(' ');
|
||||||
|
eStr.Add(' for(i=Start;i<End;i++) {');
|
||||||
|
eStr.Add(' k = MenuPlayers' + frmMenuMaker.txtMenu.Text + '[i]');
|
||||||
|
eStr.Add(' get_user_name(k, UserName, 31)');
|
||||||
|
// Any conditions?
|
||||||
|
if (frmMenuMaker.chkImmunity.Checked) and (frmMenuMaker.chkAlive.Checked) then
|
||||||
|
eStr.Add(' if ((get_user_flags(k) & ADMIN_IMMUNITY) || !is_user_alive(k)) {')
|
||||||
|
else if (frmMenuMaker.chkImmunity.Checked) then
|
||||||
|
eStr.Add(' if (get_user_flags(k) & ADMIN_IMMUNITY) {')
|
||||||
|
else if (frmMenuMaker.chkAlive.Checked) then
|
||||||
|
eStr.Add(' if (!is_user_alive(k)) {');
|
||||||
|
if (frmMenuMaker.chkImmunity.Checked) or (frmMenuMaker.chkAlive.Checked) then begin
|
||||||
|
eStr.Add(' CurrentKey++');
|
||||||
|
eStr.Add(' Len += format(MenuBody[Len], (255-Len), "' + PrepareItem(ePlayerFormat, True) + '", CurrentKey, UserName)');
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add(' else {');
|
||||||
|
eStr.Add(' Keys |= (1<<CurrentKey++)');
|
||||||
|
eStr.Add(' Len += format(MenuBody[Len], (255-Len), "' + PrepareItem(ePlayerFormat, False) + '", CurrentKey, UserName)');
|
||||||
|
eStr.Add(' }');
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
eStr.Add(' Keys |= (i<<CurrentKey++)');
|
||||||
|
eStr.Add(' Len += format(MenuBody[Len], (255-Len), "' + PrepareItem(ePlayerFormat, False) + '", CurrentKey, UserName)');
|
||||||
|
end;
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add(' if (End != Num) {');
|
||||||
|
eStr.Add(' format(MenuBody[Len], (255-Len), "^n\w' + eNextText + '^n%s", position ? "\w' + eBackText + '" : "\w' + eExitText + '")');
|
||||||
|
eStr.Add(' Keys |= (1<<' + IntToStr(eNext -1) + ')');
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add(' else {');
|
||||||
|
eStr.Add(' format(MenuBody[Len], (255-Len), "^n%s", position ? "\w' + eBackText + '" : "\w' + eExitText + '")');
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add(' show_menu(id, Keys, MenuBody, -1)');
|
||||||
|
eStr.Add(' return 0');
|
||||||
|
eStr.Add('}');
|
||||||
|
eStr.Add('');
|
||||||
|
eStr.Add('public Pressed' + frmMenuMaker.txtMenu.Text + '(id, key) {');
|
||||||
|
eStr.Add(' switch (key) {');
|
||||||
|
if frmMenuMaker.chkComments.Checked then begin
|
||||||
|
if eNext <> 0 then
|
||||||
|
eStr.Add(' case ' + IntToStr(eNext -1) + ': ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, ++MenuPos' + frmMenuMaker.txtMenu.Text + ') // More Option')
|
||||||
|
else
|
||||||
|
eStr.Add(' case 9: ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, ++MenuPos' + frmMenuMaker.txtMenu.Text + ') // More Option');
|
||||||
|
|
||||||
|
if eExit <> 0 then
|
||||||
|
eStr.Add(' case ' + IntToStr(eExit -1) + ': ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, --MenuPos' + frmMenuMaker.txtMenu.Text + ') // Back Option')
|
||||||
|
else
|
||||||
|
eStr.Add(' case 9: ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, --MenuPos' + frmMenuMaker.txtMenu.Text + ') // Back Option');
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if eNext <> 0 then
|
||||||
|
eStr.Add(' case ' + IntToStr(eNext -1) + ': ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, ++MenuPos' + frmMenuMaker.txtMenu.Text + ')')
|
||||||
|
else
|
||||||
|
eStr.Add(' case 9: ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, ++MenuPos' + frmMenuMaker.txtMenu.Text + ')');
|
||||||
|
if eExit <> 0 then
|
||||||
|
eStr.Add(' case ' + IntToStr(eExit -1) + ': ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, --MenuPos' + frmMenuMaker.txtMenu.Text + ')')
|
||||||
|
else
|
||||||
|
eStr.Add(' case 9: ShowMenu' + frmMenuMaker.txtMenu.Text + '(id, --MenuPos' + frmMenuMaker.txtMenu.Text + ')');
|
||||||
|
end;
|
||||||
|
eStr.Add(' default: {');
|
||||||
|
if frmMenuMaker.chkComments.Checked then
|
||||||
|
eStr.Add(' // Get User ID and Username');
|
||||||
|
eStr.Add(' new PlayerID = MenuPlayers' + frmMenuMaker.txtMenu.Text + '[MenuPos' + frmMenuMaker.txtMenu.Text + ' * ' + IntToStr(ePlayersTo - ePlayersFrom) + ' + key]');
|
||||||
|
eStr.Add(' new UserName[32]');
|
||||||
|
eStr.Add(' get_user_name(PlayerID, UserName, 31)');
|
||||||
|
if frmMenuMaker.chkComments.Checked then
|
||||||
|
eStr.Add(' // Do actions here')
|
||||||
|
else
|
||||||
|
eStr.Add(' ');
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add(' }');
|
||||||
|
eStr.Add(' return PLUGIN_HANDLED');
|
||||||
|
eStr.Add('}');
|
||||||
|
frmMain.sciEditor.Lines.Text := frmMain.sciEditor.Lines.Text + #13 + eStr.Text;
|
||||||
|
except
|
||||||
|
MessageBox(frmMenuMaker.Handle, PChar('An error occured while inserting code!'), 'Warning', MB_ICONWARNING);
|
||||||
|
end;
|
||||||
|
frmMain.SetModified;
|
||||||
|
eStr.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Functions }
|
||||||
|
|
||||||
|
function GetFirst(eStart: String; eSearchMain: Boolean): Integer;
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
eStart := LowerCase(Trim(eStart));
|
||||||
|
Result := -1;
|
||||||
|
if eSearchMain then begin
|
||||||
|
for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin
|
||||||
|
if Pos(eStart, LowerCase(Trim(frmMain.sciEditor.Lines[i]))) = 1 then begin
|
||||||
|
Result := i;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
for i := 0 to frmMenuMaker.rtfEditor.Lines.Count -1 do begin
|
||||||
|
if Pos(eStart, LowerCase(Trim(frmMenuMaker.rtfEditor.Lines[i]))) = 1 then begin
|
||||||
|
Result := i;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetLast(eStart: String; eSearchMain: Boolean): Integer;
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
eStart := LowerCase(Trim(eStart));
|
||||||
|
Result := -1;
|
||||||
|
if eSearchMain then begin
|
||||||
|
for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin
|
||||||
|
if Pos(eStart, LowerCase(Trim(frmMain.sciEditor.Lines[i]))) = 1 then
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
for i := 0 to frmMenuMaker.rtfEditor.Lines.Count -1 do begin
|
||||||
|
if Pos(eStart, LowerCase(Trim(frmMenuMaker.rtfEditor.Lines[i]))) = 1 then
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function AddIfDoesntExist(eInclude: String): Boolean;
|
||||||
|
var i: integer;
|
||||||
|
eLine: String;
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
eInclude := RemoveSpaces(LowerCase(eInclude));
|
||||||
|
for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin
|
||||||
|
eLine := LowerCase(RemoveSpaces(frmMain.sciEditor.Lines[i]));
|
||||||
|
eLine := StringReplace(eLine, '<', '', [rfReplaceAll]);
|
||||||
|
eLine := StringReplace(eLine, '>', '', [rfReplaceAll]);
|
||||||
|
eLine := StringReplace(eLine, '"', '', [rfReplaceAll]);
|
||||||
|
if eLine = '#include' + eInclude then begin
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
i := GetLast('#include', True);
|
||||||
|
if i = -1 then
|
||||||
|
i := 0;
|
||||||
|
|
||||||
|
frmMain.sciEditor.Lines.Insert(i, '#include <' + eInclude + '>');
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
649
editor/editor2/UnitFunc.pas
Executable file
649
editor/editor2/UnitFunc.pas
Executable file
@ -0,0 +1,649 @@
|
|||||||
|
unit UnitFunc;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses SysUtils, Classes, IniFiles, Graphics, ScintillaLanguageManager,
|
||||||
|
Windows, Messages, SciLexerMod, tlhelp32, Controls, Forms, SciDocuments;
|
||||||
|
|
||||||
|
procedure Delay(eTime: Integer);
|
||||||
|
function CountChars(eIn: String; eChar: Char): Integer;
|
||||||
|
function Between(eText, eFirst, eSecond: String): String;
|
||||||
|
procedure SendOpen(eFile: String);
|
||||||
|
procedure Load;
|
||||||
|
procedure Save;
|
||||||
|
procedure Apply;
|
||||||
|
function GetConsoleOutput(const Command: String): Boolean;
|
||||||
|
procedure KillIt(dwProcID: DWORD);
|
||||||
|
function GetProcID(sProcName: String): Integer;
|
||||||
|
procedure DoCompile;
|
||||||
|
function ShowSaveDialog(Caption, SaveCaption, CloseCaption: String): Boolean;
|
||||||
|
procedure AppendFileExt;
|
||||||
|
function RemoveSpaces(eInput: String): String;
|
||||||
|
|
||||||
|
var eErrorLine: Integer;
|
||||||
|
eHints, eWarnings, eErrors: Integer;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmMain, UnitfrmOptions, UnitfrmAbout,
|
||||||
|
UnitfrmDebug, UnitfrmSaveDialog;
|
||||||
|
|
||||||
|
procedure Delay(eTime: Integer);
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
for i := 1 to eTime do begin
|
||||||
|
Sleep(1);
|
||||||
|
Application.ProcessMessages;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CountChars(eIn: String; eChar: Char): Integer;
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
if Length(eIn) <> 0 then begin
|
||||||
|
for i := 1 to Length(eIn) do begin
|
||||||
|
if eIn[i] = eChar then
|
||||||
|
Inc(Result, 1);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function Between(eText, eFirst, eSecond: String): String;
|
||||||
|
var eTemp: String;
|
||||||
|
begin
|
||||||
|
if (Pos(eFirst, eText) = 0) or (Pos(eSecond, eText) = 0) then
|
||||||
|
Result := ''
|
||||||
|
else begin
|
||||||
|
eTemp := eText;
|
||||||
|
Delete(eTemp, 1, Pos(eFirst, eText) + Length(eFirst) - 1);
|
||||||
|
Delete(eTemp, Pos(eSecond, eTemp), Length(eTemp));
|
||||||
|
Result := eTemp;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SendOpen(eFile: String);
|
||||||
|
var HTargetWnd: HWND;
|
||||||
|
ACopyDataStruct: TCopyDataStruct;
|
||||||
|
begin
|
||||||
|
with ACopyDataStruct do
|
||||||
|
begin
|
||||||
|
dwData := 0;
|
||||||
|
cbData := Length(eFile) + 1;
|
||||||
|
lpData := PChar(eFile);
|
||||||
|
end;
|
||||||
|
|
||||||
|
HTargetWnd := FindWindow('TfrmMain', 'AMXX-Edit v2');
|
||||||
|
|
||||||
|
if HTargetWnd <> 0 then
|
||||||
|
SendMessage(HTargetWnd, WM_COPYDATA, 0, LongInt(@ACopyDataStruct));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Load;
|
||||||
|
var eFile: TIniFile;
|
||||||
|
begin
|
||||||
|
if not FileExists(ExtractFilePath(ParamStr(0)) + 'Config.ini') then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
eFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini');
|
||||||
|
with frmSettings do begin
|
||||||
|
{ Editor }
|
||||||
|
cboFoldingStyle.ItemIndex := eFile.ReadInteger('Editor', 'FoldingStyle', 0);
|
||||||
|
chkAutoComplete.Checked := eFile.ReadBool('Editor', 'Auto-Complete', True);
|
||||||
|
chkHints.Checked := eFile.ReadBool('Editor', 'Hints', True);
|
||||||
|
chkHighlighting.Checked := eFile.ReadBool('Editor', 'Highlighting', True);
|
||||||
|
chkAutoIndent.Checked := eFile.ReadBool('Editor', 'AutoIndent', True);
|
||||||
|
chkBrackets.Checked := eFile.ReadBool('Editor', 'HighlightBrackets', True);
|
||||||
|
{ Directories }
|
||||||
|
txtAMXXPath.Text := eFile.ReadString('Directories', 'AMXX', '');
|
||||||
|
txtHalfLife.Text := eFile.ReadString('Directories', 'Half-Life', '');
|
||||||
|
txtSave.Text := eFile.ReadString('Directories', 'SaveTarget', '');
|
||||||
|
{ Colors }
|
||||||
|
cboComments.Selected := eFile.ReadInteger('Colors', 'Comments', clGreen);
|
||||||
|
cboDirectives.Selected := eFile.ReadInteger('Colors', 'Directives', clTeal);
|
||||||
|
cboOperators.Selected := eFile.ReadInteger('Colors', 'Operators', clNavy);
|
||||||
|
cboStrings.Selected := eFile.ReadInteger('Colors', 'Strings', clBlue);
|
||||||
|
cboKeywords.Selected := eFile.ReadInteger('Colors', 'Keywords', clRed);
|
||||||
|
cboActiveLine.Selected := eFile.ReadInteger('Colors', 'ActiveLine', $00FFE6E6);
|
||||||
|
{ FTP }
|
||||||
|
txtHost.Text := eFile.ReadString('FTP', 'Host', '');
|
||||||
|
txtPort.Text := IntToStr(eFile.ReadInteger('FTP', 'Port', 21));
|
||||||
|
txtUser.Text := eFile.ReadString('FTP', 'Username', '');
|
||||||
|
txtPassword.Text := eFile.ReadString('FTP', 'Password', '');
|
||||||
|
txtStandardDir.Text := eFile.ReadString('FTP', 'DefaultDir', '\');
|
||||||
|
{ View }
|
||||||
|
cboCodeExplorer.ItemIndex := eFile.ReadInteger('View', 'ShowCodeExplorer', 0);
|
||||||
|
chkStatusbar.Checked := eFile.ReadBool('View', 'Statusbar', True);
|
||||||
|
{ Char completer }
|
||||||
|
frmSettings.chkAutoCloseBrackets.Checked := eFile.ReadBool('CharCompleter', 'AutoCloseBrackets', False);
|
||||||
|
frmSettings.chkAutoCloseQuotes.Checked := eFile.ReadBool('CharCompleter', 'AutoCloseQuotes', False);
|
||||||
|
{ Compiler Output }
|
||||||
|
if eFile.ReadBool('View', 'CompileOutputInWindow', True) then
|
||||||
|
frmSettings.optWindow.Checked := True
|
||||||
|
else
|
||||||
|
frmSettings.optList.Checked := True;
|
||||||
|
{ Misc }
|
||||||
|
chkReload.Checked := eFile.ReadBool('Misc', 'AutoReload', True);
|
||||||
|
chkAutoAddPlugins.Checked := eFile.ReadBool('Misc', 'AutoAdd', True);
|
||||||
|
end;
|
||||||
|
eFile.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Save;
|
||||||
|
var eFile: TIniFile;
|
||||||
|
begin
|
||||||
|
eFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini');
|
||||||
|
with frmSettings do begin
|
||||||
|
{ Editor }
|
||||||
|
eFile.WriteInteger('Editor', 'FoldingStyle', cboFoldingStyle.ItemIndex);
|
||||||
|
eFile.WriteBool('Editor', 'Auto-Complete', chkAutoComplete.Checked);
|
||||||
|
eFile.WriteBool('Editor', 'Hints', chkHints.Checked);
|
||||||
|
eFile.WriteBool('Editor', 'Highlighting', chkHighlighting.Checked);
|
||||||
|
eFile.WriteBool('Editor', 'AutoIndent', chkAutoIndent.Checked);
|
||||||
|
eFile.WriteBool('Editor', 'HighlightBrackets', chkBrackets.Checked);
|
||||||
|
{ Directories }
|
||||||
|
eFile.WriteString('Directories', 'AMXX', txtAMXXPath.Text);
|
||||||
|
eFile.WriteString('Directories', 'Half-Life', txtHalfLife.Text);
|
||||||
|
eFile.WriteString('Directories', 'SaveTarget', txtSave.Text);
|
||||||
|
{ Colors }
|
||||||
|
eFile.WriteInteger('Colors', 'Comments', cboComments.Selected);
|
||||||
|
eFile.WriteInteger('Colors', 'Directives', cboDirectives.Selected);
|
||||||
|
eFile.WriteInteger('Colors', 'Operators', cboOperators.Selected);
|
||||||
|
eFile.WriteInteger('Colors', 'Strings', cboStrings.Selected);
|
||||||
|
eFile.WriteInteger('Colors', 'Keywords', cboKeywords.Selected);
|
||||||
|
eFile.WriteInteger('Colors', 'ActiveLine', cboActiveLine.Selected);
|
||||||
|
{ FTP }
|
||||||
|
eFile.WriteString('FTP', 'Host', txtHost.Text);
|
||||||
|
eFile.WriteString('FTP', 'Port', txtPort.Text);
|
||||||
|
eFile.WriteString('FTP', 'Username', txtUser.Text);
|
||||||
|
eFile.WriteString('FTP', 'Password', txtPassword.Text);
|
||||||
|
eFile.WriteString('FTP', 'DefaultDir', txtStandardDir.Text);
|
||||||
|
{ View }
|
||||||
|
eFile.WriteInteger('View', 'ShowCodeExplorer', cboCodeExplorer.ItemIndex);
|
||||||
|
eFile.WriteBool('View', 'Statusbar', chkStatusbar.Checked);
|
||||||
|
{ Char completer }
|
||||||
|
eFile.WriteBool('CharCompleter', 'AutoCloseBrackets', frmSettings.chkAutoCloseBrackets.Checked);
|
||||||
|
eFile.WriteBool('CharCompleter', 'AutoCloseQuotes', frmSettings.chkAutoCloseQuotes.Checked);
|
||||||
|
{ Compiler Output }
|
||||||
|
eFile.WriteBool('View', 'CompileOutputInWindow', frmSettings.optWindow.Checked);
|
||||||
|
{ Misc }
|
||||||
|
eFile.WriteBool('Misc', 'AutoReload', chkReload.Checked);
|
||||||
|
eFile.WriteBool('Misc', 'AutoAdd', chkAutoAddPlugins.Checked);
|
||||||
|
end;
|
||||||
|
eFile.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Apply;
|
||||||
|
function PathComplete(eInput: String): String;
|
||||||
|
var eBackup: String;
|
||||||
|
begin
|
||||||
|
if Trim(eInput) = '' then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
eBackup := eInput;
|
||||||
|
while Length(eInput) > 1 do
|
||||||
|
Delete(eInput, 1, 1);
|
||||||
|
if eInput <> '\' then
|
||||||
|
Result := eBackup + '\'
|
||||||
|
else
|
||||||
|
Result := eBackup;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
with frmMain do begin
|
||||||
|
{ Folding }
|
||||||
|
case frmSettings.cboFoldingStyle.ItemIndex of
|
||||||
|
0: sciEditor.FoldMarkerType := sciMarkArrows;
|
||||||
|
1: sciEditor.FoldMarkerType := sciMarkBox;
|
||||||
|
2: sciEditor.FoldMarkerType := sciMarkCircle;
|
||||||
|
3: sciEditor.FoldMarkerType := sciMarkPlusMinus;
|
||||||
|
end;
|
||||||
|
if frmSettings.cboFoldingStyle.ItemIndex = 4 then
|
||||||
|
sciEditor.Folding := sciEditor.Folding - [foldFold]
|
||||||
|
else
|
||||||
|
sciEditor.Folding := sciEditor.Folding + [foldFold];
|
||||||
|
{ Auto Complete }
|
||||||
|
sacComplete.Disabled := not frmSettings.chkAutoComplete.Checked;
|
||||||
|
{ Hints }
|
||||||
|
cltEditor.Disabled := not frmSettings.chkHints.Checked;
|
||||||
|
{ Colors }
|
||||||
|
with sciEditor.LanguageManager.LanguageList.Find('SMALL').Styles do begin
|
||||||
|
TSciStyle(Items[0]).ForeColor := frmSettings.cboComments.Selected;
|
||||||
|
TSciStyle(Items[1]).ForeColor := frmSettings.cboDirectives.Selected;
|
||||||
|
TSciStyle(Items[2]).ForeColor := frmSettings.cboOperators.Selected;
|
||||||
|
TSciStyle(Items[3]).ForeColor := frmSettings.cboStrings.Selected;
|
||||||
|
TSciStyle(Items[4]).ForeColor := frmSettings.cboKeywords.Selected;
|
||||||
|
TSciStyle(Items[5]).ForeColor := frmSettings.cboComments.Selected;
|
||||||
|
TSciStyle(Items[6]).ForeColor := TSciStyle(Items[2]).ForeColor;
|
||||||
|
end;
|
||||||
|
frmMain.sciEditor.Caret.LineBackColor := frmSettings.cboActiveLine.Selected;
|
||||||
|
|
||||||
|
if frmSettings.chkHighlighting.Checked then
|
||||||
|
frmMain.sciEditor.LanguageManager.SelectedLanguage := 'SMALL'
|
||||||
|
else
|
||||||
|
frmMain.sciEditor.LanguageManager.SelectedLanguage := 'null';
|
||||||
|
{ Check directories }
|
||||||
|
frmSettings.txtAMXXPath.Text := PathComplete(frmSettings.txtAMXXPath.Text);
|
||||||
|
frmSettings.txtSave.Text := PathComplete(frmSettings.txtSave.Text);
|
||||||
|
{ View }
|
||||||
|
case frmSettings.cboCodeExplorer.ItemIndex of
|
||||||
|
0: begin
|
||||||
|
frmMain.splFunctions.Visible := True;
|
||||||
|
frmMain.pnlFunctions.Visible := True;
|
||||||
|
frmMain.pnlFunctions.Width := 150;
|
||||||
|
frmMain.pnlSpacerLeft.Cursor := crDefault;
|
||||||
|
end;
|
||||||
|
1: begin
|
||||||
|
frmMain.splFunctions.Visible := False;
|
||||||
|
frmMain.pnlFunctions.Visible := True;
|
||||||
|
frmMain.pnlFunctions.Width := 5;
|
||||||
|
frmMain.pnlSpacerLeft.Cursor := crHSplit;
|
||||||
|
end;
|
||||||
|
2: begin
|
||||||
|
frmMain.pnlFunctions.Visible := False;
|
||||||
|
frmMain.splFunctions.Visible := False;
|
||||||
|
frmMain.pnlSpacerLeft.Cursor := crDefault;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
frmMain.sbInfo.Visible := frmSettings.chkStatusbar.Checked;
|
||||||
|
frmMain.sciEditor.BraceHilite := frmSettings.chkBrackets.Checked;
|
||||||
|
{ Char completer }
|
||||||
|
frmMain.sciEditor.AutoCloseBraces := frmSettings.chkAutoCloseBrackets.Checked;
|
||||||
|
frmMain.sciEditor.AutoCloseQuotes := frmSettings.chkAutoCloseQuotes.Checked;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DoAdd(eStream: TMemoryStream);
|
||||||
|
var eStr: TStringList;
|
||||||
|
i: integer;
|
||||||
|
eErrLine: Integer;
|
||||||
|
eType, eBackup, eTemp: String;
|
||||||
|
begin
|
||||||
|
eStr := TStringList.Create;
|
||||||
|
eStr.LoadFromStream(eStream);
|
||||||
|
|
||||||
|
eHints := 0;
|
||||||
|
eWarnings := 0;
|
||||||
|
eErrors := 0;
|
||||||
|
eType := '';
|
||||||
|
eErrorLine := -1;
|
||||||
|
|
||||||
|
for i := 2 to eStr.Count -1 do begin
|
||||||
|
try
|
||||||
|
if eStr[i] <> '' then begin
|
||||||
|
if (Pos(': fatal error', eStr[i]) <> 0) or (Pos(': error', eStr[i]) <> 0) or (Pos(': warning', eStr[i]) <> 0) or (Pos(': hint', eStr[i]) <> 0) then begin
|
||||||
|
eBackup := eStr[i];
|
||||||
|
if (Pos(': fatal error', eStr[i]) <> 0) or (Pos(': error', eStr[i]) <> 0) then begin
|
||||||
|
Inc(eErrors, 1);
|
||||||
|
eType := 'Error';
|
||||||
|
end
|
||||||
|
else if Pos(': warning', eStr[i]) <> 0 then begin
|
||||||
|
Inc(eWarnings, 1);
|
||||||
|
eType := 'Warning';
|
||||||
|
end
|
||||||
|
else if Pos(': hint', eStr[i]) <> 0 then begin
|
||||||
|
Inc(eHints, 1);
|
||||||
|
eType := 'Hint';
|
||||||
|
end;
|
||||||
|
|
||||||
|
eErrLine := -1;
|
||||||
|
while (Pos('(', eStr[i]) <> 1) and (Length(eStr[i]) > 0) do
|
||||||
|
eStr[i] := Copy(eStr[i], 2, Length(eStr[i]));
|
||||||
|
try
|
||||||
|
eTemp := Copy(eStr[i], 2, Pos(')', eStr[i]) -2);
|
||||||
|
if Pos(#32, eTemp) <> 0 then
|
||||||
|
eTemp := Copy(eTemp, 1, Pos(#32, eTemp) -1);
|
||||||
|
eErrLine := StrToInt(eTemp);
|
||||||
|
if (eErrorLine = -1) and (eType = 'Error') then
|
||||||
|
eErrorLine := eErrLine;
|
||||||
|
except
|
||||||
|
if (eErrorLine = -1) and (eType = 'Error') then
|
||||||
|
eErrorLine := frmMain.sciEditor.Lines.Count -1;
|
||||||
|
end;
|
||||||
|
eStr[i] := Copy(eStr[i], 3, Length(eStr[i]));
|
||||||
|
while (Pos(':', eStr[i]) > 3) and (Length(eStr[i]) > 0) do
|
||||||
|
eStr[i] := Copy(eStr[i], 2, Length(eStr[i]));
|
||||||
|
eStr[i] := Copy(eStr[i], 4, Length(eStr[i]));
|
||||||
|
eStr[i] := Copy(eStr[i], Pos(':', eStr[i]) +2, Length(eStr[i]));
|
||||||
|
if Pos(': fatal error', eBackup) <> 0 then
|
||||||
|
eStr[i] := 'Fatal error: ' + eStr[i]
|
||||||
|
else if eStr[i] = '' then
|
||||||
|
eStr[i] := eBackup
|
||||||
|
else
|
||||||
|
eStr[i] := eType + ': ' + eStr[i] + ' on line ' + IntToStr(eErrLine);
|
||||||
|
if frmSettings.optWindow.Checked then begin
|
||||||
|
frmDebug.lblErrors.Caption := ' Errors: ' + IntToStr(eErrors);
|
||||||
|
frmDebug.lblWarnings.Caption := ' Warnings: ' + IntToStr(eWarnings);
|
||||||
|
frmDebug.lblHints.Caption := ' Hints: ' + IntToStr(eHints);
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else if (eStr[i] = 'Done.') or (Pos(' Error', eStr[i]) <> 0) or (Pos(' Warning', eStr[i]) <> 0) or (Pos(' Hint', eStr[i]) <> 0) then begin
|
||||||
|
if frmSettings.optWindow.Checked then begin
|
||||||
|
if eErrors <> 0 then
|
||||||
|
frmDebug.lblStatus.Caption := ' Done. There are errors.'
|
||||||
|
else if eWarnings <> 0 then
|
||||||
|
frmDebug.lblStatus.Caption := ' Done. There are warnings.'
|
||||||
|
else if eHints <> 0 then
|
||||||
|
frmDebug.lblStatus.Caption := ' Done. There are hints.'
|
||||||
|
else
|
||||||
|
frmDebug.lblStatus.Caption := ' Done.';
|
||||||
|
frmDebug.lblStatus.Font.Style := [fsBold];
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if eErrors <> 0 then
|
||||||
|
frmMain.lvDebug.Items.Add.Caption := 'Done. There are errors.'
|
||||||
|
else if eWarnings <> 0 then
|
||||||
|
frmMain.lvDebug.Items.Add.Caption := 'Done. There are warnings.'
|
||||||
|
else if eHints <> 0 then
|
||||||
|
frmMain.lvDebug.Items.Add.Caption := 'Done. There are hints.'
|
||||||
|
else
|
||||||
|
frmMain.lvDebug.Items.Add.Caption := 'Done.';
|
||||||
|
|
||||||
|
if eErrorLine <> -1 then
|
||||||
|
frmMain.ShowErrorLine;
|
||||||
|
eStr.Free;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if frmSettings.optWindow.Checked then begin
|
||||||
|
frmDebug.lstOutput.Items.Add(eStr[i]);
|
||||||
|
frmDebug.lstOutput.ItemIndex := frmDebug.lstOutput.Items.Count -1;
|
||||||
|
frmDebug.Repaint;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
frmMain.lvDebug.Items.Add.Caption := eStr[i];
|
||||||
|
frmMain.lvDebug.ItemIndex := frmDebug.lstOutput.Items.Count -1;
|
||||||
|
frmMain.Repaint;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
// nothing
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
eStr.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetConsoleOutput(const Command: String): Boolean;
|
||||||
|
var
|
||||||
|
StartupInfo: TStartupInfo;
|
||||||
|
ProcessInfo: TProcessInformation;
|
||||||
|
SecurityAttr: TSecurityAttributes;
|
||||||
|
PipeOutputRead: THandle;
|
||||||
|
PipeOutputWrite: THandle;
|
||||||
|
PipeErrorsRead: THandle;
|
||||||
|
PipeErrorsWrite: THandle;
|
||||||
|
Succeed: Boolean;
|
||||||
|
Buffer: array [0..255] of Char;
|
||||||
|
NumberOfBytesRead: DWORD;
|
||||||
|
Stream: TMemoryStream;
|
||||||
|
begin
|
||||||
|
frmDebug.Compiling := True;
|
||||||
|
FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
|
||||||
|
|
||||||
|
FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
|
||||||
|
SecurityAttr.nLength := SizeOf(SecurityAttr);
|
||||||
|
SecurityAttr.bInheritHandle := True;
|
||||||
|
SecurityAttr.lpSecurityDescriptor := nil;
|
||||||
|
|
||||||
|
CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
|
||||||
|
CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);
|
||||||
|
|
||||||
|
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
|
||||||
|
StartupInfo.cb:=SizeOf(StartupInfo);
|
||||||
|
StartupInfo.hStdInput := 0;
|
||||||
|
StartupInfo.hStdOutput := PipeOutputWrite;
|
||||||
|
StartupInfo.hStdError := PipeErrorsWrite;
|
||||||
|
StartupInfo.wShowWindow := SW_HIDE;
|
||||||
|
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
|
||||||
|
|
||||||
|
if CreateProcess(nil, PChar(command), nil, nil, true,
|
||||||
|
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
|
||||||
|
StartupInfo, ProcessInfo) then begin
|
||||||
|
Result := True;
|
||||||
|
CloseHandle(PipeOutputWrite);
|
||||||
|
CloseHandle(PipeErrorsWrite);
|
||||||
|
|
||||||
|
Stream := TMemoryStream.Create;
|
||||||
|
try
|
||||||
|
while True do begin
|
||||||
|
Succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
|
||||||
|
if not Succeed then Break;
|
||||||
|
Stream.Write(Buffer, NumberOfBytesRead);
|
||||||
|
end;
|
||||||
|
Stream.Position := 0;
|
||||||
|
DoAdd(Stream);
|
||||||
|
finally
|
||||||
|
Stream.Free;
|
||||||
|
end;
|
||||||
|
CloseHandle(PipeOutputRead);
|
||||||
|
|
||||||
|
try
|
||||||
|
while True do
|
||||||
|
begin
|
||||||
|
Succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
|
||||||
|
if not Succeed then Break;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
end;
|
||||||
|
CloseHandle(PipeErrorsRead);
|
||||||
|
|
||||||
|
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
|
||||||
|
CloseHandle(ProcessInfo.hProcess);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
CloseHandle(PipeOutputRead);
|
||||||
|
CloseHandle(PipeOutputWrite);
|
||||||
|
CloseHandle(PipeErrorsRead);
|
||||||
|
CloseHandle(PipeErrorsWrite);
|
||||||
|
end;
|
||||||
|
frmDebug.Compiling := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure KillIt(dwProcID: DWORD);
|
||||||
|
var
|
||||||
|
hProcess : Cardinal;
|
||||||
|
begin
|
||||||
|
hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID);
|
||||||
|
TerminateProcess(hProcess, 0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetProcID(sProcName: String): Integer;
|
||||||
|
var
|
||||||
|
hProcSnap: THandle;
|
||||||
|
pe32: TProcessEntry32;
|
||||||
|
begin
|
||||||
|
result := -1;
|
||||||
|
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
|
||||||
|
if hProcSnap = INVALID_HANDLE_VALUE then exit;
|
||||||
|
|
||||||
|
pe32.dwSize := SizeOf(ProcessEntry32);
|
||||||
|
|
||||||
|
if Process32First(hProcSnap, pe32) = true then
|
||||||
|
while Process32Next(hProcSnap, pe32) = true do
|
||||||
|
begin
|
||||||
|
if pos(sProcName, pe32.szExeFile) <> 0 then
|
||||||
|
result := pe32.th32ProcessID;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DoCompile;
|
||||||
|
var eStr: TStringList;
|
||||||
|
i: integer;
|
||||||
|
eFound: Boolean;
|
||||||
|
begin
|
||||||
|
if (FileExists(frmSettings.txtAMXXPath.Text + 'scripting\amxxsc.exe')) and (FileExists(frmSettings.txtAMXXPath.Text + 'configs\plugins.ini')) then begin
|
||||||
|
if frmMain.dtcEditor.ActiveDocument.IsUntitled then begin
|
||||||
|
if DirectoryExists(frmSettings.txtSave.Text) then
|
||||||
|
frmMain.sdSave.InitialDir := frmSettings.txtSave.Text;
|
||||||
|
|
||||||
|
if frmMain.sdSave.Execute then begin
|
||||||
|
try
|
||||||
|
AppendFileExt;
|
||||||
|
frmMain.dtcEditor.ActiveDocument.Modified := False;
|
||||||
|
frmMain.dtcEditor.ActiveDocument.FileName := frmMain.sdSave.FileName;
|
||||||
|
frmMain.sciEditor.SaveToFile(frmMain.dtcEditor.ActiveDocument.FileName);
|
||||||
|
except
|
||||||
|
// :F
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
exit;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
frmMain.acSave.Execute;
|
||||||
|
Screen.Cursor := crHourGlass;
|
||||||
|
if frmSettings.chkAutoAddPlugins.Checked then begin
|
||||||
|
eStr := TStringList.Create;
|
||||||
|
eStr.LoadFromFile(frmSettings.txtAMXXPath.Text + 'configs\plugins.ini');
|
||||||
|
eFound := False;
|
||||||
|
for i := 0 to eStr.Count -1 do begin
|
||||||
|
if Pos(ChangeFileExt(ExtractFileName(frmMain.dtcEditor.ActiveDocument.FileName), '.amxx'), TrimLeft(eStr[i])) = 1 then
|
||||||
|
eFound := True;
|
||||||
|
end;
|
||||||
|
if not eFound then begin
|
||||||
|
eStr.Add(ChangeFileExt(ExtractFileName(frmMain.dtcEditor.ActiveDocument.FileName), '.amxx'));
|
||||||
|
eStr.SaveToFile(frmSettings.txtAMXXPath.Text + 'configs\plugins.ini');
|
||||||
|
end;
|
||||||
|
eStr.Free;
|
||||||
|
end;
|
||||||
|
try
|
||||||
|
frmMain.atbToolBar.RecreateControls;
|
||||||
|
except
|
||||||
|
// :F
|
||||||
|
end;
|
||||||
|
|
||||||
|
if frmSettings.optWindow.Checked then begin
|
||||||
|
frmDebug.lblFile.Caption := ' File: ' + ExtractFileName(frmMain.dtcEditor.ActiveDocument.FileName);
|
||||||
|
frmDebug.lblStatus.Font.Style := [];
|
||||||
|
frmDebug.lblStatus.Caption := ' Status: Compiling...';
|
||||||
|
frmDebug.lblHints.Caption := ' Hints: 0';
|
||||||
|
frmDebug.lblWarnings.Caption := ' Warnings: 0';
|
||||||
|
frmDebug.lblErrors.Caption := ' Errors: 0';
|
||||||
|
frmDebug.lstOutput.Items.Text := 'Compiler Output:';
|
||||||
|
frmDebug.Show;
|
||||||
|
frmDebug.Repaint;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
frmMain.lvDebug.Clear;
|
||||||
|
frmMain.lvDebug.Items.Add.Caption := 'Compiling ' + ExtractFileName(frmMain.dtcEditor.ActiveDocument.FileName) + '...';
|
||||||
|
frmMain.lvDebug.Visible := True;
|
||||||
|
frmMain.Repaint;
|
||||||
|
end;
|
||||||
|
GetConsoleOutput(frmSettings.txtAMXXPath.Text + 'scripting\amxxsc.exe ' +
|
||||||
|
'"' + frmMain.dtcEditor.ActiveDocument.FileName + '" ' +
|
||||||
|
'"-o' + frmSettings.txtAMXXPath.Text + 'plugins\' + ChangeFileExt(ExtractFileName(frmMain.dtcEditor.ActiveDocument.FileName), '.amxx') + '"');
|
||||||
|
Screen.Cursor := crDefault;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
MessageBox(frmMain.Handle, 'Couldn''t find amxxsc.exe or plugins.ini. Check your settings and try again.', 'Error', MB_ICONERROR);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ShowSaveDialog(Caption, SaveCaption, CloseCaption: String): Boolean;
|
||||||
|
function TabByName(eName: String): TSciDoc;
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
for i := 0 to frmMain.dtcEditor.Count -1 do begin
|
||||||
|
if frmMain.dtcEditor.Tabs[i] = eName then
|
||||||
|
Result := frmMain.dtcEditor.Document[i];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var i: integer;
|
||||||
|
eStr: TStringList;
|
||||||
|
begin
|
||||||
|
eStr := TStringList.Create;
|
||||||
|
frmSaveDialog.Caption := Caption;
|
||||||
|
frmSaveDialog.SaveCaption := SaveCaption;
|
||||||
|
frmSaveDialog.CloseCaption := CloseCaption;
|
||||||
|
frmSaveDialog.cmdSave.Caption := CloseCaption;
|
||||||
|
frmSaveDialog.lstFiles.Clear;
|
||||||
|
for i := 0 to frmMain.dtcEditor.Tabs.Count -1 do begin
|
||||||
|
if (frmMain.dtcEditor.Document[i].Modified) then
|
||||||
|
frmSaveDialog.lstFiles.Items.Add(frmMain.dtcEditor.Tabs[i])
|
||||||
|
else if (frmMain.dtcEditor.Document[i].IsUntitled) then
|
||||||
|
frmSaveDialog.lstFiles.Items.Add(frmMain.dtcEditor.Tabs[i]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (frmMain.dtcEditor.Tabs.Count = 1) and (frmMain.sciEditor.Lines.Text = '') then
|
||||||
|
frmSaveDialog.lstFiles.Clear;
|
||||||
|
|
||||||
|
if frmSaveDialog.lstFiles.Items.Count = 0 then begin
|
||||||
|
Result := True;
|
||||||
|
if frmSettings.chkReload.Checked then begin
|
||||||
|
for i := 0 to frmMain.dtcEditor.Tabs.Count -1 do begin
|
||||||
|
if not frmMain.dtcEditor.Document[i].IsUntitled then
|
||||||
|
eStr.Add(frmMain.dtcEditor.Document[i].FileName);
|
||||||
|
end;
|
||||||
|
eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Files.ini');
|
||||||
|
end;
|
||||||
|
eStr.Free;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if frmSaveDialog.ShowModal = mrOk then begin
|
||||||
|
for i := 0 to frmSaveDialog.lstFiles.Items.Count -1 do begin
|
||||||
|
if frmSaveDialog.lstFiles.Checked[i] then begin
|
||||||
|
if (TabByName(frmSaveDialog.lstFiles.Items[i]).IsUntitled) then begin
|
||||||
|
frmMain.sdSave.Title := Format('Save %s (Tab %s)', [TabByName(frmSaveDialog.lstFiles.Items[i]).FileName, IntToStr(TabByName(frmSaveDialog.lstFiles.Items[i]).Index +1)]);
|
||||||
|
if frmMain.sdSave.Execute then begin
|
||||||
|
AppendFileExt;
|
||||||
|
frmMain.dtcEditor.Activate(TabByName(frmSaveDialog.lstFiles.Items[i]).Index);
|
||||||
|
frmMain.sciEditor.SaveToFile(frmMain.sdSave.FileName);
|
||||||
|
frmMain.dtcEditor.ActiveDocument.FileName := frmMain.sdSave.FileName;
|
||||||
|
frmMain.SetSaved;
|
||||||
|
frmMain.sbInfo.Panels[1].Text := '';
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
frmMain.sdSave.Title := 'Save...';
|
||||||
|
eStr.Free;
|
||||||
|
Result := False;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
frmMain.sdSave.Title := 'Save...';
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
frmMain.dtcEditor.Activate(TabByName(frmSaveDialog.lstFiles.Items[i]).Index);
|
||||||
|
frmMain.sciEditor.SaveToFile(TabByName(frmSaveDialog.lstFiles.Items[i]).FileName);
|
||||||
|
frmMain.dtcEditor.ActiveDocument.Modified := False;
|
||||||
|
frmMain.SetSaved;
|
||||||
|
frmMain.sbInfo.Panels[1].Text := '';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
for i := 0 to frmMain.dtcEditor.Tabs.Count -1 do begin
|
||||||
|
if (not frmMain.dtcEditor.Document[i].IsUntitled) and (not frmMain.dtcEditor.Document[i].Modified) then
|
||||||
|
eStr.Add(frmMain.dtcEditor.Document[i].FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if frmSettings.chkReload.Checked then
|
||||||
|
eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Files.ini');
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
eStr.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure AppendFileExt;
|
||||||
|
var eExt: String;
|
||||||
|
begin
|
||||||
|
eExt := LowerCase(ExtractFileExt(frmMain.sdSave.FileName));
|
||||||
|
if (frmMain.sdSave.FilterIndex = 1) and (eExt <> '.sma') then
|
||||||
|
frmMain.sdSave.FileName := frmMain.sdSave.FileName + '.sma'
|
||||||
|
else if (frmMain.sdSave.FilterIndex = 2) and (eExt <> '.inc') then
|
||||||
|
frmMain.sdSave.FileName := frmMain.sdSave.FileName + '.inc';
|
||||||
|
end;
|
||||||
|
|
||||||
|
function RemoveSpaces(eInput: String): String;
|
||||||
|
begin
|
||||||
|
eInput := StringReplace(eInput, ' ', '', [rfReplaceAll]);
|
||||||
|
eInput := StringReplace(eInput, ' ', '', [rfReplaceAll]);
|
||||||
|
Result := eInput;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
24
editor/editor2/UnitHowToMakePlayerMenu.pas
Executable file
24
editor/editor2/UnitHowToMakePlayerMenu.pas
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
unit UnitHowToMakePlayerMenu;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, CorelButton;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmHowToMakePlayerMenu = class(TForm)
|
||||||
|
lblHowTo: TLabel;
|
||||||
|
txtTutorial: TMemo;
|
||||||
|
cmdOK: TCorelButton;
|
||||||
|
cmdExample: TCorelButton;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmHowToMakePlayerMenu: TfrmHowToMakePlayerMenu;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
end.
|
60
editor/editor2/UnitReadThread.pas
Executable file
60
editor/editor2/UnitReadThread.pas
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
unit UnitReadThread;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Graphics;
|
||||||
|
|
||||||
|
type
|
||||||
|
TReadThread = class(TThread)
|
||||||
|
public
|
||||||
|
ReadTCP: Boolean;
|
||||||
|
protected
|
||||||
|
Read: String;
|
||||||
|
procedure Execute; override;
|
||||||
|
procedure AddRead;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmSockets;
|
||||||
|
|
||||||
|
{ TReadThread }
|
||||||
|
|
||||||
|
procedure TReadThread.AddRead;
|
||||||
|
begin
|
||||||
|
frmSocketTerminal.OnRead(Read);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TReadThread.Execute;
|
||||||
|
begin
|
||||||
|
if ReadTCP then begin
|
||||||
|
frmSocketTerminal.IdTCPClient.ReadTimeout := 50;
|
||||||
|
repeat
|
||||||
|
try
|
||||||
|
Read := frmSocketTerminal.IdTCPClient.ReadLn;
|
||||||
|
Synchronize(AddRead);
|
||||||
|
except
|
||||||
|
// nothing
|
||||||
|
end;
|
||||||
|
until (Terminated) or (not frmSocketTerminal.IdTCPClient.Connected);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
frmSocketTerminal.IdUDPClient.ReceiveTimeout := 50;
|
||||||
|
repeat
|
||||||
|
try
|
||||||
|
Read := frmSocketTerminal.IdUDPClient.ReceiveString;
|
||||||
|
if Read <> '' then
|
||||||
|
Synchronize(AddRead);
|
||||||
|
except
|
||||||
|
// nothing
|
||||||
|
end;
|
||||||
|
until (Terminated) or (not frmSocketTerminal.IdUDPClient.Active);
|
||||||
|
end;
|
||||||
|
Free;
|
||||||
|
Read := 'fu@u';
|
||||||
|
Synchronize(AddRead);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
32
editor/editor2/UnitfrmAbout.pas
Executable file
32
editor/editor2/UnitfrmAbout.pas
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
unit UnitfrmAbout;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, ShellAPI, TFlatSpeedButtonUnit;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmAbout = class(TForm)
|
||||||
|
pnlInfo: TPanel;
|
||||||
|
imgAMXX: TImage;
|
||||||
|
lblCopyright: TLabel;
|
||||||
|
lblComments: TLabel;
|
||||||
|
lblCoder: TLabel;
|
||||||
|
FlatSpeedButton1: TFlatSpeedButton;
|
||||||
|
procedure imgAMXXClick(Sender: TObject);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmAbout: TfrmAbout;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmAbout.imgAMXXClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
ShellExecute(Handle, 'open', 'http://www.amxmodx.org/', nil, nil, SW_SHOW);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
91
editor/editor2/UnitfrmDebug.pas
Executable file
91
editor/editor2/UnitfrmDebug.pas
Executable file
@ -0,0 +1,91 @@
|
|||||||
|
unit UnitfrmDebug;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmDebug = class(TForm)
|
||||||
|
cmdMore: TButton;
|
||||||
|
pnlCompile: TPanel;
|
||||||
|
lblFile: TStaticText;
|
||||||
|
lblStatus: TStaticText;
|
||||||
|
lblHints: TStaticText;
|
||||||
|
lblWarnings: TStaticText;
|
||||||
|
lblErrors: TStaticText;
|
||||||
|
cmdCancelOkay: TButton;
|
||||||
|
bvlDelimeter: TBevel;
|
||||||
|
lstOutput: TListBox;
|
||||||
|
procedure cmdMoreClick(Sender: TObject);
|
||||||
|
procedure cmdCancelOkayClick(Sender: TObject);
|
||||||
|
procedure lstOutputDblClick(Sender: TObject);
|
||||||
|
private
|
||||||
|
FCompiling: Boolean;
|
||||||
|
procedure SetCompiling(const Value: Boolean);
|
||||||
|
public
|
||||||
|
property Compiling: Boolean read FCompiling write SetCompiling;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmDebug: TfrmDebug;
|
||||||
|
|
||||||
|
const DEFAULT_HEIGHT = 165;
|
||||||
|
MAX_HEIGHT = 277;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmMain, UnitFunc, UnitfrmOptions;
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmDebug.cmdMoreClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if Height = DEFAULT_HEIGHT then begin
|
||||||
|
Height := MAX_HEIGHT;
|
||||||
|
cmdMore.Caption := '<< Compiler Output';
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
Height := DEFAULT_HEIGHT;
|
||||||
|
cmdMore.Caption := 'Compiler Output >>';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmDebug.SetCompiling(const Value: Boolean);
|
||||||
|
begin
|
||||||
|
FCompiling := Value;
|
||||||
|
if Value then
|
||||||
|
cmdCancelOkay.Caption := 'Cancel'
|
||||||
|
else
|
||||||
|
cmdCancelOkay.Caption := 'Close';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmDebug.cmdCancelOkayClick(Sender: TObject);
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
if Compiling then begin
|
||||||
|
i := GetProcId('amxxsc.exe');
|
||||||
|
if i <> -1 then
|
||||||
|
KillIt(i);
|
||||||
|
Compiling := False;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
Hide;
|
||||||
|
frmMain.Show;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmDebug.lstOutputDblClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if lstOutput.ItemIndex <> -1 then begin
|
||||||
|
if Pos('Warning', lstOutput.Items[lstOutput.ItemIndex]) = 1 then
|
||||||
|
MessageBox(Handle, PChar(lstOutput.Items[lstOutput.ItemIndex]), 'Warning', MB_ICONWARNING)
|
||||||
|
else if Pos('Error', lstOutput.Items[lstOutput.ItemIndex]) = 1 then
|
||||||
|
MessageBox(Handle, PChar(lstOutput.Items[lstOutput.ItemIndex]), 'Error', MB_ICONERROR)
|
||||||
|
else
|
||||||
|
MessageBox(Handle, PChar(lstOutput.Items[lstOutput.ItemIndex]), 'Information', MB_ICONINFORMATION)
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
48
editor/editor2/UnitfrmGoToLine.pas
Executable file
48
editor/editor2/UnitfrmGoToLine.pas
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
unit UnitfrmGoToLine;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, TFlatSpeedButtonUnit, TFlatEditUnit;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmGoToLine = class(TForm)
|
||||||
|
lblInfo: TLabel;
|
||||||
|
txtLine: TFlatEdit;
|
||||||
|
cmdOK: TFlatSpeedButton;
|
||||||
|
cmdCancel: TFlatSpeedButton;
|
||||||
|
procedure cmdOKClick(Sender: TObject);
|
||||||
|
procedure txtLineKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmGoToLine: TfrmGoToLine;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmMain;
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmGoToLine.cmdOKClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
if (StrToInt(txtLine.Text) < 0) or (StrToInt(txtLine.Text) > frmMain.sciEditor.Lines.Count) then
|
||||||
|
raise Exception.Create('Invalid Line')
|
||||||
|
else
|
||||||
|
ModalResult := mrOK;
|
||||||
|
except
|
||||||
|
MessageBox(Handle, 'Invalid value. Check the entered line and press OK again.', 'Error', MB_ICONERROR);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmGoToLine.txtLineKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
begin
|
||||||
|
if Key = #13 then begin
|
||||||
|
cmdOk.Click;
|
||||||
|
Key := #0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
66
editor/editor2/UnitfrmLoopGenerator.pas
Executable file
66
editor/editor2/UnitfrmLoopGenerator.pas
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
unit UnitfrmLoopGenerator;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, TFlatRadioButtonUnit, TFlatEditUnit,
|
||||||
|
TFlatButtonUnit;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmLoopGenerator = class(TForm)
|
||||||
|
optWhile: TFlatRadioButton;
|
||||||
|
pnlWhileCondition: TPanel;
|
||||||
|
lblWhileCondition: TLabel;
|
||||||
|
txtWhileCondition: TFlatEdit;
|
||||||
|
optFor: TFlatRadioButton;
|
||||||
|
pnlForLoop: TPanel;
|
||||||
|
lblForVariable: TLabel;
|
||||||
|
txtVariable: TFlatEdit;
|
||||||
|
lblForCondition: TLabel;
|
||||||
|
txtForCondition: TFlatEdit;
|
||||||
|
Label1: TLabel;
|
||||||
|
txtForAction: TFlatEdit;
|
||||||
|
cmdGenerate: TFlatButton;
|
||||||
|
procedure txtVariableKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
procedure txtWhileConditionKeyDown(Sender: TObject; var Key: Word;
|
||||||
|
Shift: TShiftState);
|
||||||
|
procedure cmdGenerateClick(Sender: TObject);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmLoopGenerator: TfrmLoopGenerator;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmLoopGenerator.txtVariableKeyPress(Sender: TObject;
|
||||||
|
var Key: Char);
|
||||||
|
begin
|
||||||
|
if Key = #32 then
|
||||||
|
Key := #0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmLoopGenerator.txtWhileConditionKeyDown(Sender: TObject;
|
||||||
|
var Key: Word; Shift: TShiftState);
|
||||||
|
begin
|
||||||
|
if Key = 13 then
|
||||||
|
cmdGenerate.Click;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmLoopGenerator.cmdGenerateClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (txtWhileCondition.Text = '') and (optWhile.Checked) then
|
||||||
|
MessageBox(Handle, 'You forgot to enter the while condition', 'Warning', MB_ICONWARNING)
|
||||||
|
else if (optFor.Checked) then begin
|
||||||
|
if (txtVariable.Text = '') or (txtForCondition.Text = '') or (txtForAction.Text = '') then
|
||||||
|
MessageBox(Handle, 'You must fill out each field to generate a FOR-loop.', 'Warning', MB_ICONWARNING)
|
||||||
|
else
|
||||||
|
ModalResult := mrOk;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
ModalResult := mrOk;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
5807
editor/editor2/UnitfrmMain.dfm
Executable file
5807
editor/editor2/UnitfrmMain.dfm
Executable file
File diff suppressed because it is too large
Load Diff
1170
editor/editor2/UnitfrmMain.pas
Executable file
1170
editor/editor2/UnitfrmMain.pas
Executable file
File diff suppressed because it is too large
Load Diff
461
editor/editor2/UnitfrmMenuMaker.pas
Executable file
461
editor/editor2/UnitfrmMenuMaker.pas
Executable file
@ -0,0 +1,461 @@
|
|||||||
|
unit UnitfrmMenuMaker;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, TFlatMemoUnit, XPStyleActnCtrls, ActnList,
|
||||||
|
ActnMan, ToolWin, ActnCtrls, ComCtrls, CorelButton, ImgList,
|
||||||
|
TFlatEditUnit, TFlatCheckBoxUnit;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmMenuMaker = class(TForm)
|
||||||
|
pnlButtons: TPanel;
|
||||||
|
cmdCancel: TCorelButton;
|
||||||
|
ilButtons: TImageList;
|
||||||
|
amButtons: TActionManager;
|
||||||
|
acPaste: TAction;
|
||||||
|
acCopy: TAction;
|
||||||
|
acCut: TAction;
|
||||||
|
acClear: TAction;
|
||||||
|
acMenu: TAction;
|
||||||
|
acGrey: TAction;
|
||||||
|
acRed: TAction;
|
||||||
|
acWhite: TAction;
|
||||||
|
acYellow: TAction;
|
||||||
|
cmdNext: TCorelButton;
|
||||||
|
nbkPages: TNotebook;
|
||||||
|
atbButtons: TActionToolBar;
|
||||||
|
rtfEditor: TRichEdit;
|
||||||
|
pnlSettings: TPanel;
|
||||||
|
chkRegisterMenuCommand: TFlatCheckBox;
|
||||||
|
chkAddComment: TFlatCheckBox;
|
||||||
|
txtKeys: TFlatEdit;
|
||||||
|
lblKeys: TLabel;
|
||||||
|
bvlSpace: TBevel;
|
||||||
|
lblSettings: TLabel;
|
||||||
|
lblName: TLabel;
|
||||||
|
txtMenuName: TFlatEdit;
|
||||||
|
txtTime: TFlatEdit;
|
||||||
|
chkUseTime: TFlatCheckBox;
|
||||||
|
chkAppendOnlyMenuText: TFlatCheckBox;
|
||||||
|
lblNote: TLabel;
|
||||||
|
lblSettingsPlayers: TLabel;
|
||||||
|
pnlSettingsPlayers: TPanel;
|
||||||
|
lblMenu: TLabel;
|
||||||
|
txtMenu: TFlatEdit;
|
||||||
|
lblHelp: TLabel;
|
||||||
|
chkAlive: TFlatCheckBox;
|
||||||
|
bvlSpace2: TBevel;
|
||||||
|
chkRegister: TFlatCheckBox;
|
||||||
|
chkComments: TFlatCheckBox;
|
||||||
|
chkImmunity: TFlatCheckBox;
|
||||||
|
procedure acCopyExecute(Sender: TObject);
|
||||||
|
procedure acCutExecute(Sender: TObject);
|
||||||
|
procedure acPasteExecute(Sender: TObject);
|
||||||
|
procedure acClearExecute(Sender: TObject);
|
||||||
|
procedure acYellowExecute(Sender: TObject);
|
||||||
|
procedure acWhiteExecute(Sender: TObject);
|
||||||
|
procedure acRedExecute(Sender: TObject);
|
||||||
|
procedure acGreyExecute(Sender: TObject);
|
||||||
|
procedure txtKeysChange(Sender: TObject);
|
||||||
|
procedure cmdCancelClick(Sender: TObject);
|
||||||
|
procedure cmdNextClick(Sender: TObject);
|
||||||
|
procedure rtfEditorKeyDown(Sender: TObject; var Key: Word;
|
||||||
|
Shift: TShiftState);
|
||||||
|
procedure rtfEditorKeyUp(Sender: TObject; var Key: Word;
|
||||||
|
Shift: TShiftState);
|
||||||
|
procedure rtfEditorMouseDown(Sender: TObject; Button: TMouseButton;
|
||||||
|
Shift: TShiftState; X, Y: Integer);
|
||||||
|
procedure rtfEditorMouseUp(Sender: TObject; Button: TMouseButton;
|
||||||
|
Shift: TShiftState; X, Y: Integer);
|
||||||
|
procedure chkUseTimeClick(Sender: TObject);
|
||||||
|
procedure txtMenuNameKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
procedure chkAppendOnlyMenuTextClick(Sender: TObject);
|
||||||
|
procedure txtTimeChange(Sender: TObject);
|
||||||
|
procedure rtfEditorChange(Sender: TObject);
|
||||||
|
procedure acMenuExecute(Sender: TObject);
|
||||||
|
procedure lblHelpMouseEnter(Sender: TObject);
|
||||||
|
procedure lblHelpMouseLeave(Sender: TObject);
|
||||||
|
procedure lblHelpClick(Sender: TObject);
|
||||||
|
private
|
||||||
|
Editing: Boolean;
|
||||||
|
FDefaultMenu: Boolean;
|
||||||
|
procedure SetDefaultMenu(const Value: Boolean);
|
||||||
|
public
|
||||||
|
property DefaultMenu: Boolean read FDefaultMenu write SetDefaultMenu;
|
||||||
|
function GetColoredMenu: String;
|
||||||
|
procedure SetButton(Action: TAction);
|
||||||
|
procedure UpdateCurColor;
|
||||||
|
procedure Reset;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmMenuMaker: TfrmMenuMaker;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitAddMenu, UnitfrmSelectMenu, UnitfrmMain, UnitHowToMakePlayerMenu;
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acCopyExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.CopyToClipboard;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acCutExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.CutToClipboard;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acPasteExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.PasteFromClipboard;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acClearExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.Clear;
|
||||||
|
rtfEditor.SelAttributes.Color := clWhite;
|
||||||
|
UpdateCurColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acYellowExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.SelAttributes.Color := clYellow;
|
||||||
|
SetButton(acYellow);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acWhiteExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.SelAttributes.Color := clWhite;
|
||||||
|
SetButton(acWhite);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acRedExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.SelAttributes.Color := clRed;
|
||||||
|
SetButton(acRed);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acGreyExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
rtfEditor.SelAttributes.Color := clGray;
|
||||||
|
SetButton(acGrey);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.SetButton(Action: TAction);
|
||||||
|
begin
|
||||||
|
if Action <> acYellow then
|
||||||
|
acYellow.Checked := False;
|
||||||
|
if Action <> acWhite then
|
||||||
|
acWhite.Checked := False;
|
||||||
|
if Action <> acRed then
|
||||||
|
acRed.Checked := False;
|
||||||
|
if Action <> acGrey then
|
||||||
|
acGrey.Checked := False;
|
||||||
|
Action.Checked := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.txtKeysChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
StrToInt(Trim((Sender As TFlatEdit).Text));
|
||||||
|
except
|
||||||
|
if Sender = txtKeys then begin
|
||||||
|
(Sender As TFlatEdit).Text := '1';
|
||||||
|
SysUtils.Beep;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
(Sender As TFlatEdit).Text := '';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.cmdCancelClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if nbkPages.PageIndex = 0 then
|
||||||
|
ModalResult := mrCancel
|
||||||
|
else begin
|
||||||
|
nbkPages.PageIndex := 0;
|
||||||
|
if not DefaultMenu then begin
|
||||||
|
lblNote.Visible := True;
|
||||||
|
lblHelp.Visible := True;
|
||||||
|
end;
|
||||||
|
cmdCancel.Caption := 'Cancel';
|
||||||
|
cmdNext.Caption := '&Next >';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.cmdNextClick(Sender: TObject);
|
||||||
|
function IsNumeric(eChar: Char): Boolean;
|
||||||
|
begin
|
||||||
|
Result := Pos(eChar, '0123456789') <> 0;
|
||||||
|
end;
|
||||||
|
var i: integer;
|
||||||
|
eColoredMenu: String;
|
||||||
|
begin
|
||||||
|
if Editing then begin
|
||||||
|
eColoredMenu := GetColoredMenu;
|
||||||
|
frmMain.sciEditor.Lines[frmSelectMenu.eLines[frmSelectMenu.GetItemIndex]] := StringReplace(frmMain.sciEditor.Lines[frmSelectMenu.eLines[frmSelectMenu.GetItemIndex]], '"' + frmSelectMenu.eMenuStr[frmSelectMenu.GetItemIndex] + '"', '"' + eColoredMenu + '"', []);
|
||||||
|
Editing := False;
|
||||||
|
ModalResult := mrOk;
|
||||||
|
end
|
||||||
|
else if nbkPages.PageIndex = 0 then begin // Editor
|
||||||
|
if DefaultMenu then begin
|
||||||
|
txtKeys.Text := '0';
|
||||||
|
for i := 0 to rtfEditor.Lines.Count -1 do begin
|
||||||
|
if Length(rtfEditor.Lines[i]) <> 0 then begin
|
||||||
|
if IsNumeric(rtfEditor.Lines[i][1]) then
|
||||||
|
txtKeys.Text := txtKeys.Text + rtfEditor.Lines[i][1];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if Length(txtKeys.Text) <> 1 then
|
||||||
|
txtKeys.Text := Copy(txtKeys.Text, 2, Length(txtKeys.Text));
|
||||||
|
nbkPages.PageIndex := 1;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if Pos('$players', LowerCase(rtfEditor.Lines.Text)) = 0 then begin
|
||||||
|
MessageBox(Handle, 'You forgot to set the players.', 'Warning', MB_ICONWARNING);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (Pos('$next', LowerCase(rtfEditor.Lines.Text)) = 0) and (Pos('$back', LowerCase(rtfEditor.Lines.Text)) = 0) then
|
||||||
|
MessageBox(Handle, 'You should set a "Next" and a "Back" key.', 'Warning', MB_ICONWARNING)
|
||||||
|
else if Pos('$next', LowerCase(rtfEditor.Lines.Text)) = 0 then
|
||||||
|
MessageBox(Handle, 'You should set a "Next"-key.', 'Warning', MB_ICONWARNING)
|
||||||
|
else if Pos('$exitorback', LowerCase(rtfEditor.Lines.Text)) = 0 then
|
||||||
|
MessageBox(Handle, 'You should set a "Back"-key.', 'Warning', MB_ICONWARNING);
|
||||||
|
|
||||||
|
nbkPages.PageIndex := 2;
|
||||||
|
end;
|
||||||
|
cmdCancel.Caption := '< &Back';
|
||||||
|
cmdNext.Caption := 'Finish';
|
||||||
|
end
|
||||||
|
else if nbkPages.PageIndex = 1 then begin // Default finish
|
||||||
|
if (txtMenuName.Text = '') and (not chkAppendOnlyMenuText.Checked) then
|
||||||
|
MessageBox(Handle, 'Invalid menu name.', 'Warning', MB_ICONWARNING)
|
||||||
|
else begin
|
||||||
|
Screen.Cursor := crHourGlass;
|
||||||
|
if AddMenu then
|
||||||
|
ModalResult := mrOk
|
||||||
|
else
|
||||||
|
MessageBox(Handle, 'Menu already exists. Please choose another name.', 'Warning', MB_ICONWARNING);
|
||||||
|
Screen.Cursor := crDefault;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else begin // Player finish
|
||||||
|
if (txtMenu.Text = '') then
|
||||||
|
MessageBox(Handle, 'Invalid menu name.', 'Warning', MB_ICONWARNING)
|
||||||
|
else begin
|
||||||
|
if AddPlayerMenu then
|
||||||
|
ModalResult := mrOk;
|
||||||
|
Screen.Cursor := crDefault;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
lblNote.Visible := False;
|
||||||
|
lblHelp.Visible := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.UpdateCurColor;
|
||||||
|
begin
|
||||||
|
case rtfEditor.SelAttributes.Color of
|
||||||
|
clYellow: SetButton(acYellow);
|
||||||
|
clWhite: SetButton(acWhite);
|
||||||
|
clRed: SetButton(acRed);
|
||||||
|
clGray: SetButton(acGrey);
|
||||||
|
end;
|
||||||
|
atbButtons.RecreateControls;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.rtfEditorKeyDown(Sender: TObject; var Key: Word;
|
||||||
|
Shift: TShiftState);
|
||||||
|
begin
|
||||||
|
UpdateCurColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.rtfEditorKeyUp(Sender: TObject; var Key: Word;
|
||||||
|
Shift: TShiftState);
|
||||||
|
begin
|
||||||
|
UpdateCurColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.rtfEditorMouseDown(Sender: TObject;
|
||||||
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||||
|
begin
|
||||||
|
UpdateCurColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.rtfEditorMouseUp(Sender: TObject;
|
||||||
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||||
|
begin
|
||||||
|
UpdateCurColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.chkUseTimeClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
txtTime.Enabled := chkUseTime.Checked;
|
||||||
|
if not chkUseTime.Checked then
|
||||||
|
txtTime.Text := '-1';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.txtMenuNameKeyPress(Sender: TObject;
|
||||||
|
var Key: Char);
|
||||||
|
begin
|
||||||
|
if Key = #32 then
|
||||||
|
Key := #0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.chkAppendOnlyMenuTextClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
lblKeys.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
txtKeys.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
chkAddComment.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
chkRegisterMenuCommand.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
chkUseTime.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
txtTime.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
lblName.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
txtMenuName.Enabled := not chkAppendOnlyMenuText.Checked;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.txtTimeChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
if StrToInt(txtTime.Text) < -1 then begin
|
||||||
|
txtTime.Text := '-1';
|
||||||
|
SysUtils.Beep;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
txtTime.Text := '1000';
|
||||||
|
SysUtils.Beep;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.rtfEditorChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
cmdNext.Enabled := rtfEditor.Text <> '';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.SetDefaultMenu(const Value: Boolean);
|
||||||
|
begin
|
||||||
|
FDefaultMenu := Value;
|
||||||
|
lblNote.Visible := not Value;
|
||||||
|
lblHelp.Visible := not Value;
|
||||||
|
acMenu.Enabled := Value;
|
||||||
|
Editing := False;
|
||||||
|
if Value then
|
||||||
|
Caption := 'Menu Maker'
|
||||||
|
else
|
||||||
|
Caption := 'Player Menu Maker';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.acMenuExecute(Sender: TObject);
|
||||||
|
var eTemp: String;
|
||||||
|
begin
|
||||||
|
if frmSelectMenu.ShowModal = mrOk then begin
|
||||||
|
atbButtons.RecreateControls;
|
||||||
|
if frmSelectMenu.GetItemIndex = -1 then
|
||||||
|
frmSelectMenu.lstMenu.Selected[0] := True;
|
||||||
|
|
||||||
|
DefaultMenu := True;
|
||||||
|
Editing := True;
|
||||||
|
rtfEditor.Clear;
|
||||||
|
rtfEditor.SelAttributes.Color := clWhite;
|
||||||
|
eTemp := frmSelectMenu.eMenuStr[frmSelectMenu.GetItemIndex];
|
||||||
|
if eTemp <> '' then begin
|
||||||
|
while Length(eTemp) <> 0 do begin
|
||||||
|
if eTemp[1] = '\' then begin
|
||||||
|
if Length(eTemp) <> 1 then begin
|
||||||
|
case LowerCase(eTemp[2])[1] of
|
||||||
|
'w': rtfEditor.SelAttributes.Color := clWhite;
|
||||||
|
'r': rtfEditor.SelAttributes.Color := clRed;
|
||||||
|
'd': rtfEditor.SelAttributes.Color := clGray;
|
||||||
|
'y': rtfEditor.SelAttributes.Color := clYellow;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Delete(eTemp, 1, 2);
|
||||||
|
end
|
||||||
|
else if Copy(eTemp, 1, 2) = '^n' then begin
|
||||||
|
rtfEditor.SelText := #13#10;
|
||||||
|
Delete(eTemp, 1, 2);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
rtfEditor.SelText := eTemp[1];
|
||||||
|
Delete(eTemp, 1, 1);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
cmdNext.Caption := 'Finish edit';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
atbButtons.RecreateControls;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TfrmMenuMaker.GetColoredMenu: String;
|
||||||
|
var i: integer;
|
||||||
|
eCurColor: TColor;
|
||||||
|
begin
|
||||||
|
eCurColor := clWhite;
|
||||||
|
Result := '';
|
||||||
|
for i := 0 to Length(rtfEditor.Lines.Text) -1 do begin
|
||||||
|
rtfEditor.SelStart := i;
|
||||||
|
if rtfEditor.SelAttributes.Color <> eCurColor then begin
|
||||||
|
eCurColor := rtfEditor.SelAttributes.Color;
|
||||||
|
case eCurColor of
|
||||||
|
clWhite : Result := Result + '\w';
|
||||||
|
clYellow: Result := Result + '\y';
|
||||||
|
clRed : Result := Result + '\r';
|
||||||
|
clGray : Result := Result + '\d';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := Result + rtfEditor.Lines.Text[i+1];
|
||||||
|
end;
|
||||||
|
rtfEditor.SelStart := 0;
|
||||||
|
Result := StringReplace(Result, #13, '^n', [rfReplaceAll]);
|
||||||
|
Result := StringReplace(Result, #10, '', [rfReplaceAll]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.Reset;
|
||||||
|
begin
|
||||||
|
rtfEditor.Clear;
|
||||||
|
rtfEditor.SelAttributes.Color := clWhite;
|
||||||
|
txtKeys.Text := '1';
|
||||||
|
txtMenu.Clear;
|
||||||
|
txtMenuName.Clear;
|
||||||
|
UpdateCurColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.lblHelpMouseEnter(Sender: TObject);
|
||||||
|
begin
|
||||||
|
lblHelp.Font.Color := clBlue;
|
||||||
|
lblHelp.Font.Style := [fsUnderline];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.lblHelpMouseLeave(Sender: TObject);
|
||||||
|
begin
|
||||||
|
lblHelp.Font.Color := clWindowText;
|
||||||
|
lblHelp.Font.Style := [];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmMenuMaker.lblHelpClick(Sender: TObject);
|
||||||
|
procedure Append(eText: String);
|
||||||
|
begin
|
||||||
|
rtfEditor.SelText := eText + #13#10;
|
||||||
|
rtfEditor.SelStart := Length(rtfEditor.Lines.Text);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if frmHowToMakePlayerMenu.ShowModal = mrYes then begin
|
||||||
|
rtfEditor.Clear;
|
||||||
|
rtfEditor.SelAttributes.Color := clYellow;
|
||||||
|
Append('Kick player');
|
||||||
|
Append('');
|
||||||
|
rtfEditor.SelAttributes.Color := clWhite;
|
||||||
|
Append('$players(1,8,%n. %v)');
|
||||||
|
Append('$next(9,9. Next)');
|
||||||
|
Append('');
|
||||||
|
Append('$exitorback(0,0. Exit,0. Back)');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
156
editor/editor2/UnitfrmOptions.pas
Executable file
156
editor/editor2/UnitfrmOptions.pas
Executable file
@ -0,0 +1,156 @@
|
|||||||
|
unit UnitfrmOptions;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, ComCtrls, TFlatEditUnit,
|
||||||
|
TFlatSpeedButtonUnit, TFlatCheckBoxUnit, TFlatComboBoxUnit, FileCtrl,
|
||||||
|
TFlatTabControlUnit, TFlatRadioButtonUnit, Dialogs;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmSettings = class(TForm)
|
||||||
|
lblSettings: TLabel;
|
||||||
|
cmdClose: TFlatSpeedButton;
|
||||||
|
odHalfLife: TOpenDialog;
|
||||||
|
ftcPages: TFlatTabControl;
|
||||||
|
nbkPages: TNotebook;
|
||||||
|
pnlHighlighter: TPanel;
|
||||||
|
lblComments: TLabel;
|
||||||
|
lblDirectives: TLabel;
|
||||||
|
lblOperators: TLabel;
|
||||||
|
lblStrings: TLabel;
|
||||||
|
lblKeywords: TLabel;
|
||||||
|
lblActiveLine: TLabel;
|
||||||
|
cboComments: TColorBox;
|
||||||
|
cboDirectives: TColorBox;
|
||||||
|
cboOperators: TColorBox;
|
||||||
|
cboStrings: TColorBox;
|
||||||
|
cboKeywords: TColorBox;
|
||||||
|
cboActiveLine: TColorBox;
|
||||||
|
pnlGeneralSettings: TPanel;
|
||||||
|
lblAMXX: TLabel;
|
||||||
|
cmdBrowseAMXX: TFlatSpeedButton;
|
||||||
|
cmdBrowseHalfLife: TFlatSpeedButton;
|
||||||
|
lblHalfLife: TLabel;
|
||||||
|
cmdBrowseSave: TFlatSpeedButton;
|
||||||
|
lblSave: TLabel;
|
||||||
|
txtAMXXPath: TFlatEdit;
|
||||||
|
txtHalfLife: TFlatEdit;
|
||||||
|
txtSave: TFlatEdit;
|
||||||
|
pnlGeneral: TPanel;
|
||||||
|
lblFoldingStyle: TLabel;
|
||||||
|
chkAutoComplete: TFlatCheckBox;
|
||||||
|
chkHighlighting: TFlatCheckBox;
|
||||||
|
cboFoldingStyle: TFlatComboBox;
|
||||||
|
chkHints: TFlatCheckBox;
|
||||||
|
chkAutoIndent: TFlatCheckBox;
|
||||||
|
chkBrackets: TFlatCheckBox;
|
||||||
|
lblHighlighter: TLabel;
|
||||||
|
lblEditor: TLabel;
|
||||||
|
lblDirectories: TLabel;
|
||||||
|
lblCompilerSettings: TLabel;
|
||||||
|
lblFTP: TLabel;
|
||||||
|
lblMisc: TLabel;
|
||||||
|
lblView: TLabel;
|
||||||
|
pnlCharCompleter: TPanel;
|
||||||
|
chkAutoCloseBrackets: TFlatCheckBox;
|
||||||
|
chkAutoCloseQuotes: TFlatCheckBox;
|
||||||
|
pnlCompilerSettings: TPanel;
|
||||||
|
optWindow: TFlatRadioButton;
|
||||||
|
optList: TFlatRadioButton;
|
||||||
|
pnlFTP: TPanel;
|
||||||
|
lblHost: TLabel;
|
||||||
|
lblPort: TLabel;
|
||||||
|
lblUser: TLabel;
|
||||||
|
lblPassword: TLabel;
|
||||||
|
lblStandardDir: TLabel;
|
||||||
|
cmdCheckFTP: TFlatSpeedButton;
|
||||||
|
txtHost: TFlatEdit;
|
||||||
|
txtPort: TFlatEdit;
|
||||||
|
txtUser: TFlatEdit;
|
||||||
|
txtPassword: TFlatEdit;
|
||||||
|
txtStandardDir: TFlatEdit;
|
||||||
|
pnlMisc: TPanel;
|
||||||
|
chkReload: TFlatCheckBox;
|
||||||
|
chkAutoAddPlugins: TFlatCheckBox;
|
||||||
|
pnlView: TPanel;
|
||||||
|
lblCodeExplorer: TLabel;
|
||||||
|
cboCodeExplorer: TFlatComboBox;
|
||||||
|
chkStatusbar: TFlatCheckBox;
|
||||||
|
lblCharCompleter: TLabel;
|
||||||
|
procedure cmdBrowseAMXXClick(Sender: TObject);
|
||||||
|
procedure cmdBrowseHalfLifeClick(Sender: TObject);
|
||||||
|
procedure cmdBrowseSaveClick(Sender: TObject);
|
||||||
|
procedure chkAutoAddPluginsMouseUp(Sender: TObject;
|
||||||
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||||
|
procedure ftcPagesTabChanged(Sender: TObject);
|
||||||
|
procedure cmdCheckFTPClick(Sender: TObject);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmSettings: TfrmSettings;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmMain;
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmSettings.cmdBrowseAMXXClick(Sender: TObject);
|
||||||
|
var eDir: String;
|
||||||
|
begin
|
||||||
|
if SelectDirectory('Please select your AMXX directory:', 'C:', eDir) then
|
||||||
|
txtAMXXPath.Text := eDir;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSettings.cmdBrowseHalfLifeClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if odHalfLife.Execute then
|
||||||
|
txtHalfLife.Text := odHalfLife.FileName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSettings.cmdBrowseSaveClick(Sender: TObject);
|
||||||
|
var eDir: String;
|
||||||
|
begin
|
||||||
|
if SelectDirectory('Please select the directory where your files shall be saved:', 'C:', eDir) then
|
||||||
|
txtSave.Text := eDir;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSettings.chkAutoAddPluginsMouseUp(Sender: TObject;
|
||||||
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||||
|
begin
|
||||||
|
if (chkAutoAddPlugins.Checked) and (Button = mbLeft) then
|
||||||
|
MessageBox(Handle, 'Notice: This function works only with plugins which are saved in $AMXXDIR$\scripting.', 'Information', MB_ICONINFORMATION);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSettings.ftcPagesTabChanged(Sender: TObject);
|
||||||
|
begin
|
||||||
|
nbkPages.PageIndex := ftcPages.ActiveTab;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSettings.cmdCheckFTPClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
with frmMain.IdFTP do begin
|
||||||
|
Host := txtHost.Text;
|
||||||
|
Port := StrToInt(txtPort.Text);
|
||||||
|
Username := txtUser.Text;
|
||||||
|
Password := txtPassword.Text;
|
||||||
|
try
|
||||||
|
Connect;
|
||||||
|
ChangeDir(txtStandardDir.Text);
|
||||||
|
MessageBox(Handle, 'Test successfully done!', 'Information', MB_ICONINFORMATION)
|
||||||
|
except
|
||||||
|
on E: Exception do
|
||||||
|
MessageBox(Handle, PChar(E.Message), 'Error', MB_ICONWARNING);
|
||||||
|
end;
|
||||||
|
if Connected then
|
||||||
|
Disconnect;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
MessageBox(Handle, 'Invalid FTP port.', 'Warning', MB_ICONWARNING);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
41
editor/editor2/UnitfrmSaveDialog.pas
Executable file
41
editor/editor2/UnitfrmSaveDialog.pas
Executable file
@ -0,0 +1,41 @@
|
|||||||
|
unit UnitfrmSaveDialog;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, CheckLst, TFlatSpeedButtonUnit;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmSaveDialog = class(TForm)
|
||||||
|
lstFiles: TCheckListBox;
|
||||||
|
shpFiles: TShape;
|
||||||
|
cmdSave: TFlatSpeedButton;
|
||||||
|
cmdCancel: TFlatSpeedButton;
|
||||||
|
lblInfo: TLabel;
|
||||||
|
procedure lstFilesClickCheck(Sender: TObject);
|
||||||
|
public
|
||||||
|
SaveCaption: String;
|
||||||
|
CloseCaption: String;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmSaveDialog: TfrmSaveDialog;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmSaveDialog.lstFilesClickCheck(Sender: TObject);
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to lstFiles.Items.Count -1 do begin
|
||||||
|
if lstFiles.Checked[i] then begin
|
||||||
|
cmdSave.Caption := SaveCaption;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
cmdSave.Caption := CloseCaption;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
80
editor/editor2/UnitfrmSelectMenu.pas
Executable file
80
editor/editor2/UnitfrmSelectMenu.pas
Executable file
@ -0,0 +1,80 @@
|
|||||||
|
unit UnitfrmSelectMenu;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Windows, Messages, Classes, Graphics, Controls,
|
||||||
|
StdCtrls, ExtCtrls, Forms, CorelButton, TFlatListBoxUnit;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmSelectMenu = class(TForm)
|
||||||
|
cmdOK: TCorelButton;
|
||||||
|
cmdCancel: TCorelButton;
|
||||||
|
lblSelect: TLabel;
|
||||||
|
lstMenu: TFlatListBox;
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
|
procedure FormDestroy(Sender: TObject);
|
||||||
|
procedure FormShow(Sender: TObject);
|
||||||
|
public
|
||||||
|
eMenuStr: TStringList;
|
||||||
|
eLines: array of Integer;
|
||||||
|
function GetItemIndex: Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmSelectMenu: TfrmSelectMenu;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses UnitfrmMenuMaker, UnitfrmMain, UnitAddMenu, UnitFunc, UnitTextAnalyze;
|
||||||
|
|
||||||
|
{$R *.DFM}
|
||||||
|
|
||||||
|
procedure TfrmSelectMenu.FormCreate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
eMenuStr := TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSelectMenu.FormDestroy(Sender: TObject);
|
||||||
|
begin
|
||||||
|
eMenuStr.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSelectMenu.FormShow(Sender: TObject);
|
||||||
|
var i: integer;
|
||||||
|
eTemp: String;
|
||||||
|
begin
|
||||||
|
eMenuStr.Clear;
|
||||||
|
lstMenu.Items.Clear;
|
||||||
|
SetLength(eLines, 0);
|
||||||
|
for i := 0 to frmMain.sciEditor.Lines.Count -1 do begin
|
||||||
|
if Pos('show_menu', Trim(LowerCase(frmMain.sciEditor.Lines[i]))) = 1 then begin
|
||||||
|
SetLength(eLines, eMenuStr.Count +1);
|
||||||
|
eLines[eMenuStr.Count] := i;
|
||||||
|
eTemp := frmMain.sciEditor.Lines[i];
|
||||||
|
if CountChars(frmMain.sciEditor.Lines[i], '"') >= 4 then begin
|
||||||
|
eMenuStr.Add(Between(eTemp, '"', '"'));
|
||||||
|
while CountChars(eTemp, '"') > 2 do
|
||||||
|
Delete(eTemp, 1, 1);
|
||||||
|
lstMenu.Items.Add(Between(eTemp, '"', '"'));
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
eMenuStr.Add(Between(eTemp, '"', '"'));
|
||||||
|
lstMenu.Items.Add(Format('Unknown Menu on line %s', [IntToStr(i)]));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
cmdOK.Enabled := lstMenu.Items.Count <> 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TfrmSelectMenu.GetItemIndex: Integer;
|
||||||
|
var i: integer;
|
||||||
|
begin
|
||||||
|
Result := -1;
|
||||||
|
for i := 0 to lstMenu.Items.Count -1 do begin
|
||||||
|
if lstMenu.Selected[i] then
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
191
editor/editor2/UnitfrmSockets.dfm
Executable file
191
editor/editor2/UnitfrmSockets.dfm
Executable file
@ -0,0 +1,191 @@
|
|||||||
|
object frmSocketTerminal: TfrmSocketTerminal
|
||||||
|
Left = 192
|
||||||
|
Top = 110
|
||||||
|
ActiveControl = rtfEnter
|
||||||
|
BorderStyle = bsDialog
|
||||||
|
Caption = 'Socket Terminal'
|
||||||
|
ClientHeight = 230
|
||||||
|
ClientWidth = 324
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'Tahoma'
|
||||||
|
Font.Style = []
|
||||||
|
FormStyle = fsStayOnTop
|
||||||
|
OldCreateOrder = False
|
||||||
|
Position = poMainFormCenter
|
||||||
|
OnClose = FormClose
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object pnlSettings: TPanel
|
||||||
|
Left = 0
|
||||||
|
Top = 141
|
||||||
|
Width = 324
|
||||||
|
Height = 89
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
TabOrder = 2
|
||||||
|
object lblStatusCaption: TLabel
|
||||||
|
Left = 2
|
||||||
|
Top = 72
|
||||||
|
Width = 35
|
||||||
|
Height = 13
|
||||||
|
Caption = 'Status:'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'Tahoma'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
object lblStatus: TLabel
|
||||||
|
Left = 40
|
||||||
|
Top = 72
|
||||||
|
Width = 69
|
||||||
|
Height = 13
|
||||||
|
Caption = 'not connected'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clRed
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'Tahoma'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
object lblSettings: TLabel
|
||||||
|
Left = 4
|
||||||
|
Top = 6
|
||||||
|
Width = 43
|
||||||
|
Height = 13
|
||||||
|
Caption = 'Settings:'
|
||||||
|
end
|
||||||
|
object pnlSettings2: TPanel
|
||||||
|
Left = 4
|
||||||
|
Top = 24
|
||||||
|
Width = 311
|
||||||
|
Height = 41
|
||||||
|
BevelOuter = bvLowered
|
||||||
|
TabOrder = 0
|
||||||
|
object lblHost: TLabel
|
||||||
|
Left = 4
|
||||||
|
Top = 3
|
||||||
|
Width = 26
|
||||||
|
Height = 13
|
||||||
|
Caption = 'Host:'
|
||||||
|
end
|
||||||
|
object lblPort: TLabel
|
||||||
|
Left = 130
|
||||||
|
Top = 3
|
||||||
|
Width = 24
|
||||||
|
Height = 13
|
||||||
|
Caption = 'Port:'
|
||||||
|
end
|
||||||
|
object txtHost: TFlatEdit
|
||||||
|
Left = 4
|
||||||
|
Top = 17
|
||||||
|
Width = 121
|
||||||
|
Height = 19
|
||||||
|
ColorFlat = clBtnFace
|
||||||
|
ParentColor = True
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object txtPort: TFlatEdit
|
||||||
|
Left = 130
|
||||||
|
Top = 17
|
||||||
|
Width = 39
|
||||||
|
Height = 19
|
||||||
|
ColorFlat = clBtnFace
|
||||||
|
ParentColor = True
|
||||||
|
TabOrder = 1
|
||||||
|
Text = '1'
|
||||||
|
OnChange = txtPortChange
|
||||||
|
end
|
||||||
|
object optUDP: TFlatRadioButton
|
||||||
|
Left = 176
|
||||||
|
Top = 20
|
||||||
|
Width = 39
|
||||||
|
Height = 17
|
||||||
|
Caption = 'UDP'
|
||||||
|
TabOrder = 3
|
||||||
|
OnClick = optTCPClick
|
||||||
|
end
|
||||||
|
object optTCP: TFlatRadioButton
|
||||||
|
Left = 176
|
||||||
|
Top = 4
|
||||||
|
Width = 35
|
||||||
|
Height = 15
|
||||||
|
Caption = 'TCP'
|
||||||
|
Checked = True
|
||||||
|
TabOrder = 2
|
||||||
|
TabStop = True
|
||||||
|
OnClick = optTCPClick
|
||||||
|
end
|
||||||
|
object cmdConnect: TFlatButton
|
||||||
|
Left = 224
|
||||||
|
Top = 10
|
||||||
|
Width = 77
|
||||||
|
Height = 21
|
||||||
|
ColorHighLight = 8623776
|
||||||
|
ColorShadow = 8623776
|
||||||
|
Caption = 'Connect'
|
||||||
|
TabOrder = 4
|
||||||
|
OnClick = cmdConnectClick
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object rtfEnter: TRichEdit
|
||||||
|
Left = 0
|
||||||
|
Top = 121
|
||||||
|
Width = 324
|
||||||
|
Height = 20
|
||||||
|
Align = alBottom
|
||||||
|
TabOrder = 1
|
||||||
|
WantReturns = False
|
||||||
|
OnKeyPress = rtfEnterKeyPress
|
||||||
|
end
|
||||||
|
object rtfReceived: TRichEdit
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Width = 324
|
||||||
|
Height = 121
|
||||||
|
Align = alClient
|
||||||
|
ScrollBars = ssVertical
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object IdTCPClient: TIdTCPClient
|
||||||
|
MaxLineAction = maSplit
|
||||||
|
OnDisconnected = IdTCPClientDisconnected
|
||||||
|
OnConnected = IdTCPClientConnected
|
||||||
|
Port = 0
|
||||||
|
Left = 4
|
||||||
|
Top = 4
|
||||||
|
end
|
||||||
|
object IdUDPClient: TIdUDPClient
|
||||||
|
OnStatus = IdUDPClientStatus
|
||||||
|
Port = 0
|
||||||
|
Left = 4
|
||||||
|
Top = 34
|
||||||
|
end
|
||||||
|
object alCopyPaste: TActionList
|
||||||
|
Left = 4
|
||||||
|
Top = 64
|
||||||
|
object acCopy: TAction
|
||||||
|
Caption = 'Copy'
|
||||||
|
ShortCut = 16451
|
||||||
|
OnExecute = acCopyExecute
|
||||||
|
end
|
||||||
|
object acPaste: TAction
|
||||||
|
Caption = 'Paste'
|
||||||
|
ShortCut = 16470
|
||||||
|
OnExecute = acPasteExecute
|
||||||
|
end
|
||||||
|
object acUndo: TAction
|
||||||
|
Caption = 'Undo'
|
||||||
|
OnExecute = acUndoExecute
|
||||||
|
end
|
||||||
|
object acSelectAll: TAction
|
||||||
|
Caption = 'Select all'
|
||||||
|
OnExecute = acSelectAllExecute
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
259
editor/editor2/UnitfrmSockets.pas
Executable file
259
editor/editor2/UnitfrmSockets.pas
Executable file
@ -0,0 +1,259 @@
|
|||||||
|
unit UnitfrmSockets;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||||
|
Dialogs, ExtCtrls, StdCtrls, ComCtrls, TFlatEditUnit,
|
||||||
|
TFlatRadioButtonUnit, TFlatButtonUnit, IdUDPBase, IdUDPClient,
|
||||||
|
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, UnitReadThread,
|
||||||
|
ActnList;
|
||||||
|
|
||||||
|
type
|
||||||
|
TfrmSocketTerminal = class(TForm)
|
||||||
|
pnlSettings: TPanel;
|
||||||
|
rtfEnter: TRichEdit;
|
||||||
|
rtfReceived: TRichEdit;
|
||||||
|
lblStatusCaption: TLabel;
|
||||||
|
lblStatus: TLabel;
|
||||||
|
lblSettings: TLabel;
|
||||||
|
pnlSettings2: TPanel;
|
||||||
|
lblHost: TLabel;
|
||||||
|
txtHost: TFlatEdit;
|
||||||
|
txtPort: TFlatEdit;
|
||||||
|
lblPort: TLabel;
|
||||||
|
optUDP: TFlatRadioButton;
|
||||||
|
optTCP: TFlatRadioButton;
|
||||||
|
cmdConnect: TFlatButton;
|
||||||
|
IdTCPClient: TIdTCPClient;
|
||||||
|
IdUDPClient: TIdUDPClient;
|
||||||
|
alCopyPaste: TActionList;
|
||||||
|
acCopy: TAction;
|
||||||
|
acPaste: TAction;
|
||||||
|
acUndo: TAction;
|
||||||
|
acSelectAll: TAction;
|
||||||
|
procedure txtPortChange(Sender: TObject);
|
||||||
|
procedure cmdConnectClick(Sender: TObject);
|
||||||
|
procedure optTCPClick(Sender: TObject);
|
||||||
|
procedure IdTCPClientConnected(Sender: TObject);
|
||||||
|
procedure IdTCPClientDisconnected(Sender: TObject);
|
||||||
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
||||||
|
procedure rtfEnterKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
procedure IdUDPClientStatus(ASender: TObject; const AStatus: TIdStatus;
|
||||||
|
const AStatusText: String);
|
||||||
|
procedure acCopyExecute(Sender: TObject);
|
||||||
|
procedure acPasteExecute(Sender: TObject);
|
||||||
|
procedure acUndoExecute(Sender: TObject);
|
||||||
|
procedure acSelectAllExecute(Sender: TObject);
|
||||||
|
private
|
||||||
|
ReadThread: TReadThread;
|
||||||
|
public
|
||||||
|
procedure Append(eText: String; eColor: TColor = clBlack);
|
||||||
|
procedure SetStatus(eStatus: String; eColor: TColor);
|
||||||
|
procedure OnRead(eRead: String);
|
||||||
|
procedure EnableControls(eValue: Boolean);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmSocketTerminal: TfrmSocketTerminal;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.dfm}
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.Append(eText: String; eColor: TColor);
|
||||||
|
begin
|
||||||
|
eText := Format('[%s] %s', [TimeToStr(Time), eText]);
|
||||||
|
rtfReceived.SelStart := Length(rtfReceived.Lines.Text);
|
||||||
|
rtfReceived.SelAttributes.Color := eColor;
|
||||||
|
rtfReceived.SelText := eText + #13#10;
|
||||||
|
rtfReceived.Perform(WM_VSCROLL, SB_BOTTOM, 0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.OnRead(eRead: String);
|
||||||
|
begin
|
||||||
|
Append(eRead, clWindowText);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.SetStatus(eStatus: String; eColor: TColor);
|
||||||
|
begin
|
||||||
|
lblStatus.Caption := eStatus;
|
||||||
|
lblStatus.Font.Color := eColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.txtPortChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
StrToInt(txtPort.Text);
|
||||||
|
except
|
||||||
|
txtPort.Text := '1';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.cmdConnectClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if Tag = 0 then begin
|
||||||
|
if optTCP.Checked then begin
|
||||||
|
IdTCPClient.Host := txtHost.Text;
|
||||||
|
IdTCPClient.Port := StrToInt(txtPort.Text);
|
||||||
|
EnableControls(False);
|
||||||
|
Append('Connecting to ' + txtHost.Text + ':' + txtPort.Text + '...', clHighlight);
|
||||||
|
try
|
||||||
|
IdTCPClient.Connect;
|
||||||
|
ReadThread := TReadThread.Create(True);
|
||||||
|
ReadThread.ReadTCP := True;
|
||||||
|
ReadThread.Resume;
|
||||||
|
except
|
||||||
|
on E: Exception do begin
|
||||||
|
MessageBox(Handle, PChar('Couldn''t connect to server:' + #13 + E.Message), 'Warning', MB_ICONWARNING);
|
||||||
|
EnableControls(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
IdUDPClient.Host := txtHost.Text;
|
||||||
|
IdUDPClient.Port := StrToInt(txtPort.Text);
|
||||||
|
EnableControls(False);
|
||||||
|
try
|
||||||
|
IdUDPClient.Active := True;
|
||||||
|
ReadThread := TReadThread.Create(True);
|
||||||
|
ReadThread.ReadTCP := False;
|
||||||
|
ReadThread.Resume;
|
||||||
|
SetStatus('socket active', clGreen);
|
||||||
|
Append('Opened socket to ' + txtHost.Text + ':' + txtPort.Text + '!', clGreen);
|
||||||
|
except
|
||||||
|
on E: Exception do begin
|
||||||
|
MessageBox(Handle, PChar('Couldn''t activate socket:' + #13 + E.Message), 'Warning', MB_ICONWARNING);
|
||||||
|
EnableControls(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if optTCP.Checked then begin
|
||||||
|
Screen.Cursor := crHourGlass;
|
||||||
|
IdTCPClient.Disconnect;
|
||||||
|
ReadThread.Terminate;
|
||||||
|
while Tag <> 0 do begin
|
||||||
|
Sleep(5);
|
||||||
|
Application.ProcessMessages;
|
||||||
|
end;
|
||||||
|
Screen.Cursor := crDefault;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
Screen.Cursor := crHourGlass;
|
||||||
|
IdUDPClient.Active := False;
|
||||||
|
ReadThread.Terminate;
|
||||||
|
EnableControls(True);
|
||||||
|
SetStatus('socket inactive', clRed);
|
||||||
|
Append('Closed socket to ' + txtHost.Text + ':' + txtPort.Text + '!', clRed);
|
||||||
|
Screen.Cursor := crDefault;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.optTCPClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if optTCP.Checked then begin
|
||||||
|
if not IdTCPClient.Connected then
|
||||||
|
SetStatus('not connected', clRed);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if not IdUDPClient.Active then
|
||||||
|
SetStatus('socket inactive', clRed);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.EnableControls(eValue: Boolean);
|
||||||
|
begin
|
||||||
|
txtHost.Enabled := eValue;
|
||||||
|
txtPort.Enabled := eValue;
|
||||||
|
lblHost.Enabled := eValue;
|
||||||
|
lblPort.Enabled := eValue;
|
||||||
|
optTCP.Enabled := eValue;
|
||||||
|
optUDP.Enabled := eValue;
|
||||||
|
if eValue then begin
|
||||||
|
cmdConnect.Caption := 'Connect';
|
||||||
|
Tag := 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
cmdConnect.Caption := 'Disconnect';
|
||||||
|
Tag := 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.IdTCPClientConnected(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Append('Established connection to ' + txtHost.Text + ':' + txtPort.Text, clGreen);
|
||||||
|
SetStatus('connected', clGreen);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.IdTCPClientDisconnected(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Append('Disconnected from ' + txtHost.Text + ':' + txtPort.Text, clMaroon);
|
||||||
|
EnableControls(True);
|
||||||
|
SetStatus('not connected', clRed);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.FormClose(Sender: TObject;
|
||||||
|
var Action: TCloseAction);
|
||||||
|
begin
|
||||||
|
if Tag = 1 then
|
||||||
|
cmdConnect.Click;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.rtfEnterKeyPress(Sender: TObject;
|
||||||
|
var Key: Char);
|
||||||
|
begin
|
||||||
|
if Tag = 1 then begin
|
||||||
|
if (Key = #13) and (rtfEnter.Text <> '') then begin
|
||||||
|
if IdTCPClient.Connected then
|
||||||
|
IdTCPClient.WriteLn(rtfEnter.Text)
|
||||||
|
else
|
||||||
|
IdUDPClient.Send(rtfEnter.Text);
|
||||||
|
Append(rtfEnter.Text, clNavy);
|
||||||
|
rtfEnter.Clear;
|
||||||
|
Key := #0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.IdUDPClientStatus(ASender: TObject;
|
||||||
|
const AStatus: TIdStatus; const AStatusText: String);
|
||||||
|
begin
|
||||||
|
Append(AStatusText, clGray);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.acCopyExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (ActiveControl is TRichEdit) then
|
||||||
|
TRichEdit(ActiveControl).CopyToClipboard;
|
||||||
|
if (ActiveControl is TFlatEdit) then
|
||||||
|
TFlatEdit(ActiveControl).CopyToClipboard;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.acPasteExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (ActiveControl is TRichEdit) then
|
||||||
|
TRichEdit(ActiveControl).PasteFromClipboard;
|
||||||
|
if (ActiveControl is TFlatEdit) then
|
||||||
|
TFlatEdit(ActiveControl).PasteFromClipboard;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.acUndoExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (ActiveControl is TRichEdit) then
|
||||||
|
TRichEdit(ActiveControl).Undo;
|
||||||
|
if (ActiveControl is TFlatEdit) then
|
||||||
|
TFlatEdit(ActiveControl).Undo;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmSocketTerminal.acSelectAllExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (ActiveControl is TRichEdit) then
|
||||||
|
TRichEdit(ActiveControl).SelectAll;
|
||||||
|
if (ActiveControl is TFlatEdit) then
|
||||||
|
TFlatEdit(ActiveControl).SelectAll;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user