Refactored plugin architecture out of WebThing.cs
[WebThing.git] / WebThing.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Text.RegularExpressions;
5 using System.Runtime.InteropServices;
6 using Gtk;
7 using GtkSharp;
8 using WebKit;
9
10 namespace bytex64.WebThing {
11     public enum AttachPoint {
12         N, E, S, W, Interior
13     }
14
15     public class WebThing {
16         private Gtk.Window _Window;
17         public Gtk.Window Window {
18             get { return _Window; }
19         }
20         public Gtk.Window w {
21             get { return _Window; }
22         }
23
24         public ScrolledWindow ScrolledWindow {
25             get { return Tabs.CurrentPageWidget as ScrolledWindow; }
26         }
27         public ScrolledWindow sw {
28             get { return ScrolledWindow; }
29         }
30
31         public WebView WebView {
32             get { return (Tabs.CurrentPageWidget as WebThingView).WebView; }
33         }
34         public WebView wv {
35             get { return WebView; }
36         }
37
38         private Gtk.Notebook _Tabs;
39         public Gtk.Notebook Tabs {
40             get { return _Tabs; }
41         }
42
43         private Gtk.Table WidgetGrid;
44         private Gtk.Alignment InteriorOverlay;
45
46         public PluginManager Plugins;
47
48         [DllImport ("SoupSettings.dll")]
49         private static extern void soup_settings();
50
51         public void Run() {
52             Application.Init();
53
54             Config.ParseCommandLine();
55             Config.Load();
56             //Config.DumpOptions();
57
58             soup_settings();
59
60             _Window = new Gtk.Window("WebThing");
61             _Window.SetWmclass("webthing", "WebThing");
62             _Window.Role = "browser";
63             _Window.Destroyed += delegate { Quit(); };
64
65             WidgetGrid = new Gtk.Table(3, 3, false);
66             _Window.Add(WidgetGrid);
67
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);
73
74             InteriorOverlay = new Gtk.Alignment(1, 0, 0, 0);
75             WidgetGrid.Attach(InteriorOverlay, 1, 2, 1, 2);
76
77             _Window.ShowAll();
78
79             WebThingView newview = NewWebThingView();
80
81             Plugins = new PluginManager(this);
82             Plugins.Load();
83             Plugins.WebViewSetup(newview.WebView);
84             newview.WebView.GrabFocus();
85
86             Application.Run();
87         }
88
89         public void AttachWidget(Gtk.Widget widget, AttachPoint direction, AttachOptions xoptions, AttachOptions yoptions) {
90             switch(direction) {
91             case AttachPoint.N:
92                 WidgetGrid.Attach(widget, 0, 3, 0, 1, xoptions, yoptions, 0, 0);
93                 break;
94             case AttachPoint.E:
95                 WidgetGrid.Attach(widget, 2, 3, 1, 2, xoptions, yoptions, 0, 0);
96                 break;
97             case AttachPoint.S:
98                 WidgetGrid.Attach(widget, 0, 3, 2, 3, xoptions, yoptions, 0, 0);
99                 break;
100             case AttachPoint.W:
101                 WidgetGrid.Attach(widget, 0, 1, 1, 2, xoptions, yoptions, 0, 0);
102                 break;
103             case AttachPoint.Interior:
104                 InteriorOverlay.Add(widget);
105                 break;
106             }
107         }
108
109         public void AttachWidget(Gtk.Widget widget, AttachPoint direction) {
110             AttachWidget(widget, direction, 0, 0);
111         }
112
113         public WebView NewTab() {
114             WebThingView newview = NewWebThingView();
115             Plugins.WebViewSetup(newview.WebView);
116             return newview.WebView;
117         }
118
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";
126             };
127             newview.Show();
128             return newview;
129         }
130
131         public void CloseTab() {
132             CloseTab(_Tabs.Page);
133         }
134
135         public void CloseTab(int tab) {
136             if (_Tabs.NPages > 1) {
137                 try {
138                     WebThingView view = _Tabs.GetNthPage(tab) as WebThingView;
139                     _Tabs.RemovePage(tab);
140                     view.Dispose();
141                 } catch (ArgumentOutOfRangeException) {
142                 }
143             }
144         }
145
146         public string FixUri(string Uri) {
147             if (!Regex.IsMatch(Uri, @"://")) {
148                 return String.Format("http://{0}", Uri);
149             }
150             return Uri;
151         }
152
153         public void OpenUri(string Uri) {
154             wv.Open(FixUri(Uri));
155         }
156
157         public void OpenUriTab(string Uri) {
158             WebView view = NewTab();
159             view.Open(FixUri(Uri));
160         }
161
162         public void Quit() {
163             // TODO: Create a way of shutting down plugins
164             Application.Quit();
165         }
166
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";
170         }
171     }
172 }