1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# The beginning of an IDE for Nimrod
# (c) 2008 Andreas Rumpf
import os, glib2, gdk2, gtk2, libglade2, pango, dialogs, parseopt
const
GuiTemplate = "nimide.glade"
dummyConst = ""
type
TTab {.pure, final.} = object
textview: PGtkTextView
filename: string
untitled: bool
hbox: PGtkHBox
e: PEditor
PTab = ptr TTab
TEditor = object of TObject
window: PGtkWindow
statusbar: PGtkStatusBar
menu: PGtkMenuBar
notebook: PGtkNotebook
tabname: int # used for generating tab names
PEditor = ptr TEditor
proc on_window_destroy(obj: PGtkObject, event: PGdkEvent,
data: pointer): gboolean {.cdecl.} =
gtk_main_quit()
proc on_about_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
gtk_show_about_dialog(e.window,
"comments", "A fast and leight-weight IDE for Nimrod",
"copyright", "Copyright \xc2\xa9 2008 Andreas Rumpf",
"version", "0.1",
"website", "http://nimrod.ethexor.com",
"program-name", "Nimrod IDE",
nil)
proc getTabIndex(e: PEditor, tab: PTab): int =
var i = 0
while true:
var w = gtk_notebook_get_nth_page(e.notebook, i)
if w == nil: return -1
var v = gtk_notebook_get_tab_label(e.notebook, w)
if tab.hbox == v: return i
inc(i)
proc OnCloseTab(button: PGtkButton, tab: PTab) {.cdecl.} =
var idx = getTabIndex(tab.e, tab)
if idx >= 0: gtk_notebook_remove_page(tab.e.notebook, idx)
proc createTab(e: PEditor, filename: string, untitled: bool) =
var t = cast[PTab](alloc0(sizeof(TTab)))
t.textview = gtk_text_view_new_with_buffer(gtk_text_buffer_new(nil))
var font_desc = pango_font_description_from_string("monospace 10")
gtk_widget_modify_font(t.textview, font_desc)
pango_font_description_free(font_desc)
t.filename = filename
t.untitled = untitled
gtk_widget_show(t.textview)
var scroll = gtk_scrolled_window_new(nil, nil)
gtk_container_add(scroll, t.textview)
gtk_widget_show(scroll)
t.e = e
t.hbox = gtk_hbox_new(false, 0)
var image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU)
var button = gtk_button_new()
var lab = gtk_label_new(filename)
gtk_button_set_image(button, image)
gtk_button_set_relief(button, GTK_RELIEF_NONE)
gtk_box_pack_start(t.hbox, lab, false, false, 2)
gtk_box_pack_end(t.hbox, button, false, false, 0)
discard g_signal_connect(button, "clicked", G_Callback(onCloseTab), t)
gtk_widget_show(button)
gtk_widget_show(lab)
var idx = gtk_notebook_append_page(e.notebook, scroll, t.hbox)
gtk_notebook_set_current_page(e.notebook, idx)
proc on_new_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
inc(e.tabname)
createTab(e, "untitled-" & $e.tabname, true)
proc main(e: PEditor) =
var builder = glade_xml_new(getApplicationDir() / GuiTemplate, nil, nil)
if builder == nil: quit("cannot open: " & GuiTemplate)
# get the components:
e.window = GTK_WINDOW(glade_xml_get_widget(builder, "window"))
e.statusbar = GTK_STATUSBAR(glade_xml_get_widget(builder, "statusbar"))
e.notebook = GTK_NOTEBOOK(glade_xml_get_widget(builder, "notebook"))
setHomogeneous(e.notebook^, 1)
# connect the signal handlers:
glade_xml_signal_connect(builder, "on_window_destroy",
GCallback(on_window_destroy))
var about = GTK_MENU_ITEM(glade_xml_get_widget(builder, "about_menu_item"))
discard g_signal_connect(about, "activate",
G_CALLBACK(on_about_menu_item_activate), e)
var newItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "new_menu_item"))
discard g_signal_connect(newItem, "activate",
G_CALLBACK(on_new_menu_item_activate), e)
var quitItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "quit_menu_item"))
discard g_signal_connect(quitItem, "activate",
G_CALLBACK(on_window_destroy), e)
gtk_window_set_default_icon_name(GTK_STOCK_EDIT)
gtk_widget_show(e.window)
gtk_main()
gtk_nimrod_init()
var e = cast[PEditor](alloc0(sizeof(TEditor)))
main(e)
|