summaryrefslogtreecommitdiff
path: root/script-editor/MainForm.cs
diff options
context:
space:
mode:
authorJes <jes>2010-01-14 19:01:07 +0100
committerJes <jes>2010-01-14 19:01:07 +0100
commit78455c91b09616e2ff6713adbd6d44463a80608b (patch)
treeadf431be0dde10a2e7121348991893fd306de83a /script-editor/MainForm.cs
parent49b3d926ea33f486468f0bc855585968eacca124 (diff)
Mise à jour de l'éditeur
Diffstat (limited to 'script-editor/MainForm.cs')
-rw-r--r--script-editor/MainForm.cs534
1 files changed, 356 insertions, 178 deletions
diff --git a/script-editor/MainForm.cs b/script-editor/MainForm.cs
index 110eb61..fe1bcb0 100644
--- a/script-editor/MainForm.cs
+++ b/script-editor/MainForm.cs
@@ -6,13 +6,18 @@ using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Serialization;
+using tom;
namespace VPScriptEditor
{
public partial class VPScriptEditor
{
private Pointer[] inputPtr, outputPtr;
- private int currPointerNb;
+ private PointerAnnotation[] annotations;
+ private ITextDocument inDoc, outDoc;
+ private int currPointerNb, nbUndefinedPtr, nextUntranslatedPtr, nextUnsurePtr;
private string outputFileName;
private FontFile vpFont;
private Bitmap conersBmp;
@@ -26,40 +31,54 @@ namespace VPScriptEditor
dfile.Close();
Stream imgStream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("VPScriptEditor.corners.png");
- if (imgStream == null)
- throw new Exception("Can't open embedded image");
-
+ if (imgStream == null) throw new Exception("Can't open embedded image");
conersBmp = new Bitmap(imgStream);
- this.ActiveControl = txtbxOutputPtr;
+ inDoc = getDocument(richEditInputPtr);
+ outDoc = getDocument(richEditOutputPtr);
+
+ updateTitle();
+ }
+
+ [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
+ private extern static IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, out IntPtr lParam);
+ private const int WM_USER = 0x400, EM_GETOLEINTERFACE = WM_USER + 60;
+ private ITextDocument getDocument(RichTextBox rtb)
+ {
+ IntPtr iRichEditOle = IntPtr.Zero;
+ if (SendMessage(rtb.Handle, EM_GETOLEINTERFACE, 0, out iRichEditOle) == IntPtr.Zero)
+ throw new Exception("Can't access IRichEditOle object from RichTextBox");
+
+ return (ITextDocument)System.Runtime.InteropServices.Marshal.GetTypedObjectForIUnknown(iRichEditOle, typeof(tom.ITextDocument));
}
private Pointer[] parseXML(String content)
{
Match match = Regex.Match(content.Replace("\r\n", "\n"), "^<roomscripts>\\n*((?:.|\\n)*?)(?:\\n\\n)?</roomscripts>\\n*$");
- if (!match.Success)
- throw new Exception("Bad script format!");
+ if (!match.Success) throw new Exception("Bad script format!");
MatchCollection matches = Regex.Matches(match.Groups[1].Value, "<ptr n=\"(\\d+)\" room=\"(.+?)\"/>\\n(<nowindowdetected/>|<window (type=\"fixed\"|x=\"(.+?)\" y=\"(.+?)\" width=\"(.+?)\" height=\"(.+?)\")/>)\\n((?:.|\\n)*?)(?=(?:\\n\\n<ptr n=\"\\d+\".*/>|$))");
+ if (matches.Count == 0) throw new Exception("Void script!");
Pointer[] pointers = new Pointer[matches.Count];
for (int i = 0; i < matches.Count; i++)
{
int nb = int.Parse(matches[i].Groups[1].Value);
+ if (nb <= 0 || nb > matches.Count) throw new Exception("Pointer no " + nb + " out of range!");
- if (nb <= 0 || nb > matches.Count)
- throw new Exception("Pointer no " + nb + " out of range!");
-
- if (pointers[nb - 1] != null)
- throw new Exception("Duplicate pointer no " + nb);
-
+ if (pointers[nb - 1] != null) throw new Exception("Duplicate pointer no " + nb);
pointers[nb - 1] = new Pointer(matches[i].Groups[2].Value, matches[i].Groups[5].Value.Length > 0 ? WindowType.Normal : (matches[i].Groups[4].Value.Length > 0 ? WindowType.Fixed : WindowType.None), matches[i].Groups[5].Value, matches[i].Groups[6].Value, matches[i].Groups[7].Value, matches[i].Groups[8].Value, matches[i].Groups[9].Value);
}
return pointers;
}
+ private string getAnnotationFileName(string filename)
+ {
+ return Path.GetDirectoryName(filename) + "\\" + Path.GetFileNameWithoutExtension(filename) + ".annotation.xml";
+ }
+
private void OpenMenuItem_Click(System.Object sender, System.EventArgs e)
{
StreamReader sr = null;
@@ -72,31 +91,59 @@ namespace VPScriptEditor
if (ofd.ShowDialog() != DialogResult.OK)
return;
- String origFileName = ofd.FileName;
+ String origFileName = ofd.FileName, outputFileName;
sr = new StreamReader(ofd.OpenFile());
- inputPtr = parseXML(sr.ReadToEnd());
+ Pointer[] inputPtr = parseXML(sr.ReadToEnd());
sr.Close();
ofd.Title = "Select *translated* script file";
while (true)
- {
if (ofd.ShowDialog() != DialogResult.OK)
return;
-
- if ((outputFileName = ofd.FileName) == origFileName)
- MessageBox.Show("Select a different file than the original script!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
else
- {
- sr = new StreamReader(ofd.OpenFile());
- outputPtr = parseXML(sr.ReadToEnd());
- break;
- }
+ if ((outputFileName = ofd.FileName) == origFileName)
+ MessageBox.Show("Select a different file than the original script!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ else
+ break;
+
+ sr = new StreamReader(ofd.OpenFile());
+ Pointer[] outputPtr = parseXML(sr.ReadToEnd());
+ sr.Close();
+ if (outputPtr.Length != inputPtr.Length) throw new Exception("The two scripts don't contain same number of pointers");
+
+ String annotationFileName = getAnnotationFileName(outputFileName);
+ PointerAnnotation[] annotations;
+ if (System.IO.File.Exists(annotationFileName))
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(PointerAnnotation[]));
+ sr = new StreamReader(annotationFileName);
+ annotations = (PointerAnnotation[])serializer.Deserialize(sr);
}
+ else
+ {
+ MessageBox.Show("No annotation file found for " + Path.GetFileName(outputFileName) + "\nA new one will be created on next save", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ annotations = new PointerAnnotation[inputPtr.Length];
+ for (int i = 0; i < inputPtr.Length; i++)
+ annotations[i] = new PointerAnnotation();
+ }
+
+ this.inputPtr = inputPtr;
+ this.outputPtr = outputPtr;
+ this.outputFileName = outputFileName;
+ this.annotations = annotations;
+
+ nbUndefinedPtr = 0;
+ foreach (PointerAnnotation pa in annotations)
+ if (pa.state == PointerState.Undefined)
+ nbUndefinedPtr++;
+
+ toolStripStatusLabel1.Text = Path.GetFileName(outputFileName) + " successfully loaded";
}
catch (Exception ex)
{
- MessageBox.Show(ex.Message);
+ MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
}
finally
{
@@ -106,13 +153,64 @@ namespace VPScriptEditor
initInterface();
}
- public string[] getText(string input)
+ private void saveCurrentPointer()
{
- string input_new = Regex.Replace(Regex.Replace(input, "<st rep=\"(\\d+)\"/>(.+?)<rrep/>", new MatchEvaluator(delegate(Match m) { return new String(m.Groups[2].Value[0], int.Parse(m.Groups[1].Value)); })), "<.+?/>", "");
- return Regex.Split(input_new, "\r\n");
+ outputPtr[currPointerNb].setVars(inputPtr[currPointerNb].rooms, inputPtr[currPointerNb].type, txtbxOutputX.Text, txtbxOutputY.Text, txtbxOutputWidth.Text, txtbxOutputHeight.Text, richEditOutputPtr.Text.Replace("\r\n", "\n"));
+ annotations[currPointerNb].state = chkDone.Checked ? PointerState.Done : (chkUnsure.Checked ? PointerState.Unsure : PointerState.Undefined);
+ }
+
+ private bool saveOutput(string fileName)
+ {
+ saveCurrentPointer();
+
+ StreamWriter sw = null;
+ try
+ {
+ StringBuilder str = new StringBuilder("<roomscripts>\n\n");
+
+ for (int i = 0; i < outputPtr.Length; i++)
+ {
+ Pointer p = outputPtr[i];
+
+ str.Append("<ptr n=\"" + (i + 1) + "\" room=\"" + p.rooms + "\"/>\n");
+ if (p.type == WindowType.None)
+ str.Append("<nowindowdetected/>");
+ else
+ if (p.type == WindowType.Fixed)
+ str.Append("<window type=\"fixed\"/>");
+ else
+ str.Append("<window x=\"" + p.x + "\" y=\"" + p.y + "\" width=\"" + p.width + "\" height=\"" + p.height + "\"/>");
+
+ str.Append("\n");
+ str.Append(p.content.Replace("\r\n", "\n"));
+ str.Append("\n\n");
+ }
+
+ str.Append("</roomscripts>\n");
+
+ sw = new StreamWriter(fileName);
+ sw.Write(str);
+ sw.Close();
+
+ XmlSerializer serializer = new XmlSerializer(typeof(PointerAnnotation[]));
+ sw = new StreamWriter(getAnnotationFileName(fileName));
+ serializer.Serialize(sw, annotations);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+ finally
+ {
+ if (sw != null) sw.Close();
+ }
+
+ toolStripStatusLabel1.Text = "Last save on " + DateTime.Now.ToString();
+ return true;
}
- public void updateInputPtr()
+ private void updateInputPtr()
{
Pointer p = inputPtr[currPointerNb];
@@ -121,151 +219,141 @@ namespace VPScriptEditor
txtbxInputY.Text = p.y;
txtbxInputWidth.Text = p.width;
txtbxInputHeight.Text = p.height;
- txtbxInputPtr.Text = p.content.Replace("\n", "\r\n");
+ richEditInputPtr.Text = p.content;
}
- public void updateOutputPtr()
+ private void updateOutputPtr()
{
Pointer p = outputPtr[currPointerNb];
-
txtbxOutputX.Text = p.x;
txtbxOutputY.Text = p.y;
txtbxOutputWidth.Text = p.width;
txtbxOutputHeight.Text = p.height;
- txtbxOutputPtr.Text = p.content.Replace("\n", "\r\n");
+ richEditOutputPtr.Text = p.content;
+ txtbxOutputX.Enabled = txtbxOutputY.Enabled = txtbxOutputWidth.Enabled = txtbxOutputHeight.Enabled = bttnResize.Enabled = p.type == WindowType.Normal;
+
+ PointerState ps = annotations[currPointerNb].state;
+ chkDone.CheckedChanged -= this.chkbx_CheckedChanged;
+ chkDone.Checked = ps == PointerState.Done;
+ chkDone.CheckedChanged += this.chkbx_CheckedChanged;
+ chkUnsure.CheckedChanged -= this.chkbx_CheckedChanged;
+ chkUnsure.Checked = ps == PointerState.Unsure;
+ chkUnsure.CheckedChanged += this.chkbx_CheckedChanged;
+ }
- bttnResize.Enabled = p.type == WindowType.Normal;
+ private void updateCommentBttn()
+ {
+ bttnComment.Text = annotations[currPointerNb].comment == null ? "Add comment" : "View/Edit comment";
}
- public void updateInterface()
+ private void updateInterface()
{
+ nextUntranslatedPtr = searchPointer(PointerState.Undefined);
+ nextUnsurePtr = searchPointer(PointerState.Unsure);
+
bttnNext.Enabled = currPointerNb < inputPtr.Length - 1;
bttnPrevious.Enabled = currPointerNb > 0;
+ bttnNextUntranslated.Enabled = nextUntranslatedPtr != -1;
+ bttnNextUnsure.Enabled = nextUnsurePtr != -1;
txtbxPointerNumber.Text = Convert.ToString(currPointerNb + 1);
updateInputPtr();
updateOutputPtr();
+ updateCommentBttn();
pnlInput.Invalidate();
pnlOutput.Invalidate();
}
- public void updateTitle()
+ private void updateTitle()
{
- this.Text = "VPScriptEditor - " + Path.GetFileName(outputFileName);
+ this.Text = AboutBox.AssemblyProduct + (outputFileName != null ? " - " + Path.GetFileName(outputFileName) : "");
}
- public void initInterface()
+ private void updateStatusProgress()
+ {
+ lblStatusProgress.Text = (inputPtr.Length - nbUndefinedPtr) + "/" + inputPtr.Length;
+ }
+
+ private void initInterface()
{
currPointerNb = 0;
- txtbxPointerNumber.Enabled = true;
- bttnReset.Enabled = true;
- SaveMenuItem.Enabled = SaveAsMenuItem.Enabled = true;
+ txtbxPointerNumber.Enabled = bttnReset.Enabled = SaveMenuItem.Enabled = SaveAsMenuItem.Enabled = chkDone.Enabled = chkUnsure.Enabled = bttnComment.Enabled = richEditOutputPtr.Enabled = true;
updateInterface();
updateTitle();
- }
+ updateStatusProgress();
- private void bttnNext_Click(System.Object sender, System.EventArgs e)
- {
- saveCurrentPointer();
- ++currPointerNb;
- updateInterface();
+ ActiveControl = richEditOutputPtr;
}
- private void bttnPrevious_Click(System.Object sender, System.EventArgs e)
+ private int searchPointer(PointerState ps)
{
- saveCurrentPointer();
- --currPointerNb;
- updateInterface();
- }
+ for (int i = 1; i < annotations.Length; i++)
+ if (annotations[(currPointerNb + i) % annotations.Length].state == ps)
+ return (currPointerNb + i) % annotations.Length;
- private void bttnReset_Click(System.Object sender, System.EventArgs e)
- {
- outputPtr[currPointerNb] = new Pointer(inputPtr[currPointerNb]);
- updateOutputPtr();
+ return -1;
}
- private void ExitMenuItem_Click(System.Object sender, System.EventArgs e)
+ private void gotoPointer(int nb)
{
- Application.Exit();
+ saveCurrentPointer();
+ currPointerNb = nb;
+ updateInterface();
}
- private void gotoPointer()
+ private void txtbxPointerNumber_KeyPress(object sender, KeyPressEventArgs e)
{
- saveCurrentPointer();
-
- try
+ if (e.KeyChar == (char)Keys.Return)
{
- int nb = int.Parse(txtbxPointerNumber.Text);
- if (nb > 0 && nb <= inputPtr.Length)
- currPointerNb = nb - 1;
+ e.Handled = true;
+ int nb;
+ if (int.TryParse(txtbxPointerNumber.Text, out nb) && nb > 0 && nb <= inputPtr.Length)
+ gotoPointer(nb - 1);
else
{
MessageBox.Show("Pointer out of range. Please enter a number between 1 and " + inputPtr.Length + ".", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- return;
+ txtbxPointerNumber.Text = System.Convert.ToString(currPointerNb + 1);
}
}
- catch (System.FormatException)
- {
- MessageBox.Show("Incorrect pointer number", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- return;
- }
- finally
- {
- txtbxPointerNumber.Text = System.Convert.ToString(currPointerNb + 1);
- }
-
- updateInterface();
}
- private bool saveOutputXML(string fileName)
+ private void bttnPrevious_Click(System.Object sender, System.EventArgs e)
{
- saveCurrentPointer();
-
- StreamWriter sw = null;
- try
- {
- StringBuilder str = new StringBuilder("<roomscripts>\n\n");
-
- for (int i = 0; i < outputPtr.Length; i++)
- {
- Pointer p = outputPtr[i];
+ gotoPointer(currPointerNb - 1);
+ }
- str.Append("<ptr n=\"" + (i + 1) + "\" room=\"" + p.rooms + "\"/>\n");
- if (p.type == WindowType.None)
- str.Append("<nowindowdetected/>");
- else
- if (p.type == WindowType.Fixed)
- str.Append("<window type=\"fixed\"/>");
- else
- str.Append("<window x=\"" + p.x + "\" y=\"" + p.y + "\" width=\"" + p.width + "\" height=\"" + p.height + "\"/>");
+ private void bttnNext_Click(System.Object sender, System.EventArgs e)
+ {
+ gotoPointer(currPointerNb + 1);
+ }
+
+ private void bttnNextUntranslated_Click(object sender, EventArgs e)
+ {
+ gotoPointer(nextUntranslatedPtr);
+ }
- str.Append("\n");
- str.Append(p.content.Replace("\r\n", "\n"));
- str.Append("\n\n");
- }
+ private void bttnNextUnsure_Click(object sender, EventArgs e)
+ {
+ gotoPointer(nextUnsurePtr);
+ }
- str.Append("</roomscripts>\n");
+ private void bttnReset_Click(System.Object sender, System.EventArgs e)
+ {
+ outputPtr[currPointerNb].copyFrom(inputPtr[currPointerNb]);
+ chkDone.Checked = chkUnsure.Checked = false;
+ updateOutputPtr();
+ }
- sw = new StreamWriter(fileName);
- sw.Write(str);
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
- finally
- {
- if (sw != null) sw.Close();
- }
- return true;
+ private void ExitMenuItem_Click(System.Object sender, System.EventArgs e)
+ {
+ Application.Exit();
}
private void SaveMenuItem_Click(System.Object sender, System.EventArgs e)
{
- saveOutputXML(outputFileName);
+ saveOutput(outputFileName);
}
private void SaveAsMenuItem_Click(object sender, EventArgs e)
@@ -277,95 +365,89 @@ namespace VPScriptEditor
if (sfd.ShowDialog() != DialogResult.OK)
return;
- if (saveOutputXML(sfd.FileName))
+ if (saveOutput(sfd.FileName))
{
outputFileName = sfd.FileName;
updateTitle();
}
}
- public void saveCurrentPointer()
+ private void colorizeRichEdit(ITextDocument itd)
{
- outputPtr[currPointerNb] = new Pointer(inputPtr[currPointerNb].rooms, inputPtr[currPointerNb].type, txtbxOutputX.Text, txtbxOutputY.Text, txtbxOutputWidth.Text, txtbxOutputHeight.Text, txtbxOutputPtr.Text.Replace("\r\n", "\n"));
- }
+ itd.Freeze();
+ itd.Undo((int)tomConstants.tomSuspend);
- private void bttnResize_Click(System.Object sender, System.EventArgs e)
- {
- String[] text = getText(txtbxOutputPtr.Text);
- int w = 0, h = 0;
+ ITextRange r = itd.Range(0, 0);
+ r.MoveEnd((int)tomConstants.tomCharacter, r.StoryLength);
+ r.Font.ForeColor = 0;
- for (int j = 0; j <= text.Length - 1; j++)
+ MatchCollection matches = Regex.Matches(r.Text, "<(.*?)/>");
+ for (int i = 0; i < matches.Count; i++)
{
- int curr_w = 0;
-
- foreach (char ch in text[j])
- try
- {
- curr_w += vpFont.getSymbolWidth(ch);
- }
- catch (System.Collections.Generic.KeyNotFoundException ex) { }
-
- w = curr_w > w ? curr_w : w;
- h += 14;
+ r.Start = matches[i].Groups[0].Index;
+ r.End = r.Start + matches[i].Groups[0].Length;
+ r.Font.ForeColor = 0xFF;
}
- txtbxOutputWidth.Text = System.Convert.ToString(w);
- txtbxOutputHeight.Text = System.Convert.ToString(h);
+ itd.Undo((int)tomConstants.tomResume);
+ itd.Unfreeze();
+ }
- pnlOutput.Invalidate();
+ private void parseScriptLines(string[] input, int a, int b)
+ {
+ for (int i = a; i < b; i++)
+ input[i] = Regex.Replace(Regex.Replace(input[i], "<st rep=\"(\\d+)\"/>(.+?)<rrep/>", new MatchEvaluator(delegate(Match m) { return new String(m.Groups[2].Value[0], int.Parse(m.Groups[1].Value)); })), "<.+?/>", "");
}
- private Bitmap drawPointer(String[] text, string xStr, string yStr, string wStr, string hStr)
+ private static bool isNewTag(String s) { return s == "<new/>"; }
+
+ private Bitmap drawPointer(RichTextBox rtb, string xStr, string yStr, string wStr, string hStr)
{
+ String[] text = Regex.Split(rtb.Text, "\n");
+ int currLineNb = Regex.Matches(rtb.Text.Substring(0, rtb.SelectionStart), "\\n").Count;
+
+ int begLineNb = Array.FindLastIndex(text, currLineNb, isNewTag) + 1, endLineNb = Array.FindIndex(text, currLineNb + 1, isNewTag);
+ if (endLineNb < 0) endLineNb = text.Length;
+ parseScriptLines(text, begLineNb, endLineNb);
+
Bitmap bmp = new Bitmap(320, 240, PixelFormat.Format32bppArgb);
Graphics gBmp = Graphics.FromImage(bmp);
gBmp.CompositingMode = CompositingMode.SourceOver;
gBmp.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
- int x_base, x_curr, y_curr;
+ int x_base, y_curr, h, w;
- try
- {
- x_base = x_curr = int.Parse(xStr);
- y_curr = int.Parse(yStr);
- }
- catch (System.FormatException e)
- {
- x_curr = x_base = y_curr = 10;
- }
+ if (!int.TryParse(xStr, out x_base) || !int.TryParse(yStr, out y_curr))
+ x_base = y_curr = 10;
- try
+ if (int.TryParse(wStr, out w) && int.TryParse(hStr, out h))
{
- int h = int.Parse(hStr), w = int.Parse(wStr);
-
SolidBrush innerBrush = new SolidBrush(Color.FromArgb(248, 216, 96)), outerBrush = new SolidBrush(Color.FromArgb(88, 64, 8));
-
- gBmp.FillRectangle(outerBrush, x_curr - 8, y_curr, 1, h);
- gBmp.FillRectangle(innerBrush, x_curr - 7, y_curr, 2, h);
- gBmp.FillRectangle(outerBrush, x_curr - 2, y_curr - 7, w + 5, 1);
- gBmp.FillRectangle(innerBrush, x_curr - 2, y_curr - 6, w + 5, 2);
- gBmp.FillRectangle(outerBrush, x_curr + w + 9, y_curr, 1, h);
- gBmp.FillRectangle(innerBrush, x_curr + w + 7, y_curr, 2, h);
- gBmp.FillRectangle(outerBrush, x_curr - 2, y_curr + h + 6, w + 5, 1);
- gBmp.FillRectangle(innerBrush, x_curr - 2, y_curr + h + 4, w + 5, 2);
-
- gBmp.DrawImage(conersBmp, x_curr - 8, y_curr - 7, new Rectangle(0, 0, 7, 7), GraphicsUnit.Pixel);
- gBmp.DrawImage(conersBmp, x_curr - 8, y_curr + h, new Rectangle(0, 7, 7, 7), GraphicsUnit.Pixel);
- gBmp.DrawImage(conersBmp, x_curr + w + 3, y_curr - 7, new Rectangle(7, 0, 7, 7), GraphicsUnit.Pixel);
- gBmp.DrawImage(conersBmp, x_curr + w + 3, y_curr + h, new Rectangle(7, 7, 7, 7), GraphicsUnit.Pixel);
+ gBmp.FillRectangle(outerBrush, x_base - 8, y_curr, 1, h);
+ gBmp.FillRectangle(innerBrush, x_base - 7, y_curr, 2, h);
+ gBmp.FillRectangle(outerBrush, x_base - 2, y_curr - 7, w + 5, 1);
+ gBmp.FillRectangle(innerBrush, x_base - 2, y_curr - 6, w + 5, 2);
+ gBmp.FillRectangle(outerBrush, x_base + w + 9, y_curr, 1, h);
+ gBmp.FillRectangle(innerBrush, x_base + w + 7, y_curr, 2, h);
+ gBmp.FillRectangle(outerBrush, x_base - 2, y_curr + h + 6, w + 5, 1);
+ gBmp.FillRectangle(innerBrush, x_base - 2, y_curr + h + 4, w + 5, 2);
+
+ gBmp.DrawImage(conersBmp, x_base - 8, y_curr - 7, new Rectangle(0, 0, 7, 7), GraphicsUnit.Pixel);
+ gBmp.DrawImage(conersBmp, x_base - 8, y_curr + h, new Rectangle(0, 7, 7, 7), GraphicsUnit.Pixel);
+ gBmp.DrawImage(conersBmp, x_base + w + 3, y_curr - 7, new Rectangle(7, 0, 7, 7), GraphicsUnit.Pixel);
+ gBmp.DrawImage(conersBmp, x_base + w + 3, y_curr + h, new Rectangle(7, 7, 7, 7), GraphicsUnit.Pixel);
}
- catch (System.FormatException e) { }
- for (int j = 0; j <= text.Length - 1; j++)
+ int x_curr = x_base;
+ for (int j = begLineNb; j < endLineNb; j++)
{
foreach (char ch in text[j])
- try
+ if (vpFont.containsSymbol(ch))
{
gBmp.DrawImage(vpFont.getBitmap(ch), x_curr, y_curr);
x_curr += vpFont.getSymbolWidth(ch);
}
- catch (System.Collections.Generic.KeyNotFoundException e) { }
x_curr = x_base;
y_curr += 14;
@@ -376,35 +458,131 @@ namespace VPScriptEditor
private void pnlInput_Paint(object sender, PaintEventArgs e)
{
- e.Graphics.DrawImage(drawPointer(getText(txtbxInputPtr.Text), txtbxInputX.Text, txtbxInputY.Text, txtbxInputWidth.Text, txtbxInputHeight.Text), 0, 0);
+ e.Graphics.DrawImage(drawPointer(richEditInputPtr, txtbxInputX.Text, txtbxInputY.Text, txtbxInputWidth.Text, txtbxInputHeight.Text), 0, 0);
}
private void pnlOutput_Paint(object sender, PaintEventArgs e)
{
- e.Graphics.DrawImage(drawPointer(getText(txtbxOutputPtr.Text), txtbxOutputX.Text, txtbxOutputY.Text, txtbxOutputWidth.Text, txtbxOutputHeight.Text), 0, 0);
+ e.Graphics.DrawImage(drawPointer(richEditOutputPtr, txtbxOutputX.Text, txtbxOutputY.Text, txtbxOutputWidth.Text, txtbxOutputHeight.Text), 0, 0);
}
- private void txtbxOutput_TextChanged(object sender, EventArgs e)
+ private void richEdit_SelectionChanged(object sender, EventArgs e)
+ {
+ ((RichTextBox)sender == richEditInputPtr ? pnlInput : pnlOutput).Invalidate();
+ }
+
+ private void richEditInputPtr_TextChanged(object sender, EventArgs e)
+ {
+ colorizeRichEdit(inDoc);
+ }
+
+ private void richEditOutputPtr_SelectionChanged(object sender, EventArgs e)
{
pnlOutput.Invalidate();
}
- private void txtbxPointerNumber_KeyPress(object sender, KeyPressEventArgs e)
+ private void richEditOutputPtr_TextChanged(object sender, EventArgs e)
{
- if (e.KeyChar == (char)Keys.Return)
+ colorizeRichEdit(outDoc);
+ // simple trick to circumvent a stupid vertical scroll bug
+ richEditOutputPtr.SelectionStart = richEditOutputPtr.SelectionStart;
+ }
+
+ private void richEditOutputPtr_KeyDown(object sender, KeyEventArgs e)
+ {
+ if ((e.Shift && e.KeyCode == Keys.Insert) || (e.Control && e.KeyCode == Keys.V))
{
+ richEditOutputPtr.Paste(DataFormats.GetFormat("Text"));
e.Handled = true;
- gotoPointer();
}
+ else
+ if ((e.Modifiers == Keys.None || e.Modifiers == Keys.Control) && e.KeyCode == Keys.Delete)
+ pnlOutput.Invalidate();
}
- private void txtbxOutputPtr_KeyPress(object sender, KeyPressEventArgs e)
+ private void richEditOutputPtr_KeyPress(object sender, KeyPressEventArgs e)
{
- if (!vpFont.containsSymbol(e.KeyChar) && e.KeyChar >= ' ')
+ if (e.KeyChar >= ' ' && e.KeyChar != (char)Keys.F16 && !vpFont.containsSymbol(e.KeyChar))
{
e.Handled = true;
System.Media.SystemSounds.Beep.Play();
}
}
+
+ private void bttnResize_Click(System.Object sender, System.EventArgs e)
+ {
+ String[] text = Regex.Split(richEditOutputPtr.Text, "\n");
+ int w = 0, h = 0, curr_h = 0;
+
+ for (int j = 0; j < text.Length; j++)
+ if (isNewTag(text[j]))
+ {
+ h = Math.Max(curr_h, h);
+ curr_h = 0;
+ }
+ else
+ {
+ int curr_w = 0;
+ parseScriptLines(text, j, j + 1);
+
+ foreach (char ch in text[j])
+ if (vpFont.containsSymbol(ch))
+ curr_w += vpFont.getSymbolWidth(ch);
+
+ w = Math.Max(curr_w, w);
+ curr_h += 14;
+ }
+
+ h = Math.Max(curr_h, h);
+
+ txtbxOutputWidth.Text = System.Convert.ToString(w);
+ txtbxOutputHeight.Text = System.Convert.ToString(h);
+
+ pnlOutput.Invalidate();
+ }
+
+ private void chkbx_CheckedChanged(object sender, EventArgs e)
+ {
+ CheckBox chk = (CheckBox)sender, chk2 = chk == chkDone ? chkUnsure : chkDone;
+ if (chk.Checked && chk2.Checked)
+ {
+ nbUndefinedPtr++;
+ chk2.Checked = false;
+ }
+ else
+ {
+ nbUndefinedPtr += (!chkDone.Checked && !chkUnsure.Checked ? 1 : -1);
+ updateStatusProgress();
+ }
+ }
+
+ private void bttnComment_Click(object sender, EventArgs e)
+ {
+ CommentForm cf = new CommentForm(currPointerNb, annotations[currPointerNb].comment);
+ cf.ShowDialog();
+ annotations[currPointerNb].comment = cf.Comment;
+ updateCommentBttn();
+ }
+
+ private void txtbxOutput_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (e.KeyChar == (char)Keys.Return)
+ {
+ e.Handled = true;
+ pnlOutput.Invalidate();
+ }
+ }
+
+ private void wordWarpToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
+ {
+ richEditInputPtr.WordWrap = richEditOutputPtr.WordWrap = ((ToolStripMenuItem)sender).Checked;
+ inDoc = getDocument(richEditInputPtr);
+ outDoc = getDocument(richEditOutputPtr);
+ }
+
+ private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ new AboutBox().ShowDialog();
+ }
}
} \ No newline at end of file