From 87dd7f0d23eba5c09e71ec6efeb34c6844f5e95f Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Tue, 29 Dec 1998 14:21:17 +0000 Subject: Revised documentation files. git-svn-id: file:///fltk/svn/fltk/trunk@177 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- documentation/editor.html | 603 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 603 insertions(+) create mode 100644 documentation/editor.html (limited to 'documentation/editor.html') diff --git a/documentation/editor.html b/documentation/editor.html new file mode 100644 index 000000000..60dca040c --- /dev/null +++ b/documentation/editor.html @@ -0,0 +1,603 @@ + + + +

4 - Designing a Simple Text Editor

+ +This chapter takes you through the design of a simple FLTK-based text editor. + +

Determining the Goals of the Text Editor

+ +Since this will be the first big project you'll be doing with FLTK, lets define +what we want our text editor to do: + +
    +
  1. Menu_Bar/menus for all functions. +
  2. Edit a single text file. +
  3. Load from a file. +
  4. Save to a file. +
  5. Cut/copy/delete/paste functions. +
  6. Search and replace functions. +
  7. Keep track of when the file has been changed. +
+ +

Designing the Main Window

+ +Now that we've outlined the goals for our editor, we can begin with the design +of our GUI. Obviously the first thing that we need is a window: + + + +

Variables

+ +Our text editor will need some global variables to keep track of things: + + + +The window variable is our top-level window described previously. +We'll cover the other variables as we build the application. + +

Menu_Bars and Menus

+ +The first goal requires us to use a menubar and menus that define +each function the editor needs to perform. The +Fl_Menu_Item structure is used to +define the menus and items in a menubar: + + + +Once we have the menus defined we can create the Fl_Menu_Bar widget +and assign the menus to it with: + + + +We'll define the callback functions later. + +

Editing the Text

+ +To keep things simple our text editor will use the +Fl_Multiline_Input widget to +edit the text: + + + +So that we can keep track of changes to the file, we also want to add a +"changed" callback: + + + +Finally, we want to use a mono-spaced font like FL_COURIER: + + + +

The Replace Dialog

+ +We can use the FLTK convenience functions for many of the editor's +dialogs, however the replace dialog needs its own custom window. To +keep things simple we will have a "find" string, a "replace" string, +and "replace all", "replace next", and "cancel" buttons. The strings +are just Fl_Input widgets, the "replace all" and "cancel" +buttons are Fl_Button widgets, and the "replace next " button +is a Fl_Return_Button widget: + +
+ + + +

Callbacks

+ +Now that we've defined the GUI components of our editor, we need to define +our callback functions. + +

changed_cb()

+ +This function will be called whenever the user changes any text in the +input widget: + + + +The set_changed() function is one that we will write to set the +changed status on the current file. We're doing it this way because some +of the other callbacks will set the changed status to 0, and also because +we want to show the changed status in the window's title bar. + +

copy_cb()

+ +This callback function will call +input->copy() to copy the currently selected text to the +clipboard: + + + +

cut_cb()

+ +This callback function will call +input->copy() to copy the currently selected text to the +clipboard and then input->cut() +to delete it: + + + +

delete_cb()

+ +This callback function will call +input->cut() to delete the selected text: + + + +

find_cb()

+ +This callback function asks for a search string using the +fl_input() convenience function and +then calls the find2_cb() function to find the string: + + + +

find2_cb()

+ +This function will find the next occurrence of the search string. If the +search string is blank then we want to pop up the search dialog: + + + +If the search string cannot be found we use the +fl_alert() convenience function to display a message to +that effect. + +

new_cb()

+ +This callback function will clear the input widget and current filename. +It also calls the check_save() function to give the user the +opportunity to save the current file first as needed: + + + +

open_cb()

+ +This callback function will ask the user for a filename and then load +the specified file into the input widget and current filename. It also +calls the check_save() function to give the user the +opportunity to save the current file first as needed: + + + +We call the load_file() function to actually load the file. + +

paste_cb()

+ +This callback function will send a FL_PASTE message to the input +widget using the Fl::paste() method: + + + +

quit_cb()

+ +The quit callback will first see if the current file has been modified, +and if so give the user a chance to save it. It then hides the main window: + + + +

replace_cb()

+ +The replace callback just shows the replace dialog: + + + +

replace2_cb()

+ +This callback will replace the next occurence of the replacement string. If +nothing has been entered for the replacement string, then the replace dialog +is displayed instead: + + + +

replall_cb()

+ +This callback will replace all occurences of the search string in the file: + + + +

replcan_cb()

+ +This callback just hides the replace dialog: + + + +

save_cb()

+ +This callback saves the current file. If the current filename is blank it +calls the "save as" callback: + + + +The save_file() function saves the current file to the specified +filename. + +

saveas_cb()

+ +This callback asks the user for a filename and saves the current file: + + + +The save_file() function saves the current file to the specified +filename. + +

undo_cb()

+ +The undo callback just calls the
+undo() method: + + + +

Other Functions

+ +Now that we've defined the callback functions, we need our support functions +to make it all work: + +

check_save()

+ +This function checks to see if the current file needs to be saved. If +so, it asks the user if they want to save it: + + + +

load_file()

+ +This function loads the specified file into the input widget: + + + +When loading the file we use the +input->replace() method to "replace" the text at the end of +the buffer. The pos variable keeps track of the end of the +buffer. + +

save_file()

+ +This function saves the current buffer to the specified file: + + + +

set_changed()

+ +This function sets the changed variable and updates the window label +accordingly: + + + +

Compiling the Editor

+ +The complete source for our text editor can be found in the +test/editor.cxx source file. Both the Makefile and Visual C++ +workspace include the necessary rules to build the editor. You can +also compile it using a standard compiler with: + + + +As noted in
Chapter 1, you may need to include +compiler and linker options to tell them where to find the FLTK library. +Also, the CC command may also be called gcc or +c++ on your system. + +

Congratulations, you've just built your own text editor! + +

The Final Product

+ +The final editor window should look like the image below: + +
+ + + -- cgit v1.2.3