2 using System.Collections.Generic;
4 using System.Text.RegularExpressions;
5 using System.Runtime.InteropServices;
10 namespace bytex64.WebThing {
11 public enum AttachPoint {
15 public class WebThing {
16 private Gtk.Window _Window;
17 public Gtk.Window Window {
18 get { return _Window; }
21 get { return _Window; }
24 public ScrolledWindow ScrolledWindow {
25 get { return Tabs.CurrentPageWidget as ScrolledWindow; }
27 public ScrolledWindow sw {
28 get { return ScrolledWindow; }
31 public WebView WebView {
32 get { return (Tabs.CurrentPageWidget as WebThingView).WebView; }
35 get { return WebView; }
38 private Gtk.Notebook _Tabs;
39 public Gtk.Notebook Tabs {
43 private Gtk.Table WidgetGrid;
44 private Gtk.Alignment InteriorOverlay;
46 public PluginManager Plugins;
48 [DllImport ("SoupSettings.dll")]
49 private static extern void soup_settings();
54 Config.ParseCommandLine();
56 //Config.DumpOptions();
60 _Window = new Gtk.Window("WebThing");
61 _Window.SetWmclass("webthing", "WebThing");
62 _Window.Role = "browser";
63 _Window.Destroyed += delegate { Quit(); };
65 WidgetGrid = new Gtk.Table(3, 3, false);
66 _Window.Add(WidgetGrid);
68 _Tabs = new Gtk.Notebook();
69 _Tabs.ShowBorder = false;
70 _Tabs.Scrollable = true;
71 _Tabs.SwitchPage += Tabs_SwitchPage;
72 WidgetGrid.Attach(_Tabs, 1, 2, 1, 2);
74 InteriorOverlay = new Gtk.Alignment(1, 0, 0, 0);
75 WidgetGrid.Attach(InteriorOverlay, 1, 2, 1, 2);
79 WebThingView newview = NewWebThingView();
81 Plugins = new PluginManager(this);
83 Plugins.WebViewSetup(newview.WebView);
84 newview.WebView.GrabFocus();
89 public void AttachWidget(Gtk.Widget widget, AttachPoint direction, AttachOptions xoptions, AttachOptions yoptions) {
92 WidgetGrid.Attach(widget, 0, 3, 0, 1, xoptions, yoptions, 0, 0);
95 WidgetGrid.Attach(widget, 2, 3, 1, 2, xoptions, yoptions, 0, 0);
98 WidgetGrid.Attach(widget, 0, 3, 2, 3, xoptions, yoptions, 0, 0);
101 WidgetGrid.Attach(widget, 0, 1, 1, 2, xoptions, yoptions, 0, 0);
103 case AttachPoint.Interior:
104 InteriorOverlay.Add(widget);
109 public void AttachWidget(Gtk.Widget widget, AttachPoint direction) {
110 AttachWidget(widget, direction, 0, 0);
113 public WebView NewTab() {
114 WebThingView newview = NewWebThingView();
115 Plugins.WebViewSetup(newview.WebView);
116 return newview.WebView;
119 private WebThingView NewWebThingView() {
120 WebThingView newview = new WebThingView();
121 Tabs.AppendPage(newview, new Label("Blank"));
122 newview.WebView.TitleChanged += delegate(object o, TitleChangedArgs e) {
123 Tabs.SetTabLabelText((Gtk.Widget) newview, e.Title);
124 if (newview == Tabs.CurrentPageWidget)
125 _Window.Title = e.Title + " - WebThing";
131 public void CloseTab() {
132 CloseTab(_Tabs.Page);
135 public void CloseTab(int tab) {
136 if (_Tabs.NPages > 1) {
138 WebThingView view = _Tabs.GetNthPage(tab) as WebThingView;
139 _Tabs.RemovePage(tab);
141 } catch (ArgumentOutOfRangeException) {
146 public string FixUri(string Uri) {
147 if (!Regex.IsMatch(Uri, @"://")) {
148 return String.Format("http://{0}", Uri);
153 public void OpenUri(string Uri) {
154 wv.Open(FixUri(Uri));
157 public void OpenUriTab(string Uri) {
158 WebView view = NewTab();
159 view.Open(FixUri(Uri));
163 // TODO: Create a way of shutting down plugins
167 private void Tabs_SwitchPage(object o, SwitchPageArgs e) {
168 Gtk.Widget page = _Tabs.GetNthPage((int)e.PageNum);
169 _Window.Title = _Tabs.GetTabLabelText(page) + " - WebThing";