Author: junrue Date: Sat Jul 8 15:43:21 2006 New Revision: 185
Modified: trunk/graphic-forms-tests.asd trunk/src/demos/textedit/textedit-document.lisp trunk/src/demos/textedit/textedit-window.lisp Log: implemented basic text file I/O
Modified: trunk/graphic-forms-tests.asd ============================================================================== --- trunk/graphic-forms-tests.asd (original) +++ trunk/graphic-forms-tests.asd Sat Jul 8 15:43:21 2006 @@ -60,6 +60,7 @@ ((:module "demos" :components ((:module "textedit" + :serial t :components ((:file "textedit-document") (:file "textedit-window")))
Modified: trunk/src/demos/textedit/textedit-document.lisp ============================================================================== --- trunk/src/demos/textedit/textedit-document.lisp (original) +++ trunk/src/demos/textedit/textedit-document.lisp Sat Jul 8 15:43:21 2006 @@ -41,4 +41,24 @@ (content-modified :cell :ephemeral :accessor content-modified + :initform (cells:c-in nil)) + (file-path + :accessor file-path :initform (cells:c-in nil)))) + +(defvar *textedit-model* (make-instance 'textedit-document)) + +(defun load-textedit-doc (path) + (let ((buffer "")) + (with-open-file (input path) + (do ((line (read-line input nil) + (read-line input nil))) + ((null line)) + (if (zerop (length line)) + (setf buffer (concatenate 'string buffer (format nil "~c~c" #\Return #\Newline))) + (setf buffer (concatenate 'string buffer (format nil "~a~c~c" line #\Return #\Newline)))))) + (setf (content-replaced *textedit-model*) buffer))) + +(defun save-textedit-doc (path buffer) + (with-open-file (output path :direction :output :if-exists :supersede) + (format output buffer)))
Modified: trunk/src/demos/textedit/textedit-window.lisp ============================================================================== --- trunk/src/demos/textedit/textedit-window.lisp (original) +++ trunk/src/demos/textedit/textedit-window.lisp Sat Jul 8 15:43:21 2006 @@ -33,41 +33,53 @@
(in-package :graphic-forms.uitoolkit.tests)
-(defvar *textedit-control* nil) -(defvar *textedit-win* nil) -(defvar *textedit-startup-dir* nil) +(defvar *textedit-control* nil) +(defvar *textedit-win* nil) +(defvar *textedit-startup-dir* nil) + +(defvar *textedit-file-filters* '(("Text Files (*.txt)" . "*.txt") + ("All Files (*.*)" . "*.*")))
(defun manage-textedit-file-menu (disp menu time) (declare (ignore disp time)) (gfw:enable (elt (gfw:items menu) 2) (gfw:text-modified-p *textedit-control*)))
-(defun new-textedit-doc (disp item time rect) +(defun textedit-file-new (disp item time rect) (declare (ignore disp item time rect)) (when *textedit-control* (setf (gfw:text *textedit-control*) "") - (setf (gfw:text-modified-p *textedit-control*) nil))) + (setf (gfw:text-modified-p *textedit-control*) nil) + (setf (file-path *textedit-model*) nil)))
-(defun open-textedit-doc (disp item time rect) +(defun textedit-file-open (disp item time rect) (declare (ignore disp item time rect)) (gfw:with-file-dialog (*textedit-win* '(:open :add-to-recent :path-must-exist) paths - :filters '(("Text Files (*.txt)" . "*.txt") - ("All Files (*.*)" . "*.*"))))) - -(defun save-textedit-doc (disp item time rect) - (declare (ignore disp item time rect))) + :filters *textedit-file-filters*) + (when paths + (load-textedit-doc (first paths)) + (setf (file-path *textedit-model*) (namestring (first paths)))))) + +(defun textedit-file-save (disp item time rect) + (if (file-path *textedit-model*) + (save-textedit-doc (file-path *textedit-model*) (gfw:text *textedit-control*)) + (textedit-file-save-as disp item time rect)) + (setf (gfw:text-modified-p *textedit-control*) nil))
-(defun save-as-textedit-doc (disp item time rect) +(defun textedit-file-save-as (disp item time rect) (declare (ignore disp item time rect)) (gfw:with-file-dialog (*textedit-win* '(:save :add-to-recent) paths - :filters '(("Text Files (*.txt)" . "*.txt") - ("All Files (*.*)" . "*.*")) - :text "Save As"))) + :filters *textedit-file-filters* + :text "Save As") + (when paths + (save-textedit-doc (first paths) (gfw:text *textedit-control*)) + (setf (file-path *textedit-model*) (namestring (first paths))) + (setf (gfw:text-modified-p *textedit-control*) nil))))
-(defun quit-textedit (disp item time rect) +(defun textedit-file-quit (disp item time rect) (declare (ignore disp item time rect)) (setf *textedit-control* nil) (gfs:dispose *textedit-win*) @@ -85,7 +97,7 @@
(defmethod gfw:event-close ((disp textedit-win-events) window time) (declare (ignore window time)) - (quit-textedit disp nil nil nil)) + (textedit-file-quit disp nil nil nil))
(defmethod gfw:event-focus-gain ((self textedit-win-events) window time) (declare (ignore window time)) @@ -162,18 +174,23 @@
(cells:defobserver content-modified ((self textedit-document)))
+(cells:defobserver file-path ((self textedit-document)) + (if *textedit-win* + (setf (gfw:text *textedit-win*) (format nil "~s - GraphicForms TextEdit" (file-path self))) + (setf (gfw:text *textedit-win*) "new file - GraphicForms TextEdit"))) + (defun textedit-startup () #+clisp (setf *textedit-startup-dir* (ext:cd)) #+lispworks (setf *textedit-startup-dir* (hcl:get-working-directory)) (let ((menubar (gfw:defmenu ((:item "&File" :callback #'manage-textedit-file-menu - :submenu ((:item "&New" :callback #'new-textedit-doc) - (:item "&Open..." :callback #'open-textedit-doc) - (:item "&Save" :callback #'save-textedit-doc :disabled) - (:item "Save &As..." :callback #'save-as-textedit-doc) + :submenu ((:item "&New" :callback #'textedit-file-new) + (:item "&Open..." :callback #'textedit-file-open) + (:item "&Save" :callback #'textedit-file-save :disabled) + (:item "Save &As..." :callback #'textedit-file-save-as) (:item "" :separator) - (:item "E&xit" :callback #'quit-textedit))) + (:item "E&xit" :callback #'textedit-file-quit))) (:item "&Edit" :submenu ((:item "&Undo") (:item "" :separator) @@ -202,6 +219,7 @@ :want-return))) (setf (gfw:menu-bar *textedit-win*) menubar) (setf (gfw:size *textedit-win*) (gfs:make-size :width 500 :height 500)) + (setf (gfw:text *textedit-win*) "new file - GraphicForms TextEdit") (gfw:show *textedit-win* t)))
(defun textedit ()