From 1f9e7a15d9414b1a96691111069523a70e107f16 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Tue, 4 Oct 2016 18:52:32 +1100 Subject: Basic find functionality working --- src/adapad.adb | 15 +++++-- src/editor_windows.adb | 47 +++++++++++++++++++--- src/editor_windows.ads | 5 +++ src/fltk_binding/c_fl_input.cpp | 5 +++ src/fltk_binding/c_fl_input.h | 3 ++ src/fltk_binding/c_fl_text_buffer.cpp | 5 +++ src/fltk_binding/c_fl_text_buffer.h | 1 + src/fltk_binding/c_fl_text_display.cpp | 15 +++++++ src/fltk_binding/c_fl_text_display.h | 3 ++ src/fltk_binding/fltk-text_buffers.adb | 34 ++++++++++++++++ src/fltk_binding/fltk-text_buffers.ads | 9 +++++ src/fltk_binding/fltk-widgets-buttons.ads | 2 +- .../fltk-widgets-groups-text_displays.adb | 43 ++++++++++++++++++++ .../fltk-widgets-groups-text_displays.ads | 14 +++++++ src/fltk_binding/fltk-widgets-inputs.adb | 16 ++++++++ src/fltk_binding/fltk-widgets-inputs.ads | 5 +++ 16 files changed, 212 insertions(+), 10 deletions(-) diff --git a/src/adapad.adb b/src/adapad.adb index 7440ce9..bea6b91 100644 --- a/src/adapad.adb +++ b/src/adapad.adb @@ -282,10 +282,19 @@ function Adapad return Integer is (This : in Do_Find_Callback; Item : in String; Match_Case : in Boolean) is + + Current_Position : Natural; + Found_At : Natural; + begin - Ada.Text_IO.Put_Line ("Finding " & Item); - if Match_Case then - Ada.Text_IO.Put_Line ("Matching case"); + Find.Hide; + Current_Position := Editor.Get_Insert_Position; + if Buffer.Search_Forward (Current_Position, Item, Found_At, Match_Case) then + Buffer.Set_Selection (Found_At, Found_At + Item'Length); + Editor.Set_Insert_Position (Found_At + Item'Length); + Editor.Show_Insert_Position; + else + Alert ("No occurrences of '" & Item & "' found!"); end if; end Call; diff --git a/src/editor_windows.adb b/src/editor_windows.adb index dffad97..20ccbbd 100644 --- a/src/editor_windows.adb +++ b/src/editor_windows.adb @@ -138,6 +138,35 @@ package body Editor_Windows is + function Get_Insert_Position + (This : in Editor_Window) + return Natural is + begin + return This.Editor.Get_Insert_Position; + end Get_Insert_Position; + + + + + procedure Set_Insert_Position + (This : in out Editor_Window; + Pos : in Natural) is + begin + This.Editor.Set_Insert_Position (Pos); + end Set_Insert_Position; + + + + + procedure Show_Insert_Position + (This : in out Editor_Window) is + begin + This.Editor.Show_Insert_Position; + end Show_Insert_Position; + + + + -- used to hide about/find/replace/etc windows instead -- of constantly creating and destroying them @@ -245,11 +274,13 @@ package body Editor_Windows is Item : in out Widget'Class) is type Find_Window_Access is access all Find_Window; - The_Window : access Find_Window := Find_Window_Access (Item.Parent); + Dialog : access Find_Window := Find_Window_Access (Item.Parent); begin - if The_Window.Callback /= null then - The_Window.Callback.Call ("Hello", True); + if Dialog.Callback /= null then + Dialog.Callback.Call + (Dialog.Find_What.Get_Value, + Dialog.Match_Case.Get_State = On); end if; end Call; @@ -348,11 +379,15 @@ package body Editor_Windows is Item : in out Widget'Class) is type Replace_Window_Access is access all Replace_Window; - The_Window : access Replace_Window := Replace_Window_Access (Item.Parent); + Dialog : access Replace_Window := Replace_Window_Access (Item.Parent); begin - if The_Window.Callback /= null then - The_Window.Callback.Call ("Hello", "There", True, True); + if Dialog.Callback /= null then + Dialog.Callback.Call + (Dialog.Find_What.Get_Value, + Dialog.Replace_With.Get_Value, + Dialog.Match_Case.Get_State = On, + Dialog.Replace_All.Get_State = On); end if; end Call; diff --git a/src/editor_windows.ads b/src/editor_windows.ads index 3acec25..b6c6a00 100644 --- a/src/editor_windows.ads +++ b/src/editor_windows.ads @@ -59,6 +59,11 @@ package Editor_Windows is procedure Delete (This : in out Editor_Window); + function Get_Insert_Position (This : in Editor_Window) return Natural; + procedure Set_Insert_Position (This : in out Editor_Window; Pos : in Natural); + procedure Show_Insert_Position (This : in out Editor_Window); + + type About_Window is new Double_Window with private; diff --git a/src/fltk_binding/c_fl_input.cpp b/src/fltk_binding/c_fl_input.cpp index 4ee251c..4f19bd1 100644 --- a/src/fltk_binding/c_fl_input.cpp +++ b/src/fltk_binding/c_fl_input.cpp @@ -14,3 +14,8 @@ void free_fl_input(INPUT i) { delete reinterpret_cast(i); } + +const char * fl_input_get_value(INPUT i) { + return reinterpret_cast(i)->value(); +} + diff --git a/src/fltk_binding/c_fl_input.h b/src/fltk_binding/c_fl_input.h index b3b1190..cb40d42 100644 --- a/src/fltk_binding/c_fl_input.h +++ b/src/fltk_binding/c_fl_input.h @@ -11,5 +11,8 @@ extern "C" INPUT new_fl_input(int x, int y, int w, int h, char* label); extern "C" void free_fl_input(INPUT i); +extern "C" const char * fl_input_get_value(INPUT i); + + #endif diff --git a/src/fltk_binding/c_fl_text_buffer.cpp b/src/fltk_binding/c_fl_text_buffer.cpp index 089ca33..b0df365 100644 --- a/src/fltk_binding/c_fl_text_buffer.cpp +++ b/src/fltk_binding/c_fl_text_buffer.cpp @@ -55,6 +55,11 @@ int fl_text_buffer_savefile(TEXTBUFFER tb, char * n) { } +int fl_text_buffer_search_forward(TEXTBUFFER tb, int start, const char * item, int * found, int mcase) { + return reinterpret_cast(tb)->search_forward(start, item, found, mcase); +} + + void fl_text_buffer_select(TEXTBUFFER tb, int s, int e) { reinterpret_cast(tb)->select(s, e); } diff --git a/src/fltk_binding/c_fl_text_buffer.h b/src/fltk_binding/c_fl_text_buffer.h index 906ef8c..cd64112 100644 --- a/src/fltk_binding/c_fl_text_buffer.h +++ b/src/fltk_binding/c_fl_text_buffer.h @@ -19,6 +19,7 @@ extern "C" int fl_text_buffer_length(TEXTBUFFER tb); extern "C" int fl_text_buffer_loadfile(TEXTBUFFER tb, char * n); extern "C" void fl_text_buffer_remove_selection(TEXTBUFFER tb); extern "C" int fl_text_buffer_savefile(TEXTBUFFER tb, char * n); +extern "C" int fl_text_buffer_search_forward(TEXTBUFFER tb, int start, const char * item, int * found, int mcase); extern "C" void fl_text_buffer_select(TEXTBUFFER tb, int s, int e); diff --git a/src/fltk_binding/c_fl_text_display.cpp b/src/fltk_binding/c_fl_text_display.cpp index c45e778..94eb002 100644 --- a/src/fltk_binding/c_fl_text_display.cpp +++ b/src/fltk_binding/c_fl_text_display.cpp @@ -58,3 +58,18 @@ void fl_text_display_set_text_size(TEXTDISPLAY td, int s) { reinterpret_cast(td)->textsize(static_cast(s)); } + +int fl_text_display_get_insert_pos(TEXTDISPLAY td) { + return reinterpret_cast(td)->insert_position(); +} + + +void fl_text_display_set_insert_pos(TEXTDISPLAY td, int p) { + reinterpret_cast(td)->insert_position(p); +} + + +void fl_text_display_show_insert_pos(TEXTDISPLAY td) { + reinterpret_cast(td)->show_insert_position(); +} + diff --git a/src/fltk_binding/c_fl_text_display.h b/src/fltk_binding/c_fl_text_display.h index dba1706..5a91774 100644 --- a/src/fltk_binding/c_fl_text_display.h +++ b/src/fltk_binding/c_fl_text_display.h @@ -20,6 +20,9 @@ extern "C" int fl_text_display_get_text_font(TEXTDISPLAY td); extern "C" void fl_text_display_set_text_font(TEXTDISPLAY td, int f); extern "C" int fl_text_display_get_text_size(TEXTDISPLAY td); extern "C" void fl_text_display_set_text_size(TEXTDISPLAY td, int s); +extern "C" int fl_text_display_get_insert_pos(TEXTDISPLAY td); +extern "C" void fl_text_display_set_insert_pos(TEXTDISPLAY td, int p); +extern "C" void fl_text_display_show_insert_pos(TEXTDISPLAY td); #endif diff --git a/src/fltk_binding/fltk-text_buffers.adb b/src/fltk_binding/fltk-text_buffers.adb index 6a25399..6df96cb 100644 --- a/src/fltk_binding/fltk-text_buffers.adb +++ b/src/fltk_binding/fltk-text_buffers.adb @@ -67,6 +67,15 @@ package body FLTK.Text_Buffers is return Interfaces.C.int; pragma Import (C, fl_text_buffer_savefile, "fl_text_buffer_savefile"); + function fl_text_buffer_search_forward + (TB : in System.Address; + SP : in Interfaces.C.int; + IT : in Interfaces.C.char_array; + FP : out Interfaces.C.int; + CA : in Interfaces.C.int) + return Interfaces.C.int; + pragma Import (C, fl_text_buffer_search_forward, "fl_text_buffer_search_forward"); + procedure fl_text_buffer_select (TB : in System.Address; S, E : in Interfaces.C.int); @@ -281,6 +290,31 @@ package body FLTK.Text_Buffers is + function Search_Forward + (This : in Text_Buffer; + Start_At : in Natural; + Item : in String; + Found_At : out Natural; + Match_Case : in Boolean) + return Boolean is + + Found_Raw : Interfaces.C.int; + Result : Interfaces.C.int; + + begin + Result := fl_text_buffer_search_forward + (This.Void_Ptr, + Interfaces.C.int (Start_At), + Interfaces.C.To_C (Item), + Found_Raw, + Boolean'Pos (Match_Case)); + Found_At := Natural (Found_Raw); + return Boolean'Val (Result); + end Search_Forward; + + + + procedure Set_Selection (This : in out Text_Buffer; Start, Finish : in Natural) is diff --git a/src/fltk_binding/fltk-text_buffers.ads b/src/fltk_binding/fltk-text_buffers.ads index eea9b73..0bb881e 100644 --- a/src/fltk_binding/fltk-text_buffers.ads +++ b/src/fltk_binding/fltk-text_buffers.ads @@ -75,6 +75,15 @@ package FLTK.Text_Buffers is Name : in String); + function Search_Forward + (This : in Text_Buffer; + Start_At : in Natural; + Item : in String; + Found_At : out Natural; + Match_Case : in Boolean) + return Boolean; + + procedure Set_Selection (This : in out Text_Buffer; Start, Finish : in Natural); diff --git a/src/fltk_binding/fltk-widgets-buttons.ads b/src/fltk_binding/fltk-widgets-buttons.ads index a31ed79..403ad1a 100644 --- a/src/fltk_binding/fltk-widgets-buttons.ads +++ b/src/fltk_binding/fltk-widgets-buttons.ads @@ -6,7 +6,7 @@ package FLTK.Widgets.Buttons is type Button is new Widget with private; - type State is (On, Off); + type State is (Off, On); function Create diff --git a/src/fltk_binding/fltk-widgets-groups-text_displays.adb b/src/fltk_binding/fltk-widgets-groups-text_displays.adb index 0151536..473ceea 100644 --- a/src/fltk_binding/fltk-widgets-groups-text_displays.adb +++ b/src/fltk_binding/fltk-widgets-groups-text_displays.adb @@ -57,6 +57,20 @@ package body FLTK.Widgets.Groups.Text_Displays is S : in Interfaces.C.int); pragma Import (C, fl_text_display_set_text_size, "fl_text_display_set_text_size"); + function fl_text_display_get_insert_pos + (TD : in System.Address) + return Interfaces.C.int; + pragma Import (C, fl_text_display_get_insert_pos, "fl_text_display_get_insert_pos"); + + procedure fl_text_display_set_insert_pos + (TD : in System.Address; + P : in Interfaces.C.int); + pragma Import (C, fl_text_display_set_insert_pos, "fl_text_display_set_insert_pos"); + + procedure fl_text_display_show_insert_pos + (TD : in System.Address); + pragma Import (C, fl_text_display_show_insert_pos, "fl_text_display_show_insert_pos"); + @@ -175,5 +189,34 @@ package body FLTK.Widgets.Groups.Text_Displays is end Set_Text_Size; + + + function Get_Insert_Position + (This : in Text_Display) + return Natural is + begin + return Natural (fl_text_display_get_insert_pos (This.Void_Ptr)); + end Get_Insert_Position; + + + + + procedure Set_Insert_Position + (This : in out Text_Display; + Pos : in Natural) is + begin + fl_text_display_set_insert_pos (This.Void_Ptr, Interfaces.C.int (Pos)); + end Set_Insert_Position; + + + + + procedure Show_Insert_Position + (This : in out Text_Display) is + begin + fl_text_display_show_insert_pos (This.Void_Ptr); + end Show_Insert_Position; + + end FLTK.Widgets.Groups.Text_Displays; diff --git a/src/fltk_binding/fltk-widgets-groups-text_displays.ads b/src/fltk_binding/fltk-widgets-groups-text_displays.ads index bb99e78..84c6551 100644 --- a/src/fltk_binding/fltk-widgets-groups-text_displays.ads +++ b/src/fltk_binding/fltk-widgets-groups-text_displays.ads @@ -56,6 +56,20 @@ package FLTK.Widgets.Groups.Text_Displays is Size : in Font_Size); + function Get_Insert_Position + (This : in Text_Display) + return Natural; + + + procedure Set_Insert_Position + (This : in out Text_Display; + Pos : in Natural); + + + procedure Show_Insert_Position + (This : in out Text_Display); + + private diff --git a/src/fltk_binding/fltk-widgets-inputs.adb b/src/fltk_binding/fltk-widgets-inputs.adb index 17ab621..9af8e87 100644 --- a/src/fltk_binding/fltk-widgets-inputs.adb +++ b/src/fltk_binding/fltk-widgets-inputs.adb @@ -1,6 +1,7 @@ with Interfaces.C; +with Interfaces.C.Strings; with System; use type System.Address; @@ -18,6 +19,11 @@ package body FLTK.Widgets.Inputs is (F : in System.Address); pragma Import (C, free_fl_input, "free_fl_input"); + function fl_input_get_value + (F : in System.Address) + return Interfaces.C.Strings.chars_ptr; + pragma Import (C, fl_input_get_value, "fl_input_get_value"); + @@ -54,5 +60,15 @@ package body FLTK.Widgets.Inputs is end Create; + + + function Get_Value + (This : in Input) + return String is + begin + return Interfaces.C.Strings.Value (fl_input_get_value (This.Void_Ptr)); + end Get_Value; + + end FLTK.Widgets.Inputs; diff --git a/src/fltk_binding/fltk-widgets-inputs.ads b/src/fltk_binding/fltk-widgets-inputs.ads index c1ebfbb..0f818ac 100644 --- a/src/fltk_binding/fltk-widgets-inputs.ads +++ b/src/fltk_binding/fltk-widgets-inputs.ads @@ -12,6 +12,11 @@ package FLTK.Widgets.Inputs is return Input; + function Get_Value + (This : in Input) + return String; + + private -- cgit