annotate lisp/ses.el @ 71405:330971fc5282

*** empty log message ***
author Glenn Morris <rgm@gnu.org>
date Tue, 20 Jun 2006 19:30:22 +0000
parents e5adfcfcffa0
children 78e299b7e214 a8190f7e546e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1 ;;; ses.el -- Simple Emacs Spreadsheet -*- coding: utf-8 -*-
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2
68359
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
3 ;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
4
52042
c195b419ef52 Updated contact address.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 49573
diff changeset
5 ;; Author: Jonathan Yavner <jyavner@member.fsf.org>
c195b419ef52 Updated contact address.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 49573
diff changeset
6 ;; Maintainer: Jonathan Yavner <jyavner@member.fsf.org>
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
7 ;; Keywords: spreadsheet
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
8
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
10
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
14 ;; any later version.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
15
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
20
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64020
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64020
diff changeset
24 ;; Boston, MA 02110-1301, USA.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
25
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
26 ;;; Commentary:
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
27
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
28 ;;; To-do list:
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
29
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
30 ;; * Use $ or … for truncated fields
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
31 ;; * Add command to make a range of columns be temporarily invisible.
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
32 ;; * Allow paste of one cell to a range of cells -- copy formula to each.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
33 ;; * Do something about control characters & octal codes in cell print
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
34 ;; areas. Use string-width?
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
35 ;; * Input validation functions. How specified?
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
36 ;; * Faces (colors & styles) in print cells.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
37 ;; * Move a column by dragging its letter in the header line.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
38 ;; * Left-margin column for row number.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
39 ;; * Move a row by dragging its number in the left-margin.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
40
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
41
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
42 ;;; Code:
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
43
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
44 (require 'unsafep)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
45
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
46
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
47 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
48 ;; User-customizable variables
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
49 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
50
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
51 (defgroup ses nil
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
52 "Simple Emacs Spreadsheet."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
53 :group 'applications
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
54 :prefix "ses-"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
55 :version "21.1")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
56
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
57 (defcustom ses-initial-size '(1 . 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
58 "Initial size of a new spreadsheet, as a cons (NUMROWS . NUMCOLS)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
59 :group 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
60 :type '(cons (integer :tag "numrows") (integer :tag "numcols")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
61
53758
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
62 (defcustom ses-initial-column-width 7
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
63 "Initial width of columns in a new spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
64 :group 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
65 :type '(integer :match (lambda (widget value) (> value 0))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
66
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
67 (defcustom ses-initial-default-printer "%.7g"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
68 "Initial default printer for a new spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
69 :group 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
70 :type '(choice string
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
71 (list :tag "Parenthesized string" string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
72 function))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
73
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
74 (defcustom ses-after-entry-functions '(forward-char)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
75 "Things to do after entering a value into a cell.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
76 An abnormal hook that usually runs a cursor-movement function.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
77 Each function is called with ARG=1."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
78 :group 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
79 :type 'hook
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
80 :options '(forward-char backward-char next-line previous-line))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
81
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
82 (defcustom ses-mode-hook nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
83 "Hook functions to be run upon entering SES mode."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
84 :group 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
85 :type 'hook)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
86
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
87
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
88 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
89 ;; Global variables and constants
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
90 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
91
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
92 (defvar ses-read-cell-history nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
93 "List of formulas that have been typed in.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
94
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
95 (defvar ses-read-printer-history nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
96 "List of printer functions that have been typed in.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
97
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
98 (easy-menu-define ses-header-line-menu nil
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
99 "Context menu when mouse-3 is used on the header-line in an SES buffer."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
100 '("SES header row"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
101 ["Set current row" ses-set-header-row t]
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
102 ["Unset row" ses-unset-header-row (> ses--header-row 0)]))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
103
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
104 (defconst ses-mode-map
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
105 (let ((keys `("\C-c\M-\C-l" ses-reconstruct-all
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
106 "\C-c\C-l" ses-recalculate-all
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
107 "\C-c\C-n" ses-renarrow-buffer
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
108 "\C-c\C-c" ses-recalculate-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
109 "\C-c\M-\C-s" ses-sort-column
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
110 "\C-c\M-\C-h" ses-set-header-row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
111 "\C-c\C-t" ses-truncate-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
112 "\C-c\C-j" ses-jump
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
113 "\C-c\C-p" ses-read-default-printer
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
114 "\M-\C-l" ses-reprint-all
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
115 [?\S-\C-l] ses-reprint-all
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
116 [header-line down-mouse-3] ,ses-header-line-menu
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
117 [header-line mouse-2] ses-sort-column-click))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
118 (newmap (make-sparse-keymap)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
119 (while keys
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
120 (define-key (1value newmap) (car keys) (cadr keys))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
121 (setq keys (cddr keys)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
122 newmap)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
123 "Local keymap for Simple Emacs Spreadsheet.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
124
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
125 (easy-menu-define ses-menu ses-mode-map
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
126 "Menu bar menu for SES."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
127 '("SES"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
128 ["Insert row" ses-insert-row (ses-in-print-area)]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
129 ["Delete row" ses-delete-row (ses-in-print-area)]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
130 ["Insert column" ses-insert-column (ses-in-print-area)]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
131 ["Delete column" ses-delete-column (ses-in-print-area)]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
132 ["Set column printer" ses-read-column-printer t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
133 ["Set column width" ses-set-column-width t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
134 ["Set default printer" ses-read-default-printer t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
135 ["Jump to cell" ses-jump t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
136 ["Set cell printer" ses-read-cell-printer t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
137 ["Recalculate cell" ses-recalculate-cell t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
138 ["Truncate cell display" ses-truncate-cell t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
139 ["Export values" ses-export-tsv t]
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
140 ["Export formulas" ses-export-tsf t]))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
141
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
142 (defconst ses-mode-edit-map
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
143 (let ((keys '("\C-c\C-r" ses-insert-range
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
144 "\C-c\C-s" ses-insert-ses-range
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
145 [S-mouse-3] ses-insert-range-click
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
146 [C-S-mouse-3] ses-insert-ses-range-click
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
147 "\M-\C-i" lisp-complete-symbol))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
148 (newmap (make-sparse-keymap)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
149 (set-keymap-parent newmap minibuffer-local-map)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
150 (while keys
68359
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
151 (define-key newmap (pop keys) (pop keys)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
152 newmap)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
153 "Local keymap for SES minibuffer cell-editing.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
154
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
155 ;Local keymap for SES print area
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
156 (defalias 'ses-mode-print-map
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
157 (let ((keys '([backtab] backward-char
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
158 [tab] ses-forward-or-insert
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
159 "\C-i" ses-forward-or-insert ;Needed for ses-coverage.el?
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
160 "\M-o" ses-insert-column
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
161 "\C-o" ses-insert-row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
162 "\C-m" ses-edit-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
163 "\M-k" ses-delete-column
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
164 "\M-y" ses-yank-pop
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
165 "\C-k" ses-delete-row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
166 "\C-j" ses-append-row-jump-first-column
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
167 "\M-h" ses-mark-row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
168 "\M-H" ses-mark-column
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
169 "\C-d" ses-clear-cell-forward
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
170 "\C-?" ses-clear-cell-backward
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
171 "(" ses-read-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
172 "\"" ses-read-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
173 "'" ses-read-symbol
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
174 "=" ses-edit-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
175 "j" ses-jump
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
176 "p" ses-read-cell-printer
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
177 "w" ses-set-column-width
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
178 "x" ses-export-keymap
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
179 "\M-p" ses-read-column-printer))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
180 (repl '(;;We'll replace these wherever they appear in the keymap
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
181 clipboard-kill-region ses-kill-override
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
182 end-of-line ses-end-of-line
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
183 kill-line ses-delete-row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
184 kill-region ses-kill-override
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
185 open-line ses-insert-row))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
186 (numeric "0123456789.-")
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
187 (newmap (make-keymap)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
188 ;;Get rid of printables
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
189 (suppress-keymap newmap t)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
190 ;;These keys insert themselves as the beginning of a numeric value
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
191 (dotimes (x (length numeric))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
192 (define-key newmap (substring numeric x (1+ x)) 'ses-read-cell))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
193 ;;Override these global functions wherever they're bound
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
194 (while repl
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
195 (substitute-key-definition (car repl) (cadr repl) newmap
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
196 (current-global-map))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
197 (setq repl (cddr repl)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
198 ;;Apparently substitute-key-definition doesn't catch this?
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
199 (define-key newmap [(menu-bar) edit cut] 'ses-kill-override)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
200 ;;Define our other local keys
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
201 (while keys
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
202 (define-key newmap (car keys) (cadr keys))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
203 (setq keys (cddr keys)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
204 newmap))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
205
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
206 ;;Helptext for ses-mode wants keymap as variable, not function
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
207 (defconst ses-mode-print-map (symbol-function 'ses-mode-print-map))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
208
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
209 ;;Key map used for 'x' key.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
210 (defalias 'ses-export-keymap
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
211 (let ((map (make-sparse-keymap "SES export")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
212 (define-key map "T" (cons " tab-formulas" 'ses-export-tsf))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
213 (define-key map "t" (cons " tab-values" 'ses-export-tsv))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
214 map))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
215
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
216 (defconst ses-print-data-boundary "\n\014\n"
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
217 "Marker string denoting the boundary between print area and data area.")
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
218
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
219 (defconst ses-initial-global-parameters
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
220 "\n( ;Global parameters (these are read first)\n 2 ;SES file-format\n 1 ;numrows\n 1 ;numcols\n)\n\n"
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
221 "Initial contents for the three-element list at the bottom of the data area.")
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
222
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
223 (defconst ses-initial-file-trailer
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
224 ";; Local Variables:\n;; mode: ses\n;; End:\n"
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
225 "Initial contents for the file-trailer area at the bottom of the file.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
226
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
227 (defconst ses-initial-file-contents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
228 (concat " \n" ;One blank cell in print area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
229 ses-print-data-boundary
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
230 "(ses-cell A1 nil nil nil nil)\n" ;One blank cell in data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
231 "\n" ;End-of-row terminator for the one row in data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
232 "(ses-column-widths [7])\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
233 "(ses-column-printers [nil])\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
234 "(ses-default-printer \"%.7g\")\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
235 "(ses-header-row 0)\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
236 ses-initial-global-parameters
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
237 ses-initial-file-trailer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
238 "The initial contents of an empty spreadsheet.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
239
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
240 (defconst ses-paramlines-plist
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
241 '(ses--col-widths 2 ses--col-printers 3 ses--default-printer 4
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
242 ses--header-row 5 ses--file-format 8 ses--numrows 9
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
243 ses--numcols 10)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
244 "Offsets from last cell line to various parameter lines in the data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
245 of a spreadsheet.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
246
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
247 (defconst ses-box-prop '(:box (:line-width 2 :style released-button))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
248 "Display properties to create a raised box for cells in the header line.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
249
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
250 (defconst ses-standard-printer-functions
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
251 '(ses-center ses-center-span ses-dashfill ses-dashfill-span
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
252 ses-tildefill-span)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
253 "List of print functions to be included in initial history of printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
254 functions. None of these standard-printer functions is suitable for use as a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
255 column printer or a global-default printer because they invoke the column or
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
256 default printer and then modify its output.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
257
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
258 (eval-and-compile
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
259 (defconst ses-localvars
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
260 '(ses--blank-line ses--cells ses--col-printers ses--col-widths ses--curcell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
261 ses--curcell-overlay ses--default-printer ses--deferred-narrow
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
262 ses--deferred-recalc ses--deferred-write ses--file-format
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
263 ses--header-hscroll ses--header-row ses--header-string ses--linewidth
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
264 ses--numcols ses--numrows ses--symbolic-formulas
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
265 ;;Global variables that we override
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
266 mode-line-process next-line-add-newlines transient-mark-mode)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
267 "Buffer-local variables used by SES."))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
268
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
269 ;;When compiling, create all the buffer locals and give them values
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
270 (eval-when-compile
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
271 (dolist (x ses-localvars)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
272 (make-local-variable x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
273 (set x nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
274
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
275
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
276 ;;
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
277 ;; "Side-effect variables". They are set in one function, altered in
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
278 ;; another as a side effect, then read back by the first, as a way of
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
279 ;; passing back more than one value. These declarations are just to make
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
280 ;; the compiler happy, and to conform to standard Emacs-Lisp practice (I
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
281 ;; think the make-local-variable trick above is cleaner).
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
282 ;;
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
283
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
284 (defvar ses-relocate-return nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
285 "Set by `ses-relocate-formula' and `ses-relocate-range', read by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
286 `ses-relocate-all'. Set to 'delete if a cell-reference was deleted from a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
287 formula--so the formula needs recalculation. Set to 'range if the size of a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
288 `ses-range' was changed--so both the formula's value and list of dependents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
289 need to be recalculated.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
290
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
291 (defvar ses-call-printer-return nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
292 "Set to t if last cell printer invoked by `ses-call-printer' requested
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
293 left-justification of the result. Set to error-signal if ses-call-printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
294 encountered an error during printing. Nil otherwise.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
295
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
296 (defvar ses-start-time nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
297 "Time when current operation started. Used by `ses-time-check' to decide
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
298 when to emit a progress message.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
299
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
300
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
301 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
302 ;; Macros
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
303 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
304
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
305 (defmacro ses-get-cell (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
306 "Return the cell structure that stores information about cell (ROW,COL)."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
307 `(aref (aref ses--cells ,row) ,col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
308
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
309 ;; We might want to use defstruct here, but cells are explicitly used as
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
310 ;; arrays in ses-set-cell, so we'd need to fix this first. --Stef
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
311 (defsubst ses-make-cell (&optional symbol formula printer references)
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
312 (vector symbol formula printer references))
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
313
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
314 (defmacro ses-cell-symbol (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
315 "From a CELL or a pair (ROW,COL), get the symbol that names the local-variable holding its value. (0,0) => A1."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
316 `(aref ,(if col `(ses-get-cell ,row ,col) row) 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
317
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
318 (defmacro ses-cell-formula (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
319 "From a CELL or a pair (ROW,COL), get the function that computes its value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
320 `(aref ,(if col `(ses-get-cell ,row ,col) row) 1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
321
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
322 (defmacro ses-cell-printer (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
323 "From a CELL or a pair (ROW,COL), get the function that prints its value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
324 `(aref ,(if col `(ses-get-cell ,row ,col) row) 2))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
325
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
326 (defmacro ses-cell-references (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
327 "From a CELL or a pair (ROW,COL), get the list of symbols for cells whose
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
328 functions refer to its value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
329 `(aref ,(if col `(ses-get-cell ,row ,col) row) 3))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
330
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
331 (defmacro ses-cell-value (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
332 "From a CELL or a pair (ROW,COL), get the current value for that cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
333 `(symbol-value (ses-cell-symbol ,row ,col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
334
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
335 (defmacro ses-col-width (col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
336 "Return the width for column COL."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
337 `(aref ses--col-widths ,col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
338
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
339 (defmacro ses-col-printer (col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
340 "Return the default printer for column COL."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
341 `(aref ses--col-printers ,col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
342
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
343 (defmacro ses-sym-rowcol (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
344 "From a cell-symbol SYM, gets the cons (row . col). A1 => (0 . 0). Result
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
345 is nil if SYM is not a symbol that names a cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
346 `(and (symbolp ,sym) (get ,sym 'ses-cell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
347
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
348 (defmacro ses-cell (sym value formula printer references)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
349 "Load a cell SYM from the spreadsheet file. Does not recompute VALUE from
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
350 FORMULA, does not reprint using PRINTER, does not check REFERENCES. This is a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
351 macro to prevent propagate-on-load viruses. Safety-checking for FORMULA and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
352 PRINTER are deferred until first use."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
353 (let ((rowcol (ses-sym-rowcol sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
354 (ses-formula-record formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
355 (ses-printer-record printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
356 (or (atom formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
357 (eq safe-functions t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
358 (setq formula `(ses-safe-formula ,formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
359 (or (not printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
360 (stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
361 (eq safe-functions t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
362 (setq printer `(ses-safe-printer ,printer)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
363 (aset (aref ses--cells (car rowcol))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
364 (cdr rowcol)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
365 (ses-make-cell sym formula printer references)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
366 (set sym value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
367 sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
368
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
369 (defmacro ses-column-widths (widths)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
370 "Load the vector of column widths from the spreadsheet file. This is a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
371 macro to prevent propagate-on-load viruses."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
372 (or (and (vectorp widths) (= (length widths) ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
373 (error "Bad column-width vector"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
374 ;;To save time later, we also calculate the total width of each line in the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
375 ;;print area (excluding the terminating newline)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
376 (setq ses--col-widths widths
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
377 ses--linewidth (apply '+ -1 (mapcar '1+ widths))
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
378 ses--blank-line (concat (make-string ses--linewidth ?\s) "\n"))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
379 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
380
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
381 (defmacro ses-column-printers (printers)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
382 "Load the vector of column printers from the spreadsheet file and checks
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
383 them for safety. This is a macro to prevent propagate-on-load viruses."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
384 (or (and (vectorp printers) (= (length printers) ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
385 (error "Bad column-printers vector"))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
386 (dotimes (x ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
387 (aset printers x (ses-safe-printer (aref printers x))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
388 (setq ses--col-printers printers)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
389 (mapc 'ses-printer-record printers)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
390 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
391
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
392 (defmacro ses-default-printer (def)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
393 "Load the global default printer from the spreadsheet file and checks it
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
394 for safety. This is a macro to prevent propagate-on-load viruses."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
395 (setq ses--default-printer (ses-safe-printer def))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
396 (ses-printer-record def)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
397 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
398
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
399 (defmacro ses-header-row (row)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
400 "Load the header row from the spreadsheet file and checks it
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
401 for safety. This is a macro to prevent propagate-on-load viruses."
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
402 (or (and (wholenump row) (or (zerop ses--numrows) (< row ses--numrows)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
403 (error "Bad header-row"))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
404 (setq ses--header-row row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
405 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
406
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
407 (defmacro ses-dorange (curcell &rest body)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
408 "Execute BODY repeatedly, with the variables `row' and `col' set to each
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
409 cell in the range specified by CURCELL. The range is available in the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
410 variables `minrow', `maxrow', `mincol', and `maxcol'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
411 (let ((cur (make-symbol "cur"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
412 (min (make-symbol "min"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
413 (max (make-symbol "max"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
414 (r (make-symbol "r"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
415 (c (make-symbol "c")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
416 `(let* ((,cur ,curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
417 (,min (ses-sym-rowcol (if (consp ,cur) (car ,cur) ,cur)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
418 (,max (ses-sym-rowcol (if (consp ,cur) (cdr ,cur) ,cur))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
419 (let ((minrow (car ,min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
420 (maxrow (car ,max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
421 (mincol (cdr ,min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
422 (maxcol (cdr ,max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
423 row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
424 (if (or (> minrow maxrow) (> mincol maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
425 (error "Empty range"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
426 (dotimes (,r (- maxrow minrow -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
427 (setq row (+ ,r minrow))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
428 (dotimes (,c (- maxcol mincol -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
429 (setq col (+ ,c mincol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
430 ,@body))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
431
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
432 (put 'ses-dorange 'lisp-indent-function 'defun)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
433 (def-edebug-spec ses-dorange (form body))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
434
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
435 ;;Support for coverage testing.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
436 (defmacro 1value (form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
437 "For code-coverage testing, indicate that FORM is expected to always have
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
438 the same value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
439 form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
440 (defmacro noreturn (form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
441 "For code-coverage testing, indicate that FORM will always signal an error."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
442 form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
443
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
444
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
445 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
446 ;; Utility functions
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
447 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
448
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
449 (defun ses-vector-insert (array idx new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
450 "Create a new vector which is one larger than ARRAY and has NEW inserted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
451 before element IDX."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
452 (let* ((len (length array))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
453 (result (make-vector (1+ len) new)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
454 (dotimes (x len)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
455 (aset result
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
456 (if (< x idx) x (1+ x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
457 (aref array x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
458 result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
459
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
460 ;;Allow ARRAY to be a symbol for use in buffer-undo-list
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
461 (defun ses-vector-delete (array idx count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
462 "Create a new vector which is a copy of ARRAY with COUNT objects removed
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
463 starting at element IDX. ARRAY is either a vector or a symbol whose value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
464 is a vector--if a symbol, the new vector is assigned as the symbol's value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
465 (let* ((a (if (arrayp array) array (symbol-value array)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
466 (len (- (length a) count))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
467 (result (make-vector len nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
468 (dotimes (x len)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
469 (aset result x (aref a (if (< x idx) x (+ x count)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
470 (if (symbolp array)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
471 (set array result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
472 result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
473
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
474 (defun ses-delete-line (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
475 "Like `kill-line', but no kill ring."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
476 (let ((pos (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
477 (forward-line count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
478 (delete-region pos (point))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
479
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
480 (defun ses-printer-validate (printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
481 "Signals an error if PRINTER is not a valid SES cell printer."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
482 (or (not printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
483 (stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
484 (functionp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
485 (and (stringp (car-safe printer)) (not (cdr printer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
486 (error "Invalid printer function"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
487 printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
488
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
489 (defun ses-printer-record (printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
490 "Add PRINTER to `ses-read-printer-history' if not already there, after first
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
491 checking that it is a valid printer function."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
492 (ses-printer-validate printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
493 ;;To speed things up, we avoid calling prin1 for the very common "nil" case.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
494 (if printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
495 (add-to-list 'ses-read-printer-history (prin1-to-string printer))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
496
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
497 (defun ses-formula-record (formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
498 "If FORMULA is of the form 'symbol, adds it to the list of symbolic formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
499 for this spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
500 (when (and (eq (car-safe formula) 'quote)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
501 (symbolp (cadr formula)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
502 (add-to-list 'ses--symbolic-formulas
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
503 (list (symbol-name (cadr formula))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
504
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
505 (defun ses-column-letter (col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
506 "Converts a column number to A..Z or AA..ZZ"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
507 (if (< col 26)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
508 (char-to-string (+ ?A col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
509 (string (+ ?@ (/ col 26)) (+ ?A (% col 26)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
510
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
511 (defun ses-create-cell-symbol (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
512 "Produce a symbol that names the cell (ROW,COL). (0,0) => 'A1."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
513 (intern (concat (ses-column-letter col) (number-to-string (1+ row)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
514
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
515 (defun ses-create-cell-variable-range (minrow maxrow mincol maxcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
516 "Create buffer-local variables for cells. This is undoable."
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
517 (push `(apply ses-destroy-cell-variable-range ,minrow ,maxrow ,mincol ,maxcol)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
518 buffer-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
519 (let (sym xrow xcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
520 (dotimes (row (1+ (- maxrow minrow)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
521 (dotimes (col (1+ (- maxcol mincol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
522 (setq xrow (+ row minrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
523 xcol (+ col mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
524 sym (ses-create-cell-symbol xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
525 (put sym 'ses-cell (cons xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
526 (make-local-variable sym)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
527
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
528 ;;We do not delete the ses-cell properties for the cell-variables, in case a
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
529 ;;formula that refers to this cell is in the kill-ring and is later pasted
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
530 ;;back in.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
531 (defun ses-destroy-cell-variable-range (minrow maxrow mincol maxcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
532 "Destroy buffer-local variables for cells. This is undoable."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
533 (let (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
534 (dotimes (row (1+ (- maxrow minrow)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
535 (dotimes (col (1+ (- maxcol mincol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
536 (setq sym (ses-create-cell-symbol (+ row minrow) (+ col mincol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
537 (if (boundp sym)
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
538 (push `(apply ses-set-with-undo ,sym ,(symbol-value sym))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
539 buffer-undo-list))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
540 (kill-local-variable sym))))
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
541 (push `(apply ses-create-cell-variable-range ,minrow ,maxrow ,mincol ,maxcol)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
542 buffer-undo-list))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
543
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
544 (defun ses-reset-header-string ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
545 "Flags the header string for update. Upon undo, the header string will be
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
546 updated again."
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
547 (push '(apply ses-reset-header-string) buffer-undo-list)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
548 (setq ses--header-hscroll -1))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
549
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
550 ;;Split this code off into a function to avoid coverage-testing difficulties
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
551 (defun ses-time-check (format arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
552 "If `ses-start-time' is more than a second ago, call `message' with FORMAT
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
553 and (eval ARG) and reset `ses-start-time' to the current time."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
554 (when (> (- (float-time) ses-start-time) 1.0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
555 (message format (eval arg))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
556 (setq ses-start-time (float-time)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
557 nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
558
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
559
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
560 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
561 ;; The cells
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
562 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
563
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
564 (defun ses-set-cell (row col field val)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
565 "Install VAL as the contents for field FIELD (named by a quoted symbol) of
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
566 cell (ROW,COL). This is undoable. The cell's data will be updated through
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
567 `post-command-hook'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
568 (let ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
569 (elt (plist-get '(value t symbol 0 formula 1 printer 2 references 3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
570 field))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
571 change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
572 (or elt (signal 'args-out-of-range nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
573 (setq change (if (eq elt t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
574 (ses-set-with-undo (ses-cell-symbol cell) val)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
575 (ses-aset-with-undo cell elt val)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
576 (if change
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
577 (add-to-list 'ses--deferred-write (cons row col))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
578 nil) ;Make coverage-tester happy
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
579
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
580 (defun ses-cell-set-formula (row col formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
581 "Store a new formula for (ROW . COL) and enqueues the cell for
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
582 recalculation via `post-command-hook'. Updates the reference lists for the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
583 cells that this cell refers to. Does not update cell value or reprint the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
584 cell. To avoid inconsistencies, this function is not interruptible, which
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
585 means Emacs will crash if FORMULA contains a circular list."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
586 (let* ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
587 (old (ses-cell-formula cell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
588 (let ((sym (ses-cell-symbol cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
589 (oldref (ses-formula-references old))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
590 (newref (ses-formula-references formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
591 (inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
592 x xrow xcol)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
593 (add-to-list 'ses--deferred-recalc sym)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
594 ;;Delete old references from this cell. Skip the ones that are also
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
595 ;;in the new list.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
596 (dolist (ref oldref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
597 (unless (memq ref newref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
598 (setq x (ses-sym-rowcol ref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
599 xrow (car x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
600 xcol (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
601 (ses-set-cell xrow xcol 'references
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
602 (delq sym (ses-cell-references xrow xcol)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
603 ;;Add new ones. Skip ones left over from old list
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
604 (dolist (ref newref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
605 (setq x (ses-sym-rowcol ref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
606 xrow (car x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
607 xcol (cdr x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
608 x (ses-cell-references xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
609 (or (memq sym x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
610 (ses-set-cell xrow xcol 'references (cons sym x))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
611 (ses-formula-record formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
612 (ses-set-cell row col 'formula formula))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
613
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
614 (defun ses-calculate-cell (row col force)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
615 "Calculate and print the value for cell (ROW,COL) using the cell's formula
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
616 function and print functions, if any. Result is nil for normal operation, or
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
617 the error signal if the formula or print function failed. The old value is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
618 left unchanged if it was *skip* and the new value is nil.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
619 Any cells that depend on this cell are queued for update after the end of
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
620 processing for the current keystroke, unless the new value is the same as
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
621 the old and FORCE is nil."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
622 (let ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
623 formula-error printer-error)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
624 (let ((oldval (ses-cell-value cell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
625 (formula (ses-cell-formula cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
626 newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
627 (if (eq (car-safe formula) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
628 (ses-set-cell row col 'formula (ses-safe-formula (cadr formula))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
629 (condition-case sig
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
630 (setq newval (eval formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
631 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
632 (setq formula-error sig
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
633 newval '*error*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
634 (if (and (not newval) (eq oldval '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
635 ;;Don't lose the *skip* - previous field spans this one
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
636 (setq newval '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
637 (when (or force (not (eq newval oldval)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
638 (add-to-list 'ses--deferred-write (cons row col)) ;In case force=t
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
639 (ses-set-cell row col 'value newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
640 (dolist (ref (ses-cell-references cell))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
641 (add-to-list 'ses--deferred-recalc ref))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
642 (setq printer-error (ses-print-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
643 (or formula-error printer-error)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
644
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
645 (defun ses-clear-cell (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
646 "Delete formula and printer for cell (ROW,COL)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
647 (ses-set-cell row col 'printer nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
648 (ses-cell-set-formula row col nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
649
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
650 (defun ses-update-cells (list &optional force)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
651 "Recalculate cells in LIST, checking for dependency loops. Prints
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
652 progress messages every second. Dependent cells are not recalculated
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
653 if the cell's value is unchanged if FORCE is nil."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
654 (let ((ses--deferred-recalc list)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
655 (nextlist list)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
656 (pos (point))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
657 curlist prevlist rowcol formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
658 (with-temp-message " "
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
659 (while (and ses--deferred-recalc (not (equal nextlist prevlist)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
660 ;;In each loop, recalculate cells that refer only to other cells that
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
661 ;;have already been recalculated or aren't in the recalculation
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
662 ;;region. Repeat until all cells have been processed or until the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
663 ;;set of cells being worked on stops changing.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
664 (if prevlist
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
665 (message "Recalculating... (%d cells left)"
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
666 (length ses--deferred-recalc)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
667 (setq curlist ses--deferred-recalc
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
668 ses--deferred-recalc nil
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
669 prevlist nextlist)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
670 (while curlist
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
671 (setq rowcol (ses-sym-rowcol (car curlist))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
672 formula (ses-cell-formula (car rowcol) (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
673 (or (catch 'ref
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
674 (dolist (ref (ses-formula-references formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
675 (when (or (memq ref curlist)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
676 (memq ref ses--deferred-recalc))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
677 ;;This cell refers to another that isn't done yet
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
678 (add-to-list 'ses--deferred-recalc (car curlist))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
679 (throw 'ref t))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
680 ;;ses-update-cells is called from post-command-hook, so
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
681 ;;inhibit-quit is implicitly bound to t.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
682 (when quit-flag
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
683 ;;Abort the recalculation. User will probably undo now.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
684 (error "Quit"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
685 (ses-calculate-cell (car rowcol) (cdr rowcol) force))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
686 (setq curlist (cdr curlist)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
687 (dolist (ref ses--deferred-recalc)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
688 (add-to-list 'nextlist ref))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
689 (setq nextlist (sort (copy-sequence nextlist) 'string<))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
690 (if (equal nextlist prevlist)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
691 ;;We'll go around the loop one more time.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
692 (add-to-list 'nextlist t)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
693 (when ses--deferred-recalc
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
694 ;;Just couldn't finish these
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
695 (dolist (x ses--deferred-recalc)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
696 (let ((rowcol (ses-sym-rowcol x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
697 (ses-set-cell (car rowcol) (cdr rowcol) 'value '*error*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
698 (1value (ses-print-cell (car rowcol) (cdr rowcol)))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
699 (error "Circular references: %s" ses--deferred-recalc))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
700 (message " "))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
701 ;;Can't use save-excursion here: if the cell under point is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
702 ;;updated, save-excusion's marker will move past the cell.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
703 (goto-char pos)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
704
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
705
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
706 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
707 ;; The print area
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
708 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
709
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
710 (defun ses-in-print-area ()
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
711 "Returns t if point is in print area of spreadsheet."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
712 (eq (get-text-property (point) 'keymap) 'ses-mode-print-map))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
713
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
714 ;;We turn off point-motion-hooks and explicitly position the cursor, in case
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
715 ;;the intangible properties have gotten screwed up (e.g., when
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
716 ;;ses-goto-print is called during a recursive ses-print-cell).
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
717 (defun ses-goto-print (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
718 "Move point to print area for cell (ROW,COL)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
719 (let ((inhibit-point-motion-hooks t))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
720 (goto-char (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
721 (forward-line row)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
722 (dotimes (c col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
723 (forward-char (1+ (ses-col-width c))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
724
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
725 (defun ses-set-curcell ()
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
726 "Sets `ses--curcell' to the current cell symbol, or a cons (BEG,END) for a
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
727 region, or nil if cursor is not at a cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
728 (if (or (not mark-active)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
729 deactivate-mark
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
730 (= (region-beginning) (region-end)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
731 ;;Single cell
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
732 (setq ses--curcell (get-text-property (point) 'intangible))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
733 ;;Range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
734 (let ((bcell (get-text-property (region-beginning) 'intangible))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
735 (ecell (get-text-property (1- (region-end)) 'intangible)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
736 (setq ses--curcell (if (and bcell ecell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
737 (cons bcell ecell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
738 nil))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
739 nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
740
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
741 (defun ses-check-curcell (&rest args)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
742 "Signal an error if ses--curcell is inappropriate. The end marker is
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
743 appropriate if some argument is 'end. A range is appropriate if some
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
744 argument is 'range. A single cell is appropriate unless some argument is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
745 'needrange."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
746 (if (eq ses--curcell t)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
747 ;;curcell recalculation was postponed, but user typed ahead
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
748 (ses-set-curcell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
749 (cond
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
750 ((not ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
751 (or (memq 'end args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
752 (error "Not at cell")))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
753 ((consp ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
754 (or (memq 'range args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
755 (memq 'needrange args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
756 (error "Can't use a range")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
757 ((memq 'needrange args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
758 (error "Need a range"))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
759
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
760 (defun ses-print-cell (row col)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
761 "Format and print the value of cell (ROW,COL) to the print area.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
762 Use the cell's printer function. If the cell's new print form is too wide,
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
763 it will spill over into the following cell, but will not run off the end of the
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
764 row or overwrite the next non-nil field. Result is nil for normal operation,
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
765 or the error signal if the printer function failed and the cell was formatted
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
766 with \"%s\". If the cell's value is *skip*, nothing is printed because the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
767 preceding cell has spilled over."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
768 (catch 'ses-print-cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
769 (let* ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
770 (value (ses-cell-value cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
771 (printer (ses-cell-printer cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
772 (maxcol (1+ col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
773 text sig startpos x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
774 ;;Create the string to print
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
775 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
776 ((eq value '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
777 ;;Don't print anything
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
778 (throw 'ses-print-cell nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
779 ((eq value '*error*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
780 (setq text (make-string (ses-col-width col) ?#)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
781 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
782 ;;Deferred safety-check on printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
783 (if (eq (car-safe printer) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
784 (ses-set-cell row col 'printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
785 (setq printer (ses-safe-printer (cadr printer)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
786 ;;Print the value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
787 (setq text (ses-call-printer (or printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
788 (ses-col-printer col)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
789 ses--default-printer)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
790 value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
791 (if (consp ses-call-printer-return)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
792 ;;Printer returned an error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
793 (setq sig ses-call-printer-return))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
794 ;;Adjust print width to match column width
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
795 (let ((width (ses-col-width col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
796 (len (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
797 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
798 ((< len width)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
799 ;;Fill field to length with spaces
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
800 (setq len (make-string (- width len) ?\s)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
801 text (if (eq ses-call-printer-return t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
802 (concat text len)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
803 (concat len text))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
804 ((> len width)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
805 ;;Spill over into following cells, if possible
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
806 (let ((maxwidth width))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
807 (while (and (> len maxwidth)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
808 (< maxcol ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
809 (or (not (setq x (ses-cell-value row maxcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
810 (eq x '*skip*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
811 (unless x
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
812 ;;Set this cell to '*skip* so it won't overwrite our spillover
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
813 (ses-set-cell row maxcol 'value '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
814 (setq maxwidth (+ maxwidth (ses-col-width maxcol) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
815 maxcol (1+ maxcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
816 (if (<= len maxwidth)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
817 ;;Fill to complete width of all the fields spanned
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
818 (setq text (concat text (make-string (- maxwidth len) ?\s)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
819 ;;Not enough room to end of line or next non-nil field. Truncate
53758
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
820 ;;if string or decimal; otherwise fill with error indicator
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
821 (setq sig `(error "Too wide" ,text))
53758
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
822 (cond
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
823 ((stringp value)
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
824 (setq text (substring text 0 maxwidth)))
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
825 ((and (numberp value)
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
826 (string-match "\\.[0-9]+" text)
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
827 (>= 0 (setq width
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
828 (- len maxwidth
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
829 (- (match-end 0) (match-beginning 0))))))
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
830 ;; Turn 6.6666666666e+49 into 6.66e+49. Rounding is too hard!
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
831 (setq text (concat (substring text
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
832 0
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
833 (- (match-beginning 0) width))
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
834 (substring text (match-end 0)))))
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
835 (t
c503ef8bb300 Changes suggested by Stefan Monnier to truncate decimal places if print format too large for column width.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53746
diff changeset
836 (setq text (make-string maxwidth ?#)))))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
837 ;;Substitute question marks for tabs and newlines. Newlines are
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
838 ;;used as row-separators; tabs could confuse the reimport logic.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
839 (setq text (replace-regexp-in-string "[\t\n]" "?" text))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
840 (ses-goto-print row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
841 (setq startpos (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
842 ;;Install the printed result. This is not interruptible.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
843 (let ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
844 (inhibit-quit t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
845 (delete-char (1+ (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
846 ;;We use concat instead of inserting separate strings in order to
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
847 ;;reduce the number of cells in the undo list.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
848 (setq x (concat text (if (< maxcol ses--numcols) " " "\n")))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
849 ;;We use set-text-properties to prevent a wacky print function
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
850 ;;from inserting rogue properties, and to ensure that the keymap
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
851 ;;property is inherited (is it a bug that only unpropertied strings
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
852 ;;actually inherit from surrounding text?)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
853 (set-text-properties 0 (length x) nil x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
854 (insert-and-inherit x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
855 (put-text-property startpos (point) 'intangible
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
856 (ses-cell-symbol cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
857 (when (and (zerop row) (zerop col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
858 ;;Reconstruct special beginning-of-buffer attributes
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
859 (put-text-property (point-min) (point) 'keymap 'ses-mode-print-map)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
860 (put-text-property (point-min) (point) 'read-only 'ses)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
861 (put-text-property (point-min) (1+ (point-min)) 'front-sticky t)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
862 (if (= row (1- ses--header-row))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
863 ;;This line is part of the header - force recalc
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
864 (ses-reset-header-string))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
865 ;;If this cell (or a preceding one on the line) previously spilled over
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
866 ;;and has gotten shorter, redraw following cells on line recursively.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
867 (when (and (< maxcol ses--numcols)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
868 (eq (ses-cell-value row maxcol) '*skip*))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
869 (ses-set-cell row maxcol 'value nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
870 (ses-print-cell row maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
871 ;;Return to start of cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
872 (goto-char startpos)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
873 sig)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
874
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
875 (defun ses-call-printer (printer &optional value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
876 "Invokes PRINTER (a string or parenthesized string or function-symbol or
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
877 lambda of one argument) on VALUE. Result is the the printed cell as a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
878 string. The variable `ses-call-printer-return' is set to t if the printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
879 used parenthesis to request left-justification, or the error-signal if the
63622
85d4c02c56a6 (ses-call-printer): Fix spellings.
Juanma Barranquero <lekktu@gmail.com>
parents: 63422
diff changeset
880 printer signaled one (and \"%s\" is used as the default printer), else nil."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
881 (setq ses-call-printer-return nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
882 (unless value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
883 (setq value ""))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
884 (condition-case signal
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
885 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
886 ((stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
887 (format printer value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
888 ((stringp (car-safe printer))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
889 (setq ses-call-printer-return t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
890 (format (car printer) value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
891 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
892 (setq value (funcall printer value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
893 (if (stringp value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
894 value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
895 (or (stringp (car-safe value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
896 (error "Printer should return \"string\" or (\"string\")"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
897 (setq ses-call-printer-return t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
898 (car value))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
899 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
900 (setq ses-call-printer-return signal)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
901 (prin1-to-string value t))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
902
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
903 (defun ses-adjust-print-width (col change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
904 "Insert CHANGE spaces in front of column COL, or at end of line if
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
905 COL=NUMCOLS. Deletes characters if CHANGE < 0. Caller should bind
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
906 inhibit-quit to t."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
907 (let ((inhibit-read-only t)
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
908 (blank (if (> change 0) (make-string change ?\s)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
909 (at-end (= col ses--numcols)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
910 (ses-set-with-undo 'ses--linewidth (+ ses--linewidth change))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
911 ;;ses-set-with-undo always returns t for strings.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
912 (1value (ses-set-with-undo 'ses--blank-line
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
913 (concat (make-string ses--linewidth ?\s) "\n")))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
914 (dotimes (row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
915 (ses-goto-print row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
916 (when at-end
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
917 ;;Insert new columns before newline
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
918 (let ((inhibit-point-motion-hooks t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
919 (backward-char 1)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
920 (if blank
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
921 (insert blank)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
922 (delete-char (- change))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
923
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
924 (defun ses-print-cell-new-width (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
925 "Same as ses-print-cell, except if the cell's value is *skip*, the preceding
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
926 nonskipped cell is reprinted. This function is used when the width of
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
927 cell (ROW,COL) has changed."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
928 (if (not (eq (ses-cell-value row col) '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
929 (ses-print-cell row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
930 ;;Cell was skipped over - reprint previous
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
931 (ses-goto-print row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
932 (backward-char 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
933 (let ((rowcol (ses-sym-rowcol (get-text-property (point) 'intangible))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
934 (ses-print-cell (car rowcol) (cdr rowcol)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
935
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
936
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
937 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
938 ;; The data area
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
939 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
940
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
941 (defun ses-narrowed-p () (/= (- (point-max) (point-min)) (buffer-size)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
942
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
943 (defun ses-widen ()
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
944 "Turn off narrowing, to be reenabled at end of command loop."
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
945 (if (ses-narrowed-p)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
946 (setq ses--deferred-narrow t))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
947 (widen))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
948
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
949 (defun ses-goto-data (def &optional col)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
950 "Move point to data area for (DEF,COL). If DEF is a row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
951 number, COL is the column number for a data cell -- otherwise DEF
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
952 is one of the symbols ses--col-widths, ses--col-printers,
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
953 ses--default-printer, ses--numrows, or ses--numcols."
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
954 (ses-widen)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
955 (let ((inhibit-point-motion-hooks t)) ;In case intangible attrs are wrong
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
956 (goto-char (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
957 (if col
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
958 ;;It's a cell
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
959 (forward-line (+ ses--numrows 2 (* def (1+ ses--numcols)) col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
960 ;;Convert def-symbol to offset
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
961 (setq def (plist-get ses-paramlines-plist def))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
962 (or def (signal 'args-out-of-range nil))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
963 (forward-line (+ (* ses--numrows (+ ses--numcols 2)) def)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
964
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
965 (defun ses-set-parameter (def value &optional elem)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
966 "Set parameter DEF to VALUE (with undo) and write the value to the data area.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
967 See `ses-goto-data' for meaning of DEF. Newlines in the data are escaped.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
968 If ELEM is specified, it is the array subscript within DEF to be set to VALUE."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
969 (save-excursion
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
970 ;;We call ses-goto-data early, using the old values of numrows and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
971 ;;numcols in case one of them is being changed.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
972 (ses-goto-data def)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
973 (let ((inhibit-read-only t)
55366
6956afbe5459 Typo fix: "ses--column-widths" => "ses--col-widths"
Jonathan Yavner <jyavner@member.fsf.org>
parents: 54571
diff changeset
974 (fmt (plist-get '(ses--col-widths "(ses-column-widths %S)"
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
975 ses--col-printers "(ses-column-printers %S)"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
976 ses--default-printer "(ses-default-printer %S)"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
977 ses--header-row "(ses-header-row %S)"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
978 ses--file-format " %S ;SES file-format"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
979 ses--numrows " %S ;numrows"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
980 ses--numcols " %S ;numcols")
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
981 def))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
982 oldval)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
983 (if elem
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
984 (progn
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
985 (setq oldval (aref (symbol-value def) elem))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
986 (aset (symbol-value def) elem value))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
987 (setq oldval (symbol-value def))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
988 (set def value))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
989 ;;Special undo since it's outside the narrowed buffer
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
990 (let (buffer-undo-list)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
991 (delete-region (point) (line-end-position))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
992 (insert (format fmt (symbol-value def))))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
993 (push `(apply ses-set-parameter ,def ,oldval ,elem) buffer-undo-list))))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
994
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
995
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
996 (defun ses-write-cells ()
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
997 "Write cells in `ses--deferred-write' from local variables to data area.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
998 Newlines in the data are escaped."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
999 (let* ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1000 (print-escape-newlines t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1001 rowcol row col cell sym formula printer text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1002 (setq ses-start-time (float-time))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1003 (with-temp-message " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1004 (save-excursion
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1005 (while ses--deferred-write
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1006 (ses-time-check "Writing... (%d cells left)"
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1007 '(length ses--deferred-write))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1008 (setq rowcol (pop ses--deferred-write)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1009 row (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1010 col (cdr rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1011 cell (ses-get-cell row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1012 sym (ses-cell-symbol cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1013 formula (ses-cell-formula cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1014 printer (ses-cell-printer cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1015 (if (eq (car-safe formula) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1016 (setq formula (cadr formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1017 (if (eq (car-safe printer) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1018 (setq printer (cadr printer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1019 ;;This is noticably faster than (format "%S %S %S %S %S")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1020 (setq text (concat "(ses-cell "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1021 (symbol-name sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1022 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1023 (prin1-to-string (symbol-value sym))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1024 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1025 (prin1-to-string formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1026 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1027 (prin1-to-string printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1028 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1029 (if (atom (ses-cell-references cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1030 "nil"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1031 (concat "("
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1032 (mapconcat 'symbol-name
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1033 (ses-cell-references cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1034 " ")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1035 ")"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1036 ")"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1037 (ses-goto-data row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1038 (delete-region (point) (line-end-position))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1039 (insert text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1040 (message " "))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1041
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1042
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1043 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1044 ;; Formula relocation
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1045 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1046
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1047 (defun ses-formula-references (formula &optional result-so-far)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1048 "Produce a list of symbols for cells that this formula's value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1049 refers to. For recursive calls, RESULT-SO-FAR is the list being constructed,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1050 or t to get a wrong-type-argument error when the first reference is found."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1051 (if (atom formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1052 (if (ses-sym-rowcol formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1053 ;;Entire formula is one symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1054 (add-to-list 'result-so-far formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1055 ) ;;Ignore other atoms
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1056 (dolist (cur formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1057 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1058 ((ses-sym-rowcol cur)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1059 ;;Save this reference
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1060 (add-to-list 'result-so-far cur))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1061 ((eq (car-safe cur) 'ses-range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1062 ;;All symbols in range are referenced
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1063 (dolist (x (cdr (macroexpand cur)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1064 (add-to-list 'result-so-far x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1065 ((and (consp cur) (not (eq (car cur) 'quote)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1066 ;;Recursive call for subformulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1067 (setq result-so-far (ses-formula-references cur result-so-far)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1068 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1069 ;;Ignore other stuff
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1070 ))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1071 result-so-far)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1072
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1073 (defun ses-relocate-formula (formula startrow startcol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1074 "Produce a copy of FORMULA where all symbols that refer to cells in row
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1075 STARTROW or above and col STARTCOL or above are altered by adding ROWINCR
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1076 and COLINCR. STARTROW and STARTCOL are 0-based. Example:
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1077 (ses-relocate-formula '(+ A1 B2 D3) 1 2 1 -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1078 => (+ A1 B2 C4)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1079 If ROWINCR or COLINCR is negative, references to cells being deleted are
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1080 removed. Example:
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1081 (ses-relocate-formula '(+ A1 B2 D3) 0 1 0 -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1082 => (+ A1 C3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1083 Sets `ses-relocate-return' to 'delete if cell-references were removed."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1084 (let (rowcol result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1085 (if (or (atom formula) (eq (car formula) 'quote))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1086 (if (setq rowcol (ses-sym-rowcol formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1087 (ses-relocate-symbol formula rowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1088 startrow startcol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1089 formula) ;Pass through as-is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1090 (dolist (cur formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1091 (setq rowcol (ses-sym-rowcol cur))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1092 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1093 (rowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1094 (setq cur (ses-relocate-symbol cur rowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1095 startrow startcol rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1096 (if cur
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1097 (push cur result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1098 ;;Reference to a deleted cell. Set a flag in ses-relocate-return.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1099 ;;don't change the flag if it's already 'range, since range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1100 ;;implies 'delete.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1101 (unless ses-relocate-return
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1102 (setq ses-relocate-return 'delete))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1103 ((eq (car-safe cur) 'ses-range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1104 (setq cur (ses-relocate-range cur startrow startcol rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1105 (if cur
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1106 (push cur result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1107 ((or (atom cur) (eq (car cur) 'quote))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1108 ;;Constants pass through unchanged
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1109 (push cur result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1110 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1111 ;;Recursively copy and alter subformulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1112 (push (ses-relocate-formula cur startrow startcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1113 rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1114 result))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1115 (nreverse result))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1116
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1117 (defun ses-relocate-symbol (sym rowcol startrow startcol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1118 "Relocate one symbol SYM, whichs corresponds to ROWCOL (a cons of ROW and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1119 COL). Cells starting at (STARTROW,STARTCOL) are being shifted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1120 by (ROWINCR,COLINCR)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1121 (let ((row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1122 (col (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1123 (if (or (< row startrow) (< col startcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1124 sym
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1125 (setq row (+ row rowincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1126 col (+ col colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1127 (if (and (>= row startrow) (>= col startcol)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1128 (< row ses--numrows) (< col ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1129 ;;Relocate this variable
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1130 (ses-create-cell-symbol row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1131 ;;Delete reference to a deleted cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1132 nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1133
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1134 (defun ses-relocate-range (range startrow startcol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1135 "Relocate one RANGE, of the form '(ses-range min max). Cells starting
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1136 at (STARTROW,STARTCOL) are being shifted by (ROWINCR,COLINCR). Result is the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1137 new range, or nil if the entire range is deleted. If new rows are being added
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1138 just beyond the end of a row range, or new columns just beyond a column range,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1139 the new rows/columns will be added to the range. Sets `ses-relocate-return'
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1140 if the range was altered."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1141 (let* ((minorig (cadr range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1142 (minrowcol (ses-sym-rowcol minorig))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1143 (min (ses-relocate-symbol minorig minrowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1144 startrow startcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1145 rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1146 (maxorig (nth 2 range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1147 (maxrowcol (ses-sym-rowcol maxorig))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1148 (max (ses-relocate-symbol maxorig maxrowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1149 startrow startcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1150 rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1151 field)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1152 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1153 ((and (not min) (not max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1154 (setq range nil)) ;;The entire range is deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1155 ((zerop colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1156 ;;Inserting or deleting rows
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1157 (setq field 'car)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1158 (if (not min)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1159 ;;Chopped off beginning of range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1160 (setq min (ses-create-cell-symbol startrow (cdr minrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1161 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1162 (if (not max)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1163 (if (> rowincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1164 ;;Trying to insert a nonexistent row
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1165 (setq max (ses-create-cell-symbol (1- ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1166 (cdr minrowcol)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1167 ;;End of range is being deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1168 (setq max (ses-create-cell-symbol (1- startrow) (cdr minrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1169 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1170 (and (> rowincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1171 (= (car maxrowcol) (1- startrow))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1172 (= (cdr minrowcol) (cdr maxrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1173 ;;Insert after ending row of vertical range - include it
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1174 (setq max (ses-create-cell-symbol (+ startrow rowincr -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1175 (cdr maxrowcol))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1176 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1177 ;;Inserting or deleting columns
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1178 (setq field 'cdr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1179 (if (not min)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1180 ;;Chopped off beginning of range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1181 (setq min (ses-create-cell-symbol (car minrowcol) startcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1182 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1183 (if (not max)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1184 (if (> colincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1185 ;;Trying to insert a nonexistent column
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1186 (setq max (ses-create-cell-symbol (car maxrowcol)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1187 (1- ses--numcols)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1188 ;;End of range is being deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1189 (setq max (ses-create-cell-symbol (car maxrowcol) (1- startcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1190 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1191 (and (> colincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1192 (= (cdr maxrowcol) (1- startcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1193 (= (car minrowcol) (car maxrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1194 ;;Insert after ending column of horizontal range - include it
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1195 (setq max (ses-create-cell-symbol (car maxrowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1196 (+ startcol colincr -1)))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1197 (when range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1198 (if (/= (- (funcall field maxrowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1199 (funcall field minrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1200 (- (funcall field (ses-sym-rowcol max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1201 (funcall field (ses-sym-rowcol min))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1202 ;;This range has changed size
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1203 (setq ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1204 (list 'ses-range min max))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1205
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1206 (defun ses-relocate-all (minrow mincol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1207 "Alter all cell values, symbols, formulas, and reference-lists to relocate
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1208 the rectangle (MINROW,MINCOL)..(NUMROWS,NUMCOLS) by adding ROWINCR and COLINCR
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1209 to each symbol."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1210 (let (reform)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1211 (let (mycell newval)
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1212 (dotimes-with-progress-reporter
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1213 (row ses--numrows) "Relocating formulas..."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1214 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1215 (setq ses-relocate-return nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1216 mycell (ses-get-cell row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1217 newval (ses-relocate-formula (ses-cell-formula mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1218 minrow mincol rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1219 (ses-set-cell row col 'formula newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1220 (if (eq ses-relocate-return 'range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1221 ;;This cell contains a (ses-range X Y) where a cell has been
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1222 ;;inserted or deleted in the middle of the range.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1223 (push (cons row col) reform))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1224 (if ses-relocate-return
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1225 ;;This cell referred to a cell that's been deleted or is no
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1226 ;;longer part of the range. We can't fix that now because
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1227 ;;reference lists cells have been partially updated.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1228 (add-to-list 'ses--deferred-recalc
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1229 (ses-create-cell-symbol row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1230 (setq newval (ses-relocate-formula (ses-cell-references mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1231 minrow mincol rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1232 (ses-set-cell row col 'references newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1233 (and (>= row minrow) (>= col mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1234 (ses-set-cell row col 'symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1235 (ses-create-cell-symbol row col))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1236 ;;Relocate the cell values
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1237 (let (oldval myrow mycol xrow xcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1238 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1239 ((and (<= rowincr 0) (<= colincr 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1240 ;;Deletion of rows and/or columns
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1241 (dotimes-with-progress-reporter
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1242 (row (- ses--numrows minrow)) "Relocating variables..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1243 (setq myrow (+ row minrow))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1244 (dotimes (col (- ses--numcols mincol))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1245 (setq mycol (+ col mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1246 xrow (- myrow rowincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1247 xcol (- mycol colincr))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1248 (if (and (< xrow ses--numrows) (< xcol ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1249 (setq oldval (ses-cell-value xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1250 ;;Cell is off the end of the array
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1251 (setq oldval (symbol-value (ses-create-cell-symbol xrow xcol))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1252 (ses-set-cell myrow mycol 'value oldval))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1253 ((and (wholenump rowincr) (wholenump colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1254 ;;Insertion of rows and/or columns. Run the loop backwards.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1255 (let ((disty (1- ses--numrows))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1256 (distx (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1257 myrow mycol)
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1258 (dotimes-with-progress-reporter
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1259 (row (- ses--numrows minrow)) "Relocating variables..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1260 (setq myrow (- disty row))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1261 (dotimes (col (- ses--numcols mincol))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1262 (setq mycol (- distx col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1263 xrow (- myrow rowincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1264 xcol (- mycol colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1265 (if (or (< xrow minrow) (< xcol mincol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1266 ;;Newly-inserted value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1267 (setq oldval nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1268 ;;Transfer old value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1269 (setq oldval (ses-cell-value xrow xcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1270 (ses-set-cell myrow mycol 'value oldval)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1271 t)) ;Make testcover happy by returning non-nil here
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1272 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1273 (error "ROWINCR and COLINCR must have the same sign"))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1274 ;;Reconstruct reference lists for cells that contain ses-ranges that
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1275 ;;have changed size.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1276 (when reform
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1277 (message "Fixing ses-ranges...")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1278 (let (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1279 (setq ses-start-time (float-time))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1280 (while reform
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1281 (ses-time-check "Fixing ses-ranges... (%d left)" '(length reform))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1282 (setq row (caar reform)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1283 col (cdar reform)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1284 reform (cdr reform))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1285 (ses-cell-set-formula row col (ses-cell-formula row col))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1286 (message nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1287
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1288
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1289 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1290 ;; Undo control
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1291 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1292
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1293 (defun ses-begin-change ()
59787
bc504fb813e7 (undo-more): defadvice deleted.
Richard M. Stallman <rms@gnu.org>
parents: 59649
diff changeset
1294 "For undo, remember point before we start changing hidden stuff."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1295 (let ((inhibit-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1296 (insert-and-inherit "X")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1297 (delete-region (1- (point)) (point))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1298
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1299 (defun ses-set-with-undo (sym newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1300 "Like set, but undoable. Result is t if value has changed."
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1301 ;;We try to avoid adding redundant entries to the undo list, but this is
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1302 ;;unavoidable for strings because equal ignores text properties and there's
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1303 ;;no easy way to get the whole property list to see if it's different!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1304 (unless (and (boundp sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1305 (equal (symbol-value sym) newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1306 (not (stringp newval)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1307 (push (if (boundp sym)
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
1308 `(apply ses-set-with-undo ,sym ,(symbol-value sym))
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
1309 `(apply ses-unset-with-undo ,sym))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1310 buffer-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1311 (set sym newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1312 t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1313
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1314 (defun ses-unset-with-undo (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1315 "Set SYM to be unbound. This is undoable."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1316 (when (1value (boundp sym)) ;;Always bound, except after a programming error
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
1317 (push `(apply ses-set-with-undo ,sym ,(symbol-value sym)) buffer-undo-list)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1318 (makunbound sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1319
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1320 (defun ses-aset-with-undo (array idx newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1321 "Like aset, but undoable. Result is t if element has changed"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1322 (unless (equal (aref array idx) newval)
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
1323 (push `(apply ses-aset-with-undo ,array ,idx ,(aref array idx)) buffer-undo-list)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1324 (aset array idx newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1325 t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1326
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1327
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1328 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1329 ;; Startup for major mode
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1330 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1331
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1332 (defun ses-load ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1333 "Parse the current buffer and sets up buffer-local variables. Does not
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1334 execute cell formulas or print functions."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1335 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1336 ;;Read our global parameters, which should be a 3-element list
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1337 (goto-char (point-max))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1338 (search-backward ";; Local Variables:\n" nil t)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1339 (backward-list 1)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1340 (let ((params (condition-case nil (read (current-buffer)) (error nil))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1341 (or (and (= (safe-length params) 3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1342 (numberp (car params))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1343 (numberp (cadr params))
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1344 (>= (cadr params) 0)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1345 (numberp (nth 2 params))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1346 (> (nth 2 params) 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1347 (error "Invalid SES file"))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1348 (setq ses--file-format (car params)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1349 ses--numrows (cadr params)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1350 ses--numcols (nth 2 params))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1351 (when (= ses--file-format 1)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1352 (let (buffer-undo-list) ;This is not undoable
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1353 (ses-goto-data 'ses--header-row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1354 (insert "(ses-header-row 0)\n")
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1355 (ses-set-parameter 'ses--file-format 2)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1356 (message "Upgrading from SES-1 file format")))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1357 (or (= ses--file-format 2)
63422
6c01c7e3e74f (ses-load): Follow error conventions.
Juanma Barranquero <lekktu@gmail.com>
parents: 62738
diff changeset
1358 (error "This file needs a newer version of the SES library code"))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1359 (ses-create-cell-variable-range 0 (1- ses--numrows) 0 (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1360 ;;Initialize cell array
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1361 (setq ses--cells (make-vector ses--numrows nil))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1362 (dotimes (row ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1363 (aset ses--cells row (make-vector ses--numcols nil))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1364 ;;Skip over print area, which we assume is correct
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1365 (goto-char (point-min))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1366 (forward-line ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1367 (or (looking-at ses-print-data-boundary)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1368 (error "Missing marker between print and data areas"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1369 (forward-char (length ses-print-data-boundary))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1370 ;;Initialize printer and symbol lists
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1371 (mapc 'ses-printer-record ses-standard-printer-functions)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1372 (setq ses--symbolic-formulas nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1373 ;;Load cell definitions
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1374 (dotimes (row ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1375 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1376 (let* ((x (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1377 (rowcol (ses-sym-rowcol (car-safe (cdr-safe x)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1378 (or (and (looking-at "\n")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1379 (eq (car-safe x) 'ses-cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1380 (eq row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1381 (eq col (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1382 (error "Cell-def error"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1383 (eval x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1384 (or (looking-at "\n\n")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1385 (error "Missing blank line between rows")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1386 ;;Load global parameters
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1387 (let ((widths (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1388 (n1 (char-after (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1389 (printers (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1390 (n2 (char-after (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1391 (def-printer (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1392 (n3 (char-after (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1393 (head-row (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1394 (n4 (char-after (point))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1395 (or (and (eq (car-safe widths) 'ses-column-widths)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1396 (= n1 ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1397 (eq (car-safe printers) 'ses-column-printers)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1398 (= n2 ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1399 (eq (car-safe def-printer) 'ses-default-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1400 (= n3 ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1401 (eq (car-safe head-row) 'ses-header-row)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1402 (= n4 ?\n))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1403 (error "Invalid SES global parameters"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1404 (1value (eval widths))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1405 (1value (eval def-printer))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1406 (1value (eval printers))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1407 (1value (eval head-row)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1408 ;;Should be back at global-params
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1409 (forward-char 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1410 (or (looking-at (replace-regexp-in-string "1" "[0-9]+"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1411 ses-initial-global-parameters))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1412 (error "Problem with column-defs or global-params"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1413 ;;Check for overall newline count in definitions area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1414 (forward-line 3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1415 (let ((start (point)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1416 (ses-goto-data 'ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1417 (or (= (point) start)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1418 (error "Extraneous newlines someplace?"))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1419
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1420 (defun ses-setup ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1421 "Set up for display of only the printed cell values.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1422
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1423 Narrows the buffer to show only the print area. Gives it `read-only' and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1424 `intangible' properties. Sets up highlighting for current cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1425 (interactive)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1426 (let ((end (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1427 (inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1428 (was-modified (buffer-modified-p))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1429 pos sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1430 (ses-goto-data 0 0) ;;Include marker between print-area and data-area
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1431 (set-text-properties (point) (point-max) nil) ;Delete garbage props
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1432 (mapc 'delete-overlay (overlays-in (point-min) (point-max)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1433 ;;The print area is read-only (except for our special commands) and uses a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1434 ;;special keymap.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1435 (put-text-property (point-min) (1- (point)) 'read-only 'ses)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1436 (put-text-property (point-min) (1- (point)) 'keymap 'ses-mode-print-map)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1437 ;;For the beginning of the buffer, we want the read-only and keymap
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1438 ;;attributes to be inherited from the first character
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1439 (put-text-property (point-min) (1+ (point-min)) 'front-sticky t)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1440 ;;Create intangible properties, which also indicate which cell the text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1441 ;;came from.
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1442 (dotimes-with-progress-reporter (row ses--numrows) "Finding cells..."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1443 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1444 (setq pos end
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1445 sym (ses-cell-symbol row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1446 ;;Include skipped cells following this one
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1447 (while (and (< col (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1448 (eq (ses-cell-value row (1+ col)) '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1449 (setq end (+ end (ses-col-width col) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1450 col (1+ col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1451 (setq end (+ end (ses-col-width col) 1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1452 (put-text-property pos end 'intangible sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1453 ;;Adding these properties did not actually alter the text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1454 (unless was-modified
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1455 (restore-buffer-modified-p nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1456 (buffer-disable-undo)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1457 (buffer-enable-undo)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1458 ;;Create the underlining overlay. It's impossible for (point) to be 2,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1459 ;;because column A must be at least 1 column wide.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1460 (setq ses--curcell-overlay (make-overlay (1+ (point-min)) (1+ (point-min))))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1461 (overlay-put ses--curcell-overlay 'face 'underline))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1462
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1463 (defun ses-cleanup ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1464 "Cleanup when changing a buffer from SES mode to something else. Delete
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1465 overlay, remove special text properties."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1466 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1467 (let ((inhibit-read-only t)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1468 (was-modified (buffer-modified-p)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1469 ;;Delete read-only, keymap, and intangible properties
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1470 (set-text-properties (point-min) (point-max) nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1471 ;;Delete overlay
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1472 (mapc 'delete-overlay (overlays-in (point-min) (point-max)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1473 (unless was-modified
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1474 (set-buffer-modified-p nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1475
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1476 ;;;###autoload
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1477 (defun ses-mode ()
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1478 "Major mode for Simple Emacs Spreadsheet.
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1479 See \"ses-example.ses\" (in the etc data directory) for more info.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1480
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1481 Key definitions:
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1482 \\{ses-mode-map}
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1483 These key definitions are active only in the print area (the visible part):
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1484 \\{ses-mode-print-map}
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1485 These are active only in the minibuffer, when entering or editing a formula:
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1486 \\{ses-mode-edit-map}"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1487 (interactive)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1488 (unless (and (boundp 'ses--deferred-narrow)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1489 (eq ses--deferred-narrow 'ses-mode))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1490 (kill-all-local-variables)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1491 (mapc 'make-local-variable ses-localvars)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1492 (setq major-mode 'ses-mode
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1493 mode-name "SES"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1494 next-line-add-newlines nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1495 truncate-lines t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1496 ;;SES deliberately puts lots of trailing whitespace in its buffer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1497 show-trailing-whitespace nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1498 ;;Cell ranges do not work reasonably without this
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1499 transient-mark-mode t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1500 (1value (add-hook 'change-major-mode-hook 'ses-cleanup nil t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1501 (1value (add-hook 'before-revert-hook 'ses-cleanup nil t))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1502 (setq ses--curcell nil
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1503 ses--deferred-recalc nil
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1504 ses--deferred-write nil
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1505 ses--header-hscroll -1 ;Flag for "initial recalc needed"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1506 header-line-format '(:eval (progn
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1507 (when (/= (window-hscroll)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1508 ses--header-hscroll)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1509 ;;Reset ses--header-hscroll first, to
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1510 ;;avoid recursion problems when
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1511 ;;debugging ses-create-header-string
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1512 (setq ses--header-hscroll
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1513 (window-hscroll))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1514 (ses-create-header-string))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1515 ses--header-string)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1516 (let ((was-empty (zerop (buffer-size)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1517 (was-modified (buffer-modified-p)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1518 (save-excursion
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1519 (if was-empty
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1520 ;;Initialize buffer to contain one cell, for now
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1521 (insert ses-initial-file-contents))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1522 (ses-load)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1523 (ses-setup))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1524 (when was-empty
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1525 (unless (equal ses-initial-default-printer (1value ses--default-printer))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1526 (1value (ses-read-default-printer ses-initial-default-printer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1527 (unless (= ses-initial-column-width (1value (ses-col-width 0)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1528 (1value (ses-set-column-width 0 ses-initial-column-width)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1529 (ses-set-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1530 (if (> (car ses-initial-size) (1value ses--numrows))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1531 (1value (ses-insert-row (1- (car ses-initial-size)))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1532 (if (> (cdr ses-initial-size) (1value ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1533 (1value (ses-insert-column (1- (cdr ses-initial-size)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1534 (ses-write-cells)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1535 (restore-buffer-modified-p was-modified)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1536 (buffer-disable-undo)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1537 (buffer-enable-undo)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1538 (goto-char (point-min))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1539 (use-local-map ses-mode-map)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1540 ;;Set the deferred narrowing flag (we can't narrow until after
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1541 ;;after-find-file completes). If .ses is on the auto-load alist and the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1542 ;;file has "mode: ses", our ses-mode function will be called twice! Use
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1543 ;;a special flag to detect this (will be reset by ses-command-hook).
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1544 ;;For find-alternate-file, post-command-hook doesn't get run for some
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1545 ;;reason, so use an idle timer to make sure.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1546 (setq ses--deferred-narrow 'ses-mode)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1547 (1value (add-hook 'post-command-hook 'ses-command-hook nil t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1548 (run-with-idle-timer 0.01 nil 'ses-command-hook)
62738
d3fe76043df3 (ses-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 60179
diff changeset
1549 (run-mode-hooks 'ses-mode-hook)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1550
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1551 (put 'ses-mode 'mode-class 'special)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1552
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1553 (defun ses-command-hook ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1554 "Invoked from `post-command-hook'. If point has moved to a different cell,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1555 moves the underlining overlay. Performs any recalculations or cell-data
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1556 writes that have been deferred. If buffer-narrowing has been deferred,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1557 narrows the buffer now."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1558 (condition-case err
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1559 (when (eq major-mode 'ses-mode) ;Otherwise, not our buffer anymore
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1560 (when ses--deferred-recalc
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1561 ;;We reset the deferred list before starting on the recalc -- in case
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1562 ;;of error, we don't want to retry the recalc after every keystroke!
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1563 (let ((old ses--deferred-recalc))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1564 (setq ses--deferred-recalc nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1565 (ses-update-cells old)))
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1566 (when ses--deferred-write
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1567 ;;We don't reset the deferred list before starting -- the most
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1568 ;;likely error is keyboard-quit, and we do want to keep trying
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1569 ;;these writes after a quit.
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1570 (ses-write-cells)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1571 (push '(apply ses-widen) buffer-undo-list))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1572 (when ses--deferred-narrow
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1573 ;;We're not allowed to narrow the buffer until after-find-file has
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1574 ;;read the local variables at the end of the file. Now it's safe to
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1575 ;;do the narrowing.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1576 (save-excursion
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1577 (goto-char (point-min))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1578 (forward-line ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1579 (narrow-to-region (point-min) (point)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1580 (setq ses--deferred-narrow nil))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1581 ;;Update the modeline
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1582 (let ((oldcell ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1583 (ses-set-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1584 (unless (eq ses--curcell oldcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1585 (cond
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1586 ((not ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1587 (setq mode-line-process nil))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1588 ((atom ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1589 (setq mode-line-process (list " cell "
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1590 (symbol-name ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1591 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1592 (setq mode-line-process (list " range "
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1593 (symbol-name (car ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1594 "-"
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1595 (symbol-name (cdr ses--curcell))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1596 (force-mode-line-update)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1597 ;;Use underline overlay for single-cells only, turn off otherwise
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1598 (if (listp ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1599 (move-overlay ses--curcell-overlay 2 2)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1600 (let ((next (next-single-property-change (point) 'intangible)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1601 (move-overlay ses--curcell-overlay (point) (1- next))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1602 (when (not (pos-visible-in-window-p))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1603 ;;Scrolling will happen later
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1604 (run-with-idle-timer 0.01 nil 'ses-command-hook)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1605 (setq ses--curcell t)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1606 ;;Prevent errors in this post-command-hook from silently erasing the hook!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1607 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1608 (unless executing-kbd-macro
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1609 (ding))
65582
4d1085b02d64 Message format spec fixes (1)
Deepak Goel <deego@gnufans.org>
parents: 64762
diff changeset
1610 (message "%s" (error-message-string err))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1611 nil) ;Make coverage-tester happy
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1612
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1613 (defun ses-create-header-string ()
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1614 "Set up `ses--header-string' as the buffer's header line.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1615 Based on the current set of columns and `window-hscroll' position."
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1616 (let ((totwidth (- (window-hscroll)))
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1617 result width x)
49573
3261228348b4 Fix header-line when scrollbar is on left and/or fringe isn't one char wide.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 47667
diff changeset
1618 ;;Leave room for the left-side fringe and scrollbar
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1619 (push (propertize " " 'display '((space :align-to 0))) result)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1620 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1621 (setq width (ses-col-width col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1622 totwidth (+ totwidth width 1))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1623 (if (= totwidth 1)
49573
3261228348b4 Fix header-line when scrollbar is on left and/or fringe isn't one char wide.
Jonathan Yavner <jyavner@member.fsf.org>
parents: 47667
diff changeset
1624 ;;Scrolled so intercolumn space is leftmost
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1625 (push " " result))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1626 (when (> totwidth 1)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1627 (if (> ses--header-row 0)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1628 (save-excursion
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1629 (ses-goto-print (1- ses--header-row) col)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1630 (setq x (buffer-substring-no-properties (point)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1631 (+ (point) width)))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1632 ;; Strip trailing space.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1633 (if (string-match "[ \t]+\\'" x)
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1634 (setq x (substring x 0 (match-beginning 0))))
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1635 ;; Cut off excess text.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1636 (if (>= (length x) totwidth)
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1637 (setq x (substring x 0 (- totwidth -1)))))
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1638 (setq x (ses-column-letter col)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1639 (push (propertize x 'face ses-box-prop) result)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1640 (push (propertize "."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1641 'display `((space :align-to ,(1- totwidth)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1642 'face ses-box-prop)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1643 result)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1644 ;;Allow the following space to be squished to make room for the 3-D box
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1645 ;;Coverage test ignores properties, thinks this is always a space!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1646 (push (1value (propertize " " 'display `((space :align-to ,totwidth))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1647 result)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1648 (if (> ses--header-row 0)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1649 (push (propertize (format " [row %d]" ses--header-row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1650 'display '((height (- 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1651 result))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1652 (setq ses--header-string (apply 'concat (nreverse result)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1653
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1654
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1655 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1656 ;; Redisplay and recalculation
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1657 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1658
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1659 (defun ses-jump (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1660 "Move point to cell SYM."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1661 (interactive "SJump to cell: ")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1662 (let ((rowcol (ses-sym-rowcol sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1663 (or rowcol (error "Invalid cell name"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1664 (if (eq (symbol-value sym) '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1665 (error "Cell is covered by preceding cell"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1666 (ses-goto-print (car rowcol) (cdr rowcol))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1668 (defun ses-jump-safe (cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1669 "Like `ses-jump', but no error if invalid cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1670 (condition-case nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1671 (ses-jump cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1672 (error)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1673
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1674 (defun ses-reprint-all (&optional nonarrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1675 "Recreate the display area. Calls all printer functions. Narrows to
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1676 print area if NONARROW is nil."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1677 (interactive "*P")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1678 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1679 (unless nonarrow
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1680 (setq ses--deferred-narrow t))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1681 (let ((startcell (get-text-property (point) 'intangible))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1682 (inhibit-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1683 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1684 (goto-char (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1685 (search-forward ses-print-data-boundary)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1686 (backward-char (length ses-print-data-boundary))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1687 (delete-region (point-min) (point))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1688 ;;Insert all blank lines before printing anything, so ses-print-cell can
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1689 ;;find the data area when inserting or deleting *skip* values for cells
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1690 (dotimes (row ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1691 (insert-and-inherit ses--blank-line))
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1692 (dotimes-with-progress-reporter (row ses--numrows) "Reprinting..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1693 (if (eq (ses-cell-value row 0) '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1694 ;;Column deletion left a dangling skip
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1695 (ses-set-cell row 0 'value nil))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1696 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1697 (ses-print-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1698 (beginning-of-line 2))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1699 (ses-jump-safe startcell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1700
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1701 (defun ses-recalculate-cell ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1702 "Recalculate and reprint the current cell or range.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1703
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1704 For an individual cell, shows the error if the formula or printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1705 signals one, or otherwise shows the cell's complete value. For a range, the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1706 cells are recalculated in \"natural\" order, so cells that other cells refer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1707 to are recalculated first."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1708 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1709 (ses-check-curcell 'range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1710 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1711 (let (sig)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1712 (setq ses-start-time (float-time))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1713 (if (atom ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1714 (setq sig (ses-sym-rowcol ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1715 sig (ses-calculate-cell (car sig) (cdr sig) t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1716 ;;First, recalculate all cells that don't refer to other cells and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1717 ;;produce a list of cells with references.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1718 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1719 (ses-time-check "Recalculating... %s" '(ses-cell-symbol row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1720 (condition-case nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1721 (progn
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1722 ;;The t causes an error if the cell has references.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1723 ;;If no references, the t will be the result value.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1724 (1value (ses-formula-references (ses-cell-formula row col) t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1725 (setq sig (ses-calculate-cell row col t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1726 (wrong-type-argument
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1727 ;;The formula contains a reference
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1728 (add-to-list 'ses--deferred-recalc (ses-cell-symbol row col))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1729 ;;Do the update now, so we can force recalculation
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1730 (let ((x ses--deferred-recalc))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1731 (setq ses--deferred-recalc nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1732 (condition-case hold
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1733 (ses-update-cells x t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1734 (error (setq sig hold))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1735 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1736 (sig
65582
4d1085b02d64 Message format spec fixes (1)
Deepak Goel <deego@gnufans.org>
parents: 64762
diff changeset
1737 (message "%s" (error-message-string sig)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1738 ((consp ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1739 (message " "))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1740 (t
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1741 (princ (symbol-value ses--curcell))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1742
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1743 (defun ses-recalculate-all ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1744 "Recalculate and reprint all cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1745 (interactive "*")
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1746 (let ((startcell (get-text-property (point) 'intangible))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1747 (ses--curcell (cons 'A1 (ses-cell-symbol (1- ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1748 (1- ses--numcols)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1749 (ses-recalculate-cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1750 (ses-jump-safe startcell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1751
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1752 (defun ses-truncate-cell ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1753 "Reprint current cell, but without spillover into any following blank
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1754 cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1755 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1756 (ses-check-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1757 (let* ((rowcol (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1758 (row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1759 (col (cdr rowcol)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1760 (when (and (< col (1- ses--numcols)) ;;Last column can't spill over, anyway
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1761 (eq (ses-cell-value row (1+ col)) '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1762 ;;This cell has spill-over. We'll momentarily pretend the following
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1763 ;;cell has a `t' in it.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1764 (eval `(let ((,(ses-cell-symbol row (1+ col)) t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1765 (ses-print-cell row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1766 ;;Now remove the *skip*. ses-print-cell is always nil here
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1767 (ses-set-cell row (1+ col) 'value nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1768 (1value (ses-print-cell row (1+ col))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1769
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1770 (defun ses-reconstruct-all ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1771 "Reconstruct buffer based on cell data stored in Emacs variables."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1772 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1773 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1774 ;;Reconstruct reference lists.
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1775 (let (x yrow ycol)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1776 ;;Delete old reference lists
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1777 (dotimes-with-progress-reporter
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1778 (row ses--numrows) "Deleting references..."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1779 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1780 (ses-set-cell row col 'references nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1781 ;;Create new reference lists
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1782 (dotimes-with-progress-reporter
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
1783 (row ses--numrows) "Computing references..."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1784 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1785 (dolist (ref (ses-formula-references (ses-cell-formula row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1786 (setq x (ses-sym-rowcol ref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1787 yrow (car x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1788 ycol (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1789 (ses-set-cell yrow ycol 'references
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1790 (cons (ses-cell-symbol row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1791 (ses-cell-references yrow ycol)))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1792 ;;Delete everything and reconstruct basic data area
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1793 (ses-widen)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1794 (let ((inhibit-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1795 (goto-char (point-max))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1796 (if (search-backward ";; Local Variables:\n" nil t)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1797 (delete-region (point-min) (point))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1798 ;;Buffer is quite screwed up - can't even save the user-specified locals
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1799 (delete-region (point-min) (point-max))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1800 (insert ses-initial-file-trailer)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1801 (goto-char (point-min)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1802 ;;Create a blank display area
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1803 (dotimes (row ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1804 (insert ses--blank-line))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1805 (insert ses-print-data-boundary)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1806 ;;Placeholders for cell data
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1807 (insert (make-string (* ses--numrows (1+ ses--numcols)) ?\n))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1808 ;;Placeholders for col-widths, col-printers, default-printer, header-row
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1809 (insert "\n\n\n\n")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1810 (insert ses-initial-global-parameters))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1811 (ses-set-parameter 'ses--col-widths ses--col-widths)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1812 (ses-set-parameter 'ses--col-printers ses--col-printers)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1813 (ses-set-parameter 'ses--default-printer ses--default-printer)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1814 (ses-set-parameter 'ses--header-row ses--header-row)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1815 (ses-set-parameter 'ses--numrows ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1816 (ses-set-parameter 'ses--numcols ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1817 ;;Keep our old narrowing
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1818 (ses-setup)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1819 (ses-recalculate-all)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1820 (goto-char (point-min)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1821
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1822
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1823 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1824 ;; Input of cell formulas
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1825 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1826
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1827 (defun ses-edit-cell (row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1828 "Display current cell contents in minibuffer, for editing. Returns nil if
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1829 cell formula was unsafe and user declined confirmation."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1830 (interactive
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1831 (progn
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1832 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1833 (ses-check-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1834 (let* ((rowcol (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1835 (row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1836 (col (cdr rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1837 (formula (ses-cell-formula row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1838 initial)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1839 (if (eq (car-safe formula) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1840 (setq formula (cadr formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1841 (if (eq (car-safe formula) 'quote)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1842 (setq initial (format "'%S" (cadr formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1843 (setq initial (prin1-to-string formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1844 (if (stringp formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1845 ;;Position cursor inside close-quote
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1846 (setq initial (cons initial (length initial))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1847 (list row col
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1848 (read-from-minibuffer (format "Cell %s: " ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1849 initial
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1850 ses-mode-edit-map
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1851 t ;Convert to Lisp object
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1852 'ses-read-cell-history)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1853 (when (ses-warn-unsafe newval 'unsafep)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1854 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1855 (ses-cell-set-formula row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1856 t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1857
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1858 (defun ses-read-cell (row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1859 "Self-insert for initial character of cell function."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1860 (interactive
68359
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1861 (let* ((initial (this-command-keys))
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1862 (rowcol (progn (ses-check-curcell) (ses-sym-rowcol ses--curcell)))
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1863 (curval (ses-cell-formula (car rowcol) (cdr rowcol))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1864 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1865 (list (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1866 (cdr rowcol)
68359
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1867 (read-from-minibuffer
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1868 (format "Cell %s: " ses--curcell)
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1869 (cons (if (equal initial "\"") "\"\""
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1870 (if (equal initial "(") "()" initial)) 2)
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1871 ses-mode-edit-map
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1872 t ;Convert to Lisp object
b9aec3e50e4f (ses-read-cell): Provide a default value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65689
diff changeset
1873 'ses-read-cell-history
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1874 (prin1-to-string (if (eq (car-safe curval) 'ses-safe-formula)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1875 (cadr curval)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
1876 curval))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1877 (when (ses-edit-cell row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1878 (ses-command-hook) ;Update cell widths before movement
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1879 (dolist (x ses-after-entry-functions)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1880 (funcall x 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1881
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1882 (defun ses-read-symbol (row col symb)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1883 "Self-insert for a symbol as a cell formula. The set of all symbols that
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1884 have been used as formulas in this spreadsheet is available for completions."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1885 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1886 (let ((rowcol (progn (ses-check-curcell) (ses-sym-rowcol ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1887 newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1888 (barf-if-buffer-read-only)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1889 (setq newval (completing-read (format "Cell %s ': " ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1890 ses--symbolic-formulas))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1891 (list (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1892 (cdr rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1893 (if (string= newval "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1894 nil ;Don't create zero-length symbols!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1895 (list 'quote (intern newval))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1896 (when (ses-edit-cell row col symb)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1897 (ses-command-hook) ;Update cell widths before movement
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1898 (dolist (x ses-after-entry-functions)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1899 (funcall x 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1900
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1901 (defun ses-clear-cell-forward (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1902 "Delete formula and printer for current cell and then move to next cell.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1903 With prefix, deletes several cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1904 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1905 (if (< count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1906 (1value (ses-clear-cell-backward (- count)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1907 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1908 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1909 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1910 (ses-set-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1911 (let ((rowcol (ses-sym-rowcol ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1912 (or rowcol (signal 'end-of-buffer nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1913 (ses-clear-cell (car rowcol) (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1914 (forward-char 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1915
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1916 (defun ses-clear-cell-backward (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1917 "Move to previous cell and then delete it. With prefix, deletes several
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1918 cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1919 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1920 (if (< count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1921 (1value (ses-clear-cell-forward (- count)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1922 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1923 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1924 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1925 (backward-char 1) ;Will signal 'beginning-of-buffer if appropriate
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1926 (ses-set-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1927 (let ((rowcol (ses-sym-rowcol ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1928 (ses-clear-cell (car rowcol) (cdr rowcol))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1929
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1930
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1931 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1932 ;; Input of cell-printer functions
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1933 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1934
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1935 (defun ses-read-printer (prompt default)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1936 "Common code for `ses-read-cell-printer', `ses-read-column-printer', and `ses-read-default-printer'.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1937 PROMPT should end with \": \". Result is t if operation was cancelled."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1938 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1939 (if (eq default t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1940 (setq default "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1941 (setq prompt (format "%s [currently %S]: "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1942 (substring prompt 0 -2)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1943 default)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1944 (let ((new (read-from-minibuffer prompt
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1945 nil ;Initial contents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1946 ses-mode-edit-map
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1947 t ;Evaluate the result
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1948 'ses-read-printer-history
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1949 (prin1-to-string default))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1950 (if (equal new default)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1951 ;;User changed mind, decided not to change printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1952 (setq new t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1953 (ses-printer-validate new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1954 (or (not new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1955 (stringp new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1956 (stringp (car-safe new))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1957 (ses-warn-unsafe new 'unsafep-function)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1958 (setq new t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1959 new))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1960
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1961 (defun ses-read-cell-printer (newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1962 "Set the printer function for the current cell or range.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1963
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1964 A printer function is either a string (a format control-string with one
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1965 %-sequence -- result from format will be right-justified), or a list of one
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1966 string (result from format will be left-justified), or a lambda-expression of
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1967 one argument, or a symbol that names a function of one argument. In the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1968 latter two cases, the function's result should be either a string (will be
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1969 right-justified) or a list of one string (will be left-justified)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1970 (interactive
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1971 (let ((default t)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1972 x)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1973 (ses-check-curcell 'range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1974 ;;Default is none if not all cells in range have same printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1975 (catch 'ses-read-cell-printer
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1976 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1977 (setq x (ses-cell-printer row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1978 (if (eq (car-safe x) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1979 (setq x (cadr x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1980 (if (eq default t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1981 (setq default x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1982 (unless (equal default x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1983 ;;Range contains differing printer functions
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1984 (setq default t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1985 (throw 'ses-read-cell-printer t)))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1986 (list (ses-read-printer (format "Cell %S printer: " ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1987 default))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1988 (unless (eq newval t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1989 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1990 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1991 (ses-set-cell row col 'printer newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1992 (ses-print-cell row col))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1993
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1994 (defun ses-read-column-printer (col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1995 "Set the printer function for the current column. See
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1996 `ses-read-cell-printer' for input forms."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1997 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1998 (let ((col (cdr (ses-sym-rowcol ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1999 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2000 (list col (ses-read-printer (format "Column %s printer: "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2001 (ses-column-letter col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2002 (ses-col-printer col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2003
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2004 (unless (eq newval t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2005 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2006 (ses-set-parameter 'ses--col-printers newval col)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2007 (save-excursion
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2008 (dotimes (row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2009 (ses-print-cell row col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2010
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2011 (defun ses-read-default-printer (newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2012 "Set the default printer function for cells that have no other. See
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2013 `ses-read-cell-printer' for input forms."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2014 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2015 (list (ses-read-printer "Default printer: " ses--default-printer)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2016 (unless (eq newval t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2017 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2018 (ses-set-parameter 'ses--default-printer newval)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2019 (ses-reprint-all t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2020
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2021
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2022 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2023 ;; Spreadsheet size adjustments
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2024 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2025
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2026 (defun ses-insert-row (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2027 "Insert a new row before the current one. With prefix, insert COUNT rows
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2028 before current one."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2029 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2030 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2031 (or (> count 0) (signal 'args-out-of-range nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2032 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2033 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2034 (inhibit-read-only t)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2035 (row (or (car (ses-sym-rowcol ses--curcell)) ses--numrows))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2036 newrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2037 ;;Create a new set of cell-variables
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2038 (ses-create-cell-variable-range ses--numrows (+ ses--numrows count -1)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2039 0 (1- ses--numcols))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2040 (ses-set-parameter 'ses--numrows (+ ses--numrows count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2041 ;;Insert each row
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2042 (ses-goto-print row 0)
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
2043 (dotimes-with-progress-reporter (x count) "Inserting row..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2044 ;;Create a row of empty cells. The `symbol' fields will be set by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2045 ;;the call to ses-relocate-all.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2046 (setq newrow (make-vector ses--numcols nil))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2047 (dotimes (col ses--numcols)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2048 (aset newrow col (ses-make-cell)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2049 (setq ses--cells (ses-vector-insert ses--cells row newrow))
59834
33c7409ff736 (ses-create-cell-variable-range)
Kim F. Storm <storm@cua.dk>
parents: 59787
diff changeset
2050 (push `(apply ses-vector-delete ses--cells ,row 1) buffer-undo-list)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2051 (insert ses--blank-line))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2052 ;;Insert empty lines in cell data area (will be replaced by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2053 ;;ses-relocate-all)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2054 (ses-goto-data row 0)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2055 (insert (make-string (* (1+ ses--numcols) count) ?\n))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2056 (ses-relocate-all row 0 count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2057 ;;If any cell printers insert constant text, insert that text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2058 ;;into the line.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2059 (let ((cols (mapconcat #'ses-call-printer ses--col-printers nil))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2060 (global (ses-call-printer ses--default-printer)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2061 (if (or (> (length cols) 0) (> (length global) 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2062 (dotimes (x count)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2063 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2064 ;;These cells are always nil, only constant formatting printed
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2065 (1value (ses-print-cell (+ x row) col))))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2066 (when (> ses--header-row row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2067 ;;Inserting before header
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2068 (ses-set-parameter 'ses--header-row (+ ses--header-row count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2069 (ses-reset-header-string)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2070 ;;Reconstruct text attributes
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2071 (ses-setup)
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2072 ;;Prepare for undo
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2073 (push '(apply ses-widen) buffer-undo-list)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2074 ;;Return to current cell
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2075 (if ses--curcell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2076 (ses-jump-safe ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2077 (ses-goto-print (1- ses--numrows) 0)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2078
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2079 (defun ses-delete-row (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2080 "Delete the current row. With prefix, Deletes COUNT rows starting from the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2081 current one."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2082 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2083 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2084 (or (> count 0) (signal 'args-out-of-range nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2085 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2086 (inhibit-read-only t)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2087 (row (car (ses-sym-rowcol ses--curcell))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2088 (setq count (min count (- ses--numrows row)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2089 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2090 (ses-set-parameter 'ses--numrows (- ses--numrows count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2091 ;;Delete lines from print area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2092 (ses-goto-print row 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2093 (ses-delete-line count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2094 ;;Delete lines from cell data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2095 (ses-goto-data row 0)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2096 (ses-delete-line (* count (1+ ses--numcols)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2097 ;;Relocate variables and formulas
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2098 (ses-set-with-undo 'ses--cells (ses-vector-delete ses--cells row count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2099 (ses-relocate-all row 0 (- count) 0)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2100 (ses-destroy-cell-variable-range ses--numrows (+ ses--numrows count -1)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2101 0 (1- ses--numcols))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2102 (when (> ses--header-row row)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2103 (if (<= ses--header-row (+ row count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2104 ;;Deleting the header row
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2105 (ses-set-parameter 'ses--header-row 0)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2106 (ses-set-parameter 'ses--header-row (- ses--header-row count)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2107 (ses-reset-header-string)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2108 ;;Reconstruct attributes
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2109 (ses-setup)
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2110 ;;Prepare for undo
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2111 (push '(apply ses-widen) buffer-undo-list)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2112 (ses-jump-safe ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2113
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2114 (defun ses-insert-column (count &optional col width printer)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2115 "Insert a new column before COL (default is the current one).
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2116 With prefix, insert COUNT columns before current one.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2117 If COL is specified, the new column(s) get the specified WIDTH and PRINTER
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2118 \(otherwise they're taken from the current column)."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2119 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2120 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2121 (or (> count 0) (signal 'args-out-of-range nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2122 (or col
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2123 (setq col (cdr (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2124 width (ses-col-width col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2125 printer (ses-col-printer col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2126 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2127 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2128 (inhibit-read-only t)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2129 (widths ses--col-widths)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2130 (printers ses--col-printers)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2131 has-skip)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2132 ;;Create a new set of cell-variables
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2133 (ses-create-cell-variable-range 0 (1- ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2134 ses--numcols (+ ses--numcols count -1))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2135 ;;Insert each column.
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
2136 (dotimes-with-progress-reporter (x count) "Inserting column..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2137 ;;Create a column of empty cells. The `symbol' fields will be set by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2138 ;;the call to ses-relocate-all.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2139 (ses-adjust-print-width col (1+ width))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2140 (ses-set-parameter 'ses--numcols (1+ ses--numcols))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2141 (dotimes (row ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2142 (and (< (1+ col) ses--numcols) (eq (ses-cell-value row col) '*skip*)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2143 ;;Inserting in the middle of a spill-over
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2144 (setq has-skip t))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2145 (ses-aset-with-undo ses--cells row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2146 (ses-vector-insert (aref ses--cells row)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2147 col (ses-make-cell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2148 ;;Insert empty lines in cell data area (will be replaced by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2149 ;;ses-relocate-all)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2150 (ses-goto-data row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2151 (insert ?\n))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2152 ;;Insert column width and printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2153 (setq widths (ses-vector-insert widths col width)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2154 printers (ses-vector-insert printers col printer)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2155 (ses-set-parameter 'ses--col-widths widths)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2156 (ses-set-parameter 'ses--col-printers printers)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2157 (ses-reset-header-string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2158 (ses-relocate-all 0 col 0 count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2159 (if has-skip
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2160 (ses-reprint-all t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2161 (when (or (> (length (ses-call-printer printer)) 0)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2162 (> (length (ses-call-printer ses--default-printer)) 0))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2163 ;;Either column printer or global printer inserts some constant text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2164 ;;Reprint the new columns to insert that text.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2165 (dotimes (x ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2166 (dotimes (y count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2167 ;Always nil here - this is a blank column
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2168 (1value (ses-print-cell-new-width x (+ y col))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2169 (ses-setup)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2170 (ses-jump-safe ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2171
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2172 (defun ses-delete-column (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2173 "Delete the current column. With prefix, Deletes COUNT columns starting
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2174 from the current one."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2175 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2176 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2177 (or (> count 0) (signal 'args-out-of-range nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2178 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2179 (inhibit-read-only t)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2180 (rowcol (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2181 (width 0)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2182 col origrow has-skip)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2183 (setq origrow (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2184 col (cdr rowcol)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2185 count (min count (- ses--numcols col)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2186 (if (= count ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2187 (error "Can't delete all columns!"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2188 ;;Determine width of column(s) being deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2189 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2190 (setq width (+ width (ses-col-width (+ col x)) 1)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2191 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2192 (ses-set-parameter 'ses--numcols (- ses--numcols count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2193 (ses-adjust-print-width col (- width))
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
2194 (dotimes-with-progress-reporter (row ses--numrows) "Deleting column..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2195 ;;Delete lines from cell data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2196 (ses-goto-data row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2197 (ses-delete-line count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2198 ;;Delete cells. Check if deletion area begins or ends with a skip.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2199 (if (or (eq (ses-cell-value row col) '*skip*)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2200 (and (< col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2201 (eq (ses-cell-value row (+ col count)) '*skip*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2202 (setq has-skip t))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2203 (ses-aset-with-undo ses--cells row
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2204 (ses-vector-delete (aref ses--cells row) col count)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2205 ;;Update globals
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2206 (ses-set-parameter 'ses--col-widths
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2207 (ses-vector-delete ses--col-widths col count))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2208 (ses-set-parameter 'ses--col-printers
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2209 (ses-vector-delete ses--col-printers col count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2210 (ses-reset-header-string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2211 ;;Relocate variables and formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2212 (ses-relocate-all 0 col 0 (- count))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2213 (ses-destroy-cell-variable-range 0 (1- ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2214 ses--numcols (+ ses--numcols count -1))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2215 (if has-skip
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2216 (ses-reprint-all t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2217 (ses-setup))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2218 (if (>= col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2219 (setq col (1- col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2220 (ses-goto-print origrow col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2221
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2222 (defun ses-forward-or-insert (&optional count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2223 "Move to next cell in row, or inserts a new cell if already in last one, or
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2224 inserts a new row if at bottom of print area. Repeat COUNT times."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2225 (interactive "p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2226 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2227 (setq deactivate-mark t) ;Doesn't combine well with ranges
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2228 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2229 (ses-set-curcell)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2230 (if (not ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2231 (progn ;At bottom of print area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2232 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2233 (ses-insert-row 1))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2234 (let ((col (cdr (ses-sym-rowcol ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2235 (when (/= 32
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2236 (char-before (next-single-property-change (point)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2237 'intangible)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2238 ;;We're already in last nonskipped cell on line. Need to create a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2239 ;;new column.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2240 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2241 (ses-insert-column (- count x)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2242 ses--numcols
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2243 (ses-col-width col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2244 (ses-col-printer col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2245 (forward-char)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2246
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2247 (defun ses-append-row-jump-first-column ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2248 "Insert a new row after current one and jumps to its first column."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2249 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2250 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2251 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2252 (beginning-of-line 2)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2253 (ses-set-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2254 (ses-insert-row 1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2255
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2256 (defun ses-set-column-width (col newwidth)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2257 "Set the width of the current column."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2258 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2259 (let ((col (cdr (progn (ses-check-curcell) (ses-sym-rowcol ses--curcell)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2260 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2261 (list col
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2262 (if current-prefix-arg
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2263 (prefix-numeric-value current-prefix-arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2264 (read-from-minibuffer (format "Column %s width [currently %d]: "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2265 (ses-column-letter col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2266 (ses-col-width col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2267 nil ;No initial contents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2268 nil ;No override keymap
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2269 t ;Convert to Lisp object
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2270 nil ;No history
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2271 (number-to-string
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2272 (ses-col-width col))))))) ;Default value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2273 (if (< newwidth 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2274 (error "Invalid column width"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2275 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2276 (ses-reset-header-string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2277 (save-excursion
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2278 (let ((inhibit-quit t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2279 (ses-adjust-print-width col (- newwidth (ses-col-width col)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2280 (ses-set-parameter 'ses--col-widths newwidth col))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2281 (dotimes (row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2282 (ses-print-cell-new-width row col))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2283
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2284
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2285 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2286 ;; Cut and paste, import and export
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2287 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2288
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2289 (defadvice copy-region-as-kill (around ses-copy-region-as-kill
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2290 activate preactivate)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2291 "It doesn't make sense to copy read-only or intangible attributes into the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2292 kill ring. It probably doesn't make sense to copy keymap properties.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2293 We'll assume copying front-sticky properties doesn't make sense, either.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2294
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2295 This advice also includes some SES-specific code because otherwise it's too
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2296 hard to override how mouse-1 works."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2297 (when (> beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2298 (let ((temp beg))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2299 (setq beg end
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2300 end temp)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2301 (if (not (and (eq major-mode 'ses-mode)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2302 (eq (get-text-property beg 'read-only) 'ses)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2303 (eq (get-text-property (1- end) 'read-only) 'ses)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2304 ad-do-it ;Normal copy-region-as-kill
59292
c8adcd0d5e2e (copy-region-as-kill): Deactivate mark.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58409
diff changeset
2305 (kill-new (ses-copy-region beg end))
c8adcd0d5e2e (copy-region-as-kill): Deactivate mark.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58409
diff changeset
2306 (if transient-mark-mode
c8adcd0d5e2e (copy-region-as-kill): Deactivate mark.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58409
diff changeset
2307 (setq deactivate-mark t))
c8adcd0d5e2e (copy-region-as-kill): Deactivate mark.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58409
diff changeset
2308 nil))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2309
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2310 (defun ses-copy-region (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2311 "Treat the region as rectangular. Convert the intangible attributes to
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2312 SES attributes recording the contents of the cell as of the time of copying."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2313 (let* ((inhibit-point-motion-hooks t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2314 (x (mapconcat 'ses-copy-region-helper
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2315 (extract-rectangle beg (1- end)) "\n")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2316 (remove-text-properties 0 (length x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2317 '(read-only t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2318 intangible t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2319 keymap t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2320 front-sticky t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2321 x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2322 x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2323
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2324 (defun ses-copy-region-helper (line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2325 "Converts one line (of a rectangle being extracted from a spreadsheet) to
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2326 external form by attaching to each print cell a 'ses attribute that records
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2327 the corresponding data cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2328 (or (> (length line) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2329 (error "Empty range"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2330 (let ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2331 (pos 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2332 mycell next sym rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2333 (while pos
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2334 (setq sym (get-text-property pos 'intangible line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2335 next (next-single-property-change pos 'intangible line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2336 rowcol (ses-sym-rowcol sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2337 mycell (ses-get-cell (car rowcol) (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2338 (put-text-property pos (or next (length line))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2339 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2340 (list (ses-cell-symbol mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2341 (ses-cell-formula mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2342 (ses-cell-printer mycell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2343 line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2344 (setq pos next)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2345 line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2346
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2347 (defun ses-kill-override (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2348 "Generic override for any commands that kill text. We clear the killed
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2349 cells instead of deleting them."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2350 (interactive "r")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2351 (ses-check-curcell 'needrange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2352 ;;For some reason, the text-read-only error is not caught by
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2353 ;;`delete-region', so we have to use subterfuge.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2354 (let ((buffer-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2355 (1value (condition-case x
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2356 (noreturn (funcall (lookup-key (current-global-map)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2357 (this-command-keys))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2358 beg end))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2359 (buffer-read-only nil)))) ;The expected error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2360 ;;Because the buffer was marked read-only, the kill command turned itself
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2361 ;;into a copy. Now we clear the cells or signal the error. First we
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2362 ;;check whether the buffer really is read-only.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2363 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2364 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2365 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2366 (ses-clear-cell row col))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2367 (ses-jump (car ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2368
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2369 (defadvice yank (around ses-yank activate preactivate)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2370 "In SES mode, the yanked text is inserted as cells.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2371
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2372 If the text contains 'ses attributes (meaning it went to the kill-ring from a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2373 SES buffer), the formulas and print functions are restored for the cells. If
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2374 the text contains tabs, this is an insertion of tab-separated formulas.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2375 Otherwise the text is inserted as the formula for the current cell.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2376
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2377 When inserting cells, the formulas are usually relocated to keep the same
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2378 relative references to neighboring cells. This is best if the formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2379 generally refer to other cells within the yanked text. You can use the C-u
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2380 prefix to specify insertion without relocation, which is best when the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2381 formulas refer to cells outsite the yanked text.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2382
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2383 When inserting formulas, the text is treated as a string constant if it doesn't
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2384 make sense as a sexp or would otherwise be considered a symbol. Use 'sym to
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2385 explicitly insert a symbol, or use the C-u prefix to treat all unmarked words
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2386 as symbols."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2387 (if (not (and (eq major-mode 'ses-mode)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2388 (eq (get-text-property (point) 'keymap) 'ses-mode-print-map)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2389 ad-do-it ;Normal non-SES yank
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2390 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2391 (push-mark (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2392 (let ((text (current-kill (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2393 ((listp arg) 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2394 ((eq arg '-) -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2395 (t (1- arg))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2396 (or (ses-yank-cells text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2397 (ses-yank-tsf text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2398 (ses-yank-one (ses-yank-resize 1 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2399 text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2400 0
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2401 (if (memq (aref text (1- (length text))) '(?\t ?\n))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2402 ;;Just one cell - delete final tab or newline
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2403 (1- (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2404 arg)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2405 (if (consp arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2406 (exchange-point-and-mark))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2407
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2408 (defun ses-yank-pop (arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2409 "Replace just-yanked stretch of killed text with a different stretch.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2410 This command is allowed only immediately after a `yank' or a `yank-pop', when
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2411 the region contains a stretch of reinserted previously-killed text. We
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2412 replace it with a different stretch of killed text.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2413 Unlike standard `yank-pop', this function uses `undo' to delete the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2414 previous insertion."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2415 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2416 (or (eq last-command 'yank)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2417 ;;Use noreturn here just to avoid a "poor-coverage" warning in its
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2418 ;;macro definition.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2419 (noreturn (error "Previous command was not a yank")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2420 (undo)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2421 (ses-set-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2422 (yank (1+ (or arg 1)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2423 (setq this-command 'yank))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2424
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2425 (defun ses-yank-cells (text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2426 "If the TEXT has a proper set of 'ses attributes, inserts the text as
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2427 cells, else return nil. The cells are reprinted--the supplied text is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2428 ignored because the column widths, default printer, etc. at yank time might
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2429 be different from those at kill-time. ARG is a list to indicate that
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2430 formulas are to be inserted without relocation."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2431 (let ((first (get-text-property 0 'ses text))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2432 (last (get-text-property (1- (length text)) 'ses text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2433 (when (and first last) ;;Otherwise not proper set of attributes
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2434 (setq first (ses-sym-rowcol (car first))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2435 last (ses-sym-rowcol (car last)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2436 (let* ((needrows (- (car last) (car first) -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2437 (needcols (- (cdr last) (cdr first) -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2438 (rowcol (ses-yank-resize needrows needcols))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2439 (rowincr (- (car rowcol) (car first)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2440 (colincr (- (cdr rowcol) (cdr first)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2441 (pos 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2442 myrow mycol x)
59649
e57ef5d6d521 (ses-dotimes-msg): Remove macro. Use `dotimes-with-progress-reporter' instead.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59292
diff changeset
2443 (dotimes-with-progress-reporter (row needrows) "Yanking..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2444 (setq myrow (+ row (car rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2445 (dotimes (col needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2446 (setq mycol (+ col (cdr rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2447 last (get-text-property pos 'ses text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2448 pos (next-single-property-change pos 'ses text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2449 x (ses-sym-rowcol (car last)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2450 (if (not last)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2451 ;;Newline - all remaining cells on row are skipped
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2452 (setq x (cons (- myrow rowincr) (+ needcols colincr -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2453 last (list nil nil nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2454 pos (1- pos)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2455 (if (/= (car x) (- myrow rowincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2456 (error "Cell row error"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2457 (if (< (- mycol colincr) (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2458 ;;Some columns were skipped
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2459 (let ((oldcol mycol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2460 (while (< (- mycol colincr) (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2461 (ses-clear-cell myrow mycol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2462 (setq col (1+ col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2463 mycol (1+ mycol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2464 (ses-print-cell myrow (1- oldcol)))) ;;This inserts *skip*
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2465 (when (car last) ;Skip this for *skip* cells
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2466 (setq x (nth 2 last))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2467 (unless (equal x (ses-cell-printer myrow mycol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2468 (or (not x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2469 (stringp x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2470 (eq (car-safe x) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2471 (setq x `(ses-safe-printer ,x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2472 (ses-set-cell myrow mycol 'printer x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2473 (setq x (cadr last))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2474 (if (atom arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2475 (setq x (ses-relocate-formula x 0 0 rowincr colincr)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2476 (or (atom x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2477 (eq (car-safe x) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2478 (setq x `(ses-safe-formula ,x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2479 (ses-cell-set-formula myrow mycol x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2480 (when pos
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2481 (if (get-text-property pos 'ses text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2482 (error "Missing newline between rows"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2483 (setq pos (next-single-property-change pos 'ses text))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2484 t))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2485
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2486 (defun ses-yank-one (rowcol text from to arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2487 "Insert the substring [FROM,TO] of TEXT as the formula for cell ROWCOL (a
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2488 cons of ROW and COL). Treat plain symbols as strings unless ARG is a list."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2489 (let ((val (condition-case nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2490 (read-from-string text from to)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2491 (error (cons nil from)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2492 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2493 ((< (cdr val) (or to (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2494 ;;Invalid sexp - leave it as a string
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2495 (setq val (substring text from to)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2496 ((and (car val) (symbolp (car val)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2497 (if (consp arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2498 (setq val (list 'quote (car val))) ;Keep symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2499 (setq val (substring text from to)))) ;Treat symbol as text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2500 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2501 (setq val (car val))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2502 (let ((row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2503 (col (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2504 (or (atom val)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2505 (setq val `(ses-safe-formula ,val)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2506 (ses-cell-set-formula row col val))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2507
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2508 (defun ses-yank-tsf (text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2509 "If TEXT contains tabs and/or newlines, treats the tabs as
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2510 column-separators and the newlines as row-separators and inserts the text as
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2511 cell formulas--else return nil. Treat plain symbols as strings unless ARG
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2512 is a list. Ignore a final newline."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2513 (if (or (not (string-match "[\t\n]" text))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2514 (= (match-end 0) (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2515 ;;Not TSF format
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2516 nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2517 (if (/= (aref text (1- (length text))) ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2518 (setq text (concat text "\n")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2519 (let ((pos -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2520 (spots (list -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2521 (cols 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2522 (needrows 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2523 needcols rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2524 ;;Find all the tabs and newlines
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2525 (while (setq pos (string-match "[\t\n]" text (1+ pos)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2526 (push pos spots)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2527 (setq cols (1+ cols))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2528 (when (eq (aref text pos) ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2529 (if (not needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2530 (setq needcols cols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2531 (or (= needcols cols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2532 (error "Inconsistent row lengths")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2533 (setq cols 0
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2534 needrows (1+ needrows))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2535 ;;Insert the formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2536 (setq rowcol (ses-yank-resize needrows needcols))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2537 (dotimes (row needrows)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2538 (dotimes (col needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2539 (ses-yank-one (cons (+ (car rowcol) needrows (- row) -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2540 (+ (cdr rowcol) needcols (- col) -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2541 text (1+ (cadr spots)) (car spots) arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2542 (setq spots (cdr spots))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2543 (ses-goto-print (+ (car rowcol) needrows -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2544 (+ (cdr rowcol) needcols -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2545 t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2546
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2547 (defun ses-yank-resize (needrows needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2548 "If this yank will require inserting rows and/or columns, asks for
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2549 confirmation and then inserts them. Result is (row,col) for top left of yank
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2550 spot, or error signal if user requests cancel."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2551 (ses-begin-change)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2552 (let ((rowcol (if ses--curcell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2553 (ses-sym-rowcol ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2554 (cons ses--numrows 0)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2555 rowbool colbool)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2556 (setq needrows (- (+ (car rowcol) needrows) ses--numrows)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2557 needcols (- (+ (cdr rowcol) needcols) ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2558 rowbool (> needrows 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2559 colbool (> needcols 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2560 (when (or rowbool colbool)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2561 ;;Need to insert. Get confirm
65689
96187e7edd1b 2005-09-25 Romain Francoise <romain@orebokech.com>
Romain Francoise <romain@orebokech.com>
parents: 65582
diff changeset
2562 (or (y-or-n-p (format "Yank will insert %s%s%s. Continue? "
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2563 (if rowbool (format "%d rows" needrows) "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2564 (if (and rowbool colbool) " and " "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2565 (if colbool (format "%d columns" needcols) "")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2566 (error "Cancelled"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2567 (when rowbool
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2568 (let (ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2569 (save-excursion
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2570 (ses-goto-print ses--numrows 0)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2571 (ses-insert-row needrows))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2572 (when colbool
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2573 (ses-insert-column needcols
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2574 ses--numcols
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2575 (ses-col-width (1- ses--numcols))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2576 (ses-col-printer (1- ses--numcols)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2577 rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2578
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2579 (defun ses-export-tsv (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2580 "Export values from the current range, with tabs between columns and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2581 newlines between rows. Result is placed in kill ring."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2582 (interactive "r")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2583 (ses-export-tab nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2584
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2585 (defun ses-export-tsf (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2586 "Export formulas from the current range, with tabs between columns and
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2587 newlines between rows. Result is placed in kill ring."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2588 (interactive "r")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2589 (ses-export-tab t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2590
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2591 (defun ses-export-tab (want-formulas)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2592 "Export the current range with tabs between columns and newlines between
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2593 rows. Result is placed in kill ring. The export is values unless
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2594 WANT-FORMULAS is non-nil. Newlines and tabs in the export text are escaped."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2595 (ses-check-curcell 'needrange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2596 (let ((print-escape-newlines t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2597 result item)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2598 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2599 (setq item (if want-formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2600 (ses-cell-formula row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2601 (ses-cell-value row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2602 (if (eq (car-safe item) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2603 ;;Hide our deferred safety-check marker
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2604 (setq item (cadr item)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2605 (if (or (not item) (eq item '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2606 (setq item ""))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2607 (when (eq (car-safe item) 'quote)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2608 (push "'" result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2609 (setq item (cadr item)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2610 (setq item (prin1-to-string item t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2611 (setq item (replace-regexp-in-string "\t" "\\\\t" item))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2612 (push item result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2613 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2614 ((< col maxcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2615 (push "\t" result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2616 ((< row maxrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2617 (push "\n" result))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2618 (setq result (apply 'concat (nreverse result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2619 (kill-new result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2620
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2621
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2622 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2623 ;; Other user commands
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2624 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2625
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2626 (defun ses-unset-header-row ()
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2627 "Select the default header row."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2628 (interactive)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2629 (ses-set-header-row 0))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2630
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2631 (defun ses-set-header-row (row)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2632 "Set the ROW to display in the header-line.
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2633 With a numerical prefix arg, use that row.
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2634 With no prefix arg, use the current row.
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2635 With a \\[universal-argument] prefix arg, prompt the user.
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2636 The top row is row 1. Selecting row 0 displays the default header row."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2637 (interactive
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2638 (list (if (numberp current-prefix-arg) current-prefix-arg
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2639 (let ((currow (1+ (car (ses-sym-rowcol ses--curcell)))))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2640 (if current-prefix-arg
54571
54265a0f59a7 (ses-read-number): Move to subr.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53944
diff changeset
2641 (read-number "Header row: " currow)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2642 currow)))))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2643 (if (or (< row 0) (> row ses--numrows))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2644 (error "Invalid header-row"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2645 (ses-begin-change)
70964
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2646 (let ((oldval ses--header-row))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2647 (let (buffer-undo-list)
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2648 (ses-set-parameter 'ses--header-row row))
e5adfcfcffa0 * ses.el (defadvice undo-more): Delete this defadvice. The undo
Jonathan Yavner <jyavner@member.fsf.org>
parents: 68359
diff changeset
2649 (push `(apply ses-set-header-row ,oldval) buffer-undo-list))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2650 (ses-reset-header-string))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2651
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2652 (defun ses-mark-row ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2653 "Marks the entirety of current row as a range."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2654 (interactive)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2655 (ses-check-curcell 'range)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2656 (let ((row (car (ses-sym-rowcol (or (car-safe ses--curcell) ses--curcell)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2657 (push-mark (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2658 (ses-goto-print (1+ row) 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2659 (push-mark (point) nil t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2660 (ses-goto-print row 0)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2661
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2662 (defun ses-mark-column ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2663 "Marks the entirety of current column as a range."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2664 (interactive)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2665 (ses-check-curcell 'range)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2666 (let ((col (cdr (ses-sym-rowcol (or (car-safe ses--curcell) ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2667 (row 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2668 (push-mark (point))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2669 (ses-goto-print (1- ses--numrows) col)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2670 (forward-char 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2671 (push-mark (point) nil t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2672 (while (eq '*skip* (ses-cell-value row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2673 ;;Skip over initial cells in column that can't be selected
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2674 (setq row (1+ row)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2675 (ses-goto-print row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2676
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2677 (defun ses-end-of-line ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2678 "Move point to last cell on line."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2679 (interactive)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2680 (ses-check-curcell 'end 'range)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2681 (when ses--curcell ;Otherwise we're at the bottom row, which is empty anyway
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2682 (let ((col (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2683 row rowcol)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2684 (if (symbolp ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2685 ;;Single cell
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2686 (setq row (car (ses-sym-rowcol ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2687 ;;Range - use whichever end of the range the point is at
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2688 (setq rowcol (ses-sym-rowcol (if (< (point) (mark))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2689 (car ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2690 (cdr ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2691 ;;If range already includes the last cell in a row, point is actually
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2692 ;;in the following row
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2693 (if (<= (cdr rowcol) (1- col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2694 (setq row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2695 (setq row (1+ (car rowcol)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2696 (if (= row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2697 ;;Already at end - can't go anywhere
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2698 (setq col 0))))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2699 (when (< row ses--numrows) ;Otherwise it's a range that includes last cell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2700 (while (eq (ses-cell-value row col) '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2701 ;;Back to beginning of multi-column cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2702 (setq col (1- col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2703 (ses-goto-print row col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2704
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2705 (defun ses-renarrow-buffer ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2706 "Narrow the buffer so only the print area is visible. Use after \\[widen]."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2707 (interactive)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2708 (setq ses--deferred-narrow t))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2709
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2710 (defun ses-sort-column (sorter &optional reverse)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2711 "Sorts the range by a specified column. With prefix, sorts in
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2712 REVERSE order."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2713 (interactive "*sSort column: \nP")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2714 (ses-check-curcell 'needrange)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2715 (let ((min (ses-sym-rowcol (car ses--curcell)))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2716 (max (ses-sym-rowcol (cdr ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2717 (let ((minrow (car min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2718 (mincol (cdr min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2719 (maxrow (car max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2720 (maxcol (cdr max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2721 keys extracts end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2722 (setq sorter (cdr (ses-sym-rowcol (intern (concat sorter "1")))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2723 (or (and sorter (>= sorter mincol) (<= sorter maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2724 (error "Invalid sort column"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2725 ;;Get key columns and sort them
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2726 (dotimes (x (- maxrow minrow -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2727 (ses-goto-print (+ minrow x) sorter)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2728 (setq end (next-single-property-change (point) 'intangible))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2729 (push (cons (buffer-substring-no-properties (point) end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2730 (+ minrow x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2731 keys))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2732 (setq keys (sort keys #'(lambda (x y) (string< (car x) (car y)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2733 ;;Extract the lines in reverse sorted order
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2734 (or reverse
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2735 (setq keys (nreverse keys)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2736 (dolist (x keys)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2737 (ses-goto-print (cdr x) (1+ maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2738 (setq end (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2739 (ses-goto-print (cdr x) mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2740 (push (ses-copy-region (point) end) extracts))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2741 (deactivate-mark)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2742 ;;Paste the lines sequentially
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2743 (dotimes (x (- maxrow minrow -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2744 (ses-goto-print (+ minrow x) mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2745 (ses-set-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2746 (ses-yank-cells (pop extracts) nil)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2747
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2748 (defun ses-sort-column-click (event reverse)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2749 "Mouse version of `ses-sort-column'."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2750 (interactive "*e\nP")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2751 (setq event (event-end event))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2752 (select-window (posn-window event))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2753 (setq event (car (posn-col-row event))) ;Click column
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2754 (let ((col 0))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2755 (while (and (< col ses--numcols) (> event (ses-col-width col)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2756 (setq event (- event (ses-col-width col) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2757 col (1+ col)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2758 (if (>= col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2759 (ding)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2760 (ses-sort-column (ses-column-letter col) reverse))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2761
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2762 (defun ses-insert-range ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2763 "Inserts into minibuffer the list of cells currently highlighted in the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2764 spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2765 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2766 (let (x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2767 (with-current-buffer (window-buffer minibuffer-scroll-window)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2768 (ses-command-hook) ;For ses-coverage
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2769 (ses-check-curcell 'needrange)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2770 (setq x (cdr (macroexpand `(ses-range ,(car ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2771 ,(cdr ses--curcell))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2772 (insert (substring (prin1-to-string (nreverse x)) 1 -1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2773
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2774 (defun ses-insert-ses-range ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2775 "Inserts \"(ses-range x y)\" in the minibuffer to represent the currently
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2776 highlighted range in the spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2777 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2778 (let (x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2779 (with-current-buffer (window-buffer minibuffer-scroll-window)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2780 (ses-command-hook) ;For ses-coverage
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2781 (ses-check-curcell 'needrange)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2782 (setq x (format "(ses-range %S %S)"
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2783 (car ses--curcell)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2784 (cdr ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2785 (insert x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2786
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2787 (defun ses-insert-range-click (event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2788 "Mouse version of `ses-insert-range'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2789 (interactive "*e")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2790 (mouse-set-point event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2791 (ses-insert-range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2792
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2793 (defun ses-insert-ses-range-click (event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2794 "Mouse version of `ses-insert-ses-range'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2795 (interactive "*e")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2796 (mouse-set-point event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2797 (ses-insert-ses-range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2798
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2799
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2800 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2801 ;; Checking formulas for safety
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2802 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2803
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2804 (defun ses-safe-printer (printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2805 "Returns PRINTER if safe, or the substitute printer `ses-unsafe' otherwise."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2806 (if (or (stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2807 (stringp (car-safe printer))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2808 (not printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2809 (ses-warn-unsafe printer 'unsafep-function))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2810 printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2811 'ses-unsafe))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2812
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2813 (defun ses-safe-formula (formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2814 "Returns FORMULA if safe, or the substitute formula *unsafe* otherwise."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2815 (if (ses-warn-unsafe formula 'unsafep)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2816 formula
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2817 `(ses-unsafe ',formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2818
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2819 (defun ses-warn-unsafe (formula checker)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2820 "Applies CHECKER to FORMULA. If result is non-nil, asks user for
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2821 confirmation about FORMULA, which might be unsafe. Returns t if formula
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2822 is safe or user allows execution anyway. Always returns t if
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2823 `safe-functions' is t."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2824 (if (eq safe-functions t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2825 t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2826 (setq checker (funcall checker formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2827 (if (not checker)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2828 t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2829 (y-or-n-p (format "Formula %S\nmight be unsafe %S. Process it? "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2830 formula checker)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2831
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2832
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2833 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2834 ;; Standard formulas
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2835 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2836
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2837 (defmacro ses-range (from to)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2838 "Expands to a list of cell-symbols for the range. The range automatically
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2839 expands to include any new row or column inserted into its middle. The SES
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2840 library code specifically looks for the symbol `ses-range', so don't create an
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2841 alias for this macro!"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2842 (let (result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2843 (ses-dorange (cons from to)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2844 (push (ses-cell-symbol row col) result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2845 (cons 'list result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2846
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2847 (defun ses-delete-blanks (&rest args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2848 "Return ARGS reversed, with the blank elements (nil and *skip*) removed."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2849 (let (result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2850 (dolist (cur args)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2851 (unless (memq cur '(nil *skip*))
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2852 (push cur result)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2853 result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2854
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2855 (defun ses+ (&rest args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2856 "Compute the sum of the arguments, ignoring blanks."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2857 (apply '+ (apply 'ses-delete-blanks args)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2858
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2859 (defun ses-average (list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2860 "Computes the sum of the numbers in LIST, divided by their length. Blanks
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2861 are ignored. Result is always floating-point, even if all args are integers."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2862 (setq list (apply 'ses-delete-blanks list))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2863 (/ (float (apply '+ list)) (length list)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2864
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2865 (defmacro ses-select (fromrange test torange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2866 "Select cells in FROMRANGE that are `equal' to TEST. For each match, return
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2867 the corresponding cell from TORANGE. The ranges are macroexpanded but not
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2868 evaluated so they should be either (ses-range BEG END) or (list ...). The
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2869 TEST is evaluated."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2870 (setq fromrange (cdr (macroexpand fromrange))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2871 torange (cdr (macroexpand torange))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2872 test (eval test))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2873 (or (= (length fromrange) (length torange))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2874 (error "ses-select: Ranges not same length"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2875 (let (result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2876 (dolist (x fromrange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2877 (if (equal test (symbol-value x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2878 (push (car torange) result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2879 (setq torange (cdr torange)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2880 (cons 'list result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2881
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2882 ;;All standard formulas are safe
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2883 (dolist (x '(ses-range ses-delete-blanks ses+ ses-average ses-select))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2884 (put x 'side-effect-free t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2885
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2886
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2887 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2888 ;; Standard print functions
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2889 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2890
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2891 ;;These functions use the variables 'row' and 'col' that are
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2892 ;;dynamically bound by ses-print-cell. We define these varables at
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2893 ;;compile-time to make the compiler happy.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2894 (eval-when-compile
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2895 (dolist (x '(row col))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2896 (make-local-variable x)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2897 (set x nil)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2898
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2899 (defun ses-center (value &optional span fill)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2900 "Print VALUE, centered within column. FILL is the fill character for
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2901 centering (default = space). SPAN indicates how many additional rightward
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2902 columns to include in width (default = 0)."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2903 (let ((printer (or (ses-col-printer col) ses--default-printer))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2904 (width (ses-col-width col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2905 half)
64020
463e088b8531 (ses): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63622
diff changeset
2906 (or fill (setq fill ?\s))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2907 (or span (setq span 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2908 (setq value (ses-call-printer printer value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2909 (dotimes (x span)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2910 (setq width (+ width 1 (ses-col-width (+ col span (- x))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2911 (setq width (- width (length value)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2912 (if (<= width 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2913 value ;Too large for field, anyway
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2914 (setq half (make-string (/ width 2) fill))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2915 (concat half value half
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2916 (if (> (% width 2) 0) (char-to-string fill))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2917
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2918 (defun ses-center-span (value &optional fill)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2919 "Print VALUE, centered within the span that starts in the current column
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2920 and continues until the next nonblank column. FILL specifies the fill
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2921 character (default = space)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2922 (let ((end (1+ col)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2923 (while (and (< end ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2924 (memq (ses-cell-value row end) '(nil *skip*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2925 (setq end (1+ end)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2926 (ses-center value (- end col 1) fill)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2927
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2928 (defun ses-dashfill (value &optional span)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2929 "Print VALUE centered using dashes. SPAN indicates how many rightward
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2930 columns to include in width (default = 0)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2931 (ses-center value span ?-))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2932
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2933 (defun ses-dashfill-span (value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2934 "Print VALUE, centered using dashes within the span that starts in the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2935 current column and continues until the next nonblank column."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2936 (ses-center-span value ?-))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2937
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2938 (defun ses-tildefill-span (value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2939 "Print VALUE, centered using tildes within the span that starts in the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2940 current column and continues until the next nonblank column."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2941 (ses-center-span value ?~))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2942
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2943 (defun ses-unsafe (value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2944 "Substitute for an unsafe formula or printer"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2945 (error "Unsafe formula or printer"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2946
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2947 ;;All standard printers are safe, including ses-unsafe!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2948 (dolist (x (cons 'ses-unsafe ses-standard-printer-functions))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2949 (put x 'side-effect-free t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2950
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2951 (provide 'ses)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2952
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2953 ;; arch-tag: 88c1ccf0-4293-4824-8c5d-0757b52217f3
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2954 ;;; ses.el ends here