151 lines
4.6 KiB
C#
151 lines
4.6 KiB
C#
using Shadowsocks.Controller;
|
|
using Shadowsocks.Properties;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Shadowsocks.View
|
|
{
|
|
public partial class LogForm : Form
|
|
{
|
|
long lastOffset;
|
|
string filename;
|
|
Timer timer;
|
|
const int BACK_OFFSET = 65536;
|
|
|
|
public LogForm(string filename)
|
|
{
|
|
this.filename = filename;
|
|
InitializeComponent();
|
|
this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon());
|
|
|
|
UpdateTexts();
|
|
}
|
|
|
|
private void UpdateTexts()
|
|
{
|
|
FileMenuItem.Text = I18N.GetString("&File");
|
|
OpenLocationMenuItem.Text = I18N.GetString("&Open Location");
|
|
ExitMenuItem.Text = I18N.GetString("E&xit");
|
|
CleanLogsButton.Text = I18N.GetString("&Clean logs");
|
|
ChangeFontButton.Text = I18N.GetString("&Font");
|
|
WrapTextCheckBox.Text = I18N.GetString("&Wrap text");
|
|
TopMostCheckBox.Text = I18N.GetString("&Top most");
|
|
this.Text = I18N.GetString("Log Viewer");
|
|
}
|
|
|
|
private void Timer_Tick(object sender, EventArgs e)
|
|
{
|
|
UpdateContent();
|
|
}
|
|
|
|
private void InitContent()
|
|
{
|
|
using (StreamReader reader = new StreamReader(new FileStream(filename,
|
|
FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
|
|
{
|
|
if (reader.BaseStream.Length > BACK_OFFSET)
|
|
{
|
|
reader.BaseStream.Seek(-BACK_OFFSET, SeekOrigin.End);
|
|
reader.ReadLine();
|
|
}
|
|
|
|
string line = "";
|
|
while ((line = reader.ReadLine()) != null)
|
|
LogMessageTextBox.AppendText(line + "\r\n");
|
|
|
|
LogMessageTextBox.ScrollToCaret();
|
|
|
|
lastOffset = reader.BaseStream.Position;
|
|
}
|
|
}
|
|
|
|
private void UpdateContent()
|
|
{
|
|
using (StreamReader reader = new StreamReader(new FileStream(filename,
|
|
FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
|
|
{
|
|
reader.BaseStream.Seek(lastOffset, SeekOrigin.Begin);
|
|
|
|
string line = "";
|
|
bool changed = false;
|
|
while ((line = reader.ReadLine()) != null)
|
|
{
|
|
changed = true;
|
|
LogMessageTextBox.AppendText(line + "\r\n");
|
|
}
|
|
|
|
if (changed)
|
|
{
|
|
LogMessageTextBox.ScrollToCaret();
|
|
}
|
|
|
|
lastOffset = reader.BaseStream.Position;
|
|
}
|
|
}
|
|
|
|
private void LogForm_Load(object sender, EventArgs e)
|
|
{
|
|
InitContent();
|
|
timer = new Timer();
|
|
timer.Interval = 300;
|
|
timer.Tick += Timer_Tick;
|
|
timer.Start();
|
|
}
|
|
|
|
private void LogForm_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
timer.Stop();
|
|
}
|
|
|
|
private void OpenLocationMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
string argument = "/select, \"" + filename + "\"";
|
|
Console.WriteLine(argument);
|
|
System.Diagnostics.Process.Start("explorer.exe", argument);
|
|
}
|
|
|
|
private void ExitMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
this.Close();
|
|
}
|
|
|
|
private void LogForm_Shown(object sender, EventArgs e)
|
|
{
|
|
LogMessageTextBox.ScrollToCaret();
|
|
}
|
|
|
|
private void WrapTextCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
LogMessageTextBox.WordWrap = WrapTextCheckBox.Checked;
|
|
LogMessageTextBox.ScrollToCaret();
|
|
}
|
|
|
|
private void CleanLogsButton_Click(object sender, EventArgs e)
|
|
{
|
|
LogMessageTextBox.Clear();
|
|
}
|
|
|
|
private void ChangeFontButton_Click(object sender, EventArgs e)
|
|
{
|
|
FontDialog fd = new FontDialog();
|
|
fd.Font = LogMessageTextBox.Font;
|
|
if (fd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
LogMessageTextBox.Font = fd.Font;
|
|
}
|
|
}
|
|
|
|
private void TopMostCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
this.TopMost = TopMostCheckBox.Checked;
|
|
}
|
|
}
|
|
}
|