-- Copyright 2011-17 Paul Kulchenko, ZeroBrane LLC -- authors: Lomtik Software (J. Winwood & John Labenski) -- Luxinia Dev (Eike Decker & Christoph Kubisch) --------------------------------------------------------- local ide = ide local frame = ide.frame local menuBar = frame.menuBar local findReplace = ide.findReplace local findMenu = ide:MakeMenu { { ID_FIND, TR("&Find")..KSC(ID_FIND), TR("Find text") }, { ID_FINDNEXT, TR("Find &Next")..KSC(ID_FINDNEXT), TR("Find the next text occurrence") }, { ID_FINDPREV, TR("Find &Previous")..KSC(ID_FINDPREV), TR("Find the earlier text occurence") }, { ID_FINDSELECTNEXT, TR("Select And Find Next")..KSC(ID_FINDSELECTNEXT), TR("Select the word under cursor and find its next occurrence") }, { ID_FINDSELECTPREV, TR("Select And Find Previous")..KSC(ID_FINDSELECTPREV), TR("Select the word under cursor and find its previous occurrence") }, { ID_REPLACE, TR("&Replace")..KSC(ID_REPLACE), TR("Find and replace text") }, { }, { ID_FINDINFILES, TR("Find &In Files")..KSC(ID_FINDINFILES), TR("Find text in files") }, { ID_REPLACEINFILES, TR("Re&place In Files")..KSC(ID_REPLACEINFILES), TR("Find and replace text in files") }, { }, { ID_NAVIGATE, TR("Navigate"), "", { { ID_NAVIGATETOFILE, TR("Go To File...")..KSC(ID_NAVIGATETOFILE), TR("Go to file") }, { ID_NAVIGATETOLINE, TR("Go To Line...")..KSC(ID_NAVIGATETOLINE), TR("Go to line") }, { ID_NAVIGATETOSYMBOL, TR("Go To Symbol...")..KSC(ID_NAVIGATETOSYMBOL), TR("Go to symbol") }, { ID_NAVIGATETOMETHOD, TR("Insert Library Function...")..KSC(ID_NAVIGATETOMETHOD), TR("Find and insert library function") }, } }, } menuBar:Append(findMenu, TR("&Search")) -- allow search functions for either Editor with focus (which includes editor-like panels) -- or editor tabs (even when the current editor is not in focus) local function onUpdateUISearchMenu(event) event:Enable((ide:GetEditorWithFocus() or ide:GetEditor()) ~= nil) end frame:Connect(ID_FIND, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) findReplace:Show(false) end) frame:Connect(ID_FIND, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu) frame:Connect(ID_REPLACE, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) findReplace:Show(true) end) frame:Connect(ID_REPLACE, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu) frame:Connect(ID_FINDINFILES, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) findReplace:Show(false,true) end) frame:Connect(ID_REPLACEINFILES, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) findReplace:Show(true,true) end) frame:Connect(ID_FINDNEXT, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) local editor = ide:GetEditor() if editor and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then local selection = editor:GetMainSelection() + 1 if selection >= editor:GetSelections() then selection = 0 end editor:SetMainSelection(selection) editor:ShowPosEnforcePolicy(editor:GetCurrentPos()) else if findReplace:SetFind(findReplace:GetFind() or findReplace:GetSelection()) then findReplace:Find() else findReplace:Show(false) end end end) frame:Connect(ID_FINDNEXT, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu) frame:Connect(ID_FINDPREV, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) local editor = ide:GetEditor() if editor and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then local selection = editor:GetMainSelection() - 1 if selection < 0 then selection = editor:GetSelections() - 1 end editor:SetMainSelection(selection) editor:ShowPosEnforcePolicy(editor:GetCurrentPos()) else if findReplace:SetFind(findReplace:GetFind() or findReplace:GetSelection()) then findReplace:Find(true) -- search up else findReplace:Show(false) end end end) frame:Connect(ID_FINDPREV, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu) -- Select and Find behaves like Find if there is a current selection; -- if not, it selects a word under cursor (if any) and does find. frame:Connect(ID_FINDSELECTNEXT, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) if findReplace:SetFind(findReplace:GetSelection() or findReplace:GetWordAtCaret()) then findReplace:Find() end end) frame:Connect(ID_FINDSELECTNEXT, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu) frame:Connect(ID_FINDSELECTPREV, wx.wxEVT_COMMAND_MENU_SELECTED, function (event) if findReplace:SetFind(findReplace:GetSelection() or findReplace:GetWordAtCaret()) then findReplace:Find(true) end end) frame:Connect(ID_FINDSELECTPREV, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu) local special = {SYMBOL = '@', LINE = ':', METHOD = ';'} frame:Connect(ID_NAVIGATETOFILE, wx.wxEVT_COMMAND_MENU_SELECTED, function() ide:ShowCommandBar("") end) frame:Connect(ID_NAVIGATETOLINE, wx.wxEVT_COMMAND_MENU_SELECTED, function() ide:ShowCommandBar(special.LINE) end) frame:Connect(ID_NAVIGATETOMETHOD, wx.wxEVT_COMMAND_MENU_SELECTED, function() ide:ShowCommandBar(special.METHOD) end) frame:Connect(ID_NAVIGATETOSYMBOL, wx.wxEVT_COMMAND_MENU_SELECTED, function() local ed = ide:GetEditor() ide:ShowCommandBar(special.SYMBOL, ed and ed:ValueFromPosition(ed:GetCurrentPos())) end)