123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 |
- class SIMPLE_NOTEPAD_8
- inherit
- IUP_INTERFACE
- create {ANY}
- make
- feature {ANY}
- ml: IUP_MULTILINE
- cfg: IUP_CONFIG
- str_find (str, str_to_find: STRING; casesensitive: BOOLEAN; pos: INTEGER): INTEGER
- do
- if str.count.is_equal(0) or str_to_find.count.is_equal(0) then
- Result := -1
- elseif casesensitive then
- str.to_lower
- str_to_find.to_lower
- end
- Result := str.substring_index(str_to_find, pos)
- end
- read_file (file_name: STRING): STRING
- local
- tfr: PLAIN_TEXT_FILE
- str: STRING
- ms: IUP_MESSAGE
- do
- create str.make_empty
- create tfr.make_open_read(file_name)
- if tfr.is_access_readable then
- from
- tfr.read_line
- until
- tfr.end_of_file
- loop
- str.append(tfr.last_string)
- str.append_character('%N')
- tfr.read_line
- end
-
- str.append(tfr.last_string)
- tfr.close
- else
- str.append("Fail when reading from file: ")
- str.append(file_name)
- create ms.message("Error", str)
- end
-
- Result := str
- end
- write_file (file_name, text: STRING): INTEGER
- local
- tfw: PLAIN_TEXT_FILE
- ms: IUP_MESSAGE
- str: STRING
- do
- create tfw.make_open_write(file_name)
- if tfw.is_access_writable then
- tfw.put_string(text)
- tfw.close
- Result := 1
- else
- create str.make_empty
- str.append("Fail when writing to file: ")
- str.append(file_name)
- create ms.message("Error", str)
- Result := 0
- end
- end
- --********************************** Callbacks *****************************************
- edit_menu_open_cb (m: IUP_MENU): STRING
- local
- cb: IUP_CLIPBOARD
- do
- cb := get_clipboard
-
- if attached {IUP_MENU_ITEM} m.get_dialog_child("ITEM_PASTE") as item_p and
- attached {IUP_MENU_ITEM} m.get_dialog_child("ITEM_CUT") as item_c and
- attached {IUP_MENU_ITEM} m.get_dialog_child("ITEM_COPY") as item_cp and
- attached {IUP_MENU_ITEM} m.get_dialog_child("ITEM_DELETE") as item_del then
- if cb.is_text_available then
- item_p.set_active(True)
- else
- item_p.set_active(False)
- end
-
- if ml.get_selected_text.is_empty then
- item_c.set_active(False)
- item_cp.set_active(False)
- item_del.set_active(False)
- else
- item_c.set_active(True)
- item_cp.set_active(True)
- item_del.set_active(True)
- end
- end
-
- Result := "IUP_DEFAULT"
- end
-
- item_recent_cb (c: IUP_CONFIG): STRING
- local
- text: STRING
- do
- text := read_file(c.get_title)
- ml.set_value(text)
- Result := "IUP_DEFAULT"
- end
-
- config_recent_cb (c: IUP_CONFIG): STRING
- local
- file, text: STRING
- do
- file := c.get_title
- text := read_file(file)
- ml.set_value(text)
-
- Result := "IUP_DEFAULT"
- end
-
- multitext_caret_cb (m: IUP_TEXT; lin, col, pos: INTEGER): STRING
- local
- str: STRING
- do
- if attached {IUP_LABEL} m.get_dialog_child("STATUSBAR") as lbl_statusbar then
- str := "Line "
- str.append(lin.out)
- str.append(", Col ")
- str.append(col.out)
- lbl_statusbar.set_title(str)
- end
-
- Result := "IUP_DEFAULT"
- end
-
- item_open_action_cb (widget: IUP_MENU_ITEM): STRING
- -- Menu open action
- do
- Result := open_dialog
- end
- button_open_action_cb (widget: IUP_BUTTON): STRING
- -- Button open action
- do
- Result := open_dialog
- end
- open_dialog: STRING
- local
- status: INTEGER
- rv, name, text: STRING
- fd: IUP_FILE_DIALOG
- do
- create fd.file_dialog
- fd.set_dialog_type("OPEN")
- fd.set_ext_filter("Text files|*.txt|All Files|*.*|")
- fd.set_title("Select a text file")
- rv := fd.popup_predefined_xy("IUP_CENTER", "IUP_CENTER")
- if rv.is_equal("IUP_NOERROR") then
- status := fd.get_status
- if status.is_equal(0) then
- name := fd.get_value
- text := read_file(name)
- cfg.update_recent_file_list(name)
- ml.set_value(text)
- end
- end
- fd.destroy
- Result := "IUP_DEFAULT"
- end
- item_save_as_action_cb (widget: IUP_MENU_ITEM): STRING
- -- Menu save as action
- do
- Result := save_as_dialog
- end
- button_save_as_action_cb (widget: IUP_BUTTON): STRING
- -- Buttib save as action
- do
- Result := save_as_dialog
- end
- save_as_dialog: STRING
- local
- status, r: INTEGER
- rv, name, text: STRING
- fd: IUP_FILE_DIALOG
- do
- create fd.file_dialog
- fd.set_dialog_type("SAVE")
- fd.set_ext_filter("Text files|*.txt|All Files|*.*|")
- fd.set_title("Select a text file")
- rv := fd.popup_predefined_xy("IUP_CENTER", "IUP_CENTER")
- if rv.is_equal("IUP_NOERROR") then
- status := fd.get_status
- if not status.is_equal(-1) then
- name := fd.get_value
- text := ml.get_value
- r := write_file(name, text)
- if r.is_equal(1) then
- cfg.update_recent_file_list(name)
- end
- end
- end
- fd.destroy
- Result := "IUP_DEFAULT"
- end
- item_font_action_cb (widget: IUP_MENU_ITEM): STRING
- local
- status: INTEGER
- rv, ft, selected: STRING
- fd: IUP_FONT_DIALOG
- do
- create fd.font_dialog
- ft := ml.get_font
- fd.set_value(ft)
- rv := fd.popup_predefined_xy("IUP_CENTER", "IUP_CENTER")
- if rv.is_equal("IUP_NOERROR") then
- status := fd.get_status
- if status.is_equal(1) then
- selected := fd.get_value
- ml.set_font(selected)
- cfg.set_variable_string("MainWindow", "Font", selected)
- end
- end
- fd.destroy
- Result := "IUP_DEFAULT"
- end
- item_about_action_cb (widget: IUP_MENU_ITEM): STRING
- local
- ms: IUP_MESSAGE
- do
- create ms.message("About"," Simple Notepad%N%NAuthors:%N Gustavo Lyrio%N Antonio Scuri")
- Result := "IUP_DEFAULT"
- end
- item_exit_action_cb (widget: IUP_MENU_ITEM): STRING
- local
- i: INTEGER
- do
- if attached widget.get_dialog as dlg then
- cfg.save_dialog (dlg, "MainWindow")
- i := cfg.save
- end
-
- cfg.destroy
-
- Result := "IUP_CLOSE"
- end
- close_dialog_cb (dlg: IUP_DIALOG): STRING
- local
- i: INTEGER
- do
- cfg.save_dialog (dlg, "MainWindow")
- i := cfg.save
- cfg.destroy
-
- Result := "IUP_CLOSE"
- end
- goto_ok_action_cb(widget: IUP_BUTTON): STRING
- local
- line_count, line: INTEGER
- ms: IUP_MESSAGE
- do
- if attached widget.get_dialog as dlg and
- attached {IUP_TEXT} widget.get_dialog_child("LINE_TEXT") as txt then
-
- line_count := widget.get_attribute_integer("TEXT_LINECOUNT")
- line := txt.get_value.to_integer
- if line < 1 or line >= line_count then
- create ms.message("Error", "Invalid line number.")
- Result := "IUP_DEFAULT"
- else
- dlg.set_attribute_integer("STATUS", 1)
- Result := "IUP_CLOSE"
- end
- end
- Result := "IUP_CLOSE"
- end
- goto_cancel_action_cb(widget: IUP_BUTTON): STRING
- do
- if attached {IUP_DIALOG} widget.get_dialog as dlg then
- dlg.set_attribute_integer("STATUS", 0)
- end
- Result := "IUP_CLOSE"
- end
- item_goto_action_cb (widget: IUP_MENU_ITEM): STRING
- local
- dlg: IUP_DIALOG
- vbox: IUP_VBOX
- hbox: IUP_HBOX
- bt_ok, bt_cancel: IUP_BUTTON
- f: IUP_FILL
- lbl: IUP_LABEL
- txt: IUP_TEXT
- str, s: STRING
- line_count, line, pos: INTEGER
- pf: IUP_WIDGET
- do
- line_count := ml.get_line_count
- str := "Line Number [1-"
- str.append_string(ml.get_line_count.out)
- str.append_string("]:")
- create lbl.label(str)
- create txt.text
- txt.set_mask("IUP_MASK_UINT") -- unsigned integer numbers only
- txt.set_name("LINE_TEXT")
- txt.set_visible_columns(20)
- create bt_ok.button("OK")
- bt_ok.set_attribute_integer("TEXT_LINECOUNT", line_count)
- bt_ok.set_padding(10, 2)
- bt_ok.set_cb_action(agent goto_ok_action_cb)
- create bt_cancel.button("Cancel")
- bt_cancel.set_padding(10, 2)
- bt_cancel.set_cb_action(agent goto_cancel_action_cb)
- create f.fill
- create hbox.hbox({ARRAY[IUP_WIDGET]} << f, bt_ok, bt_cancel >>)
- hbox.normalize_size_horizontal
- create vbox.vbox({ARRAY[IUP_WIDGET]} << lbl, txt, hbox >>)
- vbox.set_margin(10, 10)
- vbox.set_gap(5)
- create dlg.dialog(vbox)
- dlg.set_title("Go To Line")
- dlg.set_modal_dialog_frame(True)
- dlg.set_default_enter_widget(bt_ok)
- dlg.set_default_escape_widget(bt_cancel)
- if attached widget.get_dialog as main_dlg then
- dlg.set_parent_dialog_widget(main_dlg)
- end
- s := dlg.popup_predefined_xy ("IUP_CENTERPARENT", "IUP_CENTERPARENT")
- if s.is_equal("IUP_NOERROR") and dlg.get_attribute_integer("STATUS").is_equal(1) then
- line := txt.get_value.to_integer
- pos := ml.text_convert_lin_col_to_pos(line, 0)
- ml.set_multiline_caret_pos(pos)
- ml.scroll_to_pos(pos)
- pf := ml.set_focus
- end
- dlg.destroy
-
- Result := "IUP_DEFAULT"
- end
- find_next_action_cb (widget: IUP_BUTTON): STRING
- local
- str, str_to_find: STRING
- casesensitive: BOOLEAN
- find_pos, pos, end_pos: INTEGER
- tup: TUPLE[INTEGER, INTEGER]
- pw: IUP_WIDGET
- ms: IUP_MESSAGE
- do
- str := ml.get_value
- find_pos := ml.get_attribute_integer("FIND_POS")
- if find_pos = 0 then
- find_pos := 1
- end
- if attached {IUP_TEXT} widget.get_dialog_child("FIND_TEXT") as txt then
- str_to_find := txt.get_value
- if attached {IUP_TOGGLE} widget.get_dialog_child("FIND_CASE") as find_case then
- casesensitive := find_case.is_off
- -- Rest 1 since the string start at 1, but multiline position
- -- start at 0.
- pos := str_find(str, str_to_find, casesensitive, find_pos) - 1
- if pos < 0 and find_pos > 0 then
- -- try again from the start
- pos := str_find(str, str_to_find, casesensitive, 1) - 1
- end
- if pos > 0 then
- end_pos := pos + str_to_find.count
- ml.set_attribute_integer("FIND_POS", end_pos)
- pw := ml.set_focus
- ml.set_multiline_selection_pos(pos, end_pos)
- tup := ml.text_convert_pos_to_lin_col(pos)
- -- position at col=0, just scroll lines
- pos := ml.text_convert_lin_col_to_pos(tup.integer_32_item(1), 0)
- ml.scroll_to_pos(pos)
- else
- create ms.message("Warning", "Text not found.")
- end
- end
-
- end
-
- Result := "IUP_DEFAULT"
- end
- find_close_action_cb (widget: IUP_BUTTON): STRING
- do
- if attached widget.get_dialog as dlg then
- dlg.hide
- end
- Result := "IUP_DEFAULT"
- end
- item_find_action_cb (widget: IUP_MENU_ITEM): STRING
- -- Find action from menu.
- do
- if attached widget.get_dialog as main_dlg then
- Result := find_dialog (main_dlg)
- else
- Result := "IUP_DEFAULT"
- end
- end
- button_find_action_cb (widget: IUP_BUTTON): STRING
- -- Find action from button.
- do
- if attached widget.get_dialog as main_dlg then
- Result := find_dialog (main_dlg)
- else
- Result := "IUP_DEFAULT"
- end
- end
- find_dialog (main_dlg: IUP_DIALOG): STRING
- local
- dlg: IUP_DIALOG
- lbl: IUP_LABEL
- txt: IUP_TEXT
- bt_next, bt_close: IUP_BUTTON
- find_case: IUP_TOGGLE
- f: IUP_FILL
- hbox: IUP_HBOX
- vbox: IUP_VBOX
- s: STRING
- do
- if attached {IUP_DIALOG} main_dlg.get_attribute_widget("FIND_DIALOG") as find_dlg then
- dlg := find_dlg
- else
- create lbl.label("Find What:")
- create txt.text
- txt.set_name("FIND_TEXT")
- txt.set_visible_columns(20)
- create find_case.toggle("Case Sensitive")
- find_case.set_name("FIND_CASE")
- create bt_next.button("Find Next")
- bt_next.set_padding(10, 2)
- bt_next.set_cb_action(agent find_next_action_cb)
- create bt_close.button("Close")
- bt_close.set_padding(10, 2)
- bt_close.set_cb_action(agent find_close_action_cb)
- create f.fill
- create hbox.hbox({ARRAY[IUP_WIDGET]} << f, bt_next, bt_close >>)
- hbox.normalize_size_horizontal
- create vbox.vbox({ARRAY[IUP_WIDGET]} << lbl, txt, find_case, hbox >>)
- vbox.set_margin(10, 10)
- vbox.set_gap(10)
- create dlg.dialog(vbox)
- dlg.set_title("Find")
- dlg.set_modal_dialog_frame(True)
- dlg.set_default_enter_widget(bt_next)
- dlg.set_default_escape_widget(bt_close)
- dlg.set_parent_dialog_widget(main_dlg)
- -- Save the dialog to reuse it
- main_dlg.set_attribute_widget("FIND_DIALOG", dlg)
- end
-
- -- centerparent first time, next time reuse the last position
- s := dlg.show_predefined_xy("IUP_CURRENT", "IUP_CURRENT")
- Result := "IUP_DEFAULT"
- end
- item_copy_action_cb(item: IUP_MENU_ITEM): STRING
- local
- cp: IUP_CLIPBOARD
- do
- cp := get_clipboard
- cp.add_text(ml.get_selected_text)
- Result := "IUP_DEFAULT"
- end
- item_paste_action_cb(item: IUP_MENU_ITEM): STRING
- local
- cp: IUP_CLIPBOARD
- do
- cp := get_clipboard
- ml.insert(cp.get_text)
-
- Result := "IUP_DEFAULT"
- end
- item_cut_action_cb(item: IUP_MENU_ITEM): STRING
- local
- cp: IUP_CLIPBOARD
- do
- cp := get_clipboard
- cp.add_text(ml.get_selected_text)
- ml.set_selected_text("")
- Result := "IUP_DEFAULT"
- end
- item_delete_action_cb(item: IUP_MENU_ITEM): STRING
- do
- ml.set_selected_text("")
-
- Result := "IUP_DEFAULT"
- end
- item_select_all_action_cb(item: IUP_MENU_ITEM): STRING
- do
- ml.select_all
- Result := "IUP_DEFAULT"
- end
- key_pressed (dlg: IUP_DIALOG; k: INTEGER): STRING
- do
- if k.is_equal(iup_open.x_key_ctrl('O')) then
- Result := open_dialog
- elseif k.is_equal(iup_open.x_key_ctrl('S')) then
- Result := save_as_dialog
- elseif k.is_equal(iup_open.x_key_ctrl('F')) then
- Result := find_dialog(dlg)
- elseif k.is_equal(iup_open.x_key_ctrl('G')) and
- attached {IUP_MENU_ITEM} dlg.get_dialog_child("ITEM_GOTO") as item then
- Result := item_goto_action_cb(item)
- else
- Result := "IUP_DEFAULT"
- end
- end
- --********************************** Make *****************************************
- make
- local
- i: STRING
- x: INTEGER
- gui: IUP
- v: IUP_VBOX
- w: IUP_DIALOG
- item_exit, item_open, item_save_as, item_font, item_about: IUP_MENU_ITEM
- item_find, item_goto, item_copy, item_paste, item_cut, item_delete, item_select_all: IUP_MENU_ITEM
- sep1, sep2, sep3: IUP_MENU_SEPARATOR
- file_menu, edit_menu, format_menu, help_menu, menu, recent_menu: IUP_MENU
- sub_menu_file, sub_menu_edit, sub_menu_format, sub_menu_help, sub_menu_recent: IUP_SUBMENU
- btn_open, btn_save, btn_find: IUP_BUTTON
- lbl_statusbar, toolbar_sep: IUP_LABEL
- toolbar_hb: IUP_HBOX
- do
- gui := iup_open
- gui.load_images
- create cfg.config
- cfg.set_app_name("simple_notepad")
- x := cfg.load
-
- create ml.multiline
- ml.expand_both_directions
- ml.set_cb_caret(agent multitext_caret_cb)
- i := cfg.get_variable_string("MainWindow", "Font")
- if not i.is_empty then
- ml.set_font(i)
- end
-
- create item_open.item("&Open... %TCtrl+O")
- item_open.set_hide_mark(True)
- item_open.set_cb_action(agent item_open_action_cb)
- create btn_open.button("")
- btn_open.set_image("IUP_FileOpen")
- btn_open.set_flat(True)
- btn_open.set_can_focus(False)
- btn_open.set_tip("Open (Ctrl+O)")
- btn_open.set_cb_action(agent button_open_action_cb)
- create item_save_as.item("Save &As...%TCtrl+S")
- item_save_as.set_hide_mark(True)
- item_save_as.set_cb_action(agent item_save_as_action_cb)
- create btn_save.button("")
- btn_save.set_image("IUP_FileSave")
- btn_save.set_flat(True)
- btn_save.set_can_focus(False)
- btn_save.set_tip("Save (Ctrl+S)")
- btn_save.set_cb_action(agent button_save_as_action_cb)
- create item_exit.item("E&xit")
- item_exit.set_hide_mark(True)
- item_exit.set_cb_action(agent item_exit_action_cb)
- create item_find.item("&Find...%TCtrl+F")
- item_find.set_hide_mark(True)
- item_find.set_cb_action(agent item_find_action_cb)
- create btn_find.button("")
- btn_find.set_image("IUP_EditFind")
- btn_find.set_flat(True)
- btn_find.set_can_focus(False)
- btn_find.set_tip("Find (Ctrl+F)")
- btn_find.set_cb_action(agent button_find_action_cb)
- create item_goto.item("&Go To...%TCtrl+G")
- item_goto.set_hide_mark(True)
- item_goto.set_name("ITEM_GOTO")
- item_goto.set_cb_action(agent item_goto_action_cb)
- create item_font.item("&Font...")
- item_font.set_hide_mark(True)
- item_font.set_cb_action(agent item_font_action_cb)
- create item_about.item("&About...")
- item_about.set_hide_mark(True)
- item_about.set_cb_action(agent item_about_action_cb)
- create item_copy.item("Copy%TCtrl+C")
- item_copy.set_name("ITEM_COPY")
- item_copy.set_hide_mark(True)
- item_copy.set_cb_action(agent item_copy_action_cb)
- create item_paste.item("Paste%TCtrl+V")
- item_paste.set_name("ITEM_PASTE")
- item_paste.set_hide_mark(True)
- item_paste.set_cb_action(agent item_paste_action_cb)
- create item_cut.item("Cut%TCtrl+X")
- item_cut.set_name("ITEM_CUT")
- item_cut.set_hide_mark(True)
- item_cut.set_cb_action(agent item_cut_action_cb(?))
- create item_delete.item("Delete%TDel")
- item_delete.set_name("ITEM_DELETE")
- item_delete.set_hide_mark(True)
- item_delete.set_cb_action(agent item_delete_action_cb)
- create item_select_all.item("Select All%TCtrl+A")
- item_select_all.set_hide_mark(True)
- item_select_all.set_cb_action(agent item_select_all_action_cb)
- create sep1.separator
- create sep2.separator
- create sep3.separator
- create toolbar_sep.label_empty
- toolbar_sep.set_vertical_separator
- create recent_menu.menu_empty
- create sub_menu_recent.submenu("Recent &Files", recent_menu)
- create file_menu.menu({ARRAY[IUP_MENU_ELEMENT]} << item_open, item_save_as, sep1, sub_menu_recent, item_exit >>)
- create edit_menu.menu({ARRAY[IUP_MENU_ELEMENT]} << item_cut, item_copy, item_paste, item_delete, sep2, item_find, item_goto, sep3, item_select_all >>)
- create format_menu.menu({ARRAY[IUP_MENU_ELEMENT]} << item_font >>)
- create help_menu.menu({ARRAY[IUP_MENU_ELEMENT]} << item_about >>)
- edit_menu.set_cb_open(agent edit_menu_open_cb)
- create sub_menu_file.submenu("&File", file_menu)
- create sub_menu_edit.submenu("&Edit", edit_menu)
- create sub_menu_format.submenu("F&ormat", format_menu)
- create sub_menu_help.submenu("&Help", help_menu)
-
- create menu.menu({ARRAY[IUP_MENU_ELEMENT]} << sub_menu_file, sub_menu_edit, sub_menu_format, sub_menu_help >>)
- create toolbar_hb.hbox({ARRAY[IUP_WIDGET]} << btn_open, btn_save, toolbar_sep, btn_find >>)
- toolbar_hb.set_margin(5, 5)
- toolbar_hb.set_gap(2)
- create lbl_statusbar.label("Lin 1, Col 1")
- lbl_statusbar.set_name("STATUSBAR")
- lbl_statusbar.expand_horizontal
- lbl_statusbar.set_padding(10, 5)
- create v.vbox({ARRAY[IUP_WIDGET]} << toolbar_hb, ml, lbl_statusbar >>)
-
- create w.dialog(v)
- w.set_menu_widget(menu)
- w.set_title("Simple Notepad")
- w.set_predefined_size("HALF", "HALF")
- w.set_cb_k_any(agent key_pressed)
- -- parent for some pre-defined dialogs in callbak functions
- gui.set_global_parent_dialog_widget(w)
-
- w.set_user_size(0, 0)
- w.set_cb_close(agent close_dialog_cb)
- cfg.set_recent_file_menu(recent_menu, agent config_recent_cb, 10)
- cfg.show_dialog(w, "MainWindow")
-
- gui.main_loop
- gui.close
- end
- end
|