using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
namespace psyconaut
{
public enum ContentType {
Message,
Notice,
Notice_Big,
Error,
Warning,
Failure,
Echo,
None
};
///
/// A customized web browser.
///
public partial class Browser : UserControl
{
private Gui gui;
public Browser(Gui g) {
gui = g;
InitializeComponent();
Style();
}
public void Navigate(string res) {
if(Entity.abbrev("psyc://", res))
gui.Navigate(res);
else
web.Navigate(res);
}
public void NavigateData(string data) {
NavigateData(data, ContentType.Notice);
}
public void NavigateData(string data, ContentType type) {
web.Navigate("about:blank");
//MessageBox.Show("Loading..");
Style();
Content(data, ContentType.None);
}
private delegate void styleDelegate();
public void Style() {
styleDelegate d = delegate() {
web.Document.BackColor = Color.FromArgb(220,220,220);
string tmpl;
if(System.IO.File.Exists("conversation.css")) {
tmpl = System.IO.File.ReadAllText("conversation.css");
} else {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Browser));
tmpl = System.Text.Encoding.UTF8.GetString((byte[])resources.GetObject("conversation"));
}
web.Document.Write("\r\n\r\n\r\n");
};
try {
d.Invoke();
} catch(Exception ex) {
gui.Invoke(d);
}
}
public void Content(string data) {
Content(data, ContentType.Notice);
}
private delegate void contentDelegate();
public void Content(string data, ContentType type) {
contentDelegate d = delegate() {
if(web.Document.Url.OriginalString != "about:blank") {
web.Navigate("about:blank");
Style();
}
switch(type) {
case ContentType.None:
break;
case ContentType.Notice:
data = "
"+data+"
";
break;
case ContentType.Notice_Big:
data = ""+data+"
";
break;
case ContentType.Message:
data = ""+data+"
";
break;
case ContentType.Error:
data = ""+data+"
";
break;
case ContentType.Warning:
data = ""+data+"
";
break;
case ContentType.Failure:
data = ""+data+"
";
break;
case ContentType.Echo:
data = ""+data+"
";
break;
}
web.Document.Write(data);
web.Document.Body.ScrollTop = int.MaxValue;
};
gui.Invoke(d);
}
public static string prepare(string data) {
data = data.Replace("&", "&");
data = data.Replace("<", "<").Replace(">", ">");
return data;
string link;
int pos = data.IndexOf("https://");
int endpos;
System.Collections.Hashtable hash = new System.Collections.Hashtable();
while(pos > -1) {
endpos = data.IndexOf(' ', pos)-1;
if(endpos == -2)
endpos = data.Length-1-pos;
link = data.Substring(pos, endpos);
hash.Add(link, ""+link+"");
pos = data.IndexOf("https://", pos+1);
}
pos = data.IndexOf("http://");
while(pos > -1) {
endpos = data.IndexOf(' ', pos)-1;
if(endpos == -2)
endpos = data.Length-1-pos;
link = data.Substring(pos, endpos);
hash.Add(link, ""+link+"");
pos = data.IndexOf("http://", pos+1);
}
pos = data.IndexOf("psyc://");
while(pos > -1) {
endpos = data.IndexOf(' ', pos)-1;
if(endpos == -2)
endpos = data.Length-1-pos;
link = data.Substring(pos, endpos);
hash.Add(link, ""+link+"");
pos = data.IndexOf("psyc://", pos+1);
}
foreach(string key in hash.Keys)
data = data.Replace(key, hash[key].ToString());
return data;
}
}
}