Mercurial Hosting > editor
comparison src/luan_editor/menu.luan @ 37:b7ff52d45b9a
copy from luan
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Mon, 21 Apr 2025 13:07:29 -0600 |
| parents | |
| children | 8c90e0077cfe |
comparison
equal
deleted
inserted
replaced
| 36:0a8865de3d53 | 37:b7ff52d45b9a |
|---|---|
| 1 local Luan = require "luan:Luan.luan" | |
| 2 local error = Luan.error | |
| 3 local String = require "luan:String.luan" | |
| 4 local to_number = String.to_number or error() | |
| 5 local new_menu_item = require("luan:swing/Menu_item.luan").new or error() | |
| 6 local new_check_box_menu_item = require("luan:swing/Check_box_menu_item.luan").new or error() | |
| 7 local new_menu_bar = require("luan:swing/Menu_bar.luan").new or error() | |
| 8 local Menu = require "luan:swing/Menu.luan" | |
| 9 local new_menu = Menu.new or error() | |
| 10 local separator = Menu.separator or error() | |
| 11 local Option_pane = require "luan:swing/Option_pane.luan" | |
| 12 local show_message_dialog = Option_pane.show_message_dialog or error() | |
| 13 local show_input_dialog = Option_pane.show_input_dialog or error() | |
| 14 local Spell_checker = require "classpath:luan_editor/Spell_checker.luan" | |
| 15 local spell_check = Spell_checker.spell_check or error() | |
| 16 | |
| 17 | |
| 18 local function action_listener(fn) | |
| 19 return function(_) | |
| 20 fn() | |
| 21 end | |
| 22 end | |
| 23 | |
| 24 local function add_menu_bar(window) | |
| 25 local text_area = window.text_area | |
| 26 local document = text_area.document | |
| 27 local status_bar = window.status_bar | |
| 28 local revert = new_menu_item{ | |
| 29 text = "Revert" | |
| 30 enabled = window.has_file | |
| 31 action_listener = action_listener(window.revert) | |
| 32 } | |
| 33 local undo = new_menu_item{ | |
| 34 text = "Undo" | |
| 35 accelerator = "meta Z" | |
| 36 action_listener = action_listener(document.undo) | |
| 37 } | |
| 38 local redo = new_menu_item{ | |
| 39 text = "Redo" | |
| 40 accelerator = "meta shift Z" | |
| 41 action_listener = action_listener(document.redo) | |
| 42 } | |
| 43 local function update_undo_redo() | |
| 44 undo.set_enabled(document.can_undo()) | |
| 45 redo.set_enabled(document.can_redo()) | |
| 46 end | |
| 47 window.update_undo_redo = update_undo_redo -- dont gc | |
| 48 update_undo_redo() | |
| 49 document.add_undo_listener(update_undo_redo) | |
| 50 | |
| 51 local find_menu_item = new_check_box_menu_item{ | |
| 52 text = "Find and Replace" | |
| 53 accelerator = "meta F" | |
| 54 action_listener = function(event) | |
| 55 window.show_find_panel(event.source.state) | |
| 56 end | |
| 57 } | |
| 58 window.find_menu_item = find_menu_item | |
| 59 | |
| 60 local menu_bar = new_menu_bar{ | |
| 61 menus = { | |
| 62 new_menu{ | |
| 63 text = "File" | |
| 64 menu_items = { | |
| 65 new_menu_item{ | |
| 66 text = "New File" | |
| 67 accelerator = "meta N" | |
| 68 action_listener = action_listener(window.new) | |
| 69 } | |
| 70 new_menu_item{ | |
| 71 text = "Open..." | |
| 72 accelerator = "meta O" | |
| 73 action_listener = action_listener(window.open) | |
| 74 } | |
| 75 new_menu_item{ | |
| 76 text = "Save" | |
| 77 accelerator = "meta S" | |
| 78 action_listener = function(_) | |
| 79 if window.save() then | |
| 80 revert.set_enabled(true) | |
| 81 end | |
| 82 end | |
| 83 } | |
| 84 new_menu_item{ | |
| 85 text = "Print" | |
| 86 action_listener = action_listener(text_area.print) | |
| 87 } | |
| 88 revert | |
| 89 --[[ | |
| 90 new_menu_item{ | |
| 91 text = "Test" | |
| 92 action_listener = function(_) | |
| 93 local location = window.frame.location | |
| 94 location.y = location.y - 20 | |
| 95 window.frame.location = location | |
| 96 end | |
| 97 } | |
| 98 ]] | |
| 99 } | |
| 100 } | |
| 101 new_menu{ | |
| 102 text = "Edit" | |
| 103 menu_items = { | |
| 104 undo | |
| 105 redo | |
| 106 separator | |
| 107 new_menu_item{ | |
| 108 text = "Cut" | |
| 109 accelerator = "meta X" | |
| 110 action_listener = action_listener(text_area.cut) | |
| 111 } | |
| 112 new_menu_item{ | |
| 113 text = "Copy" | |
| 114 accelerator = "meta C" | |
| 115 action_listener = action_listener(text_area.copy) | |
| 116 } | |
| 117 new_menu_item{ | |
| 118 text = "Paste" | |
| 119 accelerator = "meta V" | |
| 120 action_listener = action_listener(text_area.paste) | |
| 121 } | |
| 122 separator | |
| 123 new_menu_item{ | |
| 124 text = "Indent" | |
| 125 accelerator = "meta CLOSE_BRACKET" | |
| 126 action_listener = action_listener(window.indent) | |
| 127 } | |
| 128 new_menu_item{ | |
| 129 text = "Unindent" | |
| 130 accelerator = "meta OPEN_BRACKET" | |
| 131 action_listener = action_listener(window.unindent) | |
| 132 } | |
| 133 separator | |
| 134 new_menu_item{ | |
| 135 text = "Select All" | |
| 136 accelerator = "meta A" | |
| 137 action_listener = action_listener(text_area.select_all) | |
| 138 } | |
| 139 } | |
| 140 } | |
| 141 new_menu{ | |
| 142 text = "Find" | |
| 143 menu_items = { | |
| 144 find_menu_item | |
| 145 new_menu_item{ | |
| 146 text = "Find Case Insensitive" | |
| 147 action_listener = window.find_case_insensitive | |
| 148 } | |
| 149 new_menu_item{ | |
| 150 text = "Convert Leading Tabs to Spaces" | |
| 151 action_listener = window.tabs_to_spaces | |
| 152 } | |
| 153 new_menu_item{ | |
| 154 text = "Convert Leading Spaces to Tabs" | |
| 155 action_listener = window.spaces_to_tabs | |
| 156 } | |
| 157 } | |
| 158 } | |
| 159 new_menu{ | |
| 160 text = "View" | |
| 161 menu_items = { | |
| 162 new_check_box_menu_item{ | |
| 163 text = "Word Wrap" | |
| 164 state = text_area.line_wrap | |
| 165 action_listener = function(event) | |
| 166 window.set_line_wrap(event.source.state) | |
| 167 end | |
| 168 } | |
| 169 new_check_box_menu_item{ | |
| 170 text = "Show Whitespace" | |
| 171 accelerator = "meta W" | |
| 172 state = text_area.whitespace_visible | |
| 173 action_listener = function(event) | |
| 174 window.set_whitespace_visible(event.source.state) | |
| 175 end | |
| 176 } | |
| 177 new_check_box_menu_item{ | |
| 178 text = "Spell Check" | |
| 179 accelerator = "meta SEMICOLON" | |
| 180 action_listener = function(event) | |
| 181 spell_check(text_area,event.source.state) | |
| 182 end | |
| 183 } | |
| 184 new_menu_item{ | |
| 185 text = "Cursor Column" | |
| 186 accelerator = "meta B" | |
| 187 action_listener = function(_) | |
| 188 status_bar.text = "Cursor Column: "..window.cursor_column() | |
| 189 end | |
| 190 } | |
| 191 new_menu_item{ | |
| 192 text = "Goto Line" | |
| 193 accelerator = "meta G" | |
| 194 action_listener = function(_) | |
| 195 local input = show_input_dialog( window.frame, "Goto line" ) | |
| 196 if input == nil then | |
| 197 return | |
| 198 end | |
| 199 local line = to_number(input) | |
| 200 try | |
| 201 window.goto(line) | |
| 202 status_bar.text = "Went to line "..line | |
| 203 catch e | |
| 204 status_bar.text = "Invalid line: "..input | |
| 205 end | |
| 206 end | |
| 207 } | |
| 208 new_menu_item{ | |
| 209 text = "Tab Size" | |
| 210 action_listener = function(_) | |
| 211 local input = show_input_dialog( window.frame, "Tab size", text_area.tab_size ) | |
| 212 if input == nil then | |
| 213 return | |
| 214 end | |
| 215 local size = to_number(input) | |
| 216 try | |
| 217 window.set_tab_size(size) | |
| 218 status_bar.text = "Set tab size to "..size | |
| 219 catch e | |
| 220 status_bar.text = "Invalid tab size: "..input | |
| 221 end | |
| 222 end | |
| 223 } | |
| 224 } | |
| 225 } | |
| 226 } | |
| 227 } | |
| 228 window.frame.set_menu_bar(menu_bar) | |
| 229 end | |
| 230 | |
| 231 return add_menu_bar |
