public MainWindow()
: base("Smuxi")
{
// restore window size / position
int width, heigth;
if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/Width"] != null) {
width = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/Width"];
} else {
width = 800;
}
if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/Heigth"] != null) {
heigth = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/Heigth"];
} else {
heigth = 600;
}
if (width < -1 || heigth < -1) {
width = -1;
heigth = -1;
}
if (width == -1 && heigth == -1) {
SetDefaultSize(800, 600);
Maximize();
} else if (width == 0 && heigth == 0) {
// HACK: map 0/0 to default size as it crashes on Windows :/
SetDefaultSize(800, 600);
} else {
SetDefaultSize(width, heigth);
}
int x, y;
if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/XPosition"] != null) {
x = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/XPosition"];
} else {
x = 0;
}
if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/YPosition"] != null) {
y = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/YPosition"];
} else {
y = 0;
}
if (x < 0 || y < 0) {
x = 0;
y = 0;
}
if (x == 0 && y == 0) {
SetPosition(Gtk.WindowPosition.Center);
} else {
Move(x, y);
}
DeleteEvent += OnDeleteEvent;
FocusInEvent += OnFocusInEvent;
FocusOutEvent += OnFocusOutEvent;
WindowStateEvent += OnWindowStateEvent;
ChatTreeView = new ChatTreeView();
Notebook = new Notebook();
Notebook.SwitchPage += OnNotebookSwitchPage;
Notebook.FocusInEvent += OnNotebookFocusInEvent;
ChatViewManager = new ChatViewManager(Notebook, ChatTreeView);
Assembly asm = Assembly.GetExecutingAssembly();
ChatViewManager.Load(asm);
ChatViewManager.LoadAll(System.IO.Path.GetDirectoryName(asm.Location),
"smuxi-frontend-gnome-*.dll");
ChatViewManager.ChatAdded += OnChatViewManagerChatAdded;
ChatViewManager.ChatSynced += OnChatViewManagerChatSynced;
ChatViewManager.ChatRemoved += OnChatViewManagerChatRemoved;
#if GTK_SHARP_2_10
StatusIconManager = new StatusIconManager(this, ChatViewManager);
#endif
#if INDICATE_SHARP || MESSAGING_MENU_SHARP
IndicateManager = new IndicateManager(this, ChatViewManager);
#endif
#if NOTIFY_SHARP
NotifyManager = new NotifyManager(this, ChatViewManager);
#endif
#if IPC_DBUS
NetworkManager = new NetworkManager(ChatViewManager);
#endif
UI = new GnomeUI(ChatViewManager);
// HACK: Frontend.FrontendConfig out of scope
EngineManager = new EngineManager(Frontend.FrontendConfig, UI);
Entry = new Entry(ChatViewManager);
var entryScrolledWindow = new Gtk.ScrolledWindow();
entryScrolledWindow.ShadowType = Gtk.ShadowType.EtchedIn;
entryScrolledWindow.HscrollbarPolicy = Gtk.PolicyType.Never;
entryScrolledWindow.SizeRequested += delegate(object o, Gtk.SizeRequestedArgs args) {
// predict and set useful height
int lineWidth, lineHeight;
using (var layout = Entry.CreatePangoLayout("Qp")) {
layout.GetPixelSize(out lineWidth, out lineHeight);
}
var it = Entry.Buffer.StartIter;
int newLines = 1;
// move to end of next visual line
while (Entry.ForwardDisplayLineEnd(ref it)) {
newLines++;
// calling ForwardDisplayLineEnd repeatedly stays on the same position
// therefor we move one cursor position further
it.ForwardCursorPosition();
}
newLines = Math.Min(newLines, 3);
// use text heigth + a bit extra
var bestSize = new Gtk.Requisition() {
Height = (lineHeight * newLines) + 5
};
args.Requisition = bestSize;
};
entryScrolledWindow.Add(Entry);
ProgressBar = new Gtk.ProgressBar();
StatusHBox = new Gtk.HBox();
MenuWidget = new MenuWidget(this, ChatViewManager);
var treeviewScrolledWindow = new Gtk.ScrolledWindow() {
ShadowType = Gtk.ShadowType.EtchedIn,
HscrollbarPolicy = Gtk.PolicyType.Never,
VscrollbarPolicy = Gtk.PolicyType.Automatic
};
treeviewScrolledWindow.Add(ChatTreeView);
ChatViewManager.ChatAdded += (sender, e) => {
treeviewScrolledWindow.CheckResize();
};
var notebookPaned = new Gtk.VPaned();
notebookPaned.Pack1(Notebook, true, false);
notebookPaned.Pack2(entryScrolledWindow, false, false);
var treeviewPaned = new Gtk.HPaned();
treeviewPaned.Pack1(treeviewScrolledWindow, false, false);
treeviewPaned.Pack2(notebookPaned, true, false);
TreeViewHPaned = treeviewPaned;
var entryPaned = new Gtk.VPaned();
entryPaned.ButtonPressEvent += (sender, e) => {
// reset entry size on double click
if (e.Event.Type == Gdk.EventType.TwoButtonPress &&
e.Event.Button == 1) {
GLib.Timeout.Add(100, delegate {
entryPaned.Position = -1;
return false;
});
}
};
entryPaned.Pack1(treeviewPaned, true, false);
Gtk.VBox vbox = new Gtk.VBox();
vbox.PackStart(MenuWidget, false, false, 0);
vbox.PackStart(entryPaned, true, true, 0);
NetworkStatusbar = new Gtk.Statusbar();
NetworkStatusbar.WidthRequest = 300;
NetworkStatusbar.HasResizeGrip = false;
Statusbar = new Gtk.Statusbar();
Statusbar.HasResizeGrip = false;
Gtk.HBox status_bar_hbox = new Gtk.HBox();
status_bar_hbox.Homogeneous = true;
status_bar_hbox.PackStart(NetworkStatusbar, false, true, 0);
status_bar_hbox.PackStart(Statusbar, true, true, 0);
StatusHBox.PackStart(status_bar_hbox);
StatusHBox.PackStart(ProgressBar, false, false, 0);
StatusHBox.ShowAll();
StatusHBox.NoShowAll = true;
StatusHBox.Visible = (bool) Frontend.FrontendConfig["ShowStatusBar"];
vbox.PackStart(StatusHBox, false, false, 0);
Add(vbox);
}