|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- 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;
- Model.Configuration config;
-
- public LogForm(string filename)
- {
- this.filename = filename;
- InitializeComponent();
- this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon());
-
- config = Model.Configuration.Load();
- if (config.logViewer == null)
- {
- config.logViewer = new Model.LogViewerConfig();
- }
- else
- {
- topMostTrigger = config.logViewer.topMost;
- wrapTextTrigger = config.logViewer.wrapText;
- toolbarTrigger = config.logViewer.toolbarShown;
- LogMessageTextBox.Font = new Font(config.logViewer.fontName, config.logViewer.fontSize);
- LogMessageTextBox.BackColor = config.logViewer.GetBackgroundColor();
- LogMessageTextBox.ForeColor = config.logViewer.GetTextColor();
- }
-
- 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("Change &font");
- WrapTextCheckBox.Text = I18N.GetString("&Wrap text");
- TopMostCheckBox.Text = I18N.GetString("&Top most");
- ViewMenuItem.Text = I18N.GetString("&View");
- CleanLogsMenuItem.Text = I18N.GetString("&Clean logs");
- ChangeFontMenuItem.Text = I18N.GetString("Change &font");
- WrapTextMenuItem.Text = I18N.GetString("&Wrap text");
- TopMostMenuItem.Text = I18N.GetString("&Top most");
- ShowToolbarMenuItem.Text = I18N.GetString("&Show toolbar");
- 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();
-
- topMostTriggerLock = true;
- this.TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger;
- topMostTriggerLock = false;
-
- wrapTextTriggerLock = true;
- LogMessageTextBox.WordWrap = WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger;
- wrapTextTriggerLock = false;
-
- ToolbarFlowLayoutPanel.Visible = ShowToolbarMenuItem.Checked = toolbarTrigger;
- }
-
- private void LogForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- timer.Stop();
- config.logViewer.topMost = topMostTrigger;
- config.logViewer.wrapText = wrapTextTrigger;
- config.logViewer.toolbarShown = toolbarTrigger;
- config.logViewer.fontName = LogMessageTextBox.Font.Name;
- config.logViewer.fontSize = LogMessageTextBox.Font.Size;
- config.logViewer.SetBackgroundColor(LogMessageTextBox.BackColor);
- config.logViewer.SetTextColor(LogMessageTextBox.ForeColor);
- Model.Configuration.Save(config);
- }
-
- 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();
- }
-
- #region Clean up the content in LogMessageTextBox.
- private void DoCleanLogs()
- {
- LogMessageTextBox.Clear();
- }
-
- private void CleanLogsMenuItem_Click(object sender, EventArgs e)
- {
- DoCleanLogs();
- }
-
- private void CleanLogsButton_Click(object sender, EventArgs e)
- {
- DoCleanLogs();
- }
- #endregion
-
- #region Change the font settings applied in LogMessageTextBox.
- private void DoChangeFont()
- {
- try
- {
- FontDialog fd = new FontDialog();
- fd.Font = LogMessageTextBox.Font;
- if (fd.ShowDialog() == DialogResult.OK)
- {
- LogMessageTextBox.Font = new Font(fd.Font.FontFamily, fd.Font.Size, fd.Font.Style);
- }
- }
- catch (Exception ex)
- {
- Logging.LogUsefulException(ex);
- MessageBox.Show(ex.Message);
- }
- }
-
- private void ChangeFontMenuItem_Click(object sender, EventArgs e)
- {
- DoChangeFont();
- }
-
- private void ChangeFontButton_Click(object sender, EventArgs e)
- {
- DoChangeFont();
- }
- #endregion
-
- #region Trigger the log messages wrapable, or not.
- bool wrapTextTrigger = false;
- bool wrapTextTriggerLock = false;
-
- private void TriggerWrapText()
- {
- wrapTextTriggerLock = true;
-
- wrapTextTrigger = !wrapTextTrigger;
- LogMessageTextBox.WordWrap = wrapTextTrigger;
- LogMessageTextBox.ScrollToCaret();
- WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger;
-
- wrapTextTriggerLock = false;
- }
-
- private void WrapTextMenuItem_Click(object sender, EventArgs e)
- {
- if (!wrapTextTriggerLock)
- {
- TriggerWrapText();
- }
- }
-
- private void WrapTextCheckBox_CheckedChanged(object sender, EventArgs e)
- {
- if (!wrapTextTriggerLock)
- {
- TriggerWrapText();
- }
- }
- #endregion
-
- #region Trigger this window top most, or not.
- bool topMostTrigger = false;
- bool topMostTriggerLock = false;
-
- private void TriggerTopMost()
- {
- topMostTriggerLock = true;
-
- topMostTrigger = !topMostTrigger;
- this.TopMost = topMostTrigger;
- TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger;
-
- topMostTriggerLock = false;
- }
-
- private void TopMostCheckBox_CheckedChanged(object sender, EventArgs e)
- {
- if (!topMostTriggerLock)
- {
- TriggerTopMost();
- }
- }
-
- private void TopMostMenuItem_Click(object sender, EventArgs e)
- {
- if (!topMostTriggerLock)
- {
- TriggerTopMost();
- }
- }
- #endregion
-
- private bool toolbarTrigger = false;
-
- private void ShowToolbarMenuItem_Click(object sender, EventArgs e)
- {
- toolbarTrigger = !toolbarTrigger;
- ToolbarFlowLayoutPanel.Visible = toolbarTrigger;
- ShowToolbarMenuItem.Checked = toolbarTrigger;
- }
- }
- }
|