Mercurial Hosting > luan
view src/luan/modules/editor/menu.luan @ 1902:9f07d69551d6
split up editor code
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 15 Apr 2025 13:31:51 -0600 |
parents | |
children | ad1dc9f103b7 |
line wrap: on
line source
local Luan = require "luan:Luan.luan" local error = Luan.error local String = require "luan:String.luan" local to_number = String.to_number or error() local new_menu_item = require("luan:swing/Menu_item.luan").new or error() local new_check_box_menu_item = require("luan:swing/Check_box_menu_item.luan").new or error() local new_menu_bar = require("luan:swing/Menu_bar.luan").new or error() local Menu = require "luan:swing/Menu.luan" local new_menu = Menu.new or error() local separator = Menu.separator or error() local Option_pane = require "luan:swing/Option_pane.luan" local show_message_dialog = Option_pane.show_message_dialog or error() local show_input_dialog = Option_pane.show_input_dialog or error() local function action_listener(fn) return function(_) fn() end end local function add_menu_bar(window) local document = window.text_area.document local revert = new_menu_item{ text = "Revert" enabled = window.has_file action_listener = action_listener(window.revert) } local undo = new_menu_item{ text = "Undo" accelerator = "meta Z" action_listener = action_listener(document.undo) } local redo = new_menu_item{ text = "Redo" accelerator = "meta shift Z" action_listener = action_listener(document.redo) } local function update_undo_redo() undo.set_enabled(document.can_undo()) redo.set_enabled(document.can_redo()) end window.update_undo_redo = update_undo_redo -- dont gc update_undo_redo() document.add_undo_listener(update_undo_redo) local find_menu_item = new_check_box_menu_item{ text = "Find and Replace" accelerator = "meta F" action_listener = function(event) window.show_find_panel(event.source.state) end } window.find_menu_item = find_menu_item local menu_bar = new_menu_bar{ menus = { new_menu{ text = "File" menu_items = { new_menu_item{ text = "New File" accelerator = "meta N" action_listener = action_listener(window.new) } new_menu_item{ text = "Open..." accelerator = "meta O" action_listener = action_listener(window.open) } new_menu_item{ text = "Save" accelerator = "meta S" action_listener = function(_) if window.save() then revert.set_enabled(true) end end } revert } } new_menu{ text = "Edit" menu_items = { undo redo separator new_menu_item{ text = "Cut" accelerator = "meta X" action_listener = action_listener(window.text_area.cut) } new_menu_item{ text = "Copy" accelerator = "meta C" action_listener = action_listener(window.text_area.copy) } new_menu_item{ text = "Paste" accelerator = "meta V" action_listener = action_listener(window.text_area.paste) } separator new_menu_item{ text = "Indent" accelerator = "meta CLOSE_BRACKET" action_listener = action_listener(window.indent) } new_menu_item{ text = "Unindent" accelerator = "meta OPEN_BRACKET" action_listener = action_listener(window.unindent) } separator new_menu_item{ text = "Select All" accelerator = "meta A" action_listener = action_listener(window.text_area.select_all) } } } new_menu{ text = "Find" menu_items = { find_menu_item new_menu_item{ text = "Find Case Insensitive" action_listener = window.find_case_insensitive } new_menu_item{ text = "Convert Leading Tabs to Spaces" action_listener = window.tabs_to_spaces } new_menu_item{ text = "Convert Leading Spaces to Tabs" action_listener = window.spaces_to_tabs } } } new_menu{ text = "View" menu_items = { new_check_box_menu_item{ text = "Word Wrap" state = window.text_area.line_wrap action_listener = function(event) window.text_area.line_wrap = event.source.state end } new_check_box_menu_item{ text = "Show Whitespace" action_listener = function(event) window.text_area.show_whitespace(event.source.state) end } new_menu_item{ text = "Show Cursor Column" action_listener = function(_) show_message_dialog( window.frame, "Cursor Column: "..window.cursor_column() ) end } new_menu_item{ text = "Goto Line" accelerator = "meta G" action_listener = function(_) local input = show_input_dialog( window.frame, "Goto line" ) local line = input and to_number(input) if line ~= nil then window.goto(line) end end } } } } } window.frame.set_menu_bar(menu_bar) end return add_menu_bar