]> code.delx.au - gnu-emacs/blobdiff - lisp/ses.el
Add 2009 to copyright years.
[gnu-emacs] / lisp / ses.el
index ced4994c9f93260017575462bd98227333eed2c1..95685e7d7e30f424e2085ac1b069d9dc61547098 100644 (file)
@@ -1,6 +1,7 @@
 ;;; ses.el -- Simple Emacs Spreadsheet  -*- coding: utf-8 -*-
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+;;   Free Software Foundation, Inc.
 
 ;; Author: Jonathan Yavner <jyavner@member.fsf.org>
 ;; Maintainer: Jonathan Yavner <jyavner@member.fsf.org>
@@ -8,10 +9,10 @@
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,9 +20,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
@@ -728,11 +727,18 @@ if the cell's value is unchanged and FORCE is nil."
 ;;ses-goto-print is called during a recursive ses-print-cell).
 (defun ses-goto-print (row col)
   "Move point to print area for cell (ROW,COL)."
-  (let ((inhibit-point-motion-hooks t))
+  (let ((inhibit-point-motion-hooks t)
+       (n 0))
     (goto-char (point-min))
     (forward-line row)
+    ;; calculate column position
     (dotimes (c col)
-      (forward-char (1+ (ses-col-width c))))))
+      (setq n (+ n (ses-col-width c) 1)))
+    ;; move to the position
+    (and (> n (move-to-column n))
+        (eolp)
+        ;; move point to the bol of next line (for TAB at the last cell)
+        (forward-char))))
 
 (defun ses-set-curcell ()
   "Sets `ses--curcell' to the current cell symbol, or a cons (BEG,END) for a
@@ -808,7 +814,7 @@ preceding cell has spilled over."
            (setq sig ses-call-printer-return))))
       ;;Adjust print width to match column width
       (let ((width (ses-col-width col))
-           (len   (length text)))
+           (len   (string-width text)))
        (cond
         ((< len width)
          ;;Fill field to length with spaces
@@ -836,7 +842,7 @@ preceding cell has spilled over."
              (setq sig `(error "Too wide" ,text))
              (cond
               ((stringp value)
-               (setq text (substring text 0 maxwidth)))
+               (setq text (truncate-string-to-width text maxwidth 0 ?\s)))
               ((and (numberp value)
                     (string-match "\\.[0-9]+" text)
                     (>= 0 (setq width
@@ -857,7 +863,11 @@ preceding cell has spilled over."
       ;;Install the printed result.  This is not interruptible.
       (let ((inhibit-read-only t)
            (inhibit-quit      t))
-       (delete-char (1+ (length text)))
+       (let ((inhibit-point-motion-hooks t))
+         (delete-region (point) (progn
+                                  (move-to-column (+ (current-column)
+                                                     (string-width text)))
+                                  (1+ (point)))))
        ;;We use concat instead of inserting separate strings in order to
        ;;reduce the number of cells in the undo list.
        (setq x (concat text (if (< maxcol ses--numcols) " " "\n")))
@@ -1445,6 +1455,7 @@ Narrows the buffer to show only the print area.  Gives it `read-only' and
   (interactive)
   (let ((end (point-min))
        (inhibit-read-only t)
+       (inhibit-point-motion-hooks t)
        (was-modified (buffer-modified-p))
        pos sym)
     (ses-goto-data 0 0) ;;Include marker between print-area and data-area
@@ -1468,7 +1479,14 @@ Narrows the buffer to show only the print area.  Gives it `read-only' and
                    (eq (ses-cell-value row (1+ col)) '*skip*))
          (setq end (+ end (ses-col-width col) 1)
                col (1+ col)))
-       (setq end (+ end (ses-col-width col) 1))
+       (setq end (save-excursion
+                   (goto-char pos)
+                   (move-to-column (+ (current-column) (- end pos)
+                                      (ses-col-width col)))
+                   (if (eolp)
+                       (+ end (ses-col-width col) 1)
+                     (forward-char)
+                     (point))))
        (put-text-property pos end 'intangible sym)))
     ;;Adding these properties did not actually alter the text
     (unless was-modified
@@ -1521,7 +1539,10 @@ These are active only in the minibuffer, when entering or editing a formula:
          ;;SES deliberately puts lots of trailing whitespace in its buffer
          show-trailing-whitespace nil
          ;;Cell ranges do not work reasonably without this
-         transient-mark-mode    t)
+         transient-mark-mode    t
+         ;;not to use tab characters for safe
+         ;;(tabs may do bad for column calculation)
+         indent-tabs-mode       nil)
     (1value (add-hook 'change-major-mode-hook 'ses-cleanup nil t))
     (1value (add-hook 'before-revert-hook 'ses-cleanup nil t))
     (setq ses--curcell         nil
@@ -2940,7 +2961,8 @@ columns to include in width (default = 0)."
     (setq value (ses-call-printer printer value))
     (dotimes (x span)
       (setq width (+ width 1 (ses-col-width (+ col span (- x))))))
-    (setq width (- width (length value)))
+    ;; set column width
+    (setq width (- width (string-width value)))
     (if (<= width 0)
        value ;Too large for field, anyway
       (setq half (make-string (/ width 2) fill))