TextViewPanel is an application window class to display text files (Fig. 19). The program text is shown to demonstrate how one of the simplest application windows is described. In the :create method, the quit button and find button, and a text-item to feed the string to be searched for in the file are created. The view-window is a ScrollTextWindow that displays the file with the vertical and horizontal scroll-bars. The TextViewPanel captures :ConfigureNotify event to resize the view-window when the outermost title window is resized by the window manager.
(defclass TextViewPanel :super panel :slots (quit-button find-button find-text view-window)) (defmethod TextViewPanel (:create (file &rest args &key (width 400) &allow-other-keys) (send-super* :create :width width args) (setq quit-button (send self :create-item panel-button "quit" self :quit)) (setq find-button (send self :create-item panel-button "find" self :find)) (setq find-text (send self :create-item text-item "find: " self :find)) (setq view-window (send self :locate-item (instance ScrollTextWindow :create :width (setq width (- (send self :width) 10)) :height (- (setq height (send self :height)) 38) :scroll-bar t :horizontal-scroll-bar t :map nil :parent self))) (send view-window :read-file file)) (:quit (event) (send self :destroy)) (:find (event) (let ((findstr (send find-text :value)) (found) (nlines (send view-window :nlines))) (do ((i 0 (1+ i))) ((or (>= i nlines) found)) (if (substringp findstr (send view-window :line i)) (setq found i))) (when found (send view-window :display-selection found) (send view-window :locate found)))) (:resize (w h) (setq width w height h) (send view-window :resize (- w 10) (- h 38))) (:configureNotify (event) (let ((newwidth (send self :width)) (newheight (send self :height))) (when (or (/= newwidth width) (/= newheight height)) (send self :resize newwidth newheight))) ) )