got rid of old ide code
This commit is contained in:
parent
cef96ef986
commit
2305a9e88d
5 changed files with 0 additions and 716 deletions
|
|
@ -1,93 +0,0 @@
|
|||
# Does the config parsing for us
|
||||
|
||||
import
|
||||
parsecfg, strtabs, strutils
|
||||
|
||||
type
|
||||
TTokenClass* = enum
|
||||
gtBackground,
|
||||
gtNone,
|
||||
gtWhitespace,
|
||||
gtDecNumber,
|
||||
gtBinNumber,
|
||||
gtHexNumber,
|
||||
gtOctNumber,
|
||||
gtFloatNumber,
|
||||
gtIdentifier,
|
||||
gtKeyword,
|
||||
gtStringLit,
|
||||
gtLongStringLit,
|
||||
gtCharLit,
|
||||
gtEscapeSequence,
|
||||
gtOperator,
|
||||
gtPunctation,
|
||||
gtComment,
|
||||
gtLongComment,
|
||||
gtRegularExpression,
|
||||
gtTagStart,
|
||||
gtTagEnd,
|
||||
gtKey,
|
||||
gtValue,
|
||||
gtRawData,
|
||||
gtAssembler,
|
||||
gtPreprocessor,
|
||||
gtDirective,
|
||||
gtCommand,
|
||||
gtRule,
|
||||
gtHyperlink,
|
||||
gtLabel,
|
||||
gtReference,
|
||||
gtOther,
|
||||
gtCursor
|
||||
|
||||
TColor* = colKeywords, colIdentifiers, colComments
|
||||
TConfiguration* = object of TObject ## the configuration object
|
||||
colors*: array [TTokenClass] of TColor ## the colors to use
|
||||
filelist*: seq[string] ## the filelist
|
||||
|
||||
const
|
||||
colWhite = 0x00ffffff # rgb
|
||||
colBlack = 0x00000000
|
||||
colYellow =
|
||||
|
||||
proc readConfig(filename: string): TConfiguration =
|
||||
# fill with reasonable defaults:
|
||||
result.filelist = []
|
||||
result.colors[gtBackground] = colWhite
|
||||
gtNone:
|
||||
gtWhitespace,
|
||||
gtDecNumber,
|
||||
gtBinNumber,
|
||||
gtHexNumber,
|
||||
gtOctNumber,
|
||||
gtFloatNumber,
|
||||
gtIdentifier,
|
||||
gtKeyword,
|
||||
gtStringLit,
|
||||
gtLongStringLit,
|
||||
gtCharLit,
|
||||
gtEscapeSequence,
|
||||
gtOperator,
|
||||
gtPunctation,
|
||||
gtComment,
|
||||
gtLongComment,
|
||||
gtRegularExpression,
|
||||
gtTagStart,
|
||||
gtTagEnd,
|
||||
gtKey,
|
||||
gtValue,
|
||||
gtRawData,
|
||||
gtAssembler,
|
||||
gtPreprocessor,
|
||||
gtDirective,
|
||||
gtCommand,
|
||||
gtRule,
|
||||
gtHyperlink,
|
||||
gtLabel,
|
||||
gtReference,
|
||||
gtOther
|
||||
gtCursor
|
||||
var
|
||||
p: TCfgParser
|
||||
if open(p, filename):
|
||||
|
||||
234
ide/main.nim
234
ide/main.nim
|
|
@ -1,234 +0,0 @@
|
|||
# The beginning of an IDE for Nimrod
|
||||
# (c) 2008 Andreas Rumpf
|
||||
|
||||
import os, glib2, gtk2, libglade2, dialogs, parseopt
|
||||
|
||||
proc on_window_destroy(obj: PGtkObject, data: pointer) {.cdecl.} =
|
||||
gtk_main_quit()
|
||||
|
||||
const
|
||||
GuiTemplate = "/media/hda1/Eigenes/nimrod/ide/nimide.glade"
|
||||
|
||||
type
|
||||
TTab = object of TObject
|
||||
textview: PGtkTextView
|
||||
filename: string
|
||||
untitled: bool
|
||||
|
||||
TMyTextEditor = object of TObject
|
||||
window: PGtkWindow
|
||||
statusbar: PGtkStatusBar
|
||||
textview: PGtkTextview
|
||||
statusbarContextId: int
|
||||
|
||||
|
||||
|
||||
proc on_about_menu_item_activate(menuItem: PGtkMenuItem,
|
||||
e: var TMyTextEditor) {.cdecl.} =
|
||||
gtk_show_about_dialog(e.window,
|
||||
"comments", "A fast and lightweight IDE for Nimrod",
|
||||
"copyright", "Copyright \xc2\xa9 2010 Andreas Rumpf",
|
||||
"version", "0.1",
|
||||
"website", "http://force7.de/nimrod/",
|
||||
"program-name", "Nimrod IDE",
|
||||
nil)
|
||||
|
||||
proc load_file(e: var TMyTextEditor, filename: string) =
|
||||
var
|
||||
err: pointer
|
||||
status: cstring
|
||||
text: cstring
|
||||
result: bool
|
||||
buffer: PGtkTextBuffer
|
||||
discard gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...")
|
||||
while gtk_events_pending() != 0: discard gtk_main_iteration()
|
||||
|
||||
# get the file contents
|
||||
result = g_file_get_contents(filename, addr(text), nil, addr(err))
|
||||
if not result:
|
||||
error(e.window, "Cannot load file")
|
||||
#g_error_free(err)
|
||||
|
||||
# disable the text view while loading the buffer with the text
|
||||
gtk_widget_set_sensitive(e.text_view, false)
|
||||
buffer = gtk_text_view_get_buffer(e.text_view)
|
||||
gtk_text_buffer_set_text(buffer, text, -1)
|
||||
gtk_text_buffer_set_modified(buffer, false)
|
||||
gtk_widget_set_sensitive(e.text_view, true)
|
||||
g_free(text)
|
||||
|
||||
e.filename = filename
|
||||
gtk_statusbar_pop(e.statusbar, e.statusbar_context_id)
|
||||
reset_default_status(e)
|
||||
|
||||
proc write_file(e: var TMyTextEditor, filename: string) =
|
||||
var
|
||||
err: ptr GError
|
||||
status: cstring
|
||||
text: cstring
|
||||
result: bool
|
||||
buffer: PGtkTextBuffer
|
||||
start, ende: TGtkTextIter
|
||||
# add Saving message to status bar and ensure GUI is current
|
||||
gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Saving...")
|
||||
while gtk_events_pending(): gtk_main_iteration()
|
||||
|
||||
# disable text view and get contents of buffer
|
||||
gtk_widget_set_sensitive(editor->text_view, FALSE)
|
||||
buffer = gtk_text_view_get_buffer(e.text_view)
|
||||
gtk_text_buffer_get_start_iter(buffer, start)
|
||||
gtk_text_buffer_get_end_iter(buffer, ende)
|
||||
text = gtk_text_buffer_get_text(buffer, start, ende, FALSE)
|
||||
gtk_text_buffer_set_modified(buffer, false)
|
||||
gtk_widget_set_sensitive(e.text_view, true)
|
||||
# set the contents of the file to the text from the buffer
|
||||
if filename != "":
|
||||
result = g_file_set_contents(filename, text, -1, addr(err))
|
||||
else:
|
||||
result = g_file_set_contents(editor->filename, text, -1, addr(err))
|
||||
if not result:
|
||||
error_message("cannot save")
|
||||
g_error_free(err)
|
||||
g_free(text)
|
||||
if filename != "":
|
||||
e.filename = filename
|
||||
gtk_statusbar_pop(e.statusbar, e.statusbar_context_id)
|
||||
reset_default_status(editor)
|
||||
|
||||
|
||||
proc check_for_save(e: var TMyTextEditor): bool =
|
||||
GtkTextBuffer *buffer;
|
||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->text_view));
|
||||
if gtk_text_buffer_get_modified(buffer):
|
||||
GtkWidget *dialog;
|
||||
const gchar *msg = "Do you want to save the changes you have made?";
|
||||
dialog = gtk_message_dialog_new (nil,
|
||||
GTK_DIALOG_MODAL or
|
||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||
GTK_MESSAGE_QUESTION,
|
||||
GTK_BUTTONS_YES_NO,
|
||||
msg);
|
||||
gtk_window_set_title (GTK_WINDOW (dialog), "Save?");
|
||||
result = gtk_dialog_run(dialog) != GTK_RESPONSE_NO
|
||||
gtk_widget_destroy(dialog)
|
||||
|
||||
proc initApp(e: var TMyTextEditor) =
|
||||
var
|
||||
builder: PGladeXML
|
||||
window: PGtkWidget
|
||||
fontDesc: PPangoFontDescription
|
||||
id: int
|
||||
builder = glade_xml_new(GuiTemplate, nil, nil)
|
||||
if builder == nil:
|
||||
error_message("cannot open: " & GuiTemplate)
|
||||
quit(1)
|
||||
# get the components:
|
||||
e.window = GTK_WINDOW(glade_xml_get_widget(builder, "window"))
|
||||
e.statusbar = GTK_STATUSBAR(glade_xml_get_widget(builder, "statusbar"))
|
||||
e.textview = GTK_TEXTVIEW(glade_xml_get_widget(builder, "textview"))
|
||||
|
||||
# connect the signal handlers:
|
||||
glade_xml_signal_connect(builder, "on_window_destroy",
|
||||
GCallback(on_window_destroy))
|
||||
|
||||
font_desc = pango_font_description_from_string("monospace 10")
|
||||
gtk_widget_modify_font(e.textview, font_desc)
|
||||
pango_font_description_free(font_desc)
|
||||
gtk_window_set_default_icon_name(GTK_STOCK_EDIT)
|
||||
|
||||
id = gtk_statusbar_get_context_id(e.statusbar, "Nimrod IDE")
|
||||
e.statusbarContextId = id
|
||||
reset_default_status(e)
|
||||
|
||||
e.filename = ""
|
||||
|
||||
|
||||
proc main() =
|
||||
var
|
||||
editor: TMyTextEditor
|
||||
|
||||
initApp(editor)
|
||||
gtk_widget_show(editor.window)
|
||||
gtk_main()
|
||||
|
||||
gtk_nimrod_init()
|
||||
main()
|
||||
|
||||
proc on_window_delete_event(widget: PGtkWidget, event: PGdkEvent,
|
||||
e: TMyTextEditor): bool {.cdecl.} =
|
||||
if check_for_save(editor):
|
||||
on_save_menu_item_activate(nil, editor)
|
||||
result = false
|
||||
|
||||
proc on_new_menu_item_activate(GtkMenuItem *menuitem, TutorialTextEditor *editor)
|
||||
GtkTextBuffer *buffer;
|
||||
|
||||
if check_for_save(editor):
|
||||
on_save_menu_item_activate(nil, editor)
|
||||
|
||||
/* clear editor for a new file */
|
||||
editor->filename = nil;
|
||||
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW (editor->text_view));
|
||||
gtk_text_buffer_set_text(buffer, "", -1);
|
||||
gtk_text_buffer_set_modified(buffer, FALSE);
|
||||
|
||||
reset_default_status(editor);
|
||||
|
||||
|
||||
proc on_open_menu_item_activate(menuItem: PGtkMenuItem,
|
||||
TutorialTextEditor *editor) =
|
||||
gchar *filename;
|
||||
|
||||
if check_for_save(editor):
|
||||
on_save_menu_item_activate(nil, editor)
|
||||
filename = get_open_filename(editor)
|
||||
if filename != nil: load_file(editor, filename)
|
||||
|
||||
proc on_save_menu_item_activate(menuItem: PGtkMenuItem, TutorialTextEditor *editor) =
|
||||
gchar *filename;
|
||||
if (editor->filename == nil)
|
||||
{
|
||||
filename = get_save_filename(editor);
|
||||
if (filename != nil) write_file(editor, filename);
|
||||
}
|
||||
else write_file(editor, nil);
|
||||
|
||||
proc on_save_as_menu_item_activate(GtkMenuItem *menuitem,
|
||||
TutorialTextEditor *editor) =
|
||||
gchar *filename;
|
||||
|
||||
filename = get_save_filename(editor)
|
||||
if filename != nil: write_file(editor, filename)
|
||||
|
||||
proc on_quit_menu_item_activate(GtkMenuItem *menuitem, TutorialTextEditor *editor)
|
||||
if check_for_save(editor):
|
||||
on_save_menu_item_activate(nil, editor)
|
||||
gtk_main_quit()
|
||||
|
||||
proc on_cut_menu_item_activate(GtkMenuItem *menuitem, TutorialTextEditor *editor) =
|
||||
GtkTextBuffer *buffer;
|
||||
GtkClipboard *clipboard;
|
||||
|
||||
clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
|
||||
buffer = gtk_text_view_get_buffer(editor->text_view)
|
||||
gtk_text_buffer_cut_clipboard(buffer, clipboard, TRUE)
|
||||
|
||||
proc on_copy_menu_item_activate(GtkMenuItem *menuitem, TutorialTextEditor *editor) =
|
||||
GtkTextBuffer *buffer;
|
||||
GtkClipboard *clipboard;
|
||||
clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)
|
||||
buffer = gtk_text_view_get_buffer(editor->text_view)
|
||||
gtk_text_buffer_copy_clipboard(buffer, clipboard)
|
||||
|
||||
|
||||
proc on_paste_menu_item_activate(GtkMenuItem *menuitem, TutorialTextEditor *editor)
|
||||
GtkTextBuffer *buffer;
|
||||
GtkClipboard *clipboard;
|
||||
clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)
|
||||
buffer = gtk_text_view_get_buffer(editor->text_view)
|
||||
gtk_text_buffer_paste_clipboard(buffer, clipboard, nil, TRUE)
|
||||
|
||||
proc on_delete_menu_item_activate(GtkMenuItem *menuitem, TutorialTextEditor *editor)
|
||||
GtkTextBuffer *buffer;
|
||||
buffer = gtk_text_view_get_buffer(editor->text_view);
|
||||
gtk_text_buffer_delete_selection(buffer, FALSE, TRUE);
|
||||
192
ide/nimide.glade
192
ide/nimide.glade
|
|
@ -1,192 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
||||
<!--*- mode: xml -*-->
|
||||
<glade-interface>
|
||||
<widget class="GtkWindow" id="window">
|
||||
<property name="extension_events">GDK_EXTENSION_EVENTS_ALL</property>
|
||||
<signal name="destroy" handler="on_window_destroy" object="destroy"/>
|
||||
<child>
|
||||
<widget class="GtkVBox" id="mainvbox">
|
||||
<property name="width_request">600</property>
|
||||
<property name="height_request">400</property>
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkMenuBar" id="menubar">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkMenuItem" id="menuitem1">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">_Datei</property>
|
||||
<property name="use_underline">True</property>
|
||||
<child>
|
||||
<widget class="GtkMenu" id="menu1">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="new_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-new</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="open_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-open</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="save_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-save</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="save_as_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-save-as</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
|
||||
<property name="visible">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="quit_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-quit</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkMenuItem" id="menuitem2">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">_Bearbeiten</property>
|
||||
<property name="use_underline">True</property>
|
||||
<child>
|
||||
<widget class="GtkMenu" id="menu2">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="cut_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-cut</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="copy_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-copy</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="paste_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-paste</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="delete_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-delete</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkMenuItem" id="menuitem4">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">_Hilfe</property>
|
||||
<property name="use_underline">True</property>
|
||||
<child>
|
||||
<widget class="GtkMenu" id="menu3">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="about_menu_item">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">gtk-about</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkNotebook" id="notebook">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="tab_hborder">10</property>
|
||||
<property name="tab_vborder">0</property>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
<packing>
|
||||
<property name="type">tab</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
<packing>
|
||||
<property name="type">tab</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
<packing>
|
||||
<property name="type">tab</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkStatusbar" id="statusbar">
|
||||
<property name="visible">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</glade-interface>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
||||
<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
|
||||
|
||||
<glade-project>
|
||||
<name></name>
|
||||
<program_name></program_name>
|
||||
<gnome_support>FALSE</gnome_support>
|
||||
</glade-project>
|
||||
189
ide/nimide.nim
189
ide/nimide.nim
|
|
@ -1,189 +0,0 @@
|
|||
# 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
|
||||
tabs: seq[PTab]
|
||||
currTab: int
|
||||
PEditor = ptr TEditor
|
||||
|
||||
proc onWindowDestroy(obj: PGtkObject, event: PGdkEvent,
|
||||
data: pointer): gboolean {.cdecl.} =
|
||||
gtkMainQuit()
|
||||
|
||||
proc onAboutMenuItemActivate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
|
||||
gtkShowAboutDialog(e.window,
|
||||
"comments", "A fast and lightweight IDE for Nimrod",
|
||||
"copyright", "Copyright \xc2\xa9 2010 Andreas Rumpf",
|
||||
"version", "0.1",
|
||||
"website", "http://force7.de/nimrod/",
|
||||
"program-name", "Nimrod IDE",
|
||||
nil)
|
||||
|
||||
proc getTabIndex(e: PEditor, tab: PTab): int =
|
||||
var i = 0
|
||||
while true:
|
||||
var w = gtkNotebookGetNthPage(e.notebook, i)
|
||||
if w == nil: return -1
|
||||
var v = gtkNotebookGetTabLabel(e.notebook, w)
|
||||
if tab.hbox == v: return i
|
||||
inc(i)
|
||||
|
||||
proc getActiveTab(e: PEditor): PTab =
|
||||
nil
|
||||
|
||||
type
|
||||
TAnswer = enum
|
||||
answerYes, answerNo, answerCancel
|
||||
|
||||
proc askWhetherToSave(e: PEditor): TAnswer =
|
||||
var dialog = gtkDialogNewWithButtons("Should the changes be saved?",
|
||||
e.window, GTK_DIALOG_MODAL, GTK_STOCK_SAVE, 1, "gtk-discard", 2,
|
||||
GTK_STOCK_CANCEL, 3, nil)
|
||||
result = TAnswer(gtkDialogRun(dialog)+1)
|
||||
gtkWidgetDestroy(dialog)
|
||||
|
||||
proc saveTab(tab: PTab) =
|
||||
if tab.untitled:
|
||||
tab.filename = ChooseFileToSave(tab.e.window, getRoot(tab))
|
||||
tab.untitled = false
|
||||
XXX
|
||||
|
||||
proc OnCloseTab(button: PGtkButton, tab: PTab) {.cdecl.} =
|
||||
var idx = -1
|
||||
for i in 0..high(tab.e.tabs):
|
||||
if tab.e.tabs[i] == tab:
|
||||
idx = i
|
||||
break
|
||||
if idx >= 0:
|
||||
if gtkTextBufferGetModified(gtkTextViewGetBuffer(tab.textView)):
|
||||
case askWhetherToSave(tab.e)
|
||||
of answerCancel: return
|
||||
of answerYes: saveTab(tab)
|
||||
of answerNo: nil
|
||||
|
||||
gtkNotebookRemovePage(tab.e.notebook, idx)
|
||||
if idx < high(tab.e.tabs):
|
||||
for i in idx..high(tab.e.tabs)-1:
|
||||
tab.e.tabs[i] = tab.e.tabs[i+1]
|
||||
else:
|
||||
dec currTab
|
||||
GC_unref(tab.filename)
|
||||
dealloc(tab)
|
||||
#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 = gtkTextViewNewWithBuffer(gtkTextBufferNew(nil))
|
||||
var fontDesc = pangoFontDescriptionFromString("monospace 10")
|
||||
gtkWidgetModifyFont(t.textview, fontDesc)
|
||||
pangoFontDescriptionFree(fontDesc)
|
||||
t.filename = filename
|
||||
t.untitled = untitled
|
||||
gtkWidgetShow(t.textview)
|
||||
var scroll = gtkScrolledWindowNew(nil, nil)
|
||||
gtkContainerAdd(scroll, t.textview)
|
||||
gtkWidgetShow(scroll)
|
||||
|
||||
t.e = e
|
||||
t.hbox = gtkHboxNew(false, 0)
|
||||
var image = gtkImageNewFromStock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU)
|
||||
var button = gtkButtonNew()
|
||||
var lab = gtkLabelNew(filename)
|
||||
gtkButtonSetImage(button, image)
|
||||
gtkButtonSetRelief(button, GTK_RELIEF_NONE)
|
||||
gtkBoxPackStart(t.hbox, lab, false, false, 2)
|
||||
gtkBoxPackEnd(t.hbox, button, false, false, 0)
|
||||
|
||||
discard gSignalConnect(button, "clicked", G_Callback(onCloseTab), t)
|
||||
gtkWidgetShow(button)
|
||||
gtkWidgetShow(lab)
|
||||
|
||||
var idx = gtkNotebookAppendPage(e.notebook, scroll, t.hbox)
|
||||
e.currTab = idx
|
||||
add(e.tabs, t)
|
||||
gtkNotebookSetCurrentPage(e.notebook, idx)
|
||||
|
||||
|
||||
proc onOpenMenuItemActivate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
|
||||
var files = ChooseFilesToOpen(e.window, getRoot(getActiveTab(e)))
|
||||
for f in items(files): createTab(e, f, untitled=false)
|
||||
|
||||
proc onSaveMenuItemActivate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
|
||||
var cp = gtkNotebookGetCurrentPage(e.notebook)
|
||||
|
||||
|
||||
proc onSaveAsMenuItemActivate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
|
||||
nil
|
||||
|
||||
proc onNewMenuItemActivate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
|
||||
inc(e.tabname)
|
||||
createTab(e, "untitled-" & $e.tabname, true)
|
||||
|
||||
proc main(e: PEditor) =
|
||||
var builder = gladeXmlNew(getApplicationDir() / GuiTemplate, nil, nil)
|
||||
if builder == nil: quit("cannot open: " & GuiTemplate)
|
||||
# get the components:
|
||||
e.window = GTK_WINDOW(gladeXmlGetWidget(builder, "window"))
|
||||
e.statusbar = GTK_STATUSBAR(gladeXmlGetWidget(builder, "statusbar"))
|
||||
e.notebook = GTK_NOTEBOOK(gladeXmlGetWidget(builder, "notebook"))
|
||||
e.tabs = @[]
|
||||
e.currTab = -1
|
||||
setHomogeneous(e.notebook^, 1)
|
||||
|
||||
# connect the signal handlers:
|
||||
gladeXmlSignalConnect(builder, "on_window_destroy",
|
||||
GCallback(onWindowDestroy))
|
||||
var about = GTK_MENU_ITEM(gladeXmlGetWidget(builder, "about_menu_item"))
|
||||
discard gSignalConnect(about, "activate",
|
||||
G_CALLBACK(onAboutMenuItemActivate), e)
|
||||
|
||||
var newItem = GTK_MENU_ITEM(gladeXmlGetWidget(builder, "new_menu_item"))
|
||||
discard gSignalConnect(newItem, "activate",
|
||||
G_CALLBACK(onNewMenuItemActivate), e)
|
||||
|
||||
var quitItem = GTK_MENU_ITEM(gladeXmlGetWidget(builder, "quit_menu_item"))
|
||||
discard gSignalConnect(quitItem, "activate",
|
||||
G_CALLBACK(onWindowDestroy), e)
|
||||
|
||||
var openItem = GTK_MENU_ITEM(gladeXmlGetWidget(builder, "open_menu_item"))
|
||||
discard gSignalConnect(openItem, "activate",
|
||||
G_CALLBACK(onOpenMenuItemActivate), e)
|
||||
|
||||
var saveItem = GTK_MENU_ITEM(gladeXmlGetWidget(builder, "save_menu_item"))
|
||||
discard gSignalConnect(saveItem, "activate",
|
||||
G_CALLBACK(onSaveMenuItemActivate), e)
|
||||
|
||||
var saveAsItem = GTK_MENU_ITEM(gladeXmlGetWidget(builder, "save_as_menu_item"))
|
||||
discard gSignalConnect(saveAsItem, "activate",
|
||||
G_CALLBACK(onSaveAsMenuItemActivate), e)
|
||||
|
||||
gtkWindowSetDefaultIconName(GTK_STOCK_EDIT)
|
||||
gtkWidgetShow(e.window)
|
||||
gtkMain()
|
||||
|
||||
|
||||
gtkNimrodInit()
|
||||
var e = cast[PEditor](alloc0(sizeof(TEditor)))
|
||||
main(e)
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue