Working on terminal window loging

This commit is contained in:
larsbrubaker 2014-11-06 15:19:38 -08:00
parent 06b7d61e57
commit 9299f38207
6 changed files with 327 additions and 88 deletions

View file

@ -26,73 +26,31 @@ The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using System.Collections.Generic;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.Font;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.CustomWidgets;
using MatterHackers.MatterControl.PrinterCommunication;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class OutputScrollWindow : SystemWindow
{
public class TerminalWidget : GuiWidget
{
Button sendCommand;
CheckBox filterOutput;
CheckBox autoUppercase;
MHTextEditWidget manualCommandTextEdit;
TextScrollWidget outputScrollWidget;
RGBA_Bytes backgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
RGBA_Bytes textColor = ActiveTheme.Instance.PrimaryTextColor;
TextImageButtonFactory controlButtonFactory = new TextImageButtonFactory();
public static void HookupPrinterOutput()
{
//throw new NotImplementedException();
}
static OutputScrollWindow connectionWindow = null;
static bool terminalWindowIsOpen = false;
public static void Show()
{
if (terminalWindowIsOpen == false)
{
connectionWindow = new OutputScrollWindow();
terminalWindowIsOpen = true;
connectionWindow.Closed += (parentSender, e) =>
{
terminalWindowIsOpen = false;
connectionWindow = null;
};
}
else
{
if (connectionWindow != null)
{
connectionWindow.BringToFront();
}
}
}
//private since you can't make one
private OutputScrollWindow()
: base(400, 300)
{
this.AddChild(new OutputScrollWidget(true));
Title = LocalizedString.Get("MatterControl - Terminal");
this.ShowAsSystemWindow();
MinimumSize = new Vector2(Width, Height);
}
}
public class OutputScrollWidget : GuiWidget
{
Button sendCommand;
CheckBox filterOutput;
CheckBox autoUppercase;
MHTextEditWidget manualCommandTextEdit;
OutputScroll outputScrollWidget;
RGBA_Bytes backgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
RGBA_Bytes textColor = ActiveTheme.Instance.PrimaryTextColor;
TextImageButtonFactory controlButtonFactory = new TextImageButtonFactory();
public OutputScrollWidget(bool showInWindow)
public TerminalWidget(bool showInWindow)
{
this.BackgroundColor = backgroundColor;
this.Padding = new BorderDouble(5, 0);
@ -102,15 +60,15 @@ namespace MatterHackers.MatterControl
{
FlowLayoutWidget manualEntryTopToBottomLayout = new FlowLayoutWidget(FlowDirection.TopToBottom);
manualEntryTopToBottomLayout.VAnchor |= Agg.UI.VAnchor.ParentTop;
manualEntryTopToBottomLayout.Padding = new BorderDouble(top:8);
manualEntryTopToBottomLayout.Padding = new BorderDouble(top: 8);
{
FlowLayoutWidget topBarControls = new FlowLayoutWidget(FlowDirection.LeftToRight);
topBarControls.HAnchor |= HAnchor.ParentLeft;
string filterOutputChkTxt = LocalizedString.Get("Filter Output");
string filterOutputChkTxt = LocalizedString.Get("Filter Output");
filterOutput = new CheckBox(filterOutputChkTxt);
filterOutput = new CheckBox(filterOutputChkTxt);
filterOutput.Margin = new BorderDouble(5, 5, 5, 2);
filterOutput.Checked = false;
filterOutput.TextColor = this.textColor;
@ -118,9 +76,9 @@ namespace MatterHackers.MatterControl
filterOutput.VAnchor = Agg.UI.VAnchor.ParentBottom;
topBarControls.AddChild(filterOutput);
string autoUpperCaseChkTxt = LocalizedString.Get("Auto Uppercase");
string autoUpperCaseChkTxt = LocalizedString.Get("Auto Uppercase");
autoUppercase = new CheckBox(autoUpperCaseChkTxt);
autoUppercase = new CheckBox(autoUpperCaseChkTxt);
autoUppercase.Margin = new BorderDouble(5, 5, 5, 2);
autoUppercase.Checked = true;
autoUppercase.TextColor = this.textColor;
@ -131,13 +89,13 @@ namespace MatterHackers.MatterControl
}
{
outputScrollWidget = new OutputScroll();
outputScrollWidget = new TextScrollWidget();
//outputScrollWidget.Height = 100;
outputScrollWidget.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor;
outputScrollWidget.TextColor = ActiveTheme.Instance.PrimaryTextColor;
outputScrollWidget.HAnchor = HAnchor.ParentLeftRight;
outputScrollWidget.VAnchor = VAnchor.ParentBottomTop;
outputScrollWidget.Margin = new BorderDouble(0,5);
outputScrollWidget.Margin = new BorderDouble(0, 5);
outputScrollWidget.Padding = new BorderDouble(3, 0);
@ -155,12 +113,9 @@ namespace MatterHackers.MatterControl
manualCommandTextEdit.VAnchor = VAnchor.ParentBottom;
manualCommandTextEdit.ActualTextEditWidget.EnterPressed += new KeyEventHandler(manualCommandTextEdit_EnterPressed);
manualCommandTextEdit.ActualTextEditWidget.KeyDown += new KeyEventHandler(manualCommandTextEdit_KeyDown);
manualEntryLayout.AddChild(manualCommandTextEdit);
manualEntryLayout.AddChild(manualCommandTextEdit);
}
manualEntryTopToBottomLayout.AddChild(manualEntryLayout);
Button clearConsoleButton = controlButtonFactory.Generate(LocalizedString.Get("Clear"));
@ -170,15 +125,15 @@ namespace MatterHackers.MatterControl
outputScrollWidget.Clear();
};
//Output Console text to screen
Button exportConsoleTextButton = controlButtonFactory.Generate (LocalizedString.Get ("Export..."));
exportConsoleTextButton.Click += (sender, mouseEvent) =>
{
string logFilePath = String.Format("{0}\\logs\\{1}ConsoleOutput.txt",
System.IO.Directory.GetCurrentDirectory(),
System.Diagnostics.Stopwatch.GetTimestamp());
outputScrollWidget.WriteToFile(logFilePath);
};
//Output Console text to screen
Button exportConsoleTextButton = controlButtonFactory.Generate(LocalizedString.Get("Export..."));
exportConsoleTextButton.Click += (sender, mouseEvent) =>
{
string logFilePath = String.Format("{0}\\logs\\{1}ConsoleOutput.txt",
System.IO.Directory.GetCurrentDirectory(),
System.Diagnostics.Stopwatch.GetTimestamp());
outputScrollWidget.WriteToFile(logFilePath);
};
Button closeButton = controlButtonFactory.Generate(LocalizedString.Get("Close"));
closeButton.Click += (sender, e) =>
@ -195,13 +150,13 @@ namespace MatterHackers.MatterControl
bottomRowContainer.AddChild(sendCommand);
bottomRowContainer.AddChild(clearConsoleButton);
bottomRowContainer.AddChild (exportConsoleTextButton);
bottomRowContainer.AddChild(exportConsoleTextButton);
bottomRowContainer.AddChild(new HorizontalSpacer());
if (showInWindow)
{
bottomRowContainer.AddChild(closeButton);
}
if (showInWindow)
{
bottomRowContainer.AddChild(closeButton);
}
manualEntryTopToBottomLayout.AddChild(bottomRowContainer);
manualEntryTopToBottomLayout.AnchorAll();
@ -214,19 +169,17 @@ namespace MatterHackers.MatterControl
AddChild(topLeftToRightLayout);
SetCorrectFilterOutputBehavior(this, null);
this.AnchorAll();
}
event EventHandler unregisterEvents;
void AddHandlers()
{
PrinterConnectionAndCommunication.Instance.ConnectionFailed.RegisterEvent(Instance_ConnectionFailed, ref unregisterEvents);
}
}
private void CloseWindow(object state)
{
this.Parent.Close();
this.Parent.Close();
}
public override void OnClosed(EventArgs e)
@ -336,4 +289,90 @@ namespace MatterHackers.MatterControl
outputScrollWidget.WriteLine(sender, new StringEventArgs("Lost connection to printer."));
}
}
public class OutputScroll : GuiWidget
{
const int TOTOL_POW2 = 64;
int lineCount = 0;
string[] lines = new string[TOTOL_POW2];
public RGBA_Bytes TextColor = new RGBA_Bytes(102, 102, 102);
public OutputScroll()
{
}
public void WriteLine(Object sender, EventArgs e)
{
StringEventArgs lineString = e as StringEventArgs;
Write(lineString.Data + "\n");
}
TypeFacePrinter printer = new TypeFacePrinter();
public void Write(string lineString)
{
string[] splitOnNL = lineString.Split('\n');
foreach (string line in splitOnNL)
{
if (line.Length > 0)
{
printer.Text = line;
Vector2 stringSize = printer.GetSize();
int arrayIndex = (lineCount % TOTOL_POW2);
lines[arrayIndex] = line;
lineCount++;
}
}
Invalidate();
}
public void WriteToFile(string filePath)
{
System.IO.File.WriteAllLines(@filePath, lines);
}
public override void OnDraw(Graphics2D graphics2D)
{
TypeFacePrinter printer = new TypeFacePrinter();
printer.DrawFromHintedCache = true;
RectangleDouble Bounds = LocalBounds;
double y = LocalBounds.Bottom + printer.TypeFaceStyle.EmSizeInPixels * (TOTOL_POW2 - 1) + 5;
for (int index = lineCount; index < lineCount + TOTOL_POW2; index++)
{
if (y > LocalBounds.Top)
{
y -= printer.TypeFaceStyle.EmSizeInPixels;
continue;
}
int arrayIndex = (index % TOTOL_POW2);
if (lines[arrayIndex] != null)
{
printer.Text = lines[arrayIndex];
printer.Origin = new Vector2(Bounds.Left + 2, y);
printer.Render(graphics2D, TextColor);
}
y -= printer.TypeFaceStyle.EmSizeInPixels;
if (y < -printer.TypeFaceStyle.EmSizeInPixels)
{
break;
}
}
base.OnDraw(graphics2D);
}
public void Clear()
{
for (int index = 0; index < TOTOL_POW2; index++)
{
lines[index] = "";
}
lineCount = 0;
}
}
}

