diff --git a/Build/GZBuilder.default.cfg b/Build/GZBuilder.default.cfg
index 791a228c..febc41ea 100644
--- a/Build/GZBuilder.default.cfg
+++ b/Build/GZBuilder.default.cfg
@@ -171,52 +171,6 @@ shortcuts
}
-colors
-{
- color0 = -16777216;
- color1 = -11425537;
- color2 = -1;
- color3 = -4259937;
- color4 = -3750145;
- color5 = -21504;
- color6 = -49152;
- color7 = -128;
- color8 = -12171706;
- color9 = -13018769;
- color10 = -16711681;
- color11 = -24576;
- color12 = -49152;
- color13 = -1;
- color14 = -4144960;
- color15 = -16777216;
- color16 = -6908266;
- color17 = -16753716;
- color18 = -11366857;
- color19 = -6671822;
- color20 = -9868951;
- color21 = -12490271;
- color22 = -14513374;
- color23 = -14634326;
- color24 = -5103070;
- color25 = -7077677;
- color26 = -4684277;
- color27 = -4144960;
- color28 = -8355712;
- color29 = -16728065;
- color30 = -13447886;
- color31 = -5247250;
- color32 = -40121;
- color33 = -1146130;
- color34 = -256;
- color35 = -657931;
- color36 = -18751;
- color37 = -29696;
- color38 = -4343957;
- color39 = -2448096;
- color40 = -65536;
-}
-
-
mainwindow
{
positionx = 150;
diff --git a/Build/Scintilla.dll b/Build/Scintilla.dll
deleted file mode 100644
index c5c68798..00000000
Binary files a/Build/Scintilla.dll and /dev/null differ
diff --git a/Build/ScintillaNET.3.5.dll b/Build/ScintillaNET.3.5.dll
new file mode 100644
index 00000000..555afd43
Binary files /dev/null and b/Build/ScintillaNET.3.5.dll differ
diff --git a/Build/Scripting/BCS.cfg b/Build/Scripting/BCS.cfg
index e81a1a47..ca51e2ca 100644
--- a/Build/Scripting/BCS.cfg
+++ b/Build/Scripting/BCS.cfg
@@ -16,6 +16,10 @@ insertcase = 0; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35; // CPP-style, case-insensitive
functionopen = "(";
functionclose = ")";
+codeblockopen = "{";
+codeblockclose = "}";
+arrayopen = "[";
+arrayclose = "]";
argumentdelimiter = ",";
terminator = ";";
keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K";
diff --git a/Build/Scripting/GZDoom_MODELDEF.cfg b/Build/Scripting/GZDoom_MODELDEF.cfg
index a47f8cdd..9d80b9e5 100644
--- a/Build/Scripting/GZDoom_MODELDEF.cfg
+++ b/Build/Scripting/GZDoom_MODELDEF.cfg
@@ -7,6 +7,8 @@ description = "GZDoom MODELDEF";
codepage = 0;
extensions = "mdd";
casesensitive = false;
+codeblockopen = "{";
+codeblockclose = "}";
insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35; // CPP-style, case-insensitive
keywordhelp = "http://zdoom.org/wiki/MODELDEF";
diff --git a/Build/Scripting/Hexen_ACS.cfg b/Build/Scripting/Hexen_ACS.cfg
index c3f98640..e46257db 100644
--- a/Build/Scripting/Hexen_ACS.cfg
+++ b/Build/Scripting/Hexen_ACS.cfg
@@ -16,6 +16,10 @@ insertcase = 0; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35; // CPP-style, case-insensitive
functionopen = "(";
functionclose = ")";
+codeblockopen = "{";
+codeblockclose = "}";
+arrayopen = "[";
+arrayclose = "]";
argumentdelimiter = ",";
terminator = ";";
keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K";
diff --git a/Build/Scripting/ZDoom_ACS.cfg b/Build/Scripting/ZDoom_ACS.cfg
index e932dad6..412fbed2 100644
--- a/Build/Scripting/ZDoom_ACS.cfg
+++ b/Build/Scripting/ZDoom_ACS.cfg
@@ -16,6 +16,10 @@ insertcase = 0; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35; // CPP-style, case-insensitive
functionopen = "(";
functionclose = ")";
+codeblockopen = "{";
+codeblockclose = "}";
+arrayopen = "[";
+arrayclose = "]";
argumentdelimiter = ",";
terminator = ";";
keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K";
@@ -24,12 +28,12 @@ scripttype = 1; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate
keywords
{
- #Define = "#Define identifier expression";
- #EncryptStrings = "#EncryptStrings";
- #Import = "#Import";
- #Include = "#Include";
- #LibDefine = "#LibDefine identifier expression";
- #Library = "#Library";
+ #define = "#Define identifier expression";
+ #encryptstrings = "#EncryptStrings";
+ #import = "#Import";
+ #include = "#Include";
+ #libdefine = "#LibDefine identifier expression";
+ #library = "#Library";
#NoCompact = "#NoCompact";
#NoWadAuthor = "#NoWadAuthor";
#WadAuthor = "#WadAuthor";
@@ -59,11 +63,11 @@ keywords
//BlueScore = "BlueScore()";
//BlueTeamCount = "BlueTeamCount()";
//BlueTeamScore = "BlueTeamScore()";
- Bool = "Bool expression";
- Break = "Break";
+ bool = "Bool expression";
+ break = "Break";
CancelFade = "void CancelFade(void)\nIf either FadeTo or FadeRange is currently in progress,\nCancelFade stops it and turns off the palette flash.";
CanRaiseActor = "bool CanRaiseActor(int tid)\nChecks to see if the actor or actors with the specified tid are viable for resurrection.\nIf tid is 0, the check is done on the activator of the script.";
- Case = "Case expression";
+ case = "Case expression";
Ceiling_CrushAndRaise = "Ceiling_CrushAndRaise(tag, speed, crush, crushmode)";
Ceiling_CrushAndRaiseA = "Ceiling_CrushAndRaiseA(tag, dspeed, uspeed, crush, crushmode)";
Ceiling_CrushAndRaiseDist = "Ceiling_CrushAndRaiseDist(tag, dist, speed, damage, crushmode)";
@@ -113,16 +117,16 @@ keywords
ClearInventory = "void ClearInventory(void)\nClears the player's inventory of weapons, ammo, armor and usable items.";
ClearLineSpecial = "void ClearLineSpecial(void)\nClears the special of the line that activated the script.";
//ConsoleCommand = "void ConsoleCommand(str command)";
- Const = "const";
- Continue = "continue";
- cos = "fixed Cos(int angle)";
+ const = "const";
+ continue = "continue";
+ Cos = "fixed Cos(int angle)";
CreateTranslation = "void CreateTranslation(int transnumber, a:b=c:d, ...)";
DamageThing = "DamageThing(amount, mod)";
- Death = "Script expression Death";
- Default = "default:";
+ DEATH = "Script expression Death";
+ default = "default:";
Delay = "void Delay(int tics)";
- Disconnect = "Script expression Disconnect";
- Do = "do";
+ DISCONNECT = "Script expression Disconnect";
+ do = "do";
Door_Animated = "Door_Animated(tag, speed, delay, lock)";
Door_Close = "Door_Close(tag, speed, lighttag)";
Door_CloseWaitOpen = "Door_CloseWaitOpen(tag, speed, delay, lighttag)";
@@ -134,8 +138,8 @@ keywords
Elevator_LowerToNearest = "Elevator_LowerToNearest(tag, speed)";
Elevator_MoveToFloor = "Elevator_MoveToFloor(tag, speed)";
Elevator_RaiseToNearest = "Elevator_RaiseToNearest(tag, speed)";
- Else = "Else";
- Enter = "Script expression Enter";
+ else = "Else";
+ ENTER = "Script expression Enter";
Exit_Normal = "Exit_Normal(pos)";
Exit_Secret = "Exit_Secret(pos)";
FadeRange = "void FadeRange(int red1, int green1, int blue1, fixed amount1, int red2, int green2, int blue2, fixed amount2, fixed seconds)\nSets the current flash to the first color set and then fades it to the second color set over the specified number of seconds.";
@@ -170,10 +174,10 @@ keywords
FloorAndCeiling_LowerByValue = "FloorAndCeiling_LowerByValue(tag, speed, height)";
FloorAndCeiling_LowerRaise = "FloorAndCeiling_LowerRaise(tag, fspeed, cspeed, boomemu)";
FloorAndCeiling_RaiseByValue = "FloorAndCeiling_RaiseByValue(tag, speed, height)";
- For = "for(initialization, condition, iteration)";
+ for = "for(initialization, condition, iteration)";
ForceField = "ForceField";
FS_Execute = "FS_Execute(script, side, keynum, message)";
- Function = "function void expression(void)";
+ function = "function void expression(void)";
GameSkill = "int GameSkill(void)";
GameType = "int GameType(void)";
Generic_Ceiling = "Generic_Ceiling(tag, speed, height, target, flag)";
@@ -242,8 +246,8 @@ keywords
HealThing = "HealThing(amount)";
HudMessage = "void hudmessage(s:text; int type, int id, int color, fixed x, fixed y, fixed holdTime)";
HudMessageBold = "void HudMessageBold(s:text; int type, int id, int color, fixed x, fixed y, fixed holdTime)";
- If = "if(expression)";
- Int = "int expression";
+ if = "if(expression)";
+ int = "int expression";
//IsMultiplayer = "int IsMultiplayer(void)";
//IsOneFlagCTF = "int IsOneFlagCTF(void)";
IsPointerEqual = "bool IsPointerEqual(int ptr_select1, int ptr_select2[, int tid1[, int tid2]])";
@@ -260,7 +264,7 @@ keywords
Light_Stop = "Light_Stop(tag)";
Light_Strobe = "Light_Strobe(tag, upper, lower, u-tics, l-tics)";
Light_StrobeDoom = "Light_StrobeDoom(tag, u-tics, l-tics)";
- Lightning = "Script expression Lightning";
+ LIGHTNING = "Script expression Lightning";
LineAttack = "LineAttack(int tid, fixed angle, fixed pitch, int damage[, str pufftype = 'BulletPuff'[, str damagetype = 'None'[, fixed range = 2048[, int flags = 0[, int pufftid = 0]]]]])\nFires a hitscan attack. If tid is 0, the activator of the script is the source of the attack.";
Line_AlignCeiling = "Line_AlignCeiling(lineid, side)";
Line_AlignFloor = "Line_AlignFloor(lineid, side)";
@@ -273,11 +277,11 @@ keywords
Log = "void Log(type:expression)\nLog will print something in the log area of the screen (top left), as well as logging it to the console.\nIt uses the same parameter format as the Print function.";
MorphActor = "int MorphActor(int tid, [str playerclass, [str monsterclass, [int duration, [int style, [str morphflash, [str unmorphflash]]]]]])";
NamedScriptWait = "void NamedScriptWait(str script)";
- Net = "Script expression Net";
+ NET = "Script expression Net";
NoiseAlert = "NoiseAlert(target_tid, emiter_tid)";
- Open = "Script expression Open";
+ OPEN = "Script expression Open";
PickActor = "bool PickActor(int source_tid, fixed angle, fixed pitch, fixed distance, int tid[, int actorMask = MF_SHOOTABLE[, int wallMask = ML_BLOCKEVERYTHING | ML_BLOCKHITSCAN[, bool forcetid = false]]])";
- Pickup = "Script expression Pickup";
+ //PICKUP = "Script expression Pickup";
Pillar_Build = "Pillar_Build(tag, speed, height)";
Pillar_BuildAndCrush = "Pillar_BuildAndCrush(tag, speed, height, crush, crushmode)";
Pillar_Open = "Pillar_Open(tag, speed, fdist, cdist)";
@@ -324,10 +328,10 @@ keywords
Radius_Quake2 = "void Radius_Quake2(int tid, int intensity, int duration, int damrad, int tremrad, str sound)";
Random = "int Random(int min, int max)";
ReplaceTextures = "void ReplaceTextures(str oldtexturename, str newtexturename[, int flags])\nReplaces all occurences of oldtexturename with newtexturename.\nNOT_ flags can be used.";
- Respawn = "Script expression Respawn";
+ RESPAWN = "Script expression Respawn";
Restart = "Restart";
- Return = "Return";
- Script = "Script expression";
+ return = "Return";
+ script = "Script expression";
ScriptWait = "void ScriptWait(int script)";
Scroll_Ceiling = "Scroll_Ceiling(tag, x-move, y-move, unused)";
Scroll_Floor = "Scroll_Floor(tag, x-move, y-move, type)";
@@ -400,7 +404,7 @@ keywords
SetUserCVarString = "bool SetUserCVarString(int playernumber, str cvar, str value)\nSets the console variable of a particular player.\nOnly mod-defined console variables through CVARINFO can be changed by using this function.\nReturns FALSE if cvar is invalid, it is not writable, or the player doesn't exist.";
SetUserVariable = "void SetUserVariable(int tid, str name, int value)\nSets one of the affected actor's user variables.";
SetWeapon = "bool SetWeapon(str weaponname)\nSets the player's current weapon to weaponname.\nReturns TRUE if the weapon was set successfully, and FALSE if not.";
- sin = "fixed Sin(int angle)";
+ Sin = "fixed Sin(int angle)";
SoundSequence = "void SoundSequence(str sndseq)\nPlays a sound sequence defined in SNDSEQ lump.";
SoundSequenceOnActor = "void SoundSequenceOnActor(int tid, str sndseq)\nPlays a sound sequence defined in SNDSEQ lump.";
SoundSequenceOnPolyObj = "void SoundSequenceOnPolyobj(int polynum, str sndseq)\nPlays a sound sequence defined in SNDSEQ lump.";
@@ -435,7 +439,7 @@ keywords
StrRight = "str StrRight(str string, int length)\nCreates a new string containing the length last characters of string.\nIf string does not exist, an empty string is returned.\nIf string is shorter than length characters, the entire string is returned.";
Suspend = "Suspend";
SwapActorTeleFog = "int SwapActorTeleFog(int tid)";
- Switch = "Switch(expression)";
+ switch = "Switch(expression)";
TagWait = "void TagWait(int tag)";
TakeActorInventory = "void TakeActorInventory(int tid, str inventory_item, int amount)\nThis function will take the amount of items from the specified actor.\nTakeActorInventory can remove items that are flagged as undroppable.";
TakeInventory = "void TakeInventory(str inventory_item, int amount)\nThis function will take the number of items specified from the activator.\nTakeInventory can remove items that are flagged as undroppable.";
@@ -482,19 +486,19 @@ keywords
Timer = "int Timer(void)";
TranslucentLine = "TranslucentLine(lineid, amount, additive, moreflags)";
UniqueTID = "int UniqueTID([int tid[, int limit]])";
- Unloading = "Script expression Unloading";
+ UNLOADING = "Script expression Unloading";
UnMorphActor = "int UnMorphActor(int tid[, bool force])";
- Until = "Until(expression)";
+ until = "Until(expression)";
UseActorInventory = "int UseActorInventory(int tid, str classname)\nForces the actor(s) with the specified tid to use an item from their inventory, if they have one.\nReturns TRUE if the item was used successfully.";
UseInventory = "int UseInventory(str classname)\nForces the activator to use the specified inventory item, if he has it.\nReturns TRUE if the item was used successfully.";
UsePuzzleItem = "UsePuzzleItem(item, script, arg1, arg2, arg3)";
VectorAngle = "fixed VectorAngle(int x, int y)";
VectorLength = "int VectorLength(int x, int y)";
- Void = "void";
+ void = "void";
Warp = "bool Warp(int destinationtid, fixed xofs, fixed yofs, fixed zofs, int angle, int flags[, str success_state[, bool exactstate[, fixed heightoffset]]])";
- While = "while(expression)";
- WhiteReturn = "Script expression WhiteReturn";
- World = "World Int expression:identifier";
+ while = "while(expression)";
+ //WHITERETURN = "Script expression WhiteReturn";
+ world = "World Int expression:identifier";
}
constants
diff --git a/Build/Scripting/ZDoom_DECORATE.cfg b/Build/Scripting/ZDoom_DECORATE.cfg
index 5d20d2c2..cd4a403c 100644
--- a/Build/Scripting/ZDoom_DECORATE.cfg
+++ b/Build/Scripting/ZDoom_DECORATE.cfg
@@ -11,6 +11,10 @@ insertcase = 0; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35;
functionopen = "(";
functionclose = ")";
+codeblockopen = "{";
+codeblockclose = "}";
+arrayopen = "[";
+arrayclose = "]";
argumentdelimiter = ",";
terminator = ";";
keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K";
@@ -127,7 +131,7 @@ keywords
A_CheckFloor = "A_CheckFloor(int offset OR str state)";
A_CheckFlag = "A_CheckFlag(str flagname, state label[, int check_pointer = AAPTR_DEFAULT])";
A_CheckLOF = "A_CheckLOF(state jump[, int flags = 0[, float range = 0.0[, float minrange = 0.0[, float angle = 0.0[, float pitch = 0.0[, float offsetheight = 0.0[, float offsetwidth = 0.0[, int ptr_target = AAPTR_DEFAULT]]]]]]]])";
- A_CheckProximity = "A_CheckProximity(str \"jump\", str classname, float distance[, int count = 1[, int flags = 0[, int pointer]]])";
+ A_CheckProximity = "A_CheckProximity(str jump, str classname, float distance[, int count = 1[, int flags = 0[, int pointer = AAPTR_DEFAULT]]])";
A_CheckRange = "A_CheckRange(float distance, int offset OR str state[, bool 2d_check])";
A_CheckSight = "A_CheckSight(int offset OR str state)";
A_CheckSightOrRange = "A_CheckSightOrRange(float distance, int offset OR str state[, bool 2d_check])";
@@ -1204,6 +1208,13 @@ constants
CPXF_DEADONLY;
CPXF_LESSOREQUAL;
CPXF_EXACT;
+ CPXF_CHECKSIGHT;
+ CPXF_SETTARGET;
+ CPXF_SETMASTER;
+ CPXF_SETTRACER;
+ CPXF_FARTHEST;
+ CPXF_CLOSEST;
+ CPXF_SETONPTR;
//A_FaceTraget/Master/Tracer flags
FAF_BOTTOM;
FAF_MIDDLE;
diff --git a/Build/Scripting/ZDoom_USDF.cfg b/Build/Scripting/ZDoom_USDF.cfg
index 70a00c4c..2d1d0b5b 100644
--- a/Build/Scripting/ZDoom_USDF.cfg
+++ b/Build/Scripting/ZDoom_USDF.cfg
@@ -9,6 +9,8 @@ extensions = "txt";
casesensitive = false;
insertcase = 1; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35; // CPP-style, case-insensitive
+codeblockopen = "{";
+codeblockclose = "}";
terminator = ";";
keywords
diff --git a/Build/Scripting/Zandronum_ACS.cfg b/Build/Scripting/Zandronum_ACS.cfg
index 5eafa8e4..cbb4c53d 100644
--- a/Build/Scripting/Zandronum_ACS.cfg
+++ b/Build/Scripting/Zandronum_ACS.cfg
@@ -16,6 +16,10 @@ insertcase = 0; // 0=Normal, 1=Lowercase, 2=Uppercase
lexer = 35; // CPP-style, case-insensitive
functionopen = "(";
functionclose = ")";
+codeblockopen = "{";
+codeblockclose = "}";
+arrayopen = "[";
+arrayclose = "]";
argumentdelimiter = ",";
terminator = ";";
keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K";
diff --git a/Build/Snippets/acs/switch.txt b/Build/Snippets/acs/switch.txt
new file mode 100644
index 00000000..7424d777
--- /dev/null
+++ b/Build/Snippets/acs/switch.txt
@@ -0,0 +1,3 @@
+switch ([EP])[LB]{
+
+}
\ No newline at end of file
diff --git a/Setup/gzbuilder_setup.iss b/Setup/gzbuilder_setup.iss
index b3e96696..f4106400 100644
--- a/Setup/gzbuilder_setup.iss
+++ b/Setup/gzbuilder_setup.iss
@@ -44,7 +44,7 @@ Source: Updater.ini; DestDir: {app}; Flags: ignoreversion
Source: Refmanual.chm; DestDir: {app}; Flags: ignoreversion
Source: DevIL.dll; DestDir: {app}; Flags: ignoreversion
Source: SharpCompress.3.5.dll; DestDir: {app}; Flags: ignoreversion
-Source: Scintilla.dll; DestDir: {app}; Flags: ignoreversion
+Source: ScintillaNET.3.5.dll; DestDir: {app}; Flags: ignoreversion
Source: SlimDX.dll; DestDir: {app}; Flags: ignoreversion
Source: GPL.txt; DestDir: {app}; Flags: ignoreversion
Source: Compilers\*; DestDir: {app}\Compilers; Flags: ignoreversion recursesubdirs
diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj
index 7c15a1b2..82e4ce1d 100644
--- a/Source/Core/Builder.csproj
+++ b/Source/Core/Builder.csproj
@@ -122,19 +122,9 @@
ArgumentBox.cs
-
- UserControl
-
-
- ScriptEditorControl.cs
-
Component
-
-
- Component
-
UserControl
@@ -534,6 +524,9 @@
+
+ False
+
False
@@ -698,7 +691,9 @@
-
+
+ ScriptEditorControl.cs
+
@@ -766,6 +761,12 @@
PasteOptionsControl.cs
+
+ UserControl
+
+
+ ScriptEditorControl.cs
+
UserControl
@@ -1128,6 +1129,13 @@
+
+
+
+
+
+
+
@@ -1201,9 +1209,6 @@
-
-
-
@@ -1219,10 +1224,6 @@
-
- Designer
- ScriptEditorControl.cs
-
diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs
index ef6afab4..6ef7a991 100644
--- a/Source/Core/Config/ProgramConfiguration.cs
+++ b/Source/Core/Config/ProgramConfiguration.cs
@@ -66,6 +66,7 @@ namespace CodeImp.DoomBuilder.Config
private bool scriptfontbold;
private bool scriptontop;
private bool scriptautoindent;
+ private bool scriptusetabs; //mxd
private bool snippetsallmanstyle; //mxd
private string screenshotspath; //mxd
private int scripttabwidth;
@@ -162,6 +163,7 @@ namespace CodeImp.DoomBuilder.Config
public int ZoomFactor { get { return zoomfactor; } internal set { zoomfactor = value; } }
public bool ShowErrorsWindow { get { return showerrorswindow; } internal set { showerrorswindow = value; } }
public bool AnimateVisualSelection { get { return animatevisualselection; } internal set { animatevisualselection = value; } }
+ public bool ScriptUseTabs { get { return scriptusetabs; } internal set { scriptusetabs = value; } } //mxd
public int ScriptTabWidth { get { return scripttabwidth; } internal set { scripttabwidth = value; } }
public bool ScriptAutoIndent { get { return scriptautoindent; } internal set { scriptautoindent = value; } }
public bool SnippetsAllmanStyle { get { return snippetsallmanstyle; } internal set { snippetsallmanstyle = value; } } //mxd
@@ -268,13 +270,14 @@ namespace CodeImp.DoomBuilder.Config
movespeed = cfg.ReadSetting("movespeed", 100);
viewdistance = cfg.ReadSetting("viewdistance", 3000.0f);
invertyaxis = cfg.ReadSetting("invertyaxis", false);
- scriptfontname = cfg.ReadSetting("scriptfontname", "Lucida Console");
+ scriptfontname = cfg.ReadSetting("scriptfontname", "Courier New");
scriptfontsize = cfg.ReadSetting("scriptfontsize", 10);
scriptfontbold = cfg.ReadSetting("scriptfontbold", false);
scriptautoindent = cfg.ReadSetting("scriptautoindent", true);
snippetsallmanstyle = cfg.ReadSetting("snippetsallmanstyle", false); //mxd
screenshotspath = cfg.ReadSetting("screenshotspath", General.DefaultScreenshotsPath); //mxd
scriptontop = cfg.ReadSetting("scriptontop", true);
+ scriptusetabs = cfg.ReadSetting("scriptusetabs", true); //mxd
scripttabwidth = cfg.ReadSetting("scripttabwidth", 4);
previewimagesize = cfg.ReadSetting("previewimagesize", 1);
autoscrollspeed = cfg.ReadSetting("autoscrollspeed", 0);
@@ -368,6 +371,7 @@ namespace CodeImp.DoomBuilder.Config
cfg.WriteSetting("scriptfontsize", scriptfontsize);
cfg.WriteSetting("scriptfontbold", scriptfontbold);
cfg.WriteSetting("scriptontop", scriptontop);
+ cfg.WriteSetting("scriptusetabs", scriptusetabs); //mxd
cfg.WriteSetting("scripttabwidth", scripttabwidth);
cfg.WriteSetting("scriptautoindent", scriptautoindent);
cfg.WriteSetting("snippetsallmanstyle", snippetsallmanstyle); //mxd
diff --git a/Source/Core/Config/ScriptConfiguration.cs b/Source/Core/Config/ScriptConfiguration.cs
index 80e93897..e7b59c44 100644
--- a/Source/Core/Config/ScriptConfiguration.cs
+++ b/Source/Core/Config/ScriptConfiguration.cs
@@ -21,6 +21,7 @@ using System.Collections;
using System.Collections.Generic;
using System.IO;
using CodeImp.DoomBuilder.IO;
+using ScintillaNET;
#endregion
@@ -54,21 +55,27 @@ namespace CodeImp.DoomBuilder.Config
private readonly string[] extensions;
private readonly bool casesensitive;
private readonly int insertcase;
- private readonly int lexer;
+ private readonly Lexer lexer;
private readonly string keywordhelp;
private readonly string functionopen;
private readonly string functionclose;
+ private readonly string codeblockopen; //mxd
+ private readonly string codeblockclose; //mxd
+ private readonly string arrayopen; //mxd
+ private readonly string arrayclose; //mxd
private readonly string argumentdelimiter;
private readonly string terminator;
- private readonly string functionregex;
private readonly ScriptType scripttype; //mxd
// Collections
private readonly Dictionary keywords;
private readonly Dictionary lowerkeywords;
+ private readonly List keywordkeyssorted; //mxd
private readonly List constants;
private readonly Dictionary lowerconstants;
private readonly Dictionary snippets; //mxd
+ private readonly HashSet snippetkeyssorted; //mxd
+ private readonly HashSet braces; //mxd
#endregion
@@ -85,19 +92,23 @@ namespace CodeImp.DoomBuilder.Config
public string[] Extensions { get { return extensions; } }
public bool CaseSensitive { get { return casesensitive; } }
public int InsertCase { get { return insertcase; } }
- public int Lexer { get { return lexer; } }
+ public Lexer Lexer { get { return lexer; } }
public string KeywordHelp { get { return keywordhelp; } }
public string FunctionOpen { get { return functionopen; } }
public string FunctionClose { get { return functionclose; } }
+ public string CodeBlockOpen { get { return codeblockopen; } } //mxd
+ public string CodeBlockClose { get { return codeblockclose; } } //mxd
+ public string ArrayOpen { get { return arrayopen; } } //mxd
+ public string ArrayClose { get { return arrayclose; } } //mxd
public string ArgumentDelimiter { get { return argumentdelimiter; } }
public string Terminator { get { return terminator; } }
- public string FunctionRegEx { get { return functionregex; } }
public ScriptType ScriptType { get { return scripttype; } } //mxd
- public Dictionary Snippets { get { return snippets; } } //mxd
// Collections
- public ICollection Keywords { get { return keywords.Keys; } }
+ public ICollection Keywords { get { return keywordkeyssorted; } }
public ICollection Constants { get { return constants; } }
+ public ICollection Snippets { get { return snippetkeyssorted; } }
+ public HashSet BraceChars { get { return braces; } } //mxd
#endregion
@@ -112,9 +123,13 @@ namespace CodeImp.DoomBuilder.Config
this.constants = new List();
this.lowerkeywords = new Dictionary(StringComparer.Ordinal);
this.lowerconstants = new Dictionary(StringComparer.Ordinal);
+ this.keywordkeyssorted = new List(); //mxd
+ this.snippets = new Dictionary(StringComparer.OrdinalIgnoreCase); //mxd
+ this.snippetkeyssorted = new HashSet(); //mxd
+ this.braces = new HashSet(); //mxd
// Settings
- lexer = 1;
+ lexer = Lexer.Null;
casesensitive = false;
codepage = 65001;
parameters = "";
@@ -123,13 +138,15 @@ namespace CodeImp.DoomBuilder.Config
keywordhelp = "";
functionopen = "";
functionclose = "";
+ codeblockopen = ""; //mxd
+ codeblockclose = ""; //mxd
+ arrayopen = ""; //mxd
+ arrayclose = ""; //mxd
argumentdelimiter = "";
terminator = "";
- functionregex = "";
description = "Plain text";
scripttype = ScriptType.UNKNOWN; //mxd
extensions = new[] { "txt" };
- snippets = new Dictionary(StringComparer.Ordinal); //mxd
}
// Constructor
@@ -140,7 +157,10 @@ namespace CodeImp.DoomBuilder.Config
this.constants = new List();
this.lowerkeywords = new Dictionary(StringComparer.Ordinal);
this.lowerconstants = new Dictionary(StringComparer.Ordinal);
- this.snippets = new Dictionary(StringComparer.Ordinal); //mxd
+ this.keywordkeyssorted = new List(); //mxd
+ this.snippets = new Dictionary(StringComparer.OrdinalIgnoreCase); //mxd
+ this.snippetkeyssorted = new HashSet(); //mxd
+ this.braces = new HashSet(); //mxd
// Read settings
description = cfg.ReadSetting("description", "Untitled script");
@@ -151,14 +171,25 @@ namespace CodeImp.DoomBuilder.Config
resultlump = cfg.ReadSetting("resultlump", "");
casesensitive = cfg.ReadSetting("casesensitive", true);
insertcase = cfg.ReadSetting("insertcase", 0);
- lexer = cfg.ReadSetting("lexer", 0);
+ lexer = (Lexer)cfg.ReadSetting("lexer", (int)Lexer.Container);
keywordhelp = cfg.ReadSetting("keywordhelp", "");
functionopen = cfg.ReadSetting("functionopen", "");
functionclose = cfg.ReadSetting("functionclose", "");
+ codeblockopen = cfg.ReadSetting("codeblockopen", ""); //mxd
+ codeblockclose = cfg.ReadSetting("codeblockclose", ""); //mxd
+ arrayopen = cfg.ReadSetting("arrayopen", ""); //mxd
+ arrayclose = cfg.ReadSetting("arrayclose", ""); //mxd
argumentdelimiter = cfg.ReadSetting("argumentdelimiter", "");
terminator = cfg.ReadSetting("terminator", "");
- functionregex = cfg.ReadSetting("functionregex", "");
scripttype = (ScriptType)cfg.ReadSetting("scripttype", (int)ScriptType.UNKNOWN); //mxd
+
+ //mxd. Make braces array
+ if(!string.IsNullOrEmpty(functionopen)) braces.Add(functionopen[0]);
+ if(!string.IsNullOrEmpty(functionclose)) braces.Add(functionclose[0]);
+ if(!string.IsNullOrEmpty(codeblockopen)) braces.Add(codeblockopen[0]);
+ if(!string.IsNullOrEmpty(codeblockclose)) braces.Add(codeblockclose[0]);
+ if(!string.IsNullOrEmpty(arrayopen)) braces.Add(arrayopen[0]);
+ if(!string.IsNullOrEmpty(arrayclose)) braces.Add(arrayclose[0]);
// Make extensions array
extensions = extensionsstring.Split(',');
@@ -170,7 +201,11 @@ namespace CodeImp.DoomBuilder.Config
{
keywords.Add(de.Key.ToString(), de.Value.ToString());
lowerkeywords.Add(de.Key.ToString().ToLowerInvariant(), de.Key.ToString());
+ keywordkeyssorted.Add(de.Key.ToString()); //mxd
}
+
+ //mxd. Sort keywords lookup
+ keywordkeyssorted.Sort();
// Load constants
dic = cfg.ReadSetting("constants", new Hashtable());
@@ -179,6 +214,48 @@ namespace CodeImp.DoomBuilder.Config
constants.Add(de.Key.ToString());
lowerconstants.Add(de.Key.ToString().ToLowerInvariant(), de.Key.ToString());
}
+
+ //mxd
+ constants.Sort();
+
+ //mxd. Load Snippets
+ string snippetsdir = cfg.ReadSetting("snippetsdir", "");
+ if(!string.IsNullOrEmpty(snippetsdir))
+ {
+ string snippetspath = Path.Combine(General.SnippetsPath, snippetsdir);
+ if(Directory.Exists(snippetspath))
+ {
+ string[] files = Directory.GetFiles(snippetspath, "*.txt", SearchOption.TopDirectoryOnly);
+ List sortedkeys = new List();
+
+ foreach(string file in files)
+ {
+ string name = Path.GetFileNameWithoutExtension(file);
+ if(string.IsNullOrEmpty(name))
+ {
+ General.ErrorLogger.Add(ErrorType.Warning, "Failed to load snippet '" + file + "' for '" + description + "' script configuration.");
+ }
+ else
+ {
+ if(name.Contains(" ")) name = name.Replace(' ', '_');
+ string[] lines = File.ReadAllLines(file);
+ if(lines.Length > 0)
+ {
+ snippets.Add(name, lines);
+ sortedkeys.Add(name);
+ }
+ else
+ {
+ General.ErrorLogger.Add(ErrorType.Warning, "Failed to load snippet '" + file + "' for '" + description + "' script configuration: file is empty!");
+ }
+ }
+ }
+
+ //mxd. Sort snippets lookup
+ sortedkeys.Sort();
+ snippetkeyssorted = new HashSet(sortedkeys, StringComparer.OrdinalIgnoreCase);
+ }
+ }
// Compiler specified?
if(compilername.Length > 0)
@@ -198,38 +275,6 @@ namespace CodeImp.DoomBuilder.Config
// No compiler found?
if(this.compiler == null) throw new Exception("No such compiler defined: '" + compilername + "'");
}
-
- //mxd. Load Snippets
- string snippetsdir = cfg.ReadSetting("snippetsdir", "");
- if(!string.IsNullOrEmpty(snippetsdir))
- {
- string snippetspath = Path.Combine(General.SnippetsPath, snippetsdir);
- if(Directory.Exists(snippetspath))
- {
- string[] files = Directory.GetFiles(snippetspath, "*.txt", SearchOption.TopDirectoryOnly);
-
- foreach(string file in files)
- {
- string name = Path.GetFileNameWithoutExtension(file);
- if(name.Contains(" "))
- {
- General.ErrorLogger.Add(ErrorType.Warning, "Failed to load snippet '" + file + "' for '" + description + "' script configuration: snippet file name must not contain spaces!");
- }
- else
- {
- string[] lines = File.ReadAllLines(file);
- if(lines.Length > 0)
- {
- snippets.Add(name, lines);
- }
- else
- {
- General.ErrorLogger.Add(ErrorType.Warning, "Failed to load snippet '" + file + "' for '" + description + "' script configuration: file is empty!");
- }
- }
- }
- }
- }
}
#endregion
@@ -279,6 +324,12 @@ namespace CodeImp.DoomBuilder.Config
return null;
}
+ //mxd
+ public string[] GetSnippet(string name)
+ {
+ return (snippetkeyssorted.Contains(name) ? snippets[name] : null);
+ }
+
// This sorts by description
public int CompareTo(ScriptConfiguration other)
{
diff --git a/Source/Core/Controls/ScriptDocumentTab.cs b/Source/Core/Controls/ScriptDocumentTab.cs
index 98acbd0a..bd7b5daf 100644
--- a/Source/Core/Controls/ScriptDocumentTab.cs
+++ b/Source/Core/Controls/ScriptDocumentTab.cs
@@ -20,13 +20,13 @@ using System;
using System.IO;
using System.Collections.Generic;
using System.Drawing;
-using System.Text;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Windows;
using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.Compilers;
using CodeImp.DoomBuilder.GZBuilder.Data;
using CodeImp.DoomBuilder.GZBuilder.GZDoom;
+using ScintillaNET;
#endregion
@@ -36,8 +36,7 @@ namespace CodeImp.DoomBuilder.Controls
{
#region ================== Constants
- private const int NAVIGATOR_BORDER_TOP = 8; //mxd
- private const int EDITOR_BORDER_TOP = 33;
+ private const int EDITOR_BORDER_TOP = 4;
private const int EDITOR_BORDER_BOTTOM = 4;
private const int EDITOR_BORDER_LEFT = 4;
private const int EDITOR_BORDER_RIGHT = 4;
@@ -48,7 +47,6 @@ namespace CodeImp.DoomBuilder.Controls
// The script edit control
protected readonly ScriptEditorControl editor;
- protected readonly ComboBox navigator; //mxd
private bool preventchanges; //mxd
private string title; //mxd
@@ -68,10 +66,14 @@ namespace CodeImp.DoomBuilder.Controls
public virtual bool IsReconfigurable { get { return true; } }
public virtual string Filename { get { return null; } }
public ScriptEditorPanel Panel { get { return panel; } }
- public new string Text { get { return title; } } //mxd
- public bool IsChanged { get { return editor.IsChanged; } internal set { editor.IsChanged = value; } } //mxd. Added setter
+ internal Scintilla Scintilla { get { return editor.Scintilla; } } //mxd
+ public string Title { get { return title; } } //mxd
+ public bool IsChanged { get { return editor.IsChanged; } }
public int SelectionStart { get { return editor.SelectionStart; } set { editor.SelectionStart = value; } }
public int SelectionEnd { get { return editor.SelectionEnd; } set { editor.SelectionEnd = value; } }
+ public bool ShowWhitespace { get { return editor.ShowWhitespace; } set { editor.ShowWhitespace = value; } } //mxd
+ public bool WrapLongLines { get { return editor.WrapLongLines; } set { editor.WrapLongLines = value; } } //mxd
+ public string SelectedText { get { return editor.SelectedText; } } //mxd
public ScriptConfiguration Config { get { return config; } }
#endregion
@@ -89,19 +91,6 @@ namespace CodeImp.DoomBuilder.Controls
{
// Keep panel
this.panel = panel;
-
- //mxd
- navigator = new ComboBox();
- navigator.Location = new Point(EDITOR_BORDER_LEFT, NAVIGATOR_BORDER_TOP);
- navigator.Width = this.ClientSize.Width - EDITOR_BORDER_LEFT - EDITOR_BORDER_RIGHT;
- navigator.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
- navigator.DropDownStyle = ComboBoxStyle.DropDownList;
- navigator.Name = "navigator";
- navigator.TabStop = true;
- navigator.TabIndex = 0;
- navigator.DropDown += navigator_DropDown;
- navigator.SelectedIndexChanged += navigator_SelectedIndexChanged;
- this.Controls.Add(navigator);
// Make the script control
editor = new ScriptEditorControl();
@@ -121,6 +110,11 @@ namespace CodeImp.DoomBuilder.Controls
editor.OnFindNext += panel.FindNext;
editor.OnFindPrevious += panel.FindPrevious; //mxd
editor.OnTextChanged += editor_TextChanged; //mxd
+
+ //mxd. Bind functionbar events
+ editor.FunctionBar.DropDown += functionbar_DropDown;
+ editor.FunctionBar.SelectedIndexChanged += functionbar_SelectedIndexChanged;
+
}
// Disposer
@@ -263,112 +257,13 @@ namespace CodeImp.DoomBuilder.Controls
// Find next result
public bool FindNext(FindReplaceOptions options, bool useselectionstart)
{
- byte[] data = editor.GetText();
- string text = Encoding.GetEncoding(config.CodePage).GetString(data);
- StringComparison mode = options.CaseSensitive ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase;
- int startpos = (useselectionstart ? Math.Min(editor.SelectionStart, editor.SelectionEnd) : Math.Max(editor.SelectionStart, editor.SelectionEnd)); //mxd
- bool wrapped = false;
-
- while(true)
- {
- int result = text.IndexOf(options.FindText, startpos, mode);
- if(result > -1)
- {
- // Check to see if it is the whole word
- if(options.WholeWord)
- {
- // Veryfy that we have found a whole word
- string foundword = editor.GetWordAt(result + 1);
- if(foundword.Length != options.FindText.Length)
- {
- startpos = result + 1;
- result = -1;
- }
- }
-
- // Still ok?
- if(result > -1)
- {
- // Select the result
- editor.SelectionStart = result;
- editor.SelectionEnd = result + options.FindText.Length;
- editor.EnsureLineVisible(editor.LineFromPosition(editor.SelectionEnd));
- return true;
- }
- }
- else
- {
- // If we haven't tried from the start, try from the start now
- if((startpos > 0) && !wrapped)
- {
- startpos = 0;
- wrapped = true;
- }
- else
- {
- // Can't find it
- return false;
- }
- }
- }
+ return editor.FindNext(options, useselectionstart);
}
// Find previous result (mxd)
- public bool FindPrevious(FindReplaceOptions options)
+ public bool FindPrevious(FindReplaceOptions options)
{
- bool wrapped = false;
- byte[] data = editor.GetText();
- string text = Encoding.GetEncoding(config.CodePage).GetString(data);
- StringComparison mode = options.CaseSensitive ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase;
- int endpos = Math.Min(editor.SelectionStart, editor.SelectionEnd) - 1;
- if(endpos < 0)
- {
- endpos = text.Length - 1;
- wrapped = true;
- }
-
- while(true)
- {
- int result = text.LastIndexOf(options.FindText, endpos, mode);
- if(result > -1)
- {
- // Check to see if it is the whole word
- if(options.WholeWord)
- {
- // Veryfy that we have found a whole word
- string foundword = editor.GetWordAt(result + 1);
- if(foundword.Length != options.FindText.Length)
- {
- endpos = result - 1;
- result = -1;
- }
- }
-
- // Still ok?
- if(result > -1)
- {
- // Select the result
- editor.SelectionStart = result;
- editor.SelectionEnd = result + options.FindText.Length;
- editor.EnsureLineVisible(editor.LineFromPosition(editor.SelectionEnd));
- return true;
- }
- }
- else
- {
- // If we haven't tried from the end, try from the end now
- if(!wrapped)
- {
- endpos = Math.Max(0, text.Length - 2);
- wrapped = true;
- }
- else
- {
- // Can't find it
- return false;
- }
- }
- }
+ return editor.FindPrevious(options);
}
// This replaces the selection with the given text
@@ -376,20 +271,13 @@ namespace CodeImp.DoomBuilder.Controls
{
editor.ReplaceSelection(replacement);
}
-
- // This returns the selected text
- public string GetSelectedText()
- {
- byte[] data = editor.GetText();
- string text = Encoding.GetEncoding(config.CodePage).GetString(data);
- if(editor.SelectionStart < editor.SelectionEnd)
- return text.Substring(editor.SelectionStart, editor.SelectionEnd - editor.SelectionStart);
- return "";
- }
//mxd
- protected void UpdateNavigator()
+ protected void UpdateNavigator()
{
+ // Store currently selected item name
+ string prevtext = editor.FunctionBar.Text;
+
switch(config.ScriptType)
{
case ScriptType.ACS:
@@ -405,16 +293,33 @@ namespace CodeImp.DoomBuilder.Controls
break;
default: // Unsupported script type. Just clear the items
- navigator.Items.Clear();
+ editor.FunctionBar.Items.Clear();
break;
}
// Put some text in the navigator (but don't actually trigger selection event)
- navigator.Enabled = (navigator.Items.Count > 0);
- if(navigator.Items.Count > 0)
+ editor.FunctionBar.Enabled = (editor.FunctionBar.Items.Count > 0);
+ if(editor.FunctionBar.Items.Count > 0)
{
preventchanges = true;
- navigator.Text = navigator.Items[0].ToString();
+
+ // Put the text back if we still have the corresponding item
+ if(!string.IsNullOrEmpty(prevtext))
+ {
+ foreach(var item in editor.FunctionBar.Items)
+ {
+ if(item.ToString() == prevtext)
+ {
+ editor.FunctionBar.Text = item.ToString();
+ break;
+ }
+ }
+ }
+
+ // No dice. Use the first item
+ if(string.IsNullOrEmpty(editor.FunctionBar.Text))
+ editor.FunctionBar.Text = editor.FunctionBar.Items[0].ToString();
+
preventchanges = false;
}
}
@@ -423,12 +328,12 @@ namespace CodeImp.DoomBuilder.Controls
private void UpdateNavigatorDecorate(MemoryStream stream)
{
if(stream == null) return;
- navigator.Items.Clear();
+ editor.FunctionBar.Items.Clear();
DecorateParserSE parser = new DecorateParserSE();
if(parser.Parse(stream, "DECORATE", false))
{
- navigator.Items.AddRange(parser.Actors.ToArray());
+ editor.FunctionBar.Items.AddRange(parser.Actors.ToArray());
}
if(parser.HasError)
@@ -441,12 +346,12 @@ namespace CodeImp.DoomBuilder.Controls
private void UpdateNavigatorModeldef(MemoryStream stream)
{
if(stream == null) return;
- navigator.Items.Clear();
+ editor.FunctionBar.Items.Clear();
ModeldefParserSE parser = new ModeldefParserSE();
if(parser.Parse(stream, "MODELDEF", false))
{
- navigator.Items.AddRange(parser.Models.ToArray());
+ editor.FunctionBar.Items.AddRange(parser.Models.ToArray());
}
if(parser.HasError)
@@ -459,14 +364,14 @@ namespace CodeImp.DoomBuilder.Controls
private void UpdateNavigatorAcs(MemoryStream stream)
{
if(stream == null) return;
- navigator.Items.Clear();
+ editor.FunctionBar.Items.Clear();
AcsParserSE parser = new AcsParserSE { AddArgumentsToScriptNames = true, IsMapScriptsLump = this is ScriptLumpDocumentTab };
if(parser.Parse(stream, "SCRIPTS", false))
{
- navigator.Items.AddRange(parser.NamedScripts.ToArray());
- navigator.Items.AddRange(parser.NumberedScripts.ToArray());
- navigator.Items.AddRange(parser.Functions.ToArray());
+ editor.FunctionBar.Items.AddRange(parser.NamedScripts.ToArray());
+ editor.FunctionBar.Items.AddRange(parser.NumberedScripts.ToArray());
+ editor.FunctionBar.Items.AddRange(parser.Functions.ToArray());
}
if(parser.HasError)
@@ -494,9 +399,16 @@ namespace CodeImp.DoomBuilder.Controls
}
//mxd
- internal void InsertSnippet(string[] lines)
+ internal void InsertSnippet(string name)
{
- editor.InsertSnippet(lines);
+ string[] lines = config.GetSnippet(name);
+ if(lines != null) editor.InsertSnippet(lines);
+ }
+
+ //mxd
+ internal void IndentSelection(bool indent)
+ {
+ editor.IndentSelection(indent);
}
#endregion
@@ -524,11 +436,11 @@ namespace CodeImp.DoomBuilder.Controls
}
//mxd
- private void navigator_SelectedIndexChanged(object sender, EventArgs e)
+ private void functionbar_SelectedIndexChanged(object sender, EventArgs e)
{
- if(!preventchanges && navigator.SelectedItem is ScriptItem)
+ if(!preventchanges && editor.FunctionBar.SelectedItem is ScriptItem)
{
- ScriptItem si = navigator.SelectedItem as ScriptItem;
+ ScriptItem si = editor.FunctionBar.SelectedItem as ScriptItem;
editor.EnsureLineVisible(editor.LineFromPosition(si.CursorPosition));
editor.SelectionStart = si.CursorPosition;
editor.SelectionEnd = si.CursorPosition;
@@ -540,7 +452,7 @@ namespace CodeImp.DoomBuilder.Controls
}
//mxd
- private void navigator_DropDown(object sender, EventArgs e)
+ private void functionbar_DropDown(object sender, EventArgs e)
{
if(!preventchanges && editor.IsChanged) UpdateNavigator();
}
diff --git a/Source/Core/Controls/ScriptEditorControl.Designer.cs b/Source/Core/Controls/ScriptEditorControl.Designer.cs
index 17499de3..f1123f59 100644
--- a/Source/Core/Controls/ScriptEditorControl.Designer.cs
+++ b/Source/Core/Controls/ScriptEditorControl.Designer.cs
@@ -28,109 +28,37 @@ namespace CodeImp.DoomBuilder.Controls
///
private void InitializeComponent()
{
- this.functionbar = new System.Windows.Forms.ComboBox();
- this.scriptedit = new CodeImp.DoomBuilder.Controls.ScintillaControl();
+ this.scriptedit = new ScintillaNET.Scintilla();
this.scriptpanel = new System.Windows.Forms.Panel();
+ this.functionbar = new System.Windows.Forms.ComboBox();
this.scriptpanel.SuspendLayout();
this.SuspendLayout();
//
- // functionbar
- //
- this.functionbar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.functionbar.FormattingEnabled = true;
- this.functionbar.Items.AddRange(new object[] {
- "Function1",
- "Function2",
- "Function3"});
- this.functionbar.Location = new System.Drawing.Point(0, 0);
- this.functionbar.Name = "functionbar";
- this.functionbar.Size = new System.Drawing.Size(474, 21);
- this.functionbar.TabIndex = 1;
- this.functionbar.TabStop = false;
- //
// scriptedit
//
- this.scriptedit.AnchorPosition = 0;
- this.scriptedit.AutoCMaximumHeight = 0;
- this.scriptedit.AutoCMaximumWidth = 0;
- this.scriptedit.AutoCSeparator = 0;
- this.scriptedit.AutoCTypeSeparator = 0;
- this.scriptedit.BackColor = System.Drawing.SystemColors.Window;
- this.scriptedit.CaretFore = 0;
- this.scriptedit.CaretLineBack = 0;
- this.scriptedit.CaretPeriod = 0;
- this.scriptedit.CaretWidth = 0;
- this.scriptedit.CodePage = 0;
- this.scriptedit.ControlCharSymbol = 0;
- this.scriptedit.CurrentPos = 0;
- this.scriptedit.CursorType = 0;
+ this.scriptedit.AutoCIgnoreCase = true;
+ this.scriptedit.AutoCMaxHeight = 12;
+ this.scriptedit.AutoCOrder = ScintillaNET.Order.Custom;
+ this.scriptedit.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.scriptedit.CaretWidth = 2;
this.scriptedit.Dock = System.Windows.Forms.DockStyle.Fill;
- this.scriptedit.DocPointer = 0;
- this.scriptedit.EdgeColour = 0;
- this.scriptedit.EdgeColumn = 0;
- this.scriptedit.EdgeMode = 0;
- this.scriptedit.EndAtLastLine = 0;
- this.scriptedit.EndOfLineMode = CodeImp.DoomBuilder.Controls.ScriptEndOfLine.CRLF;
- this.scriptedit.EOLMode = 0;
- this.scriptedit.ExtraAscent = 0;
- this.scriptedit.ExtraDescent = 0;
- this.scriptedit.HighlightGuide = 0;
- this.scriptedit.Indent = 0;
- this.scriptedit.IndentationGuides = 0;
- this.scriptedit.IsAutoCGetAutoHide = false;
- this.scriptedit.IsAutoCGetCancelAtStart = false;
- this.scriptedit.IsAutoCGetChooseSingle = false;
- this.scriptedit.IsAutoCGetDropRestOfWord = false;
- this.scriptedit.IsAutoCGetIgnoreCase = false;
- this.scriptedit.IsBackSpaceUnIndents = false;
- this.scriptedit.IsBufferedDraw = false;
- this.scriptedit.IsCaretLineVisible = false;
- this.scriptedit.IsFocus = false;
- this.scriptedit.IsHScrollBar = false;
- this.scriptedit.IsMouseDownCaptures = false;
- this.scriptedit.IsOvertype = false;
- this.scriptedit.IsReadOnly = false;
- this.scriptedit.IsTabIndents = false;
- this.scriptedit.IsTwoPhaseDraw = false;
- this.scriptedit.IsUndoCollection = false;
- this.scriptedit.IsUsePalette = false;
- this.scriptedit.IsUseTabs = false;
- this.scriptedit.IsViewEOL = false;
- this.scriptedit.IsVScrollBar = false;
- this.scriptedit.LayoutCache = 0;
- this.scriptedit.Lexer = 0;
+ this.scriptedit.ExtraAscent = 1;
+ this.scriptedit.ExtraDescent = 1;
+ this.scriptedit.FontQuality = ScintillaNET.FontQuality.LcdOptimized;
this.scriptedit.Location = new System.Drawing.Point(0, 0);
- this.scriptedit.MarginLeft = 0;
- this.scriptedit.MarginRight = 0;
- this.scriptedit.ModEventMask = 0;
- this.scriptedit.MouseDwellTime = 0;
this.scriptedit.Name = "scriptedit";
- this.scriptedit.PrintColourMode = 0;
- this.scriptedit.PrintMagnification = 0;
- this.scriptedit.PrintWrapMode = 0;
- this.scriptedit.ScrollWidth = 0;
- this.scriptedit.SearchFlags = 0;
- this.scriptedit.SelectionEnd = 0;
- this.scriptedit.SelectionMode = 0;
- this.scriptedit.SelectionStart = 0;
- this.scriptedit.Size = new System.Drawing.Size(470, 377);
- this.scriptedit.Status = 0;
- this.scriptedit.StyleBits = 0;
+ this.scriptedit.ScrollWidth = 200;
+ this.scriptedit.Size = new System.Drawing.Size(474, 381);
this.scriptedit.TabIndex = 0;
this.scriptedit.TabStop = false;
- this.scriptedit.TabWidth = 0;
- this.scriptedit.TargetEnd = 0;
- this.scriptedit.TargetStart = 0;
- this.scriptedit.ViewWhitespace = CodeImp.DoomBuilder.Controls.ScriptWhiteSpace.Invisible;
- this.scriptedit.ViewWS = 0;
- this.scriptedit.WrapMode = 0;
- this.scriptedit.WrapStartIndent = 0;
- this.scriptedit.WrapVisualFlags = 0;
- this.scriptedit.WrapVisualFlagsLocation = 0;
- this.scriptedit.XOffset = 0;
- this.scriptedit.ZoomLevel = 0;
+ this.scriptedit.UseTabs = true;
+ this.scriptedit.WhitespaceSize = 2;
+ this.scriptedit.TextChanged += new System.EventHandler(this.scriptedit_TextChanged);
+ this.scriptedit.CharAdded += new System.EventHandler(this.scriptedit_CharAdded);
+ this.scriptedit.AutoCCompleted += new System.EventHandler(this.scriptedit_AutoCCompleted);
+ this.scriptedit.InsertCheck += new System.EventHandler(this.scriptedit_InsertCheck);
this.scriptedit.KeyUp += new System.Windows.Forms.KeyEventHandler(this.scriptedit_KeyUp);
+ this.scriptedit.UpdateUI += new System.EventHandler(this.scriptedit_UpdateUI);
this.scriptedit.KeyDown += new System.Windows.Forms.KeyEventHandler(this.scriptedit_KeyDown);
//
// scriptpanel
@@ -138,13 +66,24 @@ namespace CodeImp.DoomBuilder.Controls
this.scriptpanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
- this.scriptpanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.scriptpanel.Controls.Add(this.scriptedit);
this.scriptpanel.Location = new System.Drawing.Point(0, 27);
this.scriptpanel.Name = "scriptpanel";
this.scriptpanel.Size = new System.Drawing.Size(474, 381);
this.scriptpanel.TabIndex = 2;
//
+ // functionbar
+ //
+ this.functionbar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.functionbar.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.functionbar.FormattingEnabled = true;
+ this.functionbar.Location = new System.Drawing.Point(0, 0);
+ this.functionbar.Name = "functionbar";
+ this.functionbar.Size = new System.Drawing.Size(474, 21);
+ this.functionbar.TabIndex = 2;
+ this.functionbar.TabStop = false;
+ //
// ScriptEditorControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
@@ -160,8 +99,8 @@ namespace CodeImp.DoomBuilder.Controls
#endregion
- private ScintillaControl scriptedit;
- private System.Windows.Forms.ComboBox functionbar;
+ private ScintillaNET.Scintilla scriptedit;
private System.Windows.Forms.Panel scriptpanel;
+ private System.Windows.Forms.ComboBox functionbar;
}
}
diff --git a/Source/Core/Controls/ScriptEditorControl.cs b/Source/Core/Controls/ScriptEditorControl.cs
index 687c2a5d..1e8037a8 100644
--- a/Source/Core/Controls/ScriptEditorControl.cs
+++ b/Source/Core/Controls/ScriptEditorControl.cs
@@ -17,17 +17,19 @@
#region ================== Namespaces
using System;
+using System.Collections;
using System.Collections.Generic;
+using System.Drawing;
+using System.Globalization;
+using System.IO;
using System.Text;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Config;
-using System.IO;
using CodeImp.DoomBuilder.IO;
-using System.Collections;
-using System.Globalization;
using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.Properties;
using CodeImp.DoomBuilder.Windows;
+using ScintillaNET;
#endregion
@@ -35,11 +37,19 @@ namespace CodeImp.DoomBuilder.Controls
{
internal partial class ScriptEditorControl : UserControl
{
- #region ================== Constants
-
- private const string LEXERS_RESOURCE = "Lexers.cfg";
- private const int DEFAULT_STYLE = (int)ScriptStylesCommon.Default;
- private const int MAX_BACKTRACK_LENGTH = 200;
+ #region ================== Enums
+
+ private enum ScriptStyleType
+ {
+ PlainText = 0,
+ Keyword = 1,
+ Constant = 2,
+ Comment = 3,
+ Literal = 4,
+ LineNumber = 5,
+ String = 6, //mxd
+ Include = 7, //mxd
+ }
// Index for registered images
private enum ImageIndex
@@ -49,6 +59,14 @@ namespace CodeImp.DoomBuilder.Controls
ScriptError = 2,
ScriptSnippet = 3, //mxd
}
+
+ #endregion
+
+ #region ================== Constants
+
+ private const string LEXERS_RESOURCE = "Lexers.cfg";
+ private const int MAX_BACKTRACK_LENGTH = 200;
+ private const int HIGHLIGHT_INDICATOR = 8; //mxd. Indicators 0-7 could be in use by a lexer so we'll use indicator 8 to highlight words.
#endregion
@@ -74,8 +92,8 @@ namespace CodeImp.DoomBuilder.Controls
// Script configuration
private ScriptConfiguration scriptconfig;
- // List of keywords and constants, sorted as uppercase
- private string autocompletestring;
+ // List of keywords and constants
+ private List autocompletelist;
// Style translation from Scintilla style to ScriptStyleType
private Dictionary stylelookup;
@@ -84,19 +102,27 @@ namespace CodeImp.DoomBuilder.Controls
private string curfunctionname = "";
private int curargumentindex;
private int curfunctionstartpos;
-
- // Status
- private bool changed;
+ private int linenumbercharlength; //mxd. Current max number of chars in the line number
+ private int lastcaretpos; //mxd. Used in brace matching
+ private int caretoffset; //mxd. Used to modify caret position after autogenerating stuff
+ private bool skiptextinsert; //mxd. Gross hacks
+ private bool expandcodeblock; //mxd. More gross hacks
+ private string highlightedword; //mxd
#endregion
#region ================== Properties
- public bool IsChanged { get { return changed; } set { changed = value; } }
- public int Position { get { return scriptedit.CurrentPos; } set { scriptedit.CurrentPos = value; } }
+ public bool IsChanged { get { return scriptedit.Modified; } }
public int SelectionStart { get { return scriptedit.SelectionStart; } set { scriptedit.SelectionStart = value; } }
public int SelectionEnd { get { return scriptedit.SelectionEnd; } set { scriptedit.SelectionEnd = value; } }
-
+ public new string Text { get { return scriptedit.Text; } set { scriptedit.Text = value; } } //mxd
+ public string SelectedText { get { return scriptedit.SelectedText; } } //mxd
+ public bool ShowWhitespace { get { return scriptedit.ViewWhitespace != WhitespaceMode.Invisible; } set { scriptedit.ViewWhitespace = value ? WhitespaceMode.VisibleAlways : WhitespaceMode.Invisible; } }
+ public bool WrapLongLines { get { return scriptedit.WrapMode != WrapMode.None; } set { scriptedit.WrapMode = (value ? WrapMode.Char : WrapMode.None); } }
+ public ComboBox FunctionBar { get { return functionbar; } } //mxd
+ public Scintilla Scintilla { get { return scriptedit; } } //mxd
+
#endregion
#region ================== Contructor / Disposer
@@ -108,53 +134,28 @@ namespace CodeImp.DoomBuilder.Controls
InitializeComponent();
// Script editor properties
- // Unfortunately, these cannot be set using the designer
- // because the control is not really loaded in design mode
- scriptedit.AutoCMaximumHeight = 8;
- scriptedit.AutoCSeparator = ' ';
- scriptedit.AutoCTypeSeparator = '?';
- scriptedit.AutoCSetFillUps("\r\n();[]"); // I should put this in the script configs
- scriptedit.CaretWidth = 2;
- scriptedit.EndAtLastLine = 1;
- scriptedit.EndOfLineMode = ScriptEndOfLine.CRLF;
- scriptedit.IsAutoCGetChooseSingle = true;
- scriptedit.IsAutoCGetIgnoreCase = true;
- scriptedit.IsBackSpaceUnIndents = true;
- scriptedit.IsBufferedDraw = true;
- scriptedit.IsCaretLineVisible = false;
- scriptedit.IsHScrollBar = true;
- scriptedit.IndentationGuides = (int)ScriptIdentGuides.None;
- scriptedit.IsMouseDownCaptures = true;
- scriptedit.IsTabIndents = true;
- scriptedit.IsUndoCollection = true;
- scriptedit.IsUseTabs = true;
- scriptedit.IsViewEOL = false;
- scriptedit.IsVScrollBar = true;
- scriptedit.SetFoldFlags((int)ScriptFoldFlag.Box);
- scriptedit.TabWidth = 4;
- scriptedit.Indent = 4;
- scriptedit.ExtraAscent = 1;
- scriptedit.ExtraDescent = 1;
- scriptedit.CursorType = -1;
+ //TODO: use ScintillaNET properties instead when they become available
+ scriptedit.DirectMessage(NativeMethods.SCI_SETBACKSPACEUNINDENTS, new IntPtr(1));
+ scriptedit.DirectMessage(NativeMethods.SCI_SETMOUSEDOWNCAPTURES, new IntPtr(1));
+ scriptedit.DirectMessage(NativeMethods.SCI_SETTABINDENTS, new IntPtr(1));
// Symbol margin
- scriptedit.SetMarginTypeN(0, (int)ScriptMarginType.Symbol);
- scriptedit.SetMarginWidthN(0, 20);
- scriptedit.SetMarginMaskN(0, -1); // all
+ scriptedit.Margins[0].Type = MarginType.Symbol;
+ scriptedit.Margins[0].Width = 20;
+ scriptedit.Margins[0].Mask = 1 << (int)ImageIndex.ScriptError; // Error marker only
+ scriptedit.Margins[0].Cursor = MarginCursor.Arrow;
+ scriptedit.Margins[0].Sensitive = true;
// Line numbers margin
- scriptedit.SetMarginTypeN(1, (int)ScriptMarginType.Number);
- scriptedit.SetMarginWidthN(1, 40);
- scriptedit.SetMarginMaskN(1, 0); // none
+ scriptedit.Margins[1].Type = MarginType.Number;
+ scriptedit.Margins[1].Width = 16;
+ scriptedit.Margins[1].Mask = 0; // No markers here
// Spacing margin
- scriptedit.SetMarginTypeN(2, (int)ScriptMarginType.Symbol);
- scriptedit.SetMarginWidthN(2, 5);
- scriptedit.SetMarginMaskN(2, 0); // none
-
- // Setup with default script config
- // Disabled, the form designer doesn't like this
- //SetupStyles(new ScriptConfiguration());
+ scriptedit.Margins[2].Type = MarginType.Symbol;
+ scriptedit.Margins[2].Width = 5;
+ scriptedit.Margins[2].Cursor = MarginCursor.Arrow;
+ scriptedit.Margins[2].Mask = 0; // No markers here
// Images
RegisterAutoCompleteImage(ImageIndex.ScriptConstant, Resources.ScriptConstant);
@@ -162,17 +163,42 @@ namespace CodeImp.DoomBuilder.Controls
RegisterAutoCompleteImage(ImageIndex.ScriptSnippet, Resources.ScriptSnippet); //mxd
RegisterMarkerImage(ImageIndex.ScriptError, Resources.ScriptError);
- // Events
- scriptedit.ModEventMask = 0x7FFFF; // Which events to receive (see also ScriptModificationFlags)
- scriptedit.TextDeleted += scriptedit_TextChanged; //mxd
- scriptedit.TextInserted += scriptedit_TextChanged; //mxd
- scriptedit.UndoPerformed += scriptedit_UndoRedoPerformed; //mxd
- scriptedit.RedoPerformed += scriptedit_UndoRedoPerformed; //mxd
+ //mxd. These key combinations put odd characters in the script. Let's disable them
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Q, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.W, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.E, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.R, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Y, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.U, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.I, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.P, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.A, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.D, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.G, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.H, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.J, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.K, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.L, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.Z, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.X, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.C, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.V, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.B, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.N, Command.Null);
+ scriptedit.AssignCmdKey(Keys.Control | Keys.M, Command.Null);
+
+ //mxd. These key combinations are used to perform special actions. Let's disable them
+ scriptedit.AssignCmdKey(Keys.F3, Command.Null); // F3 for Find Next
+ scriptedit.AssignCmdKey(Keys.F2, Command.Null); // F2 for Find Previous
+ scriptedit.AssignCmdKey(Keys.Control | Keys.F, Command.Null); // CTRL+F for find & replace
+ scriptedit.AssignCmdKey(Keys.Control | Keys.S, Command.Null); // CTRL+S for save
+ scriptedit.AssignCmdKey(Keys.Control | Keys.O, Command.Null); // CTRL+O for open
+ scriptedit.AssignCmdKey(Keys.Control | Keys.Space, Command.Null); // CTRL+Space to autocomplete <- TODO: this doesn't seem to work...
}
#endregion
- #region ================== Methods
+ #region ================== Public methods
// This launches keyword help website
public bool LaunchKeywordHelp()
@@ -186,40 +212,38 @@ namespace CodeImp.DoomBuilder.Controls
General.OpenWebsite(helpsite);
return true;
}
+
return !string.IsNullOrEmpty(helpsite); //mxd
}
// This replaces the selection with the given text
public void ReplaceSelection(string replacement)
{
- Encoding encoder = Encoding.GetEncoding(scriptedit.CodePage);
- string text = encoder.GetString(GetText());
- int selectionstart = scriptedit.SelectionStart;
-
- // Make new text
- StringBuilder newtext = new StringBuilder(text.Length + replacement.Length);
- newtext.Append(text.Substring(0, scriptedit.SelectionStart));
- newtext.Append(replacement);
- newtext.Append(text.Substring(scriptedit.SelectionEnd));
-
- SetText(encoder.GetBytes(newtext.ToString()));
-
- // Adjust selection
- scriptedit.SelectionStart = selectionstart;
- scriptedit.SelectionEnd = selectionstart + replacement.Length;
+ scriptedit.ReplaceSelection(replacement); //mxd TODO: encoding check/conversion?
}
// This moves the caret to a given line and ensures the line is visible
public void MoveToLine(int linenumber)
{
- scriptedit.GotoLine(linenumber);
+ scriptedit.Lines[linenumber].Goto();
EnsureLineVisible(linenumber);
}
// This makes sure a line is visible
public void EnsureLineVisible(int linenumber)
{
- scriptedit.EnsureVisibleEnforcePolicy(linenumber);
+ // Determine target lines range
+ int startline = Math.Max(0, linenumber - 4);
+ int endline = Math.Min(scriptedit.Lines.Count, Math.Max(linenumber, linenumber + scriptedit.LinesOnScreen - 6));
+
+ // Go to target line
+ scriptedit.ShowLines(startline, endline);
+
+ // We may want to do some scrolling...
+ if(scriptedit.FirstVisibleLine >= startline)
+ scriptedit.Lines[startline].Goto();
+ else if(scriptedit.FirstVisibleLine + scriptedit.LinesOnScreen <= endline)
+ scriptedit.Lines[endline].Goto();
}
// This returns the line for a position
@@ -237,7 +261,7 @@ namespace CodeImp.DoomBuilder.Controls
// This adds a mark on the given line
public void AddMark(int linenumber)
{
- scriptedit.MarkerAdd(linenumber, (int)ImageIndex.ScriptError);
+ scriptedit.Lines[linenumber].MarkerAdd((int)ImageIndex.ScriptError);
}
// This refreshes the style setup
@@ -254,7 +278,7 @@ namespace CodeImp.DoomBuilder.Controls
// Make collections
stylelookup = new Dictionary();
- SortedList autocompletelist = new SortedList(StringComparer.Ordinal);
+ Dictionary autocompletedict = new Dictionary(StringComparer.Ordinal);
// Keep script configuration
scriptconfig = config;
@@ -268,60 +292,78 @@ namespace CodeImp.DoomBuilder.Controls
{
// Get a stream from the resource
Stream lexersdata = General.ThisAssembly.GetManifestResourceStream(rn);
- StreamReader lexersreader = new StreamReader(lexersdata, Encoding.ASCII);
+ if(lexersdata != null)
+ {
+ StreamReader lexersreader = new StreamReader(lexersdata, Encoding.ASCII);
- // Load configuration from stream
- lexercfg.InputConfiguration(lexersreader.ReadToEnd());
+ // Load configuration from stream
+ lexercfg.InputConfiguration(lexersreader.ReadToEnd());
- // Done with the resource
- lexersreader.Dispose();
- lexersdata.Dispose();
+ // Done with the resource
+ lexersreader.Dispose();
+ lexersdata.Dispose();
+ }
+
+ //mxd. We are done here
+ break;
}
}
// Check if specified lexer exists and set the lexer to use
- string lexername = "lexer" + scriptconfig.Lexer.ToString(CultureInfo.InvariantCulture);
+ string lexername = "lexer" + (int)scriptconfig.Lexer;
if(!lexercfg.SettingExists(lexername)) throw new InvalidOperationException("Unknown lexer " + scriptconfig.Lexer + " specified in script configuration!");
scriptedit.Lexer = scriptconfig.Lexer;
// Set the default style and settings
- scriptedit.StyleSetFont(DEFAULT_STYLE, General.Settings.ScriptFontName);
- scriptedit.StyleSetSize(DEFAULT_STYLE, General.Settings.ScriptFontSize);
- scriptedit.StyleSetBold(DEFAULT_STYLE, General.Settings.ScriptFontBold);
- scriptedit.StyleSetItalic(DEFAULT_STYLE, false);
- scriptedit.StyleSetUnderline(DEFAULT_STYLE, false);
- scriptedit.StyleSetCase(DEFAULT_STYLE, ScriptCaseVisible.Mixed);
- scriptedit.StyleSetFore(DEFAULT_STYLE, General.Colors.PlainText.ToInversedColorRef());
- scriptedit.StyleSetBack(DEFAULT_STYLE, General.Colors.ScriptBackground.ToInversedColorRef());
+ scriptedit.Styles[Style.Default].Font = General.Settings.ScriptFontName;
+ scriptedit.Styles[Style.Default].Size = General.Settings.ScriptFontSize;
+ scriptedit.Styles[Style.Default].Bold = General.Settings.ScriptFontBold;
+ scriptedit.Styles[Style.Default].Italic = false;
+ scriptedit.Styles[Style.Default].Underline = false;
+ scriptedit.Styles[Style.Default].Case = StyleCase.Mixed;
+ scriptedit.Styles[Style.Default].ForeColor = General.Colors.PlainText.ToColor();
+ scriptedit.Styles[Style.Default].BackColor = General.Colors.ScriptBackground.ToColor();
scriptedit.CaretPeriod = SystemInformation.CaretBlinkTime;
- scriptedit.CaretFore = General.Colors.ScriptBackground.Inverse().ToInversedColorRef();
- scriptedit.StyleBits = 7;
+ scriptedit.CaretForeColor = General.Colors.ScriptBackground.Inverse().ToColor();
- // These don't work?
+ // Set tabulation settings
+ scriptedit.UseTabs = General.Settings.ScriptUseTabs;
scriptedit.TabWidth = General.Settings.ScriptTabWidth;
- scriptedit.IsUseTabs = false;
- scriptedit.IsTabIndents = true;
- scriptedit.Indent = General.Settings.ScriptTabWidth;
- scriptedit.IsBackSpaceUnIndents = true;
+ //scriptedit.IndentWidth = General.Settings.ScriptTabWidth; // Equals to TabWidth by default
+ //TODO: use ScintillaNET properties instead when they become available
+ scriptedit.DirectMessage(NativeMethods.SCI_SETTABINDENTS, new IntPtr(1));
+ scriptedit.DirectMessage(NativeMethods.SCI_SETBACKSPACEUNINDENTS, new IntPtr(1));
// This applies the default style to all styles
scriptedit.StyleClearAll();
- // Set the code page to use
- scriptedit.CodePage = scriptconfig.CodePage;
+ // Set the code page to use. [mxd] No longer needed?
+ //scriptedit.CodePage = scriptconfig.CodePage;
+ //mxd. We can't change Font or Size here because this will screw displayed tab width (because it's based on character width)...
// Set the default to something normal (this is used by the autocomplete list)
- scriptedit.StyleSetFont(DEFAULT_STYLE, this.Font.Name);
- scriptedit.StyleSetBold(DEFAULT_STYLE, this.Font.Bold);
- scriptedit.StyleSetItalic(DEFAULT_STYLE, this.Font.Italic);
- scriptedit.StyleSetUnderline(DEFAULT_STYLE, this.Font.Underline);
- scriptedit.StyleSetSize(DEFAULT_STYLE, (int)Math.Round(this.Font.SizeInPoints));
-
+ //scriptedit.Styles[Style.Default].Font = this.Font.Name;
+ scriptedit.Styles[Style.Default].Bold = this.Font.Bold;
+ scriptedit.Styles[Style.Default].Italic = this.Font.Italic;
+ scriptedit.Styles[Style.Default].Underline = this.Font.Underline;
+ //scriptedit.Styles[Style.Default].Size = (int)Math.Round(this.Font.SizeInPoints);
+
// Set style for linenumbers and margins
- scriptedit.StyleSetBack((int)ScriptStylesCommon.LineNumber, General.Colors.ScriptBackground.ToInversedColorRef());
+ scriptedit.Styles[Style.LineNumber].BackColor = General.Colors.ScriptBackground.ToColor();
+ //mxd. Set style for (mis)matching braces
+ scriptedit.Styles[Style.BraceLight].BackColor = General.Colors.ScriptBraceHighlight.ToColor(); //Color.Cyan;
+ scriptedit.Styles[Style.BraceBad].BackColor = General.Colors.ScriptBadBraceHighlight.ToColor(); //Color.Red;
+
+ //mxd. Set whitespace color
+ scriptedit.SetWhitespaceForeColor(true, General.Colors.ScriptWhitespace.ToColor());
+
+ //mxd. Set selection colors
+ scriptedit.SetSelectionForeColor(true, General.Colors.ScriptSelectionForeColor.ToColor());
+ scriptedit.SetSelectionBackColor(true, General.Colors.ScriptSelectionBackColor.ToColor());
+
// Clear all keywords
- for(int i = 0; i < 9; i++) scriptedit.KeyWords(i, null);
+ for(int i = 0; i < 9; i++) scriptedit.SetKeywords(i, null);
// Now go for all elements in the lexer configuration
// We are looking for the numeric keys, because these are the
@@ -338,7 +380,8 @@ namespace CodeImp.DoomBuilder.Controls
// Apply color to style
int colorindex;
- switch((ScriptStyleType)(int)de.Value)
+ ScriptStyleType type = (ScriptStyleType)(int)de.Value;
+ switch(type)
{
case ScriptStyleType.PlainText: colorindex = ColorCollection.PLAINTEXT; break;
case ScriptStyleType.Comment: colorindex = ColorCollection.COMMENTS; break;
@@ -346,9 +389,15 @@ namespace CodeImp.DoomBuilder.Controls
case ScriptStyleType.Keyword: colorindex = ColorCollection.KEYWORDS; break;
case ScriptStyleType.LineNumber: colorindex = ColorCollection.LINENUMBERS; break;
case ScriptStyleType.Literal: colorindex = ColorCollection.LITERALS; break;
+ case ScriptStyleType.String: colorindex = ColorCollection.STRINGS; break;
+ case ScriptStyleType.Include: colorindex = ColorCollection.INCLUDES; break;
default: colorindex = ColorCollection.PLAINTEXT; break;
}
- scriptedit.StyleSetFore(stylenum, General.Colors.Colors[colorindex].ToInversedColorRef());
+
+ scriptedit.Styles[stylenum].ForeColor = General.Colors.Colors[colorindex].ToColor();
+
+ //mxd. Display constants as uppercase
+ if(type == ScriptStyleType.Constant) scriptedit.Styles[stylenum].Case = StyleCase.Upper;
}
}
@@ -362,13 +411,13 @@ namespace CodeImp.DoomBuilder.Controls
{
if(keywordslist.Length > 0) keywordslist.Append(" ");
keywordslist.Append(k);
- autocompletelist.Add(k.ToUpperInvariant(), k + "?" + imageindex);
+
+ //mxd. Skip adding the keyword if we have a snippet with the same name
+ if(!scriptconfig.Snippets.Contains(k))
+ autocompletedict.Add(k.ToUpperInvariant(), k + "?" + imageindex);
}
string words = keywordslist.ToString();
- if(scriptconfig.CaseSensitive)
- scriptedit.KeyWords(keywordsindex, words);
- else
- scriptedit.KeyWords(keywordsindex, words.ToLowerInvariant());
+ scriptedit.SetKeywords(keywordsindex, (scriptconfig.CaseSensitive ? words : words.ToLowerInvariant()));
}
// Create the constants list and apply it
@@ -379,7 +428,7 @@ namespace CodeImp.DoomBuilder.Controls
StringBuilder constantslist = new StringBuilder("");
foreach(string c in scriptconfig.Constants)
{
- if(autocompletelist.ContainsKey(c.ToUpperInvariant())) //mxd. This happens when there's a keyword and a constant with the same name...
+ if(autocompletedict.ContainsKey(c.ToUpperInvariant())) //mxd. This happens when there's a keyword and a constant with the same name...
{
General.ErrorLogger.Add(ErrorType.Error, "Constant '" + c + "' is double-defined in '" + scriptconfig.Description + "' script configuration!");
continue;
@@ -387,13 +436,13 @@ namespace CodeImp.DoomBuilder.Controls
if(constantslist.Length > 0) constantslist.Append(" ");
constantslist.Append(c);
- autocompletelist.Add(c.ToUpperInvariant(), c + "?" + imageindex);
+
+ //mxd. Skip adding the constant if we have a snippet with the same name
+ if(!scriptconfig.Snippets.Contains(c))
+ autocompletedict.Add(c.ToUpperInvariant(), c + "?" + imageindex);
}
string words = constantslist.ToString();
- if(scriptconfig.CaseSensitive)
- scriptedit.KeyWords(constantsindex, words);
- else
- scriptedit.KeyWords(constantsindex, words.ToLowerInvariant());
+ scriptedit.SetKeywords(constantsindex, (scriptconfig.CaseSensitive ? words : words.ToLowerInvariant()));
}
//mxd. Create the snippets list and apply it
@@ -402,90 +451,326 @@ namespace CodeImp.DoomBuilder.Controls
if(snippetindex > -1 && scriptconfig.Snippets.Count > 0)
{
StringBuilder snippetslist = new StringBuilder("");
- foreach(string c in scriptconfig.Snippets.Keys)
+ foreach(string c in scriptconfig.Snippets)
{
- if(autocompletelist.ContainsKey(c.ToUpperInvariant())) continue;
+ if(autocompletedict.ContainsKey(c.ToUpperInvariant())) continue;
if(snippetslist.Length > 0) snippetslist.Append(" ");
snippetslist.Append(c);
- autocompletelist.Add(c.ToUpperInvariant(), c + "?" + imageindex);
+ autocompletedict.Add(c.ToUpperInvariant(), c + "?" + imageindex);
}
string words = snippetslist.ToString();
- if(scriptconfig.CaseSensitive)
- scriptedit.KeyWords(snippetindex, words);
- else
- scriptedit.KeyWords(snippetindex, words.ToLowerInvariant());
+ scriptedit.SetKeywords(snippetindex, (scriptconfig.CaseSensitive ? words : words.ToLowerInvariant()));
}
- // Sort the autocomplete list
- List autocompleteplainlist = new List(autocompletelist.Values);
- autocompletestring = string.Join(" ", autocompleteplainlist.ToArray());
-
- // Show/hide the functions bar
- functionbar.Visible = (scriptconfig.FunctionRegEx.Length > 0);
+ // Make autocomplete list
+ autocompletelist = new List(autocompletedict.Values);
+
+ // Setup folding (https://github.com/jacobslusser/ScintillaNET/wiki/Automatic-Code-Folding)
+ if(scriptconfig.Lexer == Lexer.Cpp || scriptconfig.Lexer == Lexer.CppNoCase)
+ {
+ // Instruct the lexer to calculate folding
+ scriptedit.SetProperty("fold", "1");
+ scriptedit.SetProperty("fold.compact", "1");
+
+ // Configure a margin to display folding symbols
+ scriptedit.Margins[2].Type = MarginType.Symbol;
+ scriptedit.Margins[2].Mask = Marker.MaskFolders;
+ scriptedit.Margins[2].Sensitive = true;
+ scriptedit.Margins[2].Width = 12;
+
+ // Set colors for all folding markers
+ for(int i = 25; i < 32; i++)
+ {
+ scriptedit.Markers[i].SetForeColor(SystemColors.ControlLightLight);
+ scriptedit.Markers[i].SetBackColor(SystemColors.ControlDark);
+ }
+
+ // Configure folding markers with respective symbols
+ scriptedit.Markers[Marker.Folder].Symbol = MarkerSymbol.BoxPlus;
+ scriptedit.Markers[Marker.FolderOpen].Symbol = MarkerSymbol.BoxMinus;
+ scriptedit.Markers[Marker.FolderEnd].Symbol = MarkerSymbol.BoxPlusConnected;
+ scriptedit.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
+ scriptedit.Markers[Marker.FolderOpenMid].Symbol = MarkerSymbol.BoxMinusConnected;
+ scriptedit.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
+ scriptedit.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
+
+ // Enable automatic folding
+ scriptedit.AutomaticFold = (AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change);
+ }
+ else
+ {
+ // Disable folding
+ scriptedit.SetProperty("fold", "0");
+ scriptedit.SetProperty("fold.compact", "0");
+
+ scriptedit.Margins[2].Type = MarginType.Symbol;
+ scriptedit.Margins[2].Mask = 0; // No markers here
+ scriptedit.Margins[2].Sensitive = false;
+ scriptedit.Margins[2].Width = 5;
+
+ scriptedit.AutomaticFold = AutomaticFold.None;
+ }
// Rearrange the layout
- bool ischanged = changed; //mxd. Don't want the "changed" status to change when changing text styles
scriptedit.ClearDocumentStyle();
- scriptedit.SetText(scriptedit.GetText(scriptedit.TextSize));
- changed = ischanged; //mxd
this.PerformLayout();
}
-
// This returns the current word (where the caret is at)
public string GetCurrentWord()
{
- return GetWordAt(scriptedit.CurrentPos);
+ return GetWordAt(scriptedit.CurrentPosition);
}
-
// This returns the word at the given position
public string GetWordAt(int position)
{
- int wordstart = scriptedit.WordStartPosition(position, true);
- int wordend = scriptedit.WordEndPosition(position, true);
+ return scriptedit.GetWordFromPosition(position);
+ }
- // Decode the text
- byte[] scripttextdata = scriptedit.GetText(scriptedit.TextSize);
- Encoding encoder = Encoding.GetEncoding(scriptedit.CodePage);
- string scripttext = encoder.GetString(scripttextdata);
+ // Perform undo
+ public void Undo()
+ {
+ scriptedit.Undo();
+ }
- if(wordstart < wordend)
- return scripttext.Substring(wordstart, wordend - wordstart);
- else
- return "";
+ // Perform redo
+ public void Redo()
+ {
+ scriptedit.Redo();
+ }
+
+ // This clears all undo levels
+ public void ClearUndoRedo()
+ {
+ scriptedit.EmptyUndoBuffer();
+ }
+
+ //mxd. This marks the current document as unmodified
+ public void SetSavePoint()
+ {
+ scriptedit.SetSavePoint();
+ }
+
+ // Perform cut
+ public void Cut()
+ {
+ scriptedit.Cut();
+ }
+
+ // Perform copy
+ public void Copy()
+ {
+ scriptedit.Copy();
+ }
+
+ // Perform paste
+ public void Paste()
+ {
+ scriptedit.Paste();
}
-
+ // This steals the focus (use with care!)
+ public void GrabFocus()
+ {
+ scriptedit.Focus();
+ }
+
+ public byte[] GetText()
+ {
+ return Encoding.ASCII.GetBytes(scriptedit.Text); //mxd TODO: other encodings?..
+ }
+
+ public void SetText(byte[] text)
+ {
+ scriptedit.Text = Encoding.ASCII.GetString(text); //mxd TODO: other encodings?..
+ }
+
+ //mxd
+ public void InsertSnippet(string[] lines)
+ {
+ // Insert the snippet
+ int curline = scriptedit.LineFromPosition(scriptedit.SelectionStart);
+ int indent = scriptedit.Lines[scriptedit.CurrentLine].Indentation;
+ string tabs = Environment.NewLine + GetIndentationString(indent);
+ string spaces = new String(' ', General.Settings.ScriptTabWidth);
+ int entrypos = -1;
+ int entryline = -1;
+ string[] processedlines = ProcessLineBreaks(lines);
+
+ // Process special chars, try to find entry position marker
+ for(int i = 0; i < lines.Length; i++)
+ {
+ if(!scriptedit.UseTabs) processedlines[i] = processedlines[i].Replace("\t", spaces);
+
+ // Check if we have the [EP] marker
+ if(entrypos == -1)
+ {
+ int pos = processedlines[i].IndexOf("[EP]", StringComparison.Ordinal);
+ if(pos != -1)
+ {
+ processedlines[i] = processedlines[i].Remove(pos, 4);
+ entryline = curline + i;
+ entrypos = processedlines[i].Length - pos;
+ }
+ }
+ }
+
+ // Replace the text
+ string text = string.Join(tabs, processedlines);
+ scriptedit.SelectionStart = scriptedit.WordStartPosition(scriptedit.CurrentPosition, true);
+ scriptedit.SelectionEnd = scriptedit.WordEndPosition(scriptedit.CurrentPosition, true);
+ scriptedit.ReplaceSelection(text);
+
+ // Move the cursor if we had the [EP] marker
+ if(entrypos != -1)
+ {
+ scriptedit.SetEmptySelection(scriptedit.Lines[entryline].EndPosition - entrypos - 2);
+ }
+ }
+
+ //mxd. Find next result
+ public bool FindNext(FindReplaceOptions options, bool useselectionstart)
+ {
+ int startpos = (useselectionstart ? Math.Min(scriptedit.SelectionStart, scriptedit.SelectionEnd) : Math.Max(scriptedit.SelectionStart, scriptedit.SelectionEnd));
+
+ // Search the document
+ scriptedit.TargetStart = startpos;
+ scriptedit.TargetEnd = scriptedit.TextLength;
+ scriptedit.SearchFlags = options.CaseSensitive ? SearchFlags.MatchCase : SearchFlags.None;
+ if(options.WholeWord) scriptedit.SearchFlags |= SearchFlags.WholeWord;
+
+ int result = scriptedit.SearchInTarget(options.FindText);
+
+ // Wrap around?
+ if(result == -1)
+ {
+ scriptedit.TargetStart = 0;
+ scriptedit.TargetEnd = startpos;
+ result = scriptedit.SearchInTarget(options.FindText);
+ }
+
+ // Found something
+ if(result != -1)
+ {
+ // Select the result
+ SelectAndShow(result, result + options.FindText.Length);
+
+ // Update extra highlights
+ HighlightWord(options.FindText);
+
+ // All done
+ return true;
+ }
+
+ // Nothing found...
+ return false;
+ }
+
+ //mxd. Find previous result
+ public bool FindPrevious(FindReplaceOptions options)
+ {
+ int endpos = Math.Max(0, Math.Min(scriptedit.SelectionStart, scriptedit.SelectionEnd) - 1);
+
+ // Search the document
+ scriptedit.TargetStart = endpos;
+ scriptedit.TargetEnd = 0;
+ scriptedit.SearchFlags = options.CaseSensitive ? SearchFlags.MatchCase : SearchFlags.None;
+ if(options.WholeWord) scriptedit.SearchFlags |= SearchFlags.WholeWord;
+
+ int result = scriptedit.SearchInTarget(options.FindText);
+
+ // Wrap around?
+ if(result == -1)
+ {
+ scriptedit.TargetStart = scriptedit.TextLength;
+ scriptedit.TargetEnd = endpos;
+ result = scriptedit.SearchInTarget(options.FindText);
+ }
+
+ // Found something
+ if(result != -1)
+ {
+ // Select the result
+ SelectAndShow(result, result + options.FindText.Length);
+
+ // Update extra highlights
+ HighlightWord(options.FindText);
+
+ // All done
+ return true;
+ }
+
+ // Nothing found...
+ return false;
+ }
+
+ //mxd
+ private void SelectAndShow(int startpos, int endpos)
+ {
+ // Select the result
+ int startline = scriptedit.LineFromPosition(startpos);
+ int endline = scriptedit.LineFromPosition(endpos);
+
+ // Go to target line
+ scriptedit.ShowLines(startline, endline);
+ scriptedit.GotoPosition(startpos);
+
+ // We may want to do some extra scrolling...
+ if(startline > 1 && scriptedit.FirstVisibleLine >= startline - 1)
+ {
+ scriptedit.Lines[startline - 1].Goto();
+ }
+ else if(endline < scriptedit.Lines.Count - 1 && scriptedit.FirstVisibleLine + scriptedit.LinesOnScreen <= endline + 1)
+ {
+ scriptedit.Lines[endline + 1].Goto();
+ }
+
+ // Update selection
+ scriptedit.SelectionStart = startpos;
+ scriptedit.SelectionEnd = endpos;
+ }
+
+ //mxd. (Un)indents selection
+ public void IndentSelection(bool indent)
+ {
+ // Get selected range of lines
+ int startline = scriptedit.LineFromPosition(scriptedit.SelectionStart);
+ int endline = scriptedit.LineFromPosition(scriptedit.SelectionEnd);
+
+ for(int i = startline; i < endline + 1; i++)
+ {
+ scriptedit.Lines[i].Indentation += (indent ? General.Settings.ScriptTabWidth : -General.Settings.ScriptTabWidth);
+ }
+ }
+
+ #endregion
+
+ #region ================== Utility methods
+
// This returns the ScriptStyleType for a given Scintilla style
private ScriptStyleType GetScriptStyle(int scintillastyle)
{
- if(stylelookup.ContainsKey(scintillastyle))
- return stylelookup[scintillastyle];
- else
- return ScriptStyleType.PlainText;
+ return (stylelookup.ContainsKey(scintillastyle) ? stylelookup[scintillastyle] : ScriptStyleType.PlainText);
}
-
// This gathers information about the current caret position
private void UpdatePositionInfo()
{
int bracketlevel = 0; // bracket level counting
int argindex = 0; // function argument counting
- int pos = scriptedit.CurrentPos;
-
- // Decode the text
- byte[] scripttextdata = scriptedit.GetText(scriptedit.TextSize);
- Encoding encoder = Encoding.GetEncoding(scriptedit.CodePage);
- string scripttext = encoder.GetString(scripttextdata);
-
+ int pos = scriptedit.CurrentPosition;
+
+ // Get the text
+ string scripttext = scriptedit.Text;
+
// Reset position info
curfunctionname = "";
curargumentindex = 0;
curfunctionstartpos = 0;
// Determine lowest backtrack position
- int limitpos = scriptedit.CurrentPos - MAX_BACKTRACK_LENGTH;
+ int limitpos = scriptedit.CurrentPosition - MAX_BACKTRACK_LENGTH;
if(limitpos < 0) limitpos = 0;
// We can only do this when we have function syntax information
@@ -505,8 +790,8 @@ namespace CodeImp.DoomBuilder.Controls
pos--;
// Get the style and character at this position
- ScriptStyleType curstyle = GetScriptStyle(scriptedit.StyleAt(pos));
- int curchar = scriptedit.CharAt(pos);
+ ScriptStyleType curstyle = GetScriptStyle(scriptedit.GetStyleAt(pos));
+ int curchar = scriptedit.GetCharAt(pos);
// Then meeting ) then increase bracket level
// When meeting ( then decrease bracket level
@@ -536,7 +821,7 @@ namespace CodeImp.DoomBuilder.Controls
do
{
// Backtrack 1 character
- curchar = scriptedit.CharAt(--pos);
+ curchar = scriptedit.GetCharAt(--pos);
}
while((pos >= limitpos) && ((curchar == ' ') || (curchar == '\t') ||
(curchar == '\r') || (curchar == '\n')));
@@ -594,120 +879,19 @@ namespace CodeImp.DoomBuilder.Controls
}
}
- // This clears all undo levels
- public void ClearUndoRedo()
+ // This registers an image for the autocomplete list
+ private void RegisterAutoCompleteImage(ImageIndex index, Bitmap image)
{
- scriptedit.EmptyUndoBuffer();
- }
-
- // This registers an XPM image for the autocomplete list
- private void RegisterAutoCompleteImage(ImageIndex index, byte[] imagedata)
- {
- // Convert to string
- string bigstring = Encoding.UTF8.GetString(imagedata);
-
// Register image
- scriptedit.RegisterImage((int)index, bigstring);
+ scriptedit.RegisterRgbaImage((int)index, image);
}
- // This registers an XPM image for the markes list
- private void RegisterMarkerImage(ImageIndex index, byte[] imagedata)
+ // This registers an image for the markes list
+ private void RegisterMarkerImage(ImageIndex index, Bitmap image)
{
- // Convert to string
- string bigstring = Encoding.UTF8.GetString(imagedata);
-
// Register image
- scriptedit.MarkerDefinePixmap((int)index, bigstring);
- }
-
- // Perform undo
- public void Undo()
- {
- scriptedit.Undo();
- }
-
- // Perform redo
- public void Redo()
- {
- scriptedit.Redo();
- }
-
- // Perform cut
- public void Cut()
- {
- scriptedit.Cut();
- }
-
- // Perform copy
- public void Copy()
- {
- scriptedit.Copy();
- }
-
- // Perform paste
- public void Paste()
- {
- scriptedit.Paste();
- }
-
- // This steals the focus (use with care!)
- public void GrabFocus()
- {
- scriptedit.GrabFocus();
- }
-
- public byte[] GetText()
- {
- return scriptedit.GetText(scriptedit.TextSize);
- }
-
- public void SetText(byte[] text)
- {
- scriptedit.SetText(text);
- }
-
- //mxd
- public void InsertSnippet(string[] lines)
- {
- //insert the snippet
- int curline = scriptedit.LineFromPosition(scriptedit.SelectionStart);
- int numtabs = scriptedit.GetLineIndentation(curline);
- string tabs = Environment.NewLine + new String(' ', numtabs);
- string spaces = new String(' ', General.Settings.ScriptTabWidth);
- int entrypos = -1;
- int entryline = -1;
- string[] processedlines = ProcessLineBreaks(lines);
-
- for(int i = 0; i < lines.Length; i++)
- {
- processedlines[i] = processedlines[i].Replace("\t", spaces);
-
- //check if we have the [EP] marker
- if(entrypos == -1)
- {
- int pos = processedlines[i].IndexOf("[EP]");
- if(pos != -1)
- {
- entryline = curline + i;
- entrypos = pos + numtabs;
- processedlines[i] = processedlines[i].Remove(pos, 4);
- }
- }
- }
-
- //replace the text
- string text = string.Join(tabs, processedlines);
- scriptedit.SelectionStart = scriptedit.WordStartPosition(scriptedit.CurrentPos, true);
- scriptedit.SelectionEnd = scriptedit.WordEndPosition(scriptedit.CurrentPos, true);
- scriptedit.ReplaceSel(text);
-
- //move the cursor if we had the [EP] marker
- if(entrypos != -1)
- {
- MoveToLine(entryline);
- scriptedit.SelectionStart = scriptedit.PositionFromLine(entryline) + entrypos;
- scriptedit.SelectionEnd = scriptedit.PositionFromLine(entryline) + entrypos;
- }
+ scriptedit.Markers[(int)index].DefineRgbaImage(image);
+ scriptedit.Markers[(int)index].Symbol = MarkerSymbol.RgbaImage;
}
//mxd. This converts [LB] markers to line breaks if necessary
@@ -718,7 +902,7 @@ namespace CodeImp.DoomBuilder.Controls
foreach(string line in lines)
{
- if(line.IndexOf(separator[0]) != -1)
+ if(line.IndexOf(separator[0], StringComparison.Ordinal) != -1)
{
if(General.Settings.SnippetsAllmanStyle)
result.AddRange(line.Split(separator, StringSplitOptions.RemoveEmptyEntries));
@@ -734,6 +918,104 @@ namespace CodeImp.DoomBuilder.Controls
return result.ToArray();
}
+ //mxd. Autocompletion handling (https://github.com/jacobslusser/ScintillaNET/wiki/Basic-Autocompletion)
+ private bool ShowAutoCompletionList()
+ {
+ int currentpos = scriptedit.CurrentPosition;
+ int wordstartpos = scriptedit.WordStartPosition(currentpos, true);
+
+ if(wordstartpos >= currentpos)
+ {
+ // Hide the list
+ scriptedit.AutoCCancel();
+ return false;
+ }
+
+ // Get entered text
+ string start = scriptedit.GetTextRange(wordstartpos, currentpos - wordstartpos);
+ if(string.IsNullOrEmpty(start))
+ {
+ // Hide the list
+ scriptedit.AutoCCancel();
+ return false;
+ }
+
+ // Filter the list
+ List filtered = new List();
+ foreach(string s in autocompletelist)
+ if(s.IndexOf(start, StringComparison.OrdinalIgnoreCase) != -1) filtered.Add(s);
+
+ // Any matches?
+ if(filtered.Count > 0)
+ {
+ // Show the list
+ scriptedit.AutoCShow(currentpos - wordstartpos, string.Join(" ", filtered.ToArray()));
+ return true;
+ }
+
+ // Hide the list
+ scriptedit.AutoCCancel();
+ return false;
+ }
+
+ //mxd
+ private string GetIndentationString(int indent)
+ {
+ if(scriptedit.UseTabs)
+ {
+ string indentstr = string.Empty;
+ int numtabs = indent / scriptedit.TabWidth;
+ if(numtabs > 0) indentstr = new string('\t', numtabs);
+
+ // Mixed padding? Add spaces
+ if(numtabs * scriptedit.TabWidth < indent)
+ {
+ int numspaces = indent - numtabs * scriptedit.TabWidth;
+ indentstr += new string(' ', numspaces);
+ }
+
+ return indentstr;
+ }
+ else
+ {
+ return new string(' ', indent);
+ }
+ }
+
+ //mxd. https://github.com/jacobslusser/ScintillaNET/wiki/Find-and-Highlight-Words
+ private void HighlightWord(string text)
+ {
+ // Remove all uses of our indicator
+ scriptedit.IndicatorCurrent = HIGHLIGHT_INDICATOR;
+ scriptedit.IndicatorClearRange(0, scriptedit.TextLength);
+
+ // Update indicator appearance
+ scriptedit.Indicators[HIGHLIGHT_INDICATOR].Style = IndicatorStyle.RoundBox;
+ scriptedit.Indicators[HIGHLIGHT_INDICATOR].Under = true;
+ scriptedit.Indicators[HIGHLIGHT_INDICATOR].ForeColor = General.Colors.ScriptIndicator.ToColor();
+ scriptedit.Indicators[HIGHLIGHT_INDICATOR].OutlineAlpha = 50;
+ scriptedit.Indicators[HIGHLIGHT_INDICATOR].Alpha = 30;
+
+ // Search the document
+ scriptedit.TargetStart = 0;
+ scriptedit.TargetEnd = scriptedit.TextLength;
+ scriptedit.SearchFlags = SearchFlags.WholeWord;
+
+ while(scriptedit.SearchInTarget(text) != -1)
+ {
+ //mxd. Don't mark currently selected word
+ if(scriptedit.SelectionStart != scriptedit.TargetStart && scriptedit.SelectionEnd != scriptedit.TargetEnd)
+ {
+ // Mark the search results with the current indicator
+ scriptedit.IndicatorFillRange(scriptedit.TargetStart, scriptedit.TargetEnd - scriptedit.TargetStart);
+ }
+
+ // Search the remainder of the document
+ scriptedit.TargetStart = scriptedit.TargetEnd;
+ scriptedit.TargetEnd = scriptedit.TextLength;
+ }
+ }
+
#endregion
#region ================== Events
@@ -757,81 +1039,238 @@ namespace CodeImp.DoomBuilder.Controls
}
//mxd. Script text changed
- private void scriptedit_UndoRedoPerformed(ScintillaControl pSender)
+ private void scriptedit_TextChanged(object sender, EventArgs e)
{
- changed = true;
+ // Line number margin width needs changing?
+ int curlinenumbercharlength = scriptedit.Lines.Count.ToString().Length;
+
+ // Calculate the width required to display the last line number
+ // and include some padding for good measure.
+ if(curlinenumbercharlength != linenumbercharlength)
+ {
+ const int padding = 2;
+ scriptedit.Margins[1].Width = scriptedit.TextWidth(Style.LineNumber, new string('9', curlinenumbercharlength + 1)) + padding;
+ linenumbercharlength = curlinenumbercharlength;
+ }
+
if(OnTextChanged != null) OnTextChanged(this, EventArgs.Empty);
}
- //mxd. Script text changed
- private void scriptedit_TextChanged(ScintillaControl pSender, int position, int length, int linesAdded)
+ //mxd
+ private void scriptedit_CharAdded(object sender, CharAddedEventArgs e)
{
- changed = true;
- if(OnTextChanged != null) OnTextChanged(this, EventArgs.Empty);
+ // Hide call tip if any
+ scriptedit.CallTipCancel();
+
+ // Offset caret if needed
+ if(caretoffset != 0)
+ {
+ scriptedit.SetEmptySelection(scriptedit.SelectionStart + caretoffset);
+ caretoffset = 0;
+ if(!expandcodeblock) return;
+ }
+
+ // Move CodeBlockOpen to the new line?
+ if(expandcodeblock)
+ {
+ if(scriptedit.CurrentLine > 0)
+ {
+ string linetext = scriptedit.Lines[scriptedit.CurrentLine - 1].Text;
+ int blockopenpos = (string.IsNullOrEmpty(scriptconfig.CodeBlockOpen) ? -1 : linetext.LastIndexOf(scriptconfig.CodeBlockOpen, StringComparison.Ordinal));
+ if(blockopenpos != -1)
+ {
+ // Do it only if initial line doesn't start with CodeBlockOpen
+ string linestart = linetext.Substring(0, blockopenpos).Trim();
+ if(linestart.Length > 0)
+ {
+ scriptedit.InsertText(scriptedit.Lines[scriptedit.CurrentLine - 1].Position + blockopenpos,
+ Environment.NewLine + GetIndentationString(scriptedit.Lines[scriptedit.CurrentLine - 1].Indentation));
+ }
+ }
+ }
+
+ expandcodeblock = false;
+ return;
+ }
+
+ // Auto-match braces
+ //TODO: Auto-match quotes
+ bool endpos = (scriptedit.CurrentPosition == scriptedit.TextLength);
+ if(!string.IsNullOrEmpty(scriptconfig.CodeBlockOpen) && e.Char == scriptconfig.CodeBlockOpen[0] && !string.IsNullOrEmpty(scriptconfig.CodeBlockClose) &&
+ (endpos || (char)scriptedit.GetCharAt(scriptedit.CurrentPosition + 1) != scriptconfig.CodeBlockClose[0]))
+ {
+ scriptedit.InsertText(scriptedit.CurrentPosition, scriptconfig.CodeBlockClose);
+ }
+ else if(!string.IsNullOrEmpty(scriptconfig.FunctionOpen) && e.Char == scriptconfig.FunctionOpen[0] && !string.IsNullOrEmpty(scriptconfig.FunctionClose) &&
+ (endpos || (char)scriptedit.GetCharAt(scriptedit.CurrentPosition + 1) != scriptconfig.FunctionClose[0]))
+ {
+ scriptedit.InsertText(scriptedit.CurrentPosition, scriptconfig.FunctionClose);
+ }
+ else if(!string.IsNullOrEmpty(scriptconfig.ArrayOpen) && e.Char == scriptconfig.ArrayOpen[0] && !string.IsNullOrEmpty(scriptconfig.ArrayClose) &&
+ (endpos || (char)scriptedit.GetCharAt(scriptedit.CurrentPosition + 1) != scriptconfig.ArrayClose[0]))
+ {
+ scriptedit.InsertText(scriptedit.CurrentPosition, scriptconfig.ArrayClose);
+ }
+ else
+ {
+ // Display the autocompletion list
+ // TODO: make this behaviour optional?
+ ShowAutoCompletionList();
+ }
+ }
+
+ //mxd
+ private void scriptedit_UpdateUI(object sender, UpdateUIEventArgs e)
+ {
+ // If a word is selected, highlight the same words
+ if(scriptedit.SelectedText != highlightedword)
+ {
+ // Highlight only when whole word is selected
+ if(!string.IsNullOrEmpty(scriptedit.SelectedText) && scriptedit.GetWordFromPosition(scriptedit.SelectionStart) == scriptedit.SelectedText)
+ {
+ HighlightWord(scriptedit.SelectedText);
+ }
+ else
+ {
+ // Clear highlight
+ scriptedit.IndicatorCurrent = HIGHLIGHT_INDICATOR;
+ scriptedit.IndicatorClearRange(0, scriptedit.TextLength);
+ }
+
+ highlightedword = scriptedit.SelectedText;
+ }
+
+ // Has the caret changed position?
+ int caretpos = scriptedit.CurrentPosition;
+ if(lastcaretpos != caretpos && scriptconfig.BraceChars.Count > 0)
+ {
+ // Perform brace matching (https://github.com/jacobslusser/ScintillaNET/wiki/Brace-Matching)
+ lastcaretpos = caretpos;
+ int bracepos1 = -1;
+
+ // Is there a brace to the left or right?
+ if(caretpos > 0 && scriptconfig.BraceChars.Contains((char)scriptedit.GetCharAt(caretpos - 1)))
+ bracepos1 = (caretpos - 1);
+ else if(scriptconfig.BraceChars.Contains((char)(scriptedit.GetCharAt(caretpos))))
+ bracepos1 = caretpos;
+
+ if(bracepos1 > -1)
+ {
+ // Find the matching brace
+ int bracepos2 = scriptedit.BraceMatch(bracepos1);
+ if(bracepos2 == Scintilla.InvalidPosition)
+ scriptedit.BraceBadLight(bracepos1);
+ else
+ scriptedit.BraceHighlight(bracepos1, bracepos2);
+ }
+ else
+ {
+ // Turn off brace matching
+ scriptedit.BraceHighlight(Scintilla.InvalidPosition, Scintilla.InvalidPosition);
+ }
+ }
+ }
+
+ //mxd
+ private void scriptedit_InsertCheck(object sender, InsertCheckEventArgs e)
+ {
+ // Gross hacks...
+ if(skiptextinsert)
+ {
+ e.Text = string.Empty;
+ skiptextinsert = false;
+ }
+ // Do we want auto-indentation?
+ else if(!expandcodeblock && General.Settings.ScriptAutoIndent && e.Text == "\r\n")
+ {
+ // Get current line indentation up to the cursor position
+ string linetext = scriptedit.Lines[scriptedit.CurrentLine].Text;
+ int selectionpos = scriptedit.SelectionStart - scriptedit.Lines[scriptedit.CurrentLine].Position;
+ int indent = 0;
+ for(int i = 0; i < selectionpos; i++)
+ {
+ switch(linetext[i])
+ {
+ case ' ': indent++; break;
+ case '\t': indent += scriptedit.TabWidth; break;
+ default: i = selectionpos; break; // break the loop
+ }
+ }
+
+ // Store initial indentation
+ int initialindent = indent;
+
+ // Need to increase indentation? We do this when:
+ // 1. Line contains '{' and '}' and the cursor is between them
+ // 2. Line either doesn't contain '}', or it's before '{', it contains '{' and the cursor is after it
+ // 3. Line doesn't contain ';', line contains ')' and the cursor is after it
+ int blockopenpos = (string.IsNullOrEmpty(scriptconfig.CodeBlockOpen) ? -1 : linetext.LastIndexOf(scriptconfig.CodeBlockOpen, selectionpos, StringComparison.Ordinal));
+ int blockclosepos = (string.IsNullOrEmpty(scriptconfig.CodeBlockOpen) ? -1 : linetext.IndexOf(scriptconfig.CodeBlockClose, selectionpos, StringComparison.Ordinal));
+ int funcclosepos = (string.IsNullOrEmpty(scriptconfig.FunctionClose) ? -1 : linetext.LastIndexOf(scriptconfig.FunctionClose, StringComparison.Ordinal));
+
+ // Add indentation when the cursor is between { and }
+ bool addindent = (blockopenpos != -1 && blockopenpos < selectionpos) && (blockclosepos == -1 || (blockopenpos < blockclosepos && blockclosepos >= selectionpos));
+ bool isblockindent = addindent;
+ addindent |= funcclosepos != -1 && blockopenpos == -1 && funcclosepos < selectionpos && !linetext.Contains(scriptconfig.Terminator);
+ if(addindent) indent += scriptedit.TabWidth;
+
+ // Calculate indentation
+ string indentstr = GetIndentationString(indent);
+
+ // Move CodeBlockOpen to the new line (will be applied in scriptedit_CharAdded)?
+ expandcodeblock = (isblockindent && General.Settings.SnippetsAllmanStyle);
+
+ // Offset closing block char?
+ if(addindent && blockclosepos != -1)
+ {
+ string initialindentstr = GetIndentationString(initialindent);
+ indentstr += Environment.NewLine + initialindentstr;
+
+ // Offset cursor position (will be performed in scriptedit_CharAdded)
+ caretoffset = -(initialindentstr.Length + Environment.NewLine.Length);
+ }
+
+ // Apply new indentation
+ e.Text += indentstr;
+ }
+ }
+
+ //mxd
+ private void scriptedit_AutoCCompleted(object sender, AutoCSelectionEventArgs e)
+ {
+ // Expand snippet?
+ string[] lines = scriptconfig.GetSnippet(e.Text);
+ if(lines != null) InsertSnippet(lines);
}
// Key pressed down
private void scriptedit_KeyDown(object sender, KeyEventArgs e)
{
- // These key combinations put odd characters in the script, so I disabled them
- if((e.KeyCode == Keys.Q) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.W) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.E) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.R) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.Y) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.U) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.I) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.P) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.A) && ((e.Modifiers & Keys.Control) == Keys.Control) && ((e.Modifiers & Keys.Shift) == Keys.Shift)) e.Handled = true;
- else if((e.KeyCode == Keys.D) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.G) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.H) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.J) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.K) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.L) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.Z) && ((e.Modifiers & Keys.Control) == Keys.Control) && ((e.Modifiers & Keys.Shift) == Keys.Shift)) e.Handled = true;
- else if((e.KeyCode == Keys.X) && ((e.Modifiers & Keys.Control) == Keys.Control) && ((e.Modifiers & Keys.Shift) == Keys.Shift)) e.Handled = true;
- else if((e.KeyCode == Keys.C) && ((e.Modifiers & Keys.Control) == Keys.Control) && ((e.Modifiers & Keys.Shift) == Keys.Shift)) e.Handled = true;
- else if((e.KeyCode == Keys.V) && ((e.Modifiers & Keys.Control) == Keys.Control) && ((e.Modifiers & Keys.Shift) == Keys.Shift)) e.Handled = true;
- else if((e.KeyCode == Keys.B) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.N) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
- else if((e.KeyCode == Keys.M) && ((e.Modifiers & Keys.Control) == Keys.Control)) e.Handled = true;
-
// F3 for Find Next
- else if((e.KeyCode == Keys.F3) && (e.Modifiers == Keys.None))
+ if((e.KeyCode == Keys.F3) && (e.Modifiers == Keys.None))
{
if(OnFindNext != null) OnFindNext();
- e.Handled = true;
}
-
// F2 for Find Previous (mxd)
else if((e.KeyCode == Keys.F2) && (e.Modifiers == Keys.None))
{
if(OnFindPrevious != null) OnFindPrevious();
- e.Handled = true;
}
-
// CTRL+F for find & replace
else if((e.KeyCode == Keys.F) && ((e.Modifiers & Keys.Control) == Keys.Control))
{
if(OnOpenFindAndReplace != null) OnOpenFindAndReplace();
- e.Handled = true;
}
-
// CTRL+S for save
else if((e.KeyCode == Keys.S) && ((e.Modifiers & Keys.Control) == Keys.Control))
{
if(OnExplicitSaveTab != null) OnExplicitSaveTab();
- e.Handled = true;
}
-
// CTRL+O for open
else if((e.KeyCode == Keys.O) && ((e.Modifiers & Keys.Control) == Keys.Control))
{
if(OnOpenScriptBrowser != null) OnOpenScriptBrowser();
- e.Handled = true;
}
-
// CTRL+Space to autocomplete
else if((e.KeyCode == Keys.Space) && (e.Modifiers == Keys.Control))
{
@@ -839,29 +1278,25 @@ namespace CodeImp.DoomBuilder.Controls
scriptedit.CallTipCancel();
// Show autocomplete
- int currentpos = scriptedit.CurrentPos;
- int wordstartpos = scriptedit.WordStartPosition(currentpos, true);
- scriptedit.AutoCShow(currentpos - wordstartpos, autocompletestring);
-
- e.Handled = true;
+ if(ShowAutoCompletionList()) skiptextinsert = true;
}
-
- //mxd. Tab to expand code snippet
- // Do it only when the text cursor is at the end of a keyword.
- else if(e.KeyCode == Keys.Tab)
+ //mxd. Tab to expand code snippet. Do it only when the text cursor is at the end of a keyword.
+ else if(e.KeyCode == Keys.Tab)
{
- string curword = GetCurrentWord().ToLowerInvariant();
- if(scriptconfig.Snippets.ContainsKey(curword) && scriptedit.CurrentPos == scriptedit.WordEndPosition(scriptedit.CurrentPos, true))
+ if(!scriptedit.AutoCActive)
{
- InsertSnippet(scriptconfig.Snippets[curword]);
- e.Handled = true;
+ string curword = GetCurrentWord().ToLowerInvariant();
+ if(scriptconfig.Snippets.Contains(curword) && scriptedit.CurrentPosition == scriptedit.WordEndPosition(scriptedit.CurrentPosition, true))
+ {
+ InsertSnippet(scriptconfig.GetSnippet(curword));
+ skiptextinsert = true;
+ }
}
}
-
//mxd. Handle screenshot saving
else if(DelayedForm.ProcessSaveScreenshotAction((int)e.KeyData))
{
- e.Handled = true;
+ skiptextinsert = true;
}
}
@@ -872,28 +1307,10 @@ namespace CodeImp.DoomBuilder.Controls
int highlightstart = 0;
int highlightend = 0;
- // Enter pressed?
- if((e.KeyCode == Keys.Enter) && (e.Modifiers == Keys.None))
- {
- // Do we want auto-indent?
- if(General.Settings.ScriptAutoIndent)
- {
- // Get the current line index and check if its not the first line
- int curline = scriptedit.LineFromPosition(scriptedit.CurrentPos);
- if(curline > 0 && scriptedit.GetLineIndentation(curline) == 0)
- {
- // Apply identation of the previous line to this line
- int ident = scriptedit.GetLineIndentation(curline - 1);
- scriptedit.SetLineIndentation(curline, ident);
- scriptedit.SetSel(scriptedit.SelectionStart + ident, scriptedit.SelectionStart + ident);
- }
- }
- }
-
UpdatePositionInfo();
// Call tip shown
- if(scriptedit.IsCallTipActive)
+ if(scriptedit.CallTipActive)
{
// Should we hide the call tip?
if(curfunctionname.Length == 0)
@@ -911,7 +1328,7 @@ namespace CodeImp.DoomBuilder.Controls
else
{
// Should we show a call tip?
- showcalltip = (curfunctionname.Length > 0) && !scriptedit.IsAutoCActive;
+ showcalltip = (curfunctionname.Length > 0) && !scriptedit.AutoCActive;
}
// Show or update call tip
@@ -921,8 +1338,8 @@ namespace CodeImp.DoomBuilder.Controls
if(functiondef != null)
{
// Determine the range to highlight
- int argsopenpos = functiondef.IndexOf(scriptconfig.FunctionOpen);
- int argsclosepos = functiondef.LastIndexOf(scriptconfig.FunctionClose);
+ int argsopenpos = functiondef.IndexOf(scriptconfig.FunctionOpen, StringComparison.Ordinal);
+ int argsclosepos = functiondef.LastIndexOf(scriptconfig.FunctionClose, StringComparison.Ordinal);
if((argsopenpos > -1) && (argsclosepos > -1))
{
string argsstr = functiondef.Substring(argsopenpos + 1, argsclosepos - argsopenpos - 1);
@@ -939,9 +1356,8 @@ namespace CodeImp.DoomBuilder.Controls
//mxd. If the tip obscures the view, move it down
int tippos;
int funcline = scriptedit.LineFromPosition(curfunctionstartpos);
- int curline = scriptedit.LineFromPosition(scriptedit.CurrentPos);
- if(curline > funcline)
- tippos = scriptedit.PositionFromLine(curline) + scriptedit.GetLineIndentation(curline); //scriptedit.PositionFromLine(curline) /*+ (curfunctionstartpos - scriptedit.PositionFromLine(funcline))*/;
+ if(scriptedit.CurrentLine > funcline)
+ tippos = scriptedit.Lines[scriptedit.CurrentLine].Position + scriptedit.Lines[scriptedit.CurrentLine].Indentation; //scriptedit.PositionFromLine(curline) /*+ (curfunctionstartpos - scriptedit.PositionFromLine(funcline))*/;
else
tippos = curfunctionstartpos;
diff --git a/Source/Core/Controls/ScriptEditorPanel.Designer.cs b/Source/Core/Controls/ScriptEditorPanel.Designer.cs
index 7b023ab8..d53cdc8a 100644
--- a/Source/Core/Controls/ScriptEditorPanel.Designer.cs
+++ b/Source/Core/Controls/ScriptEditorPanel.Designer.cs
@@ -44,6 +44,11 @@ namespace CodeImp.DoomBuilder.Controls
this.buttoncopy = new System.Windows.Forms.ToolStripButton();
this.buttonpaste = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+ this.buttonunindent = new System.Windows.Forms.ToolStripButton();
+ this.buttonindent = new System.Windows.Forms.ToolStripButton();
+ this.buttonwhitespace = new System.Windows.Forms.ToolStripButton();
+ this.buttonwordwrap = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.buttonsnippets = new System.Windows.Forms.ToolStripDropDownButton();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.buttonscriptconfig = new System.Windows.Forms.ToolStripDropDownButton();
@@ -68,6 +73,7 @@ namespace CodeImp.DoomBuilder.Controls
this.errorimages = new System.Windows.Forms.ImageList(this.components);
this.statusbar = new System.Windows.Forms.StatusStrip();
this.statuslabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.positionlabel = new System.Windows.Forms.ToolStripStatusLabel();
this.scripttype = new System.Windows.Forms.ToolStripStatusLabel();
this.statusflasher = new System.Windows.Forms.Timer(this.components);
this.statusresetter = new System.Windows.Forms.Timer(this.components);
@@ -88,7 +94,7 @@ namespace CodeImp.DoomBuilder.Controls
this.tabs.Name = "tabs";
this.tabs.Padding = new System.Drawing.Point(12, 3);
this.tabs.SelectedIndex = 0;
- this.tabs.Size = new System.Drawing.Size(720, 379);
+ this.tabs.Size = new System.Drawing.Size(794, 379);
this.tabs.TabIndex = 0;
this.tabs.TabStop = false;
this.tabs.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabs_Selecting);
@@ -111,6 +117,11 @@ namespace CodeImp.DoomBuilder.Controls
this.buttoncopy,
this.buttonpaste,
this.toolStripSeparator3,
+ this.buttonunindent,
+ this.buttonindent,
+ this.buttonwhitespace,
+ this.buttonwordwrap,
+ this.toolStripSeparator6,
this.buttonsnippets,
this.toolStripSeparator4,
this.buttonscriptconfig,
@@ -126,7 +137,7 @@ namespace CodeImp.DoomBuilder.Controls
this.searchwholeword});
this.toolbar.Location = new System.Drawing.Point(0, 0);
this.toolbar.Name = "toolbar";
- this.toolbar.Size = new System.Drawing.Size(726, 25);
+ this.toolbar.Size = new System.Drawing.Size(800, 25);
this.toolbar.TabIndex = 1;
//
// buttonnew
@@ -240,6 +251,54 @@ namespace CodeImp.DoomBuilder.Controls
this.toolStripSeparator3.Name = "toolStripSeparator3";
this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25);
//
+ // buttonunindent
+ //
+ this.buttonunindent.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.buttonunindent.Image = global::CodeImp.DoomBuilder.Properties.Resources.TextUnindent;
+ this.buttonunindent.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.buttonunindent.Name = "buttonunindent";
+ this.buttonunindent.Size = new System.Drawing.Size(23, 22);
+ this.buttonunindent.Text = "Unindent selection";
+ this.buttonunindent.Click += new System.EventHandler(this.buttonunindent_Click);
+ //
+ // buttonindent
+ //
+ this.buttonindent.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.buttonindent.Image = global::CodeImp.DoomBuilder.Properties.Resources.TextIndent;
+ this.buttonindent.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.buttonindent.Name = "buttonindent";
+ this.buttonindent.Size = new System.Drawing.Size(23, 22);
+ this.buttonindent.Text = "Indent selection";
+ this.buttonindent.Click += new System.EventHandler(this.buttonindent_Click);
+ //
+ // buttonwhitespace
+ //
+ this.buttonwhitespace.CheckOnClick = true;
+ this.buttonwhitespace.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.buttonwhitespace.Image = global::CodeImp.DoomBuilder.Properties.Resources.TextWhitespace;
+ this.buttonwhitespace.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.buttonwhitespace.Name = "buttonwhitespace";
+ this.buttonwhitespace.Size = new System.Drawing.Size(23, 22);
+ this.buttonwhitespace.Text = "Show whitespace";
+ this.buttonwhitespace.Click += new System.EventHandler(this.buttonwhitespace_Click);
+ //
+ // buttonwordwrap
+ //
+ this.buttonwordwrap.CheckOnClick = true;
+ this.buttonwordwrap.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.buttonwordwrap.Image = global::CodeImp.DoomBuilder.Properties.Resources.WordWrap;
+ this.buttonwordwrap.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.buttonwordwrap.Name = "buttonwordwrap";
+ this.buttonwordwrap.Size = new System.Drawing.Size(23, 22);
+ this.buttonwordwrap.Text = "Wrap long lines";
+ this.buttonwordwrap.Click += new System.EventHandler(this.buttonwordwrap_Click);
+ //
+ // toolStripSeparator6
+ //
+ this.toolStripSeparator6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.toolStripSeparator6.Name = "toolStripSeparator6";
+ this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
+ //
// buttonsnippets
//
this.buttonsnippets.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@@ -391,7 +450,7 @@ namespace CodeImp.DoomBuilder.Controls
//
this.splitter.Panel2.Controls.Add(this.label1);
this.splitter.Panel2.Controls.Add(this.errorlist);
- this.splitter.Size = new System.Drawing.Size(726, 516);
+ this.splitter.Size = new System.Drawing.Size(800, 516);
this.splitter.SplitterDistance = 390;
this.splitter.TabIndex = 2;
this.splitter.TabStop = false;
@@ -406,7 +465,7 @@ namespace CodeImp.DoomBuilder.Controls
this.label1.Location = new System.Drawing.Point(3, 0);
this.label1.Name = "label1";
this.label1.Padding = new System.Windows.Forms.Padding(1);
- this.label1.Size = new System.Drawing.Size(720, 16);
+ this.label1.Size = new System.Drawing.Size(794, 16);
this.label1.TabIndex = 1;
this.label1.Text = "Errors";
//
@@ -427,7 +486,7 @@ namespace CodeImp.DoomBuilder.Controls
this.errorlist.MultiSelect = false;
this.errorlist.Name = "errorlist";
this.errorlist.ShowGroups = false;
- this.errorlist.Size = new System.Drawing.Size(720, 100);
+ this.errorlist.Size = new System.Drawing.Size(794, 100);
this.errorlist.SmallImageList = this.errorimages;
this.errorlist.TabIndex = 0;
this.errorlist.TabStop = false;
@@ -460,10 +519,11 @@ namespace CodeImp.DoomBuilder.Controls
//
this.statusbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.statuslabel,
+ this.positionlabel,
this.scripttype});
this.statusbar.Location = new System.Drawing.Point(0, 541);
this.statusbar.Name = "statusbar";
- this.statusbar.Size = new System.Drawing.Size(726, 22);
+ this.statusbar.Size = new System.Drawing.Size(800, 22);
this.statusbar.TabIndex = 3;
this.statusbar.Text = "statusStrip1";
//
@@ -476,11 +536,19 @@ namespace CodeImp.DoomBuilder.Controls
this.statuslabel.Size = new System.Drawing.Size(60, 17);
this.statuslabel.Text = "Ready.";
//
+ // positionlabel
+ //
+ this.positionlabel.Name = "positionlabel";
+ this.positionlabel.Size = new System.Drawing.Size(634, 17);
+ this.positionlabel.Spring = true;
+ this.positionlabel.Text = "100 : 12 (120)";
+ this.positionlabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ //
// scripttype
//
+ this.scripttype.Margin = new System.Windows.Forms.Padding(30, 3, 0, 2);
this.scripttype.Name = "scripttype";
- this.scripttype.Size = new System.Drawing.Size(648, 17);
- this.scripttype.Spring = true;
+ this.scripttype.Size = new System.Drawing.Size(58, 17);
this.scripttype.Text = "Plain Text";
this.scripttype.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
@@ -501,7 +569,7 @@ namespace CodeImp.DoomBuilder.Controls
this.Controls.Add(this.statusbar);
this.Controls.Add(this.toolbar);
this.Name = "ScriptEditorPanel";
- this.Size = new System.Drawing.Size(726, 563);
+ this.Size = new System.Drawing.Size(800, 563);
this.toolbar.ResumeLayout(false);
this.toolbar.PerformLayout();
this.splitter.Panel1.ResumeLayout(false);
@@ -557,5 +625,11 @@ namespace CodeImp.DoomBuilder.Controls
private System.Windows.Forms.ToolStripStatusLabel scripttype;
private System.Windows.Forms.Timer statusflasher;
private System.Windows.Forms.Timer statusresetter;
+ private System.Windows.Forms.ToolStripStatusLabel positionlabel;
+ private System.Windows.Forms.ToolStripButton buttonunindent;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
+ private System.Windows.Forms.ToolStripButton buttonindent;
+ private System.Windows.Forms.ToolStripButton buttonwhitespace;
+ private System.Windows.Forms.ToolStripButton buttonwordwrap;
}
}
diff --git a/Source/Core/Controls/ScriptEditorPanel.cs b/Source/Core/Controls/ScriptEditorPanel.cs
index 975d997f..45bf19b0 100644
--- a/Source/Core/Controls/ScriptEditorPanel.cs
+++ b/Source/Core/Controls/ScriptEditorPanel.cs
@@ -25,6 +25,7 @@ using System.Windows.Forms;
using CodeImp.DoomBuilder.Compilers;
using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.Windows;
+using ScintillaNET;
#endregion
@@ -116,16 +117,20 @@ namespace CodeImp.DoomBuilder.Controls
foreach(MapLumpInfo maplumpinfo in General.Map.Config.MapLumps.Values)
{
// Is this a script lump?
- if(maplumpinfo.Script != null)
- {
- // Load this!
- ScriptLumpDocumentTab t = new ScriptLumpDocumentTab(this, maplumpinfo.Name, maplumpinfo.Script);
- tabs.TabPages.Add(t);
- }
- else if(maplumpinfo.ScriptBuild) //mxd
+ if(maplumpinfo.ScriptBuild) //mxd
{
// Load this!
ScriptLumpDocumentTab t = new ScriptLumpDocumentTab(this, maplumpinfo.Name, General.CompiledScriptConfigs[General.Map.Options.ScriptCompiler]);
+ t.OnTextChanged += tabpage_OnLumpTextChanged; //mxd
+ t.Scintilla.UpdateUI += scintilla_OnUpdateUI; //mxd
+ tabs.TabPages.Add(t);
+ }
+ else if(maplumpinfo.Script != null)
+ {
+ // Load this!
+ ScriptLumpDocumentTab t = new ScriptLumpDocumentTab(this, maplumpinfo.Name, maplumpinfo.Script);
+ t.OnTextChanged += tabpage_OnLumpTextChanged; //mxd
+ t.Scintilla.UpdateUI += scintilla_OnUpdateUI; //mxd
tabs.TabPages.Add(t);
}
}
@@ -160,21 +165,35 @@ namespace CodeImp.DoomBuilder.Controls
// This applies user preferences
public void ApplySettings()
{
- // Apply settings
- //int panel2size = General.Settings.ReadSetting("scriptspanel.splitter", splitter.ClientRectangle.Height - splitter.SplitterDistance);
- //splitter.SplitterDistance = splitter.ClientRectangle.Height - panel2size;
errorlist.Columns[0].Width = General.Settings.ReadSetting("scriptspanel.errorscolumn0width", errorlist.Columns[0].Width);
errorlist.Columns[1].Width = General.Settings.ReadSetting("scriptspanel.errorscolumn1width", errorlist.Columns[1].Width);
errorlist.Columns[2].Width = General.Settings.ReadSetting("scriptspanel.errorscolumn2width", errorlist.Columns[2].Width);
+ buttonwhitespace.Checked = General.Settings.ReadSetting("scriptspanel.showwhitespace", false); //mxd
+ buttonwordwrap.Checked = General.Settings.ReadSetting("scriptspanel.wraplonglines", false); //mxd
+ ApplyTabSettings(); //mxd
}
// This saves user preferences
public void SaveSettings()
{
- //General.Settings.WriteSetting("scriptspanel.splitter", splitter.ClientRectangle.Height - splitter.SplitterDistance);
General.Settings.WriteSetting("scriptspanel.errorscolumn0width", errorlist.Columns[0].Width);
General.Settings.WriteSetting("scriptspanel.errorscolumn1width", errorlist.Columns[1].Width);
- General.Settings.WriteSetting("scriptspanel.errorscolumn2width", errorlist.Columns[2].Width);
+ General.Settings.WriteSetting("scriptspanel.showwhitespace", buttonwhitespace.Checked); //mxd
+ General.Settings.WriteSetting("scriptspanel.wraplonglines", buttonwordwrap.Checked); //mxd
+ }
+
+ //mxd
+ private void ApplyTabSettings()
+ {
+ foreach(var tp in tabs.TabPages)
+ {
+ ScriptDocumentTab scripttab = (tp as ScriptDocumentTab);
+ if(scripttab != null)
+ {
+ scripttab.WrapLongLines = buttonwordwrap.Checked;
+ scripttab.ShowWhitespace = buttonwhitespace.Checked;
+ }
+ }
}
#endregion
@@ -230,7 +249,7 @@ namespace CodeImp.DoomBuilder.Controls
{
if(!string.IsNullOrEmpty(findoptions.FindText) && (options.ReplaceWith != null) && (ActiveTab != null))
{
- if(string.Compare(ActiveTab.GetSelectedText(), options.FindText, !options.CaseSensitive) == 0)
+ if(string.Compare(ActiveTab.SelectedText, options.FindText, !options.CaseSensitive) == 0)
{
// Replace selection
ActiveTab.ReplaceSelection(options.ReplaceWith);
@@ -321,7 +340,7 @@ namespace CodeImp.DoomBuilder.Controls
findreplaceform.Show(this.ParentForm);
if(ActiveTab.SelectionEnd != ActiveTab.SelectionStart)
- findreplaceform.SetFindText(ActiveTab.GetSelectedText());
+ findreplaceform.SetFindText(ActiveTab.SelectedText);
}
catch(Exception)
{
@@ -421,7 +440,7 @@ namespace CodeImp.DoomBuilder.Controls
if(t.IsChanged)
{
// Ask to save
- DialogResult result = MessageBox.Show(this.ParentForm, "Do you want to save changes to " + t.Text + "?", "Close File", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+ DialogResult result = MessageBox.Show(this.ParentForm, "Do you want to save changes to " + t.Title + "?", "Close File", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
switch(result)
{
case DialogResult.Yes:
@@ -492,20 +511,24 @@ namespace CodeImp.DoomBuilder.Controls
t = (tabs.SelectedTab as ScriptDocumentTab);
// Enable/disable buttons
- buttonsave.Enabled = (t != null) && t.ExplicitSave && t.IsChanged;
+ buttonsave.Enabled = (t != null && t.ExplicitSave && t.IsChanged);
buttonsaveall.Enabled = (explicitsavescripts > 0);
- buttoncompile.Enabled = (t != null) && (t.Config.Compiler != null);
+ buttoncompile.Enabled = (t != null && t.Config.Compiler != null);
buttonsearch.Enabled = (t != null); //mxd
- buttonkeywordhelp.Enabled = (t != null) && !string.IsNullOrEmpty(t.Config.KeywordHelp);
- buttonscriptconfig.Enabled = (t != null) && t.IsReconfigurable;
- buttonundo.Enabled = (t != null);
- buttonredo.Enabled = (t != null);
- buttoncopy.Enabled = (t != null);
- buttoncut.Enabled = (t != null);
- buttonpaste.Enabled = (t != null);
- buttonclose.Enabled = (t != null) && t.IsClosable;
+ buttonkeywordhelp.Enabled = (t != null && !string.IsNullOrEmpty(t.Config.KeywordHelp));
+ buttonscriptconfig.Enabled = (t != null && t.IsReconfigurable);
+ buttonundo.Enabled = (t != null && t.Scintilla.CanUndo);
+ buttonredo.Enabled = (t != null && t.Scintilla.CanRedo);
+ buttoncopy.Enabled = (t != null && t.Scintilla.SelectionStart < t.Scintilla.SelectionEnd);
+ buttoncut.Enabled = (t != null && t.Scintilla.SelectionStart < t.Scintilla.SelectionEnd);
+ buttonpaste.Enabled = (t != null && t.Scintilla.CanPaste);
+ buttonclose.Enabled = (t != null && t.IsClosable);
buttonsnippets.DropDownItems.Clear(); //mxd
- buttonsnippets.Enabled = (t != null) && t.Config.Snippets.Count > 0; //mxd
+ buttonsnippets.Enabled = (t != null && t.Config.Snippets.Count > 0); //mxd
+ buttonindent.Enabled = (t != null); //mxd
+ buttonunindent.Enabled = (t != null && t.Scintilla.Lines[t.Scintilla.CurrentLine].Indentation > 0); //mxd
+ buttonwhitespace.Enabled = (t != null); //mxd
+ buttonwordwrap.Enabled = (t != null); //mxd
if(t != null)
{
@@ -519,7 +542,8 @@ namespace CodeImp.DoomBuilder.Controls
//mxd. Add snippets
if(t.Config != null && t.Config.Snippets.Count > 0)
{
- if(t.Config.Snippets.Count > 0) foreach(KeyValuePair group in t.Config.Snippets) buttonsnippets.DropDownItems.Add(group.Key).Click += OnInsertSnippetClick;
+ if(t.Config.Snippets.Count > 0)
+ foreach(string snippetname in t.Config.Snippets) buttonsnippets.DropDownItems.Add(snippetname).Click += OnInsertSnippetClick;
}
// Focus to script editor
@@ -589,24 +613,27 @@ namespace CodeImp.DoomBuilder.Controls
// Done
t.OnTextChanged += tabpage_OnTextChanged; //mxd
- t.IsChanged = false; //mxd. Not changed yet
+ t.Scintilla.UpdateUI += scintilla_OnUpdateUI;
UpdateToolbar(true);
return t;
}
- else
- {
- // Failed
- return null;
- }
+
+ // Failed
+ return null;
}
// This saves the current open script
public void ExplicitSaveCurrentTab()
{
ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab);
- if((t != null) && t.ExplicitSave)
+ if((t != null))
{
- buttonsave_Click(this, EventArgs.Empty);
+ if(t.ExplicitSave)
+ buttonsave_Click(this, EventArgs.Empty);
+ else if(t.Config.Compiler != null) //mxd
+ buttoncompile_Click(this, EventArgs.Empty);
+ else
+ General.MessageBeep(MessageBeepType.Default);
}
else
{
@@ -625,7 +652,7 @@ namespace CodeImp.DoomBuilder.Controls
{
// Get script
ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab);
- return t.LaunchKeywordHelp();
+ return (t != null && t.LaunchKeywordHelp());
}
//mxd. This changes status text
@@ -837,18 +864,14 @@ namespace CodeImp.DoomBuilder.Controls
t.SaveAs(savefile.FileName);
return true;
}
- else
- {
- // Cancelled
- return false;
- }
- }
- else
- {
- // Save to same filename
- t.Save();
- return true;
+
+ // Cancelled
+ return false;
}
+
+ // Save to same filename
+ t.Save();
+ return true;
}
// A tab is selected
@@ -894,15 +917,15 @@ namespace CodeImp.DoomBuilder.Controls
}
// Compile now
- DisplayStatus(ScriptStatusType.Busy, "Compiling script \"" + t.Text + "\"...");
+ DisplayStatus(ScriptStatusType.Busy, "Compiling script \"" + t.Title + "\"...");
Cursor.Current = Cursors.WaitCursor;
t.Compile();
// Show warning
if((compilererrors != null) && (compilererrors.Count > 0))
- DisplayStatus(ScriptStatusType.Warning, compilererrors.Count + " errors while compiling \"" + t.Text + "\"!");
+ DisplayStatus(ScriptStatusType.Warning, compilererrors.Count + " errors while compiling \"" + t.Title + "\"!");
else
- DisplayStatus(ScriptStatusType.Info, "Script \"" + t.Text + "\" compiled without errors.");
+ DisplayStatus(ScriptStatusType.Info, "Script \"" + t.Title + "\" compiled without errors.");
Cursor.Current = Cursors.Default;
UpdateToolbar(true);
@@ -948,6 +971,32 @@ namespace CodeImp.DoomBuilder.Controls
UpdateToolbar(true);
}
+ //mxd
+ private void buttonunindent_Click(object sender, EventArgs e)
+ {
+ ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab);
+ t.IndentSelection(false);
+ }
+
+ //mxd
+ private void buttonindent_Click(object sender, EventArgs e)
+ {
+ ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab);
+ t.IndentSelection(true);
+ }
+
+ //mxd
+ private void buttonwhitespace_Click(object sender, EventArgs e)
+ {
+ ApplyTabSettings();
+ }
+
+ //mxd
+ private void buttonwordwrap_Click(object sender, EventArgs e)
+ {
+ ApplyTabSettings();
+ }
+
//mxd. Search clicked
private void buttonsearch_Click(object sender, EventArgs e)
{
@@ -958,7 +1007,7 @@ namespace CodeImp.DoomBuilder.Controls
private void OnInsertSnippetClick(object sender, EventArgs eventArgs)
{
ScriptDocumentTab t = (tabs.SelectedTab as ScriptDocumentTab);
- t.InsertSnippet( t.Config.Snippets[((ToolStripItem)sender).Text] );
+ t.InsertSnippet( ((ToolStripItem)sender).Text );
}
// Mouse released on tabs
@@ -967,13 +1016,52 @@ namespace CodeImp.DoomBuilder.Controls
ForceFocus();
}
- //mxd
+ //mxd. Text in ScriptFileDocumentTab was changed
private void tabpage_OnTextChanged(object sender, EventArgs eventArgs)
{
if(tabs.SelectedTab != null)
{
ScriptDocumentTab curtab = tabs.SelectedTab as ScriptDocumentTab;
- buttonsave.Enabled = (curtab != null && curtab.ExplicitSave && curtab.IsChanged);
+ if(curtab != null)
+ {
+ buttonsave.Enabled = (curtab.ExplicitSave && curtab.IsChanged);
+ buttonundo.Enabled = curtab.Scintilla.CanUndo;
+ buttonredo.Enabled = curtab.Scintilla.CanRedo;
+ }
+ }
+ }
+
+ //mxd. Text in ScriptLumpDocumentTab was changed
+ private void tabpage_OnLumpTextChanged(object sender, EventArgs e)
+ {
+ if(tabs.SelectedTab != null)
+ {
+ ScriptDocumentTab curtab = tabs.SelectedTab as ScriptDocumentTab;
+ if(curtab != null)
+ {
+ buttonundo.Enabled = curtab.Scintilla.CanUndo;
+ buttonredo.Enabled = curtab.Scintilla.CanRedo;
+ }
+ }
+ }
+
+ //mxd
+ private void scintilla_OnUpdateUI(object sender, UpdateUIEventArgs e)
+ {
+ Scintilla s = sender as Scintilla;
+ if(s != null)
+ {
+ // Update caret position info [line] : [caret pos start] OR [caret pos start x selection length] ([total lines])
+ positionlabel.Text = (s.CurrentLine + 1) + " : "
+ + (s.SelectionStart + 1 - s.Lines[s.LineFromPosition(s.SelectionStart)].Position)
+ + (s.SelectionStart != s.SelectionEnd ? "x" + (s.SelectionEnd - s.SelectionStart) : "")
+ + " (" + s.Lines.Count + ")";
+
+ // Update copy-paste buttons
+ buttoncut.Enabled = (s.SelectionEnd > s.SelectionStart);
+ buttoncopy.Enabled = (s.SelectionEnd > s.SelectionStart);
+ buttonpaste.Enabled = s.CanPaste;
+ buttonunindent.Enabled = s.Lines[s.CurrentLine].Indentation > 0;
}
}
diff --git a/Source/Core/Controls/ScriptFileDocumentTab.cs b/Source/Core/Controls/ScriptFileDocumentTab.cs
index c5607de4..698ce69f 100644
--- a/Source/Core/Controls/ScriptFileDocumentTab.cs
+++ b/Source/Core/Controls/ScriptFileDocumentTab.cs
@@ -61,7 +61,7 @@ namespace CodeImp.DoomBuilder.Controls
if(config.Extensions.Length > 0) ext = "." + config.Extensions[0];
SetTitle("Untitled" + ext);
editor.ClearUndoRedo();
- navigator.Enabled = (config.ScriptType != ScriptType.UNKNOWN); //mxd
+ editor.FunctionBar.Enabled = (config.ScriptType != ScriptType.UNKNOWN); //mxd
}
#endregion
@@ -289,7 +289,7 @@ namespace CodeImp.DoomBuilder.Controls
}
// Done
- editor.IsChanged = false;
+ editor.SetSavePoint(); //mxd
UpdateTitle(); //mxd
return true;
}
@@ -318,7 +318,7 @@ namespace CodeImp.DoomBuilder.Controls
try
{
// Read the file
- editor.SetText(File.ReadAllBytes(filepathname));
+ editor.Text = File.ReadAllText(filepathname); //mxd
}
catch(Exception e)
{
@@ -332,7 +332,6 @@ namespace CodeImp.DoomBuilder.Controls
// Setup
this.filepathname = filepathname;
editor.ClearUndoRedo();
- editor.IsChanged = false; //mxd. Not changed yet
SetTitle(Path.GetFileName(filepathname));
UpdateNavigator(); //mxd
diff --git a/Source/Core/Controls/ScriptLumpDocumentTab.cs b/Source/Core/Controls/ScriptLumpDocumentTab.cs
index f9a79abd..5b774514 100644
--- a/Source/Core/Controls/ScriptLumpDocumentTab.cs
+++ b/Source/Core/Controls/ScriptLumpDocumentTab.cs
@@ -17,9 +17,9 @@
#region ================== Namespaces
using System.Collections.Generic;
-using CodeImp.DoomBuilder.Config;
using System.IO;
using CodeImp.DoomBuilder.Compilers;
+using CodeImp.DoomBuilder.Config;
#endregion
@@ -72,13 +72,12 @@ namespace CodeImp.DoomBuilder.Controls
MemoryStream stream = General.Map.GetLumpData(this.lumpname);
if(stream != null)
{
- editor.SetText(stream.ToArray());
+ editor.SetText(stream.ToArray()); //mxd
editor.ClearUndoRedo();
UpdateNavigator(); //mxd
}
// Set title
- IsChanged = false; //mxd. Not changed yet
SetTitle(ismapheader ? General.Map.Options.CurrentName : this.lumpname.ToUpper());
}
@@ -116,7 +115,7 @@ namespace CodeImp.DoomBuilder.Controls
// Store the lump data
MemoryStream stream = new MemoryStream(editor.GetText());
General.Map.SetLumpData(lumpname, stream);
- editor.IsChanged = false;
+ editor.SetSavePoint(); //mxd
UpdateTitle(); //mxd
return true;
}
diff --git a/Source/Core/Data/ImageData.cs b/Source/Core/Data/ImageData.cs
index 06e2cc87..d5cbbc88 100644
--- a/Source/Core/Data/ImageData.cs
+++ b/Source/Core/Data/ImageData.cs
@@ -547,8 +547,8 @@ namespace CodeImp.DoomBuilder.Data
// This returns a preview image
public virtual Image GetPreview()
{
- lock(this)
- {
+ //lock(this)
+ //{
// Preview ready?
if(previewstate == ImageLoadState.Ready)
{
@@ -565,7 +565,7 @@ namespace CodeImp.DoomBuilder.Data
// Return loading bitmap
return Properties.Resources.Hourglass;
- }
+ //}
}
//mxd. This greatly speeds up Dictionary lookups
diff --git a/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs b/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs
index 8b40ed32..320ba1dd 100644
--- a/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs
+++ b/Source/Core/GZBuilder/GZDoom/AcsParserSE.cs
@@ -166,9 +166,9 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom
case "function":
{
SkipWhitespace(true);
- int startpos = (int)stream.Position;
string funcname = ReadToken(); //read return type
SkipWhitespace(true);
+ int startpos = (int)stream.Position;
funcname += " " + ReadToken(); //read function name
// Try to parse argument names
diff --git a/Source/Core/GZBuilder/Windows/ExceptionDialog.cs b/Source/Core/GZBuilder/Windows/ExceptionDialog.cs
index e1d97ed6..311bea14 100644
--- a/Source/Core/GZBuilder/Windows/ExceptionDialog.cs
+++ b/Source/Core/GZBuilder/Windows/ExceptionDialog.cs
@@ -156,8 +156,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.Windows
private static string GetExceptionDescription(Exception ex)
{
- //add to error logger
- General.ErrorLogger.Add(ErrorType.Error, "**** " + ex.Source + ": " + ex.Message + " ****");
+ // Add to error logger
+ General.WriteLogLine("***********************************************************");
+ General.ErrorLogger.Add(ErrorType.Error, ex.Source + ": " + ex.Message);
+ General.WriteLogLine("***********************************************************");
string message = "********EXCEPTION DETAILS********"
+ Environment.NewLine + ex.Source + ": " + ex.Message + Environment.NewLine + ex.StackTrace;
diff --git a/Source/Core/General/ErrorLogger.cs b/Source/Core/General/ErrorLogger.cs
index 9ce3bc07..354e396a 100644
--- a/Source/Core/General/ErrorLogger.cs
+++ b/Source/Core/General/ErrorLogger.cs
@@ -30,10 +30,11 @@ namespace CodeImp.DoomBuilder
#region ================== Variables
- private List errors;
+ private readonly List errors;
private volatile bool changed;
private volatile bool erroradded;
private volatile bool warningadded;
+ private object threadlock = new object(); //mxd
#endregion
@@ -62,7 +63,7 @@ namespace CodeImp.DoomBuilder
// This clears the errors
public void Clear()
{
- lock(this)
+ lock(threadlock)
{
changed = false;
erroradded = false;
@@ -79,7 +80,7 @@ namespace CodeImp.DoomBuilder
{
string prefix = "";
- lock(this)
+ lock(threadlock)
{
//mxd. Don't add duplicate messages
if(errors.Count == 0 || message != errors[errors.Count - 1].message || type != errors[errors.Count - 1].type)
@@ -117,13 +118,24 @@ namespace CodeImp.DoomBuilder
}
// This returns the list of errors
- internal List GetErrors()
+ /*internal List GetErrors()
{
lock(this)
{
List copylist = new List(errors);
return copylist;
}
+ }*/
+
+ //mxd. This returns the list of errors starting at given index
+ internal IEnumerable GetErrors(int startindex)
+ {
+ if(startindex >= errors.Count) return new List();
+
+ ErrorItem[] result = new ErrorItem[errors.Count - startindex];
+ errors.CopyTo(startindex, result, 0, result.Length);
+
+ return result;
}
#endregion
diff --git a/Source/Core/Properties/Resources.Designer.cs b/Source/Core/Properties/Resources.Designer.cs
index 462eb5ac..8486a9ed 100644
--- a/Source/Core/Properties/Resources.Designer.cs
+++ b/Source/Core/Properties/Resources.Designer.cs
@@ -753,17 +753,17 @@ namespace CodeImp.DoomBuilder.Properties {
}
}
- internal static byte[] ScriptConstant {
+ internal static System.Drawing.Bitmap ScriptConstant {
get {
object obj = ResourceManager.GetObject("ScriptConstant", resourceCulture);
- return ((byte[])(obj));
+ return ((System.Drawing.Bitmap)(obj));
}
}
- internal static byte[] ScriptError {
+ internal static System.Drawing.Bitmap ScriptError {
get {
object obj = ResourceManager.GetObject("ScriptError", resourceCulture);
- return ((byte[])(obj));
+ return ((System.Drawing.Bitmap)(obj));
}
}
@@ -774,10 +774,10 @@ namespace CodeImp.DoomBuilder.Properties {
}
}
- internal static byte[] ScriptKeyword {
+ internal static System.Drawing.Bitmap ScriptKeyword {
get {
object obj = ResourceManager.GetObject("ScriptKeyword", resourceCulture);
- return ((byte[])(obj));
+ return ((System.Drawing.Bitmap)(obj));
}
}
@@ -788,10 +788,10 @@ namespace CodeImp.DoomBuilder.Properties {
}
}
- internal static byte[] ScriptSnippet {
+ internal static System.Drawing.Bitmap ScriptSnippet {
get {
object obj = ResourceManager.GetObject("ScriptSnippet", resourceCulture);
- return ((byte[])(obj));
+ return ((System.Drawing.Bitmap)(obj));
}
}
@@ -942,6 +942,27 @@ namespace CodeImp.DoomBuilder.Properties {
}
}
+ internal static System.Drawing.Bitmap TextIndent {
+ get {
+ object obj = ResourceManager.GetObject("TextIndent", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap TextUnindent {
+ get {
+ object obj = ResourceManager.GetObject("TextUnindent", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap TextWhitespace {
+ get {
+ object obj = ResourceManager.GetObject("TextWhitespace", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
internal static System.Drawing.Bitmap ThingStatistics {
get {
object obj = ResourceManager.GetObject("ThingStatistics", resourceCulture);
diff --git a/Source/Core/Properties/Resources.resx b/Source/Core/Properties/Resources.resx
index ebf75344..a906cb94 100644
--- a/Source/Core/Properties/Resources.resx
+++ b/Source/Core/Properties/Resources.resx
@@ -154,6 +154,9 @@
..\Resources\SaveAll.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Update.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\Monster2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -175,15 +178,27 @@
..\Resources\MixedThings.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\TextUnindent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\Marine.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\InfoPanelCollapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\mergegeometry.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\Splash3_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Group.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\TagStatistics.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\VisualVertices.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -196,6 +211,9 @@
..\Resources\ScriptHelp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Light_animate.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\CommentSmile.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -217,17 +235,14 @@
..\Resources\Redo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Status0.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Brightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Model.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\mergegeometry.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\ScriptSnippet.xpm;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ ..\Resources\Configuration.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\CommentProblem.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -238,8 +253,8 @@
..\Resources\MLogo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\UnknownImage.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Reload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Paste.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -248,7 +263,7 @@
..\Resources\LightDisabled.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
- ..\Resources\ScriptConstant.xpm;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ ..\Resources\ScriptConstant.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\FolderExplore.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -265,12 +280,18 @@
..\Resources\CLogo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\WarningOff.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\List.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\TextWhitespace.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\LinedefColorPresets.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -286,8 +307,8 @@
..\Resources\Cursor.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Grid2_arrowup.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Preferences.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Reset.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -313,6 +334,12 @@
..\Resources\NewMap2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\About.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\GridDecrease.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\SearchClear.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -331,6 +358,9 @@
..\Resources\InfoLine.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Status10.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\MissingTexture.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -338,7 +368,7 @@
..\Resources\ErrorLarge.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
- ..\Resources\ScriptError.xpm;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ ..\Resources\ScriptError.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Lightbulb.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -370,6 +400,9 @@
..\Resources\Model_selected.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\GridDynamic.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\Collapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -382,11 +415,11 @@
..\Resources\Unlink.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Status10.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\TextIndent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Properties.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Status0.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Script2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -406,6 +439,9 @@
..\Resources\Hourglass.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\GridIncrease.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\Folder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -424,17 +460,20 @@
..\Resources\Status2.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\Link.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Brightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\InfoPanelExpand.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\TagStatistics.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\ScriptSnippet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Properties.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Test.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -442,8 +481,8 @@
..\Resources\Undo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\InfoPanelExpand.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\UnknownImage.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Unpin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -454,8 +493,14 @@
..\Resources\ViewTextureFloor.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Light_animate.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Grid2_arrowup.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\GroupRemove.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Sky.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\Pin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -464,7 +509,7 @@
..\Resources\ViewNormal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
- ..\Resources\ScriptKeyword.xpm;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ ..\Resources\ScriptKeyword.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\MissingThing.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -472,11 +517,14 @@
..\Resources\Monster3.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\SkySphere.md3;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
..\Resources\DockerCollapse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\Copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\GroupAdd.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Resources\ViewBrightness.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -511,43 +559,4 @@
..\Resources\Check.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Resources\GridDynamic.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\About.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\Configuration.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\Preferences.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\Reload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\Update.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\Group.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\GroupAdd.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\GroupRemove.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\GridDecrease.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\GridIncrease.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\Sky.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\SkySphere.md3;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
\ No newline at end of file
diff --git a/Source/Core/Rendering/ColorCollection.cs b/Source/Core/Rendering/ColorCollection.cs
index 86f60314..aaaa315e 100644
--- a/Source/Core/Rendering/ColorCollection.cs
+++ b/Source/Core/Rendering/ColorCollection.cs
@@ -20,7 +20,6 @@ using System;
using System.Globalization;
using System.Drawing;
using SlimDX;
-
using Configuration = CodeImp.DoomBuilder.IO.Configuration;
#endregion
@@ -38,7 +37,7 @@ namespace CodeImp.DoomBuilder.Rendering
private const float DARK_ADDITION = -0.2f;
// Palette size
- private const int NUM_COLORS = 41;
+ private const int NUM_COLORS = 49;
public const int NUM_THING_COLORS = 20;
public const int THING_COLORS_OFFSET = 20;
@@ -84,16 +83,23 @@ namespace CodeImp.DoomBuilder.Rendering
public const int THINGCOLOR18 = 38;
public const int THINGCOLOR19 = 39;
public const int THREEDFLOORCOLOR = 40; //mxd
-
+ public const int SCRIPTINDICATOR = 41; //mxd. Additional Script Editor colors
+ public const int SCRIPTBRACEHIGHLIGHT = 42;
+ public const int SCRIPTBADBRACEHIGHLIGHT = 43;
+ public const int SCRIPTWHITESPACE = 44;
+ public const int SCRIPTSELECTIONFORE = 45;
+ public const int SCRIPTSELECTIONBACK = 46;
+ public const int STRINGS = 47;
+ public const int INCLUDES = 48;
#endregion
#region ================== Variables
// Colors
- private PixelColor[] colors;
- private PixelColor[] brightcolors;
- private PixelColor[] darkcolors;
+ private readonly PixelColor[] colors;
+ private readonly PixelColor[] brightcolors;
+ private readonly PixelColor[] darkcolors;
// Color-correction table
private byte[] correctiontable;
@@ -125,6 +131,12 @@ namespace CodeImp.DoomBuilder.Rendering
public PixelColor Selection3D { get { return colors[SELECTION3D]; } internal set { colors[SELECTION3D] = value; } }
public PixelColor ScriptBackground { get { return colors[SCRIPTBACKGROUND]; } internal set { colors[SCRIPTBACKGROUND] = value; } }
+ public PixelColor ScriptIndicator { get { return colors[SCRIPTINDICATOR]; } internal set { colors[SCRIPTINDICATOR] = value; } }
+ public PixelColor ScriptBraceHighlight { get { return colors[SCRIPTBRACEHIGHLIGHT]; } internal set { colors[SCRIPTBRACEHIGHLIGHT] = value; } }
+ public PixelColor ScriptBadBraceHighlight { get { return colors[SCRIPTBADBRACEHIGHLIGHT]; } internal set { colors[SCRIPTBADBRACEHIGHLIGHT] = value; } }
+ public PixelColor ScriptWhitespace { get { return colors[SCRIPTWHITESPACE]; } internal set { colors[SCRIPTWHITESPACE] = value; } }
+ public PixelColor ScriptSelectionForeColor { get { return colors[SCRIPTSELECTIONFORE]; } internal set { colors[SCRIPTSELECTIONFORE] = value; } }
+ public PixelColor ScriptSelectionBackColor { get { return colors[SCRIPTSELECTIONBACK]; } internal set { colors[SCRIPTSELECTIONBACK] = value; } }
public PixelColor LineNumbers { get { return colors[LINENUMBERS]; } internal set { colors[LINENUMBERS] = value; } }
public PixelColor PlainText { get { return colors[PLAINTEXT]; } internal set { colors[PLAINTEXT] = value; } }
public PixelColor Comments { get { return colors[COMMENTS]; } internal set { colors[COMMENTS] = value; } }
@@ -148,10 +160,32 @@ namespace CodeImp.DoomBuilder.Rendering
for(int i = 0; i < NUM_COLORS; i++)
{
// Read color
- colors[i] = PixelColor.FromInt(cfg.ReadSetting("colors.color" + i.ToString(CultureInfo.InvariantCulture), -16711872)); //mxd. changed default color from transparent to light-green
+ colors[i] = PixelColor.FromInt(cfg.ReadSetting("colors.color" + i.ToString(CultureInfo.InvariantCulture), 0));
}
- // Set new colors
+ //mxd. Set new colors (previously these were defined in GZBuilder.default.cfg)
+ if(colors[BACKGROUND].ToInt() == 0) colors[BACKGROUND] = PixelColor.FromInt(-16777216);
+ if(colors[VERTICES].ToInt() == 0) colors[VERTICES] = PixelColor.FromInt(-11425537);
+ if(colors[LINEDEFS].ToInt() == 0) colors[LINEDEFS] = PixelColor.FromInt(-1);
+ if(colors[MODELWIRECOLOR].ToInt() == 0) colors[MODELWIRECOLOR] = PixelColor.FromInt(-4259937);
+ if(colors[INFOLINECOLOR].ToInt() == 0) colors[INFOLINECOLOR] = PixelColor.FromInt(-3750145);
+ if(colors[HIGHLIGHT].ToInt() == 0) colors[HIGHLIGHT] = PixelColor.FromInt(-21504);
+ if(colors[SELECTION].ToInt() == 0) colors[SELECTION] = PixelColor.FromInt(-49152);
+ if(colors[INDICATION].ToInt() == 0) colors[INDICATION] = PixelColor.FromInt(-128);
+ if(colors[GRID].ToInt() == 0) colors[GRID] = PixelColor.FromInt(-12171706);
+ if(colors[GRID64].ToInt() == 0) colors[GRID64] = PixelColor.FromInt(-13018769);
+ if(colors[CROSSHAIR3D].ToInt() == 0) colors[CROSSHAIR3D] = PixelColor.FromInt(-16711681); // Unused!
+ if(colors[HIGHLIGHT3D].ToInt() == 0) colors[HIGHLIGHT3D] = PixelColor.FromInt(-24576);
+ if(colors[SELECTION3D].ToInt() == 0) colors[SELECTION3D] = PixelColor.FromInt(-49152);
+ if(colors[SCRIPTBACKGROUND].ToInt() == 0) colors[SCRIPTBACKGROUND] = PixelColor.FromInt(-1);
+ if(colors[LINENUMBERS].ToInt() == 0) colors[LINENUMBERS] = PixelColor.FromInt(-13921873);
+ if(colors[PLAINTEXT].ToInt() == 0) colors[PLAINTEXT] = PixelColor.FromInt(-16777216);
+ if(colors[COMMENTS].ToInt() == 0) colors[COMMENTS] = PixelColor.FromInt(-16744448);
+ if(colors[KEYWORDS].ToInt() == 0) colors[KEYWORDS] = PixelColor.FromInt(-16741493);
+ if(colors[LITERALS].ToInt() == 0) colors[LITERALS] = PixelColor.FromInt(-16776961);
+ if(colors[CONSTANTS].ToInt() == 0) colors[CONSTANTS] = PixelColor.FromInt(-12566273);
+
+ // Set new thing colors
if(colors[THINGCOLOR00].ToInt() == 0) colors[THINGCOLOR00] = PixelColor.FromColor(Color.DimGray);
if(colors[THINGCOLOR01].ToInt() == 0) colors[THINGCOLOR01] = PixelColor.FromColor(Color.RoyalBlue);
if(colors[THINGCOLOR02].ToInt() == 0) colors[THINGCOLOR02] = PixelColor.FromColor(Color.ForestGreen);
@@ -172,6 +206,17 @@ namespace CodeImp.DoomBuilder.Rendering
if(colors[THINGCOLOR17].ToInt() == 0) colors[THINGCOLOR17] = PixelColor.FromColor(Color.DarkOrange);
if(colors[THINGCOLOR18].ToInt() == 0) colors[THINGCOLOR18] = PixelColor.FromColor(Color.DarkKhaki);
if(colors[THINGCOLOR19].ToInt() == 0) colors[THINGCOLOR19] = PixelColor.FromColor(Color.Goldenrod);
+
+ //mxd. Set the rest of new colors (previously these were also defined in GZBuilder.default.cfg)
+ if(colors[THREEDFLOORCOLOR].ToInt() == 0) colors[THREEDFLOORCOLOR] = PixelColor.FromInt(-65536);
+ if(colors[SCRIPTINDICATOR].ToInt() == 0) colors[SCRIPTINDICATOR] = PixelColor.FromInt(-16711936);
+ if(colors[SCRIPTBRACEHIGHLIGHT].ToInt() == 0) colors[SCRIPTBRACEHIGHLIGHT] = PixelColor.FromInt(-16711681);
+ if(colors[SCRIPTBADBRACEHIGHLIGHT].ToInt() == 0) colors[SCRIPTBADBRACEHIGHLIGHT] = PixelColor.FromInt(-65536);
+ if(colors[SCRIPTWHITESPACE].ToInt() == 0) colors[SCRIPTWHITESPACE] = PixelColor.FromInt(-8355712);
+ if(colors[SCRIPTSELECTIONFORE].ToInt() == 0) colors[SCRIPTSELECTIONFORE] = PixelColor.FromInt(-1);
+ if(colors[SCRIPTSELECTIONBACK].ToInt() == 0) colors[SCRIPTSELECTIONBACK] = PixelColor.FromInt(-13395457);
+ if(colors[STRINGS].ToInt() == 0) colors[STRINGS] = PixelColor.FromInt(-6089451);
+ if(colors[INCLUDES].ToInt() == 0) colors[INCLUDES] = PixelColor.FromInt(-9868951);
// Create assist colors
CreateAssistColors();
diff --git a/Source/Core/Rendering/D3DShader.cs b/Source/Core/Rendering/D3DShader.cs
index b5275e41..dd301e03 100644
--- a/Source/Core/Rendering/D3DShader.cs
+++ b/Source/Core/Rendering/D3DShader.cs
@@ -109,6 +109,8 @@ namespace CodeImp.DoomBuilder.Rendering
}
catch(Exception)
{
+ string debugerrors = string.Empty; //mxd
+
// Compiling failed, try with debug information
try
{
@@ -116,16 +118,27 @@ namespace CodeImp.DoomBuilder.Rendering
fxdata.Seek(0, SeekOrigin.Begin);
// Compile effect
- fx = Effect.FromStream(General.Map.Graphics.Device, fxdata, null, null, null, ShaderFlags.Debug, null, out errors);
- if(!string.IsNullOrEmpty(errors))
+ fx = Effect.FromStream(General.Map.Graphics.Device, fxdata, null, null, null, ShaderFlags.Debug, null, out debugerrors);
+ if(!string.IsNullOrEmpty(debugerrors))
{
- throw new Exception("Errors in effect file " + fxfile + ": " + errors);
+ throw new Exception("Errors in effect file " + fxfile + ": " + debugerrors);
}
}
catch(Exception e)
{
+ //mxd. Try to get something. Anything!
+ string message;
+ if(!string.IsNullOrEmpty(debugerrors))
+ message = e.Message + "\nInitial message (debug mode): \"" + debugerrors + "\"";
+ else if(!string.IsNullOrEmpty(errors))
+ message = e.Message + "\nInitial message: \"" + errors + "\"";
+ else
+ message = e.ToString();
+
+ if(string.IsNullOrEmpty(message)) message = "No initial message...";
+
// No debug information, just crash
- throw new Exception(e.GetType().Name + " while loading effect " + fxfile + ": " + e.Message + "\nInitial message: " + errors);
+ throw new Exception(e.GetType().Name + " while loading effect " + fxfile + ": " + message);
}
}
diff --git a/Source/Core/Resources/Lexers.cfg b/Source/Core/Resources/Lexers.cfg
index a62b35c7..5cb1b9ce 100644
--- a/Source/Core/Resources/Lexers.cfg
+++ b/Source/Core/Resources/Lexers.cfg
@@ -33,6 +33,8 @@ lexer3 // CPP-style, case-sensitive
7 = 4; // literal
16 = 2; // constants
37 = 5; // ident guides
+ 6 = 6; // strings
+ 9 = 7; // includes
keywordsindex = 0;
constantsindex = 1;
@@ -87,10 +89,10 @@ lexer35 // CPP-style, case-insensitive
7 = 4; // literal
16 = 2; // constants
37 = 5; // ident guides
+ 6 = 6; // strings
+ 9 = 7; // includes
keywordsindex = 0;
constantsindex = 1;
snippetindex = 2;
-}
-
-
+}
\ No newline at end of file
diff --git a/Source/Core/Resources/ScriptConstant.png b/Source/Core/Resources/ScriptConstant.png
new file mode 100644
index 00000000..556e12ae
Binary files /dev/null and b/Source/Core/Resources/ScriptConstant.png differ
diff --git a/Source/Core/Resources/ScriptError.png b/Source/Core/Resources/ScriptError.png
new file mode 100644
index 00000000..bc396ed5
Binary files /dev/null and b/Source/Core/Resources/ScriptError.png differ
diff --git a/Source/Core/Resources/ScriptKeyword.png b/Source/Core/Resources/ScriptKeyword.png
new file mode 100644
index 00000000..a83b2f17
Binary files /dev/null and b/Source/Core/Resources/ScriptKeyword.png differ
diff --git a/Source/Core/Resources/ScriptSnippet.png b/Source/Core/Resources/ScriptSnippet.png
new file mode 100644
index 00000000..60d53464
Binary files /dev/null and b/Source/Core/Resources/ScriptSnippet.png differ
diff --git a/Source/Core/Resources/TextIndent.png b/Source/Core/Resources/TextIndent.png
new file mode 100644
index 00000000..93645323
Binary files /dev/null and b/Source/Core/Resources/TextIndent.png differ
diff --git a/Source/Core/Resources/TextUnindent.png b/Source/Core/Resources/TextUnindent.png
new file mode 100644
index 00000000..1651b074
Binary files /dev/null and b/Source/Core/Resources/TextUnindent.png differ
diff --git a/Source/Core/Resources/TextWhitespace.png b/Source/Core/Resources/TextWhitespace.png
new file mode 100644
index 00000000..88b6e526
Binary files /dev/null and b/Source/Core/Resources/TextWhitespace.png differ
diff --git a/Source/Core/Resources/WordWrap.png b/Source/Core/Resources/WordWrap.png
index 7f630347..7734f726 100644
Binary files a/Source/Core/Resources/WordWrap.png and b/Source/Core/Resources/WordWrap.png differ
diff --git a/Source/Core/Windows/ErrorsForm.cs b/Source/Core/Windows/ErrorsForm.cs
index 463a64b6..2114729c 100644
--- a/Source/Core/Windows/ErrorsForm.cs
+++ b/Source/Core/Windows/ErrorsForm.cs
@@ -42,8 +42,7 @@ namespace CodeImp.DoomBuilder.Windows
FillList();
checkerrors.Start();
checkshow.Checked = General.Settings.ShowErrorsWindow;
- //mxd
- grid.Focus();
+ grid.Focus(); //mxd
}
#endregion
@@ -55,11 +54,12 @@ namespace CodeImp.DoomBuilder.Windows
{
// Fill the list with the items we don't have yet
General.ErrorLogger.HasChanged = false;
- List errors = General.ErrorLogger.GetErrors();
+
+ //mxd. Rewritten to get only the new items from the ErrorLogger
int startindex = grid.Rows.Count;
- for(int i = startindex; i < errors.Count; i++)
+ IEnumerable errors = General.ErrorLogger.GetErrors(startindex);
+ foreach(ErrorItem e in errors)
{
- ErrorItem e = errors[i];
Image icon = (e.type == ErrorType.Error) ? Properties.Resources.ErrorLarge : Properties.Resources.WarningLarge;
int index = grid.Rows.Add();
DataGridViewRow row = grid.Rows[index];
@@ -145,7 +145,6 @@ namespace CodeImp.DoomBuilder.Windows
private void ErrorsForm_Shown(object sender, EventArgs e)
{
if(grid.Rows.Count > 0) grid.Rows[0].Selected = false;
-
}
private void grid_CellContentClick(object sender, DataGridViewCellEventArgs e)