View file

@ -0,0 +1,75 @@
/*
Copyright (c) 2014, Lars Brubaker
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using MatterHackers.Agg.UI;
using MatterHackers.Localizations;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class TerminalWindow : SystemWindow
{
public static void HookupPrinterOutput()
{
//throw new NotImplementedException();
}
static TerminalWindow connectionWindow = null;
static bool terminalWindowIsOpen = false;
public static void Show()
{
if (terminalWindowIsOpen == false)
{
connectionWindow = new TerminalWindow();
terminalWindowIsOpen = true;
connectionWindow.Closed += (parentSender, e) =>
{
terminalWindowIsOpen = false;
connectionWindow = null;
};
}
else
{
if (connectionWindow != null)
{
connectionWindow.BringToFront();
}
}
}
//private since you can't make one
private TerminalWindow()
: base(400, 300)
{
this.AddChild(new TerminalWidget(true));
Title = LocalizedString.Get("MatterControl - Terminal");
this.ShowAsSystemWindow();
MinimumSize = new Vector2(Width, Height);
}
}
}

View file

@ -0,0 +1,123 @@
/*
Copyright (c) 2014, Lars Brubaker
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using MatterHackers.Agg;
using MatterHackers.Agg.Font;
using MatterHackers.Agg.UI;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl
{
public class TextScrollWidget : GuiWidget
{
const int TOTOL_POW2 = 64;
int lineCount = 0;
string[] lines = new string[TOTOL_POW2];
public RGBA_Bytes TextColor = new RGBA_Bytes(102, 102, 102);
public TextScrollWidget()
{
}
public void WriteLine(Object sender, EventArgs e)
{
StringEventArgs lineString = e as StringEventArgs;
Write(lineString.Data + "\n");
}
TypeFacePrinter printer = new TypeFacePrinter();
public void Write(string lineString)
{
string[] splitOnNL = lineString.Split('\n');
foreach (string line in splitOnNL)
{
if (line.Length > 0)
{
printer.Text = line;
Vector2 stringSize = printer.GetSize();
int arrayIndex = (lineCount % TOTOL_POW2);
lines[arrayIndex] = line;
lineCount++;
}
}
Invalidate();
}
public void WriteToFile(string filePath)
{
System.IO.File.WriteAllLines(@filePath, lines);
}
public override void OnDraw(Graphics2D graphics2D)
{
TypeFacePrinter printer = new TypeFacePrinter();
printer.DrawFromHintedCache = true;
RectangleDouble Bounds = LocalBounds;
double y = LocalBounds.Bottom + printer.TypeFaceStyle.EmSizeInPixels * (TOTOL_POW2 - 1) + 5;
for (int index = lineCount; index < lineCount + TOTOL_POW2; index++)
{
if (y > LocalBounds.Top)
{
y -= printer.TypeFaceStyle.EmSizeInPixels;
continue;
}
int arrayIndex = (index % TOTOL_POW2);
if (lines[arrayIndex] != null)
{
printer.Text = lines[arrayIndex];
printer.Origin = new Vector2(Bounds.Left + 2, y);
printer.Render(graphics2D, TextColor);
}
y -= printer.TypeFaceStyle.EmSizeInPixels;
if (y < -printer.TypeFaceStyle.EmSizeInPixels)
{
break;
}
}
base.OnDraw(graphics2D);
}
public void Clear()
{
for (int index = 0; index < TOTOL_POW2; index++)
{
lines[index] = "";
}
lineCount = 0;
}
}
}